Save work on app title
This commit is contained in:
parent
a12e1fae72
commit
2cd993204c
@ -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}
|
||||||
|
|
||||||
|
@ -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 }">
|
||||||
|
@ -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) {
|
||||||
|
@ -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)
|
||||||
}
|
}
|
||||||
|
@ -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
|
||||||
}
|
}
|
||||||
|
@ -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: '',
|
||||||
|
},
|
||||||
]
|
]
|
||||||
|
@ -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,
|
||||||
|
@ -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
|
||||||
|
@ -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",
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]
|
@ -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")
|
||||||
|
|
||||||
|
@ -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 #
|
||||||
###############################################################################
|
###############################################################################
|
||||||
|
Loading…
x
Reference in New Issue
Block a user