From 8c28ec92e0ec50d844d90ca13614c598d1c536a7 Mon Sep 17 00:00:00 2001 From: mertmit Date: Fri, 5 Aug 2022 03:17:07 +0300 Subject: [PATCH] feat(gui-v2): select column options Signed-off-by: mertmit --- .../smartsheet-column/EditOrAdd.vue | 1 + .../smartsheet-column/SelectOptions.vue | 104 ++++++++++++++++++ 2 files changed, 105 insertions(+) create mode 100644 packages/nc-gui-v2/components/smartsheet-column/SelectOptions.vue diff --git a/packages/nc-gui-v2/components/smartsheet-column/EditOrAdd.vue b/packages/nc-gui-v2/components/smartsheet-column/EditOrAdd.vue index 607e899f2d..8a16613123 100644 --- a/packages/nc-gui-v2/components/smartsheet-column/EditOrAdd.vue +++ b/packages/nc-gui-v2/components/smartsheet-column/EditOrAdd.vue @@ -139,6 +139,7 @@ watch( /> +
+import Draggable from 'vuedraggable' +import { UITypes } from 'nocodb-sdk' +import { useColumnCreateStoreOrThrow } from '#imports' +import { enumColor } from '@/utils' +import MdiDragIcon from '~icons/mdi/drag-vertical' +import MdiArrowDownDropCircle from '~icons/mdi/arrow-down-drop-circle' +import MdiClose from '~icons/mdi/close' +import MdiPlusIcon from '~icons/mdi/plus' + +const { formState, validateInfos, setAdditionalValidations, sqlUi, onDataTypeChange, onAlter } = useColumnCreateStoreOrThrow() + +let options = $ref([]) +const colorMenus = $ref({}) +const colors = $ref(enumColor.light) + +const validators = { + 'colOptions.options': [ + { + validator: (_: any, opt: any) => { + return new Promise((resolve, reject) => { + for (const opt of options) { + if (!opt.title.length) { + return reject(new Error("Select options can't be null")) + } + if (formState.value.uidt === UITypes.MultiSelect && opt.title.includes(',')) { + return reject(new Error("MultiSelect columns can't have commas(',')")) + } + if (options.filter((el) => el.title === opt.title).length !== 1) { + return reject(new Error("Select options can't have duplicates")) + } + } + resolve() + }) + }, + }, + ], +} + +setAdditionalValidations({ + ...validators, +}) + +const getNextColor = () => { + let tempColor = colors[0] + if (options.length && options[options.length - 1].color) { + const lastColor = colors.indexOf(options[options.length - 1].color) + tempColor = colors[(lastColor + 1) % colors.length] + } + return tempColor +} + +const addNewOption = () => { + const tempOption = { + title: '', + color: getNextColor(), + } + options.push(tempOption) +} + +const removeOption = (index: number) => { + options.splice(index, 1) +} + +onMounted(() => { + if (!formState.value.colOptions?.options) { + formState.value.colOptions = { + options: [], + } + } + options = formState.value.colOptions.options + // Support for older options + for (const op of options.filter((el) => el.order === null)) { + op.title = op.title.replace(/^'/, '').replace(/'$/, '') + } +}) + + + + +