diff --git a/.github/workflows/ci-backend.yml b/.github/workflows/ci-backend.yml
index 6bac2c24f5..0c30f2b1c7 100644
--- a/.github/workflows/ci-backend.yml
+++ b/.github/workflows/ci-backend.yml
@@ -8,7 +8,8 @@ on:
- 'translations**'
workflow_dispatch:
concurrency:
- group: backend-${{ github.event.pull_request.number || github.ref }}
+ # Let dev/main commits finish, PR and feature-branch runs supersede older ones
+ group: backend-${{ github.event.pull_request.number || ((github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main') && github.run_id) || github.ref }}
cancel-in-progress: true
env:
DEFAULT_UV_VERSION: "0.13.x"
diff --git a/.github/workflows/ci-docker.yml b/.github/workflows/ci-docker.yml
index 7b1c7f0ff5..2a6c5a7612 100644
--- a/.github/workflows/ci-docker.yml
+++ b/.github/workflows/ci-docker.yml
@@ -13,7 +13,8 @@ on:
- main
workflow_dispatch:
concurrency:
- group: docker-${{ github.event.pull_request.number || github.ref }}
+ # Let dev/main commits finish, PR and feature-branch runs supersede older ones
+ group: docker-${{ github.event.pull_request.number || ((github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main') && github.run_id) || github.ref }}
cancel-in-progress: true
env:
REGISTRY: ghcr.io
diff --git a/.github/workflows/ci-docs.yml b/.github/workflows/ci-docs.yml
index 61c54b77fb..b471dd6d53 100644
--- a/.github/workflows/ci-docs.yml
+++ b/.github/workflows/ci-docs.yml
@@ -6,7 +6,8 @@ on:
pull_request:
workflow_dispatch:
concurrency:
- group: docs-${{ github.event.pull_request.number || github.ref }}
+ # Let dev/main commits finish, PR and feature-branch runs supersede older ones
+ group: docs-${{ github.event.pull_request.number || ((github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main') && github.run_id) || github.ref }}
cancel-in-progress: true
permissions:
contents: read
diff --git a/.github/workflows/ci-frontend.yml b/.github/workflows/ci-frontend.yml
index 4935a767b6..bcf40223ab 100644
--- a/.github/workflows/ci-frontend.yml
+++ b/.github/workflows/ci-frontend.yml
@@ -8,7 +8,8 @@ on:
- 'translations**'
workflow_dispatch:
concurrency:
- group: frontend-${{ github.event.pull_request.number || github.ref }}
+ # Let dev/main commits finish, PR and feature-branch runs supersede older ones
+ group: frontend-${{ github.event.pull_request.number || ((github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main') && github.run_id) || github.ref }}
cancel-in-progress: true
permissions: {}
jobs:
@@ -191,7 +192,7 @@ jobs:
runs-on: ubuntu-26.04
permissions:
contents: read
- container: mcr.microsoft.com/playwright:v1.62.1-resolute
+ container: mcr.microsoft.com/playwright:v1.64.1-resolute
env:
PLAYWRIGHT_BROWSERS_PATH: /ms-playwright
PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1
diff --git a/.github/workflows/ci-lint.yml b/.github/workflows/ci-lint.yml
index 0bef634370..5abeab41a0 100644
--- a/.github/workflows/ci-lint.yml
+++ b/.github/workflows/ci-lint.yml
@@ -7,7 +7,8 @@ on:
branches-ignore:
- 'translations**'
concurrency:
- group: lint-${{ github.event.pull_request.number || github.ref }}
+ # Let dev/main commits finish, PR and feature-branch runs supersede older ones
+ group: lint-${{ github.event.pull_request.number || ((github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main') && github.run_id) || github.ref }}
cancel-in-progress: true
permissions:
contents: read
diff --git a/.github/workflows/ci-static-analysis.yml b/.github/workflows/ci-static-analysis.yml
index d774194e07..c534e75c05 100644
--- a/.github/workflows/ci-static-analysis.yml
+++ b/.github/workflows/ci-static-analysis.yml
@@ -8,7 +8,8 @@ on:
- 'translations**'
workflow_dispatch:
concurrency:
- group: static-analysis-${{ github.event.pull_request.number || github.ref }}
+ # Let dev/main commits finish, PR and feature-branch runs supersede older ones
+ group: static-analysis-${{ github.event.pull_request.number || ((github.ref == 'refs/heads/dev' || github.ref == 'refs/heads/main') && github.run_id) || github.ref }}
cancel-in-progress: true
permissions:
contents: read
diff --git a/docker/compose/docker-compose.ci-test.yml b/docker/compose/docker-compose.ci-test.yml
index 899cd94435..9c7c58b1cb 100644
--- a/docker/compose/docker-compose.ci-test.yml
+++ b/docker/compose/docker-compose.ci-test.yml
@@ -4,7 +4,7 @@
# correct networking for the tests
services:
gotenberg:
- image: docker.io/gotenberg/gotenberg:8.37
+ image: docker.io/gotenberg/gotenberg:8.38
hostname: gotenberg
container_name: gotenberg
network_mode: host
@@ -24,7 +24,7 @@ services:
network_mode: host
restart: unless-stopped
greenmail:
- image: docker.io/greenmail/standalone:2.1.14
+ image: docker.io/greenmail/standalone:2.1.15
hostname: greenmail
container_name: greenmail
environment:
@@ -35,7 +35,7 @@ services:
- "3143:3143" # IMAP
restart: unless-stopped
nginx:
- image: docker.io/nginx:1.31.6-alpine
+ image: docker.io/nginx:1.31.7-alpine
hostname: nginx
container_name: nginx
ports:
diff --git a/docker/compose/docker-compose.mariadb-tika.yml b/docker/compose/docker-compose.mariadb-tika.yml
index 7e48f80c06..c39c5ecfac 100644
--- a/docker/compose/docker-compose.mariadb-tika.yml
+++ b/docker/compose/docker-compose.mariadb-tika.yml
@@ -71,7 +71,7 @@ services:
PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
PAPERLESS_TIKA_ENDPOINT: http://tika:9998
gotenberg:
- image: docker.io/gotenberg/gotenberg:8.37
+ image: docker.io/gotenberg/gotenberg:8.38
restart: unless-stopped
# The gotenberg chromium route is used to convert .eml files. We do not
# want to allow external content like tracking pixels or even javascript.
diff --git a/docker/compose/docker-compose.postgres-tika.yml b/docker/compose/docker-compose.postgres-tika.yml
index 9f7003caca..353cf1a1e2 100644
--- a/docker/compose/docker-compose.postgres-tika.yml
+++ b/docker/compose/docker-compose.postgres-tika.yml
@@ -67,7 +67,7 @@ services:
PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
PAPERLESS_TIKA_ENDPOINT: http://tika:9998
gotenberg:
- image: docker.io/gotenberg/gotenberg:8.37
+ image: docker.io/gotenberg/gotenberg:8.38
restart: unless-stopped
# The gotenberg chromium route is used to convert .eml files. We do not
# want to allow external content like tracking pixels or even javascript.
diff --git a/docker/compose/docker-compose.sqlite-tika.yml b/docker/compose/docker-compose.sqlite-tika.yml
index 6fad60ff84..1349c47a85 100644
--- a/docker/compose/docker-compose.sqlite-tika.yml
+++ b/docker/compose/docker-compose.sqlite-tika.yml
@@ -56,7 +56,7 @@ services:
PAPERLESS_TIKA_GOTENBERG_ENDPOINT: http://gotenberg:3000
PAPERLESS_TIKA_ENDPOINT: http://tika:9998
gotenberg:
- image: docker.io/gotenberg/gotenberg:8.37
+ image: docker.io/gotenberg/gotenberg:8.38
restart: unless-stopped
# The gotenberg chromium route is used to convert .eml files. We do not
# want to allow external content like tracking pixels or even javascript.
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-consumer/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-consumer/run
index 209803d414..ab8d6b6dfd 100755
--- a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-consumer/run
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-consumer/run
@@ -10,9 +10,11 @@ if [[ -n "${PAPERLESS_CONSUMER_DISABLE}" ]]; then
else
cd ${PAPERLESS_SRC_DIR}
+ # Django system checks already ran once in init-system-checks, skip repeating them
+
if [[ -n "${USER_IS_NON_ROOT}" ]]; then
- exec python3 manage.py document_consumer
+ exec python3 manage.py document_consumer --skip-checks
else
- exec s6-setuidgid paperless python3 manage.py document_consumer
+ exec s6-setuidgid paperless python3 manage.py document_consumer --skip-checks
fi
fi
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-scheduler/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-scheduler/run
index 396a4d2e09..a3f9da5d14 100755
--- a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-scheduler/run
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-scheduler/run
@@ -3,8 +3,9 @@
cd ${PAPERLESS_SRC_DIR}
+# Django system checks already ran once in init-system-checks, skip repeating them
if [[ -n "${USER_IS_NON_ROOT}" ]]; then
- exec /usr/local/bin/celery --app paperless beat --loglevel INFO
+ exec /usr/local/bin/celery --skip-checks --app paperless beat --loglevel INFO
else
- exec s6-setuidgid paperless /usr/local/bin/celery --app paperless beat --loglevel INFO
+ exec s6-setuidgid paperless /usr/local/bin/celery --skip-checks --app paperless beat --loglevel INFO
fi
diff --git a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/run b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/run
index 0bf833c56e..0fb5d0f233 100755
--- a/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/run
+++ b/docker/rootfs/etc/s6-overlay/s6-rc.d/svc-worker/run
@@ -3,8 +3,9 @@
cd ${PAPERLESS_SRC_DIR}
+# Django system checks already ran once in init-system-checks, skip repeating them
if [[ -n "${USER_IS_NON_ROOT}" ]]; then
- exec /usr/local/bin/celery --app paperless worker --loglevel INFO --without-mingle --without-gossip
+ exec /usr/local/bin/celery --skip-checks --app paperless worker --loglevel INFO --without-mingle --without-gossip
else
- exec s6-setuidgid paperless /usr/local/bin/celery --app paperless worker --loglevel INFO --without-mingle --without-gossip
+ exec s6-setuidgid paperless /usr/local/bin/celery --skip-checks --app paperless worker --loglevel INFO --without-mingle --without-gossip
fi
diff --git a/docs/changelog.md b/docs/changelog.md
index cc54579cf1..af1ad02098 100644
--- a/docs/changelog.md
+++ b/docs/changelog.md
@@ -1,5 +1,29 @@
# Changelog
+## paperless-ngx 3.4.1
+
+### Bug Fixes
+
+- Fix the id\_\_ schemae in the right place [@shamoon](https://github.com/shamoon) ([#14604](https://github.com/paperless-ngx/paperless-ngx/pull/14604))
+- Fix: drop redundant change perms checks on cards open button [@shamoon](https://github.com/shamoon) ([#14601](https://github.com/paperless-ngx/paperless-ngx/pull/14601))
+- Tweak/fix: make new pdf controls mostly hidden [@shamoon](https://github.com/shamoon) ([#14595](https://github.com/paperless-ngx/paperless-ngx/pull/14595))
+- Tweak/fix: move preview button in doc list [@shamoon](https://github.com/shamoon) ([#14594](https://github.com/paperless-ngx/paperless-ngx/pull/14594))
+- Fix: checksum light mode display and cf dropdown mobile position [@shamoon](https://github.com/shamoon) ([#14590](https://github.com/paperless-ngx/paperless-ngx/pull/14590))
+
+### All App Changes
+
+
+6 changes
+
+- Fix the id\_\_ schemae in the right place [@shamoon](https://github.com/shamoon) ([#14604](https://github.com/paperless-ngx/paperless-ngx/pull/14604))
+- Fix: drop redundant change perms checks on cards open button [@shamoon](https://github.com/shamoon) ([#14601](https://github.com/paperless-ngx/paperless-ngx/pull/14601))
+- Chore: Improve idle memory via more lazy imports [@stumpylog](https://github.com/stumpylog) ([#14599](https://github.com/paperless-ngx/paperless-ngx/pull/14599))
+- Tweak/fix: make new pdf controls mostly hidden [@shamoon](https://github.com/shamoon) ([#14595](https://github.com/paperless-ngx/paperless-ngx/pull/14595))
+- Tweak/fix: move preview button in doc list [@shamoon](https://github.com/shamoon) ([#14594](https://github.com/paperless-ngx/paperless-ngx/pull/14594))
+- Fix: checksum light mode display and cf dropdown mobile position [@shamoon](https://github.com/shamoon) ([#14590](https://github.com/paperless-ngx/paperless-ngx/pull/14590))
+
+
+
## paperless-ngx 3.4.0
### Features / Enhancements
diff --git a/pyproject.toml b/pyproject.toml
index 10a5cab9ca..a113732408 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[project]
name = "paperless-ngx"
-version = "3.4.0"
+version = "3.4.1"
description = """\
A community-supported supercharged document management system: scan, index and archive all your physical documents\
"""
@@ -26,22 +26,22 @@ dependencies = [
"dateparser~=1.4",
# WARNING: django does not use semver.
# Only patch versions are guaranteed to not introduce breaking changes.
- "django~=5.2.13",
+ "django~=5.2.18",
"django-allauth[mfa,socialaccount]~=65.20.0",
"django-auditlog~=3.4.1",
"django-cachalot~=2.9.0",
"django-compression-middleware~=0.5.0",
"django-cors-headers~=4.9.0",
"django-extensions~=4.1",
- "django-filter>=25.1,<27",
- "django-guardian>=3.3.3,<3.6",
+ "django-filter>=26.2,<27",
+ "django-guardian>=3.5.2,<3.6",
"django-multiselectfield~=1.0.1",
"django-rich~=2.2.0",
"django-soft-delete~=1.0.18",
"django-treenode>=0.24",
"djangorestframework~=3.16",
"drf-spectacular~=0.30",
- "drf-spectacular-sidecar>=2026.7.1,<2026.10",
+ "drf-spectacular-sidecar>=2026.10.1,<2026.11",
"drf-writable-nested~=0.7.1",
"filelock>=3.32,<4.3",
"flower>=2.0.1,<2.3",
@@ -76,7 +76,7 @@ dependencies = [
"tantivy~=0.26.0",
"tika-client[httpx]~=1.0",
"torch>=2.13,<2.15",
- "turbohtml~=1.10.0",
+ "turbohtml~=1.15.3",
"watchfiles>=1.2",
"whitenoise~=6.11",
"whoosh-compat[tantivy]==0.3",
diff --git a/src-ui/angular.json b/src-ui/angular.json
index 633be88c5f..c3faf73f26 100644
--- a/src-ui/angular.json
+++ b/src-ui/angular.json
@@ -69,6 +69,9 @@
"src/polyfills.ts"
],
"tsConfig": "tsconfig.app.json",
+ "loader": {
+ ".svg": "text"
+ },
"localize": true,
"assets": [
"src/apple-touch-icon.png",
diff --git a/src-ui/e2e/backend.py b/src-ui/e2e/backend.py
index 0a4ed8fa32..b4a77bd2ec 100644
--- a/src-ui/e2e/backend.py
+++ b/src-ui/e2e/backend.py
@@ -43,6 +43,7 @@ def configure_environment(instance_root: Path) -> None:
def seed_database() -> None:
+ from django.contrib.auth.models import Permission
from django.contrib.auth.models import User
from django.core.management import call_command
from django.utils import timezone
@@ -63,11 +64,18 @@ def seed_database() -> None:
username="playwright",
password="playwright", # NOSONAR
)
- User.objects.create_user(
+ viewer = User.objects.create_user(
username="viewer",
password="viewer", # NOSONAR
)
+ viewer.user_permissions.add(
+ Permission.objects.get(
+ content_type__app_label="documents",
+ codename="view_uisettings",
+ ),
+ )
+
inbox = Tag.objects.create(name="Inbox", is_inbox_tag=True, owner=admin)
quick_filter = Tag.objects.create(name="Another Sample Tag", owner=admin)
Tag.objects.create(name="TagWithPartial", owner=admin)
diff --git a/src-ui/e2e/document-detail/document-detail.spec.ts b/src-ui/e2e/document-detail/document-detail.spec.ts
index 2eaec2263e..ba3d8841e4 100644
--- a/src-ui/e2e/document-detail/document-detail.spec.ts
+++ b/src-ui/e2e/document-detail/document-detail.spec.ts
@@ -80,12 +80,21 @@ test('should show a list of notes', async ({ page }) => {
test('should support quick filters', async ({ page }) => {
await page.goto('/documents/1/details')
+ // filter button is available before tags have loaded
+ const selectedTags = page.locator('pngx-input-tags .ng-value pngx-tag')
+ await expect(selectedTags).toHaveCount(2)
+ await expect(
+ selectedTags.getByText('Another Sample Tag', { exact: true })
+ ).toBeVisible()
+ await expect(selectedTags.getByText('Inbox', { exact: true })).toBeVisible()
await page
.getByRole('button', { name: 'Filter documents with these Tags' })
.click()
- await expect(page).toHaveURL(
- /tags__id__all=2,1&sort=created&reverse=1&page=1/
- )
+ await expect(page).toHaveURL((url) => {
+ const tags = url.searchParams.get('tags__id__all')?.split(',').sort()
+ return url.pathname === '/documents' && tags?.join(',') === '1,2'
+ })
+ await expect(page.locator('pngx-document-list')).toHaveText(/one document/i)
})
test('should finish reloading the preview after a remote document update', async ({
diff --git a/src-ui/e2e/document-list/document-list.spec.ts b/src-ui/e2e/document-list/document-list.spec.ts
index 5365b48268..b86ffa873f 100644
--- a/src-ui/e2e/document-list/document-list.spec.ts
+++ b/src-ui/e2e/document-list/document-list.spec.ts
@@ -123,7 +123,7 @@ test('sorting', async ({ page }) => {
await page.getByRole('button', { name: 'Notes' }).click()
await expect(page).toHaveURL(/sort=num_notes/)
await page.getByRole('button', { name: 'Sort' }).click()
- await page.locator('.w-100 > label > i-bs').first().click()
+ await page.locator('.w-100 > label > pngx-bs-icon').first().click()
await expect(page).not.toHaveURL(/reverse=1/)
})
diff --git a/src-ui/e2e/permissions/global-permissions.spec.ts b/src-ui/e2e/permissions/global-permissions.spec.ts
index 42d9002ff5..1cff42b27b 100644
--- a/src-ui/e2e/permissions/global-permissions.spec.ts
+++ b/src-ui/e2e/permissions/global-permissions.spec.ts
@@ -6,8 +6,15 @@ test.use({
},
})
-test('should not allow user to edit settings', async ({ page }) => {
+test.beforeEach(async ({ page }) => {
+ const settingsLoaded = page.waitForResponse((response) =>
+ response.url().endsWith('/api/ui_settings/')
+ )
await page.goto('/dashboard')
+ expect((await settingsLoaded).status()).toBe(200)
+})
+
+test('should not allow user to edit settings', async ({ page }) => {
await expect(page.getByRole('link', { name: 'Settings' })).not.toBeAttached()
await page.goto('/settings')
await expect(page.locator('body')).toHaveText(
@@ -16,7 +23,6 @@ test('should not allow user to edit settings', async ({ page }) => {
})
test('should not allow user to view documents', async ({ page }) => {
- await page.goto('/dashboard')
await expect(
page.locator('nav').getByRole('link', { name: 'Documents' })
).not.toBeAttached()
@@ -31,7 +37,6 @@ test('should not allow user to view documents', async ({ page }) => {
})
test('should not allow user to view correspondents', async ({ page }) => {
- await page.goto('/dashboard')
await expect(
page.getByRole('link', { name: 'Attributes' })
).not.toBeAttached()
@@ -42,7 +47,6 @@ test('should not allow user to view correspondents', async ({ page }) => {
})
test('should not allow user to view tags', async ({ page }) => {
- await page.goto('/dashboard')
await expect(
page.getByRole('link', { name: 'Attributes' })
).not.toBeAttached()
@@ -53,7 +57,6 @@ test('should not allow user to view tags', async ({ page }) => {
})
test('should not allow user to view document types', async ({ page }) => {
- await page.goto('/dashboard')
await expect(
page.getByRole('link', { name: 'Attributes' })
).not.toBeAttached()
@@ -64,7 +67,6 @@ test('should not allow user to view document types', async ({ page }) => {
})
test('should not allow user to view storage paths', async ({ page }) => {
- await page.goto('/dashboard')
await expect(
page.getByRole('link', { name: 'Attributes' })
).not.toBeAttached()
@@ -75,7 +77,6 @@ test('should not allow user to view storage paths', async ({ page }) => {
})
test('should not allow user to view logs', async ({ page }) => {
- await page.goto('/dashboard')
await expect(page.getByRole('link', { name: 'Logs' })).not.toBeAttached()
await page.goto('/logs')
await expect(page.locator('body')).toHaveText(
@@ -84,7 +85,6 @@ test('should not allow user to view logs', async ({ page }) => {
})
test('should not allow user to view tasks', async ({ page }) => {
- await page.goto('/dashboard')
await expect(page.getByRole('link', { name: 'Tasks' })).not.toBeAttached()
await page.goto('/tasks')
await expect(page.locator('body')).toHaveText(
diff --git a/src-ui/jest.config.js b/src-ui/jest.config.js
index 89a3341307..ffea6ccc21 100644
--- a/src-ui/jest.config.js
+++ b/src-ui/jest.config.js
@@ -28,7 +28,7 @@ module.exports = {
'abstract-paperless-service',
],
transformIgnorePatterns: [
- 'node_modules/(?!.*(\\.mjs$|tslib|lodash-es|normalize-diacritics|marked|@angular/common/locales/.*\\.js$))',
+ 'node_modules/(?!.*(\\.mjs$|tslib|lodash-es|normalize-diacritics|marked|@angular/common/locales/.*\\.js$|bootstrap-icons/icons/.*\\.svg$))',
],
moduleNameMapper: {
...esmPreset.moduleNameMapper,
diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf
index 8996c9b95d..073a2a394b 100644
--- a/src-ui/messages.xlf
+++ b/src-ui/messages.xlf
@@ -5,14 +5,14 @@
Close
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/alert/alert.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/alert/alert.ts
38,39
- Slide of
+ Slide of
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/carousel/carousel.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/carousel/carousel.ts
386,393
Currently selected slide number read by screen reader
@@ -20,219 +20,219 @@
Previous
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/carousel/carousel.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/carousel/carousel.ts
425,426
Next
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/carousel/carousel.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/carousel/carousel.ts
452,453
Select month
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/datepicker/datepicker-navigation-select.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/datepicker/datepicker-navigation-select.ts
52
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/datepicker/datepicker-navigation-select.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/datepicker/datepicker-navigation-select.ts
52
Select year
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/datepicker/datepicker-navigation-select.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/datepicker/datepicker-navigation-select.ts
52
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/datepicker/datepicker-navigation-select.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/datepicker/datepicker-navigation-select.ts
52
Previous month
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/datepicker/datepicker-navigation.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/datepicker/datepicker-navigation.ts
73,76
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/datepicker/datepicker-navigation.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/datepicker/datepicker-navigation.ts
73,76
Next month
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/datepicker/datepicker-navigation.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/datepicker/datepicker-navigation.ts
73,74
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/datepicker/datepicker-navigation.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/datepicker/datepicker-navigation.ts
73,74
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/progressbar/progressbar.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/progressbar/progressbar.ts
39,40
HH
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/timepicker/timepicker.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/timepicker/timepicker.ts
442
Hours
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/timepicker/timepicker.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/timepicker/timepicker.ts
442
MM
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/timepicker/timepicker.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/timepicker/timepicker.ts
442
Minutes
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/timepicker/timepicker.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/timepicker/timepicker.ts
442
Increment hours
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/timepicker/timepicker.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/timepicker/timepicker.ts
442
Decrement hours
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/timepicker/timepicker.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/timepicker/timepicker.ts
442
Increment minutes
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/timepicker/timepicker.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/timepicker/timepicker.ts
442
Decrement minutes
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/timepicker/timepicker.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/timepicker/timepicker.ts
442
SS
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/timepicker/timepicker.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/timepicker/timepicker.ts
442
Seconds
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/timepicker/timepicker.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/timepicker/timepicker.ts
442
Increment seconds
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/timepicker/timepicker.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/timepicker/timepicker.ts
442
Decrement seconds
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/timepicker/timepicker.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/timepicker/timepicker.ts
442
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/timepicker/timepicker.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/timepicker/timepicker.ts
442
Close
- node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.2_@angular+core@22.2.2_@angular+_56804c6e9d763769999573a32671b982/node_modules/src/toast/toast.ts
+ node_modules/.pnpm/@ng-bootstrap+ng-bootstrap@21.0.0_@angular+common@22.2.3_@angular+core@22.2.3_@angular+_2a970977f09c8afdd1f9933e219c8db5/node_modules/src/toast/toast.ts
80
@@ -687,7 +687,11 @@
src/app/components/document-detail/document-detail.component.html
- 441,442
+ 441
+
+
+ src/app/components/document-detail/document-detail.component.html
+ 442,443
src/app/components/document-list/bulk-editor/custom-fields-bulk-edit-dialog/custom-fields-bulk-edit-dialog.component.html
@@ -859,7 +863,7 @@
src/app/components/document-detail/document-detail.component.html
- 460
+ 473
src/app/components/document-list/document-list.component.html
@@ -1402,7 +1406,7 @@
src/app/components/document-list/document-list.component.html
- 239,240
+ 240,241
src/app/data/document.ts
@@ -1474,6 +1478,10 @@
src/app/components/manage/mail/mail.component.html
166
+
+ src/app/components/manage/saved-views/saved-views.component.html
+ 46
+
Default Permissions
@@ -1733,7 +1741,7 @@
src/app/components/document-list/document-list.component.html
- 248,249
+ 249,250
src/app/components/document-list/filter-editor/filter-editor.component.html
@@ -1768,7 +1776,7 @@
src/app/components/document-list/document-list.component.html
- 257,258
+ 258,259
src/app/components/document-list/filter-editor/filter-editor.component.html
@@ -1811,7 +1819,7 @@
src/app/components/document-list/document-list.component.html
- 221,222
+ 222,223
src/app/components/document-list/filter-editor/filter-editor.component.html
@@ -2289,7 +2297,7 @@
src/app/components/document-list/document-list.component.html
- 266,267
+ 267,268
src/app/components/manage/share-links/share-link-bundle-list/share-link-bundle-list.component.html
@@ -4115,7 +4123,7 @@
src/app/components/document-list/document-list.component.html
- 388
+ 391
@@ -4389,7 +4397,7 @@
Create new field
src/app/components/common/custom-fields-dropdown/custom-fields-dropdown.component.html
- 20
+ 19
@@ -4786,7 +4794,7 @@
src/app/components/document-list/document-list.component.html
- 275,276
+ 276,277
src/app/data/document.ts
@@ -6604,7 +6612,7 @@
src/app/components/document-list/document-list.component.html
- 218,219
+ 219,220
src/app/components/document-list/filter-editor/filter-editor.component.ts
@@ -6788,21 +6796,21 @@
Email sent
src/app/components/common/email-document-dialog/email-document-dialog.component.ts
- 53
+ 52
Error emailing documents
src/app/components/common/email-document-dialog/email-document-dialog.component.ts
- 59
+ 58
Error emailing document
src/app/components/common/email-document-dialog/email-document-dialog.component.ts
- 60
+ 59
@@ -8410,7 +8418,7 @@
src/app/components/document-list/document-list.component.html
- 320
+ 321
@@ -8425,7 +8433,7 @@
src/app/components/document-list/document-list.component.html
- 360
+ 363
@@ -8440,7 +8448,7 @@
src/app/components/document-list/document-list.component.html
- 367
+ 370
@@ -8458,7 +8466,7 @@
src/app/components/document-list/document-list.component.html
- 388
+ 391
@@ -8588,7 +8596,7 @@
src/app/components/document-detail/document-detail.component.html
- 483
+ 496
src/app/components/document-list/document-list.component.html
@@ -8701,7 +8709,7 @@
src/main.ts
- 483
+ 168
@@ -8863,63 +8871,82 @@
Save & next
src/app/components/document-detail/document-detail.component.html
- 443
+ 445
+
+
+ src/app/components/document-detail/document-detail.component.html
+ 456
Save & close
src/app/components/document-detail/document-detail.component.html
- 445
+ 447
+
+
+ src/app/components/document-detail/document-detail.component.html
+ 458
Discard
src/app/components/document-detail/document-detail.component.html
- 447,448
+ 449
+
+
+ src/app/components/document-detail/document-detail.component.html
+ 450,451
+
+
+
+ More save options
+
+ src/app/components/document-detail/document-detail.component.html
+ 453
Document loading...
src/app/components/document-detail/document-detail.component.html
- 455
+ 468
of
src/app/components/document-detail/document-detail.component.html
- 484,485
+ 497,498
Zoom out
src/app/components/document-detail/document-detail.component.html
- 488
+ 501
Zoom
src/app/components/document-detail/document-detail.component.html
- 491
+ 504
Zoom in
src/app/components/document-detail/document-detail.component.html
- 498
+ 511
Enter Password
src/app/components/document-detail/document-detail.component.html
- 532
+ 545
@@ -9919,7 +9946,7 @@
src/app/components/document-list/document-list.component.html
- 336
+ 339
@@ -10234,21 +10261,21 @@
Sort by title
src/app/components/document-list/document-list.component.html
- 213
+ 214
Sort by owner
src/app/components/document-list/document-list.component.html
- 226
+ 227
Owner
src/app/components/document-list/document-list.component.html
- 230,231
+ 231,232
src/app/data/document.ts
@@ -10263,49 +10290,49 @@
Sort by notes
src/app/components/document-list/document-list.component.html
- 235
+ 236
Sort by document type
src/app/components/document-list/document-list.component.html
- 244
+ 245
Sort by storage path
src/app/components/document-list/document-list.component.html
- 253
+ 254
Sort by created date
src/app/components/document-list/document-list.component.html
- 262
+ 263
Sort by added date
src/app/components/document-list/document-list.component.html
- 271
+ 272
Sort by number of pages
src/app/components/document-list/document-list.component.html
- 280
+ 281
Pages
src/app/components/document-list/document-list.component.html
- 284,285
+ 285,286
src/app/data/document.ts
@@ -10324,28 +10351,28 @@
Shared
src/app/components/document-list/document-list.component.html
- 288
+ 289
Sort by
src/app/components/document-list/document-list.component.html
- 294,295
-
-
-
- Edit document
-
- src/app/components/document-list/document-list.component.html
- 328
+ 295,296
Preview document
src/app/components/document-list/document-list.component.html
- 329
+ 327
+
+
+
+ Edit document
+
+ src/app/components/document-list/document-list.component.html
+ 335
@@ -11451,13 +11478,6 @@
4,5
-
- Permissions
-
- src/app/components/manage/saved-views/saved-views.component.html
- 46,47
-
-
Documents page size
@@ -13458,14 +13478,14 @@
Prev
src/main.ts
- 482
+ 167
End
src/main.ts
- 484
+ 169