From e787055294ae3ea4d84151e0c3e44697ecf81b66 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 16 Sep 2024 23:25:33 +0000 Subject: [PATCH 01/12] Chore(deps-dev): Bump the development group with 2 updates (#7723) * Chore(deps-dev): Bump the development group with 2 updates Bumps the development group with 2 updates: [ruff](https://github.com/astral-sh/ruff) and [pytest](https://github.com/pytest-dev/pytest). Updates `ruff` from 0.6.4 to 0.6.5 - [Release notes](https://github.com/astral-sh/ruff/releases) - [Changelog](https://github.com/astral-sh/ruff/blob/main/CHANGELOG.md) - [Commits](https://github.com/astral-sh/ruff/compare/0.6.4...0.6.5) Updates `pytest` from 8.3.2 to 8.3.3 - [Release notes](https://github.com/pytest-dev/pytest/releases) - [Changelog](https://github.com/pytest-dev/pytest/blob/main/CHANGELOG.rst) - [Commits](https://github.com/pytest-dev/pytest/compare/8.3.2...8.3.3) --- updated-dependencies: - dependency-name: ruff dependency-type: direct:development update-type: version-update:semver-patch dependency-group: development - dependency-name: pytest dependency-type: direct:development update-type: version-update:semver-patch dependency-group: development ... Signed-off-by: dependabot[bot] * Update .pre-commit-config.yaml --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: shamoon <4887959+shamoon@users.noreply.github.com> --- .pre-commit-config.yaml | 2 +- Pipfile.lock | 44 ++++++++++++++++++++--------------------- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 345677c05..c39480421 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -48,7 +48,7 @@ repos: exclude: "(^Pipfile\\.lock$)" # Python hooks - repo: https://github.com/astral-sh/ruff-pre-commit - rev: 'v0.6.4' + rev: 'v0.6.5' hooks: - id: ruff - id: ruff-format diff --git a/Pipfile.lock b/Pipfile.lock index 48a9ad907..4b94f6dfe 100644 --- a/Pipfile.lock +++ b/Pipfile.lock @@ -3473,12 +3473,12 @@ }, "pytest": { "hashes": [ - "sha256:4ba08f9ae7dcf84ded419494d229b48d0903ea6407b030eaec46df5e6a73bba5", - "sha256:c132345d12ce551242c87269de812483f5bcc87cdbb4722e48487ba194f9fdce" + "sha256:70b98107bd648308a7952b06e6ca9a50bc660be218d53c257cc1fc94fda10181", + "sha256:a6853c7375b2663155079443d2e45de913a911a11d669df02a50814944db57b2" ], "index": "pypi", "markers": "python_version >= '3.8'", - "version": "==8.3.2" + "version": "==8.3.3" }, "pytest-cov": { "hashes": [ @@ -3760,28 +3760,28 @@ }, "ruff": { "hashes": [ - "sha256:0308610470fcc82969082fc83c76c0d362f562e2f0cdab0586516f03a4e06ec6", - "sha256:0b52387d3289ccd227b62102c24714ed75fbba0b16ecc69a923a37e3b5e0aaaa", - "sha256:0ea086601b22dc5e7693a78f3fcfc460cceabfdf3bdc36dc898792aba48fbad6", - "sha256:34d5efad480193c046c86608dbba2bccdc1c5fd11950fb271f8086e0c763a5d1", - "sha256:50e30b437cebef547bd5c3edf9ce81343e5dd7c737cb36ccb4fe83573f3d392e", - "sha256:549daccee5227282289390b0222d0fbee0275d1db6d514550d65420053021a58", - "sha256:66dbfea86b663baab8fcae56c59f190caba9398df1488164e2df53e216248baa", - "sha256:7862f42fc1a4aca1ea3ffe8a11f67819d183a5693b228f0bb3a531f5e40336fc", - "sha256:803b96dea21795a6c9d5bfa9e96127cc9c31a1987802ca68f35e5c95aed3fc0d", - "sha256:932063a03bac394866683e15710c25b8690ccdca1cf192b9a98260332ca93408", - "sha256:ac3b5bfbee99973f80aa1b7cbd1c9cbce200883bdd067300c22a6cc1c7fba212", - "sha256:ac4b75e898ed189b3708c9ab3fc70b79a433219e1e87193b4f2b77251d058d14", - "sha256:bedff9e4f004dad5f7f76a9d39c4ca98af526c9b1695068198b3bda8c085ef60", - "sha256:c44536df7b93a587de690e124b89bd47306fddd59398a0fb12afd6133c7b3818", - "sha256:c4b153fc152af51855458e79e835fb6b933032921756cec9af7d0ba2aa01a258", - "sha256:d02a4127a86de23002e694d7ff19f905c51e338c72d8e09b56bfb60e1681724f", - "sha256:eebe4ff1967c838a1a9618a5a59a3b0a00406f8d7eefee97c70411fefc353617", - "sha256:f0f8968feea5ce3777c0d8365653d5e91c40c31a81d95824ba61d871a11b8523" + "sha256:005256d977021790cc52aa23d78f06bb5090dc0bfbd42de46d49c201533982ae", + "sha256:09c72a833fd3551135ceddcba5ebdb68ff89225d30758027280968c9acdc7810", + "sha256:381413ec47f71ce1d1c614f7779d88886f406f1fd53d289c77e4e533dc6ea200", + "sha256:3a8d42d11fff8d3143ff4da41742a98f8f233bf8890e9fe23077826818f8d680", + "sha256:3e42a57b58e3612051a636bc1ac4e6b838679530235520e8f095f7c44f706ff9", + "sha256:482c1e6bfeb615eafc5899127b805d28e387bd87db38b2c0c41d271f5e58d8cc", + "sha256:4d32d87fab433c0cf285c3683dd4dae63be05fd7a1d65b3f5bf7cdd05a6b96fb", + "sha256:51935067740773afdf97493ba9b8231279e9beef0f2a8079188c4776c25688e0", + "sha256:52e75a82bbc9b42e63c08d22ad0ac525117e72aee9729a069d7c4f235fc4d276", + "sha256:7291e64d7129f24d1b0c947ec3ec4c0076e958d1475c61202497c6aced35dd19", + "sha256:794ada3400a0d0b89e3015f1a7e01f4c97320ac665b7bc3ade24b50b54cb2972", + "sha256:7e4e308f16e07c95fc7753fc1aaac690a323b2bb9f4ec5e844a97bb7fbebd748", + "sha256:800c50371bdcb99b3c1551d5691e14d16d6f07063a518770254227f7f6e8c178", + "sha256:8e25ddd9cd63ba1f3bd51c1f09903904a6adf8429df34f17d728a8fa11174253", + "sha256:932cd69eefe4daf8c7d92bd6689f7e8182571cb934ea720af218929da7bd7d69", + "sha256:9ad7dfbd138d09d9a7e6931e6a7e797651ce29becd688be8a0d4d5f8177b4b0c", + "sha256:a50af6e828ee692fb10ff2dfe53f05caecf077f4210fae9677e06a808275754f", + "sha256:cf4d3fa53644137f6a4a27a2b397381d16454a1566ae5335855c187fbf67e4f5" ], "index": "pypi", "markers": "python_version >= '3.7'", - "version": "==0.6.4" + "version": "==0.6.5" }, "scipy": { "hashes": [ From 8aa35540b57a30818341e433bd4f1a73299b3bf7 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 16 Sep 2024 19:36:44 -0700 Subject: [PATCH 02/12] Fix a random test error --- .../filterable-dropdown.component.spec.ts | 7 +------ .../filterable-dropdown/filterable-dropdown.component.ts | 4 ++-- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.spec.ts b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.spec.ts index a285144f4..d1c37bc8b 100644 --- a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.spec.ts +++ b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.spec.ts @@ -539,15 +539,10 @@ describe('FilterableDropdownComponent & FilterableDropdownSelectionModel', () => fixture.nativeElement .querySelector('button') .dispatchEvent(new MouseEvent('click')) // open - fixture.detectChanges() tick(100) component.filterText = 'FooBar' - fixture.detectChanges() - component.listFilterTextInput.nativeElement.dispatchEvent( - new KeyboardEvent('keyup', { key: 'Enter' }) - ) + component.listFilterEnter() expect(component.selectionModel.getSelectedItems()).toEqual([]) - tick(300) expect(createSpy).toHaveBeenCalled() })) diff --git a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts index 4a3c70953..7830e3909 100644 --- a/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts +++ b/src-ui/src/app/components/common/filterable-dropdown/filterable-dropdown.component.ts @@ -483,7 +483,7 @@ export class FilterableDropdownComponent implements OnDestroy, OnInit { dropdownOpenChange(open: boolean): void { if (open) { setTimeout(() => { - this.listFilterTextInput.nativeElement.focus() + this.listFilterTextInput?.nativeElement.focus() }, 0) if (this.editing) { this.selectionModel.reset() @@ -492,7 +492,7 @@ export class FilterableDropdownComponent implements OnDestroy, OnInit { this.opened.next(this) } else { if (this.creating) { - this.dropdown.open() + this.dropdown?.open() this.creating = false } else { this.filterText = '' From 6192c15c4d9a0e84fbbdf691180f033aad194066 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 16 Sep 2024 22:02:51 -0700 Subject: [PATCH 03/12] Feature: copy workflows and mail rules, improve layout (#7727) --- src-ui/messages.xlf | 118 ++++++++++++------ .../manage/mail/mail.component.html | 62 ++++++--- .../manage/mail/mail.component.scss | 4 + .../manage/mail/mail.component.spec.ts | 11 ++ .../components/manage/mail/mail.component.ts | 14 ++- .../manage/workflows/workflows.component.html | 42 +++++-- .../manage/workflows/workflows.component.scss | 4 + .../workflows/workflows.component.spec.ts | 16 ++- .../manage/workflows/workflows.component.ts | 26 +++- 9 files changed, 227 insertions(+), 70 deletions(-) diff --git a/src-ui/messages.xlf b/src-ui/messages.xlf index 18ba85ce4..dec952685 100644 --- a/src-ui/messages.xlf +++ b/src-ui/messages.xlf @@ -726,7 +726,7 @@ src/app/components/manage/mail/mail.component.html - 105 + 137 src/app/components/manage/management-list/management-list.component.html @@ -1092,11 +1092,19 @@ src/app/components/manage/mail/mail.component.html - 39 + 41 src/app/components/manage/mail/mail.component.html - 85 + 51 + + + src/app/components/manage/mail/mail.component.html + 99 + + + src/app/components/manage/mail/mail.component.html + 111 src/app/components/manage/management-list/management-list.component.html @@ -1398,7 +1406,7 @@ src/app/components/manage/mail/mail.component.html - 69 + 81 src/app/components/manage/management-list/management-list.component.html @@ -1493,7 +1501,15 @@ src/app/components/manage/mail/mail.component.html - 88 + 54 + + + src/app/components/manage/mail/mail.component.html + 100 + + + src/app/components/manage/mail/mail.component.html + 114 src/app/components/manage/management-list/management-list.component.html @@ -1549,7 +1565,11 @@ src/app/components/manage/workflows/workflows.component.html - 38 + 41 + + + src/app/components/manage/workflows/workflows.component.html + 52 @@ -1879,7 +1899,7 @@ src/app/components/manage/mail/mail.component.html - 66 + 78 src/app/components/manage/management-list/management-list.component.html @@ -2207,7 +2227,7 @@ src/app/components/manage/mail/mail.component.ts - 173 + 179 src/app/components/manage/management-list/management-list.component.ts @@ -2215,7 +2235,7 @@ src/app/components/manage/workflows/workflows.component.ts - 97 + 115 @@ -2402,11 +2422,19 @@ src/app/components/manage/mail/mail.component.html - 36 + 40 src/app/components/manage/mail/mail.component.html - 82 + 48 + + + src/app/components/manage/mail/mail.component.html + 98 + + + src/app/components/manage/mail/mail.component.html + 108 src/app/components/manage/management-list/management-list.component.html @@ -2442,7 +2470,11 @@ src/app/components/manage/workflows/workflows.component.html - 35 + 40 + + + src/app/components/manage/workflows/workflows.component.html + 49 @@ -2546,7 +2578,7 @@ src/app/components/manage/mail/mail.component.ts - 175 + 181 src/app/components/manage/management-list/management-list.component.ts @@ -2554,7 +2586,7 @@ src/app/components/manage/workflows/workflows.component.ts - 99 + 117 @@ -3665,7 +3697,7 @@ src/app/components/manage/mail/mail.component.html - 68 + 80 @@ -5025,6 +5057,22 @@ src/app/components/common/system-status-dialog/system-status-dialog.component.html 156 + + src/app/components/manage/mail/mail.component.html + 101 + + + src/app/components/manage/mail/mail.component.html + 119 + + + src/app/components/manage/workflows/workflows.component.html + 42 + + + src/app/components/manage/workflows/workflows.component.html + 57 + Regenerate auth token @@ -7420,35 +7468,35 @@ No mail accounts defined. src/app/components/manage/mail/mail.component.html - 50 + 62 Mail rules src/app/components/manage/mail/mail.component.html - 58 + 70 Add Rule src/app/components/manage/mail/mail.component.html - 60 + 72 Sort Order src/app/components/manage/mail/mail.component.html - 67 + 79 No mail rules defined. src/app/components/manage/mail/mail.component.html - 96 + 128 @@ -7511,56 +7559,56 @@ Saved rule "". src/app/components/manage/mail/mail.component.ts - 152 + 151 Error saving rule. src/app/components/manage/mail/mail.component.ts - 163 + 162 Confirm delete mail rule src/app/components/manage/mail/mail.component.ts - 171 + 177 This operation will permanently delete this mail rule. src/app/components/manage/mail/mail.component.ts - 172 + 178 Deleted mail rule src/app/components/manage/mail/mail.component.ts - 181 + 187 Error deleting mail rule. src/app/components/manage/mail/mail.component.ts - 190 + 196 Permissions updated src/app/components/manage/mail/mail.component.ts - 212 + 218 Error updating permissions src/app/components/manage/mail/mail.component.ts - 217 + 223 src/app/components/manage/management-list/management-list.component.ts @@ -7821,49 +7869,49 @@ No workflows defined. src/app/components/manage/workflows/workflows.component.html - 46 + 66 Saved workflow "". src/app/components/manage/workflows/workflows.component.ts - 79 + 78 Error saving workflow. src/app/components/manage/workflows/workflows.component.ts - 87 + 86 Confirm delete workflow src/app/components/manage/workflows/workflows.component.ts - 95 + 113 This operation will permanently delete this workflow. src/app/components/manage/workflows/workflows.component.ts - 96 + 114 Deleted workflow src/app/components/manage/workflows/workflows.component.ts - 105 + 123 Error deleting workflow. src/app/components/manage/workflows/workflows.component.ts - 110 + 128 diff --git a/src-ui/src/app/components/manage/mail/mail.component.html b/src-ui/src/app/components/manage/mail/mail.component.html index b804b0f2f..add5614c4 100644 --- a/src-ui/src/app/components/manage/mail/mail.component.html +++ b/src-ui/src/app/components/manage/mail/mail.component.html @@ -19,7 +19,7 @@
Name
Server
-
Username
+
Username
Actions
@@ -29,9 +29,21 @@
{{account.imap_server}}
-
{{account.username}}
+
{{account.username}}
-
+
+
+ +
+ + + +
+
+
+
@@ -64,7 +76,7 @@
  • Name
    -
    Sort Order
    +
    Sort Order
    Account
    Actions
    @@ -74,19 +86,39 @@
  • -
    {{rule.order}}
    +
    {{rule.order}}
    {{(mailAccountService.getCached(rule.account) | async)?.name}}
    -
    - - - +
    +
    + +
    + + + + +
    +
    +
    +
    diff --git a/src-ui/src/app/components/manage/mail/mail.component.scss b/src-ui/src/app/components/manage/mail/mail.component.scss index e69de29bb..0c1f432aa 100644 --- a/src-ui/src/app/components/manage/mail/mail.component.scss +++ b/src-ui/src/app/components/manage/mail/mail.component.scss @@ -0,0 +1,4 @@ +// hide caret on mobile dropdown +.d-block.d-sm-none .dropdown-toggle::after { + display: none; +} diff --git a/src-ui/src/app/components/manage/mail/mail.component.spec.ts b/src-ui/src/app/components/manage/mail/mail.component.spec.ts index e72b49b0f..4a134b880 100644 --- a/src-ui/src/app/components/manage/mail/mail.component.spec.ts +++ b/src-ui/src/app/components/manage/mail/mail.component.spec.ts @@ -226,6 +226,17 @@ describe('MailComponent', () => { component.editMailRule() }) + it('should support copy mail rule', () => { + completeSetup() + let modal: NgbModalRef + modalService.activeInstances.subscribe((refs) => (modal = refs[0])) + component.copyMailRule(mailRules[0] as MailRule) + const editDialog = modal.componentInstance as MailRuleEditDialogComponent + expect(editDialog.object.id).toBeNull() + expect(editDialog.object.name).toEqual(`${mailRules[0].name} (copy)`) + expect(editDialog.dialogMode).toEqual(EditDialogMode.CREATE) + }) + it('should support delete mail rule, show error if needed', () => { completeSetup() let modal: NgbModalRef diff --git a/src-ui/src/app/components/manage/mail/mail.component.ts b/src-ui/src/app/components/manage/mail/mail.component.ts index d8820ed38..5d00b6c13 100644 --- a/src-ui/src/app/components/manage/mail/mail.component.ts +++ b/src-ui/src/app/components/manage/mail/mail.component.ts @@ -137,14 +137,13 @@ export class MailComponent }) } - editMailRule(rule: MailRule = null) { + editMailRule(rule: MailRule = null, forceCreate = false) { const modal = this.modalService.open(MailRuleEditDialogComponent, { backdrop: 'static', size: 'xl', }) - modal.componentInstance.dialogMode = rule - ? EditDialogMode.EDIT - : EditDialogMode.CREATE + modal.componentInstance.dialogMode = + rule && !forceCreate ? EditDialogMode.EDIT : EditDialogMode.CREATE modal.componentInstance.object = rule modal.componentInstance.succeeded .pipe(takeUntil(this.unsubscribeNotifier)) @@ -164,6 +163,13 @@ export class MailComponent }) } + copyMailRule(rule: MailRule) { + const clone = { ...rule } + clone.id = null + clone.name = `${rule.name} (copy)` + this.editMailRule(clone, true) + } + deleteMailRule(rule: MailRule) { const modal = this.modalService.open(ConfirmDialogComponent, { backdrop: 'static', diff --git a/src-ui/src/app/components/manage/workflows/workflows.component.html b/src-ui/src/app/components/manage/workflows/workflows.component.html index d398b95b1..1e83efd36 100644 --- a/src-ui/src/app/components/manage/workflows/workflows.component.html +++ b/src-ui/src/app/components/manage/workflows/workflows.component.html @@ -15,9 +15,9 @@
  • Name
    -
    Sort order
    +
    Sort order
    Status
    -
    Triggers
    +
    Triggers
    Actions
  • @@ -26,17 +26,37 @@
  • -
    {{workflow.order}}
    +
    {{workflow.order}}
    @if(workflow.enabled) { Enabled } @else { Disabled }
    -
    {{getTypesList(workflow)}}
    +
    {{getTypesList(workflow)}}
    -
    - - + +
    +
    + +
    + + + +
    +
    +
    +
    diff --git a/src-ui/src/app/components/manage/workflows/workflows.component.scss b/src-ui/src/app/components/manage/workflows/workflows.component.scss index e69de29bb..0c1f432aa 100644 --- a/src-ui/src/app/components/manage/workflows/workflows.component.scss +++ b/src-ui/src/app/components/manage/workflows/workflows.component.scss @@ -0,0 +1,4 @@ +// hide caret on mobile dropdown +.d-block.d-sm-none .dropdown-toggle::after { + display: none; +} diff --git a/src-ui/src/app/components/manage/workflows/workflows.component.spec.ts b/src-ui/src/app/components/manage/workflows/workflows.component.spec.ts index 5a73b07b0..0bccbad2d 100644 --- a/src-ui/src/app/components/manage/workflows/workflows.component.spec.ts +++ b/src-ui/src/app/components/manage/workflows/workflows.component.spec.ts @@ -26,6 +26,7 @@ import { import { WorkflowActionType } from 'src/app/data/workflow-action' import { NgxBootstrapIconsModule, allIcons } from 'ngx-bootstrap-icons' import { provideHttpClient, withInterceptorsFromDi } from '@angular/common/http' +import { EditDialogMode } from '../../common/edit-dialog/edit-dialog.component' const workflows: Workflow[] = [ { @@ -173,6 +174,19 @@ describe('WorkflowsComponent', () => { expect(reloadSpy).toHaveBeenCalled() }) + it('should support copy', () => { + let modal: NgbModalRef + modalService.activeInstances.subscribe((m) => (modal = m[m.length - 1])) + + const copyButton = fixture.debugElement.queryAll(By.css('button'))[6] + copyButton.triggerEventHandler('click') + + expect(modal).not.toBeUndefined() + const editDialog = modal.componentInstance as WorkflowEditDialogComponent + expect(editDialog.object.name).toEqual(workflows[0].name + ' (copy)') + expect(editDialog.dialogMode).toEqual(EditDialogMode.CREATE) + }) + it('should support delete, show notification on error / success', () => { let modal: NgbModalRef modalService.activeInstances.subscribe((m) => (modal = m[m.length - 1])) @@ -180,7 +194,7 @@ describe('WorkflowsComponent', () => { const deleteSpy = jest.spyOn(workflowService, 'delete') const reloadSpy = jest.spyOn(component, 'reload') - const deleteButton = fixture.debugElement.queryAll(By.css('button'))[4] + const deleteButton = fixture.debugElement.queryAll(By.css('button'))[5] deleteButton.triggerEventHandler('click') expect(modal).not.toBeUndefined() diff --git a/src-ui/src/app/components/manage/workflows/workflows.component.ts b/src-ui/src/app/components/manage/workflows/workflows.component.ts index a80f03577..92b421e9f 100644 --- a/src-ui/src/app/components/manage/workflows/workflows.component.ts +++ b/src-ui/src/app/components/manage/workflows/workflows.component.ts @@ -57,14 +57,13 @@ export class WorkflowsComponent .join(', ') } - editWorkflow(workflow: Workflow) { + editWorkflow(workflow: Workflow, forceCreate: boolean = false) { const modal = this.modalService.open(WorkflowEditDialogComponent, { backdrop: 'static', size: 'xl', }) - modal.componentInstance.dialogMode = workflow - ? EditDialogMode.EDIT - : EditDialogMode.CREATE + modal.componentInstance.dialogMode = + workflow && !forceCreate ? EditDialogMode.EDIT : EditDialogMode.CREATE if (workflow) { // quick "deep" clone so original doesn't get modified const clone = Object.assign({}, workflow) @@ -88,6 +87,25 @@ export class WorkflowsComponent }) } + copyWorkflow(workflow: Workflow) { + const clone = Object.assign({}, workflow) + clone.id = null + clone.name = `${workflow.name} (copy)` + clone.actions = [ + ...workflow.actions.map((a) => { + a.id = null + return a + }), + ] + clone.triggers = [ + ...workflow.triggers.map((t) => { + t.id = null + return t + }), + ] + this.editWorkflow(clone, true) + } + deleteWorkflow(workflow: Workflow) { const modal = this.modalService.open(ConfirmDialogComponent, { backdrop: 'static', From fa6f013db52cffe4c6f4b075aa41912ce32cd467 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Wed, 18 Sep 2024 17:09:42 -0700 Subject: [PATCH 04/12] Fix: chrome scrolling in >= 129 (#7738) --- .../app-frame/app-frame.component.scss | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/src-ui/src/app/components/app-frame/app-frame.component.scss b/src-ui/src/app/components/app-frame/app-frame.component.scss index cdb6e3be5..7f9871b97 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.scss +++ b/src-ui/src/app/components/app-frame/app-frame.component.scss @@ -12,6 +12,9 @@ z-index: 995; /* Behind the navbar */ padding: 50px 0 0; /* Height of navbar */ box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1); + overflow-y: auto; + --pngx-sidebar-width: 25%; + max-width: var(--pngx-sidebar-width); .sidebar-heading .spinner-border { width: 0.8em; @@ -24,15 +27,15 @@ // These come from the col-* classes for non-slim sidebar, needed for animation @media (min-width: 768px) { - max-width: 25%; + --pngx-sidebar-width: 25%; } @media (min-width: 992px) { - max-width: 16.66666667%; + --pngx-sidebar-width: 16.66666667%; } @media (min-width: 2400px) { - max-width: 8.33333333%; + --pngx-sidebar-width: 8.33333333%; } transition: all .2s ease; @@ -109,12 +112,17 @@ main { .sidebar-slim-toggler { display: block; - position: absolute; - right: -12px; + position: fixed; + left: calc(var(--pngx-sidebar-width) - 12px); top: 60px; z-index: 996; --bs-btn-padding-x: 0.35rem; --bs-btn-padding-y: 0.125rem; + transition: all .2s ease; + } + + .sidebar.slim .sidebar-slim-toggler { + --pngx-sidebar-width: 50px !important; } } From a440c88b81eafaab8a68d1cf674ee90c0d6ec337 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 19 Sep 2024 18:58:40 -0700 Subject: [PATCH 05/12] Enhancement: allow setting session cookie age (#7743) --- docs/configuration.md | 7 +++++++ src/paperless/settings.py | 5 ++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/docs/configuration.md b/docs/configuration.md index 3530849dd..301e86fc2 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -611,6 +611,13 @@ You can optionally also automatically redirect users to the SSO login with [PAPE : Only applies to regular (non-SSO) accounts. See the corresponding [django-allauth documentation](https://docs.allauth.org/en/latest/account/configuration.html) +#### [`PAPERLESS_SESSION_COOKIE_AGE=`](#PAPERLESS_SESSION_COOKIE_AGE) {#PAPERLESS_SESSION_COOKIE_AGE} + +: Default login cookie expiration. Applies to regular logins if remember is enabled and always for SSO logins. See the corresponding +[django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#std-setting-SESSION_COOKIE_AGE) + + Defaults to 1209600 (2 weeks) + ## OCR settings {#ocr} Paperless uses [OCRmyPDF](https://ocrmypdf.readthedocs.io/en/latest/) diff --git a/src/paperless/settings.py b/src/paperless/settings.py index ebe64ba9e..9a57719a2 100644 --- a/src/paperless/settings.py +++ b/src/paperless/settings.py @@ -472,7 +472,10 @@ ACCOUNT_EMAIL_VERIFICATION = os.getenv( "optional", ) -ACCOUNT_SESSION_REMEMBER = __get_boolean("PAPERLESS_ACCOUNT_SESSION_REMEMBER") +ACCOUNT_SESSION_REMEMBER = __get_boolean("PAPERLESS_ACCOUNT_SESSION_REMEMBER", "True") +SESSION_COOKIE_AGE = int( + os.getenv("PAPERLESS_SESSION_COOKIE_AGE", 60 * 60 * 24 * 7 * 3), +) if AUTO_LOGIN_USERNAME: _index = MIDDLEWARE.index("django.contrib.auth.middleware.AuthenticationMiddleware") From 16069cde2339b2728eda83d9650a5dc55069f02c Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Thu, 19 Sep 2024 19:20:13 -0700 Subject: [PATCH 06/12] Documentation: fix session cookie config type --- docs/configuration.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/configuration.md b/docs/configuration.md index 301e86fc2..5b0434aaf 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -611,7 +611,7 @@ You can optionally also automatically redirect users to the SSO login with [PAPE : Only applies to regular (non-SSO) accounts. See the corresponding [django-allauth documentation](https://docs.allauth.org/en/latest/account/configuration.html) -#### [`PAPERLESS_SESSION_COOKIE_AGE=`](#PAPERLESS_SESSION_COOKIE_AGE) {#PAPERLESS_SESSION_COOKIE_AGE} +#### [`PAPERLESS_SESSION_COOKIE_AGE=`](#PAPERLESS_SESSION_COOKIE_AGE) {#PAPERLESS_SESSION_COOKIE_AGE} : Default login cookie expiration. Applies to regular logins if remember is enabled and always for SSO logins. See the corresponding [django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#std-setting-SESSION_COOKIE_AGE) From 609fa9a212af83eb1ad5c98a6efe658472339807 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 20 Sep 2024 10:36:40 -0700 Subject: [PATCH 07/12] Enhancement: set Django SESSION_EXPIRE_AT_BROWSER_CLOSE from PAPERLESS_ACCOUNT_SESSION_REMEMBER (#7748) --- docs/configuration.md | 6 ++++-- src/paperless/settings.py | 1 + 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/configuration.md b/docs/configuration.md index 5b0434aaf..57edb7c72 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -608,12 +608,14 @@ You can optionally also automatically redirect users to the SSO login with [PAPE #### [`PAPERLESS_ACCOUNT_SESSION_REMEMBER=`](#PAPERLESS_ACCOUNT_SESSION_REMEMBER) {#PAPERLESS_ACCOUNT_SESSION_REMEMBER} -: Only applies to regular (non-SSO) accounts. See the corresponding +: If false, sessions will expire at browser close, if true will use `PAPERLESS_SESSION_COOKIE_AGE` for expiration. See the corresponding [django-allauth documentation](https://docs.allauth.org/en/latest/account/configuration.html) + Defaults to True + #### [`PAPERLESS_SESSION_COOKIE_AGE=`](#PAPERLESS_SESSION_COOKIE_AGE) {#PAPERLESS_SESSION_COOKIE_AGE} -: Default login cookie expiration. Applies to regular logins if remember is enabled and always for SSO logins. See the corresponding +: Login session cookie expiration. Applies if `PAPERLESS_ACCOUNT_SESSION_REMEMBER` is enabled. See the corresponding [django documentation](https://docs.djangoproject.com/en/5.1/ref/settings/#std-setting-SESSION_COOKIE_AGE) Defaults to 1209600 (2 weeks) diff --git a/src/paperless/settings.py b/src/paperless/settings.py index 9a57719a2..46a697349 100644 --- a/src/paperless/settings.py +++ b/src/paperless/settings.py @@ -473,6 +473,7 @@ ACCOUNT_EMAIL_VERIFICATION = os.getenv( ) ACCOUNT_SESSION_REMEMBER = __get_boolean("PAPERLESS_ACCOUNT_SESSION_REMEMBER", "True") +SESSION_EXPIRE_AT_BROWSER_CLOSE = not ACCOUNT_SESSION_REMEMBER SESSION_COOKIE_AGE = int( os.getenv("PAPERLESS_SESSION_COOKIE_AGE", 60 * 60 * 24 * 7 * 3), ) From 3aba68c09f90a020422eb672b29d17af47544211 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Sun, 22 Sep 2024 22:51:59 -0700 Subject: [PATCH 08/12] Fix sidebar mobile width --- src-ui/src/app/components/app-frame/app-frame.component.scss | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src-ui/src/app/components/app-frame/app-frame.component.scss b/src-ui/src/app/components/app-frame/app-frame.component.scss index 7f9871b97..f5427c713 100644 --- a/src-ui/src/app/components/app-frame/app-frame.component.scss +++ b/src-ui/src/app/components/app-frame/app-frame.component.scss @@ -13,7 +13,7 @@ padding: 50px 0 0; /* Height of navbar */ box-shadow: inset -1px 0 0 rgba(0, 0, 0, .1); overflow-y: auto; - --pngx-sidebar-width: 25%; + --pngx-sidebar-width: 100%; max-width: var(--pngx-sidebar-width); .sidebar-heading .spinner-border { From 870d6ee782257167234f4de312dee7699877fd38 Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Mon, 23 Sep 2024 10:29:37 -0700 Subject: [PATCH 09/12] Fix: handle overflowing dropdowns on mobile (#7758) See https://github.com/ng-bootstrap/ng-bootstrap/pull/4760 --- .../dates-dropdown.component.html | 2 +- .../dates-dropdown.component.ts | 3 +++ .../filterable-dropdown.component.html | 2 +- .../filterable-dropdown.component.ts | 3 +++ src-ui/src/app/utils/popper-options.spec.ts | 24 +++++++++++++++++++ src-ui/src/app/utils/popper-options.ts | 24 +++++++++++++++++++ 6 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 src-ui/src/app/utils/popper-options.spec.ts create mode 100644 src-ui/src/app/utils/popper-options.ts diff --git a/src-ui/src/app/components/common/dates-dropdown/dates-dropdown.component.html b/src-ui/src/app/components/common/dates-dropdown/dates-dropdown.component.html index 8991363d2..b9528805b 100644 --- a/src-ui/src/app/components/common/dates-dropdown/dates-dropdown.component.html +++ b/src-ui/src/app/components/common/dates-dropdown/dates-dropdown.component.html @@ -1,4 +1,4 @@ -
    +
    -
    +
    {{rd.name}}
    @@ -28,20 +28,19 @@
    } -