@dou-ui/sheet 0.0.0-stage → 0.1.0-alpha.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +10 -2
- package/dist/cell-types.js +20 -0
- package/dist/cell-types.js.map +1 -0
- package/dist/code/code-formula-bar.js +6 -0
- package/dist/code/code-formula-bar.js.map +1 -0
- package/dist/code/code-formula-bar.vue_vue_type_script_setup_true_lang.js +192 -0
- package/dist/code/code-formula-bar.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/code/index.js +12 -0
- package/dist/code/index.js.map +1 -0
- package/dist/code/language.js +51 -0
- package/dist/code/language.js.map +1 -0
- package/dist/code/style.d.ts +1 -0
- package/dist/code/style.js +2 -0
- package/dist/collaboration/anchor.js +143 -0
- package/dist/collaboration/anchor.js.map +1 -0
- package/dist/collaboration/index.js +770 -0
- package/dist/collaboration/index.js.map +1 -0
- package/dist/collaboration/peers.js +87 -0
- package/dist/collaboration/peers.js.map +1 -0
- package/dist/collaboration/shared.js +450 -0
- package/dist/collaboration/shared.js.map +1 -0
- package/dist/components/cell-panel.js +6 -0
- package/dist/components/cell-panel.js.map +1 -0
- package/dist/components/cell-panel.vue_vue_type_script_setup_true_lang.js +70 -0
- package/dist/components/cell-panel.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/cell-renders.js +40 -0
- package/dist/components/cell-renders.js.map +1 -0
- package/dist/components/date-panel.js +6 -0
- package/dist/components/date-panel.js.map +1 -0
- package/dist/components/date-panel.vue_vue_type_script_setup_true_lang.js +48 -0
- package/dist/components/date-panel.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/filter-panel.js +6 -0
- package/dist/components/filter-panel.js.map +1 -0
- package/dist/components/filter-panel.vue_vue_type_script_setup_true_lang.js +259 -0
- package/dist/components/filter-panel.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/format-dialog.js +6 -0
- package/dist/components/format-dialog.js.map +1 -0
- package/dist/components/format-dialog.vue_vue_type_script_setup_true_lang.js +432 -0
- package/dist/components/format-dialog.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/format-list.js +6 -0
- package/dist/components/format-list.js.map +1 -0
- package/dist/components/format-list.vue_vue_type_script_setup_true_lang.js +187 -0
- package/dist/components/format-list.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/format-presets.js +97 -0
- package/dist/components/format-presets.js.map +1 -0
- package/dist/components/option-panel.js +6 -0
- package/dist/components/option-panel.js.map +1 -0
- package/dist/components/option-panel.vue_vue_type_script_setup_true_lang.js +117 -0
- package/dist/components/option-panel.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/sheet-comment.js +6 -0
- package/dist/components/sheet-comment.js.map +1 -0
- package/dist/components/sheet-comment.vue_vue_type_script_setup_true_lang.js +104 -0
- package/dist/components/sheet-comment.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/sheet-formula-bar.js +6 -0
- package/dist/components/sheet-formula-bar.js.map +1 -0
- package/dist/components/sheet-formula-bar.vue_vue_type_script_setup_true_lang.js +124 -0
- package/dist/components/sheet-formula-bar.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/sheet-link.js +6 -0
- package/dist/components/sheet-link.js.map +1 -0
- package/dist/components/sheet-link.vue_vue_type_script_setup_true_lang.js +249 -0
- package/dist/components/sheet-link.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/sheet-menu.js +6 -0
- package/dist/components/sheet-menu.js.map +1 -0
- package/dist/components/sheet-menu.vue_vue_type_script_setup_true_lang.js +115 -0
- package/dist/components/sheet-menu.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/sheet-name-box.js +6 -0
- package/dist/components/sheet-name-box.js.map +1 -0
- package/dist/components/sheet-name-box.vue_vue_type_script_setup_true_lang.js +91 -0
- package/dist/components/sheet-name-box.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/sheet-note.js +6 -0
- package/dist/components/sheet-note.js.map +1 -0
- package/dist/components/sheet-note.vue_vue_type_script_setup_true_lang.js +146 -0
- package/dist/components/sheet-note.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/sheet-outline.js +6 -0
- package/dist/components/sheet-outline.js.map +1 -0
- package/dist/components/sheet-outline.vue_vue_type_script_setup_true_lang.js +237 -0
- package/dist/components/sheet-outline.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/sheet-tabs.js +6 -0
- package/dist/components/sheet-tabs.js.map +1 -0
- package/dist/components/sheet-tabs.vue_vue_type_script_setup_true_lang.js +487 -0
- package/dist/components/sheet-tabs.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/sheet-toolbar.js +6 -0
- package/dist/components/sheet-toolbar.js.map +1 -0
- package/dist/components/sheet-toolbar.vue_vue_type_script_setup_true_lang.js +1562 -0
- package/dist/components/sheet-toolbar.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/components/validation-dialog.js +6 -0
- package/dist/components/validation-dialog.js.map +1 -0
- package/dist/components/validation-dialog.vue_vue_type_script_setup_true_lang.js +370 -0
- package/dist/components/validation-dialog.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/context.js +12 -0
- package/dist/context.js.map +1 -0
- package/dist/core/address.js +256 -0
- package/dist/core/address.js.map +1 -0
- package/dist/core/axis.js +72 -0
- package/dist/core/axis.js.map +1 -0
- package/dist/core/cell-type.js +30 -0
- package/dist/core/cell-type.js.map +1 -0
- package/dist/core/clipboard.js +141 -0
- package/dist/core/clipboard.js.map +1 -0
- package/dist/core/commands.js +63 -0
- package/dist/core/commands.js.map +1 -0
- package/dist/core/comments.js +74 -0
- package/dist/core/comments.js.map +1 -0
- package/dist/core/conditional.js +362 -0
- package/dist/core/conditional.js.map +1 -0
- package/dist/core/csv.js +191 -0
- package/dist/core/csv.js.map +1 -0
- package/dist/core/data.js +118 -0
- package/dist/core/data.js.map +1 -0
- package/dist/core/document.js +187 -0
- package/dist/core/document.js.map +1 -0
- package/dist/core/extension.js +60 -0
- package/dist/core/extension.js.map +1 -0
- package/dist/core/file.js +336 -0
- package/dist/core/file.js.map +1 -0
- package/dist/core/fill.js +153 -0
- package/dist/core/fill.js.map +1 -0
- package/dist/core/find.js +42 -0
- package/dist/core/find.js.map +1 -0
- package/dist/core/format.js +404 -0
- package/dist/core/format.js.map +1 -0
- package/dist/core/group.js +134 -0
- package/dist/core/group.js.map +1 -0
- package/dist/core/history.js +68 -0
- package/dist/core/history.js.map +1 -0
- package/dist/core/index.js +17 -0
- package/dist/core/link.js +34 -0
- package/dist/core/link.js.map +1 -0
- package/dist/core/merge.js +105 -0
- package/dist/core/merge.js.map +1 -0
- package/dist/core/model.js +48 -0
- package/dist/core/model.js.map +1 -0
- package/dist/core/nav.js +44 -0
- package/dist/core/nav.js.map +1 -0
- package/dist/core/paint.js +106 -0
- package/dist/core/paint.js.map +1 -0
- package/dist/core/plain-cell-types.js +54 -0
- package/dist/core/plain-cell-types.js.map +1 -0
- package/dist/core/protect.js +246 -0
- package/dist/core/protect.js.map +1 -0
- package/dist/core/selection.js +37 -0
- package/dist/core/selection.js.map +1 -0
- package/dist/core/transaction.js +1582 -0
- package/dist/core/transaction.js.map +1 -0
- package/dist/core/validation.js +135 -0
- package/dist/core/validation.js.map +1 -0
- package/dist/core/versions.js +161 -0
- package/dist/core/versions.js.map +1 -0
- package/dist/export/color.js +36 -0
- package/dist/export/color.js.map +1 -0
- package/dist/export/draw.js +316 -0
- package/dist/export/draw.js.map +1 -0
- package/dist/export/index.js +390 -0
- package/dist/export/index.js.map +1 -0
- package/dist/formula/edit.js +210 -0
- package/dist/formula/edit.js.map +1 -0
- package/dist/formula/engine.js +526 -0
- package/dist/formula/engine.js.map +1 -0
- package/dist/formula/error.js +39 -0
- package/dist/formula/error.js.map +1 -0
- package/dist/formula/functions.js +1493 -0
- package/dist/formula/functions.js.map +1 -0
- package/dist/formula/help.js +408 -0
- package/dist/formula/help.js.map +1 -0
- package/dist/formula/index.js +7 -0
- package/dist/formula/parse.js +369 -0
- package/dist/formula/parse.js.map +1 -0
- package/dist/formula/values.js +123 -0
- package/dist/formula/values.js.map +1 -0
- package/dist/formulas.js +30 -0
- package/dist/formulas.js.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/locale.js +1312 -0
- package/dist/locale.js.map +1 -0
- package/dist/sheet.js +6 -0
- package/dist/sheet.js.map +1 -0
- package/dist/sheet.vue_vue_type_script_setup_true_lang.js +7166 -0
- package/dist/sheet.vue_vue_type_script_setup_true_lang.js.map +1 -0
- package/dist/style.css +1 -0
- package/dist/style.d.ts +1 -0
- package/dist/style.js +17 -0
- package/dist/types/cell-types.d.ts +2 -0
- package/dist/types/code/code-formula-bar.vue.d.ts +3 -0
- package/dist/types/code/index.d.ts +12 -0
- package/dist/types/code/language.d.ts +13 -0
- package/dist/types/collaboration/anchor.d.ts +65 -0
- package/dist/types/collaboration/index.d.ts +59 -0
- package/dist/types/collaboration/peers.d.ts +21 -0
- package/dist/types/collaboration/shared.d.ts +75 -0
- package/dist/types/components/cell-panel.vue.d.ts +20 -0
- package/dist/types/components/cell-renders.d.ts +9 -0
- package/dist/types/components/date-panel.vue.d.ts +9 -0
- package/dist/types/components/filter-panel.vue.d.ts +21 -0
- package/dist/types/components/format-dialog.vue.d.ts +24 -0
- package/dist/types/components/format-list.vue.d.ts +25 -0
- package/dist/types/components/format-presets.d.ts +30 -0
- package/dist/types/components/option-panel.vue.d.ts +13 -0
- package/dist/types/components/sheet-comment.vue.d.ts +29 -0
- package/dist/types/components/sheet-formula-bar.vue.d.ts +3 -0
- package/dist/types/components/sheet-link.vue.d.ts +32 -0
- package/dist/types/components/sheet-menu.vue.d.ts +20 -0
- package/dist/types/components/sheet-name-box.vue.d.ts +3 -0
- package/dist/types/components/sheet-note.vue.d.ts +22 -0
- package/dist/types/components/sheet-outline.vue.d.ts +36 -0
- package/dist/types/components/sheet-tabs.vue.d.ts +9 -0
- package/dist/types/components/sheet-toolbar.vue.d.ts +11 -0
- package/dist/types/components/validation-dialog.vue.d.ts +25 -0
- package/dist/types/context.d.ts +189 -0
- package/dist/types/core/address.d.ts +109 -0
- package/dist/types/core/axis.d.ts +23 -0
- package/dist/types/core/cell-type.d.ts +157 -0
- package/dist/types/core/clipboard.d.ts +48 -0
- package/dist/types/core/commands.d.ts +76 -0
- package/dist/types/core/comments.d.ts +22 -0
- package/dist/types/core/conditional.d.ts +114 -0
- package/dist/types/core/csv.d.ts +93 -0
- package/dist/types/core/data.d.ts +26 -0
- package/dist/types/core/document.d.ts +49 -0
- package/dist/types/core/extension.d.ts +177 -0
- package/dist/types/core/file.d.ts +301 -0
- package/dist/types/core/fill.d.ts +23 -0
- package/dist/types/core/find.d.ts +39 -0
- package/dist/types/core/format.d.ts +47 -0
- package/dist/types/core/group.d.ts +76 -0
- package/dist/types/core/history.d.ts +27 -0
- package/dist/types/core/index.d.ts +33 -0
- package/dist/types/core/link.d.ts +14 -0
- package/dist/types/core/merge.d.ts +26 -0
- package/dist/types/core/model.d.ts +363 -0
- package/dist/types/core/nav.d.ts +15 -0
- package/dist/types/core/paint.d.ts +19 -0
- package/dist/types/core/plain-cell-types.d.ts +6 -0
- package/dist/types/core/protect.d.ts +34 -0
- package/dist/types/core/selection.d.ts +25 -0
- package/dist/types/core/transaction.d.ts +470 -0
- package/dist/types/core/validation.d.ts +55 -0
- package/dist/types/core/versions.d.ts +38 -0
- package/dist/types/export/color.d.ts +7 -0
- package/dist/types/export/draw.d.ts +98 -0
- package/dist/types/export/index.d.ts +47 -0
- package/dist/types/formula/edit.d.ts +62 -0
- package/dist/types/formula/engine.d.ts +99 -0
- package/dist/types/formula/error.d.ts +30 -0
- package/dist/types/formula/functions.d.ts +62 -0
- package/dist/types/formula/help.d.ts +12 -0
- package/dist/types/formula/index.d.ts +13 -0
- package/dist/types/formula/parse.d.ts +92 -0
- package/dist/types/formula/values.d.ts +65 -0
- package/dist/types/formulas.d.ts +32 -0
- package/dist/types/index.d.ts +225 -0
- package/dist/types/locale.d.ts +531 -0
- package/dist/types/sheet.vue.d.ts +60 -0
- package/dist/types/types.d.ts +498 -0
- package/dist/types/use-comments.d.ts +47 -0
- package/dist/types/use-messages.d.ts +7 -0
- package/dist/use-comments.js +130 -0
- package/dist/use-comments.js.map +1 -0
- package/dist/use-messages.js +29 -0
- package/dist/use-messages.js.map +1 -0
- package/package.json +93 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sheet-toolbar.vue_vue_type_script_setup_true_lang.js","names":["_openBlock","_createElementBlock","_createVNode","_unref","_normalizeClass","_withCtx","_renderSlot","_Fragment","_renderList","_createBlock","_createElementVNode","_createSlots","_createTextVNode","_toDisplayString","_resolveDynamicComponent","_createCommentVNode","_normalizeStyle","FormatDialog","ValidationDialog","FormatList"],"sources":["../../src/components/sheet-toolbar.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n BaselineIcon,\n BoldIcon,\n CellsMergeIcon,\n ChevronDownIcon,\n DecimalDecreaseIcon,\n DecimalIncreaseIcon,\n DownloadIcon,\n FilterIcon,\n ItalicIcon,\n PaintBucketIcon,\n PaletteIcon,\n SortAscendingIcon,\n SortDescendingIcon,\n SortIcon,\n RedoIcon,\n StrikethroughIcon,\n TableFreezeIcon,\n TableCheckIcon,\n TableHighlightIcon,\n TextAlignCenterIcon,\n TextAlignLeftIcon,\n TextAlignRightIcon,\n TextValignBottomIcon,\n TextValignMiddleIcon,\n TextValignTopIcon,\n TypeXIcon,\n UnderlineIcon,\n UndoIcon,\n UploadIcon,\n WrapTextIcon,\n LinkIcon,\n ShieldLockIcon,\n} from '@dou-ui/icons'\nimport {\n DouButton,\n DouColorPanel,\n DouDropdown,\n DouDropdownItem,\n DouDropdownRadioGroup,\n DouDropdownSub,\n DouPopover,\n DouToggle,\n DouToggleGroup,\n DouToolbar,\n DouToolbarSeparator,\n DouTooltip,\n type ToggleValue,\n type Tone,\n} from 'dou-ui'\nimport {\n computed,\n nextTick,\n onBeforeUnmount,\n onMounted,\n ref,\n useTemplateRef,\n watch,\n type Component,\n} from 'vue'\nimport { useSheet } from '../context'\nimport { boundsOf, columnName, formatRange, inBounds, parseRange } from '../core/address'\nimport { changeDecimals, formatValue } from '../core/format'\nimport { rangesOf, ruleRangeText } from '../core/conditional'\nimport type {\n SheetConditionalFormat,\n SheetRuleRange,\n SheetStyle,\n SheetValidation,\n} from '../core/model'\nimport FormatDialog from './format-dialog.vue'\nimport FormatList from './format-list.vue'\nimport ValidationDialog from './validation-dialog.vue'\nimport {\n barSwatch,\n LOOKS,\n SCALES,\n scaleSwatch,\n TONES,\n toneKey,\n type SheetScaleColors,\n} from './format-presets'\nimport { format } from '../locale'\nimport type { SheetExportScope } from '../core/file'\nimport type {\n SheetFormatOption,\n SheetMenuItem,\n SheetToolbarItem,\n SheetToolbarProps,\n SheetToolbarSlots,\n SheetToolbarTool,\n} from '../types'\n\ndefineOptions({ name: 'DouSheetToolbar' })\n\nconst props = defineProps<SheetToolbarProps>()\ndefineSlots<SheetToolbarSlots>()\n\nconst sheet = useSheet()\nconst { messages: m, active } = sheet\n\nconst DEFAULT_TOOLS: SheetToolbarTool[] = [\n 'undo',\n 'redo',\n '|',\n 'format',\n 'decimals',\n '|',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n '|',\n 'color',\n 'fill',\n '|',\n 'align',\n 'valign',\n 'wrap',\n '|',\n 'merge',\n 'freeze',\n 'link',\n '|',\n 'sort',\n 'filter',\n 'conditional',\n 'validation',\n 'protect',\n '|',\n 'clear',\n]\n\nconst BUILT_IN = new Set<string>([...DEFAULT_TOOLS, 'export', 'import'])\n\n/** The protect menu: locking the selection, then protecting the sheet and the workbook. */\nconst PROTECT_COMMANDS = ['lock', 'protect.sheet', 'protect.workbook'] as const\n\n/** A tool that isn't built in, ready to draw: an extension's item, or a command by name. */\ninterface ExtraTool {\n key: string\n label: string\n icon?: Component\n shortcut?: string\n /** `undefined` for a plain button. */\n pressed?: boolean\n disabled: boolean\n run?: () => void\n children?: SheetMenuItem[]\n}\n\n/** An item filled in from its command. */\nfunction extraTool(item: SheetToolbarItem): ExtraTool {\n const name = item.command\n const info = name ? sheet.commands.get(name) : undefined\n if (name && !info)\n throw new Error(\n `[@dou-ui/sheet] the toolbar item \"${item.key}\" runs no command: \"${name}\" is unknown`,\n )\n return {\n key: item.key,\n label: item.label ?? info?.label ?? item.key,\n icon: item.icon ?? info?.icon,\n shortcut: item.shortcut ?? info?.shortcut,\n pressed: item.pressed ?? (name && info!.toggle ? sheet.commands.pressed(name) : undefined),\n disabled: item.disabled ?? (name ? !sheet.commands.can(name) : false),\n run: item.run ?? (name ? () => void sheet.commands.run(name) : undefined),\n children: item.children,\n }\n}\n/** The extensions' items, by key. */\nconst extensionItems = computed(() => {\n const map = new Map<string, SheetToolbarItem>()\n for (const item of sheet.toolbarItems.value) {\n if (BUILT_IN.has(item.key) || map.has(item.key))\n throw new Error(\n `[@dou-ui/sheet] the toolbar item \"${item.key}\" is added twice, or has the name of a built-in tool`,\n )\n warnOnce(item)\n map.set(item.key, item)\n }\n return map\n})\n\n// by key: extensions often give new item objects on every update\nconst warned = new Set<string>()\n/** Says once when an item can't show a name or does nothing when pressed. */\nfunction warnOnce(item: SheetToolbarItem) {\n // the app's bundler replaces this, as for Vue's own warnings\n if (process.env.NODE_ENV === 'production' || warned.has(item.key)) return\n warned.add(item.key)\n if (!item.command && !item.label)\n console.warn(\n `[@dou-ui/sheet] the toolbar item \"${item.key}\" has no label or command, so it shows its key`,\n )\n if (!item.command && !item.run && !item.children?.length)\n console.warn(\n `[@dou-ui/sheet] the toolbar item \"${item.key}\" has no run, command or children: pressing it does nothing`,\n )\n}\n\n/**\n * Built-in tools of one button that an extension's command replaced: they\n * are drawn from the command, with its label, icon and state.\n */\nconst SINGLE = new Set([\n 'undo',\n 'redo',\n 'bold',\n 'italic',\n 'underline',\n 'strike',\n 'wrap',\n 'merge',\n 'filter',\n 'clear',\n 'link',\n])\nconst replaced = (tool: string) => SINGLE.has(tool) && sheet.commands.get(tool)?.builtin === false\n\n/** The tools to show, without separators at either end or two in a row. */\nconst tools = computed(() => {\n const list = props.tools ?? [...DEFAULT_TOOLS, '|', ...extensionItems.value.keys()]\n const out: string[] = []\n for (const tool of list)\n if (tool !== '|' || (out.length && out[out.length - 1] !== '|')) out.push(tool)\n if (out[out.length - 1] === '|') out.pop()\n return out\n})\n\n/** The tools that aren't built in, by name. */\nconst extras = computed(() => {\n const map = new Map<string, ExtraTool>()\n for (const tool of tools.value) {\n if (replaced(tool)) {\n map.set(tool, extraTool({ key: tool, command: tool }))\n continue\n }\n if (tool === '|' || BUILT_IN.has(tool)) continue\n const item = extensionItems.value.get(tool)\n if (item) map.set(tool, extraTool(item))\n else if (sheet.commands.has(tool)) map.set(tool, extraTool({ key: tool, command: tool }))\n else\n throw new Error(\n `[@dou-ui/sheet] the toolbar has no tool \"${tool}\": it is no built-in tool, item of an extension or command`,\n )\n }\n return map\n})\n\n/** Runs a command from a tool, then gives the keys back to the grid after a press. */\nfunction run(name: string, arg?: unknown) {\n sheet.commands.run(name, arg)\n done()\n}\nconst can = (name: string) => sheet.commands.can(name)\nconst on = (name: string) => sheet.commands.pressed(name)\n\nfunction runExtra(item: ExtraTool) {\n item.run?.()\n done()\n}\nfunction runChild(child: SheetMenuItem) {\n const name = child.command\n if (child.run) child.run()\n else if (name) sheet.commands.run(name)\n done()\n}\nconst childLabel = (child: SheetMenuItem) =>\n child.label ??\n (child.command ? (sheet.commands.get(child.command)?.label ?? child.key) : child.key)\nconst childIcon = (child: SheetMenuItem) =>\n child.icon ?? (child.command ? sheet.commands.get(child.command)?.icon : undefined)\nconst childShortcut = (child: SheetMenuItem) =>\n child.shortcut ?? (child.command ? sheet.commands.get(child.command)?.shortcut : undefined)\n// shortcuts mean nothing without a keyboard, as in the right-click menu\n// Read once mounted, so server-rendered markup matches the first render.\nconst coarse = ref(false)\nonMounted(() => {\n coarse.value = typeof matchMedia !== 'undefined' && matchMedia('(pointer: coarse)').matches\n})\nconst childDisabled = (child: SheetMenuItem) =>\n child.disabled ?? (child.command ? !sheet.commands.can(child.command) : false)\n\nconst disabled = computed(() => sheet.readonly.value)\nconst style = computed<SheetStyle>(() => sheet.styleAt(active.value))\nconst cellFormat = computed(() => sheet.formatAt(active.value))\n\n// After a pointer press the keys go back to the grid; from the keyboard,\n// focus stays on the toolbar.\nlet pointer = false\nfunction onPointerDown(event: PointerEvent) {\n pointer = true\n // a press on a button doesn't take the focus from the grid (or the cell being edited)\n if (event.pointerType === 'mouse' && (event.target as Element).closest('button'))\n event.preventDefault()\n}\nfunction onKeyDown() {\n pointer = false\n}\nfunction done() {\n if (pointer) void nextTick(() => sheet.focus())\n}\n\nconst menuOpen = ref<string | null>(null)\nfunction onMenu(tool: string, open: boolean) {\n if (open) menuOpen.value = tool\n else if (menuOpen.value === tool) {\n menuOpen.value = null\n done()\n }\n}\n\n// Export and import --------------------------------------------------------------------\n\n/** Whether more than one cell is selected, so exporting the selection means something. */\nconst manySelected = computed(() => {\n const { ranges } = sheet.selection.value\n if (ranges.length !== 1) return true\n const { start, end } = ranges[0]!\n return start.row !== end.row || start.col !== end.col\n})\nconst exportItems = computed(() =>\n sheet.exporters.value.map((exporter) => {\n const scopes = exporter.scopes.filter((scope) => scope !== 'selection' || manySelected.value)\n return {\n name: exporter.name,\n label: exporter.label,\n icon: exporter.icon,\n extension: exporter.extension,\n // a choice of what to write only when there is one\n scopes: scopes.length > 1 ? scopes : [],\n scope: scopes[0],\n }\n }),\n)\nfunction exportWith(name: string, scope?: SheetExportScope) {\n done()\n const exporter = sheet.exporters.value.find((e) => e.name === name)!\n const fileName =\n typeof props.fileName === 'function'\n ? props.fileName(exporter, scope ?? exporter.scopes[0]!)\n : props.fileName && `${props.fileName}.${exporter.extension}`\n // a failure shows over the grid and comes as the sheet's `file-error`\n sheet.saveFile(name, { scope, fileName }).catch(() => {})\n}\n\nconst picker = useTemplateRef<HTMLInputElement>('picker')\nfunction pickFile() {\n picker.value?.click()\n}\nfunction onPicked(event: Event) {\n const input = event.target as HTMLInputElement\n const file = input.files?.[0]\n // the same file can be picked again\n input.value = ''\n // back to the grid, so the button's tooltip doesn't stay up after the picker closes\n void nextTick(() => sheet.focus())\n // a failure shows over the grid and comes as the sheet's `file-error`\n if (file) sheet.importFile(file).catch(() => {})\n}\nfunction onPickCancel() {\n void nextTick(() => sheet.focus())\n}\n\n// Bold, italic, underline, strikethrough ------------------------------------------------\n\ntype StyleToggle = 'bold' | 'italic' | 'underline' | 'strike'\nconst STYLE: Record<StyleToggle, { icon: Component; key: string }> = {\n bold: { icon: BoldIcon, key: 'mod+b' },\n italic: { icon: ItalicIcon, key: 'mod+i' },\n underline: { icon: UnderlineIcon, key: 'mod+u' },\n strike: { icon: StrikethroughIcon, key: 'mod+shift+x' },\n}\nconst isStyleTool = (tool: string): tool is StyleToggle => tool in STYLE\n\n// Number formats --------------------------------------------------------------------------\n\nconst formats = computed<SheetFormatOption[]>(\n () =>\n props.formats ?? [\n { label: m.value.formatGeneral, format: undefined, example: 1234.5 },\n { label: m.value.formatNumber, format: '#,##0.00', example: 1234.5 },\n { label: m.value.formatPercent, format: '0.00%', example: 0.1234 },\n { label: m.value.formatCurrency, format: m.value.currencyFormat, example: 1234.5 },\n { label: m.value.formatDate, format: 'yyyy-mm-dd', example: '2026-03-05' },\n { label: m.value.formatTime, format: 'hh:mm', example: '09:30' },\n { label: m.value.formatText, format: '@' },\n ],\n)\n/**\n * The option the cell's format is, or is with other decimals or grouping:\n * `¥#,##0.000` is still currency, `0.0%` still percent and `0.0` a number.\n */\nconst formatShown = computed(() => {\n const current = cellFormat.value\n const exact = formats.value.find((option) => option.format === current)\n if (exact || !current) return exact ?? null\n const kind = withoutDecimals(current)\n return (\n formats.value.find((option) => option.format && withoutDecimals(option.format) === kind) ?? null\n )\n})\nconst formatLabel = computed(() => formatShown.value?.label ?? m.value.formatCustom)\n// the kind of a format: without decimals and grouping, so `0.00` is a number like `#,##0.00`\nconst withoutDecimals = (pattern: string) =>\n changeDecimals(pattern, null, -99)!.replace(/[#,](?=[#,0]*0)/g, '')\nconst exampleOf = (option: SheetFormatOption) =>\n option.example == null ? '' : formatValue(option.example, option.format)\n\nfunction setFormat(option: SheetFormatOption) {\n sheet.formatSelection(option.format)\n done()\n}\n\n// Colors ----------------------------------------------------------------------------------\n\nconst toneLabel = (tone: Tone) => m.value[toneKey(tone)]\n\ntype ColorTool = 'color' | 'fill'\nconst colorOpen = ref<ColorTool | null>(null)\nconst custom = ref<ColorTool | null>(null)\nconst customColor = ref<string | null>(null)\n\n/** The color a tool shows now: a tone, a CSS color, or `null` for none. */\nfunction colorOf(tool: ColorTool) {\n const s = style.value\n return tool === 'color'\n ? { tone: s.color ? undefined : s.tone, css: s.color }\n : { tone: s.background ? undefined : s.fill, css: s.background }\n}\n\n/** What the mark under the icon is drawn in. */\nfunction swatchOf(tool: ColorTool) {\n const { tone, css } = colorOf(tool)\n if (css) return css\n if (!tone) return undefined\n return tool === 'color' ? `var(--dou-color-${tone}-text)` : `var(--dou-color-${tone})`\n}\n\nfunction setColor(tool: ColorTool, value: { tone?: Tone; css?: string }, close = true) {\n sheet.styleSelection(\n tool === 'color'\n ? { tone: value.tone, color: value.css }\n : { fill: value.tone, background: value.css },\n )\n if (close) {\n colorOpen.value = null\n done()\n }\n}\n\n/** Opens the color panel, starting from the color the cell shows now. */\nfunction openCustom(tool: ColorTool, event: MouseEvent) {\n custom.value = custom.value === tool ? null : tool\n const css = colorOf(tool).css\n if (css) customColor.value = css\n else {\n const shown = (event.currentTarget as HTMLElement)\n .closest('.dou-sheet-toolbar__colors')\n ?.querySelector<HTMLElement>('[aria-pressed=\"true\"]')\n const look = shown && getComputedStyle(shown)\n customColor.value = (look && (tool === 'color' ? look.color : look.backgroundColor)) || null\n }\n}\nwatch(colorOpen, (open) => {\n if (open) return\n custom.value = null\n done()\n})\n\n// Alignment -------------------------------------------------------------------------------\n\nconst ALIGN = [\n { value: 'left', icon: TextAlignLeftIcon, label: 'alignLeft' },\n { value: 'center', icon: TextAlignCenterIcon, label: 'alignCenter' },\n { value: 'right', icon: TextAlignRightIcon, label: 'alignRight' },\n] as const\nconst VALIGN = [\n { value: 'top', icon: TextValignTopIcon, label: 'alignTop' },\n { value: 'middle', icon: TextValignMiddleIcon, label: 'alignMiddle' },\n { value: 'bottom', icon: TextValignBottomIcon, label: 'alignBottom' },\n] as const\n\n// what the cell does without a style: numbers right, text left, and the middle\nconst align = computed(() => ALIGN.find((a) => on(`align.${a.value}`))?.value ?? null)\nconst valign = computed(() => VALIGN.find((v) => on(`valign.${v.value}`))?.value ?? 'middle')\nconst valignIcon = computed(() => VALIGN.find((v) => v.value === valign.value)!.icon)\n\nfunction setAlign(value: ToggleValue | ToggleValue[] | null) {\n if (typeof value === 'string') run(`align.${value}`)\n}\n\n// Conditional formats ---------------------------------------------------------------------\n\n/** The selected ranges, as names such as `D2:D40`. */\nfunction selectedRanges() {\n const data = sheet.sheet.value\n const size = { rows: data.rowCount ?? 1000, cols: data.colCount ?? 26 }\n return sheet.selection.value.ranges.map((range) => formatRange(range, size))\n}\n/** The selection as a rule's range, which a new rule starts with: one range, or several. */\nfunction selectedRange(): SheetRuleRange {\n const ranges = selectedRanges()\n return ranges.length === 1 ? ranges[0]! : ranges\n}\n/** Whether a rule's ranges hold a cell. */\nconst ruleHolds = (range: SheetRuleRange, row: number, col: number) =>\n rangesOf(range).some((text) => {\n const r = parseRange(text)\n return !!r && inBounds(boundsOf(r), row, col)\n })\n\nfunction addFormats(list: SheetConditionalFormat[]) {\n if (!list.length) return\n sheet.transact(\n (tr) => {\n for (const f of list) tr.addConditionalFormat(f)\n },\n { action: 'format' },\n )\n sheet.announce(\n format(m.value.formats.added, { range: list.map((f) => ruleRangeText(f.range)).join(', ') }),\n )\n done()\n}\n\n/** The menu items that open the dialog, and the rule each starts with. */\nconst HIGHLIGHTS = ['gt', 'lt', 'between', 'eq', 'contains', 'duplicates', 'formula'] as const\nconst RANKS = ['top', 'bottom', 'above', 'below'] as const\ntype FormatItem = (typeof HIGHLIGHTS)[number] | (typeof RANKS)[number]\nfunction startOf(item: FormatItem, range: SheetRuleRange): SheetConditionalFormat {\n const look = { ...LOOKS.danger }\n switch (item) {\n case 'duplicates':\n return { range, duplicates: true, style: look }\n case 'formula':\n return { range, formula: '', style: look }\n case 'top':\n return { range, top: 10, style: look }\n case 'bottom':\n return { range, bottom: 10, style: look }\n case 'above':\n case 'below':\n return { range, average: item, style: look }\n default:\n return { range, when: { op: item }, style: look }\n }\n}\n\nconst dialogFormat = ref<SheetConditionalFormat>({ range: '', when: { op: 'gt' }, style: {} })\nconst dialogTitle = ref('')\nconst dialogOpen = ref(false)\n/** The rule being edited, by its place in the list; `-1` adds one. */\nconst editing = ref(-1)\nfunction openFormat(item: FormatItem) {\n dialogFormat.value = startOf(item, selectedRange())\n dialogTitle.value = m.value.formats[item].replace(/…$/, '')\n editing.value = -1\n dialogOpen.value = true\n}\nfunction editFormat(index: number) {\n dialogFormat.value = conditionals.value[index]!\n dialogTitle.value = m.value.formats.editTitle\n editing.value = index\n dialogOpen.value = true\n}\nfunction applyFormat(f: SheetConditionalFormat) {\n if (editing.value < 0) return addFormats([f])\n const list = [...conditionals.value]\n list[editing.value] = f\n setFormats(list)\n}\nfunction dialogClosed() {\n // editing from the list goes back to it, which keeps the focus\n if (!listOpen.value) sheet.focus()\n}\n// Data validation --------------------------------------------------------------------------\n\nconst validations = computed(() => sheet.sheet.value.validations ?? [])\nconst ruleOpen = ref(false)\nconst rule = ref<SheetValidation>({ range: '', list: [] })\n/** The rule being edited, by its place in the sheet's; `-1` adds one. */\nconst ruleIndex = ref(-1)\n/** Opens the rule of the active cell, or a new one for the selection. */\nfunction openValidation() {\n const { row, col } = active.value\n ruleIndex.value = validations.value.findIndex((r) => ruleHolds(r.range, row, col))\n rule.value =\n ruleIndex.value >= 0\n ? validations.value[ruleIndex.value]!\n : { range: selectedRange(), list: [] }\n ruleOpen.value = true\n}\nfunction applyValidation(next: SheetValidation) {\n const list = [...validations.value]\n if (ruleIndex.value >= 0) list[ruleIndex.value] = next\n else list.push(next)\n sheet.transact((tr) => tr.setValidations(list), { action: 'validation' })\n sheet.announce(format(m.value.validation.added, { range: ruleRangeText(next.range) }))\n}\nfunction removeValidation() {\n const gone = validations.value[ruleIndex.value]\n if (!gone) return\n sheet.transact((tr) => tr.setValidations(validations.value.filter((r) => r !== gone)), {\n action: 'validation',\n })\n sheet.announce(format(m.value.validation.removed, { range: ruleRangeText(gone.range) }))\n}\n\nconst listOpen = ref(false)\nconst conditionals = computed(() => sheet.sheet.value.conditionalFormats ?? [])\nfunction setFormats(next: SheetConditionalFormat[]) {\n sheet.transact((tr) => tr.setConditionalFormats(next), { action: 'format' })\n}\nfunction clearFormats(all: boolean) {\n const before = conditionals.value.length\n sheet.transact(\n (tr) => {\n if (all) tr.clearConditionalFormats()\n else for (const range of selectedRanges()) tr.clearConditionalFormats(range)\n },\n { action: 'format' },\n )\n const count = before - (sheet.sheet.value.conditionalFormats?.length ?? 0)\n sheet.announce(format(m.value.formats.cleared, { count }))\n done()\n}\n\nfunction addScale(colors: SheetScaleColors) {\n addFormats([{ range: selectedRange(), scale: [...colors] as SheetScaleColors }])\n}\nfunction addBar(tone: Tone) {\n addFormats([{ range: selectedRange(), bar: tone }])\n}\n\n// Merge and freeze ------------------------------------------------------------------------\n\nconst freeze = computed(() => sheet.sheet.value.freeze ?? {})\nfunction setFreeze(rows: number, cols: number) {\n sheet.transact(\n (tr) =>\n tr.updateSheet({\n freeze: rows || cols ? { rows: rows || undefined, cols: cols || undefined } : undefined,\n }),\n { action: 'freeze' },\n )\n done()\n}\nconst freezeItems = computed(() => {\n const { row, col } = active.value\n const f = freeze.value\n const items = [\n { key: 'row1', label: m.value.freezeFirstRow, rows: 1, cols: f.cols ?? 0 },\n { key: 'col1', label: m.value.freezeFirstCol, rows: f.rows ?? 0, cols: 1 },\n ]\n if (row > 0)\n items.push({\n key: 'rows',\n label: format(m.value.freezeRows, { n: row + 1 }),\n rows: row + 1,\n cols: f.cols ?? 0,\n })\n if (col > 0)\n items.push({\n key: 'cols',\n label: format(m.value.freezeCols, { col: columnName(col) }),\n rows: f.rows ?? 0,\n cols: col + 1,\n })\n return items\n})\nconst frozen = computed(() => !!(freeze.value.rows || freeze.value.cols))\n\n// Too narrow for every tool: one row that scrolls sideways, faded at the side with more\n\nconst bar = useTemplateRef<InstanceType<typeof DouToolbar>>('bar')\nconst barEl = computed(() => (bar.value?.$el as HTMLElement | undefined) ?? null)\nconst more = ref({ start: false, end: false })\nfunction measure() {\n const el = barEl.value\n if (!el) return\n const start = el.scrollLeft > 1\n const end = el.scrollLeft + el.clientWidth < el.scrollWidth - 1\n if (start !== more.value.start || end !== more.value.end) more.value = { start, end }\n}\nlet observer: ResizeObserver | undefined\nwatch(\n barEl,\n (el) => {\n observer?.disconnect()\n if (!el || typeof ResizeObserver === 'undefined') return\n observer = new ResizeObserver(measure)\n observer.observe(el)\n },\n { flush: 'post' },\n)\nonBeforeUnmount(() => observer?.disconnect())\n</script>\n\n<template>\n <div class=\"dou-sheet-toolbar\">\n <DouToolbar\n ref=\"bar\"\n size=\"sm\"\n class=\"dou-sheet-toolbar__bar\"\n :class=\"{ 'has-more-start': more.start, 'has-more-end': more.end }\"\n :aria-label=\"m.toolbar\"\n @pointerdown=\"onPointerDown\"\n @keydown=\"onKeyDown\"\n @scroll.passive=\"measure\"\n >\n <slot name=\"start\" />\n <template v-for=\"(tool, i) in tools\" :key=\"tool === '|' ? `|${i}` : tool\">\n <DouToolbarSeparator v-if=\"tool === '|'\" />\n\n <template v-else-if=\"extras.get(tool)?.children\">\n <template v-for=\"item in [extras.get(tool)!]\" :key=\"item.key\">\n <DouTooltip\n :content=\"item.label\"\n :disabled=\"menuOpen === tool || !item.icon\"\n placement=\"bottom\"\n >\n <span class=\"dou-sheet-toolbar__trigger\">\n <DouDropdown\n :open=\"menuOpen === tool\"\n placement=\"bottom-start\"\n :disabled=\"item.disabled\"\n @update:open=\"onMenu(tool, $event)\"\n >\n <DouButton\n variant=\"ghost\"\n class=\"dou-sheet-toolbar__menu\"\n :aria-label=\"item.label\"\n >\n <component :is=\"item.icon\" v-if=\"item.icon\" />\n <span v-else class=\"dou-sheet-toolbar__text\">{{ item.label }}</span>\n <template #trailing><ChevronDownIcon /></template>\n </DouButton>\n <template #menu>\n <template v-for=\"child in item.children\" :key=\"child.key\">\n <DouDropdownSub\n v-if=\"child.children?.length\"\n :title=\"childLabel(child)\"\n :divided=\"child.divided\"\n >\n <DouDropdownItem\n v-for=\"grand in child.children\"\n :key=\"grand.key\"\n :disabled=\"childDisabled(grand)\"\n :divided=\"grand.divided\"\n :tone=\"grand.tone\"\n :shortcut=\"coarse ? undefined : childShortcut(grand)\"\n @click=\"runChild(grand)\"\n >\n <template v-if=\"childIcon(grand)\" #prefix>\n <component :is=\"childIcon(grand)\" />\n </template>\n {{ childLabel(grand) }}\n </DouDropdownItem>\n </DouDropdownSub>\n <DouDropdownItem\n v-else\n :disabled=\"childDisabled(child)\"\n :divided=\"child.divided\"\n :tone=\"child.tone\"\n :shortcut=\"coarse ? undefined : childShortcut(child)\"\n @click=\"runChild(child)\"\n >\n <template v-if=\"childIcon(child)\" #prefix>\n <component :is=\"childIcon(child)\" />\n </template>\n {{ childLabel(child) }}\n </DouDropdownItem>\n </template>\n </template>\n </DouDropdown>\n </span>\n </DouTooltip>\n </template>\n </template>\n\n <template v-else-if=\"extras.get(tool)\">\n <template v-for=\"item in [extras.get(tool)!]\" :key=\"item.key\">\n <DouTooltip\n :content=\"item.label\"\n :shortcut=\"item.shortcut\"\n :disabled=\"!item.icon && !item.shortcut\"\n placement=\"bottom\"\n >\n <DouToggle\n v-if=\"item.pressed !== undefined\"\n :pressed=\"item.pressed\"\n :aria-label=\"item.label\"\n :aria-keyshortcuts=\"item.shortcut\"\n :disabled=\"item.disabled\"\n @update:pressed=\"runExtra(item)\"\n >\n <component :is=\"item.icon\" v-if=\"item.icon\" />\n <span v-else class=\"dou-sheet-toolbar__text\">{{ item.label }}</span>\n </DouToggle>\n <DouButton\n v-else\n variant=\"ghost\"\n :aria-label=\"item.label\"\n :aria-keyshortcuts=\"item.shortcut\"\n :disabled=\"item.disabled\"\n @click=\"runExtra(item)\"\n >\n <component :is=\"item.icon\" v-if=\"item.icon\" />\n <span v-else class=\"dou-sheet-toolbar__text\">{{ item.label }}</span>\n </DouButton>\n </DouTooltip>\n </template>\n </template>\n\n <template v-else-if=\"tool === 'undo' || tool === 'redo'\">\n <DouTooltip\n :content=\"m[tool]\"\n :shortcut=\"tool === 'undo' ? 'mod+z' : 'mod+shift+z'\"\n placement=\"bottom\"\n >\n <DouButton\n variant=\"ghost\"\n :aria-label=\"m[tool]\"\n :disabled=\"!can(tool)\"\n @click=\"run(tool)\"\n >\n <UndoIcon v-if=\"tool === 'undo'\" />\n <RedoIcon v-else />\n </DouButton>\n </DouTooltip>\n </template>\n\n <DouDropdown\n v-else-if=\"tool === 'format'\"\n :open=\"menuOpen === tool\"\n placement=\"bottom-start\"\n :disabled=\"disabled\"\n @update:open=\"onMenu(tool, $event)\"\n >\n <DouButton\n variant=\"ghost\"\n class=\"dou-sheet-toolbar__format\"\n :aria-label=\"`${m.numberFormat}:${formatLabel}`\"\n >\n <span class=\"dou-sheet-toolbar__format-label\">{{ formatLabel }}</span>\n <template #trailing><ChevronDownIcon /></template>\n </DouButton>\n <template #menu>\n <DouDropdownRadioGroup :model-value=\"formatShown ? formats.indexOf(formatShown) : -1\">\n <DouDropdownItem\n v-for=\"(option, i) in formats\"\n :key=\"option.label\"\n :value=\"i\"\n class=\"dou-sheet-toolbar__format-item\"\n @click=\"setFormat(option)\"\n >\n {{ option.label }}\n <template #suffix>\n <span class=\"dou-sheet-toolbar__example\">{{ exampleOf(option) }}</span>\n </template>\n </DouDropdownItem>\n </DouDropdownRadioGroup>\n </template>\n </DouDropdown>\n\n <template v-else-if=\"tool === 'decimals'\">\n <DouTooltip\n v-for=\"by in [-1, 1]\"\n :key=\"by\"\n :content=\"by < 0 ? m.fewerDecimals : m.moreDecimals\"\n placement=\"bottom\"\n >\n <DouButton\n variant=\"ghost\"\n :aria-label=\"by < 0 ? m.fewerDecimals : m.moreDecimals\"\n :disabled=\"!can(by < 0 ? 'decimals.fewer' : 'decimals.more')\"\n @click=\"run(by < 0 ? 'decimals.fewer' : 'decimals.more')\"\n >\n <DecimalDecreaseIcon v-if=\"by < 0\" />\n <DecimalIncreaseIcon v-else />\n </DouButton>\n </DouTooltip>\n </template>\n\n <DouTooltip\n v-else-if=\"isStyleTool(tool)\"\n :content=\"m[tool]\"\n :shortcut=\"STYLE[tool].key\"\n placement=\"bottom\"\n >\n <DouToggle\n :pressed=\"on(tool)\"\n :aria-label=\"m[tool]\"\n :disabled=\"!can(tool)\"\n @update:pressed=\"run(tool, $event)\"\n >\n <component :is=\"STYLE[tool].icon\" />\n </DouToggle>\n </DouTooltip>\n\n <DouTooltip\n v-else-if=\"tool === 'color' || tool === 'fill'\"\n :content=\"tool === 'color' ? m.textColor : m.fillColor\"\n :disabled=\"colorOpen === tool\"\n placement=\"bottom\"\n >\n <span class=\"dou-sheet-toolbar__trigger\">\n <DouPopover\n :open=\"colorOpen === tool\"\n placement=\"bottom-start\"\n :disabled=\"disabled\"\n @update:open=\"colorOpen = $event ? tool : colorOpen === tool ? null : colorOpen\"\n >\n <DouButton\n variant=\"ghost\"\n class=\"dou-sheet-toolbar__color\"\n :class=\"`is-${tool}`\"\n :style=\"{ '--dou-sheet-swatch': swatchOf(tool) }\"\n :aria-label=\"tool === 'color' ? m.textColor : m.fillColor\"\n :aria-expanded=\"colorOpen === tool\"\n >\n <BaselineIcon v-if=\"tool === 'color'\" />\n <PaintBucketIcon v-else />\n </DouButton>\n <template #content>\n <div\n class=\"dou-sheet-toolbar__colors\"\n :aria-label=\"tool === 'color' ? m.textColor : m.fillColor\"\n role=\"group\"\n >\n <button\n type=\"button\"\n class=\"dou-sheet-toolbar__swatch is-default\"\n :class=\"`is-${tool}`\"\n :aria-pressed=\"!colorOf(tool).tone && !colorOf(tool).css\"\n :aria-label=\"m.colorDefault\"\n :title=\"m.colorDefault\"\n @click=\"setColor(tool, {})\"\n />\n <button\n v-for=\"tone in TONES\"\n :key=\"tone\"\n type=\"button\"\n class=\"dou-sheet-toolbar__swatch\"\n :class=\"[`is-${tool}`, `is-tone-${tone}`]\"\n :aria-pressed=\"colorOf(tool).tone === tone\"\n :aria-label=\"toneLabel(tone)\"\n :title=\"toneLabel(tone)\"\n @click=\"setColor(tool, { tone })\"\n >\n <span v-if=\"tool === 'color'\" aria-hidden=\"true\">A</span>\n </button>\n <button\n type=\"button\"\n class=\"dou-sheet-toolbar__swatch is-custom\"\n :class=\"`is-${tool}`\"\n :aria-pressed=\"!!colorOf(tool).css\"\n :aria-expanded=\"custom === tool\"\n :aria-label=\"m.colorCustom\"\n :title=\"m.colorCustom\"\n :style=\"{ '--dou-sheet-swatch': colorOf(tool).css }\"\n @click=\"openCustom(tool, $event)\"\n >\n <span v-if=\"colorOf(tool).css && tool === 'color'\" aria-hidden=\"true\">A</span>\n <PaletteIcon v-else-if=\"!colorOf(tool).css\" />\n </button>\n </div>\n <DouColorPanel\n v-if=\"custom === tool\"\n v-model=\"customColor\"\n class=\"dou-sheet-toolbar__panel\"\n :bordered=\"false\"\n format=\"hex\"\n show-input\n @change=\"$event && setColor(tool, { css: $event }, false)\"\n />\n </template>\n </DouPopover>\n </span>\n </DouTooltip>\n\n <DouToggleGroup\n v-else-if=\"tool === 'align'\"\n type=\"single\"\n :model-value=\"align\"\n :disabled=\"disabled\"\n @update:model-value=\"setAlign\"\n >\n <DouTooltip v-for=\"a in ALIGN\" :key=\"a.value\" :content=\"m[a.label]\" placement=\"bottom\">\n <DouToggle :value=\"a.value\" :aria-label=\"m[a.label]\">\n <component :is=\"a.icon\" />\n </DouToggle>\n </DouTooltip>\n </DouToggleGroup>\n\n <DouTooltip\n v-else-if=\"tool === 'valign'\"\n :content=\"m.verticalAlign\"\n :disabled=\"menuOpen === tool\"\n placement=\"bottom\"\n >\n <span class=\"dou-sheet-toolbar__trigger\">\n <DouDropdown\n :open=\"menuOpen === tool\"\n placement=\"bottom-start\"\n :disabled=\"disabled\"\n @update:open=\"onMenu(tool, $event)\"\n >\n <DouButton\n variant=\"ghost\"\n class=\"dou-sheet-toolbar__menu\"\n :aria-label=\"m.verticalAlign\"\n >\n <component :is=\"valignIcon\" />\n <template #trailing><ChevronDownIcon /></template>\n </DouButton>\n <template #menu>\n <DouDropdownRadioGroup :model-value=\"valign\">\n <DouDropdownItem\n v-for=\"v in VALIGN\"\n :key=\"v.value\"\n :value=\"v.value\"\n :disabled=\"!can(`valign.${v.value}`)\"\n @click=\"run(`valign.${v.value}`)\"\n >\n <template #prefix><component :is=\"v.icon\" /></template>\n {{ m[v.label] }}\n </DouDropdownItem>\n </DouDropdownRadioGroup>\n </template>\n </DouDropdown>\n </span>\n </DouTooltip>\n\n <DouTooltip v-else-if=\"tool === 'wrap'\" :content=\"m.wrap\" placement=\"bottom\">\n <DouToggle\n :pressed=\"on('wrap')\"\n :aria-label=\"m.wrap\"\n :disabled=\"!can('wrap')\"\n @update:pressed=\"run('wrap', $event)\"\n >\n <WrapTextIcon />\n </DouToggle>\n </DouTooltip>\n\n <DouTooltip\n v-else-if=\"tool === 'merge'\"\n :content=\"sheet.commands.get('merge')?.label\"\n placement=\"bottom\"\n >\n <DouToggle\n :pressed=\"on('merge')\"\n :aria-label=\"m.mergeCells\"\n :disabled=\"!can('merge')\"\n @update:pressed=\"run('merge')\"\n >\n <CellsMergeIcon />\n </DouToggle>\n </DouTooltip>\n\n <DouTooltip\n v-else-if=\"tool === 'link'\"\n :content=\"m.link.add\"\n shortcut=\"mod+k\"\n placement=\"bottom\"\n >\n <DouButton\n variant=\"ghost\"\n :aria-label=\"m.link.add\"\n :disabled=\"!can('link')\"\n @click=\"run('link')\"\n >\n <LinkIcon />\n </DouButton>\n </DouTooltip>\n\n <DouTooltip\n v-else-if=\"tool === 'protect'\"\n :content=\"m.protect.menu\"\n :disabled=\"menuOpen === tool\"\n placement=\"bottom\"\n >\n <span class=\"dou-sheet-toolbar__trigger\">\n <DouDropdown\n :open=\"menuOpen === tool\"\n placement=\"bottom-start\"\n :disabled=\"disabled\"\n @update:open=\"onMenu(tool, $event)\"\n >\n <DouButton\n variant=\"ghost\"\n class=\"dou-sheet-toolbar__menu\"\n :class=\"{ 'is-on': on('protect.sheet') }\"\n :aria-label=\"m.protect.menu\"\n >\n <ShieldLockIcon />\n <template #trailing><ChevronDownIcon /></template>\n </DouButton>\n <template #menu>\n <DouDropdownItem\n v-for=\"name in PROTECT_COMMANDS\"\n :key=\"name\"\n :disabled=\"!can(name)\"\n :divided=\"name === 'protect.sheet'\"\n @click=\"run(name)\"\n >\n <template #prefix>\n <component :is=\"sheet.commands.get(name)?.icon\" />\n </template>\n {{ sheet.commands.get(name)?.label }}\n </DouDropdownItem>\n </template>\n </DouDropdown>\n </span>\n </DouTooltip>\n\n <DouTooltip\n v-else-if=\"tool === 'freeze'\"\n :content=\"m.freeze\"\n :disabled=\"menuOpen === tool\"\n placement=\"bottom\"\n >\n <span class=\"dou-sheet-toolbar__trigger\">\n <DouDropdown\n :open=\"menuOpen === tool\"\n placement=\"bottom-start\"\n :disabled=\"disabled\"\n @update:open=\"onMenu(tool, $event)\"\n >\n <DouButton\n variant=\"ghost\"\n class=\"dou-sheet-toolbar__menu\"\n :class=\"{ 'is-on': frozen }\"\n :aria-label=\"m.freeze\"\n >\n <TableFreezeIcon />\n <template #trailing><ChevronDownIcon /></template>\n </DouButton>\n <template #menu>\n <DouDropdownItem\n v-for=\"item in freezeItems\"\n :key=\"item.key\"\n :checked=\"(freeze.rows ?? 0) === item.rows && (freeze.cols ?? 0) === item.cols\"\n @click=\"setFreeze(item.rows, item.cols)\"\n >\n {{ item.label }}\n </DouDropdownItem>\n <DouDropdownItem divided :disabled=\"!frozen\" @click=\"setFreeze(0, 0)\">\n {{ m.unfreeze }}\n </DouDropdownItem>\n </template>\n </DouDropdown>\n </span>\n </DouTooltip>\n\n <DouTooltip\n v-else-if=\"tool === 'sort'\"\n :content=\"m.filter.sort\"\n :disabled=\"menuOpen === tool\"\n placement=\"bottom\"\n >\n <span class=\"dou-sheet-toolbar__trigger\">\n <DouDropdown\n :open=\"menuOpen === tool\"\n placement=\"bottom-start\"\n :disabled=\"disabled\"\n @update:open=\"onMenu(tool, $event)\"\n >\n <DouButton\n variant=\"ghost\"\n class=\"dou-sheet-toolbar__menu\"\n :aria-label=\"m.filter.sort\"\n >\n <SortIcon />\n <template #trailing><ChevronDownIcon /></template>\n </DouButton>\n <template #menu>\n <DouDropdownItem :disabled=\"!can('sort.asc')\" @click=\"run('sort.asc')\">\n <template #prefix><SortAscendingIcon /></template>\n {{ m.filter.sortAsc }}\n </DouDropdownItem>\n <DouDropdownItem :disabled=\"!can('sort.desc')\" @click=\"run('sort.desc')\">\n <template #prefix><SortDescendingIcon /></template>\n {{ m.filter.sortDesc }}\n </DouDropdownItem>\n </template>\n </DouDropdown>\n </span>\n </DouTooltip>\n\n <DouTooltip\n v-else-if=\"tool === 'filter'\"\n :content=\"sheet.commands.get('filter')?.label\"\n placement=\"bottom\"\n >\n <DouToggle\n :pressed=\"on('filter')\"\n :aria-label=\"m.filter.turnOn\"\n :disabled=\"!can('filter')\"\n @update:pressed=\"run('filter')\"\n >\n <FilterIcon />\n </DouToggle>\n </DouTooltip>\n\n <DouTooltip\n v-else-if=\"tool === 'conditional'\"\n :content=\"m.formats.title\"\n :disabled=\"menuOpen === tool\"\n placement=\"bottom\"\n >\n <span class=\"dou-sheet-toolbar__trigger\">\n <DouDropdown\n :open=\"menuOpen === tool\"\n placement=\"bottom-start\"\n :disabled=\"disabled\"\n @update:open=\"onMenu(tool, $event)\"\n >\n <DouButton\n variant=\"ghost\"\n class=\"dou-sheet-toolbar__menu\"\n :aria-label=\"m.formats.title\"\n >\n <TableHighlightIcon />\n <template #trailing><ChevronDownIcon /></template>\n </DouButton>\n <template #menu>\n <DouDropdownSub :title=\"m.formats.highlight\">\n <DouDropdownItem v-for=\"kind in HIGHLIGHTS\" :key=\"kind\" @click=\"openFormat(kind)\">\n {{ m.formats[kind] }}\n </DouDropdownItem>\n </DouDropdownSub>\n <DouDropdownSub :title=\"m.formats.ranks\">\n <DouDropdownItem v-for=\"kind in RANKS\" :key=\"kind\" @click=\"openFormat(kind)\">\n {{ m.formats[kind] }}\n </DouDropdownItem>\n </DouDropdownSub>\n <DouDropdownSub :title=\"m.formats.bar\">\n <DouDropdownItem v-for=\"tone in TONES\" :key=\"tone\" @click=\"addBar(tone)\">\n <template #prefix>\n <span\n class=\"dou-sheet-toolbar__gradient\"\n :style=\"{ backgroundImage: barSwatch(tone) }\"\n />\n </template>\n {{ toneLabel(tone) }}\n </DouDropdownItem>\n </DouDropdownSub>\n <DouDropdownSub :title=\"m.formats.scale\">\n <DouDropdownItem\n v-for=\"(colors, key) in SCALES\"\n :key=\"key\"\n @click=\"addScale(colors)\"\n >\n <template #prefix>\n <span\n class=\"dou-sheet-toolbar__gradient\"\n :style=\"{ backgroundImage: scaleSwatch(colors) }\"\n />\n </template>\n {{ m.formats.scales[key] }}\n </DouDropdownItem>\n </DouDropdownSub>\n <DouDropdownItem divided @click=\"clearFormats(false)\">\n {{ m.formats.clearSelection }}\n </DouDropdownItem>\n <DouDropdownItem :disabled=\"!conditionals.length\" @click=\"clearFormats(true)\">\n {{ m.formats.clearSheet }}\n </DouDropdownItem>\n <DouDropdownItem divided @click=\"listOpen = true\">\n {{ m.formats.manage }}\n </DouDropdownItem>\n </template>\n </DouDropdown>\n </span>\n </DouTooltip>\n\n <DouTooltip\n v-else-if=\"tool === 'export'\"\n :content=\"m.file.export\"\n :disabled=\"menuOpen === tool\"\n placement=\"bottom\"\n >\n <span class=\"dou-sheet-toolbar__trigger\">\n <DouDropdown\n :open=\"menuOpen === tool\"\n placement=\"bottom-start\"\n @update:open=\"onMenu(tool, $event)\"\n >\n <DouButton\n variant=\"ghost\"\n class=\"dou-sheet-toolbar__menu\"\n :aria-label=\"m.file.export\"\n >\n <DownloadIcon />\n <template #trailing><ChevronDownIcon /></template>\n </DouButton>\n <template #menu>\n <template v-for=\"item in exportItems\" :key=\"item.name\">\n <DouDropdownSub v-if=\"item.scopes.length\" :title=\"item.label\">\n <template v-if=\"item.icon\" #prefix><component :is=\"item.icon\" /></template>\n <DouDropdownItem\n v-for=\"scope in item.scopes\"\n :key=\"scope\"\n @click=\"exportWith(item.name, scope)\"\n >\n {{ m.file[scope] }}\n </DouDropdownItem>\n </DouDropdownSub>\n <DouDropdownItem v-else @click=\"exportWith(item.name, item.scope)\">\n <template v-if=\"item.icon\" #prefix><component :is=\"item.icon\" /></template>\n {{ item.label }}\n </DouDropdownItem>\n </template>\n </template>\n </DouDropdown>\n </span>\n </DouTooltip>\n\n <DouTooltip v-else-if=\"tool === 'import'\" :content=\"m.file.import\" placement=\"bottom\">\n <DouButton\n variant=\"ghost\"\n :aria-label=\"m.file.import\"\n aria-haspopup=\"dialog\"\n :disabled=\"disabled\"\n @click=\"pickFile\"\n >\n <UploadIcon />\n </DouButton>\n </DouTooltip>\n\n <DouTooltip\n v-else-if=\"tool === 'validation'\"\n :content=\"m.validation.title\"\n placement=\"bottom\"\n >\n <DouButton\n variant=\"ghost\"\n :aria-label=\"m.validation.title\"\n aria-haspopup=\"dialog\"\n :disabled=\"disabled\"\n @click=\"openValidation\"\n >\n <TableCheckIcon />\n </DouButton>\n </DouTooltip>\n\n <DouTooltip\n v-else-if=\"tool === 'clear'\"\n :content=\"m.clearFormatting\"\n shortcut=\"mod+\\\"\n placement=\"bottom\"\n >\n <DouButton\n variant=\"ghost\"\n :aria-label=\"m.clearFormatting\"\n :disabled=\"!can('clear')\"\n @click=\"run('clear')\"\n >\n <TypeXIcon />\n </DouButton>\n </DouTooltip>\n </template>\n <slot name=\"end\" />\n </DouToolbar>\n <input\n ref=\"picker\"\n type=\"file\"\n class=\"dou-sheet-toolbar__picker\"\n :accept=\"sheet.importAccept.value\"\n tabindex=\"-1\"\n aria-hidden=\"true\"\n @change=\"onPicked\"\n @cancel=\"onPickCancel\"\n />\n <FormatDialog\n v-model:open=\"dialogOpen\"\n :format=\"dialogFormat\"\n :title=\"dialogTitle\"\n :styles=\"sheet.doc.value.styles\"\n :messages=\"m\"\n @apply=\"applyFormat\"\n @closed=\"dialogClosed\"\n />\n <ValidationDialog\n v-model:open=\"ruleOpen\"\n :rule=\"rule\"\n :editing=\"ruleIndex >= 0\"\n :messages=\"m\"\n @apply=\"applyValidation\"\n @remove=\"removeValidation\"\n @closed=\"sheet.focus()\"\n />\n <FormatList\n v-model:open=\"listOpen\"\n :formats=\"conditionals\"\n :styles=\"sheet.doc.value.styles\"\n :messages=\"m\"\n @change=\"setFormats\"\n @edit=\"editFormat\"\n @closed=\"sheet.focus()\"\n />\n </div>\n</template>\n"],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import validation_dialog_vue_vue_type_script_setup_true_lang_default from "./validation-dialog.vue_vue_type_script_setup_true_lang.js";
|
|
2
|
+
// src/components/validation-dialog.vue
|
|
3
|
+
var validation_dialog_default = validation_dialog_vue_vue_type_script_setup_true_lang_default;
|
|
4
|
+
export { validation_dialog_default as default };
|
|
5
|
+
|
|
6
|
+
//# sourceMappingURL=validation-dialog.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validation-dialog.js","names":["_sfc_main"],"sources":["../../src/components/validation-dialog.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport {\n DouButton,\n DouCheckbox,\n DouDialog,\n DouForm,\n DouFormItem,\n DouInput,\n DouSelect,\n} from 'dou-ui'\nimport { computed, ref, useTemplateRef, watch } from 'vue'\nimport { readRuleRange, ruleRangeText } from '../core/conditional'\nimport { optionOf } from '../core/cell-type'\nimport type { SheetCondition, SheetValidation, SheetValue } from '../core/model'\nimport type { SheetMessages } from '../locale'\n\n/*\n * Sets the validation rule of some cells: what they may hold, the hint\n * shown while one is active, and what is said when a value doesn't fit.\n */\n\nconst props = defineProps<{\n rule: SheetValidation\n /** Whether the rule is one the sheet has, which can be removed. */\n editing: boolean\n messages: SheetMessages\n}>()\nconst open = defineModel<boolean>('open', { required: true })\nconst emit = defineEmits<{ apply: [rule: SheetValidation]; remove: []; closed: [] }>()\n\nconst m = computed(() => props.messages.validation)\n\ntype Kind = keyof SheetMessages['validation']['kinds']\ntype Op = SheetCondition['op'] | 'any'\nconst NUMBER_OPS: Op[] = ['any', 'between', 'notBetween', 'eq', 'ne', 'gt', 'ge', 'lt', 'le']\nconst TEXT_OPS: Op[] = ['contains', 'notContains', 'begins', 'ends', 'eq', 'ne']\n\nconst target = ref('')\nconst kind = ref<Kind>('list')\nconst options = ref('')\nconst op = ref<Op>('between')\nconst value = ref('')\nconst to = ref('')\nconst formula = ref('')\nconst prompt = ref('')\nconst message = ref('')\nconst strict = ref(true)\nconst tried = ref(false)\n\nconst text = (v: SheetValue | undefined) => (v == null ? '' : String(v))\n/** A list's options as typed: its values separated by commas, or its reference. */\nfunction listText(list: Extract<SheetValidation, { list: unknown }>['list']) {\n return typeof list === 'string' ? list : list.map((o) => text(optionOf(o).value)).join(', ')\n}\n\nfunction kindOf(rule: SheetValidation): Kind {\n if ('list' in rule) return 'list'\n if ('formula' in rule) return 'formula'\n if (rule.integer) return 'integer'\n const { op: o, value: v, to: t } = rule.when\n if (typeof v === 'number' || typeof t === 'number' || o === 'notBlank') return 'number'\n return TEXT_OPS.includes(o) ? 'text' : 'number'\n}\n\nwatch(open, (now) => {\n if (!now) return\n const r = props.rule\n target.value = ruleRangeText(r.range)\n kind.value = kindOf(r)\n options.value = 'list' in r ? listText(r.list) : ''\n const when = 'when' in r ? r.when : undefined\n op.value = !when ? 'between' : when.op === 'notBlank' && kind.value !== 'text' ? 'any' : when.op\n value.value = text(when?.value)\n to.value = text(when?.to)\n formula.value = 'formula' in r ? r.formula : ''\n prompt.value = r.prompt ?? ''\n message.value = r.message ?? ''\n strict.value = r.strict !== false\n tried.value = false\n})\n\n// a condition that doesn't suit the kind picked starts over\nwatch(kind, (now) => {\n const ops = now === 'text' ? TEXT_OPS : NUMBER_OPS\n if (!ops.includes(op.value)) op.value = now === 'text' ? 'contains' : 'between'\n})\n\nconst kindOptions = computed(() =>\n (Object.keys(m.value.kinds) as Kind[]).map((k) => ({ value: k, label: m.value.kinds[k] })),\n)\nconst opOptions = computed(() =>\n (kind.value === 'text' ? TEXT_OPS : NUMBER_OPS).map((o) => ({\n value: o,\n label: o === 'any' ? m.value.any : props.messages.ops[o],\n })),\n)\n\nconst numeric = computed(() => kind.value === 'number' || kind.value === 'integer')\nconst needsValue = computed(() => (kind.value === 'text' || numeric.value) && op.value !== 'any')\nconst needsTo = computed(() => op.value === 'between' || op.value === 'notBetween')\n\n/** A number typed in a field, or `null`. */\nfunction numberOf(input: string) {\n const n = Number(input.trim().replace(/,/g, ''))\n return input.trim() && Number.isFinite(n) ? n : null\n}\n/** A list option as typed: a number when it reads as one. */\nfunction operand(input: string): SheetValue {\n return numberOf(input) ?? input.trim()\n}\n\nconst rangeOk = computed(() => readRuleRange(target.value) != null)\nconst optionsOk = computed(\n () => kind.value !== 'list' || options.value.trim().replace(/^=/, '') !== '',\n)\nconst fieldOk = (input: string) => (numeric.value ? numberOf(input) != null : input.trim() !== '')\nconst valueOk = computed(\n () => !needsValue.value || (fieldOk(value.value) && (!needsTo.value || fieldOk(to.value))),\n)\nconst formulaOk = computed(\n () => kind.value !== 'formula' || formula.value.trim().replace(/^=/, '') !== '',\n)\n\nfunction result(): SheetValidation {\n const base: Pick<SheetValidation, 'range' | 'strict' | 'prompt' | 'message'> = {\n range: readRuleRange(target.value)!,\n }\n if (!strict.value) base.strict = false\n if (prompt.value.trim()) base.prompt = prompt.value.trim()\n if (message.value.trim()) base.message = message.value.trim()\n const r = props.rule\n switch (kind.value) {\n case 'list': {\n const typed = options.value.trim()\n // options left as they were keep their tones\n if ('list' in r && typed === listText(r.list)) return { ...base, list: r.list }\n if (typed.startsWith('=')) return { ...base, list: typed }\n const list = typed\n .split(/[,,\\n]/)\n .map((part) => part.trim())\n .filter(Boolean)\n .map(operand)\n return { ...base, list }\n }\n case 'formula': {\n const body = formula.value.trim()\n return { ...base, formula: body.startsWith('=') ? body : `=${body}` }\n }\n default: {\n const read = (input: string) => (numeric.value ? numberOf(input)! : input.trim())\n const when: SheetCondition =\n op.value === 'any' ? { op: 'notBlank' } : { op: op.value, value: read(value.value) }\n if (needsValue.value && needsTo.value) when.to = read(to.value)\n return kind.value === 'integer' ? { ...base, when, integer: true } : { ...base, when }\n }\n }\n}\n\nconst rangeInput = useTemplateRef<InstanceType<typeof DouInput>>('rangeInput')\nconst optionsInput = useTemplateRef<InstanceType<typeof DouInput>>('optionsInput')\nfunction focusFirst() {\n ;(optionsInput.value ?? rangeInput.value)?.focus()\n}\n\nfunction apply() {\n tried.value = true\n if (!rangeOk.value || !optionsOk.value || !valueOk.value || !formulaOk.value) return\n emit('apply', result())\n open.value = false\n}\nfunction remove() {\n emit('remove')\n open.value = false\n}\n</script>\n\n<template>\n <DouDialog\n v-model:open=\"open\"\n :title=\"m.title\"\n :width=\"440\"\n @opened=\"focusFirst\"\n @closed=\"emit('closed')\"\n >\n <DouForm layout=\"vertical\" class=\"dou-sheet-format\" @submit=\"apply\">\n <DouFormItem :label=\"m.range\" :error=\"tried && !rangeOk ? m.invalidRange : undefined\">\n <DouInput ref=\"rangeInput\" v-model=\"target\" :invalid=\"tried && !rangeOk\" />\n </DouFormItem>\n <DouFormItem :label=\"m.allow\">\n <DouSelect v-model=\"kind\" :options=\"kindOptions\" />\n </DouFormItem>\n <DouFormItem\n v-if=\"kind === 'list'\"\n :label=\"m.options\"\n :help=\"m.optionsHelp\"\n :error=\"tried && !optionsOk ? m.needOptions : undefined\"\n >\n <DouInput\n ref=\"optionsInput\"\n v-model=\"options\"\n :invalid=\"tried && !optionsOk\"\n @keydown.enter.prevent=\"apply\"\n />\n </DouFormItem>\n <DouFormItem\n v-else-if=\"kind === 'formula'\"\n :label=\"m.formula\"\n :help=\"m.formulaHelp\"\n :error=\"tried && !formulaOk ? m.needFormula : undefined\"\n >\n <DouInput\n v-model=\"formula\"\n spellcheck=\"false\"\n autocomplete=\"off\"\n :invalid=\"tried && !formulaOk\"\n @keydown.enter.prevent=\"apply\"\n />\n </DouFormItem>\n <template v-else>\n <DouFormItem :label=\"m.condition\">\n <DouSelect v-model=\"op\" :options=\"opOptions\" />\n </DouFormItem>\n <DouFormItem\n v-if=\"needsValue\"\n :label=\"m.value\"\n :error=\"tried && !valueOk ? m.needValue : undefined\"\n >\n <div class=\"dou-sheet-format__values\">\n <DouInput\n v-model=\"value\"\n :aria-label=\"m.value\"\n :inputmode=\"numeric ? 'decimal' : undefined\"\n :invalid=\"tried && !fieldOk(value)\"\n @keydown.enter.prevent=\"apply\"\n />\n <template v-if=\"needsTo\">\n <span class=\"dou-sheet-format__and\">{{ m.and }}</span>\n <DouInput\n v-model=\"to\"\n :aria-label=\"m.value\"\n :inputmode=\"numeric ? 'decimal' : undefined\"\n :invalid=\"tried && !fieldOk(to)\"\n @keydown.enter.prevent=\"apply\"\n />\n </template>\n </div>\n </DouFormItem>\n </template>\n <DouFormItem :label=\"m.prompt\" :help=\"m.promptHelp\">\n <DouInput v-model=\"prompt\" />\n </DouFormItem>\n <DouFormItem :label=\"m.message\" :help=\"m.messageHelp\">\n <DouInput v-model=\"message\" />\n </DouFormItem>\n <DouFormItem :help=\"m.strictHelp\">\n <DouCheckbox v-model=\"strict\">{{ m.strict }}</DouCheckbox>\n </DouFormItem>\n </DouForm>\n <template #footer=\"{ close }\">\n <DouButton\n v-if=\"editing\"\n variant=\"ghost\"\n tone=\"danger\"\n class=\"dou-sheet-validation__remove\"\n @click=\"remove\"\n >{{ m.remove }}</DouButton\n >\n <DouButton variant=\"outline\" @click=\"close\">{{ m.cancel }}</DouButton>\n <DouButton variant=\"solid\" @click=\"apply\">{{ m.apply }}</DouButton>\n </template>\n </DouDialog>\n</template>\n"],"mappings":""}
|
|
@@ -0,0 +1,370 @@
|
|
|
1
|
+
import { optionOf } from "../core/cell-type.js";
|
|
2
|
+
import { readRuleRange, ruleRangeText } from "../core/conditional.js";
|
|
3
|
+
import { DouButton, DouCheckbox, DouDialog, DouForm, DouFormItem, DouInput, DouSelect } from "dou-ui";
|
|
4
|
+
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, mergeModels, openBlock, ref, toDisplayString, unref, useModel, useTemplateRef, watch, withCtx, withKeys, withModifiers } from "vue";
|
|
5
|
+
// src/components/validation-dialog.vue?vue&type=script&setup=true&lang.ts
|
|
6
|
+
var _hoisted_1 = { class: "dou-sheet-format__values" };
|
|
7
|
+
var _hoisted_2 = { class: "dou-sheet-format__and" };
|
|
8
|
+
var validation_dialog_vue_vue_type_script_setup_true_lang_default = /*@__PURE__*/ defineComponent({
|
|
9
|
+
__name: "validation-dialog",
|
|
10
|
+
props: /*@__PURE__*/ mergeModels({
|
|
11
|
+
rule: {},
|
|
12
|
+
editing: { type: Boolean },
|
|
13
|
+
messages: {}
|
|
14
|
+
}, {
|
|
15
|
+
"open": {
|
|
16
|
+
type: Boolean,
|
|
17
|
+
required: true
|
|
18
|
+
},
|
|
19
|
+
"openModifiers": {}
|
|
20
|
+
}),
|
|
21
|
+
emits: /*@__PURE__*/ mergeModels([
|
|
22
|
+
"apply",
|
|
23
|
+
"remove",
|
|
24
|
+
"closed"
|
|
25
|
+
], ["update:open"]),
|
|
26
|
+
setup(__props, { emit: __emit }) {
|
|
27
|
+
const props = __props;
|
|
28
|
+
const open = useModel(__props, "open");
|
|
29
|
+
const emit = __emit;
|
|
30
|
+
const m = computed(() => props.messages.validation);
|
|
31
|
+
const NUMBER_OPS = [
|
|
32
|
+
"any",
|
|
33
|
+
"between",
|
|
34
|
+
"notBetween",
|
|
35
|
+
"eq",
|
|
36
|
+
"ne",
|
|
37
|
+
"gt",
|
|
38
|
+
"ge",
|
|
39
|
+
"lt",
|
|
40
|
+
"le"
|
|
41
|
+
];
|
|
42
|
+
const TEXT_OPS = [
|
|
43
|
+
"contains",
|
|
44
|
+
"notContains",
|
|
45
|
+
"begins",
|
|
46
|
+
"ends",
|
|
47
|
+
"eq",
|
|
48
|
+
"ne"
|
|
49
|
+
];
|
|
50
|
+
const target = ref("");
|
|
51
|
+
const kind = ref("list");
|
|
52
|
+
const options = ref("");
|
|
53
|
+
const op = ref("between");
|
|
54
|
+
const value = ref("");
|
|
55
|
+
const to = ref("");
|
|
56
|
+
const formula = ref("");
|
|
57
|
+
const prompt = ref("");
|
|
58
|
+
const message = ref("");
|
|
59
|
+
const strict = ref(true);
|
|
60
|
+
const tried = ref(false);
|
|
61
|
+
const text = (v) => v == null ? "" : String(v);
|
|
62
|
+
/** A list's options as typed: its values separated by commas, or its reference. */
|
|
63
|
+
function listText(list) {
|
|
64
|
+
return typeof list === "string" ? list : list.map((o) => text(optionOf(o).value)).join(", ");
|
|
65
|
+
}
|
|
66
|
+
function kindOf(rule) {
|
|
67
|
+
if ("list" in rule) return "list";
|
|
68
|
+
if ("formula" in rule) return "formula";
|
|
69
|
+
if (rule.integer) return "integer";
|
|
70
|
+
const { op: o, value: v, to: t } = rule.when;
|
|
71
|
+
if (typeof v === "number" || typeof t === "number" || o === "notBlank") return "number";
|
|
72
|
+
return TEXT_OPS.includes(o) ? "text" : "number";
|
|
73
|
+
}
|
|
74
|
+
watch(open, (now) => {
|
|
75
|
+
if (!now) return;
|
|
76
|
+
const r = props.rule;
|
|
77
|
+
target.value = ruleRangeText(r.range);
|
|
78
|
+
kind.value = kindOf(r);
|
|
79
|
+
options.value = "list" in r ? listText(r.list) : "";
|
|
80
|
+
const when = "when" in r ? r.when : void 0;
|
|
81
|
+
op.value = !when ? "between" : when.op === "notBlank" && kind.value !== "text" ? "any" : when.op;
|
|
82
|
+
value.value = text(when?.value);
|
|
83
|
+
to.value = text(when?.to);
|
|
84
|
+
formula.value = "formula" in r ? r.formula : "";
|
|
85
|
+
prompt.value = r.prompt ?? "";
|
|
86
|
+
message.value = r.message ?? "";
|
|
87
|
+
strict.value = r.strict !== false;
|
|
88
|
+
tried.value = false;
|
|
89
|
+
});
|
|
90
|
+
watch(kind, (now) => {
|
|
91
|
+
if (!(now === "text" ? TEXT_OPS : NUMBER_OPS).includes(op.value)) op.value = now === "text" ? "contains" : "between";
|
|
92
|
+
});
|
|
93
|
+
const kindOptions = computed(() => Object.keys(m.value.kinds).map((k) => ({
|
|
94
|
+
value: k,
|
|
95
|
+
label: m.value.kinds[k]
|
|
96
|
+
})));
|
|
97
|
+
const opOptions = computed(() => (kind.value === "text" ? TEXT_OPS : NUMBER_OPS).map((o) => ({
|
|
98
|
+
value: o,
|
|
99
|
+
label: o === "any" ? m.value.any : props.messages.ops[o]
|
|
100
|
+
})));
|
|
101
|
+
const numeric = computed(() => kind.value === "number" || kind.value === "integer");
|
|
102
|
+
const needsValue = computed(() => (kind.value === "text" || numeric.value) && op.value !== "any");
|
|
103
|
+
const needsTo = computed(() => op.value === "between" || op.value === "notBetween");
|
|
104
|
+
/** A number typed in a field, or `null`. */
|
|
105
|
+
function numberOf(input) {
|
|
106
|
+
const n = Number(input.trim().replace(/,/g, ""));
|
|
107
|
+
return input.trim() && Number.isFinite(n) ? n : null;
|
|
108
|
+
}
|
|
109
|
+
/** A list option as typed: a number when it reads as one. */
|
|
110
|
+
function operand(input) {
|
|
111
|
+
return numberOf(input) ?? input.trim();
|
|
112
|
+
}
|
|
113
|
+
const rangeOk = computed(() => readRuleRange(target.value) != null);
|
|
114
|
+
const optionsOk = computed(() => kind.value !== "list" || options.value.trim().replace(/^=/, "") !== "");
|
|
115
|
+
const fieldOk = (input) => numeric.value ? numberOf(input) != null : input.trim() !== "";
|
|
116
|
+
const valueOk = computed(() => !needsValue.value || fieldOk(value.value) && (!needsTo.value || fieldOk(to.value)));
|
|
117
|
+
const formulaOk = computed(() => kind.value !== "formula" || formula.value.trim().replace(/^=/, "") !== "");
|
|
118
|
+
function result() {
|
|
119
|
+
const base = { range: readRuleRange(target.value) };
|
|
120
|
+
if (!strict.value) base.strict = false;
|
|
121
|
+
if (prompt.value.trim()) base.prompt = prompt.value.trim();
|
|
122
|
+
if (message.value.trim()) base.message = message.value.trim();
|
|
123
|
+
const r = props.rule;
|
|
124
|
+
switch (kind.value) {
|
|
125
|
+
case "list": {
|
|
126
|
+
const typed = options.value.trim();
|
|
127
|
+
if ("list" in r && typed === listText(r.list)) return {
|
|
128
|
+
...base,
|
|
129
|
+
list: r.list
|
|
130
|
+
};
|
|
131
|
+
if (typed.startsWith("=")) return {
|
|
132
|
+
...base,
|
|
133
|
+
list: typed
|
|
134
|
+
};
|
|
135
|
+
const list = typed.split(/[,,\n]/).map((part) => part.trim()).filter(Boolean).map(operand);
|
|
136
|
+
return {
|
|
137
|
+
...base,
|
|
138
|
+
list
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
case "formula": {
|
|
142
|
+
const body = formula.value.trim();
|
|
143
|
+
return {
|
|
144
|
+
...base,
|
|
145
|
+
formula: body.startsWith("=") ? body : `=${body}`
|
|
146
|
+
};
|
|
147
|
+
}
|
|
148
|
+
default: {
|
|
149
|
+
const read = (input) => numeric.value ? numberOf(input) : input.trim();
|
|
150
|
+
const when = op.value === "any" ? { op: "notBlank" } : {
|
|
151
|
+
op: op.value,
|
|
152
|
+
value: read(value.value)
|
|
153
|
+
};
|
|
154
|
+
if (needsValue.value && needsTo.value) when.to = read(to.value);
|
|
155
|
+
return kind.value === "integer" ? {
|
|
156
|
+
...base,
|
|
157
|
+
when,
|
|
158
|
+
integer: true
|
|
159
|
+
} : {
|
|
160
|
+
...base,
|
|
161
|
+
when
|
|
162
|
+
};
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
const rangeInput = useTemplateRef("rangeInput");
|
|
167
|
+
const optionsInput = useTemplateRef("optionsInput");
|
|
168
|
+
function focusFirst() {
|
|
169
|
+
(optionsInput.value ?? rangeInput.value)?.focus();
|
|
170
|
+
}
|
|
171
|
+
function apply() {
|
|
172
|
+
tried.value = true;
|
|
173
|
+
if (!rangeOk.value || !optionsOk.value || !valueOk.value || !formulaOk.value) return;
|
|
174
|
+
emit("apply", result());
|
|
175
|
+
open.value = false;
|
|
176
|
+
}
|
|
177
|
+
function remove() {
|
|
178
|
+
emit("remove");
|
|
179
|
+
open.value = false;
|
|
180
|
+
}
|
|
181
|
+
return (_ctx, _cache) => {
|
|
182
|
+
return openBlock(), createBlock(unref(DouDialog), {
|
|
183
|
+
open: open.value,
|
|
184
|
+
"onUpdate:open": _cache[10] || (_cache[10] = ($event) => open.value = $event),
|
|
185
|
+
title: m.value.title,
|
|
186
|
+
width: 440,
|
|
187
|
+
onOpened: focusFirst,
|
|
188
|
+
onClosed: _cache[11] || (_cache[11] = ($event) => emit("closed"))
|
|
189
|
+
}, {
|
|
190
|
+
footer: withCtx(({ close }) => [
|
|
191
|
+
__props.editing ? (openBlock(), createBlock(unref(DouButton), {
|
|
192
|
+
key: 0,
|
|
193
|
+
variant: "ghost",
|
|
194
|
+
tone: "danger",
|
|
195
|
+
class: "dou-sheet-validation__remove",
|
|
196
|
+
onClick: remove
|
|
197
|
+
}, {
|
|
198
|
+
default: withCtx(() => [createTextVNode(toDisplayString(m.value.remove), 1)]),
|
|
199
|
+
_: 1
|
|
200
|
+
})) : createCommentVNode("", true),
|
|
201
|
+
createVNode(unref(DouButton), {
|
|
202
|
+
variant: "outline",
|
|
203
|
+
onClick: close
|
|
204
|
+
}, {
|
|
205
|
+
default: withCtx(() => [createTextVNode(toDisplayString(m.value.cancel), 1)]),
|
|
206
|
+
_: 1
|
|
207
|
+
}, 8, ["onClick"]),
|
|
208
|
+
createVNode(unref(DouButton), {
|
|
209
|
+
variant: "solid",
|
|
210
|
+
onClick: apply
|
|
211
|
+
}, {
|
|
212
|
+
default: withCtx(() => [createTextVNode(toDisplayString(m.value.apply), 1)]),
|
|
213
|
+
_: 1
|
|
214
|
+
})
|
|
215
|
+
]),
|
|
216
|
+
default: withCtx(() => [createVNode(unref(DouForm), {
|
|
217
|
+
layout: "vertical",
|
|
218
|
+
class: "dou-sheet-format",
|
|
219
|
+
onSubmit: apply
|
|
220
|
+
}, {
|
|
221
|
+
default: withCtx(() => [
|
|
222
|
+
createVNode(unref(DouFormItem), {
|
|
223
|
+
label: m.value.range,
|
|
224
|
+
error: tried.value && !rangeOk.value ? m.value.invalidRange : void 0
|
|
225
|
+
}, {
|
|
226
|
+
default: withCtx(() => [createVNode(unref(DouInput), {
|
|
227
|
+
ref_key: "rangeInput",
|
|
228
|
+
ref: rangeInput,
|
|
229
|
+
modelValue: target.value,
|
|
230
|
+
"onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => target.value = $event),
|
|
231
|
+
invalid: tried.value && !rangeOk.value
|
|
232
|
+
}, null, 8, ["modelValue", "invalid"])]),
|
|
233
|
+
_: 1
|
|
234
|
+
}, 8, ["label", "error"]),
|
|
235
|
+
createVNode(unref(DouFormItem), { label: m.value.allow }, {
|
|
236
|
+
default: withCtx(() => [createVNode(unref(DouSelect), {
|
|
237
|
+
modelValue: kind.value,
|
|
238
|
+
"onUpdate:modelValue": _cache[1] || (_cache[1] = ($event) => kind.value = $event),
|
|
239
|
+
options: kindOptions.value
|
|
240
|
+
}, null, 8, ["modelValue", "options"])]),
|
|
241
|
+
_: 1
|
|
242
|
+
}, 8, ["label"]),
|
|
243
|
+
kind.value === "list" ? (openBlock(), createBlock(unref(DouFormItem), {
|
|
244
|
+
key: 0,
|
|
245
|
+
label: m.value.options,
|
|
246
|
+
help: m.value.optionsHelp,
|
|
247
|
+
error: tried.value && !optionsOk.value ? m.value.needOptions : void 0
|
|
248
|
+
}, {
|
|
249
|
+
default: withCtx(() => [createVNode(unref(DouInput), {
|
|
250
|
+
ref_key: "optionsInput",
|
|
251
|
+
ref: optionsInput,
|
|
252
|
+
modelValue: options.value,
|
|
253
|
+
"onUpdate:modelValue": _cache[2] || (_cache[2] = ($event) => options.value = $event),
|
|
254
|
+
invalid: tried.value && !optionsOk.value,
|
|
255
|
+
onKeydown: withKeys(withModifiers(apply, ["prevent"]), ["enter"])
|
|
256
|
+
}, null, 8, [
|
|
257
|
+
"modelValue",
|
|
258
|
+
"invalid",
|
|
259
|
+
"onKeydown"
|
|
260
|
+
])]),
|
|
261
|
+
_: 1
|
|
262
|
+
}, 8, [
|
|
263
|
+
"label",
|
|
264
|
+
"help",
|
|
265
|
+
"error"
|
|
266
|
+
])) : kind.value === "formula" ? (openBlock(), createBlock(unref(DouFormItem), {
|
|
267
|
+
key: 1,
|
|
268
|
+
label: m.value.formula,
|
|
269
|
+
help: m.value.formulaHelp,
|
|
270
|
+
error: tried.value && !formulaOk.value ? m.value.needFormula : void 0
|
|
271
|
+
}, {
|
|
272
|
+
default: withCtx(() => [createVNode(unref(DouInput), {
|
|
273
|
+
modelValue: formula.value,
|
|
274
|
+
"onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => formula.value = $event),
|
|
275
|
+
spellcheck: "false",
|
|
276
|
+
autocomplete: "off",
|
|
277
|
+
invalid: tried.value && !formulaOk.value,
|
|
278
|
+
onKeydown: withKeys(withModifiers(apply, ["prevent"]), ["enter"])
|
|
279
|
+
}, null, 8, [
|
|
280
|
+
"modelValue",
|
|
281
|
+
"invalid",
|
|
282
|
+
"onKeydown"
|
|
283
|
+
])]),
|
|
284
|
+
_: 1
|
|
285
|
+
}, 8, [
|
|
286
|
+
"label",
|
|
287
|
+
"help",
|
|
288
|
+
"error"
|
|
289
|
+
])) : (openBlock(), createElementBlock(Fragment, { key: 2 }, [createVNode(unref(DouFormItem), { label: m.value.condition }, {
|
|
290
|
+
default: withCtx(() => [createVNode(unref(DouSelect), {
|
|
291
|
+
modelValue: op.value,
|
|
292
|
+
"onUpdate:modelValue": _cache[4] || (_cache[4] = ($event) => op.value = $event),
|
|
293
|
+
options: opOptions.value
|
|
294
|
+
}, null, 8, ["modelValue", "options"])]),
|
|
295
|
+
_: 1
|
|
296
|
+
}, 8, ["label"]), needsValue.value ? (openBlock(), createBlock(unref(DouFormItem), {
|
|
297
|
+
key: 0,
|
|
298
|
+
label: m.value.value,
|
|
299
|
+
error: tried.value && !valueOk.value ? m.value.needValue : void 0
|
|
300
|
+
}, {
|
|
301
|
+
default: withCtx(() => [createElementVNode("div", _hoisted_1, [createVNode(unref(DouInput), {
|
|
302
|
+
modelValue: value.value,
|
|
303
|
+
"onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => value.value = $event),
|
|
304
|
+
"aria-label": m.value.value,
|
|
305
|
+
inputmode: numeric.value ? "decimal" : void 0,
|
|
306
|
+
invalid: tried.value && !fieldOk(value.value),
|
|
307
|
+
onKeydown: withKeys(withModifiers(apply, ["prevent"]), ["enter"])
|
|
308
|
+
}, null, 8, [
|
|
309
|
+
"modelValue",
|
|
310
|
+
"aria-label",
|
|
311
|
+
"inputmode",
|
|
312
|
+
"invalid",
|
|
313
|
+
"onKeydown"
|
|
314
|
+
]), needsTo.value ? (openBlock(), createElementBlock(Fragment, { key: 0 }, [createElementVNode("span", _hoisted_2, toDisplayString(m.value.and), 1), createVNode(unref(DouInput), {
|
|
315
|
+
modelValue: to.value,
|
|
316
|
+
"onUpdate:modelValue": _cache[6] || (_cache[6] = ($event) => to.value = $event),
|
|
317
|
+
"aria-label": m.value.value,
|
|
318
|
+
inputmode: numeric.value ? "decimal" : void 0,
|
|
319
|
+
invalid: tried.value && !fieldOk(to.value),
|
|
320
|
+
onKeydown: withKeys(withModifiers(apply, ["prevent"]), ["enter"])
|
|
321
|
+
}, null, 8, [
|
|
322
|
+
"modelValue",
|
|
323
|
+
"aria-label",
|
|
324
|
+
"inputmode",
|
|
325
|
+
"invalid",
|
|
326
|
+
"onKeydown"
|
|
327
|
+
])], 64)) : createCommentVNode("", true)])]),
|
|
328
|
+
_: 1
|
|
329
|
+
}, 8, ["label", "error"])) : createCommentVNode("", true)], 64)),
|
|
330
|
+
createVNode(unref(DouFormItem), {
|
|
331
|
+
label: m.value.prompt,
|
|
332
|
+
help: m.value.promptHelp
|
|
333
|
+
}, {
|
|
334
|
+
default: withCtx(() => [createVNode(unref(DouInput), {
|
|
335
|
+
modelValue: prompt.value,
|
|
336
|
+
"onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => prompt.value = $event)
|
|
337
|
+
}, null, 8, ["modelValue"])]),
|
|
338
|
+
_: 1
|
|
339
|
+
}, 8, ["label", "help"]),
|
|
340
|
+
createVNode(unref(DouFormItem), {
|
|
341
|
+
label: m.value.message,
|
|
342
|
+
help: m.value.messageHelp
|
|
343
|
+
}, {
|
|
344
|
+
default: withCtx(() => [createVNode(unref(DouInput), {
|
|
345
|
+
modelValue: message.value,
|
|
346
|
+
"onUpdate:modelValue": _cache[8] || (_cache[8] = ($event) => message.value = $event)
|
|
347
|
+
}, null, 8, ["modelValue"])]),
|
|
348
|
+
_: 1
|
|
349
|
+
}, 8, ["label", "help"]),
|
|
350
|
+
createVNode(unref(DouFormItem), { help: m.value.strictHelp }, {
|
|
351
|
+
default: withCtx(() => [createVNode(unref(DouCheckbox), {
|
|
352
|
+
modelValue: strict.value,
|
|
353
|
+
"onUpdate:modelValue": _cache[9] || (_cache[9] = ($event) => strict.value = $event)
|
|
354
|
+
}, {
|
|
355
|
+
default: withCtx(() => [createTextVNode(toDisplayString(m.value.strict), 1)]),
|
|
356
|
+
_: 1
|
|
357
|
+
}, 8, ["modelValue"])]),
|
|
358
|
+
_: 1
|
|
359
|
+
}, 8, ["help"])
|
|
360
|
+
]),
|
|
361
|
+
_: 1
|
|
362
|
+
})]),
|
|
363
|
+
_: 1
|
|
364
|
+
}, 8, ["open", "title"]);
|
|
365
|
+
};
|
|
366
|
+
}
|
|
367
|
+
});
|
|
368
|
+
export { validation_dialog_vue_vue_type_script_setup_true_lang_default as default };
|
|
369
|
+
|
|
370
|
+
//# sourceMappingURL=validation-dialog.vue_vue_type_script_setup_true_lang.js.map
|