Refactoring

This commit is contained in:
shamoon 2024-04-19 00:07:14 -07:00
parent eb1eab1dfc
commit 9a2d30cb33
29 changed files with 672 additions and 652 deletions

View File

@ -124,7 +124,7 @@
"content": { "content": {
"size": -1, "size": -1,
"mimeType": "application/json", "mimeType": "application/json",
"text": "{\"count\":6,\"next\":null,\"previous\":null,\"all\":[8,17,7,4,11,15],\"results\":[{\"id\":8,\"name\":\"Correspondent 2\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":3,\"value\":\"2\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":17,\"name\":\"In the Last Month\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":20,\"value\":\"created:[-1 month to now]\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":7,\"name\":\"Inbox\",\"show_on_dashboard\":true,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":6,\"value\":\"9\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":4,\"name\":\"Recently Added\",\"show_on_dashboard\":true,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":11,\"name\":\"Tag: Another Sample Tag\",\"show_on_dashboard\":false,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":6,\"value\":\"4\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":15,\"name\":\"View ASN not empty\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":18,\"value\":\"false\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]}]}" "text": "{\"count\":6,\"next\":null,\"previous\":null,\"all\":[8,17,7,4,11,15],\"results\":[{\"id\":8,\"name\":\"Correspondent 2\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":3,\"value\":\"2\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":17,\"name\":\"In the Last Month\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":20,\"value\":\"created:[-1 month to now]\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":7,\"name\":\"Inbox\",\"show_on_dashboard\":true,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":6,\"value\":\"9\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":4,\"name\":\"Recently Added\",\"show_on_dashboard\":true,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":11,\"name\":\"Tag: Another Sample Tag\",\"show_on_dashboard\":false,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":6,\"value\":\"4\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":15,\"name\":\"View ASN not empty\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":18,\"value\":\"false\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]}]}"
}, },
"headersSize": -1, "headersSize": -1,
"bodySize": -1, "bodySize": -1,

View File

@ -124,7 +124,7 @@
"content": { "content": {
"size": -1, "size": -1,
"mimeType": "application/json", "mimeType": "application/json",
"text": "{\"count\":6,\"next\":null,\"previous\":null,\"all\":[8,17,7,4,11,15],\"results\":[{\"id\":8,\"name\":\"Correspondent 2\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":3,\"value\":\"2\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":17,\"name\":\"In the Last Month\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":20,\"value\":\"created:[-1 month to now]\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":7,\"name\":\"Inbox\",\"show_on_dashboard\":true,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":6,\"value\":\"9\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":4,\"name\":\"Recently Added\",\"show_on_dashboard\":true,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":11,\"name\":\"Tag: Another Sample Tag\",\"show_on_dashboard\":false,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":6,\"value\":\"4\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":15,\"name\":\"View ASN not empty\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":18,\"value\":\"false\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]}]}" "text": "{\"count\":6,\"next\":null,\"previous\":null,\"all\":[8,17,7,4,11,15],\"results\":[{\"id\":8,\"name\":\"Correspondent 2\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":3,\"value\":\"2\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":17,\"name\":\"In the Last Month\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":20,\"value\":\"created:[-1 month to now]\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":7,\"name\":\"Inbox\",\"show_on_dashboard\":true,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":6,\"value\":\"9\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":4,\"name\":\"Recently Added\",\"show_on_dashboard\":true,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":11,\"name\":\"Tag: Another Sample Tag\",\"show_on_dashboard\":false,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":6,\"value\":\"4\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":15,\"name\":\"View ASN not empty\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":18,\"value\":\"false\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]}]}"
}, },
"headersSize": -1, "headersSize": -1,
"bodySize": -1, "bodySize": -1,

View File

@ -124,7 +124,7 @@
"content": { "content": {
"size": -1, "size": -1,
"mimeType": "application/json", "mimeType": "application/json",
"text": "{\"count\":6,\"next\":null,\"previous\":null,\"all\":[8,17,7,4,11,15],\"results\":[{\"id\":8,\"name\":\"Correspondent 2\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":3,\"value\":\"2\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":17,\"name\":\"In the Last Month\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":20,\"value\":\"created:[-1 month to now]\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":7,\"name\":\"Inbox\",\"show_on_dashboard\":true,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":6,\"value\":\"9\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":4,\"name\":\"Recently Added\",\"show_on_dashboard\":true,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":11,\"name\":\"Tag: Another Sample Tag\",\"show_on_dashboard\":false,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":6,\"value\":\"4\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":15,\"name\":\"View ASN not empty\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":18,\"value\":\"false\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]}]}" "text": "{\"count\":6,\"next\":null,\"previous\":null,\"all\":[8,17,7,4,11,15],\"results\":[{\"id\":8,\"name\":\"Correspondent 2\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":3,\"value\":\"2\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":17,\"name\":\"In the Last Month\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":20,\"value\":\"created:[-1 month to now]\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":7,\"name\":\"Inbox\",\"show_on_dashboard\":true,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":6,\"value\":\"9\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":4,\"name\":\"Recently Added\",\"show_on_dashboard\":true,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":11,\"name\":\"Tag: Another Sample Tag\",\"show_on_dashboard\":false,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":6,\"value\":\"4\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":15,\"name\":\"View ASN not empty\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":18,\"value\":\"false\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]}]}"
}, },
"headersSize": -1, "headersSize": -1,
"bodySize": -1, "bodySize": -1,

View File

@ -124,7 +124,7 @@
"content": { "content": {
"size": -1, "size": -1,
"mimeType": "application/json", "mimeType": "application/json",
"text": "{\"count\":6,\"next\":null,\"previous\":null,\"all\":[8,17,7,4,11,15],\"results\":[{\"id\":8,\"name\":\"Correspondent 2\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":3,\"value\":\"2\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":17,\"name\":\"In the Last Month\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":20,\"value\":\"created:[-1 month to now]\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":7,\"name\":\"Inbox\",\"show_on_dashboard\":true,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":6,\"value\":\"9\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":4,\"name\":\"Recently Added\",\"show_on_dashboard\":true,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":11,\"name\":\"Tag: Another Sample Tag\",\"show_on_dashboard\":false,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":6,\"value\":\"4\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":15,\"name\":\"View ASN not empty\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":18,\"value\":\"false\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"document_display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]}]}" "text": "{\"count\":6,\"next\":null,\"previous\":null,\"all\":[8,17,7,4,11,15],\"results\":[{\"id\":8,\"name\":\"Correspondent 2\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":3,\"value\":\"2\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":17,\"name\":\"In the Last Month\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":20,\"value\":\"created:[-1 month to now]\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":7,\"name\":\"Inbox\",\"show_on_dashboard\":true,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":6,\"value\":\"9\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":4,\"name\":\"Recently Added\",\"show_on_dashboard\":true,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":11,\"name\":\"Tag: Another Sample Tag\",\"show_on_dashboard\":false,\"show_in_sidebar\":true,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":6,\"value\":\"4\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]},{\"id\":15,\"name\":\"View ASN not empty\",\"show_on_dashboard\":false,\"show_in_sidebar\":false,\"sort_field\":\"created\",\"sort_reverse\":true,\"filter_rules\":[{\"rule_type\":18,\"value\":\"false\"}],\"owner\":\"2\",\"user_can_change\":true,\"page_size\":10,\"display_mode\":\"table\",\"display_fields\":[\"created\",\"title\",\"tag\",\"documenttype\"]}]}"
}, },
"headersSize": -1, "headersSize": -1,
"bodySize": -1, "bodySize": -1,

View File

@ -2365,7 +2365,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">129</context> <context context-type="linenumber">127</context>
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/manage/management-list/management-list.component.html</context> <context context-type="sourcefile">src/app/components/manage/management-list/management-list.component.html</context>
@ -4228,7 +4228,7 @@
</context-group> </context-group>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-card-small/document-card-small.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-card-small/document-card-small.component.ts</context>
<context context-type="linenumber">86</context> <context context-type="linenumber">83</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="2504502765849142619" datatype="html"> <trans-unit id="2504502765849142619" datatype="html">
@ -6340,14 +6340,14 @@
<source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source> <source>View &quot;<x id="PH" equiv-text="this.list.activeSavedViewTitle"/>&quot; saved successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">250</context> <context context-type="linenumber">241</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="6837554170707123455" datatype="html"> <trans-unit id="6837554170707123455" datatype="html">
<source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source> <source>View &quot;<x id="PH" equiv-text="savedView.name"/>&quot; created successfully.</source>
<context-group purpose="location"> <context-group purpose="location">
<context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context> <context context-type="sourcefile">src/app/components/document-list/document-list.component.ts</context>
<context context-type="linenumber">291</context> <context context-type="linenumber">282</context>
</context-group> </context-group>
</trans-unit> </trans-unit>
<trans-unit id="3100631071441658964" datatype="html"> <trans-unit id="3100631071441658964" datatype="html">

View File

@ -363,8 +363,8 @@
<option [ngValue]="DashboardViewMode.LARGE_CARDS" i18n>Large Cards</option> <option [ngValue]="DashboardViewMode.LARGE_CARDS" i18n>Large Cards</option>
</select> </select>
</div> </div>
@if (documentDisplayFields) { @if (displayFields) {
<pngx-input-drag-drop-select i18n-title title="Show" [items]="documentDisplayFields" formControlName="document_display_fields"></pngx-input-drag-drop-select> <pngx-input-drag-drop-select i18n-title title="Show" [items]="displayFields" formControlName="display_fields"></pngx-input-drag-drop-select>
} }
</div> </div>
</div> </div>

View File

@ -27,9 +27,9 @@ import {
} from 'rxjs' } from 'rxjs'
import { Group } from 'src/app/data/group' import { Group } from 'src/app/data/group'
import { import {
DEFAULT_DOCUMENT_DISPLAY_FIELDS, DEFAULT_DISPLAY_FIELDS,
DisplayMode, DisplayMode,
DocumentDisplayField, DisplayField,
SavedView, SavedView,
} from 'src/app/data/saved-view' } from 'src/app/data/saved-view'
import { SETTINGS_KEYS } from 'src/app/data/ui-settings' import { SETTINGS_KEYS } from 'src/app/data/ui-settings'
@ -117,8 +117,8 @@ export class SettingsComponent
savedViews: SavedView[] savedViews: SavedView[]
SettingsNavIDs = SettingsNavIDs SettingsNavIDs = SettingsNavIDs
get documentDisplayFields() { get displayFields() {
return this.settings.allDocumentDisplayFields return this.settings.allDisplayFields
} }
store: BehaviorSubject<any> store: BehaviorSubject<any>
@ -353,7 +353,7 @@ export class SettingsComponent
show_in_sidebar: view.show_in_sidebar, show_in_sidebar: view.show_in_sidebar,
page_size: view.page_size, page_size: view.page_size,
display_mode: view.display_mode, display_mode: view.display_mode,
document_display_fields: view.document_display_fields, display_fields: view.display_fields,
} }
this.savedViewGroup.addControl( this.savedViewGroup.addControl(
view.id.toString(), view.id.toString(),
@ -364,7 +364,7 @@ export class SettingsComponent
show_in_sidebar: new FormControl(null), show_in_sidebar: new FormControl(null),
page_size: new FormControl(null), page_size: new FormControl(null),
display_mode: new FormControl(null), display_mode: new FormControl(null),
document_display_fields: new FormControl([]), display_fields: new FormControl([]),
}) })
) )
} }

View File

@ -6,7 +6,7 @@ import { CustomFieldDisplayComponent } from './custom-field-display.component'
import { Document } from 'src/app/data/document' import { Document } from 'src/app/data/document'
import { HttpClientTestingModule } from '@angular/common/http/testing' import { HttpClientTestingModule } from '@angular/common/http/testing'
import { CustomFieldsService } from 'src/app/services/rest/custom-fields.service' import { CustomFieldsService } from 'src/app/services/rest/custom-fields.service'
import { DocumentDisplayField } from 'src/app/data/saved-view' import { DisplayField } from 'src/app/data/saved-view'
const customFields: CustomField[] = [ const customFields: CustomField[] = [
{ id: 1, name: 'Field 1', data_type: CustomFieldDataType.String }, { id: 1, name: 'Field 1', data_type: CustomFieldDataType.String },
@ -57,7 +57,7 @@ describe('CustomFieldDisplayComponent', () => {
.spyOn(documentService, 'getFew') .spyOn(documentService, 'getFew')
.mockReturnValue(of({ results: [] } as any)) .mockReturnValue(of({ results: [] } as any))
component.fieldDisplayKey = DocumentDisplayField.CUSTOM_FIELD + '2' component.fieldDisplayKey = DisplayField.CUSTOM_FIELD + '2'
expect(component.fieldId).toEqual(2) expect(component.fieldId).toEqual(2)
component.document = document component.document = document
expect(component.document.title).toEqual('Doc 1') expect(component.document.title).toEqual('Doc 1')

View File

@ -3,7 +3,7 @@ import { Subject, takeUntil } from 'rxjs'
import { CustomField, CustomFieldDataType } from 'src/app/data/custom-field' import { CustomField, CustomFieldDataType } from 'src/app/data/custom-field'
import { Document } from 'src/app/data/document' import { Document } from 'src/app/data/document'
import { Results } from 'src/app/data/results' import { Results } from 'src/app/data/results'
import { DocumentDisplayField } from 'src/app/data/saved-view' import { DisplayField } from 'src/app/data/saved-view'
import { CustomFieldsService } from 'src/app/services/rest/custom-fields.service' import { CustomFieldsService } from 'src/app/services/rest/custom-fields.service'
import { DocumentService } from 'src/app/services/rest/document.service' import { DocumentService } from 'src/app/services/rest/document.service'
@ -39,10 +39,7 @@ export class CustomFieldDisplayComponent implements OnInit, OnDestroy {
@Input() @Input()
set fieldDisplayKey(key: string) { set fieldDisplayKey(key: string) {
this.fieldId = parseInt( this.fieldId = parseInt(key.replace(DisplayField.CUSTOM_FIELD, ''), 10)
key.replace(DocumentDisplayField.CUSTOM_FIELD, ''),
10
)
} }
value: any value: any

View File

@ -13,7 +13,7 @@
<table content class="table table-hover mb-0 mt-n2 align-middle"> <table content class="table table-hover mb-0 mt-n2 align-middle">
<thead> <thead>
<tr> <tr>
@for (column of savedView.document_display_fields; track column; let i = $index) { @for (column of savedView.display_fields; track column; let i = $index) {
@if (activeDisplayFields.includes(column)) { @if (activeDisplayFields.includes(column)) {
<th <th
scope="col" scope="col"
@ -30,7 +30,7 @@
<tbody> <tbody>
@for (doc of documents; track doc.id) { @for (doc of documents; track doc.id) {
<tr> <tr>
@for (column of savedView.document_display_fields; track column; let i = $index) { @for (column of savedView.display_fields; track column; let i = $index) {
@if (activeDisplayFields.includes(column)) { @if (activeDisplayFields.includes(column)) {
<td class="py-2 py-md-3 position-relative" [ngClass]="{ 'd-none d-md-table-cell': i > 1 }"> <td class="py-2 py-md-3 position-relative" [ngClass]="{ 'd-none d-md-table-cell': i > 1 }">
@switch (column) { @switch (column) {
@ -67,7 +67,7 @@
@if (column.startsWith(DashboardViewTableColumn.CUSTOM_FIELD)) { @if (column.startsWith(DashboardViewTableColumn.CUSTOM_FIELD)) {
<pngx-custom-field-display [document]="doc" [fieldDisplayKey]="column"></pngx-custom-field-display> <pngx-custom-field-display [document]="doc" [fieldDisplayKey]="column"></pngx-custom-field-display>
} }
@if (i === savedView.document_display_fields.length - 1) { @if (i === savedView.display_fields.length - 1) {
<div class="btn-group position-absolute top-50 end-0 translate-middle-y"> <div class="btn-group position-absolute top-50 end-0 translate-middle-y">
<a [href]="getPreviewUrl(doc)" title="View Preview" i18n-title target="_blank" class="btn px-4 btn-dark border-dark-subtle" <a [href]="getPreviewUrl(doc)" title="View Preview" i18n-title target="_blank" class="btn px-4 btn-dark border-dark-subtle"
[ngbPopover]="previewContent" [popoverTitle]="doc.title | documentTitle" [ngbPopover]="previewContent" [popoverTitle]="doc.title | documentTitle"

View File

@ -18,11 +18,7 @@ import {
FILTER_HAS_TAGS_ALL, FILTER_HAS_TAGS_ALL,
FILTER_STORAGE_PATH, FILTER_STORAGE_PATH,
} from 'src/app/data/filter-rule-type' } from 'src/app/data/filter-rule-type'
import { import { DisplayMode, DisplayField, SavedView } from 'src/app/data/saved-view'
DisplayMode,
DocumentDisplayField,
SavedView,
} from 'src/app/data/saved-view'
import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive' import { IfPermissionsDirective } from 'src/app/directives/if-permissions.directive'
import { PermissionsGuard } from 'src/app/guards/permissions.guard' import { PermissionsGuard } from 'src/app/guards/permissions.guard'
import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe' import { CustomDatePipe } from 'src/app/pipes/custom-date.pipe'
@ -60,15 +56,15 @@ const savedView: SavedView = {
], ],
page_size: 20, page_size: 20,
display_mode: DisplayMode.TABLE, display_mode: DisplayMode.TABLE,
document_display_fields: [ display_fields: [
DocumentDisplayField.CREATED, DisplayField.CREATED,
DocumentDisplayField.TITLE, DisplayField.TITLE,
DocumentDisplayField.TAGS, DisplayField.TAGS,
DocumentDisplayField.CORRESPONDENT, DisplayField.CORRESPONDENT,
DocumentDisplayField.DOCUMENT_TYPE, DisplayField.DOCUMENT_TYPE,
DocumentDisplayField.STORAGE_PATH, DisplayField.STORAGE_PATH,
`${DocumentDisplayField.CUSTOM_FIELD}11` as any, `${DisplayField.CUSTOM_FIELD}11` as any,
`${DocumentDisplayField.CUSTOM_FIELD}15` as any, `${DisplayField.CUSTOM_FIELD}15` as any,
], ],
} }
@ -332,23 +328,17 @@ describe('SavedViewWidgetComponent', () => {
}) })
it('should get correct column title', () => { it('should get correct column title', () => {
expect(component.getColumnTitle(DocumentDisplayField.TITLE)).toEqual( expect(component.getColumnTitle(DisplayField.TITLE)).toEqual('Title')
'Title' expect(component.getColumnTitle(DisplayField.CREATED)).toEqual('Created')
expect(component.getColumnTitle(DisplayField.ADDED)).toEqual('Added')
expect(component.getColumnTitle(DisplayField.TAGS)).toEqual('Tags')
expect(component.getColumnTitle(DisplayField.CORRESPONDENT)).toEqual(
'Correspondent'
) )
expect(component.getColumnTitle(DocumentDisplayField.CREATED)).toEqual( expect(component.getColumnTitle(DisplayField.DOCUMENT_TYPE)).toEqual(
'Created' 'Document type'
) )
expect(component.getColumnTitle(DocumentDisplayField.ADDED)).toEqual( expect(component.getColumnTitle(DisplayField.STORAGE_PATH)).toEqual(
'Added'
)
expect(component.getColumnTitle(DocumentDisplayField.TAGS)).toEqual('Tags')
expect(
component.getColumnTitle(DocumentDisplayField.CORRESPONDENT)
).toEqual('Correspondent')
expect(
component.getColumnTitle(DocumentDisplayField.DOCUMENT_TYPE)
).toEqual('Document type')
expect(component.getColumnTitle(DocumentDisplayField.STORAGE_PATH)).toEqual(
'Storage path' 'Storage path'
) )
}) })

View File

@ -10,11 +10,11 @@ import { Router } from '@angular/router'
import { Subject, takeUntil } from 'rxjs' import { Subject, takeUntil } from 'rxjs'
import { Document } from 'src/app/data/document' import { Document } from 'src/app/data/document'
import { import {
DocumentDisplayField, DisplayField,
DisplayMode, DisplayMode,
SavedView, SavedView,
DEFAULT_DOCUMENT_DISPLAY_FIELDS, DEFAULT_DISPLAY_FIELDS,
DEFAULT_PAGE_SIZE, DEFAULT_DASHBOARD_VIEW_PAGE_SIZE,
} from 'src/app/data/saved-view' } from 'src/app/data/saved-view'
import { ConsumerStatusService } from 'src/app/services/consumer-status.service' import { ConsumerStatusService } from 'src/app/services/consumer-status.service'
import { DocumentService } from 'src/app/services/rest/document.service' import { DocumentService } from 'src/app/services/rest/document.service'
@ -47,7 +47,7 @@ export class SavedViewWidgetComponent
implements OnInit, OnDestroy implements OnInit, OnDestroy
{ {
public DashboardViewMode = DisplayMode public DashboardViewMode = DisplayMode
public DashboardViewTableColumn = DocumentDisplayField public DashboardViewTableColumn = DisplayField
public CustomFieldDataType = CustomFieldDataType public CustomFieldDataType = CustomFieldDataType
loading: boolean = true loading: boolean = true
@ -80,10 +80,10 @@ export class SavedViewWidgetComponent
mouseOnPreview = false mouseOnPreview = false
popoverHidden = true popoverHidden = true
activeDisplayFields: DocumentDisplayField[] = [ activeDisplayFields: DisplayField[] = [
DocumentDisplayField.TITLE, DisplayField.TITLE,
DocumentDisplayField.CREATED, DisplayField.CREATED,
DocumentDisplayField.ADDED, DisplayField.ADDED,
] ]
ngOnInit(): void { ngOnInit(): void {
@ -109,11 +109,11 @@ export class SavedViewWidgetComponent
}) })
} }
this.savedView.document_display_fields?.forEach((column) => { this.savedView.display_fields?.forEach((column) => {
let type: PermissionType = Object.values(PermissionType).find((t) => let type: PermissionType = Object.values(PermissionType).find((t) =>
t.includes(column) t.includes(column)
) )
if (column.startsWith(DocumentDisplayField.CUSTOM_FIELD)) { if (column.startsWith(DisplayField.CUSTOM_FIELD)) {
type = PermissionType.CustomField type = PermissionType.CustomField
} }
if ( if (
@ -134,7 +134,7 @@ export class SavedViewWidgetComponent
this.documentService this.documentService
.listFiltered( .listFiltered(
1, 1,
this.savedView.page_size ?? DEFAULT_PAGE_SIZE, this.savedView.page_size ?? DEFAULT_DASHBOARD_VIEW_PAGE_SIZE,
this.savedView.sort_field, this.savedView.sort_field,
this.savedView.sort_reverse, this.savedView.sort_reverse,
this.savedView.filter_rules, this.savedView.filter_rules,
@ -252,11 +252,11 @@ export class SavedViewWidgetComponent
}, 300) }, 300)
} }
public getColumnTitle(column: DocumentDisplayField): string { public getColumnTitle(column: DisplayField): string {
if (column.startsWith(DocumentDisplayField.CUSTOM_FIELD)) { if (column.startsWith(DisplayField.CUSTOM_FIELD)) {
const id = column.split('_')[2] const id = column.split('_')[2]
return this.customFields.find((c) => c.id === parseInt(id))?.name return this.customFields.find((c) => c.id === parseInt(id))?.name
} }
return DEFAULT_DOCUMENT_DISPLAY_FIELDS.find((c) => c.id === column)?.name return DEFAULT_DISPLAY_FIELDS.find((c) => c.id === column)?.name
} }
} }

View File

@ -15,7 +15,7 @@
<div class="card-body"> <div class="card-body">
<div class="d-flex justify-content-between align-items-center"> <div class="d-flex justify-content-between align-items-center">
<h5 class="card-title"> <h5 class="card-title">
@if (displayFields.includes(DocumentDisplayField.CORRESPONDENT) && document.correspondent) { @if (displayFields.includes(DisplayField.CORRESPONDENT) && document.correspondent) {
@if (clickCorrespondent.observers.length ) { @if (clickCorrespondent.observers.length ) {
<a title="Filter by correspondent" i18n-title (click)="clickCorrespondent.emit(document.correspondent);$event.stopPropagation()" class="fw-bold btn-link">{{(document.correspondent$ | async)?.name}}</a> <a title="Filter by correspondent" i18n-title (click)="clickCorrespondent.emit(document.correspondent);$event.stopPropagation()" class="fw-bold btn-link">{{(document.correspondent$ | async)?.name}}</a>
} @else { } @else {
@ -23,10 +23,10 @@
} }
: :
} }
@if (displayFields.includes(DocumentDisplayField.TITLE)) { @if (displayFields.includes(DisplayField.TITLE)) {
{{document.title | documentTitle}} {{document.title | documentTitle}}
} }
@if (displayFields.includes(DocumentDisplayField.TAGS)) { @if (displayFields.includes(DisplayField.TAGS)) {
@for (t of document.tags$ | async; track t) { @for (t of document.tags$ | async; track t) {
<pngx-tag [tag]="t" linkTitle="Filter by tag" i18n-linkTitle class="ms-1" (click)="clickTag.emit(t.id);$event.stopPropagation()" [clickable]="clickTag.observers.length"></pngx-tag> <pngx-tag [tag]="t" linkTitle="Filter by tag" i18n-linkTitle class="ms-1" (click)="clickTag.emit(t.id);$event.stopPropagation()" [clickable]="clickTag.observers.length"></pngx-tag>
} }
@ -70,29 +70,29 @@
</div> </div>
<div class="list-group list-group-horizontal border-0 card-info ms-md-auto mt-2 mt-md-0"> <div class="list-group list-group-horizontal border-0 card-info ms-md-auto mt-2 mt-md-0">
@if (displayFields.includes(DocumentDisplayField.NOTES) && notesEnabled && document.notes.length) { @if (displayFields.includes(DisplayField.NOTES) && notesEnabled && document.notes.length) {
<button routerLink="/documents/{{document.id}}/notes" class="list-group-item btn btn-sm bg-light text-dark p-1 border-0 me-2 d-flex align-items-center" title="View notes" i18n-title> <button routerLink="/documents/{{document.id}}/notes" class="list-group-item btn btn-sm bg-light text-dark p-1 border-0 me-2 d-flex align-items-center" title="View notes" i18n-title>
<i-bs width=".9em" height=".9em" class="me-2 text-muted" name="chat-left-text"></i-bs><small i18n>{{document.notes.length}} Notes</small> <i-bs width=".9em" height=".9em" class="me-2 text-muted" name="chat-left-text"></i-bs><small i18n>{{document.notes.length}} Notes</small>
</button> </button>
} }
@if (displayFields.includes(DocumentDisplayField.DOCUMENT_TYPE) && document.document_type) { @if (displayFields.includes(DisplayField.DOCUMENT_TYPE) && document.document_type) {
<button type="button" class="list-group-item btn btn-sm bg-light text-dark p-1 border-0 me-2 d-flex align-items-center" title="Filter by document type" i18n-title <button type="button" class="list-group-item btn btn-sm bg-light text-dark p-1 border-0 me-2 d-flex align-items-center" title="Filter by document type" i18n-title
(click)="clickDocumentType.emit(document.document_type);$event.stopPropagation()"> (click)="clickDocumentType.emit(document.document_type);$event.stopPropagation()">
<i-bs width=".9em" height=".9em" class="me-2 text-muted" name="file-earmark"></i-bs><small>{{(document.document_type$ | async)?.name}}</small> <i-bs width=".9em" height=".9em" class="me-2 text-muted" name="file-earmark"></i-bs><small>{{(document.document_type$ | async)?.name}}</small>
</button> </button>
} }
@if (displayFields.includes(DocumentDisplayField.STORAGE_PATH) && document.storage_path) { @if (displayFields.includes(DisplayField.STORAGE_PATH) && document.storage_path) {
<button type="button" class="list-group-item btn btn-sm bg-light text-dark p-1 border-0 me-2 d-flex align-items-center" title="Filter by storage path" i18n-title <button type="button" class="list-group-item btn btn-sm bg-light text-dark p-1 border-0 me-2 d-flex align-items-center" title="Filter by storage path" i18n-title
(click)="clickStoragePath.emit(document.storage_path);$event.stopPropagation()"> (click)="clickStoragePath.emit(document.storage_path);$event.stopPropagation()">
<i-bs width=".9em" height=".9em" class="me-2 text-muted" name="archive"></i-bs><small>{{(document.storage_path$ | async)?.name}}</small> <i-bs width=".9em" height=".9em" class="me-2 text-muted" name="archive"></i-bs><small>{{(document.storage_path$ | async)?.name}}</small>
</button> </button>
} }
@if (displayFields.includes(DocumentDisplayField.ASN) && document.archive_serial_number | isNumber) { @if (displayFields.includes(DisplayField.ASN) && document.archive_serial_number | isNumber) {
<div class="list-group-item me-2 bg-light text-dark p-1 border-0 d-flex align-items-center"> <div class="list-group-item me-2 bg-light text-dark p-1 border-0 d-flex align-items-center">
<i-bs width=".9em" height=".9em" class="me-2 text-muted" name="upc-scan"></i-bs><small>#{{document.archive_serial_number}}</small> <i-bs width=".9em" height=".9em" class="me-2 text-muted" name="upc-scan"></i-bs><small>#{{document.archive_serial_number}}</small>
</div> </div>
} }
@if (displayFields.includes(DocumentDisplayField.CREATED) || displayFields.includes(DocumentDisplayField.ADDED)) { @if (displayFields.includes(DisplayField.CREATED) || displayFields.includes(DisplayField.ADDED)) {
<ng-template #dateTooltip> <ng-template #dateTooltip>
<div class="d-flex flex-column text-light"> <div class="d-flex flex-column text-light">
<span i18n>Created: {{ document.created | customDate }}</span> <span i18n>Created: {{ document.created | customDate }}</span>
@ -100,23 +100,23 @@
<span i18n>Modified: {{ document.modified | customDate }}</span> <span i18n>Modified: {{ document.modified | customDate }}</span>
</div> </div>
</ng-template> </ng-template>
@if (displayFields.includes(DocumentDisplayField.CREATED)) { @if (displayFields.includes(DisplayField.CREATED)) {
<div class="list-group-item bg-light text-dark p-1 border-0 d-flex align-items-center" [ngbTooltip]="dateTooltip"> <div class="list-group-item bg-light text-dark p-1 border-0 d-flex align-items-center" [ngbTooltip]="dateTooltip">
<i-bs width=".9em" height=".9em" class="me-2 text-muted" name="calendar-event"></i-bs><small>{{document.created_date | customDate:'mediumDate'}}</small> <i-bs width=".9em" height=".9em" class="me-2 text-muted" name="calendar-event"></i-bs><small>{{document.created_date | customDate:'mediumDate'}}</small>
</div> </div>
} }
@if (displayFields.includes(DocumentDisplayField.ADDED)) { @if (displayFields.includes(DisplayField.ADDED)) {
<div class="list-group-item bg-light text-dark p-1 border-0 d-flex align-items-center" [ngbTooltip]="dateTooltip"> <div class="list-group-item bg-light text-dark p-1 border-0 d-flex align-items-center" [ngbTooltip]="dateTooltip">
<i-bs width=".9em" height=".9em" class="me-2 text-muted" name="calendar-event"></i-bs><small>{{document.added | customDate:'mediumDate'}}</small> <i-bs width=".9em" height=".9em" class="me-2 text-muted" name="calendar-event"></i-bs><small>{{document.added | customDate:'mediumDate'}}</small>
</div> </div>
} }
} }
@if (displayFields.includes(DocumentDisplayField.OWNER) && document.owner && document.owner !== settingsService.currentUser.id) { @if (displayFields.includes(DisplayField.OWNER) && document.owner && document.owner !== settingsService.currentUser.id) {
<div class="list-group-item bg-light text-dark p-1 border-0 d-flex align-items-center"> <div class="list-group-item bg-light text-dark p-1 border-0 d-flex align-items-center">
<i-bs width=".9em" height=".9em" class="me-2 text-muted" name="person-fill-lock"></i-bs><small>{{document.owner | username}}</small> <i-bs width=".9em" height=".9em" class="me-2 text-muted" name="person-fill-lock"></i-bs><small>{{document.owner | username}}</small>
</div> </div>
} }
@if (displayFields.includes(DocumentDisplayField.SHARED) && document.is_shared_by_requester) { @if (displayFields.includes(DisplayField.SHARED) && document.is_shared_by_requester) {
<div class="list-group-item bg-light text-dark p-1 border-0 d-flex align-items-center"> <div class="list-group-item bg-light text-dark p-1 border-0 d-flex align-items-center">
<i-bs width=".9em" height=".9em" class="me-2 text-muted" name="people-fill"></i-bs><small i18n>Shared</small> <i-bs width=".9em" height=".9em" class="me-2 text-muted" name="people-fill"></i-bs><small i18n>Shared</small>
</div> </div>
@ -128,7 +128,7 @@
</div> </div>
} }
@for (field of document.custom_fields; track field.id) { @for (field of document.custom_fields; track field.id) {
@if (displayFields.includes(DocumentDisplayField.CUSTOM_FIELD + field.field)) { @if (displayFields.includes(DisplayField.CUSTOM_FIELD + field.field)) {
<div class="list-group-item bg-light text-dark p-1 border-0 d-flex align-items-center"> <div class="list-group-item bg-light text-dark p-1 border-0 d-flex align-items-center">
<i-bs width=".9em" height=".9em" class="me-2 text-muted" name="ui-radios"></i-bs> <i-bs width=".9em" height=".9em" class="me-2 text-muted" name="ui-radios"></i-bs>
<small> <small>

View File

@ -11,10 +11,7 @@ import { SettingsService } from 'src/app/services/settings.service'
import { NgbPopover } from '@ng-bootstrap/ng-bootstrap' import { NgbPopover } from '@ng-bootstrap/ng-bootstrap'
import { SETTINGS_KEYS } from 'src/app/data/ui-settings' import { SETTINGS_KEYS } from 'src/app/data/ui-settings'
import { ComponentWithPermissions } from '../../with-permissions/with-permissions.component' import { ComponentWithPermissions } from '../../with-permissions/with-permissions.component'
import { import { DEFAULT_DISPLAY_FIELDS, DisplayField } from 'src/app/data/saved-view'
DEFAULT_DOCUMENT_DISPLAY_FIELDS,
DocumentDisplayField,
} from 'src/app/data/saved-view'
@Component({ @Component({
selector: 'pngx-document-card-large', selector: 'pngx-document-card-large',
@ -22,7 +19,7 @@ import {
styleUrls: ['./document-card-large.component.scss'], styleUrls: ['./document-card-large.component.scss'],
}) })
export class DocumentCardLargeComponent extends ComponentWithPermissions { export class DocumentCardLargeComponent extends ComponentWithPermissions {
DocumentDisplayField = DocumentDisplayField DisplayField = DisplayField
constructor( constructor(
private documentService: DocumentService, private documentService: DocumentService,
@ -35,7 +32,7 @@ export class DocumentCardLargeComponent extends ComponentWithPermissions {
selected = false selected = false
@Input() @Input()
displayFields: string[] = DEFAULT_DOCUMENT_DISPLAY_FIELDS.map((f) => f.id) displayFields: string[] = DEFAULT_DISPLAY_FIELDS.map((f) => f.id)
@Output() @Output()
toggleSelected = new EventEmitter() toggleSelected = new EventEmitter()

View File

@ -10,7 +10,7 @@
</div> </div>
</div> </div>
@if (displayFields?.includes(DocumentDisplayField.TAGS)) { @if (displayFields?.includes(DisplayField.TAGS)) {
<div class="tags d-flex flex-column text-end position-absolute me-1 fs-6"> <div class="tags d-flex flex-column text-end position-absolute me-1 fs-6">
@for (t of getTagsLimited$() | async; track t) { @for (t of getTagsLimited$() | async; track t) {
<pngx-tag [tag]="t" (click)="clickTag.emit(t.id);$event.stopPropagation()" [clickable]="true" linkTitle="Toggle tag filter" i18n-linkTitle></pngx-tag> <pngx-tag [tag]="t" (click)="clickTag.emit(t.id);$event.stopPropagation()" [clickable]="true" linkTitle="Toggle tag filter" i18n-linkTitle></pngx-tag>
@ -24,7 +24,7 @@
} }
</div> </div>
@if (displayFields.includes(DocumentDisplayField.NOTES) && notesEnabled && document.notes.length) { @if (displayFields.includes(DisplayField.NOTES) && notesEnabled && document.notes.length) {
<a routerLink="/documents/{{document.id}}/notes" class="document-card-notes py-2 px-1"> <a routerLink="/documents/{{document.id}}/notes" class="document-card-notes py-2 px-1">
<span class="badge rounded-pill bg-light border text-primary"> <span class="badge rounded-pill bg-light border text-primary">
<i-bs width="1.2em" height="1.2em" class="ms-1 me-1" name="chat-left-text"></i-bs> <i-bs width="1.2em" height="1.2em" class="ms-1 me-1" name="chat-left-text"></i-bs>
@ -34,31 +34,31 @@
<div class="card-body bg-light p-2"> <div class="card-body bg-light p-2">
<p class="card-text"> <p class="card-text">
@if (displayFields.includes(DocumentDisplayField.CORRESPONDENT) && document.correspondent) { @if (displayFields.includes(DisplayField.CORRESPONDENT) && document.correspondent) {
<a title="Toggle correspondent filter" i18n-title (click)="clickCorrespondent.emit(document.correspondent);$event.stopPropagation()" class="fw-bold btn-link">{{(document.correspondent$ | async)?.name ?? privateName}}</a>: <a title="Toggle correspondent filter" i18n-title (click)="clickCorrespondent.emit(document.correspondent);$event.stopPropagation()" class="fw-bold btn-link">{{(document.correspondent$ | async)?.name ?? privateName}}</a>:
} }
@if (displayFields.includes(DocumentDisplayField.TITLE)) { @if (displayFields.includes(DisplayField.TITLE)) {
{{document.title | documentTitle}} {{document.title | documentTitle}}
} }
</p> </p>
</div> </div>
<div class="card-footer pt-0 pb-2 px-2"> <div class="card-footer pt-0 pb-2 px-2">
<div class="list-group list-group-flush border-0 pt-1 pb-2 card-info"> <div class="list-group list-group-flush border-0 pt-1 pb-2 card-info">
@if (displayFields.includes(DocumentDisplayField.DOCUMENT_TYPE) && document.document_type) { @if (displayFields.includes(DisplayField.DOCUMENT_TYPE) && document.document_type) {
<button type="button" class="list-group-item list-group-item-action bg-transparent ps-0 p-1 border-0" title="Toggle document type filter" i18n-title <button type="button" class="list-group-item list-group-item-action bg-transparent ps-0 p-1 border-0" title="Toggle document type filter" i18n-title
(click)="clickDocumentType.emit(document.document_type);$event.stopPropagation()"> (click)="clickDocumentType.emit(document.document_type);$event.stopPropagation()">
<i-bs width="1em" height="1em" class="me-2 text-muted" name="file-earmark"></i-bs> <i-bs width="1em" height="1em" class="me-2 text-muted" name="file-earmark"></i-bs>
<small>{{(document.document_type$ | async)?.name ?? privateName}}</small> <small>{{(document.document_type$ | async)?.name ?? privateName}}</small>
</button> </button>
} }
@if (displayFields.includes(DocumentDisplayField.STORAGE_PATH) && document.storage_path) { @if (displayFields.includes(DisplayField.STORAGE_PATH) && document.storage_path) {
<button type="button" class="list-group-item list-group-item-action bg-transparent ps-0 p-1 border-0" title="Toggle storage path filter" i18n-title <button type="button" class="list-group-item list-group-item-action bg-transparent ps-0 p-1 border-0" title="Toggle storage path filter" i18n-title
(click)="clickStoragePath.emit(document.storage_path);$event.stopPropagation()"> (click)="clickStoragePath.emit(document.storage_path);$event.stopPropagation()">
<i-bs width="1em" height="1em" class="me-2 text-muted" name="folder"></i-bs> <i-bs width="1em" height="1em" class="me-2 text-muted" name="folder"></i-bs>
<small>{{(document.storage_path$ | async)?.name ?? privateName}}</small> <small>{{(document.storage_path$ | async)?.name ?? privateName}}</small>
</button> </button>
} }
@if (displayFields.includes(DocumentDisplayField.CREATED) || displayFields.includes(DocumentDisplayField.ADDED)) { @if (displayFields.includes(DisplayField.CREATED) || displayFields.includes(DisplayField.ADDED)) {
<div class="list-group-item bg-transparent p-0 border-0 d-flex flex-wrap-reverse justify-content-between"> <div class="list-group-item bg-transparent p-0 border-0 d-flex flex-wrap-reverse justify-content-between">
<ng-template #dateTooltip> <ng-template #dateTooltip>
<div class="d-flex flex-column text-light"> <div class="d-flex flex-column text-light">
@ -70,32 +70,32 @@
<div class="ps-0 p-1" placement="top" [ngbTooltip]="dateTooltip"> <div class="ps-0 p-1" placement="top" [ngbTooltip]="dateTooltip">
<i-bs width="1em" height="1em" class="me-2 text-muted" name="calendar-event"></i-bs> <i-bs width="1em" height="1em" class="me-2 text-muted" name="calendar-event"></i-bs>
<small> <small>
@if (displayFields.includes(DocumentDisplayField.CREATED)) { {{document.created | customDate:'mediumDate'}} } @if (displayFields.includes(DisplayField.CREATED)) { {{document.created | customDate:'mediumDate'}} }
@else { {{document.added | customDate:'mediumDate'}} } @else { {{document.added | customDate:'mediumDate'}} }
</small> </small>
</div> </div>
</div> </div>
} }
@if (displayFields.includes(DocumentDisplayField.ASN) && document.archive_serial_number | isNumber) { @if (displayFields.includes(DisplayField.ASN) && document.archive_serial_number | isNumber) {
<div class="ps-0 p-1"> <div class="ps-0 p-1">
<i-bs width="1em" height="1em" class="me-2 text-muted" name="upc-scan"></i-bs> <i-bs width="1em" height="1em" class="me-2 text-muted" name="upc-scan"></i-bs>
<small>#{{document.archive_serial_number}}</small> <small>#{{document.archive_serial_number}}</small>
</div> </div>
} }
@if (displayFields.includes(DocumentDisplayField.OWNER) && document.owner && document.owner !== settingsService.currentUser.id) { @if (displayFields.includes(DisplayField.OWNER) && document.owner && document.owner !== settingsService.currentUser.id) {
<div class="ps-0 p-1"> <div class="ps-0 p-1">
<i-bs width="1em" height="1em" class="me-2 text-muted" name="person-fill-lock"></i-bs> <i-bs width="1em" height="1em" class="me-2 text-muted" name="person-fill-lock"></i-bs>
<small>{{document.owner | username}}</small> <small>{{document.owner | username}}</small>
</div> </div>
} }
@if (displayFields.includes(DocumentDisplayField.SHARED) && document.is_shared_by_requester) { @if (displayFields.includes(DisplayField.SHARED) && document.is_shared_by_requester) {
<div class="ps-0 p-1"> <div class="ps-0 p-1">
<i-bs width="1em" height="1em" class="me-2 text-muted" name="people-fill"></i-bs> <i-bs width="1em" height="1em" class="me-2 text-muted" name="people-fill"></i-bs>
<small i18n>Shared</small> <small i18n>Shared</small>
</div> </div>
} }
@for (field of document.custom_fields; track field.id) { @for (field of document.custom_fields; track field.id) {
@if (displayFields.includes(DocumentDisplayField.CUSTOM_FIELD + field.field)) { @if (displayFields.includes(DisplayField.CUSTOM_FIELD + field.field)) {
<div class="ps-0 p-1"> <div class="ps-0 p-1">
<i-bs width="1em" height="1em" class="me-2 text-muted" name="ui-radios"></i-bs> <i-bs width="1em" height="1em" class="me-2 text-muted" name="ui-radios"></i-bs>
<pngx-custom-field-display [document]="document" [fieldId]="field.field"></pngx-custom-field-display> <pngx-custom-field-display [document]="document" [fieldId]="field.field"></pngx-custom-field-display>

View File

@ -12,10 +12,7 @@ import { SettingsService } from 'src/app/services/settings.service'
import { NgbPopover } from '@ng-bootstrap/ng-bootstrap' import { NgbPopover } from '@ng-bootstrap/ng-bootstrap'
import { SETTINGS_KEYS } from 'src/app/data/ui-settings' import { SETTINGS_KEYS } from 'src/app/data/ui-settings'
import { ComponentWithPermissions } from '../../with-permissions/with-permissions.component' import { ComponentWithPermissions } from '../../with-permissions/with-permissions.component'
import { import { DEFAULT_DISPLAY_FIELDS, DisplayField } from 'src/app/data/saved-view'
DEFAULT_DOCUMENT_DISPLAY_FIELDS,
DocumentDisplayField,
} from 'src/app/data/saved-view'
@Component({ @Component({
selector: 'pngx-document-card-small', selector: 'pngx-document-card-small',
@ -23,7 +20,7 @@ import {
styleUrls: ['./document-card-small.component.scss'], styleUrls: ['./document-card-small.component.scss'],
}) })
export class DocumentCardSmallComponent extends ComponentWithPermissions { export class DocumentCardSmallComponent extends ComponentWithPermissions {
DocumentDisplayField = DocumentDisplayField DisplayField = DisplayField
constructor( constructor(
private documentService: DocumentService, private documentService: DocumentService,
@ -42,7 +39,7 @@ export class DocumentCardSmallComponent extends ComponentWithPermissions {
document: Document document: Document
@Input() @Input()
displayFields: string[] = DEFAULT_DOCUMENT_DISPLAY_FIELDS.map((f) => f.id) displayFields: string[] = DEFAULT_DISPLAY_FIELDS.map((f) => f.id)
@Output() @Output()
dblClickDocument = new EventEmitter() dblClickDocument = new EventEmitter()

View File

@ -18,7 +18,7 @@
</button> </button>
<div ngbDropdownMenu aria-labelledby="dropdownDisplayFields" class="shadow"> <div ngbDropdownMenu aria-labelledby="dropdownDisplayFields" class="shadow">
<div class="px-3"> <div class="px-3">
@for (field of settingsService.allDocumentDisplayFields; track field.id) { @for (field of settingsService.allDisplayFields; track field.id) {
<div class="form-check small"> <div class="form-check small">
<input type="checkbox" class="form-check-input" id="displayField{{field.id}}" [checked]="activeDisplayFields.includes(field.id)" (change)="toggleDisplayField(field.id)"> <input type="checkbox" class="form-check-input" id="displayField{{field.id}}" [checked]="activeDisplayFields.includes(field.id)" (change)="toggleDisplayField(field.id)">
<label class="form-check-label small" for="displayField{{field.id}}">{{field.name}}</label> <label class="form-check-label small" for="displayField{{field.id}}">{{field.name}}</label>
@ -160,7 +160,7 @@
<table class="table table-sm align-middle border shadow-sm"> <table class="table table-sm align-middle border shadow-sm">
<thead> <thead>
<th></th> <th></th>
@if (activeDisplayFields.includes(DocumentDisplayField.ASN)) { @if (activeDisplayFields.includes(DisplayField.ASN)) {
<th class="d-none d-lg-table-cell" <th class="d-none d-lg-table-cell"
pngxSortable="archive_serial_number" pngxSortable="archive_serial_number"
title="Sort by ASN" i18n-title title="Sort by ASN" i18n-title
@ -169,7 +169,7 @@
(sort)="onSort($event)" (sort)="onSort($event)"
i18n>ASN</th> i18n>ASN</th>
} }
@if (activeDisplayFields.includes(DocumentDisplayField.CORRESPONDENT) && permissionService.currentUserCan(PermissionAction.View, PermissionType.Correspondent)) { @if (activeDisplayFields.includes(DisplayField.CORRESPONDENT) && permissionService.currentUserCan(PermissionAction.View, PermissionType.Correspondent)) {
<th class="d-none d-md-table-cell" <th class="d-none d-md-table-cell"
pngxSortable="correspondent__name" pngxSortable="correspondent__name"
title="Sort by correspondent" i18n-title title="Sort by correspondent" i18n-title
@ -178,7 +178,7 @@
(sort)="onSort($event)" (sort)="onSort($event)"
i18n>Correspondent</th> i18n>Correspondent</th>
} }
@if (activeDisplayFields.includes(DocumentDisplayField.TITLE)) { @if (activeDisplayFields.includes(DisplayField.TITLE)) {
<th <th
pngxSortable="title" pngxSortable="title"
title="Sort by title" i18n-title title="Sort by title" i18n-title
@ -187,7 +187,7 @@
(sort)="onSort($event)" (sort)="onSort($event)"
i18n>Title</th> i18n>Title</th>
} }
@if (activeDisplayFields.includes(DocumentDisplayField.OWNER) && permissionService.currentUserCan(PermissionAction.View, PermissionType.User)) { @if (activeDisplayFields.includes(DisplayField.OWNER) && permissionService.currentUserCan(PermissionAction.View, PermissionType.User)) {
<th class="d-none d-xl-table-cell" <th class="d-none d-xl-table-cell"
pngxSortable="owner" pngxSortable="owner"
title="Sort by owner" i18n-title title="Sort by owner" i18n-title
@ -196,7 +196,7 @@
(sort)="onSort($event)" (sort)="onSort($event)"
i18n>Owner</th> i18n>Owner</th>
} }
@if (activeDisplayFields.includes(DocumentDisplayField.NOTES) && notesEnabled) { @if (activeDisplayFields.includes(DisplayField.NOTES) && notesEnabled) {
<th class="d-none d-xl-table-cell" <th class="d-none d-xl-table-cell"
pngxSortable="num_notes" pngxSortable="num_notes"
title="Sort by notes" i18n-title title="Sort by notes" i18n-title
@ -205,7 +205,7 @@
(sort)="onSort($event)" (sort)="onSort($event)"
i18n>Notes</th> i18n>Notes</th>
} }
@if (activeDisplayFields.includes(DocumentDisplayField.DOCUMENT_TYPE) && permissionService.currentUserCan(PermissionAction.View, PermissionType.DocumentType)) { @if (activeDisplayFields.includes(DisplayField.DOCUMENT_TYPE) && permissionService.currentUserCan(PermissionAction.View, PermissionType.DocumentType)) {
<th class="d-none d-xl-table-cell" <th class="d-none d-xl-table-cell"
pngxSortable="document_type__name" pngxSortable="document_type__name"
title="Sort by document type" i18n-title title="Sort by document type" i18n-title
@ -214,7 +214,7 @@
(sort)="onSort($event)" (sort)="onSort($event)"
i18n>Document type</th> i18n>Document type</th>
} }
@if (activeDisplayFields.includes(DocumentDisplayField.STORAGE_PATH) && permissionService.currentUserCan(PermissionAction.View, PermissionType.StoragePath)) { @if (activeDisplayFields.includes(DisplayField.STORAGE_PATH) && permissionService.currentUserCan(PermissionAction.View, PermissionType.StoragePath)) {
<th class="d-none d-xl-table-cell" <th class="d-none d-xl-table-cell"
pngxSortable="storage_path__name" pngxSortable="storage_path__name"
title="Sort by storage path" i18n-title title="Sort by storage path" i18n-title
@ -223,7 +223,7 @@
(sort)="onSort($event)" (sort)="onSort($event)"
i18n>Storage path</th> i18n>Storage path</th>
} }
@if (activeDisplayFields.includes(DocumentDisplayField.CREATED)) { @if (activeDisplayFields.includes(DisplayField.CREATED)) {
<th <th
pngxSortable="created" pngxSortable="created"
title="Sort by created date" i18n-title title="Sort by created date" i18n-title
@ -232,7 +232,7 @@
(sort)="onSort($event)" (sort)="onSort($event)"
i18n>Created</th> i18n>Created</th>
} }
@if (activeDisplayFields.includes(DocumentDisplayField.ADDED)) { @if (activeDisplayFields.includes(DisplayField.ADDED)) {
<th <th
pngxSortable="added" pngxSortable="added"
title="Sort by added date" i18n-title title="Sort by added date" i18n-title
@ -256,12 +256,12 @@
<label class="form-check-label" for="docCheck{{d.id}}"></label> <label class="form-check-label" for="docCheck{{d.id}}"></label>
</div> </div>
</td> </td>
@if (activeDisplayFields.includes(DocumentDisplayField.ASN)) { @if (activeDisplayFields.includes(DisplayField.ASN)) {
<td class="d-none d-xl-table-cell"> <td class="d-none d-xl-table-cell">
{{d.archive_serial_number}} {{d.archive_serial_number}}
</td> </td>
} }
@if (activeDisplayFields.includes(DocumentDisplayField.CORRESPONDENT) && permissionService.currentUserCan(PermissionAction.View, PermissionType.Correspondent)) { @if (activeDisplayFields.includes(DisplayField.CORRESPONDENT) && permissionService.currentUserCan(PermissionAction.View, PermissionType.Correspondent)) {
<td class="d-none d-xl-table-cell"> <td class="d-none d-xl-table-cell">
@if (d.correspondent) { @if (d.correspondent) {
<a (click)="clickCorrespondent(d.correspondent);$event.stopPropagation()" title="Filter by correspondent" i18n-title>{{(d.correspondent$ | async)?.name}}</a> <a (click)="clickCorrespondent(d.correspondent);$event.stopPropagation()" title="Filter by correspondent" i18n-title>{{(d.correspondent$ | async)?.name}}</a>
@ -269,21 +269,21 @@
</td> </td>
} }
<td> <td>
@if (activeDisplayFields.includes(DocumentDisplayField.TITLE)) { @if (activeDisplayFields.includes(DisplayField.TITLE)) {
<a routerLink="/documents/{{d.id}}" title="Edit document" i18n-title style="overflow-wrap: anywhere;">{{d.title | documentTitle}}</a> <a routerLink="/documents/{{d.id}}" title="Edit document" i18n-title style="overflow-wrap: anywhere;">{{d.title | documentTitle}}</a>
} }
@if (activeDisplayFields.includes(DocumentDisplayField.TAGS)) { @if (activeDisplayFields.includes(DisplayField.TAGS)) {
@for (t of d.tags$ | async; track t) { @for (t of d.tags$ | async; track t) {
<pngx-tag [tag]="t" class="ms-1" clickable="true" linkTitle="Filter by tag" i18n-linkTitle (click)="clickTag(t.id);$event.stopPropagation()"></pngx-tag> <pngx-tag [tag]="t" class="ms-1" clickable="true" linkTitle="Filter by tag" i18n-linkTitle (click)="clickTag(t.id);$event.stopPropagation()"></pngx-tag>
} }
} }
</td> </td>
@if (activeDisplayFields.includes(DocumentDisplayField.OWNER) && permissionService.currentUserCan(PermissionAction.View, PermissionType.User)) { @if (activeDisplayFields.includes(DisplayField.OWNER) && permissionService.currentUserCan(PermissionAction.View, PermissionType.User)) {
<td> <td>
{{d.owner | username}} {{d.owner | username}}
</td> </td>
} }
@if (activeDisplayFields.includes(DocumentDisplayField.NOTES) && notesEnabled) { @if (activeDisplayFields.includes(DisplayField.NOTES) && notesEnabled) {
<td class="d-none d-xl-table-cell"> <td class="d-none d-xl-table-cell">
@if (d.notes.length) { @if (d.notes.length) {
<a routerLink="/documents/{{d.id}}/notes" class="btn btn-sm p-0"> <a routerLink="/documents/{{d.id}}/notes" class="btn btn-sm p-0">
@ -294,26 +294,26 @@
} }
</td> </td>
} }
@if (activeDisplayFields.includes(DocumentDisplayField.DOCUMENT_TYPE) && permissionService.currentUserCan(PermissionAction.View, PermissionType.DocumentType)) { @if (activeDisplayFields.includes(DisplayField.DOCUMENT_TYPE) && permissionService.currentUserCan(PermissionAction.View, PermissionType.DocumentType)) {
<td class="d-none d-xl-table-cell"> <td class="d-none d-xl-table-cell">
@if (d.document_type) { @if (d.document_type) {
<a (click)="clickDocumentType(d.document_type);$event.stopPropagation()" title="Filter by document type" i18n-title>{{(d.document_type$ | async)?.name}}</a> <a (click)="clickDocumentType(d.document_type);$event.stopPropagation()" title="Filter by document type" i18n-title>{{(d.document_type$ | async)?.name}}</a>
} }
</td> </td>
} }
@if (activeDisplayFields.includes(DocumentDisplayField.STORAGE_PATH) && permissionService.currentUserCan(PermissionAction.View, PermissionType.StoragePath)) { @if (activeDisplayFields.includes(DisplayField.STORAGE_PATH) && permissionService.currentUserCan(PermissionAction.View, PermissionType.StoragePath)) {
<td class="d-none d-xl-table-cell"> <td class="d-none d-xl-table-cell">
@if (d.storage_path) { @if (d.storage_path) {
<a (click)="clickStoragePath(d.storage_path);$event.stopPropagation()" title="Filter by storage path" i18n-title>{{(d.storage_path$ | async)?.name}}</a> <a (click)="clickStoragePath(d.storage_path);$event.stopPropagation()" title="Filter by storage path" i18n-title>{{(d.storage_path$ | async)?.name}}</a>
} }
</td> </td>
} }
@if (activeDisplayFields.includes(DocumentDisplayField.CREATED)) { @if (activeDisplayFields.includes(DisplayField.CREATED)) {
<td> <td>
{{d.created_date | customDate}} {{d.created_date | customDate}}
</td> </td>
} }
@if (activeDisplayFields.includes(DocumentDisplayField.ADDED)) { @if (activeDisplayFields.includes(DisplayField.ADDED)) {
<td> <td>
{{d.added | customDate}} {{d.added | customDate}}
</td> </td>

View File

@ -35,9 +35,9 @@ import { Subject, of, throwError } from 'rxjs'
import { SavedViewService } from 'src/app/services/rest/saved-view.service' import { SavedViewService } from 'src/app/services/rest/saved-view.service'
import { ActivatedRoute, Router, convertToParamMap } from '@angular/router' import { ActivatedRoute, Router, convertToParamMap } from '@angular/router'
import { import {
DEFAULT_DOCUMENT_DISPLAY_FIELDS, DEFAULT_DISPLAY_FIELDS,
DisplayMode, DisplayMode,
DocumentDisplayField, DisplayField,
SavedView, SavedView,
} from 'src/app/data/saved-view' } from 'src/app/data/saved-view'
import { import {
@ -331,7 +331,7 @@ describe('DocumentListComponent', () => {
}) })
it('should support setting sort field by table head', () => { it('should support setting sort field by table head', () => {
component.activeDisplayFields = [DocumentDisplayField.ASN] component.activeDisplayFields = [DisplayField.ASN]
jest.spyOn(documentListService, 'documents', 'get').mockReturnValue(docs) jest.spyOn(documentListService, 'documents', 'get').mockReturnValue(docs)
fixture.detectChanges() fixture.detectChanges()
expect(documentListService.sortField).toEqual('created') expect(documentListService.sortField).toEqual('created')
@ -555,7 +555,7 @@ describe('DocumentListComponent', () => {
], ],
page_size: 5, page_size: 5,
display_mode: DisplayMode.SMALL_CARDS, display_mode: DisplayMode.SMALL_CARDS,
document_display_fields: [DocumentDisplayField.TITLE], display_fields: [DisplayField.TITLE],
} }
jest.spyOn(savedViewService, 'getCached').mockReturnValue(of(view)) jest.spyOn(savedViewService, 'getCached').mockReturnValue(of(view))
const queryParams = { view: view.id.toString() } const queryParams = { view: view.id.toString() }
@ -567,9 +567,9 @@ describe('DocumentListComponent', () => {
fixture.detectChanges() fixture.detectChanges()
expect(documentListService.activeSavedViewId).toEqual(10) expect(documentListService.activeSavedViewId).toEqual(10)
component.list.documentDisplayFields = [DocumentDisplayField.ASN] component.list.displayFields = [DisplayField.ASN]
expect(component.savedViewIsModified).toBeTruthy() expect(component.savedViewIsModified).toBeTruthy()
component.list.documentDisplayFields = [DocumentDisplayField.TITLE] component.list.displayFields = [DisplayField.TITLE]
expect(component.savedViewIsModified).toBeFalsy() expect(component.savedViewIsModified).toBeFalsy()
component.list.displayMode = DisplayMode.TABLE component.list.displayMode = DisplayMode.TABLE
expect(component.savedViewIsModified).toBeTruthy() expect(component.savedViewIsModified).toBeTruthy()
@ -590,9 +590,7 @@ describe('DocumentListComponent', () => {
expect(documentListService.sortField).toEqual('created') expect(documentListService.sortField).toEqual('created')
component.list.displayMode = DisplayMode.TABLE component.list.displayMode = DisplayMode.TABLE
component.list.documentDisplayFields = DEFAULT_DOCUMENT_DISPLAY_FIELDS.map( component.list.displayFields = DEFAULT_DISPLAY_FIELDS.map((f) => f.id)
(f) => f.id
)
fixture.detectChanges() fixture.detectChanges()
expect( expect(
@ -635,19 +633,19 @@ describe('DocumentListComponent', () => {
it('should support toggling display fields', () => { it('should support toggling display fields', () => {
fixture.detectChanges() fixture.detectChanges()
component.activeDisplayFields = [DocumentDisplayField.ASN] component.activeDisplayFields = [DisplayField.ASN]
component.toggleDisplayField(DocumentDisplayField.TITLE) component.toggleDisplayField(DisplayField.TITLE)
expect(component.activeDisplayFields).toEqual([ expect(component.activeDisplayFields).toEqual([
DocumentDisplayField.ASN, DisplayField.ASN,
DocumentDisplayField.TITLE, DisplayField.TITLE,
]) ])
component.toggleDisplayField(DocumentDisplayField.ASN) component.toggleDisplayField(DisplayField.ASN)
expect(component.activeDisplayFields).toEqual([DocumentDisplayField.TITLE]) expect(component.activeDisplayFields).toEqual([DisplayField.TITLE])
}) })
it('should get custom field title', () => { it('should get custom field title', () => {
fixture.detectChanges() fixture.detectChanges()
settingsService.allDocumentDisplayFields = [ settingsService.allDisplayFields = [
{ id: 'custom_field_1', name: 'Custom Field 1' }, { id: 'custom_field_1', name: 'Custom Field 1' },
] ]
expect(component.getDisplayCustomFieldTitle('custom_field_1')).toEqual( expect(component.getDisplayCustomFieldTitle('custom_field_1')).toEqual(

View File

@ -16,11 +16,7 @@ import {
} from 'src/app/utils/filter-rules' } from 'src/app/utils/filter-rules'
import { FILTER_FULLTEXT_MORELIKE } from 'src/app/data/filter-rule-type' import { FILTER_FULLTEXT_MORELIKE } from 'src/app/data/filter-rule-type'
import { Document } from 'src/app/data/document' import { Document } from 'src/app/data/document'
import { import { DisplayMode, DisplayField, SavedView } from 'src/app/data/saved-view'
DisplayMode,
DocumentDisplayField,
SavedView,
} from 'src/app/data/saved-view'
import { SETTINGS_KEYS } from 'src/app/data/ui-settings' import { SETTINGS_KEYS } from 'src/app/data/ui-settings'
import { import {
SortableDirective, SortableDirective,
@ -50,7 +46,7 @@ export class DocumentListComponent
extends ComponentWithPermissions extends ComponentWithPermissions
implements OnInit, OnDestroy implements OnInit, OnDestroy
{ {
DocumentDisplayField = DocumentDisplayField DisplayField = DisplayField
DisplayMode = DisplayMode DisplayMode = DisplayMode
constructor( constructor(
@ -73,12 +69,12 @@ export class DocumentListComponent
@ViewChildren(SortableDirective) headers: QueryList<SortableDirective> @ViewChildren(SortableDirective) headers: QueryList<SortableDirective>
get activeDisplayFields(): DocumentDisplayField[] { get activeDisplayFields(): DisplayField[] {
return this.list.documentDisplayFields return this.list.displayFields
} }
set activeDisplayFields(fields: DocumentDisplayField[]) { set activeDisplayFields(fields: DisplayField[]) {
this.list.documentDisplayFields = fields this.list.displayFields = fields
this.updateDisplayCustomFields() this.updateDisplayCustomFields()
} }
activeDisplayCustomFields: Set<string> = new Set() activeDisplayCustomFields: Set<string> = new Set()
@ -88,7 +84,7 @@ export class DocumentListComponent
Array.from(this.activeDisplayFields).filter( Array.from(this.activeDisplayFields).filter(
(field) => (field) =>
typeof field === 'string' && typeof field === 'string' &&
field.startsWith(DocumentDisplayField.CUSTOM_FIELD) field.startsWith(DisplayField.CUSTOM_FIELD)
) )
) )
} }
@ -107,7 +103,7 @@ export class DocumentListComponent
(this.unmodifiedSavedView.page_size && (this.unmodifiedSavedView.page_size &&
this.unmodifiedSavedView.page_size !== this.list.pageSize) || this.unmodifiedSavedView.page_size !== this.list.pageSize) ||
this.unmodifiedSavedView.display_mode !== this.list.displayMode || this.unmodifiedSavedView.display_mode !== this.list.displayMode ||
this.unmodifiedSavedView.document_display_fields.join(',') !== this.unmodifiedSavedView.display_fields.join(',') !==
this.activeDisplayFields.join(',') || this.activeDisplayFields.join(',') ||
filterRulesDiffer( filterRulesDiffer(
this.unmodifiedSavedView.filter_rules, this.unmodifiedSavedView.filter_rules,
@ -153,7 +149,7 @@ export class DocumentListComponent
return this.list.selected.size > 0 return this.list.selected.size > 0
} }
toggleDisplayField(field: DocumentDisplayField) { toggleDisplayField(field: DisplayField) {
if (this.activeDisplayFields.includes(field)) { if (this.activeDisplayFields.includes(field)) {
this.activeDisplayFields = this.activeDisplayFields.filter( this.activeDisplayFields = this.activeDisplayFields.filter(
(f) => f !== field (f) => f !== field
@ -165,9 +161,8 @@ export class DocumentListComponent
} }
public getDisplayCustomFieldTitle(field: string) { public getDisplayCustomFieldTitle(field: string) {
return this.settingsService.allDocumentDisplayFields.find( return this.settingsService.allDisplayFields.find((f) => f.id === field)
(f) => f.id === field ?.name
)?.name
} }
ngOnInit(): void { ngOnInit(): void {
@ -198,8 +193,8 @@ export class DocumentListComponent
if (!view.display_mode) { if (!view.display_mode) {
view.display_mode = this.list.displayMode view.display_mode = this.list.displayMode
} }
if (!view.document_display_fields) { if (!view.display_fields) {
view.document_display_fields = this.list.documentDisplayFields view.display_fields = this.list.displayFields
} }
this.unmodifiedSavedView = view this.unmodifiedSavedView = view
this.list.activateSavedViewWithQueryParams( this.list.activateSavedViewWithQueryParams(

View File

@ -7,7 +7,7 @@ export enum DisplayMode {
LARGE_CARDS = 'largeCards', LARGE_CARDS = 'largeCards',
} }
export enum DocumentDisplayField { export enum DisplayField {
TITLE = 'title', TITLE = 'title',
CREATED = 'created', CREATED = 'created',
ADDED = 'added', ADDED = 'added',
@ -22,51 +22,51 @@ export enum DocumentDisplayField {
ASN = 'asn', ASN = 'asn',
} }
export const DEFAULT_PAGE_SIZE = 10 export const DEFAULT_DASHBOARD_VIEW_PAGE_SIZE = 10
export const DEFAULT_DOCUMENT_DISPLAY_FIELDS = [ export const DEFAULT_DISPLAY_FIELDS = [
{ {
id: DocumentDisplayField.TITLE, id: DisplayField.TITLE,
name: $localize`Title`, name: $localize`Title`,
}, },
{ {
id: DocumentDisplayField.CREATED, id: DisplayField.CREATED,
name: $localize`Created`, name: $localize`Created`,
}, },
{ {
id: DocumentDisplayField.ADDED, id: DisplayField.ADDED,
name: $localize`Added`, name: $localize`Added`,
}, },
{ {
id: DocumentDisplayField.TAGS, id: DisplayField.TAGS,
name: $localize`Tags`, name: $localize`Tags`,
}, },
{ {
id: DocumentDisplayField.CORRESPONDENT, id: DisplayField.CORRESPONDENT,
name: $localize`Correspondent`, name: $localize`Correspondent`,
}, },
{ {
id: DocumentDisplayField.DOCUMENT_TYPE, id: DisplayField.DOCUMENT_TYPE,
name: $localize`Document type`, name: $localize`Document type`,
}, },
{ {
id: DocumentDisplayField.STORAGE_PATH, id: DisplayField.STORAGE_PATH,
name: $localize`Storage path`, name: $localize`Storage path`,
}, },
{ {
id: DocumentDisplayField.NOTES, id: DisplayField.NOTES,
name: $localize`Notes`, name: $localize`Notes`,
}, },
{ {
id: DocumentDisplayField.OWNER, id: DisplayField.OWNER,
name: $localize`Owner`, name: $localize`Owner`,
}, },
{ {
id: DocumentDisplayField.SHARED, id: DisplayField.SHARED,
name: $localize`Shared`, name: $localize`Shared`,
}, },
{ {
id: DocumentDisplayField.ASN, id: DisplayField.ASN,
name: $localize`ASN`, name: $localize`ASN`,
}, },
] ]
@ -88,5 +88,5 @@ export interface SavedView extends ObjectWithPermissions {
display_mode?: DisplayMode display_mode?: DisplayMode
document_display_fields?: DocumentDisplayField[] display_fields?: DisplayField[]
} }

View File

@ -13,9 +13,9 @@ import {
FILTER_HAS_TAGS_ANY, FILTER_HAS_TAGS_ANY,
} from '../data/filter-rule-type' } from '../data/filter-rule-type'
import { import {
DEFAULT_DOCUMENT_DISPLAY_FIELDS, DEFAULT_DISPLAY_FIELDS,
DisplayMode, DisplayMode,
DocumentDisplayField, DisplayField,
SavedView, SavedView,
} from '../data/saved-view' } from '../data/saved-view'
import { FilterRule } from '../data/filter-rule' import { FilterRule } from '../data/filter-rule'
@ -569,25 +569,25 @@ describe('DocumentListViewService', () => {
it('should update default view state when display fields change', () => { it('should update default view state when display fields change', () => {
const localStorageSpy = jest.spyOn(localStorage, 'setItem') const localStorageSpy = jest.spyOn(localStorage, 'setItem')
documentListViewService.documentDisplayFields = [ documentListViewService.displayFields = [
DocumentDisplayField.ADDED, DisplayField.ADDED,
DocumentDisplayField.TITLE, DisplayField.TITLE,
] ]
expect(documentListViewService.documentDisplayFields).toEqual([ expect(documentListViewService.displayFields).toEqual([
DocumentDisplayField.ADDED, DisplayField.ADDED,
DocumentDisplayField.TITLE, DisplayField.TITLE,
]) ])
expect(localStorageSpy).toHaveBeenCalled() expect(localStorageSpy).toHaveBeenCalled()
// reload triggered // reload triggered
httpTestingController.match( httpTestingController.match(
`${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true`
) )
documentListViewService.documentDisplayFields = null documentListViewService.displayFields = null
httpTestingController.match( httpTestingController.match(
`${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true` `${environment.apiBaseUrl}documents/?page=1&page_size=50&ordering=-created&truncate_content=true`
) )
expect(documentListViewService.documentDisplayFields).toEqual( expect(documentListViewService.displayFields).toEqual(
DEFAULT_DOCUMENT_DISPLAY_FIELDS.map((f) => f.id) DEFAULT_DISPLAY_FIELDS.map((f) => f.id)
) )
}) })
}) })

View File

@ -9,9 +9,9 @@ import {
} from '../utils/filter-rules' } from '../utils/filter-rules'
import { Document } from '../data/document' import { Document } from '../data/document'
import { import {
DEFAULT_DOCUMENT_DISPLAY_FIELDS, DEFAULT_DISPLAY_FIELDS,
DisplayMode, DisplayMode,
DocumentDisplayField, DisplayField,
SavedView, SavedView,
} from '../data/saved-view' } from '../data/saved-view'
import { SETTINGS_KEYS } from '../data/ui-settings' import { SETTINGS_KEYS } from '../data/ui-settings'
@ -78,7 +78,7 @@ export interface ListViewState {
/** /**
* The fields to display in the document list. * The fields to display in the document list.
*/ */
documentDisplayFields?: DocumentDisplayField[] displayFields?: DisplayField[]
} }
/** /**
@ -196,8 +196,7 @@ export class DocumentListViewService {
} }
this.activeListViewState.displayMode = view.display_mode this.activeListViewState.displayMode = view.display_mode
this.activeListViewState.pageSize = view.page_size this.activeListViewState.pageSize = view.page_size
this.activeListViewState.documentDisplayFields = this.activeListViewState.displayFields = view.display_fields
view.document_display_fields
this.reduceSelectionToFilter() this.reduceSelectionToFilter()
@ -411,15 +410,15 @@ export class DocumentListViewService {
) )
} }
get documentDisplayFields(): DocumentDisplayField[] { get displayFields(): DisplayField[] {
return ( return (
this.activeListViewState.documentDisplayFields ?? this.activeListViewState.displayFields ??
DEFAULT_DOCUMENT_DISPLAY_FIELDS.map((f) => f.id) DEFAULT_DISPLAY_FIELDS.map((f) => f.id)
) )
} }
set documentDisplayFields(fields: DocumentDisplayField[]) { set displayFields(fields: DisplayField[]) {
this.activeListViewState.documentDisplayFields = fields this.activeListViewState.displayFields = fields
this.saveDocumentListView() this.saveDocumentListView()
} }
@ -432,7 +431,7 @@ export class DocumentListViewService {
sortField: this.activeListViewState.sortField, sortField: this.activeListViewState.sortField,
sortReverse: this.activeListViewState.sortReverse, sortReverse: this.activeListViewState.sortReverse,
displayMode: this.activeListViewState.displayMode, displayMode: this.activeListViewState.displayMode,
documentDisplayFields: this.activeListViewState.documentDisplayFields, displayFields: this.activeListViewState.displayFields,
} }
localStorage.setItem( localStorage.setItem(
DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG, DOCUMENT_LIST_SERVICE.CURRENT_VIEW_CONFIG,

View File

@ -13,8 +13,8 @@ import { AppModule } from '../app.module'
import { UiSettings, SETTINGS_KEYS } from '../data/ui-settings' import { UiSettings, SETTINGS_KEYS } from '../data/ui-settings'
import { SettingsService } from './settings.service' import { SettingsService } from './settings.service'
import { import {
DEFAULT_DOCUMENT_DISPLAY_FIELDS, DEFAULT_DISPLAY_FIELDS,
DocumentDisplayField, DisplayField,
SavedView, SavedView,
} from '../data/saved-view' } from '../data/saved-view'
import { CustomFieldsService } from './rest/custom-fields.service' import { CustomFieldsService } from './rest/custom-fields.service'
@ -352,14 +352,11 @@ describe('SettingsService', () => {
) )
settingsService.initializeDisplayFields() settingsService.initializeDisplayFields()
expect( expect(
settingsService.allDocumentDisplayFields.includes( settingsService.allDisplayFields.includes(DEFAULT_DISPLAY_FIELDS[0])
DEFAULT_DOCUMENT_DISPLAY_FIELDS[0]
)
).toBeTruthy() ).toBeTruthy()
expect( expect(
settingsService.allDocumentDisplayFields.find( settingsService.allDisplayFields.find(
(f) => (f) => f.id === `${DisplayField.CUSTOM_FIELD}${customFields[0].id}`
f.id === `${DocumentDisplayField.CUSTOM_FIELD}${customFields[0].id}`
).name ).name
).toEqual(customFields[0].name) ).toEqual(customFields[0].name)
}) })

View File

@ -26,8 +26,8 @@ import {
} from './permissions.service' } from './permissions.service'
import { ToastService } from './toast.service' import { ToastService } from './toast.service'
import { import {
DEFAULT_DOCUMENT_DISPLAY_FIELDS, DEFAULT_DISPLAY_FIELDS,
DocumentDisplayField, DisplayField,
SavedView, SavedView,
} from '../data/saved-view' } from '../data/saved-view'
import { CustomFieldsService } from './rest/custom-fields.service' import { CustomFieldsService } from './rest/custom-fields.service'
@ -266,7 +266,7 @@ export class SettingsService {
public globalDropzoneActive: boolean = false public globalDropzoneActive: boolean = false
public organizingSidebarSavedViews: boolean = false public organizingSidebarSavedViews: boolean = false
public allDocumentDisplayFields: any public allDisplayFields: any
constructor( constructor(
rendererFactory: RendererFactory2, rendererFactory: RendererFactory2,
@ -307,7 +307,7 @@ export class SettingsService {
} }
public initializeDisplayFields() { public initializeDisplayFields() {
this.allDocumentDisplayFields = DEFAULT_DOCUMENT_DISPLAY_FIELDS this.allDisplayFields = DEFAULT_DISPLAY_FIELDS
if ( if (
this.permissionsService.currentUserCan( this.permissionsService.currentUserCan(
@ -316,10 +316,10 @@ export class SettingsService {
) )
) { ) {
this.customFieldsService.listAll().subscribe((r) => { this.customFieldsService.listAll().subscribe((r) => {
this.allDocumentDisplayFields = DEFAULT_DOCUMENT_DISPLAY_FIELDS.concat( this.allDisplayFields = DEFAULT_DISPLAY_FIELDS.concat(
r.results.map((field) => { r.results.map((field) => {
return { return {
id: `${DocumentDisplayField.CUSTOM_FIELD}${field.id}` as any, id: `${DisplayField.CUSTOM_FIELD}${field.id}` as any,
name: field.name, name: field.name,
} }
}) })

View File

@ -40,7 +40,7 @@ class Migration(migrations.Migration):
), ),
migrations.AddField( migrations.AddField(
model_name="savedview", model_name="savedview",
name="document_display_fields", name="display_fields",
field=multiselectfield.db.fields.MultiSelectField( field=multiselectfield.db.fields.MultiSelectField(
choices=[ choices=[
("title", "Title"), ("title", "Title"),

View File

@ -552,12 +552,12 @@ class DynamicMultiSelectField(MultiSelectField):
class SavedView(ModelWithOwner): class SavedView(ModelWithOwner):
class ViewDisplayMode(models.TextChoices): class DisplayMode(models.TextChoices):
TABLE = ("table", _("Table")) TABLE = ("table", _("Table"))
SMALL_CARDS = ("smallCards", _("Small Cards")) SMALL_CARDS = ("smallCards", _("Small Cards"))
LARGE_CARDS = ("largeCards", _("Large Cards")) LARGE_CARDS = ("largeCards", _("Large Cards"))
class DocumentDisplayFields(models.TextChoices): class DisplayFields(models.TextChoices):
TITLE = ("title", _("Title")) TITLE = ("title", _("Title"))
CREATED = ("created", _("Created")) CREATED = ("created", _("Created"))
ADDED = ("added", _("Added")) ADDED = ("added", _("Added"))
@ -566,7 +566,7 @@ class SavedView(ModelWithOwner):
CORRESPONDENT = ("correspondent", _("Correspondent")) CORRESPONDENT = ("correspondent", _("Correspondent"))
STORAGE_PATH = ("storagepath", _("Storage Path")) STORAGE_PATH = ("storagepath", _("Storage Path"))
class DynamicDocumentDisplayFields: class DynamicDisplayFields:
CUSTOM_FIELD = ("custom_field_%d", CustomField) CUSTOM_FIELD = ("custom_field_%d", CustomField)
name = models.CharField(_("name"), max_length=128) name = models.CharField(_("name"), max_length=128)
@ -596,17 +596,17 @@ class SavedView(ModelWithOwner):
display_mode = models.CharField( display_mode = models.CharField(
max_length=128, max_length=128,
verbose_name=_("View display mode"), verbose_name=_("View display mode"),
choices=ViewDisplayMode.choices, choices=DisplayMode.choices,
null=True, null=True,
blank=True, blank=True,
) )
document_display_fields = DynamicMultiSelectField( display_fields = DynamicMultiSelectField(
max_length=128, max_length=128,
verbose_name=_("Document display fields"), verbose_name=_("Document display fields"),
choices=DocumentDisplayFields.choices, choices=DisplayFields.choices,
dyanmic_choices=[DynamicDocumentDisplayFields.CUSTOM_FIELD], dyanmic_choices=[DynamicDisplayFields.CUSTOM_FIELD],
default=f"{DocumentDisplayFields.CREATED},{DocumentDisplayFields.TITLE},{DocumentDisplayFields.TAGS},{DocumentDisplayFields.CORRESPONDENT}", default=f"{DisplayFields.CREATED},{DisplayFields.TITLE},{DisplayFields.TAGS},{DisplayFields.CORRESPONDENT}",
) )
class Meta: class Meta:

View File

@ -839,8 +839,8 @@ class DynamicOrderedMultipleChoiceField(fields.MultipleChoiceField):
class SavedViewSerializer(OwnedObjectSerializer): class SavedViewSerializer(OwnedObjectSerializer):
filter_rules = SavedViewFilterRuleSerializer(many=True) filter_rules = SavedViewFilterRuleSerializer(many=True)
document_display_fields = DynamicOrderedMultipleChoiceField( display_fields = DynamicOrderedMultipleChoiceField(
choices=SavedView.DocumentDisplayFields.choices, choices=SavedView.DisplayFields.choices,
dyanmic_choices=[("custom_field_%d", CustomField)], dyanmic_choices=[("custom_field_%d", CustomField)],
required=False, required=False,
) )
@ -857,7 +857,7 @@ class SavedViewSerializer(OwnedObjectSerializer):
"filter_rules", "filter_rules",
"page_size", "page_size",
"display_mode", "display_mode",
"document_display_fields", "display_fields",
"owner", "owner",
"permissions", "permissions",
"user_can_change", "user_can_change",

View File

@ -1614,7 +1614,7 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase):
status.HTTP_404_NOT_FOUND, status.HTTP_404_NOT_FOUND,
) )
def test_savedview_create_update_patch(self): def test_saved_view_create_update_patch(self):
User.objects.create_user("user1") User.objects.create_user("user1")
view = { view = {
@ -1661,7 +1661,7 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase):
v1 = SavedView.objects.get(id=v1.id) v1 = SavedView.objects.get(id=v1.id)
self.assertEqual(v1.filter_rules.count(), 0) self.assertEqual(v1.filter_rules.count(), 0)
def test_saved_view_dashboard_view_options(self): def test_saved_view_display_options(self):
User.objects.create_user("user1") User.objects.create_user("user1")
view = { view = {
@ -1671,10 +1671,10 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase):
"sort_field": "created2", "sort_field": "created2",
"filter_rules": [{"rule_type": 4, "value": "test"}], "filter_rules": [{"rule_type": 4, "value": "test"}],
"page_size": 20, "page_size": 20,
"display_mode": SavedView.ViewDisplayMode.SMALL_CARDS, "display_mode": SavedView.DisplayMode.SMALL_CARDS,
"document_display_fields": [ "display_fields": [
SavedView.DocumentDisplayFields.TITLE, SavedView.DisplayFields.TITLE,
SavedView.DocumentDisplayFields.CREATED, SavedView.DisplayFields.CREATED,
], ],
} }
@ -1685,23 +1685,23 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase):
self.assertEqual(v1.page_size, 20) self.assertEqual(v1.page_size, 20)
self.assertEqual( self.assertEqual(
v1.display_mode, v1.display_mode,
SavedView.ViewDisplayMode.SMALL_CARDS, SavedView.DisplayMode.SMALL_CARDS,
) )
self.assertEqual( self.assertEqual(
v1.document_display_fields, v1.display_fields,
[ [
SavedView.DocumentDisplayFields.TITLE, SavedView.DisplayFields.TITLE,
SavedView.DocumentDisplayFields.CREATED, SavedView.DisplayFields.CREATED,
], ],
) )
response = self.client.patch( response = self.client.patch(
f"/api/saved_views/{v1.id}/", f"/api/saved_views/{v1.id}/",
{ {
"document_display_fields": [ "display_fields": [
SavedView.DocumentDisplayFields.TAGS, SavedView.DisplayFields.TAGS,
SavedView.DocumentDisplayFields.TITLE, SavedView.DisplayFields.TITLE,
SavedView.DocumentDisplayFields.CREATED, SavedView.DisplayFields.CREATED,
], ],
}, },
format="json", format="json",
@ -1710,15 +1710,15 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase):
v1.refresh_from_db() v1.refresh_from_db()
self.assertEqual( self.assertEqual(
v1.document_display_fields, v1.display_fields,
[ [
SavedView.DocumentDisplayFields.TAGS, SavedView.DisplayFields.TAGS,
SavedView.DocumentDisplayFields.TITLE, SavedView.DisplayFields.TITLE,
SavedView.DocumentDisplayFields.CREATED, SavedView.DisplayFields.CREATED,
], ],
) )
def test_saved_view_dashboard_view_customfields(self): def test_saved_view_display_customfields(self):
view = { view = {
"name": "test", "name": "test",
"show_on_dashboard": True, "show_on_dashboard": True,
@ -1726,10 +1726,10 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase):
"sort_field": "created2", "sort_field": "created2",
"filter_rules": [{"rule_type": 4, "value": "test"}], "filter_rules": [{"rule_type": 4, "value": "test"}],
"page_size": 20, "page_size": 20,
"display_mode": SavedView.ViewDisplayMode.SMALL_CARDS, "display_mode": SavedView.DisplayMode.SMALL_CARDS,
"document_display_fields": [ "display_fields": [
SavedView.DocumentDisplayFields.TITLE, SavedView.DisplayFields.TITLE,
SavedView.DocumentDisplayFields.CREATED, SavedView.DisplayFields.CREATED,
], ],
} }
@ -1746,11 +1746,10 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase):
response = self.client.patch( response = self.client.patch(
f"/api/saved_views/{v1.id}/", f"/api/saved_views/{v1.id}/",
{ {
"document_display_fields": [ "display_fields": [
SavedView.DocumentDisplayFields.TITLE, SavedView.DisplayFields.TITLE,
SavedView.DocumentDisplayFields.CREATED, SavedView.DisplayFields.CREATED,
SavedView.DynamicDocumentDisplayFields.CUSTOM_FIELD[0] SavedView.DynamicDisplayFields.CUSTOM_FIELD[0] % custom_field.id,
% custom_field.id,
], ],
}, },
format="json", format="json",
@ -1759,12 +1758,11 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase):
v1.refresh_from_db() v1.refresh_from_db()
self.assertEqual( self.assertEqual(
v1.document_display_fields, v1.display_fields,
[ [
str(SavedView.DocumentDisplayFields.TITLE), str(SavedView.DisplayFields.TITLE),
str(SavedView.DocumentDisplayFields.CREATED), str(SavedView.DisplayFields.CREATED),
SavedView.DynamicDocumentDisplayFields.CUSTOM_FIELD[0] SavedView.DynamicDisplayFields.CUSTOM_FIELD[0] % custom_field.id,
% custom_field.id,
], ],
) )
@ -1772,10 +1770,10 @@ class TestDocumentApi(DirectoriesMixin, DocumentConsumeDelayMixin, APITestCase):
response = self.client.patch( response = self.client.patch(
f"/api/saved_views/{v1.id}/", f"/api/saved_views/{v1.id}/",
{ {
"document_display_fields": [ "display_fields": [
SavedView.DocumentDisplayFields.TITLE, SavedView.DisplayFields.TITLE,
SavedView.DocumentDisplayFields.CREATED, SavedView.DisplayFields.CREATED,
SavedView.DynamicDocumentDisplayFields.CUSTOM_FIELD[0] % 99, SavedView.DynamicDisplayFields.CUSTOM_FIELD[0] % 99,
], ],
}, },
format="json", format="json",

File diff suppressed because it is too large Load Diff