From 2720e0c18edb20b344a57fd9adbc467a2f75121e Mon Sep 17 00:00:00 2001 From: Rijk van Zanten Date: Mon, 25 Oct 2021 20:29:04 -0400 Subject: [PATCH] Add new field flow (#9109) * Add new grouping setup to interfaces * [WIP] Start on new field flow * Add preview svgs * Update preview svg * Add basic saving mechanism. Start on magic * Add interface options to simple inputs * Fix missing t * Fix custom options not rendering * Fix interface options overrides * Sync m2o name key * Setup m2o related collection input * Add collections generation * Add circular prevention & type syncing * Small fixes in m2o context generation * Move o2m options to fn structure * Conclude o2m (i think) * Start on toggle to advanced * Style advanced toggle button * Add localType File support, start documenting * Add presentation/group localtypes * Use function style interface options in m2m * Don't require collection prop in field template component * Implement most of m2m magic * Restructure store updater * Finish useFieldDetailStore restructure * Only register root index in module folders * Do the thing * Finish m2m magic, tweak fallback styles * Fix o2m display template setup * Remove options comp for translations interface * Show languages collection picker in translations * Finish translations alterations * Add magic for files type * Officially wave goodbye to the old store setup It served it's purpose, but what a nightmare to maintain. Welcome to the new version * Update schema tab * Add field pane * Finish interface section * Add display section * Add conditions * Update tabs to use localType from store * Start on relationship tab * Update m2m relational setup * Start on m2o * Finish m2o setup * Finish o2m setup * Add m2a magic * Various tweaks * Add m2a setup * Add save button to advanced flow * Load existing values on start * Add upsert to stores, allow updating existing items * Please the linter gods * Remove seemingly redundant interface option @Oreilles Seeing the geometry type is already configured in the schema configuration, this particular option on the interface feels redundant (?) * Remove unnecessary option component overrides * Track relationships in required fields for save state * Fix relations previews on editing existing fields * Use standard vs advanced for input options * Remove note from simple field setup * Add divider to field config * Use background subdued * Default required to false * Add required icons to key/relationship * Tweak colors * Fix infinite loop in group creation * Make setup responsive * Allow switching interface at will * Add m2a related collections picker * Fix relations persisting on field deletion * Add "Create in Advanced" shortcut Just for you @joselcvarela * Fix PK field staging on collection create * Revert "Remove seemingly redundant interface option" This reverts commit e5e09a051e76795436e0324540b194c99a743874. * Fix map interface options --- api/src/constants.ts | 2 +- api/src/services/graphql.ts | 2 +- app/src/components/v-button/v-button.vue | 2 +- app/src/components/v-checkbox/v-checkbox.vue | 5 +- .../v-field-template/v-field-template.vue | 2 +- app/src/components/v-input/v-input.vue | 2 +- app/src/constants.ts | 74 ++ app/src/displays/file/index.ts | 2 +- app/src/displays/image/index.ts | 2 +- app/src/displays/raw/index.ts | 2 +- app/src/displays/related-values/index.ts | 2 +- app/src/displays/translations/index.ts | 2 +- .../system-display-template.vue | 6 +- .../system-interface-options.vue | 70 +- app/src/interfaces/boolean/index.ts | 1 + app/src/interfaces/datetime/index.ts | 3 + app/src/interfaces/datetime/preview.svg | 40 + app/src/interfaces/file-image/index.ts | 3 +- app/src/interfaces/file/index.ts | 3 +- app/src/interfaces/files/index.ts | 10 +- app/src/interfaces/files/preview.svg | 22 + app/src/interfaces/group-accordion/index.ts | 3 +- app/src/interfaces/group-detail/index.ts | 3 +- app/src/interfaces/group-raw/index.ts | 3 +- .../input-autocomplete-api/index.ts | 5 +- .../input-autocomplete-api/preview.svg | 6 + app/src/interfaces/input-code/index.ts | 3 + app/src/interfaces/input-code/preview.svg | 14 + app/src/interfaces/input-hash/index.ts | 3 + app/src/interfaces/input-hash/preview.svg | 6 + app/src/interfaces/input-multiline/index.ts | 3 + .../interfaces/input-multiline/preview.svg | 9 + .../interfaces/input-rich-text-html/index.ts | 3 + .../input-rich-text-html/preview.svg | 15 + .../interfaces/input-rich-text-md/index.ts | 3 + .../interfaces/input-rich-text-md/preview.svg | 15 + app/src/interfaces/input/index.ts | 210 ++- app/src/interfaces/input/options.vue | 237 ---- app/src/interfaces/input/preview.svg | 6 + app/src/interfaces/list-m2a/index.ts | 5 +- app/src/interfaces/list-m2a/preview.svg | 20 + app/src/interfaces/list-m2m/index.ts | 50 +- app/src/interfaces/list-m2m/options.vue | 124 -- app/src/interfaces/list-m2m/preview.svg | 20 + .../interfaces/list-o2m-tree-view/index.ts | 51 +- .../interfaces/list-o2m-tree-view/options.vue | 89 -- app/src/interfaces/list-o2m/index.ts | 53 +- app/src/interfaces/list-o2m/options.vue | 124 -- app/src/interfaces/list-o2m/preview.svg | 20 + app/src/interfaces/list/index.ts | 3 + app/src/interfaces/list/options.vue | 4 +- app/src/interfaces/list/preview.svg | 20 + app/src/interfaces/map/index.ts | 1 + app/src/interfaces/map/options.vue | 10 +- app/src/interfaces/map/preview.svg | 14 + .../interfaces/presentation-divider/index.ts | 3 +- .../interfaces/presentation-links/index.ts | 66 +- .../interfaces/presentation-links/options.vue | 126 -- .../interfaces/presentation-notice/index.ts | 5 +- .../presentation-notice/preview.svg | 10 + app/src/interfaces/select-color/index.ts | 1 + app/src/interfaces/select-color/preview.svg | 17 + .../interfaces/select-dropdown-m2o/index.ts | 24 +- .../select-dropdown-m2o/options.vue | 65 - .../select-dropdown-m2o/preview.svg | 12 + app/src/interfaces/select-dropdown/index.ts | 3 + .../interfaces/select-dropdown/preview.svg | 12 + app/src/interfaces/select-icon/index.ts | 1 + app/src/interfaces/select-icon/preview.svg | 19 + .../select-multiple-checkbox-tree/index.ts | 1 + .../select-multiple-checkbox/index.ts | 3 + .../select-multiple-checkbox/preview.svg | 18 + .../select-multiple-dropdown/index.ts | 3 + .../select-multiple-dropdown/preview.svg | 9 + app/src/interfaces/select-radio/index.ts | 3 + app/src/interfaces/select-radio/preview.svg | 18 + app/src/interfaces/slider/index.ts | 1 + app/src/interfaces/tags/index.ts | 1 + app/src/interfaces/translations/index.ts | 34 +- app/src/interfaces/translations/options.vue | 70 - app/src/lang/translations/en-US.yaml | 15 +- app/src/modules/register.ts | 2 +- .../field-detail/components/actions.vue | 109 -- .../field-detail/components/field.vue | 116 -- .../components/relationship-m2a.vue | 590 --------- .../components/relationship-m2m.vue | 761 ----------- .../components/relationship-m2o.vue | 413 ------ .../components/relationship-o2m.vue | 584 --------- .../field-detail/components/relationship.vue | 48 - .../field-detail/components/tabs.vue | 35 - .../field-detail/components/translations.vue | 569 -------- .../field-detail-advanced-actions.vue | 31 + .../field-detail-advanced-conditions.vue} | 40 +- .../field-detail-advanced-display.vue} | 68 +- .../field-detail-advanced-field.vue | 118 ++ .../field-detail-advanced-interface.vue} | 76 +- ...field-detail-advanced-relationship-m2a.vue | 323 +++++ ...field-detail-advanced-relationship-m2m.vue | 405 ++++++ ...field-detail-advanced-relationship-m2o.vue | 251 ++++ ...field-detail-advanced-relationship-o2m.vue | 249 ++++ ...ail-advanced-relationship-translations.vue | 320 +++++ .../field-detail-advanced-relationship.vue | 37 + .../field-detail-advanced-schema.vue} | 206 ++- .../field-detail-advanced-tabs.vue | 87 ++ .../field-detail-advanced.vue | 45 + .../field-configuration.vue | 180 +++ .../field-detail-simple.vue | 260 ++++ .../relationship-configuration.vue | 137 ++ .../data-model/field-detail/field-detail.vue | 529 +------- .../field-detail/shared/extension-options.vue | 132 ++ .../shared/related-collection-select.vue | 106 ++ .../shared/related-field-select.vue | 92 ++ .../routes/data-model/field-detail/store.ts | 1156 ----------------- .../field-detail/store/alterations/file.ts | 43 + .../field-detail/store/alterations/files.ts | 253 ++++ .../field-detail/store/alterations/global.ts | 96 ++ .../field-detail/store/alterations/group.ts | 24 + .../field-detail/store/alterations/m2a.ts | 285 ++++ .../field-detail/store/alterations/m2m.ts | 314 +++++ .../field-detail/store/alterations/m2o.ts | 101 ++ .../field-detail/store/alterations/o2m.ts | 191 +++ .../store/alterations/presentation.ts | 24 + .../store/alterations/standard.ts | 39 + .../store/alterations/translations.ts | 316 +++++ .../data-model/field-detail/store/index.ts | 318 +++++ .../data-model/field-detail/store/types.ts | 9 + .../fields/components/field-select.vue | 2 +- .../fields/components/fields-management.vue | 40 +- app/src/stores/collections.ts | 128 +- app/src/stores/fields.ts | 75 +- app/src/stores/relations.ts | 32 +- changelog.md | 142 +- packages/shared/src/constants/fields.ts | 12 + packages/shared/src/types/displays.ts | 2 +- packages/shared/src/types/extensions.ts | 29 + packages/shared/src/types/interfaces.ts | 14 +- packages/shared/src/types/relations.ts | 4 +- 137 files changed, 6378 insertions(+), 6142 deletions(-) create mode 100644 app/src/interfaces/datetime/preview.svg create mode 100644 app/src/interfaces/files/preview.svg create mode 100644 app/src/interfaces/input-autocomplete-api/preview.svg create mode 100644 app/src/interfaces/input-code/preview.svg create mode 100644 app/src/interfaces/input-hash/preview.svg create mode 100644 app/src/interfaces/input-multiline/preview.svg create mode 100644 app/src/interfaces/input-rich-text-html/preview.svg create mode 100644 app/src/interfaces/input-rich-text-md/preview.svg delete mode 100644 app/src/interfaces/input/options.vue create mode 100644 app/src/interfaces/input/preview.svg create mode 100644 app/src/interfaces/list-m2a/preview.svg delete mode 100644 app/src/interfaces/list-m2m/options.vue create mode 100644 app/src/interfaces/list-m2m/preview.svg delete mode 100644 app/src/interfaces/list-o2m-tree-view/options.vue delete mode 100644 app/src/interfaces/list-o2m/options.vue create mode 100644 app/src/interfaces/list-o2m/preview.svg create mode 100644 app/src/interfaces/list/preview.svg create mode 100644 app/src/interfaces/map/preview.svg delete mode 100644 app/src/interfaces/presentation-links/options.vue create mode 100644 app/src/interfaces/presentation-notice/preview.svg create mode 100644 app/src/interfaces/select-color/preview.svg delete mode 100644 app/src/interfaces/select-dropdown-m2o/options.vue create mode 100644 app/src/interfaces/select-dropdown-m2o/preview.svg create mode 100644 app/src/interfaces/select-dropdown/preview.svg create mode 100644 app/src/interfaces/select-icon/preview.svg create mode 100644 app/src/interfaces/select-multiple-checkbox/preview.svg create mode 100644 app/src/interfaces/select-multiple-dropdown/preview.svg create mode 100644 app/src/interfaces/select-radio/preview.svg delete mode 100644 app/src/interfaces/translations/options.vue delete mode 100644 app/src/modules/settings/routes/data-model/field-detail/components/actions.vue delete mode 100644 app/src/modules/settings/routes/data-model/field-detail/components/field.vue delete mode 100644 app/src/modules/settings/routes/data-model/field-detail/components/relationship-m2a.vue delete mode 100644 app/src/modules/settings/routes/data-model/field-detail/components/relationship-m2m.vue delete mode 100644 app/src/modules/settings/routes/data-model/field-detail/components/relationship-m2o.vue delete mode 100644 app/src/modules/settings/routes/data-model/field-detail/components/relationship-o2m.vue delete mode 100644 app/src/modules/settings/routes/data-model/field-detail/components/relationship.vue delete mode 100644 app/src/modules/settings/routes/data-model/field-detail/components/tabs.vue delete mode 100644 app/src/modules/settings/routes/data-model/field-detail/components/translations.vue create mode 100644 app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-actions.vue rename app/src/modules/settings/routes/data-model/field-detail/{components/conditions.vue => field-detail-advanced/field-detail-advanced-conditions.vue} (69%) rename app/src/modules/settings/routes/data-model/field-detail/{components/display.vue => field-detail-advanced/field-detail-advanced-display.vue} (55%) create mode 100644 app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-field.vue rename app/src/modules/settings/routes/data-model/field-detail/{components/interface.vue => field-detail-advanced/field-detail-advanced-interface.vue} (56%) create mode 100644 app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-m2a.vue create mode 100644 app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-m2m.vue create mode 100644 app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-m2o.vue create mode 100644 app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-o2m.vue create mode 100644 app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship-translations.vue create mode 100644 app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-relationship.vue rename app/src/modules/settings/routes/data-model/field-detail/{components/schema.vue => field-detail-advanced/field-detail-advanced-schema.vue} (65%) create mode 100644 app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced-tabs.vue create mode 100644 app/src/modules/settings/routes/data-model/field-detail/field-detail-advanced/field-detail-advanced.vue create mode 100644 app/src/modules/settings/routes/data-model/field-detail/field-detail-simple/field-configuration.vue create mode 100644 app/src/modules/settings/routes/data-model/field-detail/field-detail-simple/field-detail-simple.vue create mode 100644 app/src/modules/settings/routes/data-model/field-detail/field-detail-simple/relationship-configuration.vue create mode 100644 app/src/modules/settings/routes/data-model/field-detail/shared/extension-options.vue create mode 100644 app/src/modules/settings/routes/data-model/field-detail/shared/related-collection-select.vue create mode 100644 app/src/modules/settings/routes/data-model/field-detail/shared/related-field-select.vue delete mode 100644 app/src/modules/settings/routes/data-model/field-detail/store.ts create mode 100644 app/src/modules/settings/routes/data-model/field-detail/store/alterations/file.ts create mode 100644 app/src/modules/settings/routes/data-model/field-detail/store/alterations/files.ts create mode 100644 app/src/modules/settings/routes/data-model/field-detail/store/alterations/global.ts create mode 100644 app/src/modules/settings/routes/data-model/field-detail/store/alterations/group.ts create mode 100644 app/src/modules/settings/routes/data-model/field-detail/store/alterations/m2a.ts create mode 100644 app/src/modules/settings/routes/data-model/field-detail/store/alterations/m2m.ts create mode 100644 app/src/modules/settings/routes/data-model/field-detail/store/alterations/m2o.ts create mode 100644 app/src/modules/settings/routes/data-model/field-detail/store/alterations/o2m.ts create mode 100644 app/src/modules/settings/routes/data-model/field-detail/store/alterations/presentation.ts create mode 100644 app/src/modules/settings/routes/data-model/field-detail/store/alterations/standard.ts create mode 100644 app/src/modules/settings/routes/data-model/field-detail/store/alterations/translations.ts create mode 100644 app/src/modules/settings/routes/data-model/field-detail/store/index.ts create mode 100644 app/src/modules/settings/routes/data-model/field-detail/store/types.ts diff --git a/api/src/constants.ts b/api/src/constants.ts index 2fec591861..56729b3210 100644 --- a/api/src/constants.ts +++ b/api/src/constants.ts @@ -40,7 +40,7 @@ export const ASSET_TRANSFORM_QUERY_KEYS = [ export const FILTER_VARIABLES = ['$NOW', '$CURRENT_USER', '$CURRENT_ROLE']; -export const ALIAS_TYPES = ['alias', 'o2m', 'm2m', 'm2a', 'files', 'files', 'translations']; +export const ALIAS_TYPES = ['alias', 'o2m', 'm2m', 'm2a', 'files', 'translations']; export const DEFAULT_AUTH_PROVIDER = 'default'; diff --git a/api/src/services/graphql.ts b/api/src/services/graphql.ts index 595c5a2e27..716c68d7f3 100644 --- a/api/src/services/graphql.ts +++ b/api/src/services/graphql.ts @@ -410,7 +410,7 @@ export class GraphQLService { acc[field.field] = { type, description: field.note, - resolve: (obj: Record, _, __, info) => { + resolve: (obj: Record) => { return obj[field.field]; }, }; diff --git a/app/src/components/v-button/v-button.vue b/app/src/components/v-button/v-button.vue index 211bf01b86..2383b13e62 100644 --- a/app/src/components/v-button/v-button.vue +++ b/app/src/components/v-button/v-button.vue @@ -200,7 +200,7 @@ export default defineComponent({ --v-button-background-color: var(--primary); --v-button-background-color-hover: var(--primary-125); --v-button-background-color-active: var(--primary); - --v-button-background-color-disabled: var(--background-normal); + --v-button-background-color-disabled: var(--background-subdued); --v-button-font-size: 16px; --v-button-font-weight: 600; --v-button-line-height: 22px; diff --git a/app/src/components/v-checkbox/v-checkbox.vue b/app/src/components/v-checkbox/v-checkbox.vue index 89c1e03e58..3d61209b3c 100644 --- a/app/src/components/v-checkbox/v-checkbox.vue +++ b/app/src/components/v-checkbox/v-checkbox.vue @@ -31,7 +31,7 @@ export default defineComponent({ }, modelValue: { type: [Boolean, Array], - default: false, + default: null, }, label: { type: String, @@ -86,6 +86,8 @@ export default defineComponent({ const icon = computed(() => { if (props.indeterminate === true) return props.iconIndeterminate; + if (props.checked === null && props.modelValue === null) return props.iconIndeterminate; + return isChecked.value ? props.iconOn : props.iconOff; }); @@ -175,6 +177,7 @@ body { width: 100%; height: var(--input-height); padding: 10px; // 14 - 4 (border) + background-color: var(--background-page); border: var(--border-width) solid var(--border-normal); border-radius: var(--border-radius); transition: all var(--fast) var(--transition); diff --git a/app/src/components/v-field-template/v-field-template.vue b/app/src/components/v-field-template/v-field-template.vue index 66f7edcc4d..bd318efa95 100644 --- a/app/src/components/v-field-template/v-field-template.vue +++ b/app/src/components/v-field-template/v-field-template.vue @@ -52,7 +52,7 @@ export default defineComponent({ }, collection: { type: String, - required: true, + default: null, }, depth: { type: Number, diff --git a/app/src/components/v-input/v-input.vue b/app/src/components/v-input/v-input.vue index 7e7fe1b7f6..8f6dfabbbc 100644 --- a/app/src/components/v-input/v-input.vue +++ b/app/src/components/v-input/v-input.vue @@ -86,7 +86,7 @@ export default defineComponent({ default: true, }, placeholder: { - type: String, + type: [String, Number], default: null, }, modelValue: { diff --git a/app/src/constants.ts b/app/src/constants.ts index 5ec6f044be..1d5e05fb4f 100644 --- a/app/src/constants.ts +++ b/app/src/constants.ts @@ -1,3 +1,5 @@ +import { Type } from '@directus/shared/types'; + export const VALIDATION_TYPES = ['FAILED_VALIDATION', 'RECORD_NOT_UNIQUE']; export const DIRECTUS_LOGO = ` @@ -70,4 +72,76 @@ export const MODULE_BAR_DEFAULT = [ }, ]; +export const FIELD_TYPES_SELECT: Array<{ value: Type; text: string } | { divider: true }> = [ + { + text: '$t:string', + value: 'string', + }, + { + text: '$t:text', + value: 'text', + }, + { divider: true }, + { + text: '$t:boolean', + value: 'boolean', + }, + { divider: true }, + { + text: '$t:integer', + value: 'integer', + }, + { + text: '$t:bigInteger', + value: 'bigInteger', + }, + { + text: '$t:float', + value: 'float', + }, + { + text: '$t:decimal', + value: 'decimal', + }, + { divider: true }, + { + text: '$t:geometry', + value: 'geometry', + }, + { divider: true }, + { + text: '$t:timestamp', + value: 'timestamp', + }, + { + text: '$t:datetime', + value: 'dateTime', + }, + { + text: '$t:date', + value: 'date', + }, + { + text: '$t:time', + value: 'time', + }, + { divider: true }, + { + text: '$t:json', + value: 'json', + }, + { + text: '$t:csv', + value: 'csv', + }, + { + text: '$t:uuid', + value: 'uuid', + }, + { + text: '$t:hash', + value: 'hash', + }, +]; + export const AUTH_SSO_DRIVERS = ['oauth2', 'openid']; diff --git a/app/src/displays/file/index.ts b/app/src/displays/file/index.ts index 1610d61607..7071792eb1 100644 --- a/app/src/displays/file/index.ts +++ b/app/src/displays/file/index.ts @@ -8,7 +8,7 @@ export default defineDisplay({ icon: 'insert_drive_file', component: DisplayFile, types: ['uuid'], - groups: ['file'], + localTypes: ['file'], options: [], fields: ['id', 'type', 'title'], }); diff --git a/app/src/displays/image/index.ts b/app/src/displays/image/index.ts index fad5caf564..49e71ed79e 100644 --- a/app/src/displays/image/index.ts +++ b/app/src/displays/image/index.ts @@ -6,7 +6,7 @@ export default defineDisplay({ name: '$t:displays.image.image', description: '$t:displays.image.description', types: ['uuid'], - groups: ['file'], + localTypes: ['file'], icon: 'insert_photo', component: DisplayImage, options: [ diff --git a/app/src/displays/raw/index.ts b/app/src/displays/raw/index.ts index 4e0fba1f8d..b1209469d8 100644 --- a/app/src/displays/raw/index.ts +++ b/app/src/displays/raw/index.ts @@ -8,5 +8,5 @@ export default defineDisplay({ component: ({ value }) => String(value), options: [], types: TYPES, - groups: ['file', 'files', 'group', 'm2a', 'm2m', 'm2o', 'o2m', 'presentation', 'standard', 'translations'], + localTypes: ['file', 'files', 'group', 'm2a', 'm2m', 'm2o', 'o2m', 'presentation', 'standard', 'translations'], }); diff --git a/app/src/displays/related-values/index.ts b/app/src/displays/related-values/index.ts index edbc920e8e..ad536cb6bd 100644 --- a/app/src/displays/related-values/index.ts +++ b/app/src/displays/related-values/index.ts @@ -18,7 +18,7 @@ export default defineDisplay({ component: DisplayRelatedValues, options: options, types: ['alias', 'string', 'uuid', 'integer', 'bigInteger', 'json'], - groups: ['m2m', 'm2o', 'o2m', 'translations', 'm2a'], + localTypes: ['m2m', 'm2o', 'o2m', 'translations', 'm2a'], fields: (options: Options | null, { field, collection }) => { const relatedCollection = getRelatedCollection(collection, field); const fieldsStore = useFieldsStore(); diff --git a/app/src/displays/translations/index.ts b/app/src/displays/translations/index.ts index 907bb05845..69025e3c2c 100644 --- a/app/src/displays/translations/index.ts +++ b/app/src/displays/translations/index.ts @@ -18,7 +18,7 @@ export default defineDisplay({ component: DisplayTranslations, options: options, types: ['alias'], - groups: ['translations'], + localTypes: ['translations'], fields: (options: Options | null, { field, collection }) => { const fieldsStore = useFieldsStore(); const relationsStore = useRelationsStore(); diff --git a/app/src/interfaces/_system/system-display-template/system-display-template.vue b/app/src/interfaces/_system/system-display-template/system-display-template.vue index 7649080b31..989792f622 100644 --- a/app/src/interfaces/_system/system-display-template/system-display-template.vue +++ b/app/src/interfaces/_system/system-display-template/system-display-template.vue @@ -1,11 +1,9 @@