From 0e1ab7977366f35b661eff24c52ca0d98231a51d Mon Sep 17 00:00:00 2001 From: shamoon <4887959+shamoon@users.noreply.github.com> Date: Fri, 19 Apr 2024 00:57:37 -0700 Subject: [PATCH] Blank out display fields for better backwards compatibility --- .../drag-drop-select.component.html | 6 +-- .../drag-drop-select.component.spec.ts | 3 ++ .../drag-drop-select.component.ts | 5 +- .../saved-view-widget.component.html | 44 +++++++-------- .../saved-view-widget.component.spec.ts | 35 ++++++++++++ .../saved-view-widget.component.ts | 53 ++++++++++++------- .../document-list/document-list.component.ts | 14 ++--- .../1047_savedview_display_mode_and_more.py | 4 +- src/documents/models.py | 3 +- 9 files changed, 110 insertions(+), 57 deletions(-) diff --git a/src-ui/src/app/components/common/input/drag-drop-select/drag-drop-select.component.html b/src-ui/src/app/components/common/input/drag-drop-select/drag-drop-select.component.html index e8da3559c..373e89b1f 100644 --- a/src-ui/src/app/components/common/input/drag-drop-select/drag-drop-select.component.html +++ b/src-ui/src/app/components/common/input/drag-drop-select/drag-drop-select.component.html @@ -1,6 +1,6 @@
- {{title}}: -
{{title}}: +
-
{ { id: '2', name: 'Item 2' }, { id: '3', name: 'Item 3' }, ]) + + component.writeValue(null) + expect(component.selectedItems).toEqual([]) }) it('should update selectedItems when an item is dropped within selectedList', () => { diff --git a/src-ui/src/app/components/common/input/drag-drop-select/drag-drop-select.component.ts b/src-ui/src/app/components/common/input/drag-drop-select/drag-drop-select.component.ts index 43e112b8d..2c86bbb45 100644 --- a/src-ui/src/app/components/common/input/drag-drop-select/drag-drop-select.component.ts +++ b/src-ui/src/app/components/common/input/drag-drop-select/drag-drop-select.component.ts @@ -34,9 +34,8 @@ export class DragDropSelectComponent extends AbstractInputComponent { writeValue(newValue: string[]): void { super.writeValue(newValue) - this.selectedItems = newValue.map((id) => - this.items.find((i) => i.id === id) - ) + this.selectedItems = + newValue?.map((id) => this.items.find((i) => i.id === id)) ?? [] } public drop(event: CdkDragDrop) { diff --git a/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html b/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html index f36024bb0..66c40ec13 100644 --- a/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html +++ b/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.html @@ -9,19 +9,19 @@ Show all } - @if (documents.length && (!savedView.display_mode || savedView.display_mode === DashboardViewMode.TABLE)) { + @if (documents.length && displayMode === DisplayMode.TABLE) { - @for (column of savedView.display_fields; track column; let i = $index) { - @if (activeDisplayFields.includes(column)) { + @for (field of displayFields; track field; let i = $index) { + @if (displayFields.includes(field)) { } } @@ -30,44 +30,44 @@ @for (doc of documents; track doc.id) { - @for (column of savedView.display_fields; track column; let i = $index) { - @if (activeDisplayFields.includes(column)) { + @for (field of displayFields; track field; let i = $index) { + @if (displayFields.includes(field)) {
- {{ getColumnTitle(column) }} + {{ getColumnTitle(field) }}
- @switch (column) { - @case (DashboardViewTableColumn.ADDED) { + @switch (field) { + @case (DisplayField.ADDED) { {{doc.added | customDate}} } - @case (DashboardViewTableColumn.CREATED) { + @case (DisplayField.CREATED) { {{doc.created_date | customDate}} } - @case (DashboardViewTableColumn.TITLE) { + @case (DisplayField.TITLE) { {{doc.title | documentTitle}} } - @case (DashboardViewTableColumn.CORRESPONDENT) { + @case (DisplayField.CORRESPONDENT) { @if (doc.correspondent) { {{(doc.correspondent$ | async)?.name}} } } - @case (DashboardViewTableColumn.TAGS) { + @case (DisplayField.TAGS) { @for (t of doc.tags$ | async; track t) { } } - @case (DashboardViewTableColumn.DOCUMENT_TYPE) { + @case (DisplayField.DOCUMENT_TYPE) { @if (doc.document_type) { {{(doc.document_type$ | async)?.name}} } } - @case (DashboardViewTableColumn.STORAGE_PATH) { + @case (DisplayField.STORAGE_PATH) { @if (doc.storage_path) { {{(doc.storage_path$ | async)?.name}} } } } - @if (column.startsWith(DashboardViewTableColumn.CUSTOM_FIELD)) { - + @if (field.startsWith(DisplayField.CUSTOM_FIELD)) { + } - @if (i === savedView.display_fields.length - 1) { + @if (i === displayFields.length - 1) {
- } @else if (documents.length && savedView.display_mode === DashboardViewMode.SMALL_CARDS) { + } @else if (documents.length && displayMode === DisplayMode.SMALL_CARDS) {
@for (d of documents; track d.id) { }
- } @else if (documents.length && savedView.display_mode === DashboardViewMode.LARGE_CARDS) { + } @else if (documents.length && displayMode === DisplayMode.LARGE_CARDS) {
@for (d of documents; track d.id) { { 'Storage path' ) }) + + it('should hide fields if no perms', () => { + fixture = TestBed.createComponent(SavedViewWidgetComponent) + component = fixture.componentInstance + component.savedView = { + sort_field: 'added', + sort_reverse: true, + show_in_sidebar: true, + show_on_dashboard: true, + filter_rules: [], + display_fields: [DisplayField.TITLE, 'foo' as any, 'bar' as any], + } + component.ngOnInit() + expect(component.displayFields).toEqual([DisplayField.TITLE]) + }) + + it('should use fallback display settings', () => { + fixture = TestBed.createComponent(SavedViewWidgetComponent) + component = fixture.componentInstance + component.savedView = { + sort_field: 'added', + sort_reverse: true, + show_in_sidebar: true, + show_on_dashboard: true, + filter_rules: [], + } + component.ngOnInit() + expect(component.displayMode).toEqual(DisplayMode.TABLE) + expect(component.displayFields).toEqual([ + DisplayField.CREATED, + DisplayField.TITLE, + DisplayField.TAGS, + DisplayField.CORRESPONDENT, + ]) + }) }) diff --git a/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.ts b/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.ts index 200147f1d..90c03f239 100644 --- a/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.ts +++ b/src-ui/src/app/components/dashboard/widgets/saved-view-widget/saved-view-widget.component.ts @@ -46,8 +46,8 @@ export class SavedViewWidgetComponent extends ComponentWithPermissions implements OnInit, OnDestroy { - public DashboardViewMode = DisplayMode - public DashboardViewTableColumn = DisplayField + public DisplayMode = DisplayMode + public DisplayField = DisplayField public CustomFieldDataType = CustomFieldDataType loading: boolean = true @@ -80,14 +80,18 @@ export class SavedViewWidgetComponent mouseOnPreview = false popoverHidden = true - activeDisplayFields: DisplayField[] = [ - DisplayField.TITLE, + displayMode: DisplayMode + + displayFields: DisplayField[] = [ DisplayField.CREATED, - DisplayField.ADDED, + DisplayField.TITLE, + DisplayField.TAGS, + DisplayField.CORRESPONDENT, ] ngOnInit(): void { this.reload() + this.displayMode = this.savedView.display_mode ?? DisplayMode.TABLE this.consumerStatusService .onDocumentConsumptionFinished() .pipe(takeUntil(this.unsubscribeNotifier)) @@ -109,19 +113,32 @@ export class SavedViewWidgetComponent }) } - this.savedView.display_fields?.forEach((column) => { - let type: PermissionType = Object.values(PermissionType).find((t) => - t.includes(column) - ) - if (column.startsWith(DisplayField.CUSTOM_FIELD)) { - type = PermissionType.CustomField - } - if ( - type && - this.permissionsService.currentUserCan(PermissionAction.View, type) - ) - this.activeDisplayFields.push(column) - }) + if (this.savedView.display_fields) { + this.displayFields = this.savedView.display_fields + ?.map((field) => { + if ( + [ + DisplayField.TITLE, + DisplayField.CREATED, + DisplayField.ADDED, + ].includes(field) + ) { + return field + } + + let type: PermissionType = Object.values(PermissionType).find((t) => + t.includes(field) + ) + if (field.startsWith(DisplayField.CUSTOM_FIELD)) { + type = PermissionType.CustomField + } + return type && + this.permissionsService.currentUserCan(PermissionAction.View, type) + ? field + : null + }) + .filter((f) => f) + } } ngOnDestroy(): void { diff --git a/src-ui/src/app/components/document-list/document-list.component.ts b/src-ui/src/app/components/document-list/document-list.component.ts index 8fed37126..9b6aae402 100644 --- a/src-ui/src/app/components/document-list/document-list.component.ts +++ b/src-ui/src/app/components/document-list/document-list.component.ts @@ -102,9 +102,11 @@ export class DocumentListComponent this.unmodifiedSavedView.sort_reverse !== this.list.sortReverse || (this.unmodifiedSavedView.page_size && this.unmodifiedSavedView.page_size !== this.list.pageSize) || - this.unmodifiedSavedView.display_mode !== this.list.displayMode || - this.unmodifiedSavedView.display_fields.join(',') !== - this.activeDisplayFields.join(',') || + (this.unmodifiedSavedView.display_mode && + this.unmodifiedSavedView.display_mode !== this.list.displayMode) || + (this.unmodifiedSavedView.display_fields && + this.unmodifiedSavedView.display_fields.join(',') !== + this.activeDisplayFields.join(',')) || filterRulesDiffer( this.unmodifiedSavedView.filter_rules, this.list.filterRules @@ -190,12 +192,6 @@ export class DocumentListComponent }) return } - if (!view.display_mode) { - view.display_mode = this.list.displayMode - } - if (!view.display_fields) { - view.display_fields = this.list.displayFields - } this.unmodifiedSavedView = view this.list.activateSavedViewWithQueryParams( view, diff --git a/src/documents/migrations/1047_savedview_display_mode_and_more.py b/src/documents/migrations/1047_savedview_display_mode_and_more.py index 85f5d1660..28e13a797 100644 --- a/src/documents/migrations/1047_savedview_display_mode_and_more.py +++ b/src/documents/migrations/1047_savedview_display_mode_and_more.py @@ -42,6 +42,7 @@ class Migration(migrations.Migration): model_name="savedview", name="display_fields", field=multiselectfield.db.fields.MultiSelectField( + blank=True, choices=[ ("title", "Title"), ("created", "Created"), @@ -51,8 +52,9 @@ class Migration(migrations.Migration): ("correspondent", "Correspondent"), ("storagepath", "Storage Path"), ], - default="created,title,tag,correspondent", max_length=128, + null=True, + verbose_name="Document display fields", ), ), ] diff --git a/src/documents/models.py b/src/documents/models.py index 137024576..ede09b94c 100644 --- a/src/documents/models.py +++ b/src/documents/models.py @@ -606,7 +606,8 @@ class SavedView(ModelWithOwner): verbose_name=_("Document display fields"), choices=DisplayFields.choices, dyanmic_choices=[DynamicDisplayFields.CUSTOM_FIELD], - default=f"{DisplayFields.CREATED},{DisplayFields.TITLE},{DisplayFields.TAGS},{DisplayFields.CORRESPONDENT}", + null=True, + blank=True, ) class Meta: