From 882bfda164ebe60d32e537564f2ae85e9c3d52bf Mon Sep 17 00:00:00 2001 From: Nitwel Date: Fri, 4 Sep 2020 11:04:31 +0200 Subject: [PATCH 01/34] add trim, mask and clean up text-input --- app/src/components/v-input/readme.md | 1 + app/src/components/v-input/v-input.vue | 8 +++++ app/src/interfaces/text-input/index.ts | 31 +++++++++++++++++++- app/src/interfaces/text-input/text-input.vue | 5 ++-- app/src/lang/en-US/index.json | 1 + 5 files changed, 43 insertions(+), 3 deletions(-) diff --git a/app/src/components/v-input/readme.md b/app/src/components/v-input/readme.md index 0996e227d0..c0f740303d 100644 --- a/app/src/components/v-input/readme.md +++ b/app/src/components/v-input/readme.md @@ -24,6 +24,7 @@ You can add any custom (text) prefix/suffix to the value in the input using the | `slug` | Force the value to be URL safe | `false` | | `slug-separator` | What character to use as separator in slugs | `-` | | `active` | Force the focus state | `false` | +| `trim` | Trim the start and end whitespace | `false` | Note: all other attached attributes are bound to the input HTMLELement in the component. This allows you to attach any of the standard HTML attributes like `min`, `length`, or `pattern`. diff --git a/app/src/components/v-input/v-input.vue b/app/src/components/v-input/v-input.vue index 6dc5cc2a69..28e6e0c82a 100644 --- a/app/src/components/v-input/v-input.vue +++ b/app/src/components/v-input/v-input.vue @@ -121,6 +121,10 @@ export default defineComponent({ type: Boolean, default: false, }, + trim: { + type: Boolean, + default: true, + }, }, setup(props, { emit, listeners }) { const input = ref(null); @@ -177,6 +181,10 @@ export default defineComponent({ function emitValue(event: InputEvent) { let value = (event.target as HTMLInputElement).value; + if (props.trim === true) { + value = value.trim(); + } + if (props.slug === true) { const endsWithSpace = value.endsWith(' '); value = slugify(value, { separator: props.slugSeparator }); diff --git a/app/src/interfaces/text-input/index.ts b/app/src/interfaces/text-input/index.ts index 83403f94b5..4ea1f7a1d1 100644 --- a/app/src/interfaces/text-input/index.ts +++ b/app/src/interfaces/text-input/index.ts @@ -22,10 +22,10 @@ export default defineInterface(({ i18n }) => ({ { field: 'font', name: i18n.t('font'), + type: 'string', meta: { width: 'half', interface: 'dropdown', - default: 'sans-serif', options: { choices: [ { text: i18n.t('sans_serif'), value: 'sans-serif' }, @@ -34,10 +34,14 @@ export default defineInterface(({ i18n }) => ({ ], }, }, + schema: { + default_value: 'sans-serif', + }, }, { field: 'iconLeft', name: i18n.t('icon_left'), + type: 'string', meta: { width: 'half', interface: 'icon', @@ -46,10 +50,35 @@ export default defineInterface(({ i18n }) => ({ { field: 'iconRight', name: i18n.t('icon_right'), + type: 'string', meta: { width: 'half', interface: 'icon', }, }, + { + field: 'trim', + name: i18n.t('trimed'), + type: 'boolean', + meta: { + width: 'half', + interface: 'toggle', + }, + schema: { + default_value: false, + }, + }, + { + field: 'mask', + name: i18n.t('masked'), + type: 'boolean', + meta: { + width: 'half', + interface: 'toggle', + }, + schema: { + default_value: false, + }, + }, ], })); diff --git a/app/src/interfaces/text-input/text-input.vue b/app/src/interfaces/text-input/text-input.vue index da8dda915a..c036812235 100644 --- a/app/src/interfaces/text-input/text-input.vue +++ b/app/src/interfaces/text-input/text-input.vue @@ -3,9 +3,10 @@ :value="value" :placeholder="placeholder" :disabled="disabled" + :trim="trim" :type="masked ? 'password' : 'text'" :class="font" - :maxlength="length" + :max="length" @input="$listeners.input" > @@ -67,7 +68,7 @@ export default defineComponent({ default: 'sans-serif', }, length: { - type: [Number, String], + type: Number, default: null, }, }, diff --git a/app/src/lang/en-US/index.json b/app/src/lang/en-US/index.json index d8e09681f0..4535c9c559 100644 --- a/app/src/lang/en-US/index.json +++ b/app/src/lang/en-US/index.json @@ -592,6 +592,7 @@ "step_interval": "Step Interval", "icon_left": "Icon Left", "icon_right": "Icon Right", + "trimed": "Trimed", "font_family": "Font Family", "font": "Font", "numeric": "Numeric", From b9d152a26ca53cbbd157506e6cb4b825876d3255 Mon Sep 17 00:00:00 2001 From: Nitwel Date: Fri, 4 Sep 2020 11:10:44 +0200 Subject: [PATCH 02/34] fix textarea options --- app/src/interfaces/textarea/index.ts | 42 ++++++++++++++++-------- app/src/interfaces/textarea/textarea.vue | 6 ++-- 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/app/src/interfaces/textarea/index.ts b/app/src/interfaces/textarea/index.ts index 806a8dbf11..322b24b3b3 100644 --- a/app/src/interfaces/textarea/index.ts +++ b/app/src/interfaces/textarea/index.ts @@ -11,27 +11,41 @@ export default defineInterface(({ i18n }) => ({ { field: 'placeholder', name: i18n.t('placeholder'), - width: 'half', - interface: 'text-input', + type: 'string', + meta: { + width: 'half', + interface: 'text-input', + }, }, { field: 'trim', - name: i18n.t('trim'), - width: 'half', - interface: 'switch', + name: i18n.t('trimed'), + type: 'boolean', + meta: { + width: 'half', + interface: 'toggle', + }, + schema: { + default_value: false, + }, }, { field: 'font', name: i18n.t('font'), - width: 'half', - interface: 'dropdown', - default: 'sans-serif', - options: { - choices: [ - { text: i18n.t('sans_serif'), value: 'sans-serif' }, - { text: i18n.t('monospace'), value: 'monospace' }, - { text: i18n.t('serif'), value: 'serif' }, - ], + type: 'string', + meta: { + width: 'half', + interface: 'dropdown', + options: { + choices: [ + { text: i18n.t('sans_serif'), value: 'sans-serif' }, + { text: i18n.t('monospace'), value: 'monospace' }, + { text: i18n.t('serif'), value: 'serif' }, + ], + }, + }, + schema: { + default_value: 'sans-serif', }, }, ], diff --git a/app/src/interfaces/textarea/textarea.vue b/app/src/interfaces/textarea/textarea.vue index 96b929ca6d..713056ac9c 100644 --- a/app/src/interfaces/textarea/textarea.vue +++ b/app/src/interfaces/textarea/textarea.vue @@ -40,15 +40,15 @@ export default defineComponent({ From 30b10ec8af6e825070bf0ceacda943a34565ea4e Mon Sep 17 00:00:00 2001 From: Nitwel Date: Fri, 4 Sep 2020 11:37:54 +0200 Subject: [PATCH 03/34] fix code template and wysiwyg options --- app/src/interfaces/code/code.vue | 3 ++- app/src/interfaces/wysiwyg/index.ts | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/app/src/interfaces/code/code.vue b/app/src/interfaces/code/code.vue index b50c7f7a69..621a93d341 100644 --- a/app/src/interfaces/code/code.vue +++ b/app/src/interfaces/code/code.vue @@ -268,7 +268,8 @@ export default defineComponent({ }; function fillTemplate() { - emit('input', props.template); + const parse = JSON.parse(props.template); + emit('input', parse || props.template); } }, }); diff --git a/app/src/interfaces/wysiwyg/index.ts b/app/src/interfaces/wysiwyg/index.ts index 9e2430e695..c97db33eef 100644 --- a/app/src/interfaces/wysiwyg/index.ts +++ b/app/src/interfaces/wysiwyg/index.ts @@ -36,6 +36,7 @@ export default defineInterface(({ i18n }) => ({ width: 'half', interface: 'dropdown-multiselect', options: { + closeOnContentClick: false, choices: [ { value: 'aligncenter', @@ -224,7 +225,6 @@ export default defineInterface(({ i18n }) => ({ meta: { width: 'half', interface: 'dropdown', - default: 'sans-serif', options: { choices: [ { text: i18n.t('sans_serif'), value: 'sans-serif' }, @@ -233,6 +233,9 @@ export default defineInterface(({ i18n }) => ({ ], }, }, + schema: { + default_value: 'sans-serif', + }, }, { field: 'customFormats', From dcb38ecb31c71c1892b7294c22b70003e7f6587a Mon Sep 17 00:00:00 2001 From: Nitwel Date: Fri, 4 Sep 2020 12:14:38 +0200 Subject: [PATCH 04/34] fix creating and options of toggle --- app/src/interfaces/toggle/index.ts | 13 +++--- .../field-detail/components/schema.vue | 41 ++++++++++++++----- 2 files changed, 37 insertions(+), 17 deletions(-) diff --git a/app/src/interfaces/toggle/index.ts b/app/src/interfaces/toggle/index.ts index e299a2762c..1dd0ac219d 100644 --- a/app/src/interfaces/toggle/index.ts +++ b/app/src/interfaces/toggle/index.ts @@ -15,8 +15,7 @@ export default defineInterface(({ i18n }) => ({ meta: { width: 'half', interface: 'icon', - default_value: 'check_box_outline_blank', - } + }, }, { field: 'iconOn', @@ -25,8 +24,7 @@ export default defineInterface(({ i18n }) => ({ meta: { width: 'half', interface: 'icon', - default_value: 'check_box', - } + }, }, { field: 'label', @@ -35,8 +33,10 @@ export default defineInterface(({ i18n }) => ({ meta: { width: 'half', interface: 'text-input', + }, + schema: { default_value: i18n.t('active'), - } + }, }, { field: 'color', @@ -45,8 +45,7 @@ export default defineInterface(({ i18n }) => ({ meta: { width: 'half', interface: 'color', - default_value: 'var(--primary)', - } + }, }, ], })); diff --git a/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue b/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue index 831f0c67c0..09da260524 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue +++ b/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue @@ -42,11 +42,7 @@
{{ $t('default_value') }}
- +
@@ -167,13 +163,38 @@ export default defineComponent({ return i18n.t('choose_a_type'); }); - return { fieldData: state.fieldData, typesWithLabels, setType, typeDisabled, typePlaceholder }; + const default_value = computed({ + get() { + switch (state.fieldData.type) { + case 'boolean': + return String(state.fieldData.schema.default_value || false); + default: + return state.fieldData.schema.default_value; + } + }, + set(newVal: string) { + switch (state.fieldData.type) { + case 'boolean': + state.fieldData.schema.default_value = Boolean(newVal); + default: + return state.fieldData.schema.default_value; + } + }, + }); + + return { fieldData: state.fieldData, typesWithLabels, setType, typeDisabled, typePlaceholder, default_value }; function setType(value: typeof types[number]) { - if (value === 'uuid') { - state.fieldData.meta.special = 'uuid'; - } else { - state.fieldData.meta.special = null; + switch (value) { + case 'uuid': + state.fieldData.meta.special = 'uuid'; + break; + case 'boolean': + state.fieldData.meta.special = 'boolean'; + state.fieldData.schema.is_nullable = false; + break; + default: + state.fieldData.meta.special = null; } // We'll reset the interface/display as they most likely won't work for the newly selected From 2f150873112403b27403b303d905ff6e0199deaf Mon Sep 17 00:00:00 2001 From: Nitwel Date: Fri, 4 Sep 2020 12:53:05 +0200 Subject: [PATCH 05/34] v-input returns numbers when type number and update numeric --- app/src/components/v-input/v-input.vue | 38 +++++++++++--------- app/src/interfaces/numeric/index.ts | 3 ++ app/src/interfaces/numeric/numeric.vue | 2 +- app/src/interfaces/text-input/text-input.vue | 1 - 4 files changed, 25 insertions(+), 19 deletions(-) diff --git a/app/src/components/v-input/v-input.vue b/app/src/components/v-input/v-input.vue index 28e6e0c82a..5a922bed32 100644 --- a/app/src/components/v-input/v-input.vue +++ b/app/src/components/v-input/v-input.vue @@ -181,24 +181,28 @@ export default defineComponent({ function emitValue(event: InputEvent) { let value = (event.target as HTMLInputElement).value; - if (props.trim === true) { - value = value.trim(); - } + if (props.type === 'text') { + if (props.trim === true) { + value = value.trim(); + } - if (props.slug === true) { - const endsWithSpace = value.endsWith(' '); - value = slugify(value, { separator: props.slugSeparator }); - if (endsWithSpace) value += props.slugSeparator; - } + if (props.slug === true) { + const endsWithSpace = value.endsWith(' '); + value = slugify(value, { separator: props.slugSeparator }); + if (endsWithSpace) value += props.slugSeparator; + } - if (props.dbSafe === true) { - value = value.toLowerCase(); - value = value.replace(/\s/g, '_'); - // Replace é -> e etc - value = value.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); - } + if (props.dbSafe === true) { + value = value.toLowerCase(); + value = value.replace(/\s/g, '_'); + // Replace é -> e etc + value = value.normalize('NFD').replace(/[\u0300-\u036f]/g, ''); + } - emit('input', value); + emit('input', value); + } else if (props.type === 'number') { + emit('input', Number(value)); + } } function stepUp() { @@ -209,7 +213,7 @@ export default defineComponent({ input.value.stepUp(); if (input.value.value) { - return emit('input', input.value.value); + return emit('input', Number(input.value.value)); } } @@ -221,7 +225,7 @@ export default defineComponent({ input.value.stepDown(); if (input.value.value) { - return emit('input', input.value.value); + return emit('input', Number(input.value.value)); } else { return emit('input', props.min || 0); } diff --git a/app/src/interfaces/numeric/index.ts b/app/src/interfaces/numeric/index.ts index ec5b13600a..1803e3356b 100644 --- a/app/src/interfaces/numeric/index.ts +++ b/app/src/interfaces/numeric/index.ts @@ -34,6 +34,9 @@ export default defineInterface(({ i18n }) => ({ width: 'half', interface: 'numeric', }, + schema: { + default_value: 1, + }, }, { field: 'placeholder', diff --git a/app/src/interfaces/numeric/numeric.vue b/app/src/interfaces/numeric/numeric.vue index 897f9cebbe..342f46afa9 100644 --- a/app/src/interfaces/numeric/numeric.vue +++ b/app/src/interfaces/numeric/numeric.vue @@ -25,7 +25,7 @@ import { defineComponent, PropType } from '@vue/composition-api'; export default defineComponent({ props: { value: { - type: [Number, String], + type: Number, default: null, }, disabled: { diff --git a/app/src/interfaces/text-input/text-input.vue b/app/src/interfaces/text-input/text-input.vue index c036812235..a966c608e1 100644 --- a/app/src/interfaces/text-input/text-input.vue +++ b/app/src/interfaces/text-input/text-input.vue @@ -6,7 +6,6 @@ :trim="trim" :type="masked ? 'password' : 'text'" :class="font" - :max="length" @input="$listeners.input" > From d33bb3fbc2287b09cdc944273737b1d328cfdc16 Mon Sep 17 00:00:00 2001 From: Nitwel Date: Fri, 4 Sep 2020 13:35:36 +0200 Subject: [PATCH 06/34] update divider --- app/src/interfaces/divider/divider.vue | 5 +++++ app/src/interfaces/divider/index.ts | 15 ++++++++++++--- app/src/lang/en-US/index.json | 1 + 3 files changed, 18 insertions(+), 3 deletions(-) diff --git a/app/src/interfaces/divider/divider.vue b/app/src/interfaces/divider/divider.vue index 5b208932eb..92514f090b 100644 --- a/app/src/interfaces/divider/divider.vue +++ b/app/src/interfaces/divider/divider.vue @@ -7,6 +7,7 @@ '--v-divider-label-color': color, }" large + :inlineTitle="inlineTitle" > @@ -30,6 +31,10 @@ export default defineComponent({ type: String, default: null, }, + inlineTitle: { + type: Boolean, + default: false, + }, }, }); diff --git a/app/src/interfaces/divider/index.ts b/app/src/interfaces/divider/index.ts index 7fd2be2b6a..93a0beb017 100644 --- a/app/src/interfaces/divider/index.ts +++ b/app/src/interfaces/divider/index.ts @@ -17,7 +17,7 @@ export default defineInterface(({ i18n }) => ({ meta: { width: 'half', interface: 'color', - } + }, }, { field: 'icon', @@ -26,7 +26,7 @@ export default defineInterface(({ i18n }) => ({ meta: { width: 'half', interface: 'icon', - } + }, }, { field: 'title', @@ -35,7 +35,16 @@ export default defineInterface(({ i18n }) => ({ meta: { width: 'half', interface: 'text-input', - } + }, + }, + { + field: 'inlineTitle', + name: i18n.t('inline_title'), + type: 'boolean', + meta: { + width: 'half', + interface: 'toggle', + }, }, ], })); diff --git a/app/src/lang/en-US/index.json b/app/src/lang/en-US/index.json index 4535c9c559..7b17751c38 100644 --- a/app/src/lang/en-US/index.json +++ b/app/src/lang/en-US/index.json @@ -489,6 +489,7 @@ "formatted_value": "Formatted Value", "format_title": "Format Title", + "inline_title": "Inline Title", "auto_format_casing": "Auto-format casing", "errors": { From 0ca8952aad5342937fe884d6b318b7c9ac60ceaf Mon Sep 17 00:00:00 2001 From: Nitwel Date: Fri, 4 Sep 2020 19:15:08 +0200 Subject: [PATCH 07/34] fix tags not rendering at all --- app/src/interfaces/tags/tags.vue | 4 +++- .../routes/data-model/field-detail/components/schema.vue | 3 +++ 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/app/src/interfaces/tags/tags.vue b/app/src/interfaces/tags/tags.vue index cc66256114..d18e1d63eb 100644 --- a/app/src/interfaces/tags/tags.vue +++ b/app/src/interfaces/tags/tags.vue @@ -52,7 +52,7 @@ export default defineComponent({ }, value: { type: Array as PropType, - default: null, + default: () => [], }, placeholder: { type: String, @@ -117,6 +117,8 @@ export default defineComponent({ }); function processArray(array: string[]): string[] { + if (!Array.isArray(array)) return []; + array = array.map((val) => (props.lowercase ? val.toLowerCase().trim() : val.trim())); if (props.alphabetize) { diff --git a/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue b/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue index 09da260524..7e2a4a0d82 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue +++ b/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue @@ -189,6 +189,9 @@ export default defineComponent({ case 'uuid': state.fieldData.meta.special = 'uuid'; break; + case 'json': + state.fieldData.meta.special = 'json'; + break; case 'boolean': state.fieldData.meta.special = 'boolean'; state.fieldData.schema.is_nullable = false; From b0c9fb5e33bffb2960dac782e397caad55102556 Mon Sep 17 00:00:00 2001 From: Nitwel Date: Fri, 4 Sep 2020 20:57:55 +0200 Subject: [PATCH 08/34] fix if of input and update dropdown-multi and radio-buttons --- app/src/components/v-input/v-input.vue | 2 +- .../interfaces/dropdown-multiselect/index.ts | 11 ++++++++++ app/src/interfaces/notice/index.ts | 21 +++++++++++-------- app/src/interfaces/radio-buttons/index.ts | 11 ++-------- 4 files changed, 26 insertions(+), 19 deletions(-) diff --git a/app/src/components/v-input/v-input.vue b/app/src/components/v-input/v-input.vue index 5a922bed32..97621470fc 100644 --- a/app/src/components/v-input/v-input.vue +++ b/app/src/components/v-input/v-input.vue @@ -212,7 +212,7 @@ export default defineComponent({ input.value.stepUp(); - if (input.value.value) { + if (input.value.value != null) { return emit('input', Number(input.value.value)); } } diff --git a/app/src/interfaces/dropdown-multiselect/index.ts b/app/src/interfaces/dropdown-multiselect/index.ts index 317656194e..272671e866 100644 --- a/app/src/interfaces/dropdown-multiselect/index.ts +++ b/app/src/interfaces/dropdown-multiselect/index.ts @@ -23,6 +23,7 @@ export default defineInterface(({ i18n }) => ({ type: 'string', name: i18n.t('text'), meta: { + width: 'half', interface: 'text-input', }, }, @@ -31,6 +32,7 @@ export default defineInterface(({ i18n }) => ({ type: 'string', name: i18n.t('value'), meta: { + width: 'half', interface: 'text-input', options: { font: 'monospace', @@ -61,6 +63,15 @@ export default defineInterface(({ i18n }) => ({ default_value: false, }, }, + { + field: 'placeholder', + name: i18n.t('placeholder'), + type: 'string', + meta: { + width: 'half', + interface: 'text-input', + }, + }, { field: 'icon', name: i18n.t('icon'), diff --git a/app/src/interfaces/notice/index.ts b/app/src/interfaces/notice/index.ts index d42a1d52bd..9e3e81b439 100644 --- a/app/src/interfaces/notice/index.ts +++ b/app/src/interfaces/notice/index.ts @@ -19,15 +19,15 @@ export default defineInterface(({ i18n }) => ({ interface: 'dropdown', default_value: 'normal', options: { - items: [ - { itemText: i18n.t('normal'), itemValue: 'normal' }, - { itemText: i18n.t('info'), itemValue: 'info' }, - { itemText: i18n.t('success'), itemValue: 'success' }, - { itemText: i18n.t('warning'), itemValue: 'warning' }, - { itemText: i18n.t('danger'), itemValue: 'danger' }, + choices: [ + { text: i18n.t('normal'), value: 'normal' }, + { text: i18n.t('info'), value: 'info' }, + { text: i18n.t('success'), value: 'success' }, + { text: i18n.t('warning'), value: 'warning' }, + { text: i18n.t('danger'), value: 'danger' }, ], }, - } + }, }, { field: 'icon', @@ -36,7 +36,7 @@ export default defineInterface(({ i18n }) => ({ meta: { width: 'half', interface: 'icon', - } + }, }, { field: 'text', @@ -45,7 +45,10 @@ export default defineInterface(({ i18n }) => ({ meta: { width: 'full', interface: 'textarea', - } + options: { + placeholder: 'Enter notice content here...', + }, + }, }, ], })); diff --git a/app/src/interfaces/radio-buttons/index.ts b/app/src/interfaces/radio-buttons/index.ts index 62bd9d2bc7..6e49adcfea 100644 --- a/app/src/interfaces/radio-buttons/index.ts +++ b/app/src/interfaces/radio-buttons/index.ts @@ -23,6 +23,7 @@ export default defineInterface(({ i18n }) => ({ type: 'string', name: i18n.t('text'), meta: { + width: 'half', interface: 'text-input', }, }, @@ -31,6 +32,7 @@ export default defineInterface(({ i18n }) => ({ type: 'string', name: i18n.t('value'), meta: { + width: 'half', interface: 'text-input', options: { font: 'monospace', @@ -49,9 +51,6 @@ export default defineInterface(({ i18n }) => ({ width: 'half', interface: 'icon', }, - schema: { - default_value: 'radio_button_checked', - }, }, { field: 'iconOff', @@ -61,9 +60,6 @@ export default defineInterface(({ i18n }) => ({ width: 'half', interface: 'icon', }, - schema: { - default_value: 'radio_button_unchecked', - }, }, { field: 'color', @@ -73,9 +69,6 @@ export default defineInterface(({ i18n }) => ({ width: 'half', interface: 'color', }, - schema: { - default_value: '#2f80ed', - }, }, { field: 'allowOther', From 6d74273a8eca0aa41db410a081f8543c13ddbab4 Mon Sep 17 00:00:00 2001 From: Nitwel Date: Fri, 4 Sep 2020 21:19:56 +0200 Subject: [PATCH 09/34] undo tags fix --- app/src/interfaces/tags/tags.vue | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/src/interfaces/tags/tags.vue b/app/src/interfaces/tags/tags.vue index d18e1d63eb..f1aae20fcf 100644 --- a/app/src/interfaces/tags/tags.vue +++ b/app/src/interfaces/tags/tags.vue @@ -117,8 +117,6 @@ export default defineComponent({ }); function processArray(array: string[]): string[] { - if (!Array.isArray(array)) return []; - array = array.map((val) => (props.lowercase ? val.toLowerCase().trim() : val.trim())); if (props.alphabetize) { From 8b5d9d4df3f2acaeb0aa952c7c011817e61bf50a Mon Sep 17 00:00:00 2001 From: Nitwel Date: Sat, 5 Sep 2020 00:25:55 +0200 Subject: [PATCH 10/34] fix v-input not emiting --- app/src/components/v-input/v-input.vue | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/components/v-input/v-input.vue b/app/src/components/v-input/v-input.vue index 97621470fc..4c9ee4a898 100644 --- a/app/src/components/v-input/v-input.vue +++ b/app/src/components/v-input/v-input.vue @@ -181,7 +181,9 @@ export default defineComponent({ function emitValue(event: InputEvent) { let value = (event.target as HTMLInputElement).value; - if (props.type === 'text') { + if (props.type === 'number') { + emit('input', Number(value)); + } else { if (props.trim === true) { value = value.trim(); } @@ -200,8 +202,6 @@ export default defineComponent({ } emit('input', value); - } else if (props.type === 'number') { - emit('input', Number(value)); } } From 2e6673fdab6885b18bfacddb6e333f8a1fca4fde Mon Sep 17 00:00:00 2001 From: Nitwel Date: Mon, 7 Sep 2020 10:19:37 +0200 Subject: [PATCH 11/34] add better support for default values --- app/src/lang/en-US/index.json | 2 + .../field-detail/components/schema.vue | 95 +++++++++++++------ .../routes/data-model/field-detail/store.ts | 19 ++++ 3 files changed, 87 insertions(+), 29 deletions(-) diff --git a/app/src/lang/en-US/index.json b/app/src/lang/en-US/index.json index 7b17751c38..f79cc6c65e 100644 --- a/app/src/lang/en-US/index.json +++ b/app/src/lang/en-US/index.json @@ -373,6 +373,8 @@ "primary_key_field": "Primary Key Field", "type": "Type", "number": "Number", + "true": "True", + "false": "False", "creating_new_collection": "Creating New Collection", "status": "Status", "sort": "Sort", diff --git a/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue b/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue index 7e2a4a0d82..efefa247c8 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue +++ b/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue @@ -40,9 +40,47 @@
-
+
{{ $t('default_value') }}
- + + + + + +
@@ -165,39 +203,37 @@ export default defineComponent({ const default_value = computed({ get() { - switch (state.fieldData.type) { - case 'boolean': - return String(state.fieldData.schema.default_value || false); - default: - return state.fieldData.schema.default_value; - } + return state.fieldData.schema.default_value; }, - set(newVal: string) { - switch (state.fieldData.type) { - case 'boolean': - state.fieldData.schema.default_value = Boolean(newVal); - default: - return state.fieldData.schema.default_value; - } + set(newVal: any) { + state.fieldData.schema.default_value = newVal; }, }); - return { fieldData: state.fieldData, typesWithLabels, setType, typeDisabled, typePlaceholder, default_value }; + const default_type = computed(() => { + if (['integer', 'bigInteger', 'float', 'decimal'].includes(state.fieldData.type)) return 'number'; + else if (['string', 'uuid'].includes(state.fieldData.type)) { + return 'string'; + } else if (['timestamp', 'datetime', 'date', 'time'].includes(state.fieldData.type)) { + return 'datetime'; + } else { + return state.fieldData.type; + } + }); + + return { + fieldData: state.fieldData, + typesWithLabels, + setType, + typeDisabled, + typePlaceholder, + default_value, + default_type, + }; function setType(value: typeof types[number]) { - switch (value) { - case 'uuid': - state.fieldData.meta.special = 'uuid'; - break; - case 'json': - state.fieldData.meta.special = 'json'; - break; - case 'boolean': - state.fieldData.meta.special = 'boolean'; - state.fieldData.schema.is_nullable = false; - break; - default: - state.fieldData.meta.special = null; + if (value === 'uuid') { + state.fieldData.meta.special = 'uuid'; } // We'll reset the interface/display as they most likely won't work for the newly selected @@ -206,6 +242,7 @@ export default defineComponent({ state.fieldData.meta.options = null; state.fieldData.meta.display = null; state.fieldData.meta.display_options = null; + state.fieldData.schema.default_value = undefined; state.fieldData.type = value; } }, diff --git a/app/src/modules/settings/routes/data-model/field-detail/store.ts b/app/src/modules/settings/routes/data-model/field-detail/store.ts index 52cea1d8ac..7e9b6b935f 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/store.ts +++ b/app/src/modules/settings/routes/data-model/field-detail/store.ts @@ -291,6 +291,25 @@ function initLocalStore( delete state.fieldData.type; state.fieldData.meta.special = 'alias'; } + + if (type === 'standard') { + watch( + () => state.fieldData.type, + () => { + switch (state.fieldData.type) { + case 'json': + state.fieldData.meta.special = 'json'; + break; + case 'boolean': + state.fieldData.meta.special = 'boolean'; + state.fieldData.schema.is_nullable = false; + break; + default: + state.fieldData.meta.special = null; + } + } + ); + } } function clearLocalStore() { From fedd99e9b433a656933aebd49f2b8ea85f5d65ea Mon Sep 17 00:00:00 2001 From: Nitwel Date: Mon, 7 Sep 2020 11:22:22 +0200 Subject: [PATCH 12/34] update slug, markdown, hash, collections, code --- app/src/interfaces/code/code.vue | 8 +++-- app/src/interfaces/code/index.ts | 1 + app/src/interfaces/collections/index.ts | 3 +- app/src/interfaces/hash/index.ts | 6 ++-- app/src/interfaces/markdown/index.ts | 2 +- app/src/interfaces/slug/index.ts | 32 ++++++++++++++++++- app/src/interfaces/slug/slug.vue | 25 ++++++++++++++- .../field-detail/components/interface.vue | 19 ++++++----- 8 files changed, 79 insertions(+), 17 deletions(-) diff --git a/app/src/interfaces/code/code.vue b/app/src/interfaces/code/code.vue index 621a93d341..e712d10b8e 100644 --- a/app/src/interfaces/code/code.vue +++ b/app/src/interfaces/code/code.vue @@ -268,8 +268,12 @@ export default defineComponent({ }; function fillTemplate() { - const parse = JSON.parse(props.template); - emit('input', parse || props.template); + try { + const parse = JSON.parse(props.template); + emit('input', parse || props.template); + } catch { + // We won't stage invalid JSON + } } }, }); diff --git a/app/src/interfaces/code/index.ts b/app/src/interfaces/code/index.ts index 2636d675ac..ae64b77109 100644 --- a/app/src/interfaces/code/index.ts +++ b/app/src/interfaces/code/index.ts @@ -55,4 +55,5 @@ export default defineInterface(({ i18n }) => ({ }, }, ], + recommendedDisplays: ['raw'], })); diff --git a/app/src/interfaces/collections/index.ts b/app/src/interfaces/collections/index.ts index 7e8803eea2..5f13ab4333 100644 --- a/app/src/interfaces/collections/index.ts +++ b/app/src/interfaces/collections/index.ts @@ -21,7 +21,8 @@ export default defineInterface(({ i18n }) => ({ }, schema: { default_value: false, - } + }, }, ], + recommendedDisplays: ['collection'], })); diff --git a/app/src/interfaces/hash/index.ts b/app/src/interfaces/hash/index.ts index 451145183c..50bd3e152a 100644 --- a/app/src/interfaces/hash/index.ts +++ b/app/src/interfaces/hash/index.ts @@ -4,7 +4,7 @@ import { defineInterface } from '@/interfaces/define'; export default defineInterface(({ i18n }) => ({ id: 'hash', name: i18n.t('hash'), - icon: 'text_fields', + icon: 'fingerprint', component: InterfaceHash, types: ['string'], options: [ @@ -15,7 +15,7 @@ export default defineInterface(({ i18n }) => ({ meta: { width: 'half', interface: 'text-input', - } + }, }, { field: 'masked', @@ -24,7 +24,7 @@ export default defineInterface(({ i18n }) => ({ meta: { width: 'half', interface: 'toggle', - } + }, }, ], })); diff --git a/app/src/interfaces/markdown/index.ts b/app/src/interfaces/markdown/index.ts index 8746bf648f..35efc1df99 100644 --- a/app/src/interfaces/markdown/index.ts +++ b/app/src/interfaces/markdown/index.ts @@ -4,7 +4,7 @@ import { defineInterface } from '@/interfaces/define'; export default defineInterface(({ i18n }) => ({ id: 'markdown', name: i18n.t('markdown'), - icon: 'text_fields', + icon: 'functions', component: InterfaceMarkdown, types: ['text'], options: [ diff --git a/app/src/interfaces/slug/index.ts b/app/src/interfaces/slug/index.ts index 91080acc3b..518a0e61d6 100644 --- a/app/src/interfaces/slug/index.ts +++ b/app/src/interfaces/slug/index.ts @@ -7,5 +7,35 @@ export default defineInterface(({ i18n }) => ({ icon: 'link', component: InterfaceSlug, types: ['string'], - options: [], + options: [ + { + field: 'placeholder', + name: i18n.t('placeholder'), + meta: { + width: 'half', + interface: 'text-input', + options: { + placeholder: i18n.t('text_shown_when_no_value'), + }, + }, + }, + { + field: 'iconLeft', + name: i18n.t('icon_left'), + type: 'string', + meta: { + width: 'half', + interface: 'icon', + }, + }, + { + field: 'iconRight', + name: i18n.t('icon_right'), + type: 'string', + meta: { + width: 'half', + interface: 'icon', + }, + }, + ], })); diff --git a/app/src/interfaces/slug/slug.vue b/app/src/interfaces/slug/slug.vue index 6d10c77b90..e5c0621ee7 100644 --- a/app/src/interfaces/slug/slug.vue +++ b/app/src/interfaces/slug/slug.vue @@ -1,5 +1,16 @@ diff --git a/app/src/modules/settings/routes/data-model/field-detail/components/interface.vue b/app/src/modules/settings/routes/data-model/field-detail/components/interface.vue index cdd7d90cab..817bed18f3 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/components/interface.vue +++ b/app/src/modules/settings/routes/data-model/field-detail/components/interface.vue @@ -64,7 +64,7 @@ export default defineComponent({ datetime: ['datetime'], date: ['datetime'], time: ['datetime'], - json: ['code'], + json: ['checkboxes', 'tags'], uuid: ['text-input'], }; @@ -85,15 +85,18 @@ export default defineComponent({ return item; }); + const recommendedItems: (FancySelectItem | { divider: boolean } | undefined)[] = [ + ...recommended.map((key) => interfaceItems.find((item) => item.value === key)), + ]; + if (interfaceItems.length >= 5 && recommended.length > 0) { - return [ - ...recommended.map((key) => interfaceItems.find((item) => item.value === key)), - { divider: true }, - ...interfaceItems.filter((item) => recommended.includes(item.value as string) === false), - ]; - } else { - return interfaceItems; + recommendedItems.push({ divider: true }); } + + recommendedItems.push( + ...interfaceItems.filter((item) => recommended.includes(item.value as string) === false) + ); + return recommendedItems; }); const selectedInterface = computed(() => { From b88a4a4a444da171655d9d329919729c2c6fc13c Mon Sep 17 00:00:00 2001 From: Nitwel Date: Mon, 7 Sep 2020 12:37:48 +0200 Subject: [PATCH 13/34] fix repeater limit, improve recommended and update notice --- app/src/interfaces/notice/index.ts | 2 +- app/src/interfaces/repeater/index.ts | 1 + app/src/interfaces/repeater/options.vue | 21 +++++++++++++--- app/src/interfaces/repeater/repeater.vue | 2 +- app/src/lang/en-US/index.json | 2 ++ .../field-detail/components/display.vue | 24 ++++++++++++------- .../field-detail/components/interface.vue | 17 ++++++++----- 7 files changed, 50 insertions(+), 19 deletions(-) diff --git a/app/src/interfaces/notice/index.ts b/app/src/interfaces/notice/index.ts index 9e3e81b439..85a4b381e0 100644 --- a/app/src/interfaces/notice/index.ts +++ b/app/src/interfaces/notice/index.ts @@ -4,7 +4,7 @@ import InterfaceNotice from './notice.vue'; export default defineInterface(({ i18n }) => ({ id: 'notice', name: i18n.t('notice'), - icon: 'remove', + icon: 'info', component: InterfaceNotice, hideLabel: true, hideLoader: true, diff --git a/app/src/interfaces/repeater/index.ts b/app/src/interfaces/repeater/index.ts index c71f9fc78a..6edb796d28 100644 --- a/app/src/interfaces/repeater/index.ts +++ b/app/src/interfaces/repeater/index.ts @@ -9,4 +9,5 @@ export default defineInterface(({ i18n }) => ({ component: InterfaceRepeater, types: ['json'], options: RepeaterOptions, + recommendedDisplays: ['related-values'], })); diff --git a/app/src/interfaces/repeater/options.vue b/app/src/interfaces/repeater/options.vue index 500ecf341d..ced45aab3f 100644 --- a/app/src/interfaces/repeater/options.vue +++ b/app/src/interfaces/repeater/options.vue @@ -1,9 +1,12 @@ @@ -115,6 +118,18 @@ export default defineComponent({ }, ]; + const limit = computed({ + get() { + return props.value?.limit; + }, + set(newLimit: string) { + emit('input', { + ...(props.value || {}), + limit: newLimit, + }); + }, + }); + const template = computed({ get() { return props.value?.template; @@ -127,7 +142,7 @@ export default defineComponent({ }, }); - return { repeaterValue, repeaterFields, template }; + return { repeaterValue, repeaterFields, template, limit }; }, }); diff --git a/app/src/interfaces/repeater/repeater.vue b/app/src/interfaces/repeater/repeater.vue index c36df78e67..3249358a2d 100644 --- a/app/src/interfaces/repeater/repeater.vue +++ b/app/src/interfaces/repeater/repeater.vue @@ -60,7 +60,7 @@ export default defineComponent({ if (props.disabled) return false; if (props.value === null) return true; if (props.limit === null) return true; - if (Array.isArray(props.value) && props.value.length <= props.limit) return true; + if (Array.isArray(props.value) && props.value.length < props.limit) return true; return false; }); diff --git a/app/src/lang/en-US/index.json b/app/src/lang/en-US/index.json index f79cc6c65e..ef0fb5644d 100644 --- a/app/src/lang/en-US/index.json +++ b/app/src/lang/en-US/index.json @@ -313,6 +313,7 @@ "notice": "Notice", "slug": "Slug", "repeater": "Repeater", + "max-amount": "Max Amount", "months": { "january": "January", @@ -707,6 +708,7 @@ "role_only": "Role Only", "update": "Update", + "edit_fields": "Edit Fields", "select_fields": "Select Fields", "readable_fields": "Readable Fields", "writable_fields": "Writable Fields", diff --git a/app/src/modules/settings/routes/data-model/field-detail/components/display.vue b/app/src/modules/settings/routes/data-model/field-detail/components/display.vue index 195fbe889b..a79142d73c 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/components/display.vue +++ b/app/src/modules/settings/routes/data-model/field-detail/components/display.vue @@ -68,15 +68,23 @@ export default defineComponent({ return item; }); - if (displayItems.length >= 5 && recommended.length > 0) { - return [ - ...recommended.map((key) => displayItems.find((item) => item.value === key)), - { divider: true }, - ...displayItems.filter((item) => recommended.includes(item.value as string) === false), - ]; - } else { - return displayItems; + const recommendedItems: (FancySelectItem | { divider: boolean } | undefined)[] = []; + + const recommendedList = recommended.map((key) => displayItems.find((item) => item.value === key)); + if (recommendedList !== undefined && recommendedList.includes(undefined) === false) { + recommendedItems.push(...recommendedList); } + + if (displayItems.length >= 5 && recommended.length > 0) { + recommendedItems.push({ divider: true }); + } + + const displayList = displayItems.filter((item) => recommended.includes(item.value as string) === false); + if (displayList !== undefined) { + recommendedItems.push(...displayList); + } + + return recommendedItems; }); const selectedDisplay = computed(() => { diff --git a/app/src/modules/settings/routes/data-model/field-detail/components/interface.vue b/app/src/modules/settings/routes/data-model/field-detail/components/interface.vue index 817bed18f3..42478fd996 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/components/interface.vue +++ b/app/src/modules/settings/routes/data-model/field-detail/components/interface.vue @@ -85,17 +85,22 @@ export default defineComponent({ return item; }); - const recommendedItems: (FancySelectItem | { divider: boolean } | undefined)[] = [ - ...recommended.map((key) => interfaceItems.find((item) => item.value === key)), - ]; + const recommendedItems: (FancySelectItem | { divider: boolean } | undefined)[] = []; + + const recommendedList = recommended.map((key) => interfaceItems.find((item) => item.value === key)); + if (recommendedList !== undefined && recommendedList.includes(undefined) === false) { + recommendedItems.push(...recommendedList); + } if (interfaceItems.length >= 5 && recommended.length > 0) { recommendedItems.push({ divider: true }); } - recommendedItems.push( - ...interfaceItems.filter((item) => recommended.includes(item.value as string) === false) - ); + const interfaceList = interfaceItems.filter((item) => recommended.includes(item.value as string) === false); + if (interfaceList !== undefined) { + recommendedItems.push(...interfaceList); + } + return recommendedItems; }); From d95b05eee707887695a4f863a35c9e3c06eaf2cb Mon Sep 17 00:00:00 2001 From: Nitwel Date: Mon, 7 Sep 2020 12:56:18 +0200 Subject: [PATCH 14/34] update repeater options to use grid --- app/src/interfaces/repeater/options.vue | 42 ++++++++++++++++++------- 1 file changed, 30 insertions(+), 12 deletions(-) diff --git a/app/src/interfaces/repeater/options.vue b/app/src/interfaces/repeater/options.vue index ced45aab3f..37c90a9512 100644 --- a/app/src/interfaces/repeater/options.vue +++ b/app/src/interfaces/repeater/options.vue @@ -1,13 +1,23 @@ @@ -148,11 +158,19 @@ export default defineComponent({ From e915287d52cb50bff38d58438d86b0cd939bcfb9 Mon Sep 17 00:00:00 2001 From: Nitwel Date: Mon, 7 Sep 2020 13:16:14 +0200 Subject: [PATCH 15/34] add select mode to user modal --- app/src/interfaces/user/index.ts | 23 ++++++++++++++++++++++- app/src/interfaces/user/user.vue | 4 ++-- app/src/lang/en-US/index.json | 1 + 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/app/src/interfaces/user/index.ts b/app/src/interfaces/user/index.ts index 7e382d311d..f6ee9512c4 100644 --- a/app/src/interfaces/user/index.ts +++ b/app/src/interfaces/user/index.ts @@ -7,5 +7,26 @@ export default defineInterface(({ i18n }) => ({ icon: 'person', component: InterfaceUser, types: ['uuid'], - options: [], + options: [ + { + field: 'selectMode', + name: i18n.t('select_mode'), + type: 'string', + meta: { + width: 'full', + interface: 'dropdown', + options: { + choices: [ + { text: 'Auto', value: 'auto' }, + { text: 'Dropdown', value: 'dropdown' }, + { text: 'Modal', value: 'modal' }, + ], + }, + }, + schema: { + default_value: 'auto', + }, + }, + ], + recommendedDisplays: ['user'], })); diff --git a/app/src/interfaces/user/user.vue b/app/src/interfaces/user/user.vue index b49df61fe7..c24869f1da 100644 --- a/app/src/interfaces/user/user.vue +++ b/app/src/interfaces/user/user.vue @@ -102,7 +102,7 @@ export default defineComponent({ components: { ModalDetail, ModalBrowse }, props: { value: { - type: [Number, Object], + type: [String, Object], default: null, }, template: { @@ -162,7 +162,7 @@ export default defineComponent({ (newValue) => { // When the newly configured value is a primitive, assume it's the primary key // of the item and fetch it from the API to render the preview - if (newValue !== null && newValue !== currentUser.value?.id && typeof newValue === 'number') { + if (newValue !== null && newValue !== currentUser.value?.id && typeof newValue === 'string') { fetchCurrent(); } diff --git a/app/src/lang/en-US/index.json b/app/src/lang/en-US/index.json index ef0fb5644d..94b1e05831 100644 --- a/app/src/lang/en-US/index.json +++ b/app/src/lang/en-US/index.json @@ -314,6 +314,7 @@ "slug": "Slug", "repeater": "Repeater", "max-amount": "Max Amount", + "select_mode": "Select Mode", "months": { "january": "January", From 1a88f6de88a1b587cae5a959500ef4e423208919 Mon Sep 17 00:00:00 2001 From: Nitwel Date: Mon, 7 Sep 2020 13:35:16 +0200 Subject: [PATCH 16/34] add recommended displays --- app/src/interfaces/color/index.ts | 15 ++++++++------- app/src/interfaces/divider/index.ts | 1 + app/src/interfaces/files/index.ts | 1 + app/src/interfaces/markdown/index.ts | 1 + app/src/interfaces/notice/index.ts | 1 + app/src/interfaces/numeric/index.ts | 1 + app/src/interfaces/radio-buttons/index.ts | 1 + app/src/interfaces/slider/index.ts | 7 ++++--- app/src/interfaces/slug/index.ts | 1 + app/src/interfaces/text-input/index.ts | 1 + app/src/interfaces/textarea/index.ts | 1 + app/src/interfaces/wysiwyg/index.ts | 1 + 12 files changed, 22 insertions(+), 10 deletions(-) diff --git a/app/src/interfaces/color/index.ts b/app/src/interfaces/color/index.ts index d1de3da3c7..bc10ccef70 100644 --- a/app/src/interfaces/color/index.ts +++ b/app/src/interfaces/color/index.ts @@ -7,6 +7,7 @@ export default defineInterface(({ i18n }) => ({ icon: 'palette', component: InterfaceColor, types: ['string'], + recommendedDisplays: ['color-dot'], options: [ { field: 'presets', @@ -25,7 +26,7 @@ export default defineInterface(({ i18n }) => ({ meta: { interface: 'text-input', width: 'half', - } + }, }, { field: 'color', @@ -33,12 +34,12 @@ export default defineInterface(({ i18n }) => ({ name: i18n.t('color'), meta: { interface: 'color', - width: 'half' - } - } - ] - } - } + width: 'half', + }, + }, + ], + }, + }, }, ], })); diff --git a/app/src/interfaces/divider/index.ts b/app/src/interfaces/divider/index.ts index 93a0beb017..5f3faa6db7 100644 --- a/app/src/interfaces/divider/index.ts +++ b/app/src/interfaces/divider/index.ts @@ -9,6 +9,7 @@ export default defineInterface(({ i18n }) => ({ hideLabel: true, hideLoader: true, types: ['alias'], + recommendedDisplays: ['raw'], options: [ { field: 'color', diff --git a/app/src/interfaces/files/index.ts b/app/src/interfaces/files/index.ts index 3a9a9cc7b0..de8ac72e69 100644 --- a/app/src/interfaces/files/index.ts +++ b/app/src/interfaces/files/index.ts @@ -9,4 +9,5 @@ export default defineInterface(({ i18n }) => ({ types: ['alias'], relationship: 'm2m', options: [], + recommendedDisplays: ['files'], })); diff --git a/app/src/interfaces/markdown/index.ts b/app/src/interfaces/markdown/index.ts index 35efc1df99..63058d8e2d 100644 --- a/app/src/interfaces/markdown/index.ts +++ b/app/src/interfaces/markdown/index.ts @@ -27,4 +27,5 @@ export default defineInterface(({ i18n }) => ({ }, }, ], + recommendedDisplays: ['raw'], })); diff --git a/app/src/interfaces/notice/index.ts b/app/src/interfaces/notice/index.ts index 85a4b381e0..c13fa1f40a 100644 --- a/app/src/interfaces/notice/index.ts +++ b/app/src/interfaces/notice/index.ts @@ -9,6 +9,7 @@ export default defineInterface(({ i18n }) => ({ hideLabel: true, hideLoader: true, types: ['alias'], + recommendedDisplays: ['raw'], options: [ { field: 'color', diff --git a/app/src/interfaces/numeric/index.ts b/app/src/interfaces/numeric/index.ts index 1803e3356b..59659e2e0a 100644 --- a/app/src/interfaces/numeric/index.ts +++ b/app/src/interfaces/numeric/index.ts @@ -7,6 +7,7 @@ export default defineInterface(({ i18n }) => ({ icon: 'dialpad', component: InterfaceNumeric, types: ['integer', 'decimal', 'float', 'bigInteger'], + recommendedDisplays: ['raw'], options: [ { field: 'min', diff --git a/app/src/interfaces/radio-buttons/index.ts b/app/src/interfaces/radio-buttons/index.ts index 6e49adcfea..a333d1263f 100644 --- a/app/src/interfaces/radio-buttons/index.ts +++ b/app/src/interfaces/radio-buttons/index.ts @@ -7,6 +7,7 @@ export default defineInterface(({ i18n }) => ({ icon: 'radio_button_checked', component: InterfaceRadioButtons, types: ['string'], + recommendedDisplays: ['badge'], options: [ { field: 'choices', diff --git a/app/src/interfaces/slider/index.ts b/app/src/interfaces/slider/index.ts index 4000ff422f..44ee96570f 100644 --- a/app/src/interfaces/slider/index.ts +++ b/app/src/interfaces/slider/index.ts @@ -7,6 +7,7 @@ export default defineInterface(({ i18n }) => ({ icon: 'linear_scale', component: InterfaceSlider, types: ['integer', 'decimal', 'float', 'bigInteger'], + recommendedDisplays: ['rating'], options: [ { field: 'minValue', @@ -15,7 +16,7 @@ export default defineInterface(({ i18n }) => ({ meta: { width: 'half', interface: 'numeric', - } + }, }, { field: 'maxValue', @@ -24,7 +25,7 @@ export default defineInterface(({ i18n }) => ({ meta: { width: 'half', interface: 'numeric', - } + }, }, { field: 'stepInterval', @@ -33,7 +34,7 @@ export default defineInterface(({ i18n }) => ({ meta: { width: 'half', interface: 'numeric', - } + }, }, ], })); diff --git a/app/src/interfaces/slug/index.ts b/app/src/interfaces/slug/index.ts index 518a0e61d6..bdeb64af8f 100644 --- a/app/src/interfaces/slug/index.ts +++ b/app/src/interfaces/slug/index.ts @@ -7,6 +7,7 @@ export default defineInterface(({ i18n }) => ({ icon: 'link', component: InterfaceSlug, types: ['string'], + recommendedDisplays: ['formatted-value'], options: [ { field: 'placeholder', diff --git a/app/src/interfaces/text-input/index.ts b/app/src/interfaces/text-input/index.ts index 4ea1f7a1d1..237a4f3d89 100644 --- a/app/src/interfaces/text-input/index.ts +++ b/app/src/interfaces/text-input/index.ts @@ -7,6 +7,7 @@ export default defineInterface(({ i18n }) => ({ icon: 'text_fields', component: InterfaceTextInput, types: ['string', 'uuid'], + recommendedDisplays: ['raw'], options: [ { field: 'placeholder', diff --git a/app/src/interfaces/textarea/index.ts b/app/src/interfaces/textarea/index.ts index 322b24b3b3..20f11576aa 100644 --- a/app/src/interfaces/textarea/index.ts +++ b/app/src/interfaces/textarea/index.ts @@ -7,6 +7,7 @@ export default defineInterface(({ i18n }) => ({ icon: 'text_fields', component: InterfaceTextarea, types: ['text'], + recommendedDisplays: ['raw'], options: [ { field: 'placeholder', diff --git a/app/src/interfaces/wysiwyg/index.ts b/app/src/interfaces/wysiwyg/index.ts index c97db33eef..66660f155c 100644 --- a/app/src/interfaces/wysiwyg/index.ts +++ b/app/src/interfaces/wysiwyg/index.ts @@ -7,6 +7,7 @@ export default defineInterface(({ i18n }) => ({ icon: 'format_quote', component: InterfaceWYSIWYG, types: ['text'], + recommendedDisplays: ['formatted-value'], options: [ { field: 'toolbar', From 0d897c6bead369bd4aacb3e437fe36b871098af8 Mon Sep 17 00:00:00 2001 From: Nitwel Date: Mon, 7 Sep 2020 18:47:58 +0200 Subject: [PATCH 17/34] support hex values on color-dot --- app/src/displays/color-dot/color-dot.vue | 31 +++++++++++++++--------- app/src/displays/color-dot/index.ts | 1 + app/src/lang/en-US/displays.json | 3 +++ 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/app/src/displays/color-dot/color-dot.vue b/app/src/displays/color-dot/color-dot.vue index 5e9434958d..826e6a8d72 100644 --- a/app/src/displays/color-dot/color-dot.vue +++ b/app/src/displays/color-dot/color-dot.vue @@ -1,13 +1,15 @@ diff --git a/app/src/displays/color-dot/index.ts b/app/src/displays/color-dot/index.ts index f38c0eb687..688fa8a5d3 100644 --- a/app/src/displays/color-dot/index.ts +++ b/app/src/displays/color-dot/index.ts @@ -25,6 +25,7 @@ export default defineDisplay(({ i18n }) => ({ name: i18n.t('choices'), type: 'json', meta: { + note: i18n.t('displays.color-dot.choices-note'), interface: 'repeater', options: { template: '{{text}}', diff --git a/app/src/lang/en-US/displays.json b/app/src/lang/en-US/displays.json index b0b0183ae4..d62999fb84 100644 --- a/app/src/lang/en-US/displays.json +++ b/app/src/lang/en-US/displays.json @@ -3,6 +3,9 @@ "icon": { "icon": "Icon" }, + "color-dot": { + "choices-note": "Set colors relative to the text." + }, "format-title": { "format-title": "Format Title" }, From 8a5970e2d26927484c2bf6fe5958ce92e0bf554a Mon Sep 17 00:00:00 2001 From: Nitwel Date: Mon, 7 Sep 2020 19:25:49 +0200 Subject: [PATCH 18/34] update icon to support colors, datetime, filesize, formatted-val --- app/src/displays/datetime/datetime.vue | 2 +- app/src/displays/filesize/index.ts | 2 +- app/src/displays/formatted-value/index.ts | 3 +++ app/src/displays/icon/icon.vue | 22 +++++++++++++++++++--- app/src/displays/icon/index.ts | 15 ++++++++++++--- app/src/lang/en-US/displays.json | 4 +++- app/src/lang/en-US/index.json | 3 --- 7 files changed, 39 insertions(+), 12 deletions(-) diff --git a/app/src/displays/datetime/datetime.vue b/app/src/displays/datetime/datetime.vue index 0e998052d5..f6bca49123 100644 --- a/app/src/displays/datetime/datetime.vue +++ b/app/src/displays/datetime/datetime.vue @@ -16,7 +16,7 @@ export default defineComponent({ required: true, }, type: { - type: String as PropType<'datetime' | 'time' | 'date'>, + type: String as PropType<'datetime' | 'time' | 'date' | 'timestamp'>, required: true, validator: (val: string) => ['datetime', 'date', 'time', 'timestamp'].includes(val), }, diff --git a/app/src/displays/filesize/index.ts b/app/src/displays/filesize/index.ts index 34c93a92f4..b2ad8f762b 100644 --- a/app/src/displays/filesize/index.ts +++ b/app/src/displays/filesize/index.ts @@ -6,6 +6,6 @@ export default defineDisplay(({ i18n }) => ({ name: i18n.t('filesize'), icon: 'description', handler: handler, - options: null, + options: [], types: ['integer'], })); diff --git a/app/src/displays/formatted-value/index.ts b/app/src/displays/formatted-value/index.ts index 3d31b130f7..f96fa68a1c 100644 --- a/app/src/displays/formatted-value/index.ts +++ b/app/src/displays/formatted-value/index.ts @@ -55,6 +55,9 @@ export default defineDisplay(({ i18n }) => ({ ], }, }, + schema: { + default_value: 'sans-serif', + }, }, ], })); diff --git a/app/src/displays/icon/icon.vue b/app/src/displays/icon/icon.vue index 5df02002eb..3afeb6c08b 100644 --- a/app/src/displays/icon/icon.vue +++ b/app/src/displays/icon/icon.vue @@ -1,16 +1,32 @@ - @@ -42,7 +42,7 @@ export default defineComponent({ type: String, required: true, }, - placeholder: { + createItemText: { type: String, default: i18n.t('add_a_new_item'), }, diff --git a/app/src/interfaces/slider/index.ts b/app/src/interfaces/slider/index.ts index 1cbce09bd6..3de9a0457b 100644 --- a/app/src/interfaces/slider/index.ts +++ b/app/src/interfaces/slider/index.ts @@ -8,7 +8,6 @@ export default defineInterface(({ i18n }) => ({ icon: 'linear_scale', component: InterfaceSlider, types: ['integer', 'decimal', 'float', 'bigInteger'], - recommendedDisplays: ['rating'], options: [ { field: 'minValue', diff --git a/app/src/interfaces/slug/index.ts b/app/src/interfaces/slug/index.ts index 46f946e299..b74458fd10 100644 --- a/app/src/interfaces/slug/index.ts +++ b/app/src/interfaces/slug/index.ts @@ -8,13 +8,12 @@ export default defineInterface(({ i18n }) => ({ icon: 'link', component: InterfaceSlug, types: ['string'], - recommendedDisplays: ['formatted-value'], options: [ { field: 'placeholder', name: i18n.t('placeholder'), meta: { - width: 'half', + width: 'full', interface: 'text-input', options: { placeholder: i18n.t('enter_a_placeholder'), diff --git a/app/src/interfaces/tags/tags.vue b/app/src/interfaces/tags/tags.vue index 75ca2d7b28..20928188a3 100644 --- a/app/src/interfaces/tags/tags.vue +++ b/app/src/interfaces/tags/tags.vue @@ -52,7 +52,7 @@ export default defineComponent({ }, value: { type: Array as PropType, - default: () => [], + default: null, }, placeholder: { type: String, diff --git a/app/src/interfaces/text-input/index.ts b/app/src/interfaces/text-input/index.ts index 99c80d66d8..8baee8cbcb 100644 --- a/app/src/interfaces/text-input/index.ts +++ b/app/src/interfaces/text-input/index.ts @@ -8,7 +8,6 @@ export default defineInterface(({ i18n }) => ({ icon: 'text_fields', component: InterfaceTextInput, types: ['string', 'uuid'], - recommendedDisplays: ['raw'], options: [ { field: 'placeholder', @@ -74,7 +73,7 @@ export default defineInterface(({ i18n }) => ({ }, }, { - field: 'mask', + field: 'masked', name: i18n.t('interfaces.text-input.mask'), type: 'boolean', meta: { diff --git a/app/src/interfaces/textarea/index.ts b/app/src/interfaces/textarea/index.ts index 0f622c477a..497d6813f3 100644 --- a/app/src/interfaces/textarea/index.ts +++ b/app/src/interfaces/textarea/index.ts @@ -8,7 +8,6 @@ export default defineInterface(({ i18n }) => ({ icon: 'text_fields', component: InterfaceTextarea, types: ['text'], - recommendedDisplays: ['raw'], options: [ { field: 'placeholder', diff --git a/app/src/interfaces/user/user.vue b/app/src/interfaces/user/user.vue index c24869f1da..7cc8784426 100644 --- a/app/src/interfaces/user/user.vue +++ b/app/src/interfaces/user/user.vue @@ -102,7 +102,7 @@ export default defineComponent({ components: { ModalDetail, ModalBrowse }, props: { value: { - type: [String, Object], + type: String, default: null, }, template: { @@ -178,16 +178,8 @@ export default defineComponent({ const currentPrimaryKey = computed(() => { if (!currentUser.value) return '+'; if (!props.value) return '+'; - - if (typeof props.value === 'number' || typeof props.value === 'string') { - return props.value; - } - - if (typeof props.value === 'object' && props.value.hasOwnProperty('id')) { - return props.value.id; - } - - return '+'; + + return props.value; }); return { setCurrent, currentUser, loading, currentPrimaryKey }; @@ -312,15 +304,7 @@ export default defineComponent({ const selection = computed<(number | string)[]>(() => { if (!props.value) return []; - if (typeof props.value === 'object' && props.value.hasOwnProperty('id')) { - return [props.value.id]; - } - - if (typeof props.value === 'string' || typeof props.value === 'number') { - return [props.value]; - } - - return []; + return [props.value]; }); return { selection, stageSelection, selectModalActive }; diff --git a/app/src/interfaces/wysiwyg/index.ts b/app/src/interfaces/wysiwyg/index.ts index 894c356ad8..2b222bfeb7 100644 --- a/app/src/interfaces/wysiwyg/index.ts +++ b/app/src/interfaces/wysiwyg/index.ts @@ -8,7 +8,6 @@ export default defineInterface(({ i18n }) => ({ icon: 'format_quote', component: InterfaceWYSIWYG, types: ['text'], - recommendedDisplays: ['formatted-value'], options: [ { field: 'toolbar', @@ -38,7 +37,6 @@ export default defineInterface(({ i18n }) => ({ width: 'half', interface: 'dropdown-multiselect', options: { - closeOnContentClick: false, choices: [ { value: 'aligncenter', diff --git a/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue b/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue index 3108f96ba4..8af69ca3b7 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue +++ b/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue @@ -43,41 +43,41 @@
{{ $t('default_value') }}
@@ -235,7 +235,7 @@ export default defineComponent({ return i18n.t('choose_a_type'); }); - const default_value = computed({ + const defaultValue = computed({ get() { return state.fieldData.schema.default_value; }, @@ -244,32 +244,16 @@ export default defineComponent({ }, }); - const default_type = computed(() => { - if (['integer', 'bigInteger', 'float', 'decimal'].includes(state.fieldData.type)) return 'number'; - else if (['string', 'uuid'].includes(state.fieldData.type)) { - return 'string'; - } else if (['timestamp', 'datetime', 'date', 'time'].includes(state.fieldData.type)) { - return 'datetime'; - } else { - return state.fieldData.type; - } - }); - return { fieldData: state.fieldData, typesWithLabels, setType, typeDisabled, typePlaceholder, - default_value, - default_type, + defaultValue, }; function setType(value: typeof types[number]) { - if (value === 'uuid') { - state.fieldData.meta.special = 'uuid'; - } - // We'll reset the interface/display as they most likely won't work for the newly selected // type state.fieldData.meta.interface = null; diff --git a/app/src/modules/settings/routes/data-model/field-detail/store.ts b/app/src/modules/settings/routes/data-model/field-detail/store.ts index 7e9b6b935f..f9c8c7d78f 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/store.ts +++ b/app/src/modules/settings/routes/data-model/field-detail/store.ts @@ -297,6 +297,9 @@ function initLocalStore( () => state.fieldData.type, () => { switch (state.fieldData.type) { + case 'uuid': + state.fieldData.meta.special = 'uuid'; + break; case 'json': state.fieldData.meta.special = 'json'; break; diff --git a/app/src/styles/lib/_codemirror.scss b/app/src/styles/lib/_codemirror.scss index 967d083de3..89f8a2267a 100644 --- a/app/src/styles/lib/_codemirror.scss +++ b/app/src/styles/lib/_codemirror.scss @@ -18,6 +18,10 @@ transition: all var(--fast) var(--transition); } +.CodeMirror .CodeMirror-placeholder{ + color: var(--foreground-subdued); +} + .CodeMirror:hover { border-color: var(--border-normal-alt); } From 74ec51e4ada8ba91ceb1d1c1cfc100591d5d5bb9 Mon Sep 17 00:00:00 2001 From: Nitwel Date: Wed, 9 Sep 2020 19:52:34 +0200 Subject: [PATCH 28/34] rename option to collectionField --- app/src/interfaces/display-template/index.ts | 11 ++++------- app/src/lang/en-US/interfaces.json | 1 + .../data-model/field-detail/components/schema.vue | 2 +- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/app/src/interfaces/display-template/index.ts b/app/src/interfaces/display-template/index.ts index ece3cf5e0e..443b6ed200 100644 --- a/app/src/interfaces/display-template/index.ts +++ b/app/src/interfaces/display-template/index.ts @@ -11,15 +11,12 @@ export default defineInterface(({ i18n }) => ({ system: true, options: [ { - field: 'collection', - name: i18n.t('collection'), + field: 'collectionField', + name: i18n.t('interfaces.display-template.collection_field'), type: 'string', meta: { - width: 'half', - interface: 'collections', - options: { - includeSystem: true, - }, + width: 'full', + interface: 'text-input' }, schema: { default_value: null, diff --git a/app/src/lang/en-US/interfaces.json b/app/src/lang/en-US/interfaces.json index 3ea0757084..4e3efee393 100644 --- a/app/src/lang/en-US/interfaces.json +++ b/app/src/lang/en-US/interfaces.json @@ -33,6 +33,7 @@ "display-template": { "display-template": "Display Template", "description": "Mix text with field values.", + "collection_field": "Collection field", "collection_field_not_setup": "The collection field option is misconfigured", "select_a_collection": "Select a Collection" }, diff --git a/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue b/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue index 8af69ca3b7..d3aed33877 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue +++ b/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue @@ -40,7 +40,7 @@
-
+
{{ $t('default_value') }}
Date: Wed, 9 Sep 2020 20:01:47 +0200 Subject: [PATCH 29/34] fix my stupidity --- app/src/interfaces/code/code.vue | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/app/src/interfaces/code/code.vue b/app/src/interfaces/code/code.vue index eba060bc03..0828fb6368 100644 --- a/app/src/interfaces/code/code.vue +++ b/app/src/interfaces/code/code.vue @@ -274,9 +274,11 @@ export default defineComponent({ }; function fillTemplate() { - try { - emit('input', JSON.parse(props.template)); - } catch { + if(props.type === 'json') { + try { + emit('input', JSON.parse(props.template)); + } catch {} + } else { emit('input', props.template); } } From 9b129af05080f8db1c99c10710d176df2591595d Mon Sep 17 00:00:00 2001 From: Nitwel Date: Wed, 9 Sep 2020 20:50:55 +0200 Subject: [PATCH 30/34] fix type validation in datetime display --- app/src/displays/datetime/datetime.vue | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/displays/datetime/datetime.vue b/app/src/displays/datetime/datetime.vue index f6bca49123..a405b5bc54 100644 --- a/app/src/displays/datetime/datetime.vue +++ b/app/src/displays/datetime/datetime.vue @@ -16,9 +16,9 @@ export default defineComponent({ required: true, }, type: { - type: String as PropType<'datetime' | 'time' | 'date' | 'timestamp'>, + type: String as PropType<'dateTime' | 'time' | 'date' | 'timestamp'>, required: true, - validator: (val: string) => ['datetime', 'date', 'time', 'timestamp'].includes(val), + validator: (val: string) => ['dateTime', 'date', 'time', 'timestamp'].includes(val), }, relative: { type: Boolean, From 131a83e438fe3872724735f9777fd3f7b3bc3801 Mon Sep 17 00:00:00 2001 From: rijkvanzanten Date: Thu, 10 Sep 2020 11:08:22 -0400 Subject: [PATCH 31/34] Move set type reset to store.ts --- .../data-model/field-detail/components/schema.vue | 14 +------------- .../routes/data-model/field-detail/store.ts | 10 ++++++++-- 2 files changed, 9 insertions(+), 15 deletions(-) diff --git a/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue b/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue index d3aed33877..78ca8e6ec0 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue +++ b/app/src/modules/settings/routes/data-model/field-detail/components/schema.vue @@ -30,7 +30,7 @@ :value="fieldData.type" :items="typesWithLabels" :placeholder="typePlaceholder" - @input="setType" + @input="fieldData.type = $event" />
@@ -247,22 +247,10 @@ export default defineComponent({ return { fieldData: state.fieldData, typesWithLabels, - setType, typeDisabled, typePlaceholder, defaultValue, }; - - function setType(value: typeof types[number]) { - // We'll reset the interface/display as they most likely won't work for the newly selected - // type - state.fieldData.meta.interface = null; - state.fieldData.meta.options = null; - state.fieldData.meta.display = null; - state.fieldData.meta.display_options = null; - state.fieldData.schema.default_value = undefined; - state.fieldData.type = value; - } }, }); diff --git a/app/src/modules/settings/routes/data-model/field-detail/store.ts b/app/src/modules/settings/routes/data-model/field-detail/store.ts index f9c8c7d78f..f9442aec3c 100644 --- a/app/src/modules/settings/routes/data-model/field-detail/store.ts +++ b/app/src/modules/settings/routes/data-model/field-detail/store.ts @@ -296,6 +296,13 @@ function initLocalStore( watch( () => state.fieldData.type, () => { + state.fieldData.meta.interface = null; + state.fieldData.meta.options = null; + state.fieldData.meta.display = null; + state.fieldData.meta.display_options = null; + state.fieldData.meta.special = null; + state.fieldData.schema.default_value = undefined; + switch (state.fieldData.type) { case 'uuid': state.fieldData.meta.special = 'uuid'; @@ -306,9 +313,8 @@ function initLocalStore( case 'boolean': state.fieldData.meta.special = 'boolean'; state.fieldData.schema.is_nullable = false; + state.fieldData.schema.default_value = false; break; - default: - state.fieldData.meta.special = null; } } ); From 36be9ba7afc07fc84e129450e1c8cd47da1ee3eb Mon Sep 17 00:00:00 2001 From: rijkvanzanten Date: Thu, 10 Sep 2020 11:19:01 -0400 Subject: [PATCH 32/34] Add add-label option to repeater --- app/src/interfaces/repeater/options.vue | 20 +++++++++++++++++++- app/src/interfaces/repeater/repeater.vue | 4 ++-- app/src/lang/en-US/interfaces.json | 3 ++- 3 files changed, 23 insertions(+), 4 deletions(-) diff --git a/app/src/interfaces/repeater/options.vue b/app/src/interfaces/repeater/options.vue index 1df98314fc..137d257d70 100644 --- a/app/src/interfaces/repeater/options.vue +++ b/app/src/interfaces/repeater/options.vue @@ -5,6 +5,7 @@

{{ $t('template') }}

+

{{ $t('interfaces.repeater.edit_fields') }}

+ +
+

{{ $t('interfaces.repeater.add_label') }}

+ +
@@ -136,7 +142,19 @@ export default defineComponent({ }, }); - return { repeaterValue, repeaterFields, template }; + const addLabel = computed({ + get() { + return props.value?.addLabel; + }, + set(newAddLabel: string) { + emit('input', { + ...(props.value || {}), + addLabel: newAddLabel, + }); + }, + }); + + return { repeaterValue, repeaterFields, addLabel }; }, }); diff --git a/app/src/interfaces/repeater/repeater.vue b/app/src/interfaces/repeater/repeater.vue index 3249358a2d..cebcfd6205 100644 --- a/app/src/interfaces/repeater/repeater.vue +++ b/app/src/interfaces/repeater/repeater.vue @@ -14,7 +14,7 @@ @@ -42,7 +42,7 @@ export default defineComponent({ type: String, required: true, }, - createItemText: { + addLabel: { type: String, default: i18n.t('add_a_new_item'), }, diff --git a/app/src/lang/en-US/interfaces.json b/app/src/lang/en-US/interfaces.json index 4e3efee393..0109efa19f 100644 --- a/app/src/lang/en-US/interfaces.json +++ b/app/src/lang/en-US/interfaces.json @@ -131,7 +131,8 @@ "description": "Have multiple entires of the same structure.", "max_amount": "Maximum Amount", "max_amount_placeholder": "Maximum amount of items...", - "edit_fields": "Edit Fields" + "edit_fields": "Edit Fields", + "add_label": "\"Add New Row\" Label" }, "slider": { "slider": "Slider", From 761d988f113516d1228c2d59488a0e6269a9ea93 Mon Sep 17 00:00:00 2001 From: rijkvanzanten Date: Thu, 10 Sep 2020 11:19:56 -0400 Subject: [PATCH 33/34] Fix wrong prop name --- app/src/displays/color-dot/color-dot.vue | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/app/src/displays/color-dot/color-dot.vue b/app/src/displays/color-dot/color-dot.vue index 028c688c73..68b7b82b62 100644 --- a/app/src/displays/color-dot/color-dot.vue +++ b/app/src/displays/color-dot/color-dot.vue @@ -44,8 +44,9 @@ export default defineComponent({ const styles = computed(() => { if (isHex(props.value)) { - return { backgroundColor: props.value || props.defaultForeground }; + return { backgroundColor: props.value || props.defaultColor }; } + return { backgroundColor: currentChoice.value?.color || props.defaultColor, }; From cdc6216d792657d44ab01a801650b0ee041c8977 Mon Sep 17 00:00:00 2001 From: rijkvanzanten Date: Thu, 10 Sep 2020 11:20:38 -0400 Subject: [PATCH 34/34] Fix missing export --- app/src/interfaces/repeater/options.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/interfaces/repeater/options.vue b/app/src/interfaces/repeater/options.vue index 137d257d70..7f7d10e879 100644 --- a/app/src/interfaces/repeater/options.vue +++ b/app/src/interfaces/repeater/options.vue @@ -154,7 +154,7 @@ export default defineComponent({ }, }); - return { repeaterValue, repeaterFields, addLabel }; + return { repeaterValue, repeaterFields, template, addLabel }; }, });