@robot-admin/naive-ui-components 0.3.1 → 0.3.3
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/dist/C_ActionBar-nnfbZCea.css.map +1 -0
- package/dist/C_ActionBar2.js +2 -2
- package/dist/C_ActionBar2.js.map +1 -1
- package/dist/C_AntV-DGjscTWa.css.map +1 -0
- package/dist/C_AntV2.js +6 -6
- package/dist/C_AntV2.js.map +1 -1
- package/dist/C_Barcode-DjTmDkbQ.css.map +1 -0
- package/dist/C_Barcode2.js +1 -1
- package/dist/C_Barcode2.js.map +1 -1
- package/dist/C_Captcha-Ccq3DMrR.css.map +1 -0
- package/dist/C_Captcha2.js +1 -1
- package/dist/C_Captcha2.js.map +1 -1
- package/dist/C_Cascade-IUUHIh7r.css.map +1 -0
- package/dist/C_Cascade2.js +2 -2
- package/dist/C_Cascade2.js.map +1 -1
- package/dist/C_City-Cv5BESaN.css.map +1 -0
- package/dist/C_City2.js +2 -2
- package/dist/C_City2.js.map +1 -1
- package/dist/C_Code-DPZlNSxL.css.map +1 -0
- package/dist/C_Code2.js +8 -7
- package/dist/C_Code2.js.map +1 -1
- package/dist/C_CollapsePanel-Fap-lv_5.css.map +1 -0
- package/dist/C_CollapsePanel2.js +1 -1
- package/dist/C_CollapsePanel2.js.map +1 -1
- package/dist/C_Cron-C0-8b5af.css.map +1 -0
- package/dist/C_Cron2.js +15 -14
- package/dist/C_Cron2.js.map +1 -1
- package/dist/C_Date2.js +1 -1
- package/dist/C_Date2.js.map +1 -1
- package/dist/C_Draggable-Bq6o0qXn.css.map +1 -0
- package/dist/C_Draggable2.js +1 -1
- package/dist/C_Draggable2.js.map +1 -1
- package/dist/C_Editor-OlxIF9-5.css.map +1 -0
- package/dist/C_Editor2.js +1 -1
- package/dist/C_Editor2.js.map +1 -1
- package/dist/C_FilePreview-B4XgTv-h.css.map +1 -0
- package/dist/C_FilePreview.cjs +1 -0
- package/dist/C_FilePreview.js +1 -0
- package/dist/C_FilePreview2.js +10 -9
- package/dist/C_FilePreview2.js.map +1 -1
- package/dist/C_Form-Cr9oX037.css.map +1 -0
- package/dist/C_Form.cjs +1 -0
- package/dist/C_Form.js +1 -0
- package/dist/C_Form2.js +69 -72
- package/dist/C_Form2.js.map +1 -1
- package/dist/C_FormSearch-DlIEoh7X.css.map +1 -0
- package/dist/C_FormSearch2.js +2 -2
- package/dist/C_FormSearch2.js.map +1 -1
- package/dist/C_FormulaEditor-Cm0CokN5.css.map +1 -0
- package/dist/C_FormulaEditor2.js +6 -6
- package/dist/C_FormulaEditor2.js.map +1 -1
- package/dist/C_FullCalendar-BULCIlVK.css.map +1 -0
- package/dist/C_FullCalendar2.js +2 -2
- package/dist/C_FullCalendar2.js.map +1 -1
- package/dist/C_Guide2.js +1 -1
- package/dist/C_Guide2.js.map +1 -1
- package/dist/C_Icon2.js.map +1 -1
- package/dist/C_ImageCropper-DrmUlaLi.css.map +1 -0
- package/dist/C_ImageCropper2.js +4 -4
- package/dist/C_ImageCropper2.js.map +1 -1
- package/dist/C_Language2.js +1 -1
- package/dist/C_Language2.js.map +1 -1
- package/dist/C_Map-WUMXSAfy.css.map +1 -0
- package/dist/C_Map2.js +2 -2
- package/dist/C_Map2.js.map +1 -1
- package/dist/C_Markdown-Dmv8yaM4.css.map +1 -0
- package/dist/C_Markdown2.js +4 -4
- package/dist/C_Markdown2.js.map +1 -1
- package/dist/C_NotificationCenter-DbgBiyqB.css.map +1 -0
- package/dist/C_NotificationCenter2.js +21 -20
- package/dist/C_NotificationCenter2.js.map +1 -1
- package/dist/C_Progress2.js +1 -1
- package/dist/C_Progress2.js.map +1 -1
- package/dist/C_QRCode-G7fiAkm4.css.map +1 -0
- package/dist/C_QRCode2.js +1 -1
- package/dist/C_QRCode2.js.map +1 -1
- package/dist/C_Signature-es-ZNPzr.css.map +1 -0
- package/dist/C_Signature2.js +2 -2
- package/dist/C_Signature2.js.map +1 -1
- package/dist/C_SplitPane-Br2eK8IG.css.map +1 -0
- package/dist/C_SplitPane2.js +1 -1
- package/dist/C_SplitPane2.js.map +1 -1
- package/dist/C_Steps-P9Qj9iDd.css.map +1 -0
- package/dist/C_Steps2.js +1 -1
- package/dist/C_Steps2.js.map +1 -1
- package/dist/C_Table-DAwAxr72.css.map +1 -0
- package/dist/C_Table.cjs +1 -0
- package/dist/C_Table.js +1 -0
- package/dist/C_Table2.js +3 -3
- package/dist/C_Table2.js.map +1 -1
- package/dist/C_Theme2.js +1 -1
- package/dist/C_Theme2.js.map +1 -1
- package/dist/C_Time-Bd_e1YDN.css.map +1 -0
- package/dist/C_Time2.js +2 -2
- package/dist/C_Time2.js.map +1 -1
- package/dist/C_Tree-DnGc_MPb.css.map +1 -0
- package/dist/C_Tree2.js +2 -2
- package/dist/C_Tree2.js.map +1 -1
- package/dist/C_Upload-i8LB_29U.css.map +1 -0
- package/dist/C_Upload2.js +5 -5
- package/dist/C_Upload2.js.map +1 -1
- package/dist/C_VideoPlayer-rm0MODUv.css.map +1 -0
- package/dist/C_VideoPlayer2.js +21 -20
- package/dist/C_VideoPlayer2.js.map +1 -1
- package/dist/C_VtableGantt-BpY-Rng3.css.map +1 -0
- package/dist/C_VtableGantt2.js +2 -2
- package/dist/C_VtableGantt2.js.map +1 -1
- package/dist/C_WaterFall-HWB-gPON.css.map +1 -0
- package/dist/C_WaterFall2.js +2 -2
- package/dist/C_WaterFall2.js.map +1 -1
- package/dist/C_WorkFlow-CSO86Cuc.css.map +1 -0
- package/dist/C_WorkFlow2.js +6 -6
- package/dist/C_WorkFlow2.js.map +1 -1
- package/dist/constants.d.ts +4 -4
- package/dist/constants2.d.ts +4 -4
- package/dist/constants3.d.ts +4 -4
- package/dist/constants4.d.ts +5 -5
- package/dist/constants5.d.ts +2 -2
- package/dist/data.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/dist/index.vue.d.ts +1 -1
- package/dist/index10.vue.d.ts +7 -7
- package/dist/index11.vue.d.ts +2 -2
- package/dist/index12.vue.d.ts +5 -5
- package/dist/index12.vue.d.ts.map +1 -1
- package/dist/index13.vue.d.ts +1 -1
- package/dist/index14.vue.d.ts +1 -1
- package/dist/index16.vue.d.ts +1 -1
- package/dist/index2.vue.d.ts +6 -6
- package/dist/index3.vue.d.ts +2 -2
- package/dist/index4.vue.d.ts +2 -2
- package/dist/index5.vue.d.ts +2 -2
- package/dist/index6.vue.d.ts +1 -1
- package/dist/index8.vue.d.ts +3 -3
- package/dist/resolver.js.map +1 -1
- package/dist/style.css +1555 -1555
- package/dist/useCalendarEvents.d.ts +2 -2
- package/dist/useCollapsePanel.d.ts +2 -2
- package/dist/useCropperCore.d.ts +3 -3
- package/dist/useDraggableLayout.d.ts +8 -8
- package/dist/useDynamicFormState.d.ts +111 -111
- package/dist/useDynamicFormState.d.ts.map +1 -1
- package/dist/useEdgeInteraction.d.ts +2 -2
- package/dist/useInfiniteScroll.d.ts +1 -1
- package/dist/useModalEdit.d.ts +4 -4
- package/dist/useModalEdit.d.ts.map +1 -1
- package/dist/useQRCode.d.ts +4 -4
- package/dist/useQRCode.d.ts.map +1 -1
- package/dist/useSearchState.d.ts +2 -2
- package/dist/useSignatureHistory.d.ts +4 -4
- package/dist/useSplitResize.d.ts +6 -6
- package/dist/useSplitResize.d.ts.map +1 -1
- package/dist/useTimeSelection.d.ts +2 -2
- package/dist/useTreeOperations.d.ts +6 -6
- package/dist/useWorkflowValidation.d.ts +5 -5
- package/package.json +2 -1
- package/dist/C_ActionBar-DWN-woTc.css.map +0 -1
- package/dist/C_AntV-AFKyK6hH.css.map +0 -1
- package/dist/C_Barcode-P_EFj8dC.css.map +0 -1
- package/dist/C_Captcha-C-ef41xw.css.map +0 -1
- package/dist/C_Cascade-D9kNsjsV.css.map +0 -1
- package/dist/C_City-BCQ4ipiK.css.map +0 -1
- package/dist/C_Code-C9kvvEmO.css.map +0 -1
- package/dist/C_CollapsePanel-BUJHuYcU.css.map +0 -1
- package/dist/C_Cron-yx2Ob4Jl.css.map +0 -1
- package/dist/C_Draggable-C483syRC.css.map +0 -1
- package/dist/C_Editor-Bp0SyIEw.css.map +0 -1
- package/dist/C_FilePreview-CPqvhoCy.css.map +0 -1
- package/dist/C_Form-Jx7PY3sT.css.map +0 -1
- package/dist/C_FormSearch-DvRgxlRn.css.map +0 -1
- package/dist/C_FormulaEditor-DtGkt4T_.css.map +0 -1
- package/dist/C_FullCalendar-BF7H0YIx.css.map +0 -1
- package/dist/C_ImageCropper-BVJfUufl.css.map +0 -1
- package/dist/C_Map-DpzeuWdX.css.map +0 -1
- package/dist/C_Markdown-BEjxknqd.css.map +0 -1
- package/dist/C_NotificationCenter-0l3TY2Gn.css.map +0 -1
- package/dist/C_QRCode-DbdiAIPg.css.map +0 -1
- package/dist/C_Signature-zhHCbra9.css.map +0 -1
- package/dist/C_SplitPane-C6sBsfKY.css.map +0 -1
- package/dist/C_Steps-CODHN5Hs.css.map +0 -1
- package/dist/C_Table-DSNsntmT.css.map +0 -1
- package/dist/C_Time-BvZLYraL.css.map +0 -1
- package/dist/C_Tree-0GDv--jX.css.map +0 -1
- package/dist/C_Upload-BXd3YYLx.css.map +0 -1
- package/dist/C_VideoPlayer-DYG3RL0Q.css.map +0 -1
- package/dist/C_VtableGantt-fhItIiHE.css.map +0 -1
- package/dist/C_WaterFall-8sQDFXKg.css.map +0 -1
- package/dist/C_WorkFlow-J-dyIuh9.css.map +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"C_FormSearch-DlIEoh7X.css","names":[],"sources":["../src/components/C_FormSearch/index.vue?vue&type=style&index=0&scoped=3439b171&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled */.form-search-card[data-v-3439b171] .n-card__content {\n padding: 20px;\n}\n.form-search[data-v-3439b171] {\n display: flex;\n flex-wrap: wrap;\n align-items: end;\n gap: 20px 32px;\n}\n.form-search .form-search-item-box .form-item-input[data-v-3439b171] {\n position: relative;\n}\n.form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-input,\n.form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-select,\n.form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-date-picker {\n width: 260px !important;\n}\n.form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-space {\n gap: 8px !important;\n}\n.form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-space .n-button {\n width: 36px;\n height: 36px;\n display: flex;\n align-items: center;\n justify-content: center;\n transition: all 0.2s ease;\n}\n.form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-space .n-button:hover {\n transform: translateY(-1px);\n box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);\n}\n.form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-space .n-button .n-button__icon {\n margin: 0;\n}\n.form-search .form-search-item-box .form-item-input .input-history[data-v-3439b171] {\n width: 100%;\n box-shadow: 0 4px 16px rgba(0, 0, 0, 0.12);\n border: 1px solid var(--n-border-color);\n position: absolute;\n top: 100%;\n left: 0;\n margin-top: 4px;\n z-index: 999;\n background-color: var(--n-color);\n box-sizing: border-box;\n border-radius: 8px;\n overflow: hidden;\n max-height: 240px;\n overflow-y: auto;\n /* custom scrollbar */\n}\n.form-search .form-search-item-box .form-item-input .input-history .history-item[data-v-3439b171] {\n padding: 10px 12px;\n display: flex;\n align-items: center;\n justify-content: space-between;\n color: var(--n-text-color);\n font-size: 14px;\n cursor: pointer;\n transition: all 0.2s ease;\n position: relative;\n}\n.form-search .form-search-item-box .form-item-input .input-history .history-item[data-v-3439b171]:hover {\n background: var(--n-option-color-hover);\n}\n.form-search .form-search-item-box .form-item-input .input-history .history-item:hover .delete-icon[data-v-3439b171] {\n opacity: 1;\n transform: scale(1);\n}\n.form-search .form-search-item-box .form-item-input .input-history .history-item[data-v-3439b171]:not(:last-of-type) {\n border-bottom: 1px solid var(--n-divider-color);\n}\n.form-search .form-search-item-box .form-item-input .input-history .history-item .history-text[data-v-3439b171] {\n flex: 1;\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n margin-right: 8px;\n}\n.form-search .form-search-item-box .form-item-input .input-history .history-item .delete-icon[data-v-3439b171] {\n opacity: 0;\n transform: scale(0.8);\n transition: all 0.2s ease;\n color: var(--n-text-color-disabled);\n cursor: pointer;\n border-radius: 50%;\n padding: 2px;\n display: flex;\n align-items: center;\n justify-content: center;\n}\n.form-search .form-search-item-box .form-item-input .input-history .history-item .delete-icon[data-v-3439b171]:hover {\n background: var(--n-close-color-hover);\n color: var(--n-close-color-pressed);\n transform: scale(1.1);\n}\n.form-search .form-search-item-box .form-item-input .input-history .history-footer[data-v-3439b171] {\n padding: 8px 12px;\n border-top: 1px solid var(--n-divider-color);\n background: var(--n-modal-color);\n}\n.form-search .form-search-item-box .form-item-input .input-history .history-footer .clear-all[data-v-3439b171] {\n color: var(--n-text-color-disabled);\n font-size: 12px;\n cursor: pointer;\n transition: all 0.2s ease;\n}\n.form-search .form-search-item-box .form-item-input .input-history .history-footer .clear-all[data-v-3439b171]:hover {\n color: var(--n-error-color);\n}\n.form-search .form-search-item-box .form-item-input .input-history[data-v-3439b171]::-webkit-scrollbar {\n width: 6px;\n}\n.form-search .form-search-item-box .form-item-input .input-history[data-v-3439b171]::-webkit-scrollbar-track {\n background: transparent;\n}\n.form-search .form-search-item-box .form-item-input .input-history[data-v-3439b171]::-webkit-scrollbar-thumb {\n background: var(--n-scrollbar-color);\n border-radius: 3px;\n}\n.form-search .form-search-item-box .form-item-input .input-history[data-v-3439b171]::-webkit-scrollbar-thumb:hover {\n background: var(--n-scrollbar-color-hover);\n}\n\n/* responsive */\n@media (max-width: 1400px) {\n.form-search[data-v-3439b171] {\n gap: 16px 28px;\n}\n.form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-input,\n .form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-select,\n .form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-date-picker {\n width: 240px !important;\n}\n}\n@media (max-width: 1200px) {\n.form-search[data-v-3439b171] {\n gap: 16px 24px;\n}\n.form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-input,\n .form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-select,\n .form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-date-picker {\n width: 220px !important;\n}\n}\n@media (max-width: 900px) {\n.form-search[data-v-3439b171] {\n gap: 12px 20px;\n}\n.form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-input,\n .form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-select,\n .form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-date-picker {\n width: 200px !important;\n}\n}\n@media (max-width: 600px) {\n.form-search-card[data-v-3439b171] .n-card__content {\n padding: 16px;\n}\n.form-search[data-v-3439b171] {\n gap: 12px 0;\n}\n.form-search .form-search-item-box[data-v-3439b171] {\n width: 100%;\n}\n.form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-input,\n .form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-select,\n .form-search .form-search-item-box .form-item-input[data-v-3439b171] .n-date-picker {\n width: 100% !important;\n}\n.form-search .form-search-item-box .form-item-input .input-history .history-item .delete-icon[data-v-3439b171] {\n opacity: 1;\n}\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
package/dist/C_FormSearch2.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as export_helper_default } from "./export-helper.js";
|
|
2
2
|
import { i as setItem, t as getItem } from "./storage.js";
|
|
3
|
-
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, onMounted, openBlock, ref, renderList, toDisplayString, unref, watch, withCtx, withModifiers } from "vue";
|
|
4
3
|
import { NButton, NCard, NDatePicker, NForm, NFormItem, NIcon, NInput, NSelect, NSpace, NTooltip, useMessage } from "naive-ui";
|
|
4
|
+
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, normalizeClass, onMounted, openBlock, ref, renderList, toDisplayString, unref, watch, withCtx, withModifiers } from "vue";
|
|
5
5
|
|
|
6
6
|
//#region src/components/C_FormSearch/composables/useSearchHistory.ts
|
|
7
7
|
/**
|
|
@@ -349,7 +349,7 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
|
|
|
349
349
|
|
|
350
350
|
//#endregion
|
|
351
351
|
//#region src/components/C_FormSearch/index.vue
|
|
352
|
-
var C_FormSearch_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
352
|
+
var C_FormSearch_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-3439b171"]]);
|
|
353
353
|
|
|
354
354
|
//#endregion
|
|
355
355
|
export { useSearchState as n, useSearchHistory as r, C_FormSearch_default as t };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"C_FormSearch2.js","names":["bordered","size"],"sources":["../src/components/C_FormSearch/composables/useSearchHistory.ts","../src/components/C_FormSearch/composables/useSearchState.ts","../src/components/C_FormSearch/index.vue","../src/components/C_FormSearch/index.vue","../src/components/C_FormSearch/index.vue"],"sourcesContent":["import { getItem, setItem } from '../../../utils/storage'\r\nimport type { Ref } from 'vue'\r\nimport type { SearchFormItem, SearchFormParams } from '../types'\r\n\r\nexport interface SearchHistoryOptions {\r\n storageKey?: string\r\n maxItems?: number\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport function useSearchHistory(\r\n fields: Ref<SearchFormItem[]>,\r\n formParams: Ref<SearchFormParams>,\r\n options: SearchHistoryOptions = {}\r\n) {\r\n const { storageKey, maxItems = 5 } = options\r\n const enabled = !!storageKey\r\n\r\n const findField = (prop: string) =>\r\n fields.value.find(item => item.prop === prop)\r\n\r\n const persistToStorage = () => {\r\n if (enabled) setItem(storageKey!, fields.value)\r\n }\r\n\r\n const restoreFromStorage = () => {\r\n if (!enabled) return\r\n const stored = getItem<SearchFormItem[]>(storageKey!)\r\n if (!stored) return\r\n stored.forEach(storedItem => {\r\n const field = findField(storedItem.prop)\r\n if (field && storedItem.hisList) {\r\n field.hisList = storedItem.hisList\r\n }\r\n })\r\n }\r\n\r\n const setAllFieldsFocus = (targetProp?: string) => {\r\n fields.value.forEach(item => {\r\n item.isFocus = !!(item.hisList && item.prop === targetProp)\r\n })\r\n }\r\n\r\n const handleFocus = (prop: string) => {\r\n restoreFromStorage()\r\n setAllFieldsFocus(prop)\r\n }\r\n\r\n const closeAllPanels = () => setAllFieldsFocus()\r\n\r\n const selectHistoryItem = (value: string, prop: string) => {\r\n formParams.value[prop] = value\r\n closeAllPanels()\r\n }\r\n\r\n const deleteHistoryItem = (prop: string, index: number) => {\r\n const field = findField(prop)\r\n if (!field?.hisList) return\r\n field.hisList.splice(index, 1)\r\n if (field.hisList.length === 0) field.isFocus = false\r\n persistToStorage()\r\n }\r\n\r\n const clearAllHistory = (prop: string) => {\r\n const field = findField(prop)\r\n if (!field?.hisList) return\r\n field.hisList = []\r\n field.isFocus = false\r\n persistToStorage()\r\n }\r\n\r\n const pushToHistoryList = (hisList: string[], newValue: string) => {\r\n const idx = hisList.indexOf(newValue)\r\n if (idx > -1) hisList.splice(idx, 1)\r\n hisList.unshift(newValue)\r\n if (hisList.length > maxItems) hisList.length = maxItems\r\n return hisList\r\n }\r\n\r\n const saveCurrentInputs = () => {\r\n if (!enabled) return\r\n Object.keys(formParams.value).forEach(key => {\r\n const val = formParams.value[key]\r\n if (!val) return\r\n const field = findField(key)\r\n if (!field?.hisList) return\r\n const str = String(val).trim()\r\n if (str) pushToHistoryList(field.hisList, str)\r\n })\r\n closeAllPanels()\r\n persistToStorage()\r\n }\r\n\r\n return {\r\n enabled,\r\n handleFocus,\r\n closeAllPanels,\r\n selectHistoryItem,\r\n deleteHistoryItem,\r\n clearAllHistory,\r\n saveCurrentInputs,\r\n restoreFromStorage,\r\n }\r\n}\r\n","import { ref, computed, onMounted } from 'vue'\r\nimport { useMessage } from 'naive-ui'\r\nimport type { SearchFormItem, SearchFormParams, SearchConfig } from '../types'\r\nimport { useSearchHistory, type SearchHistoryOptions } from './useSearchHistory'\r\n\r\ninterface UseSearchStateOptions {\r\n formItemList: SearchFormItem[]\r\n formParams: SearchFormParams\r\n config?: SearchConfig\r\n historyOptions?: SearchHistoryOptions\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport function useSearchState(\r\n emits: {\r\n (event: 'search', params: SearchFormParams): void\r\n (event: 'reset'): void\r\n (event: 'change-params', params: SearchFormParams): void\r\n },\r\n options: UseSearchStateOptions\r\n) {\r\n const message = useMessage()\r\n const formRef = ref<any>(null)\r\n\r\n const foldThreshold = options.config?.foldThreshold ?? 7\r\n const requireValue = options.config?.requireValue ?? true\r\n\r\n const fields = ref<SearchFormItem[]>([...options.formItemList])\r\n const formParams = ref<SearchFormParams>({ ...options.formParams })\r\n const expanded = ref(false)\r\n const searching = ref(false)\r\n\r\n const history = useSearchHistory(fields, formParams, options.historyOptions)\r\n\r\n const visibleFields = computed(() =>\r\n fields.value.filter(item => item.show !== false)\r\n )\r\n\r\n const hasExpandButton = computed(() => fields.value.length > foldThreshold)\r\n\r\n const isEmpty = (value: any): boolean =>\r\n value === undefined ||\r\n value === null ||\r\n value === '' ||\r\n (Array.isArray(value) && value.length === 0)\r\n\r\n const initialize = () => {\r\n fields.value.forEach((item, index) => {\r\n item.isFocus = false\r\n if (index >= foldThreshold && item.show === undefined) {\r\n item.show = false\r\n }\r\n if (item.type === 'select') {\r\n if (!item.placeholder) item.placeholder = '请选择'\r\n if (formParams.value[item.prop] === undefined) {\r\n formParams.value[item.prop] = null\r\n }\r\n }\r\n })\r\n }\r\n\r\n const searchFn = () => {\r\n if (requireValue) {\r\n const hasValidParams = Object.entries(formParams.value)\r\n .filter(([key]) => key !== 'pageNum' && key !== 'pageSize')\r\n .some(([, value]) => !isEmpty(value))\r\n\r\n if (!hasValidParams) {\r\n message.warning('请输入搜索内容,或选择筛选条件')\r\n return\r\n }\r\n }\r\n history.saveCurrentInputs()\r\n emits('search', formParams.value)\r\n }\r\n\r\n const resetFn = () => {\r\n formRef.value?.restoreValidation()\r\n Object.keys(formParams.value).forEach(key => {\r\n if (key !== 'pageNum' && key !== 'pageSize') {\r\n formParams.value[key] = null\r\n }\r\n })\r\n emits('change-params', formParams.value)\r\n emits('reset')\r\n }\r\n\r\n const toggleFold = () => {\r\n expanded.value = !expanded.value\r\n fields.value.forEach((item, index) => {\r\n if (index >= foldThreshold) item.show = expanded.value\r\n })\r\n }\r\n\r\n const syncFromProps = (\r\n newItems: SearchFormItem[],\r\n newParams: SearchFormParams\r\n ) => {\r\n fields.value = [...newItems]\r\n formParams.value = { ...newParams }\r\n initialize()\r\n }\r\n\r\n onMounted(() => {\r\n initialize()\r\n history.restoreFromStorage()\r\n })\r\n\r\n return {\r\n formRef,\r\n fields,\r\n formParams,\r\n expanded,\r\n searching,\r\n visibleFields,\r\n hasExpandButton,\r\n history,\r\n searchFn,\r\n resetFn,\r\n toggleFold,\r\n syncFromProps,\r\n }\r\n}\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-10\r\n * @Description: 表单搜索组件(薄 UI 壳 — 逻辑由 composable 驱动)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NCard class=\"form-search-card custom-card\" :bordered=\"bordered\">\r\n <NForm class=\"form-search\" :model=\"formParams\" ref=\"formRef\" :size=\"size\">\r\n <div\r\n class=\"form-search-item-box\"\r\n v-for=\"(item, index) of visibleFields\"\r\n :key=\"index\"\r\n >\r\n <NFormItem\r\n class=\"form-item-input\"\r\n v-if=\"item.type !== 'spacer'\"\r\n :path=\"item.prop\"\r\n :show-feedback=\"false\"\r\n :show-label=\"false\"\r\n >\r\n <NInput\r\n v-if=\"item.type === 'input'\"\r\n clearable\r\n v-model:value=\"formParams[item.prop]\"\r\n :placeholder=\"item.placeholder\"\r\n @focus=\"history.handleFocus(item.prop)\"\r\n @blur=\"history.closeAllPanels\"\r\n />\r\n\r\n <div class=\"input-history\" v-if=\"item.isFocus\" @mousedown.prevent>\r\n <div\r\n class=\"history-item\"\r\n @click=\"history.selectHistoryItem(hisValue, item.prop)\"\r\n v-for=\"(hisValue, hisIndex) of item.hisList\"\r\n :key=\"hisValue\"\r\n >\r\n <span class=\"history-text\">{{ hisValue }}</span>\r\n <NIcon\r\n class=\"delete-icon\"\r\n size=\"14\"\r\n @click.stop=\"history.deleteHistoryItem(item.prop, hisIndex)\"\r\n >\r\n <div class=\"i-mdi:close\" />\r\n </NIcon>\r\n </div>\r\n <div\r\n class=\"history-footer\"\r\n v-if=\"item.hisList && item.hisList.length > 0\"\r\n >\r\n <span\r\n class=\"clear-all\"\r\n @click.stop=\"history.clearAllHistory(item.prop)\"\r\n >\r\n 清空历史记录\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <NSelect\r\n v-if=\"item.type === 'select'\"\r\n v-model:value=\"formParams[item.prop]\"\r\n :placeholder=\"item.placeholder || '请选择'\"\r\n clearable\r\n :options=\"normalizeOptions(item.list)\"\r\n />\r\n\r\n <NDatePicker\r\n v-if=\"item.type === 'date-range'\"\r\n type=\"datetimerange\"\r\n v-model:value=\"formParams[item.prop]\"\r\n format=\"yyyy-MM-dd HH:mm\"\r\n value-format=\"yyyy-MM-dd HH:mm\"\r\n start-placeholder=\"开始时间\"\r\n end-placeholder=\"结束时间\"\r\n clearable\r\n />\r\n </NFormItem>\r\n </div>\r\n\r\n <div class=\"form-search-item-box\">\r\n <div class=\"form-item-input\">\r\n <div class=\"button-label-placeholder\"></div>\r\n <NSpace>\r\n <NTooltip trigger=\"hover\">\r\n <template #trigger>\r\n <NButton type=\"primary\" @click=\"searchFn\" :loading=\"searching\">\r\n <template #icon>\r\n <div class=\"i-mdi:search w-4 h-4\" />\r\n </template>\r\n </NButton>\r\n </template>\r\n 搜索\r\n </NTooltip>\r\n\r\n <NTooltip trigger=\"hover\">\r\n <template #trigger>\r\n <NButton @click=\"resetFn\">\r\n <template #icon>\r\n <div class=\"i-mdi:refresh w-4 h-4\" />\r\n </template>\r\n </NButton>\r\n </template>\r\n 重置\r\n </NTooltip>\r\n\r\n <NTooltip v-if=\"hasExpandButton\" trigger=\"hover\">\r\n <template #trigger>\r\n <NButton @click=\"toggleFold\">\r\n <template #icon>\r\n <div\r\n :class=\"\r\n expanded\r\n ? 'i-mdi:chevron-up w-4 h-4'\r\n : 'i-mdi:chevron-down w-4 h-4'\r\n \"\r\n />\r\n </template>\r\n </NButton>\r\n </template>\r\n {{ expanded ? \"收起\" : \"展开\" }}\r\n </NTooltip>\r\n </NSpace>\r\n </div>\r\n </div>\r\n </NForm>\r\n </NCard>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { watch } from \"vue\";\r\nimport {\r\n NCard,\r\n NForm,\r\n NFormItem,\r\n NInput,\r\n NSelect,\r\n NDatePicker,\r\n NSpace,\r\n NButton,\r\n NTooltip,\r\n NIcon,\r\n} from \"naive-ui\";\r\nimport { useSearchState } from \"./composables/useSearchState\";\r\nimport type {\r\n SearchFormItem,\r\n SearchFormParams,\r\n SearchOptionItem,\r\n SearchConfig,\r\n} from \"./types\";\r\n\r\ndefineOptions({ name: \"C_FormSearch\" });\r\n\r\ninterface Props {\r\n bordered?: boolean;\r\n formItemList: SearchFormItem[];\r\n formParams: SearchFormParams;\r\n formSearchInputHistoryString?: string;\r\n size?: \"small\" | \"medium\" | \"large\";\r\n config?: SearchConfig;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n bordered: true,\r\n formItemList: () => [],\r\n size: \"medium\",\r\n});\r\n\r\nconst emits = defineEmits<{\r\n search: [params: SearchFormParams];\r\n reset: [];\r\n \"change-params\": [params: SearchFormParams];\r\n}>();\r\n\r\nconst {\r\n formRef,\r\n formParams,\r\n expanded,\r\n searching,\r\n visibleFields,\r\n hasExpandButton,\r\n history,\r\n searchFn,\r\n resetFn,\r\n toggleFold,\r\n syncFromProps,\r\n} = useSearchState(emits, {\r\n formItemList: props.formItemList,\r\n formParams: props.formParams,\r\n config: props.config,\r\n historyOptions: {\r\n storageKey: props.formSearchInputHistoryString,\r\n maxItems: props.config?.historyMaxItems,\r\n },\r\n});\r\n\r\nconst normalizeOptions = (list?: SearchOptionItem[]) =>\r\n list?.map((opt) => ({\r\n label: opt.label || opt.labelDefault || \"\",\r\n value: opt.value !== undefined ? opt.value : opt.label || opt.labelDefault,\r\n }));\r\n\r\nwatch(\r\n () => props.formItemList,\r\n (newItems) => syncFromProps(newItems, props.formParams),\r\n { deep: true },\r\n);\r\n\r\ndefineExpose({\r\n formRef,\r\n formParams,\r\n searchFn,\r\n cleanFn: resetFn,\r\n changeFoldState: toggleFold,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-10\r\n * @Description: 表单搜索组件(薄 UI 壳 — 逻辑由 composable 驱动)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NCard class=\"form-search-card custom-card\" :bordered=\"bordered\">\r\n <NForm class=\"form-search\" :model=\"formParams\" ref=\"formRef\" :size=\"size\">\r\n <div\r\n class=\"form-search-item-box\"\r\n v-for=\"(item, index) of visibleFields\"\r\n :key=\"index\"\r\n >\r\n <NFormItem\r\n class=\"form-item-input\"\r\n v-if=\"item.type !== 'spacer'\"\r\n :path=\"item.prop\"\r\n :show-feedback=\"false\"\r\n :show-label=\"false\"\r\n >\r\n <NInput\r\n v-if=\"item.type === 'input'\"\r\n clearable\r\n v-model:value=\"formParams[item.prop]\"\r\n :placeholder=\"item.placeholder\"\r\n @focus=\"history.handleFocus(item.prop)\"\r\n @blur=\"history.closeAllPanels\"\r\n />\r\n\r\n <div class=\"input-history\" v-if=\"item.isFocus\" @mousedown.prevent>\r\n <div\r\n class=\"history-item\"\r\n @click=\"history.selectHistoryItem(hisValue, item.prop)\"\r\n v-for=\"(hisValue, hisIndex) of item.hisList\"\r\n :key=\"hisValue\"\r\n >\r\n <span class=\"history-text\">{{ hisValue }}</span>\r\n <NIcon\r\n class=\"delete-icon\"\r\n size=\"14\"\r\n @click.stop=\"history.deleteHistoryItem(item.prop, hisIndex)\"\r\n >\r\n <div class=\"i-mdi:close\" />\r\n </NIcon>\r\n </div>\r\n <div\r\n class=\"history-footer\"\r\n v-if=\"item.hisList && item.hisList.length > 0\"\r\n >\r\n <span\r\n class=\"clear-all\"\r\n @click.stop=\"history.clearAllHistory(item.prop)\"\r\n >\r\n 清空历史记录\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <NSelect\r\n v-if=\"item.type === 'select'\"\r\n v-model:value=\"formParams[item.prop]\"\r\n :placeholder=\"item.placeholder || '请选择'\"\r\n clearable\r\n :options=\"normalizeOptions(item.list)\"\r\n />\r\n\r\n <NDatePicker\r\n v-if=\"item.type === 'date-range'\"\r\n type=\"datetimerange\"\r\n v-model:value=\"formParams[item.prop]\"\r\n format=\"yyyy-MM-dd HH:mm\"\r\n value-format=\"yyyy-MM-dd HH:mm\"\r\n start-placeholder=\"开始时间\"\r\n end-placeholder=\"结束时间\"\r\n clearable\r\n />\r\n </NFormItem>\r\n </div>\r\n\r\n <div class=\"form-search-item-box\">\r\n <div class=\"form-item-input\">\r\n <div class=\"button-label-placeholder\"></div>\r\n <NSpace>\r\n <NTooltip trigger=\"hover\">\r\n <template #trigger>\r\n <NButton type=\"primary\" @click=\"searchFn\" :loading=\"searching\">\r\n <template #icon>\r\n <div class=\"i-mdi:search w-4 h-4\" />\r\n </template>\r\n </NButton>\r\n </template>\r\n 搜索\r\n </NTooltip>\r\n\r\n <NTooltip trigger=\"hover\">\r\n <template #trigger>\r\n <NButton @click=\"resetFn\">\r\n <template #icon>\r\n <div class=\"i-mdi:refresh w-4 h-4\" />\r\n </template>\r\n </NButton>\r\n </template>\r\n 重置\r\n </NTooltip>\r\n\r\n <NTooltip v-if=\"hasExpandButton\" trigger=\"hover\">\r\n <template #trigger>\r\n <NButton @click=\"toggleFold\">\r\n <template #icon>\r\n <div\r\n :class=\"\r\n expanded\r\n ? 'i-mdi:chevron-up w-4 h-4'\r\n : 'i-mdi:chevron-down w-4 h-4'\r\n \"\r\n />\r\n </template>\r\n </NButton>\r\n </template>\r\n {{ expanded ? \"收起\" : \"展开\" }}\r\n </NTooltip>\r\n </NSpace>\r\n </div>\r\n </div>\r\n </NForm>\r\n </NCard>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { watch } from \"vue\";\r\nimport {\r\n NCard,\r\n NForm,\r\n NFormItem,\r\n NInput,\r\n NSelect,\r\n NDatePicker,\r\n NSpace,\r\n NButton,\r\n NTooltip,\r\n NIcon,\r\n} from \"naive-ui\";\r\nimport { useSearchState } from \"./composables/useSearchState\";\r\nimport type {\r\n SearchFormItem,\r\n SearchFormParams,\r\n SearchOptionItem,\r\n SearchConfig,\r\n} from \"./types\";\r\n\r\ndefineOptions({ name: \"C_FormSearch\" });\r\n\r\ninterface Props {\r\n bordered?: boolean;\r\n formItemList: SearchFormItem[];\r\n formParams: SearchFormParams;\r\n formSearchInputHistoryString?: string;\r\n size?: \"small\" | \"medium\" | \"large\";\r\n config?: SearchConfig;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n bordered: true,\r\n formItemList: () => [],\r\n size: \"medium\",\r\n});\r\n\r\nconst emits = defineEmits<{\r\n search: [params: SearchFormParams];\r\n reset: [];\r\n \"change-params\": [params: SearchFormParams];\r\n}>();\r\n\r\nconst {\r\n formRef,\r\n formParams,\r\n expanded,\r\n searching,\r\n visibleFields,\r\n hasExpandButton,\r\n history,\r\n searchFn,\r\n resetFn,\r\n toggleFold,\r\n syncFromProps,\r\n} = useSearchState(emits, {\r\n formItemList: props.formItemList,\r\n formParams: props.formParams,\r\n config: props.config,\r\n historyOptions: {\r\n storageKey: props.formSearchInputHistoryString,\r\n maxItems: props.config?.historyMaxItems,\r\n },\r\n});\r\n\r\nconst normalizeOptions = (list?: SearchOptionItem[]) =>\r\n list?.map((opt) => ({\r\n label: opt.label || opt.labelDefault || \"\",\r\n value: opt.value !== undefined ? opt.value : opt.label || opt.labelDefault,\r\n }));\r\n\r\nwatch(\r\n () => props.formItemList,\r\n (newItems) => syncFromProps(newItems, props.formParams),\r\n { deep: true },\r\n);\r\n\r\ndefineExpose({\r\n formRef,\r\n formParams,\r\n searchFn,\r\n cleanFn: resetFn,\r\n changeFoldState: toggleFold,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-10\r\n * @Description: 表单搜索组件(薄 UI 壳 — 逻辑由 composable 驱动)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NCard class=\"form-search-card custom-card\" :bordered=\"bordered\">\r\n <NForm class=\"form-search\" :model=\"formParams\" ref=\"formRef\" :size=\"size\">\r\n <div\r\n class=\"form-search-item-box\"\r\n v-for=\"(item, index) of visibleFields\"\r\n :key=\"index\"\r\n >\r\n <NFormItem\r\n class=\"form-item-input\"\r\n v-if=\"item.type !== 'spacer'\"\r\n :path=\"item.prop\"\r\n :show-feedback=\"false\"\r\n :show-label=\"false\"\r\n >\r\n <NInput\r\n v-if=\"item.type === 'input'\"\r\n clearable\r\n v-model:value=\"formParams[item.prop]\"\r\n :placeholder=\"item.placeholder\"\r\n @focus=\"history.handleFocus(item.prop)\"\r\n @blur=\"history.closeAllPanels\"\r\n />\r\n\r\n <div class=\"input-history\" v-if=\"item.isFocus\" @mousedown.prevent>\r\n <div\r\n class=\"history-item\"\r\n @click=\"history.selectHistoryItem(hisValue, item.prop)\"\r\n v-for=\"(hisValue, hisIndex) of item.hisList\"\r\n :key=\"hisValue\"\r\n >\r\n <span class=\"history-text\">{{ hisValue }}</span>\r\n <NIcon\r\n class=\"delete-icon\"\r\n size=\"14\"\r\n @click.stop=\"history.deleteHistoryItem(item.prop, hisIndex)\"\r\n >\r\n <div class=\"i-mdi:close\" />\r\n </NIcon>\r\n </div>\r\n <div\r\n class=\"history-footer\"\r\n v-if=\"item.hisList && item.hisList.length > 0\"\r\n >\r\n <span\r\n class=\"clear-all\"\r\n @click.stop=\"history.clearAllHistory(item.prop)\"\r\n >\r\n 清空历史记录\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <NSelect\r\n v-if=\"item.type === 'select'\"\r\n v-model:value=\"formParams[item.prop]\"\r\n :placeholder=\"item.placeholder || '请选择'\"\r\n clearable\r\n :options=\"normalizeOptions(item.list)\"\r\n />\r\n\r\n <NDatePicker\r\n v-if=\"item.type === 'date-range'\"\r\n type=\"datetimerange\"\r\n v-model:value=\"formParams[item.prop]\"\r\n format=\"yyyy-MM-dd HH:mm\"\r\n value-format=\"yyyy-MM-dd HH:mm\"\r\n start-placeholder=\"开始时间\"\r\n end-placeholder=\"结束时间\"\r\n clearable\r\n />\r\n </NFormItem>\r\n </div>\r\n\r\n <div class=\"form-search-item-box\">\r\n <div class=\"form-item-input\">\r\n <div class=\"button-label-placeholder\"></div>\r\n <NSpace>\r\n <NTooltip trigger=\"hover\">\r\n <template #trigger>\r\n <NButton type=\"primary\" @click=\"searchFn\" :loading=\"searching\">\r\n <template #icon>\r\n <div class=\"i-mdi:search w-4 h-4\" />\r\n </template>\r\n </NButton>\r\n </template>\r\n 搜索\r\n </NTooltip>\r\n\r\n <NTooltip trigger=\"hover\">\r\n <template #trigger>\r\n <NButton @click=\"resetFn\">\r\n <template #icon>\r\n <div class=\"i-mdi:refresh w-4 h-4\" />\r\n </template>\r\n </NButton>\r\n </template>\r\n 重置\r\n </NTooltip>\r\n\r\n <NTooltip v-if=\"hasExpandButton\" trigger=\"hover\">\r\n <template #trigger>\r\n <NButton @click=\"toggleFold\">\r\n <template #icon>\r\n <div\r\n :class=\"\r\n expanded\r\n ? 'i-mdi:chevron-up w-4 h-4'\r\n : 'i-mdi:chevron-down w-4 h-4'\r\n \"\r\n />\r\n </template>\r\n </NButton>\r\n </template>\r\n {{ expanded ? \"收起\" : \"展开\" }}\r\n </NTooltip>\r\n </NSpace>\r\n </div>\r\n </div>\r\n </NForm>\r\n </NCard>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { watch } from \"vue\";\r\nimport {\r\n NCard,\r\n NForm,\r\n NFormItem,\r\n NInput,\r\n NSelect,\r\n NDatePicker,\r\n NSpace,\r\n NButton,\r\n NTooltip,\r\n NIcon,\r\n} from \"naive-ui\";\r\nimport { useSearchState } from \"./composables/useSearchState\";\r\nimport type {\r\n SearchFormItem,\r\n SearchFormParams,\r\n SearchOptionItem,\r\n SearchConfig,\r\n} from \"./types\";\r\n\r\ndefineOptions({ name: \"C_FormSearch\" });\r\n\r\ninterface Props {\r\n bordered?: boolean;\r\n formItemList: SearchFormItem[];\r\n formParams: SearchFormParams;\r\n formSearchInputHistoryString?: string;\r\n size?: \"small\" | \"medium\" | \"large\";\r\n config?: SearchConfig;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n bordered: true,\r\n formItemList: () => [],\r\n size: \"medium\",\r\n});\r\n\r\nconst emits = defineEmits<{\r\n search: [params: SearchFormParams];\r\n reset: [];\r\n \"change-params\": [params: SearchFormParams];\r\n}>();\r\n\r\nconst {\r\n formRef,\r\n formParams,\r\n expanded,\r\n searching,\r\n visibleFields,\r\n hasExpandButton,\r\n history,\r\n searchFn,\r\n resetFn,\r\n toggleFold,\r\n syncFromProps,\r\n} = useSearchState(emits, {\r\n formItemList: props.formItemList,\r\n formParams: props.formParams,\r\n config: props.config,\r\n historyOptions: {\r\n storageKey: props.formSearchInputHistoryString,\r\n maxItems: props.config?.historyMaxItems,\r\n },\r\n});\r\n\r\nconst normalizeOptions = (list?: SearchOptionItem[]) =>\r\n list?.map((opt) => ({\r\n label: opt.label || opt.labelDefault || \"\",\r\n value: opt.value !== undefined ? opt.value : opt.label || opt.labelDefault,\r\n }));\r\n\r\nwatch(\r\n () => props.formItemList,\r\n (newItems) => syncFromProps(newItems, props.formParams),\r\n { deep: true },\r\n);\r\n\r\ndefineExpose({\r\n formRef,\r\n formParams,\r\n searchFn,\r\n cleanFn: resetFn,\r\n changeFoldState: toggleFold,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"C_FormSearch2.js","names":["bordered","size"],"sources":["../src/components/C_FormSearch/composables/useSearchHistory.ts","../src/components/C_FormSearch/composables/useSearchState.ts","../src/components/C_FormSearch/index.vue","../src/components/C_FormSearch/index.vue","../src/components/C_FormSearch/index.vue"],"sourcesContent":["import { getItem, setItem } from '../../../utils/storage'\r\nimport type { Ref } from 'vue'\r\nimport type { SearchFormItem, SearchFormParams } from '../types'\r\n\r\nexport interface SearchHistoryOptions {\r\n storageKey?: string\r\n maxItems?: number\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport function useSearchHistory(\r\n fields: Ref<SearchFormItem[]>,\r\n formParams: Ref<SearchFormParams>,\r\n options: SearchHistoryOptions = {}\r\n) {\r\n const { storageKey, maxItems = 5 } = options\r\n const enabled = !!storageKey\r\n\r\n const findField = (prop: string) =>\r\n fields.value.find(item => item.prop === prop)\r\n\r\n const persistToStorage = () => {\r\n if (enabled) setItem(storageKey!, fields.value)\r\n }\r\n\r\n const restoreFromStorage = () => {\r\n if (!enabled) return\r\n const stored = getItem<SearchFormItem[]>(storageKey!)\r\n if (!stored) return\r\n stored.forEach(storedItem => {\r\n const field = findField(storedItem.prop)\r\n if (field && storedItem.hisList) {\r\n field.hisList = storedItem.hisList\r\n }\r\n })\r\n }\r\n\r\n const setAllFieldsFocus = (targetProp?: string) => {\r\n fields.value.forEach(item => {\r\n item.isFocus = !!(item.hisList && item.prop === targetProp)\r\n })\r\n }\r\n\r\n const handleFocus = (prop: string) => {\r\n restoreFromStorage()\r\n setAllFieldsFocus(prop)\r\n }\r\n\r\n const closeAllPanels = () => setAllFieldsFocus()\r\n\r\n const selectHistoryItem = (value: string, prop: string) => {\r\n formParams.value[prop] = value\r\n closeAllPanels()\r\n }\r\n\r\n const deleteHistoryItem = (prop: string, index: number) => {\r\n const field = findField(prop)\r\n if (!field?.hisList) return\r\n field.hisList.splice(index, 1)\r\n if (field.hisList.length === 0) field.isFocus = false\r\n persistToStorage()\r\n }\r\n\r\n const clearAllHistory = (prop: string) => {\r\n const field = findField(prop)\r\n if (!field?.hisList) return\r\n field.hisList = []\r\n field.isFocus = false\r\n persistToStorage()\r\n }\r\n\r\n const pushToHistoryList = (hisList: string[], newValue: string) => {\r\n const idx = hisList.indexOf(newValue)\r\n if (idx > -1) hisList.splice(idx, 1)\r\n hisList.unshift(newValue)\r\n if (hisList.length > maxItems) hisList.length = maxItems\r\n return hisList\r\n }\r\n\r\n const saveCurrentInputs = () => {\r\n if (!enabled) return\r\n Object.keys(formParams.value).forEach(key => {\r\n const val = formParams.value[key]\r\n if (!val) return\r\n const field = findField(key)\r\n if (!field?.hisList) return\r\n const str = String(val).trim()\r\n if (str) pushToHistoryList(field.hisList, str)\r\n })\r\n closeAllPanels()\r\n persistToStorage()\r\n }\r\n\r\n return {\r\n enabled,\r\n handleFocus,\r\n closeAllPanels,\r\n selectHistoryItem,\r\n deleteHistoryItem,\r\n clearAllHistory,\r\n saveCurrentInputs,\r\n restoreFromStorage,\r\n }\r\n}\r\n","import { ref, computed, onMounted } from 'vue'\r\nimport { useMessage } from 'naive-ui'\r\nimport type { SearchFormItem, SearchFormParams, SearchConfig } from '../types'\r\nimport { useSearchHistory, type SearchHistoryOptions } from './useSearchHistory'\r\n\r\ninterface UseSearchStateOptions {\r\n formItemList: SearchFormItem[]\r\n formParams: SearchFormParams\r\n config?: SearchConfig\r\n historyOptions?: SearchHistoryOptions\r\n}\r\n\r\n/**\r\n *\r\n */\r\nexport function useSearchState(\r\n emits: {\r\n (event: 'search', params: SearchFormParams): void\r\n (event: 'reset'): void\r\n (event: 'change-params', params: SearchFormParams): void\r\n },\r\n options: UseSearchStateOptions\r\n) {\r\n const message = useMessage()\r\n const formRef = ref<any>(null)\r\n\r\n const foldThreshold = options.config?.foldThreshold ?? 7\r\n const requireValue = options.config?.requireValue ?? true\r\n\r\n const fields = ref<SearchFormItem[]>([...options.formItemList])\r\n const formParams = ref<SearchFormParams>({ ...options.formParams })\r\n const expanded = ref(false)\r\n const searching = ref(false)\r\n\r\n const history = useSearchHistory(fields, formParams, options.historyOptions)\r\n\r\n const visibleFields = computed(() =>\r\n fields.value.filter(item => item.show !== false)\r\n )\r\n\r\n const hasExpandButton = computed(() => fields.value.length > foldThreshold)\r\n\r\n const isEmpty = (value: any): boolean =>\r\n value === undefined ||\r\n value === null ||\r\n value === '' ||\r\n (Array.isArray(value) && value.length === 0)\r\n\r\n const initialize = () => {\r\n fields.value.forEach((item, index) => {\r\n item.isFocus = false\r\n if (index >= foldThreshold && item.show === undefined) {\r\n item.show = false\r\n }\r\n if (item.type === 'select') {\r\n if (!item.placeholder) item.placeholder = '请选择'\r\n if (formParams.value[item.prop] === undefined) {\r\n formParams.value[item.prop] = null\r\n }\r\n }\r\n })\r\n }\r\n\r\n const searchFn = () => {\r\n if (requireValue) {\r\n const hasValidParams = Object.entries(formParams.value)\r\n .filter(([key]) => key !== 'pageNum' && key !== 'pageSize')\r\n .some(([, value]) => !isEmpty(value))\r\n\r\n if (!hasValidParams) {\r\n message.warning('请输入搜索内容,或选择筛选条件')\r\n return\r\n }\r\n }\r\n history.saveCurrentInputs()\r\n emits('search', formParams.value)\r\n }\r\n\r\n const resetFn = () => {\r\n formRef.value?.restoreValidation()\r\n Object.keys(formParams.value).forEach(key => {\r\n if (key !== 'pageNum' && key !== 'pageSize') {\r\n formParams.value[key] = null\r\n }\r\n })\r\n emits('change-params', formParams.value)\r\n emits('reset')\r\n }\r\n\r\n const toggleFold = () => {\r\n expanded.value = !expanded.value\r\n fields.value.forEach((item, index) => {\r\n if (index >= foldThreshold) item.show = expanded.value\r\n })\r\n }\r\n\r\n const syncFromProps = (\r\n newItems: SearchFormItem[],\r\n newParams: SearchFormParams\r\n ) => {\r\n fields.value = [...newItems]\r\n formParams.value = { ...newParams }\r\n initialize()\r\n }\r\n\r\n onMounted(() => {\r\n initialize()\r\n history.restoreFromStorage()\r\n })\r\n\r\n return {\r\n formRef,\r\n fields,\r\n formParams,\r\n expanded,\r\n searching,\r\n visibleFields,\r\n hasExpandButton,\r\n history,\r\n searchFn,\r\n resetFn,\r\n toggleFold,\r\n syncFromProps,\r\n }\r\n}\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-10\r\n * @Description: 表单搜索组件(薄 UI 壳 — 逻辑由 composable 驱动)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NCard class=\"form-search-card custom-card\" :bordered=\"bordered\">\r\n <NForm class=\"form-search\" :model=\"formParams\" ref=\"formRef\" :size=\"size\">\r\n <div\r\n class=\"form-search-item-box\"\r\n v-for=\"(item, index) of visibleFields\"\r\n :key=\"index\"\r\n >\r\n <NFormItem\r\n class=\"form-item-input\"\r\n v-if=\"item.type !== 'spacer'\"\r\n :path=\"item.prop\"\r\n :show-feedback=\"false\"\r\n :show-label=\"false\"\r\n >\r\n <NInput\r\n v-if=\"item.type === 'input'\"\r\n clearable\r\n v-model:value=\"formParams[item.prop]\"\r\n :placeholder=\"item.placeholder\"\r\n @focus=\"history.handleFocus(item.prop)\"\r\n @blur=\"history.closeAllPanels\"\r\n />\r\n\r\n <div class=\"input-history\" v-if=\"item.isFocus\" @mousedown.prevent>\r\n <div\r\n class=\"history-item\"\r\n @click=\"history.selectHistoryItem(hisValue, item.prop)\"\r\n v-for=\"(hisValue, hisIndex) of item.hisList\"\r\n :key=\"hisValue\"\r\n >\r\n <span class=\"history-text\">{{ hisValue }}</span>\r\n <NIcon\r\n class=\"delete-icon\"\r\n size=\"14\"\r\n @click.stop=\"history.deleteHistoryItem(item.prop, hisIndex)\"\r\n >\r\n <div class=\"i-mdi:close\" />\r\n </NIcon>\r\n </div>\r\n <div\r\n class=\"history-footer\"\r\n v-if=\"item.hisList && item.hisList.length > 0\"\r\n >\r\n <span\r\n class=\"clear-all\"\r\n @click.stop=\"history.clearAllHistory(item.prop)\"\r\n >\r\n 清空历史记录\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <NSelect\r\n v-if=\"item.type === 'select'\"\r\n v-model:value=\"formParams[item.prop]\"\r\n :placeholder=\"item.placeholder || '请选择'\"\r\n clearable\r\n :options=\"normalizeOptions(item.list)\"\r\n />\r\n\r\n <NDatePicker\r\n v-if=\"item.type === 'date-range'\"\r\n type=\"datetimerange\"\r\n v-model:value=\"formParams[item.prop]\"\r\n format=\"yyyy-MM-dd HH:mm\"\r\n value-format=\"yyyy-MM-dd HH:mm\"\r\n start-placeholder=\"开始时间\"\r\n end-placeholder=\"结束时间\"\r\n clearable\r\n />\r\n </NFormItem>\r\n </div>\r\n\r\n <div class=\"form-search-item-box\">\r\n <div class=\"form-item-input\">\r\n <div class=\"button-label-placeholder\"></div>\r\n <NSpace>\r\n <NTooltip trigger=\"hover\">\r\n <template #trigger>\r\n <NButton type=\"primary\" @click=\"searchFn\" :loading=\"searching\">\r\n <template #icon>\r\n <div class=\"i-mdi:search w-4 h-4\" />\r\n </template>\r\n </NButton>\r\n </template>\r\n 搜索\r\n </NTooltip>\r\n\r\n <NTooltip trigger=\"hover\">\r\n <template #trigger>\r\n <NButton @click=\"resetFn\">\r\n <template #icon>\r\n <div class=\"i-mdi:refresh w-4 h-4\" />\r\n </template>\r\n </NButton>\r\n </template>\r\n 重置\r\n </NTooltip>\r\n\r\n <NTooltip v-if=\"hasExpandButton\" trigger=\"hover\">\r\n <template #trigger>\r\n <NButton @click=\"toggleFold\">\r\n <template #icon>\r\n <div\r\n :class=\"\r\n expanded\r\n ? 'i-mdi:chevron-up w-4 h-4'\r\n : 'i-mdi:chevron-down w-4 h-4'\r\n \"\r\n />\r\n </template>\r\n </NButton>\r\n </template>\r\n {{ expanded ? \"收起\" : \"展开\" }}\r\n </NTooltip>\r\n </NSpace>\r\n </div>\r\n </div>\r\n </NForm>\r\n </NCard>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { watch } from \"vue\";\r\nimport {\r\n NCard,\r\n NForm,\r\n NFormItem,\r\n NInput,\r\n NSelect,\r\n NDatePicker,\r\n NSpace,\r\n NButton,\r\n NTooltip,\r\n NIcon,\r\n} from \"naive-ui\";\r\nimport { useSearchState } from \"./composables/useSearchState\";\r\nimport type {\r\n SearchFormItem,\r\n SearchFormParams,\r\n SearchOptionItem,\r\n SearchConfig,\r\n} from \"./types\";\r\n\r\ndefineOptions({ name: \"C_FormSearch\" });\r\n\r\ninterface Props {\r\n bordered?: boolean;\r\n formItemList: SearchFormItem[];\r\n formParams: SearchFormParams;\r\n formSearchInputHistoryString?: string;\r\n size?: \"small\" | \"medium\" | \"large\";\r\n config?: SearchConfig;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n bordered: true,\r\n formItemList: () => [],\r\n size: \"medium\",\r\n});\r\n\r\nconst emits = defineEmits<{\r\n search: [params: SearchFormParams];\r\n reset: [];\r\n \"change-params\": [params: SearchFormParams];\r\n}>();\r\n\r\nconst {\r\n formRef,\r\n formParams,\r\n expanded,\r\n searching,\r\n visibleFields,\r\n hasExpandButton,\r\n history,\r\n searchFn,\r\n resetFn,\r\n toggleFold,\r\n syncFromProps,\r\n} = useSearchState(emits, {\r\n formItemList: props.formItemList,\r\n formParams: props.formParams,\r\n config: props.config,\r\n historyOptions: {\r\n storageKey: props.formSearchInputHistoryString,\r\n maxItems: props.config?.historyMaxItems,\r\n },\r\n});\r\n\r\nconst normalizeOptions = (list?: SearchOptionItem[]) =>\r\n list?.map((opt) => ({\r\n label: opt.label || opt.labelDefault || \"\",\r\n value: opt.value !== undefined ? opt.value : opt.label || opt.labelDefault,\r\n }));\r\n\r\nwatch(\r\n () => props.formItemList,\r\n (newItems) => syncFromProps(newItems, props.formParams),\r\n { deep: true },\r\n);\r\n\r\ndefineExpose({\r\n formRef,\r\n formParams,\r\n searchFn,\r\n cleanFn: resetFn,\r\n changeFoldState: toggleFold,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","/* unplugin-vue-components disabled */<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-10\r\n * @Description: 表单搜索组件(薄 UI 壳 — 逻辑由 composable 驱动)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NCard class=\"form-search-card custom-card\" :bordered=\"bordered\">\r\n <NForm class=\"form-search\" :model=\"formParams\" ref=\"formRef\" :size=\"size\">\r\n <div\r\n class=\"form-search-item-box\"\r\n v-for=\"(item, index) of visibleFields\"\r\n :key=\"index\"\r\n >\r\n <NFormItem\r\n class=\"form-item-input\"\r\n v-if=\"item.type !== 'spacer'\"\r\n :path=\"item.prop\"\r\n :show-feedback=\"false\"\r\n :show-label=\"false\"\r\n >\r\n <NInput\r\n v-if=\"item.type === 'input'\"\r\n clearable\r\n v-model:value=\"formParams[item.prop]\"\r\n :placeholder=\"item.placeholder\"\r\n @focus=\"history.handleFocus(item.prop)\"\r\n @blur=\"history.closeAllPanels\"\r\n />\r\n\r\n <div class=\"input-history\" v-if=\"item.isFocus\" @mousedown.prevent>\r\n <div\r\n class=\"history-item\"\r\n @click=\"history.selectHistoryItem(hisValue, item.prop)\"\r\n v-for=\"(hisValue, hisIndex) of item.hisList\"\r\n :key=\"hisValue\"\r\n >\r\n <span class=\"history-text\">{{ hisValue }}</span>\r\n <NIcon\r\n class=\"delete-icon\"\r\n size=\"14\"\r\n @click.stop=\"history.deleteHistoryItem(item.prop, hisIndex)\"\r\n >\r\n <div class=\"i-mdi:close\" />\r\n </NIcon>\r\n </div>\r\n <div\r\n class=\"history-footer\"\r\n v-if=\"item.hisList && item.hisList.length > 0\"\r\n >\r\n <span\r\n class=\"clear-all\"\r\n @click.stop=\"history.clearAllHistory(item.prop)\"\r\n >\r\n 清空历史记录\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <NSelect\r\n v-if=\"item.type === 'select'\"\r\n v-model:value=\"formParams[item.prop]\"\r\n :placeholder=\"item.placeholder || '请选择'\"\r\n clearable\r\n :options=\"normalizeOptions(item.list)\"\r\n />\r\n\r\n <NDatePicker\r\n v-if=\"item.type === 'date-range'\"\r\n type=\"datetimerange\"\r\n v-model:value=\"formParams[item.prop]\"\r\n format=\"yyyy-MM-dd HH:mm\"\r\n value-format=\"yyyy-MM-dd HH:mm\"\r\n start-placeholder=\"开始时间\"\r\n end-placeholder=\"结束时间\"\r\n clearable\r\n />\r\n </NFormItem>\r\n </div>\r\n\r\n <div class=\"form-search-item-box\">\r\n <div class=\"form-item-input\">\r\n <div class=\"button-label-placeholder\"></div>\r\n <NSpace>\r\n <NTooltip trigger=\"hover\">\r\n <template #trigger>\r\n <NButton type=\"primary\" @click=\"searchFn\" :loading=\"searching\">\r\n <template #icon>\r\n <div class=\"i-mdi:search w-4 h-4\" />\r\n </template>\r\n </NButton>\r\n </template>\r\n 搜索\r\n </NTooltip>\r\n\r\n <NTooltip trigger=\"hover\">\r\n <template #trigger>\r\n <NButton @click=\"resetFn\">\r\n <template #icon>\r\n <div class=\"i-mdi:refresh w-4 h-4\" />\r\n </template>\r\n </NButton>\r\n </template>\r\n 重置\r\n </NTooltip>\r\n\r\n <NTooltip v-if=\"hasExpandButton\" trigger=\"hover\">\r\n <template #trigger>\r\n <NButton @click=\"toggleFold\">\r\n <template #icon>\r\n <div\r\n :class=\"\r\n expanded\r\n ? 'i-mdi:chevron-up w-4 h-4'\r\n : 'i-mdi:chevron-down w-4 h-4'\r\n \"\r\n />\r\n </template>\r\n </NButton>\r\n </template>\r\n {{ expanded ? \"收起\" : \"展开\" }}\r\n </NTooltip>\r\n </NSpace>\r\n </div>\r\n </div>\r\n </NForm>\r\n </NCard>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { watch } from \"vue\";\r\nimport {\r\n NCard,\r\n NForm,\r\n NFormItem,\r\n NInput,\r\n NSelect,\r\n NDatePicker,\r\n NSpace,\r\n NButton,\r\n NTooltip,\r\n NIcon,\r\n} from \"naive-ui\";\r\nimport { useSearchState } from \"./composables/useSearchState\";\r\nimport type {\r\n SearchFormItem,\r\n SearchFormParams,\r\n SearchOptionItem,\r\n SearchConfig,\r\n} from \"./types\";\r\n\r\ndefineOptions({ name: \"C_FormSearch\" });\r\n\r\ninterface Props {\r\n bordered?: boolean;\r\n formItemList: SearchFormItem[];\r\n formParams: SearchFormParams;\r\n formSearchInputHistoryString?: string;\r\n size?: \"small\" | \"medium\" | \"large\";\r\n config?: SearchConfig;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n bordered: true,\r\n formItemList: () => [],\r\n size: \"medium\",\r\n});\r\n\r\nconst emits = defineEmits<{\r\n search: [params: SearchFormParams];\r\n reset: [];\r\n \"change-params\": [params: SearchFormParams];\r\n}>();\r\n\r\nconst {\r\n formRef,\r\n formParams,\r\n expanded,\r\n searching,\r\n visibleFields,\r\n hasExpandButton,\r\n history,\r\n searchFn,\r\n resetFn,\r\n toggleFold,\r\n syncFromProps,\r\n} = useSearchState(emits, {\r\n formItemList: props.formItemList,\r\n formParams: props.formParams,\r\n config: props.config,\r\n historyOptions: {\r\n storageKey: props.formSearchInputHistoryString,\r\n maxItems: props.config?.historyMaxItems,\r\n },\r\n});\r\n\r\nconst normalizeOptions = (list?: SearchOptionItem[]) =>\r\n list?.map((opt) => ({\r\n label: opt.label || opt.labelDefault || \"\",\r\n value: opt.value !== undefined ? opt.value : opt.label || opt.labelDefault,\r\n }));\r\n\r\nwatch(\r\n () => props.formItemList,\r\n (newItems) => syncFromProps(newItems, props.formParams),\r\n { deep: true },\r\n);\r\n\r\ndefineExpose({\r\n formRef,\r\n formParams,\r\n searchFn,\r\n cleanFn: resetFn,\r\n changeFoldState: toggleFold,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n","<!--\r\n * @Author: ChenYu ycyplus@gmail.com\r\n * @Date: 2025-06-10\r\n * @Description: 表单搜索组件(薄 UI 壳 — 逻辑由 composable 驱动)\r\n * @Migration: naive-ui-components 组件库迁移版本\r\n * Copyright (c) 2025 by CHENY, All Rights Reserved.\r\n-->\r\n<template>\r\n <NCard class=\"form-search-card custom-card\" :bordered=\"bordered\">\r\n <NForm class=\"form-search\" :model=\"formParams\" ref=\"formRef\" :size=\"size\">\r\n <div\r\n class=\"form-search-item-box\"\r\n v-for=\"(item, index) of visibleFields\"\r\n :key=\"index\"\r\n >\r\n <NFormItem\r\n class=\"form-item-input\"\r\n v-if=\"item.type !== 'spacer'\"\r\n :path=\"item.prop\"\r\n :show-feedback=\"false\"\r\n :show-label=\"false\"\r\n >\r\n <NInput\r\n v-if=\"item.type === 'input'\"\r\n clearable\r\n v-model:value=\"formParams[item.prop]\"\r\n :placeholder=\"item.placeholder\"\r\n @focus=\"history.handleFocus(item.prop)\"\r\n @blur=\"history.closeAllPanels\"\r\n />\r\n\r\n <div class=\"input-history\" v-if=\"item.isFocus\" @mousedown.prevent>\r\n <div\r\n class=\"history-item\"\r\n @click=\"history.selectHistoryItem(hisValue, item.prop)\"\r\n v-for=\"(hisValue, hisIndex) of item.hisList\"\r\n :key=\"hisValue\"\r\n >\r\n <span class=\"history-text\">{{ hisValue }}</span>\r\n <NIcon\r\n class=\"delete-icon\"\r\n size=\"14\"\r\n @click.stop=\"history.deleteHistoryItem(item.prop, hisIndex)\"\r\n >\r\n <div class=\"i-mdi:close\" />\r\n </NIcon>\r\n </div>\r\n <div\r\n class=\"history-footer\"\r\n v-if=\"item.hisList && item.hisList.length > 0\"\r\n >\r\n <span\r\n class=\"clear-all\"\r\n @click.stop=\"history.clearAllHistory(item.prop)\"\r\n >\r\n 清空历史记录\r\n </span>\r\n </div>\r\n </div>\r\n\r\n <NSelect\r\n v-if=\"item.type === 'select'\"\r\n v-model:value=\"formParams[item.prop]\"\r\n :placeholder=\"item.placeholder || '请选择'\"\r\n clearable\r\n :options=\"normalizeOptions(item.list)\"\r\n />\r\n\r\n <NDatePicker\r\n v-if=\"item.type === 'date-range'\"\r\n type=\"datetimerange\"\r\n v-model:value=\"formParams[item.prop]\"\r\n format=\"yyyy-MM-dd HH:mm\"\r\n value-format=\"yyyy-MM-dd HH:mm\"\r\n start-placeholder=\"开始时间\"\r\n end-placeholder=\"结束时间\"\r\n clearable\r\n />\r\n </NFormItem>\r\n </div>\r\n\r\n <div class=\"form-search-item-box\">\r\n <div class=\"form-item-input\">\r\n <div class=\"button-label-placeholder\"></div>\r\n <NSpace>\r\n <NTooltip trigger=\"hover\">\r\n <template #trigger>\r\n <NButton type=\"primary\" @click=\"searchFn\" :loading=\"searching\">\r\n <template #icon>\r\n <div class=\"i-mdi:search w-4 h-4\" />\r\n </template>\r\n </NButton>\r\n </template>\r\n 搜索\r\n </NTooltip>\r\n\r\n <NTooltip trigger=\"hover\">\r\n <template #trigger>\r\n <NButton @click=\"resetFn\">\r\n <template #icon>\r\n <div class=\"i-mdi:refresh w-4 h-4\" />\r\n </template>\r\n </NButton>\r\n </template>\r\n 重置\r\n </NTooltip>\r\n\r\n <NTooltip v-if=\"hasExpandButton\" trigger=\"hover\">\r\n <template #trigger>\r\n <NButton @click=\"toggleFold\">\r\n <template #icon>\r\n <div\r\n :class=\"\r\n expanded\r\n ? 'i-mdi:chevron-up w-4 h-4'\r\n : 'i-mdi:chevron-down w-4 h-4'\r\n \"\r\n />\r\n </template>\r\n </NButton>\r\n </template>\r\n {{ expanded ? \"收起\" : \"展开\" }}\r\n </NTooltip>\r\n </NSpace>\r\n </div>\r\n </div>\r\n </NForm>\r\n </NCard>\r\n</template>\r\n\r\n<script setup lang=\"ts\">\r\nimport { watch } from \"vue\";\r\nimport {\r\n NCard,\r\n NForm,\r\n NFormItem,\r\n NInput,\r\n NSelect,\r\n NDatePicker,\r\n NSpace,\r\n NButton,\r\n NTooltip,\r\n NIcon,\r\n} from \"naive-ui\";\r\nimport { useSearchState } from \"./composables/useSearchState\";\r\nimport type {\r\n SearchFormItem,\r\n SearchFormParams,\r\n SearchOptionItem,\r\n SearchConfig,\r\n} from \"./types\";\r\n\r\ndefineOptions({ name: \"C_FormSearch\" });\r\n\r\ninterface Props {\r\n bordered?: boolean;\r\n formItemList: SearchFormItem[];\r\n formParams: SearchFormParams;\r\n formSearchInputHistoryString?: string;\r\n size?: \"small\" | \"medium\" | \"large\";\r\n config?: SearchConfig;\r\n}\r\n\r\nconst props = withDefaults(defineProps<Props>(), {\r\n bordered: true,\r\n formItemList: () => [],\r\n size: \"medium\",\r\n});\r\n\r\nconst emits = defineEmits<{\r\n search: [params: SearchFormParams];\r\n reset: [];\r\n \"change-params\": [params: SearchFormParams];\r\n}>();\r\n\r\nconst {\r\n formRef,\r\n formParams,\r\n expanded,\r\n searching,\r\n visibleFields,\r\n hasExpandButton,\r\n history,\r\n searchFn,\r\n resetFn,\r\n toggleFold,\r\n syncFromProps,\r\n} = useSearchState(emits, {\r\n formItemList: props.formItemList,\r\n formParams: props.formParams,\r\n config: props.config,\r\n historyOptions: {\r\n storageKey: props.formSearchInputHistoryString,\r\n maxItems: props.config?.historyMaxItems,\r\n },\r\n});\r\n\r\nconst normalizeOptions = (list?: SearchOptionItem[]) =>\r\n list?.map((opt) => ({\r\n label: opt.label || opt.labelDefault || \"\",\r\n value: opt.value !== undefined ? opt.value : opt.label || opt.labelDefault,\r\n }));\r\n\r\nwatch(\r\n () => props.formItemList,\r\n (newItems) => syncFromProps(newItems, props.formParams),\r\n { deep: true },\r\n);\r\n\r\ndefineExpose({\r\n formRef,\r\n formParams,\r\n searchFn,\r\n cleanFn: resetFn,\r\n changeFoldState: toggleFold,\r\n});\r\n</script>\r\n\r\n<style lang=\"scss\" scoped>\r\n@use \"./index.scss\";\r\n</style>\r\n"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"C_FormulaEditor-Cm0CokN5.css","names":[],"sources":["../src/components/C_FormulaEditor/components/FormulaInput.vue?vue&type=style&index=0&scoped=9e16f9bd&lang.scss","../src/components/C_FormulaEditor/components/VariablePanel.vue?vue&type=style&index=0&scoped=403349d9&lang.scss","../src/components/C_FormulaEditor/components/VirtualKeyboard.vue?vue&type=style&index=0&scoped=c1d53e69&lang.scss","../src/components/C_FormulaEditor/components/FormulaPreview.vue?vue&type=style&index=0&scoped=e25f0d86&lang.scss","../src/components/C_FormulaEditor/index.vue?vue&type=style&index=0&scoped=34e68236&lang.scss"],"sourcesContent":["/* unplugin-vue-components disabled *//* FormulaInput 组件样式 */\n.formula-input[data-v-9e16f9bd] {\n background: var(--c-bg-card);\n transition: background var(--c-transition, 0.2s ease);\n border-bottom: 1px solid var(--c-border);\n /* ─── 校验信息区 ────────────── */\n}\n.formula-input--error[data-v-9e16f9bd] {\n background: color-mix(in srgb, var(--error-color) 3%, var(--c-bg-card));\n}\n.formula-input--disabled[data-v-9e16f9bd] {\n opacity: 0.6;\n pointer-events: none;\n}\n.formula-input__header[data-v-9e16f9bd] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 10px 16px 0;\n}\n.formula-input__label[data-v-9e16f9bd] {\n font-size: 13px;\n font-weight: 600;\n color: var(--c-text-2);\n}\n.formula-input__clear[data-v-9e16f9bd] {\n font-size: 12px;\n color: var(--c-primary);\n cursor: pointer;\n user-select: none;\n}\n.formula-input__clear[data-v-9e16f9bd]:hover {\n opacity: 0.8;\n}\n.formula-input__editor[data-v-9e16f9bd] {\n min-height: 72px;\n max-height: 180px;\n padding: 8px 16px 12px;\n font-size: 14px;\n line-height: 2;\n color: var(--c-text-1);\n outline: none;\n overflow-y: auto;\n word-break: break-all;\n white-space: pre-wrap;\n /* 变量 chip */\n /* 函数名 */\n /* 运算符 */\n /* 数字 */\n /* 括号 */\n}\n.formula-input__editor[data-v-9e16f9bd]:empty::before {\n content: attr(data-placeholder);\n color: var(--c-text-4);\n pointer-events: none;\n}\n.formula-input__editor[data-v-9e16f9bd] .formula-chip {\n display: inline-flex;\n align-items: center;\n padding: 1px 8px;\n margin: 0 2px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--c-primary) 12%, transparent);\n color: var(--c-primary);\n font-weight: 500;\n font-size: 13px;\n line-height: 22px;\n vertical-align: baseline;\n user-select: none;\n cursor: default;\n}\n.formula-input__editor[data-v-9e16f9bd] .formula-func {\n color: color-mix(in srgb, var(--c-primary) 80%, #8b5cf6);\n font-weight: 600;\n}\n.formula-input__editor[data-v-9e16f9bd] .formula-op {\n color: var(--warning-color, #f0a020);\n font-weight: 600;\n}\n.formula-input__editor[data-v-9e16f9bd] .formula-num {\n color: color-mix(in srgb, var(--success-color, #18a058) 90%, transparent);\n}\n.formula-input__editor[data-v-9e16f9bd] .formula-paren {\n color: var(--c-text-2);\n font-weight: 600;\n}\n.formula-input__error[data-v-9e16f9bd] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 4px 16px 8px;\n font-size: 12px;\n color: var(--error-color);\n}\n.formula-input__validation[data-v-9e16f9bd] {\n padding: 10px 16px 12px;\n border-top: 1px solid var(--c-border);\n min-height: 40px;\n display: flex;\n align-items: center;\n gap: 12px;\n}\n.formula-input__validation-label[data-v-9e16f9bd] {\n font-size: 13px;\n font-weight: 600;\n color: var(--c-text-2);\n flex-shrink: 0;\n min-width: 28px;\n}\n.formula-input__validation-hint[data-v-9e16f9bd] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--c-text-4);\n}\n.formula-input__validation-success[data-v-9e16f9bd] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--success-color, #18a058);\n}\n.formula-input__validation-error[data-v-9e16f9bd] {\n display: inline-flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--error-color);\n}","/* unplugin-vue-components disabled *//* VariablePanel 组件样式 */\n.variable-panel[data-v-403349d9] {\n display: flex;\n flex-direction: column;\n background: var(--c-bg-card);\n overflow: hidden;\n height: 100%;\n}\n.variable-panel__tabs[data-v-403349d9] {\n display: flex;\n border-bottom: 1px solid var(--c-border);\n}\n.variable-panel__tab[data-v-403349d9] {\n flex: 1;\n padding: 8px 0;\n text-align: center;\n font-size: 13px;\n font-weight: 500;\n color: var(--c-text-2);\n cursor: pointer;\n transition: all var(--c-transition, 0.2s ease);\n user-select: none;\n}\n.variable-panel__tab[data-v-403349d9]:hover {\n color: var(--c-primary);\n}\n.variable-panel__tab--active[data-v-403349d9] {\n color: var(--c-primary);\n border-bottom: 2px solid var(--c-primary);\n}\n.variable-panel__search[data-v-403349d9] {\n padding: 8px 10px;\n border-bottom: 1px solid var(--c-border);\n}\n.variable-panel__list[data-v-403349d9] {\n flex: 1;\n max-height: 360px;\n padding: 4px 0;\n}\n.variable-panel__group-title[data-v-403349d9] {\n display: flex;\n align-items: center;\n gap: 4px;\n padding: 6px 10px;\n font-size: 12px;\n font-weight: 600;\n color: var(--c-text-2);\n cursor: pointer;\n user-select: none;\n}\n.variable-panel__group-title[data-v-403349d9]:hover {\n color: var(--c-text-1);\n}\n.variable-panel__items[data-v-403349d9] {\n padding: 0 4px;\n}\n.variable-panel__item[data-v-403349d9] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 6px 10px 6px 26px;\n font-size: 13px;\n color: var(--c-text-1);\n cursor: pointer;\n border-radius: 4px;\n transition: background 0.15s;\n}\n.variable-panel__item[data-v-403349d9]:hover {\n background: var(--hover-color);\n}\n.variable-panel__item-icon[data-v-403349d9] {\n font-size: 15px;\n color: var(--c-primary);\n flex-shrink: 0;\n}\n.variable-panel__func[data-v-403349d9] {\n padding: 8px 12px;\n cursor: pointer;\n border-radius: 4px;\n margin: 2px 4px;\n transition: background 0.15s;\n}\n.variable-panel__func[data-v-403349d9]:hover {\n background: var(--hover-color);\n}\n.variable-panel__func-name[data-v-403349d9] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-size: 13px;\n font-weight: 500;\n color: var(--c-text-1);\n}\n.variable-panel__func-badge[data-v-403349d9] {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n border-radius: 4px;\n background: color-mix(in srgb, var(--c-primary) 12%, transparent);\n color: var(--c-primary);\n font-size: 12px;\n font-weight: 700;\n font-style: italic;\n}\n.variable-panel__func-desc[data-v-403349d9] {\n padding-left: 24px;\n font-size: 12px;\n color: var(--c-text-4);\n margin-top: 2px;\n}\n.variable-panel__func-sig[data-v-403349d9] {\n padding-left: 24px;\n font-size: 11px;\n font-family: \"Courier New\", Courier, monospace;\n color: var(--c-text-4);\n margin-top: 2px;\n opacity: 0.7;\n}","/* unplugin-vue-components disabled *//* VirtualKeyboard 组件样式 */\n.vk[data-v-c1d53e69] {\n /* ═══════ 标题行 ═══════ */\n /* ═══════ 键盘主体 ═══════ */\n /* 浅米黄暖色底板,对应参考截图 */\n /* ═══════ 动作行 ═══════ */\n /* ═══════ 经典键帽按键 ═══════ */\n /* 3D 效果核心:border-bottom 加粗 = 键帽厚度,按下时 translateY + 底边归细 */\n}\n.vk__title[data-v-c1d53e69] {\n font-size: 13px;\n font-weight: 500;\n color: var(--c-text-4);\n padding: 0 0 8px;\n letter-spacing: 0.5px;\n}\n.vk__body[data-v-c1d53e69] {\n display: flex;\n gap: 68px;\n padding: 12px;\n border-radius: 8px;\n border: 1px solid rgba(240, 160, 32, 0.2);\n background: rgba(240, 160, 32, 0.06);\n}\n.vk__half[data-v-c1d53e69] {\n display: grid;\n grid-template-columns: repeat(5, 1fr);\n gap: 5px;\n flex: 1;\n /* 数字区:白色底板层区分 */\n}\n.vk__half--nums[data-v-c1d53e69] {\n padding: 6px;\n border-radius: 6px;\n background: var(--c-bg-card);\n border: 1px solid rgba(0, 0, 0, 0.07);\n}\n.vk__actions[data-v-c1d53e69] {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n padding: 8px 12px 0;\n}\n.vk__key[data-v-c1d53e69] {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 34px;\n min-width: 0;\n padding: 0;\n border-radius: 5px;\n cursor: pointer;\n user-select: none;\n font-size: 14px;\n font-weight: 500;\n color: var(--c-text-1);\n background: var(--c-bg-card);\n /* 立体效果关键:底边用确定 rgba 保证可见 */\n border: 1px solid rgba(0, 0, 0, 0.12);\n border-bottom: 3px solid rgba(0, 0, 0, 0.18);\n transition: transform 0.06s ease, border-bottom-width 0.06s ease, background 0.1s ease;\n /* 按下:键帽下沉 + 底边归细 */\n /* ─── warning(? : and or)—橙色背景块 ─── */\n /* ─── primary(+ − × ÷)—蓝色文字 + 蓝色底边 ─── */\n /* ─── 动作键(⌫ 清空)─── */\n}\n.vk__key[data-v-c1d53e69]:hover:not(:disabled) {\n background: color-mix(in srgb, var(--c-primary) 6%, var(--c-bg-card));\n border-color: color-mix(in srgb, var(--c-primary) 50%, transparent);\n border-bottom-color: color-mix(in srgb, var(--c-primary) 60%, transparent);\n color: var(--c-primary);\n}\n.vk__key[data-v-c1d53e69]:active:not(:disabled) {\n transform: translateY(2px);\n border-bottom-width: 1px;\n}\n.vk__key[data-v-c1d53e69]:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n.vk__key--warning[data-v-c1d53e69] {\n background: rgba(240, 160, 32, 0.12);\n border-color: rgba(240, 160, 32, 0.35);\n border-bottom-color: rgba(240, 160, 32, 0.55);\n color: #d48806;\n font-weight: 700;\n font-size: 15px;\n}\n.vk__key--warning[data-v-c1d53e69]:hover:not(:disabled) {\n background: rgba(240, 160, 32, 0.2);\n border-color: rgba(240, 160, 32, 0.55);\n border-bottom-color: rgba(240, 160, 32, 0.75);\n color: #b8760a;\n}\n.vk__key--primary[data-v-c1d53e69] {\n color: var(--c-primary);\n font-weight: 700;\n font-size: 16px;\n border-color: rgba(32, 128, 240, 0.25);\n border-bottom-color: rgba(32, 128, 240, 0.55);\n}\n.vk__key--primary[data-v-c1d53e69]:hover:not(:disabled) {\n background: rgba(32, 128, 240, 0.06);\n color: var(--c-primary);\n border-color: rgba(32, 128, 240, 0.45);\n border-bottom-color: rgba(32, 128, 240, 0.75);\n}\n.vk__key--action[data-v-c1d53e69] {\n width: 64px;\n height: 34px;\n font-size: 13px;\n color: var(--c-text-2);\n background: color-mix(in srgb, var(--c-text-4) 8%, var(--c-bg-card));\n border-color: rgba(0, 0, 0, 0.1);\n border-bottom-color: rgba(0, 0, 0, 0.15);\n}\n.vk__key--action[data-v-c1d53e69]:hover:not(:disabled) {\n color: var(--error-color);\n border-color: color-mix(in srgb, var(--error-color) 40%, transparent);\n border-bottom-color: color-mix(in srgb, var(--error-color) 55%, transparent);\n}","/* unplugin-vue-components disabled *//* FormulaPreview 组件样式 */\n.formula-preview[data-v-e25f0d86] {\n padding: 12px 16px 14px;\n border-top: 1px solid var(--c-border);\n background: color-mix(in srgb, var(--c-text-2) 2%, var(--c-bg-card));\n}\n.formula-preview__header[data-v-e25f0d86] {\n display: flex;\n align-items: center;\n gap: 6px;\n font-weight: 600;\n font-size: 13px;\n margin-bottom: 8px;\n color: var(--c-text-2);\n}\n.formula-preview__empty[data-v-e25f0d86] {\n font-size: 12px;\n color: var(--c-text-4);\n padding: 8px 0;\n}\n.formula-preview__vars-title[data-v-e25f0d86] {\n font-size: 11px;\n color: var(--c-text-4);\n margin-bottom: 4px;\n}\n.formula-preview__var-row[data-v-e25f0d86] {\n display: flex;\n align-items: center;\n gap: 6px;\n padding: 2px 0;\n font-size: 12px;\n}\n.formula-preview__var-name[data-v-e25f0d86] {\n color: var(--c-primary);\n font-weight: 500;\n}\n.formula-preview__var-eq[data-v-e25f0d86] {\n color: var(--c-text-4);\n}\n.formula-preview__var-value[data-v-e25f0d86] {\n font-family: \"Courier New\", Courier, monospace;\n color: var(--c-text-1);\n font-weight: 500;\n}\n.formula-preview__result[data-v-e25f0d86] {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n.formula-preview__result-label[data-v-e25f0d86] {\n font-size: 13px;\n font-weight: 600;\n color: var(--c-text-2);\n}\n.formula-preview__result-value[data-v-e25f0d86] {\n font-size: 18px;\n font-weight: 700;\n font-family: \"Courier New\", Courier, monospace;\n color: var(--c-primary);\n}\n.formula-preview__result-error[data-v-e25f0d86] {\n display: flex;\n align-items: center;\n gap: 4px;\n font-size: 12px;\n color: var(--error-color);\n}\n.formula-preview__result-empty[data-v-e25f0d86] {\n font-size: 14px;\n color: var(--c-text-4);\n}","/* unplugin-vue-components disabled *//* C_FormulaEditor 主组件样式 */\n.c-formula[data-v-34e68236] {\n display: flex;\n flex-direction: column;\n border-radius: 12px;\n border: 1px solid var(--c-border);\n background: var(--c-bg-card);\n overflow: hidden;\n /* ═══════ 标题行 ═══════ */\n /* ═══════ 主内容 ═══════ */\n}\n.c-formula__title-row[data-v-34e68236] {\n display: flex;\n align-items: center;\n justify-content: space-between;\n padding: 14px 18px;\n border-bottom: 1px solid var(--c-border);\n}\n.c-formula__title[data-v-34e68236] {\n display: flex;\n align-items: center;\n gap: 8px;\n font-weight: 600;\n font-size: 15px;\n color: var(--c-text-1);\n}\n.c-formula__body[data-v-34e68236] {\n display: flex;\n flex: 1;\n min-height: 0;\n}\n.c-formula__sidebar[data-v-34e68236] {\n width: 210px;\n flex-shrink: 0;\n border-right: 1px solid var(--c-border);\n}\n.c-formula__main[data-v-34e68236] {\n flex: 1;\n display: flex;\n flex-direction: column;\n min-width: 0;\n}\n.c-formula__keyboard[data-v-34e68236] {\n padding: 14px 18px;\n border-top: 1px solid var(--c-border);\n}\n\n/* ═══════ 响应式 ═══════ */\n@media (max-width: 768px) {\n.c-formula__body[data-v-34e68236] {\n flex-direction: column;\n}\n.c-formula__sidebar[data-v-34e68236] {\n width: 100%;\n border-right: none;\n border-bottom: 1px solid var(--c-border);\n}\n}"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACjIA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACvHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACxHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA"}
|
package/dist/C_FormulaEditor2.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { t as C_Icon_default } from "./C_Icon2.js";
|
|
2
2
|
import { t as export_helper_default } from "./export-helper.js";
|
|
3
|
-
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, onMounted, openBlock, ref, renderList, toDisplayString, unref, vShow, watch, withCtx, withDirectives } from "vue";
|
|
4
3
|
import { NDivider, NEmpty, NInput, NScrollbar, NTag } from "naive-ui";
|
|
4
|
+
import { Fragment, computed, createBlock, createCommentVNode, createElementBlock, createElementVNode, createTextVNode, createVNode, defineComponent, nextTick, normalizeClass, normalizeStyle, onMounted, openBlock, ref, renderList, toDisplayString, unref, vShow, watch, withCtx, withDirectives } from "vue";
|
|
5
5
|
import { Parser } from "expr-eval";
|
|
6
6
|
|
|
7
7
|
//#region src/components/C_FormulaEditor/constants.ts
|
|
@@ -920,7 +920,7 @@ var FormulaInput_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ d
|
|
|
920
920
|
|
|
921
921
|
//#endregion
|
|
922
922
|
//#region src/components/C_FormulaEditor/components/FormulaInput.vue
|
|
923
|
-
var FormulaInput_default = /* @__PURE__ */ export_helper_default(FormulaInput_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
923
|
+
var FormulaInput_default = /* @__PURE__ */ export_helper_default(FormulaInput_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-9e16f9bd"]]);
|
|
924
924
|
|
|
925
925
|
//#endregion
|
|
926
926
|
//#region src/components/C_FormulaEditor/components/VariablePanel.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -1065,7 +1065,7 @@ var VariablePanel_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
|
|
|
1065
1065
|
|
|
1066
1066
|
//#endregion
|
|
1067
1067
|
//#region src/components/C_FormulaEditor/components/VariablePanel.vue
|
|
1068
|
-
var VariablePanel_default = /* @__PURE__ */ export_helper_default(VariablePanel_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
1068
|
+
var VariablePanel_default = /* @__PURE__ */ export_helper_default(VariablePanel_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-403349d9"]]);
|
|
1069
1069
|
|
|
1070
1070
|
//#endregion
|
|
1071
1071
|
//#region src/components/C_FormulaEditor/components/VirtualKeyboard.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -1129,7 +1129,7 @@ var VirtualKeyboard_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ *
|
|
|
1129
1129
|
|
|
1130
1130
|
//#endregion
|
|
1131
1131
|
//#region src/components/C_FormulaEditor/components/VirtualKeyboard.vue
|
|
1132
|
-
var VirtualKeyboard_default = /* @__PURE__ */ export_helper_default(VirtualKeyboard_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
1132
|
+
var VirtualKeyboard_default = /* @__PURE__ */ export_helper_default(VirtualKeyboard_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-c1d53e69"]]);
|
|
1133
1133
|
|
|
1134
1134
|
//#endregion
|
|
1135
1135
|
//#region src/components/C_FormulaEditor/components/FormulaPreview.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -1210,7 +1210,7 @@ var FormulaPreview_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */
|
|
|
1210
1210
|
|
|
1211
1211
|
//#endregion
|
|
1212
1212
|
//#region src/components/C_FormulaEditor/components/FormulaPreview.vue
|
|
1213
|
-
var FormulaPreview_default = /* @__PURE__ */ export_helper_default(FormulaPreview_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
1213
|
+
var FormulaPreview_default = /* @__PURE__ */ export_helper_default(FormulaPreview_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-e25f0d86"]]);
|
|
1214
1214
|
|
|
1215
1215
|
//#endregion
|
|
1216
1216
|
//#region src/components/C_FormulaEditor/index.vue?vue&type=script&setup=true&lang.ts
|
|
@@ -1426,7 +1426,7 @@ var index_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ defineCo
|
|
|
1426
1426
|
|
|
1427
1427
|
//#endregion
|
|
1428
1428
|
//#region src/components/C_FormulaEditor/index.vue
|
|
1429
|
-
var C_FormulaEditor_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-
|
|
1429
|
+
var C_FormulaEditor_default = /* @__PURE__ */ export_helper_default(index_vue_vue_type_script_setup_true_lang_default, [["__scopeId", "data-v-34e68236"]]);
|
|
1430
1430
|
|
|
1431
1431
|
//#endregion
|
|
1432
1432
|
export { DEFAULT_FUNCTIONS as a, OPERATOR_KEYS as c, ACTION_KEYS as i, SPACED_OPERATORS as l, useFormulaEvaluator as n, NUMBER_KEYS as o, useFormulaParser as r, OPERATORS as s, C_FormulaEditor_default as t };
|