diff --git a/src/components/v-input/v-input.vue b/src/components/v-input/v-input.vue index 61a79f68a3..7a396d15f2 100644 --- a/src/components/v-input/v-input.vue +++ b/src/components/v-input/v-input.vue @@ -27,16 +27,16 @@ /> {{ suffix }} - + = props.max) return; - if (props.value < props.max) { - input.value.stepUp(); - emit('input', input.value.value ?? props.min ?? 0); + input.value.stepUp(); + + if (input.value.value) { + return emit('input', input.value.value); } } function stepDown() { if (!input.value) return; if (props.disabled === true) return; + if (props.min !== null && props.value <= props.min) return; - if (props.value > props.min) { - input.value.stepDown(); - emit('input', input.value.value); + input.value.stepDown(); + + if (input.value.value) { + return emit('input', input.value.value); + } else { + return emit('input', props.min || 0); } } }, diff --git a/src/components/v-menu/v-menu.vue b/src/components/v-menu/v-menu.vue index 6cf3a73c70..1a3d651d49 100644 --- a/src/components/v-menu/v-menu.vue +++ b/src/components/v-menu/v-menu.vue @@ -23,6 +23,7 @@ v-if="isActive" v-click-outside="{ handler: deactivate, + middleware: onClickOutsideMiddleware, disabled: isActive === false || closeOnClick === false, events: ['click'], }" @@ -129,6 +130,7 @@ export default defineComponent({ toggle, deactivate, onContentClick, + onClickOutsideMiddleware, styles, arrowStyles, popperPlacement, @@ -176,6 +178,10 @@ export default defineComponent({ } } + function onClickOutsideMiddleware(e: Event) { + return !activator.value?.contains(e.target as Node); + } + function onContentClick() { if (props.closeOnContentClick === true) { deactivate(); diff --git a/src/interfaces/color/color.story.ts b/src/interfaces/color/color.story.ts new file mode 100644 index 0000000000..e3220d3bec --- /dev/null +++ b/src/interfaces/color/color.story.ts @@ -0,0 +1,54 @@ +import withPadding from '../../../.storybook/decorators/with-padding'; +import { defineComponent, ref } from '@vue/composition-api'; +import { withKnobs, array, boolean } from '@storybook/addon-knobs'; +import readme from './readme.md'; +import i18n from '@/lang'; +import RawValue from '../../../.storybook/raw-value.vue'; + +export default { + title: 'Interfaces / Color', + decorators: [withPadding, withKnobs], + parameters: { + notes: readme, + }, +}; + +export const basic = () => + defineComponent({ + i18n, + components: { RawValue }, + props: { + disabled: { + default: boolean('Disabled', false), + }, + presets: { + default: array('Preset Colors', [ + '#EB5757', + '#F2994A', + '#F2C94C', + '#6FCF97', + '#27AE60', + '#56CCF2', + '#2F80ED', + '#9B51E0', + '#BB6BD9', + '#607D8B', + ]), + }, + }, + setup() { + const value = ref(''); + return { value }; + }, + template: ` +
+ + + {{ value }} +
+ `, + }); diff --git a/src/interfaces/color/color.vue b/src/interfaces/color/color.vue new file mode 100644 index 0000000000..282a347c73 --- /dev/null +++ b/src/interfaces/color/color.vue @@ -0,0 +1,307 @@ + + + + diff --git a/src/interfaces/color/index.ts b/src/interfaces/color/index.ts new file mode 100644 index 0000000000..9d7b6a0769 --- /dev/null +++ b/src/interfaces/color/index.ts @@ -0,0 +1,17 @@ +import { defineInterface } from '@/interfaces/define'; +import InterfaceColor from './color.vue'; + +export default defineInterface(({ i18n }) => ({ + id: 'color', + name: i18n.t('color'), + icon: 'palette', + component: InterfaceColor, + options: [ + { + field: 'presets', + name: 'Preset Colors', + width: 'full', + interface: 'repeater', + }, + ], +})); diff --git a/src/interfaces/datetime/datetime.story.ts b/src/interfaces/datetime/datetime.story.ts index 40db466638..bd7fbd045d 100644 --- a/src/interfaces/datetime/datetime.story.ts +++ b/src/interfaces/datetime/datetime.story.ts @@ -47,6 +47,7 @@ export const basic = () => v-model="value" :type="type" /> + {{ value }} `, diff --git a/src/interfaces/datetime/datetime.vue b/src/interfaces/datetime/datetime.vue index 5d84435528..23fb5a3c8a 100644 --- a/src/interfaces/datetime/datetime.vue +++ b/src/interfaces/datetime/datetime.vue @@ -10,7 +10,7 @@ :placeholder="$t('enter_a_value')" > diff --git a/src/interfaces/dropdown-multiselect/dropdown-multiselect.story.ts b/src/interfaces/dropdown-multiselect/dropdown-multiselect.story.ts index 8412672071..99bbf260ee 100644 --- a/src/interfaces/dropdown-multiselect/dropdown-multiselect.story.ts +++ b/src/interfaces/dropdown-multiselect/dropdown-multiselect.story.ts @@ -56,6 +56,7 @@ trim :: Option D :choices="choices" :icon="icon" /> + {{ value }} `, diff --git a/src/interfaces/dropdown/dropdown.story.ts b/src/interfaces/dropdown/dropdown.story.ts index eacd172590..44764e953d 100644 --- a/src/interfaces/dropdown/dropdown.story.ts +++ b/src/interfaces/dropdown/dropdown.story.ts @@ -56,6 +56,7 @@ trim :: Option D :choices="choices" :icon="icon" /> + {{ value }} `, diff --git a/src/interfaces/icon/icon.story.ts b/src/interfaces/icon/icon.story.ts index fa49ea2d44..d716bc6e89 100644 --- a/src/interfaces/icon/icon.story.ts +++ b/src/interfaces/icon/icon.story.ts @@ -36,6 +36,7 @@ export const basic = () => template: `
+ {{value}}
`, diff --git a/src/interfaces/index.ts b/src/interfaces/index.ts index 6d2fc8caf5..78034578bc 100644 --- a/src/interfaces/index.ts +++ b/src/interfaces/index.ts @@ -15,6 +15,7 @@ import InterfaceImage from './image'; import InterfaceIcon from './icon'; import InterfaceManyToOne from './many-to-one'; import InterfaceOneToMany from './one-to-many'; +import InterfaceColor from './color'; import InterfaceHash from './hash'; import InterfaceSlug from './slug'; import InterfaceUser from './user'; @@ -38,6 +39,7 @@ export const interfaces = [ InterfaceIcon, InterfaceManyToOne, InterfaceOneToMany, + InterfaceColor, InterfaceHash, InterfaceSlug, InterfaceUser, diff --git a/src/interfaces/numeric/index.ts b/src/interfaces/numeric/index.ts index 2970da08db..9a643a54de 100644 --- a/src/interfaces/numeric/index.ts +++ b/src/interfaces/numeric/index.ts @@ -15,19 +15,19 @@ export default defineInterface(({ i18n }) => ({ interface: 'text-input', }, { - field: 'minValue', + field: 'min', name: i18n.t('minimum_value'), width: 'half', interface: 'numeric', }, { - field: 'maxValue', + field: 'max', name: i18n.t('maximum_value'), width: 'half', interface: 'numeric', }, { - field: 'stepInterval', + field: 'step', name: i18n.t('step_interval'), width: 'half', interface: 'numeric', diff --git a/src/interfaces/numeric/numeric.vue b/src/interfaces/numeric/numeric.vue index c6008fa90b..897f9cebbe 100644 --- a/src/interfaces/numeric/numeric.vue +++ b/src/interfaces/numeric/numeric.vue @@ -5,9 +5,9 @@ :value="value" :placeholder="placeholder" :disabled="disabled" - :min="minValue" - :max="maxValue" - :step="stepInterval" + :min="min" + :max="max" + :step="step" @input="$listeners.input" >