Save work on app title

This commit is contained in:
shamoon 2024-01-07 00:20:50 -08:00
parent a12e1fae72
commit 2cd993204c
11 changed files with 118 additions and 13 deletions

View File

@ -4,9 +4,9 @@ Paperless provides a wide range of customizations. Depending on how you
run paperless, these settings have to be defined in different places. run paperless, these settings have to be defined in different places.
Certain configuration options may be set via the UI. This currently includes Certain configuration options may be set via the UI. This currently includes
common [OCR](#ocr) related settings. If set, these will take preference over the common [OCR](#ocr) related settings and some frontend settings. If set, these will take
settings via environment variables. If not set, the environment setting or applicable preference over the settings via environment variables. If not set, the environment setting
default will be utilized instead. or applicable default will be utilized instead.
- If you run paperless on docker, `paperless.conf` is not used. - If you run paperless on docker, `paperless.conf` is not used.
Rather, configure paperless by copying necessary options to Rather, configure paperless by copying necessary options to
@ -1329,7 +1329,11 @@ started by the container.
You can read more about this in the [advanced documentation](advanced_usage.md#celery-monitoring). You can read more about this in the [advanced documentation](advanced_usage.md#celery-monitoring).
## Update Checking {#update-checking} ## Frontend Settings
#### [`PAPERLESS_APP_TITLE=<bool>`](#PAPERLESS_APP_TITLE) {#PAPERLESS_APP_TITLE}
: If set, overrides the default name "Paperless-ngx"
#### [`PAPERLESS_ENABLE_UPDATE_CHECK=<bool>`](#PAPERLESS_ENABLE_UPDATE_CHECK) {#PAPERLESS_ENABLE_UPDATE_CHECK} #### [`PAPERLESS_ENABLE_UPDATE_CHECK=<bool>`](#PAPERLESS_ENABLE_UPDATE_CHECK) {#PAPERLESS_ENABLE_UPDATE_CHECK}

View File

@ -4,15 +4,25 @@
(click)="isMenuCollapsed = !isMenuCollapsed"> (click)="isMenuCollapsed = !isMenuCollapsed">
<span class="navbar-toggler-icon"></span> <span class="navbar-toggler-icon"></span>
</button> </button>
<a class="navbar-brand col-auto col-md-3 col-lg-2 me-0 px-3 py-3 order-sm-0" <a class="navbar-brand d-flex col-auto col-md-3 col-lg-2 me-0 px-3 py-3 order-sm-0"
[ngClass]="slimSidebarEnabled ? 'slim' : 'col-auto col-md-3 col-lg-2'" routerLink="/dashboard" [ngClass]="{ 'slim': slimSidebarEnabled, 'd-flex col-auto col-md-3 col-lg-2' : !slimSidebarEnabled, 'py-3' : !customAppTitle?.length || slimSidebarEnabled, 'py-2': customAppTitle?.length }"
routerLink="/dashboard"
tourAnchor="tour.intro"> tourAnchor="tour.intro">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 198.43 238.91" width="1em" class="me-2" fill="currentColor"> <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 198.43 238.91" width="1em" class="me-2" fill="currentColor">
<path <path
d="M194.7,0C164.22,70.94,17.64,79.74,64.55,194.06c.58,1.47-10.85,17-18.47,29.9-1.76-6.45-3.81-13.48-3.52-14.07,38.11-45.14-27.26-70.65-30.78-107.58C-4.64,131.62-10.5,182.92,39,212.53c.3,0,2.64,11.14,3.81,16.71a58.55,58.55,0,0,0-2.93,6.45c-1.17,2.93,7.62,2.64,7.62,3.22.88-.29,21.7-36.93,22.28-37.23C187.67,174.72,208.48,68.6,194.7,0ZM134.61,74.75C79.5,124,70.12,160.64,71.88,178.53,53.41,134.85,107.64,86.77,134.61,74.75ZM28.2,145.11c10.55,9.67,28.14,39.28,13.19,56.57C44.91,193.77,46.08,175.89,28.2,145.11Z" d="M194.7,0C164.22,70.94,17.64,79.74,64.55,194.06c.58,1.47-10.85,17-18.47,29.9-1.76-6.45-3.81-13.48-3.52-14.07,38.11-45.14-27.26-70.65-30.78-107.58C-4.64,131.62-10.5,182.92,39,212.53c.3,0,2.64,11.14,3.81,16.71a58.55,58.55,0,0,0-2.93,6.45c-1.17,2.93,7.62,2.64,7.62,3.22.88-.29,21.7-36.93,22.28-37.23C187.67,174.72,208.48,68.6,194.7,0ZM134.61,74.75C79.5,124,70.12,160.64,71.88,178.53,53.41,134.85,107.64,86.77,134.61,74.75ZM28.2,145.11c10.55,9.67,28.14,39.28,13.19,56.57C44.91,193.77,46.08,175.89,28.2,145.11Z"
transform="translate(0 0)" /> transform="translate(0 0)" />
</svg> </svg>
<span class="ms-2" [class.visually-hidden]="slimSidebarEnabled" i18n="app title">Paperless-ngx</span> <div class="ms-2 d-inline-block" [class.visually-hidden]="slimSidebarEnabled">
@if (customAppTitle?.length) {
<div class="d-flex flex-column align-items-start">
<span class="title">{{customAppTitle}}</span>
<span class="byline text-uppercase font-monospace" i18n>by Paperless-ngx</span>
</div>
} @else {
Paperless-ngx
}
</div>
</a> </a>
<div class="search-form-container flex-grow-1 py-2 pb-3 pb-sm-2 px-3 ps-md-4 me-sm-auto order-3 order-sm-1" <div class="search-form-container flex-grow-1 py-2 pb-3 pb-sm-2 px-3 ps-md-4 me-sm-auto order-3 order-sm-1"
*pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.Document }"> *pngxIfPermissions="{ action: PermissionAction.View, type: PermissionType.Document }">

View File

@ -217,9 +217,16 @@ main {
*/ */
.navbar-brand { .navbar-brand {
padding-top: 0.75rem;
padding-bottom: 0.75rem;
font-size: 1rem; font-size: 1rem;
.flex-column {
padding: 0.15rem 0;
}
.byline {
font-size: 0.5rem;
letter-spacing: 0.1rem;
}
} }
@media screen and (min-width: 768px) { @media screen and (min-width: 768px) {

View File

@ -102,6 +102,10 @@ export class AppFrameComponent
}, 200) // slightly longer than css animation for slim sidebar }, 200) // slightly longer than css animation for slim sidebar
} }
get customAppTitle(): string {
return this.settingsService.get(SETTINGS_KEYS.APP_TITLE)
}
get slimSidebarEnabled(): boolean { get slimSidebarEnabled(): boolean {
return this.settingsService.get(SETTINGS_KEYS.SLIM_SIDEBAR) return this.settingsService.get(SETTINGS_KEYS.SLIM_SIDEBAR)
} }

View File

@ -47,6 +47,7 @@ export enum ConfigOptionType {
export const ConfigCategory = { export const ConfigCategory = {
OCR: $localize`OCR Settings`, OCR: $localize`OCR Settings`,
Frontend: $localize`Frontend Settings`,
} }
export interface ConfigOption { export interface ConfigOption {
@ -164,6 +165,13 @@ export const PaperlessConfigOptions: ConfigOption[] = [
config_key: 'PAPERLESS_OCR_USER_ARGS', config_key: 'PAPERLESS_OCR_USER_ARGS',
category: ConfigCategory.OCR, category: ConfigCategory.OCR,
}, },
{
key: 'app_title',
title: $localize`Application Title`,
type: ConfigOptionType.String,
config_key: 'PAPERLESS_APP_TITLE',
category: ConfigCategory.Frontend,
},
] ]
export interface PaperlessConfig extends ObjectWithId { export interface PaperlessConfig extends ObjectWithId {
@ -180,4 +188,5 @@ export interface PaperlessConfig extends ObjectWithId {
max_image_pixels: number max_image_pixels: number
color_conversion_strategy: ColorConvertConfig color_conversion_strategy: ColorConvertConfig
user_args: object user_args: object
app_title: string
} }

View File

@ -14,6 +14,7 @@ export interface UiSetting {
export const SETTINGS_KEYS = { export const SETTINGS_KEYS = {
LANGUAGE: 'language', LANGUAGE: 'language',
APP_TITLE: 'app_title',
// maintain old general-settings: for backwards compatibility // maintain old general-settings: for backwards compatibility
BULK_EDIT_CONFIRMATION_DIALOGS: BULK_EDIT_CONFIRMATION_DIALOGS:
'general-settings:bulk-edit:confirmation-dialogs', 'general-settings:bulk-edit:confirmation-dialogs',
@ -194,4 +195,9 @@ export const SETTINGS: UiSetting[] = [
type: 'array', type: 'array',
default: [], default: [],
}, },
{
key: SETTINGS_KEYS.APP_TITLE,
type: 'string',
default: '',
},
] ]

View File

@ -120,6 +120,7 @@ from documents.serialisers import WorkflowTriggerSerializer
from documents.signals import document_updated from documents.signals import document_updated
from documents.tasks import consume_file from documents.tasks import consume_file
from paperless import version from paperless import version
from paperless.config import FrontendConfig
from paperless.db import GnuPG from paperless.db import GnuPG
from paperless.views import StandardPagination from paperless.views import StandardPagination
@ -1164,6 +1165,14 @@ class UiSettingsView(GenericAPIView):
ui_settings["update_checking"] = { ui_settings["update_checking"] = {
"backend_setting": settings.ENABLE_UPDATE_CHECK, "backend_setting": settings.ENABLE_UPDATE_CHECK,
} }
frontend_config = FrontendConfig()
if settings.APP_TITLE is not None:
ui_settings["app_title"] = settings.APP_TITLE
if frontend_config.app_title is not None and len(frontend_config.app_title) > 0:
ui_settings["app_title"] = frontend_config.app_title
user_resp = { user_resp = {
"id": user.id, "id": user.id,
"username": user.username, "username": user.username,

View File

@ -8,13 +8,11 @@ from paperless.models import ApplicationConfiguration
@dataclasses.dataclass @dataclasses.dataclass
class OutputTypeConfig: class BaseConfig:
""" """
Almost all parsers care about the chosen PDF output format Almost all parsers care about the chosen PDF output format
""" """
output_type: str = dataclasses.field(init=False)
@staticmethod @staticmethod
def _get_config_instance() -> ApplicationConfiguration: def _get_config_instance() -> ApplicationConfiguration:
app_config = ApplicationConfiguration.objects.all().first() app_config = ApplicationConfiguration.objects.all().first()
@ -25,7 +23,19 @@ class OutputTypeConfig:
return app_config return app_config
def __post_init__(self) -> None: def __post_init__(self) -> None:
app_config = self._get_config_instance() return self._get_config_instance()
@dataclasses.dataclass
class OutputTypeConfig(BaseConfig):
"""
Almost all parsers care about the chosen PDF output format
"""
output_type: str = dataclasses.field(init=False)
def __post_init__(self) -> None:
app_config = super.__post_init__()
self.output_type = app_config.output_type or settings.OCR_OUTPUT_TYPE self.output_type = app_config.output_type or settings.OCR_OUTPUT_TYPE
@ -86,3 +96,17 @@ class OcrConfig(OutputTypeConfig):
user_args = {} user_args = {}
self.user_args = user_args self.user_args = user_args
@dataclasses.dataclass
class FrontendConfig(BaseConfig):
"""
Frontend application settings that require global scope
"""
app_title: str = dataclasses.field(init=False)
def __post_init__(self) -> None:
app_config = super().__post_init__()
self.app_title = app_config.app_title or None

View File

@ -0,0 +1,23 @@
# Generated by Django 4.2.8 on 2024-01-07 07:31
from django.db import migrations
from django.db import models
class Migration(migrations.Migration):
dependencies = [
("paperless", "0001_initial"),
]
operations = [
migrations.AddField(
model_name="applicationconfiguration",
name="app_title",
field=models.CharField(
blank=True,
max_length=48,
null=True,
verbose_name="Application Title",
),
),
]

View File

@ -166,6 +166,13 @@ class ApplicationConfiguration(AbstractSingletonModel):
null=True, null=True,
) )
app_title = models.CharField(
verbose_name=_("Application Title"),
null=True,
blank=True,
max_length=48,
)
class Meta: class Meta:
verbose_name = _("paperless application settings") verbose_name = _("paperless application settings")

View File

@ -999,6 +999,8 @@ ENABLE_UPDATE_CHECK = os.getenv("PAPERLESS_ENABLE_UPDATE_CHECK", "default")
if ENABLE_UPDATE_CHECK != "default": if ENABLE_UPDATE_CHECK != "default":
ENABLE_UPDATE_CHECK = __get_boolean("PAPERLESS_ENABLE_UPDATE_CHECK") ENABLE_UPDATE_CHECK = __get_boolean("PAPERLESS_ENABLE_UPDATE_CHECK")
APP_TITLE = os.getenv("PAPERLESS_APP_TITLE", None)
############################################################################### ###############################################################################
# Machine Learning # # Machine Learning #
############################################################################### ###############################################################################