@falcon-ui/falcon-ui 1.0.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 +182 -0
- package/cjs/JsBarcode-BlUjuVmB.cjs +3519 -0
- package/cjs/JsBarcode-BlUjuVmB.cjs.map +1 -0
- package/cjs/chunk-D4y6LrGi.cjs +40 -0
- package/cjs/components/JsBarcode-BOXEZn4Q.cjs +3519 -0
- package/cjs/components/JsBarcode-BOXEZn4Q.cjs.map +1 -0
- package/cjs/components/barcode/JsBarcode-BOXEZn4Q.cjs +3519 -0
- package/cjs/components/barcode/JsBarcode-BOXEZn4Q.cjs.map +1 -0
- package/cjs/components/barcode/chunk-D4y6LrGi.cjs +40 -0
- package/cjs/components/barcode/index.cjs +211 -0
- package/cjs/components/barcode/index.cjs.map +1 -0
- package/cjs/components/barcode/src/JsBarcode-BOXEZn4Q.cjs +3519 -0
- package/cjs/components/barcode/src/JsBarcode-BOXEZn4Q.cjs.map +1 -0
- package/cjs/components/barcode/src/barcode.cjs +102 -0
- package/cjs/components/barcode/src/barcode.cjs.map +1 -0
- package/cjs/components/barcode/src/barcode.vue.cjs +200 -0
- package/cjs/components/barcode/src/barcode.vue.cjs.map +1 -0
- package/cjs/components/barcode/src/chunk-D4y6LrGi.cjs +40 -0
- package/cjs/components/button/index.cjs +135 -0
- package/cjs/components/button/index.cjs.map +1 -0
- package/cjs/components/button/src/button.cjs +16 -0
- package/cjs/components/button/src/button.cjs.map +1 -0
- package/cjs/components/button/src/button.vue.cjs +124 -0
- package/cjs/components/button/src/button.vue.cjs.map +1 -0
- package/cjs/components/chunk-D4y6LrGi.cjs +40 -0
- package/cjs/components/date-picker/index.cjs +164 -0
- package/cjs/components/date-picker/index.cjs.map +1 -0
- package/cjs/components/date-picker/src/date-picker.cjs +25 -0
- package/cjs/components/date-picker/src/date-picker.cjs.map +1 -0
- package/cjs/components/date-picker/src/date-picker.vue.cjs +153 -0
- package/cjs/components/date-picker/src/date-picker.vue.cjs.map +1 -0
- package/cjs/components/dialog/index.cjs +346 -0
- package/cjs/components/dialog/index.cjs.map +1 -0
- package/cjs/components/dialog/src/dialog.cjs +40 -0
- package/cjs/components/dialog/src/dialog.cjs.map +1 -0
- package/cjs/components/dialog/src/dialog.vue.cjs +343 -0
- package/cjs/components/dialog/src/dialog.vue.cjs.map +1 -0
- package/cjs/components/index.cjs +9450 -0
- package/cjs/components/index.cjs.map +1 -0
- package/cjs/components/input/index.cjs +175 -0
- package/cjs/components/input/index.cjs.map +1 -0
- package/cjs/components/input/src/input.cjs +27 -0
- package/cjs/components/input/src/input.cjs.map +1 -0
- package/cjs/components/input/src/input.vue.cjs +164 -0
- package/cjs/components/input/src/input.vue.cjs.map +1 -0
- package/cjs/components/input-number/index.cjs +374 -0
- package/cjs/components/input-number/index.cjs.map +1 -0
- package/cjs/components/input-number/src/input-number.cjs +48 -0
- package/cjs/components/input-number/src/input-number.cjs.map +1 -0
- package/cjs/components/input-number/src/input-number.vue.cjs +363 -0
- package/cjs/components/input-number/src/input-number.vue.cjs.map +1 -0
- package/cjs/components/input-search/index.cjs +286 -0
- package/cjs/components/input-search/index.cjs.map +1 -0
- package/cjs/components/input-search/src/input-search.cjs +55 -0
- package/cjs/components/input-search/src/input-search.cjs.map +1 -0
- package/cjs/components/input-search/src/input-search.vue.cjs +275 -0
- package/cjs/components/input-search/src/input-search.vue.cjs.map +1 -0
- package/cjs/components/qr-code/index.cjs +1975 -0
- package/cjs/components/qr-code/index.cjs.map +1 -0
- package/cjs/components/qr-code/src/qr-code.cjs +63 -0
- package/cjs/components/qr-code/src/qr-code.cjs.map +1 -0
- package/cjs/components/qr-code/src/qr-code.vue.cjs +1964 -0
- package/cjs/components/qr-code/src/qr-code.vue.cjs.map +1 -0
- package/cjs/components/radial-menu/index.cjs +983 -0
- package/cjs/components/radial-menu/index.cjs.map +1 -0
- package/cjs/components/radial-menu/src/radial-menu.cjs +96 -0
- package/cjs/components/radial-menu/src/radial-menu.cjs.map +1 -0
- package/cjs/components/radial-menu/src/radial-menu.vue.cjs +921 -0
- package/cjs/components/radial-menu/src/radial-menu.vue.cjs.map +1 -0
- package/cjs/components/select/index.cjs +163 -0
- package/cjs/components/select/index.cjs.map +1 -0
- package/cjs/components/select/src/select.cjs +16 -0
- package/cjs/components/select/src/select.cjs.map +1 -0
- package/cjs/components/select/src/select.vue.cjs +152 -0
- package/cjs/components/select/src/select.vue.cjs.map +1 -0
- package/cjs/components/table/index.cjs +3351 -0
- package/cjs/components/table/index.cjs.map +1 -0
- package/cjs/components/table/src/table.cjs +62 -0
- package/cjs/components/table/src/table.cjs.map +1 -0
- package/cjs/components/table/src/table.vue.cjs +3085 -0
- package/cjs/components/table/src/table.vue.cjs.map +1 -0
- package/cjs/dialog-CJU00aEV.cjs +614 -0
- package/cjs/dialog-CJU00aEV.cjs.map +1 -0
- package/cjs/dialog-DcH26KbE.cjs +2 -0
- package/cjs/hooks/dialog-DpYPBcKV.cjs +266 -0
- package/cjs/hooks/dialog-DpYPBcKV.cjs.map +1 -0
- package/cjs/hooks/hooks-D2Jaq5kO.cjs +328 -0
- package/cjs/hooks/hooks-D2Jaq5kO.cjs.map +1 -0
- package/cjs/hooks/index.cjs +8 -0
- package/cjs/icons/index.cjs +86 -0
- package/cjs/icons/index.cjs.map +1 -0
- package/cjs/index.cjs +9141 -0
- package/cjs/index.cjs.map +1 -0
- package/cjs/utils/index.cjs +69 -0
- package/cjs/utils/index.cjs.map +1 -0
- package/esm/JsBarcode-kVJER62m.js +3514 -0
- package/esm/JsBarcode-kVJER62m.js.map +1 -0
- package/esm/chunk-BuRq7rDw.js +23 -0
- package/esm/components/JsBarcode-CzzxrEd_.js +3514 -0
- package/esm/components/JsBarcode-CzzxrEd_.js.map +1 -0
- package/esm/components/barcode/JsBarcode-C5ux6wsb.js +3514 -0
- package/esm/components/barcode/JsBarcode-C5ux6wsb.js.map +1 -0
- package/esm/components/barcode/chunk--em_ddB3.js +23 -0
- package/esm/components/barcode/index.mjs +204 -0
- package/esm/components/barcode/index.mjs.map +1 -0
- package/esm/components/barcode/src/JsBarcode-C5ux6wsb.js +3514 -0
- package/esm/components/barcode/src/JsBarcode-C5ux6wsb.js.map +1 -0
- package/esm/components/barcode/src/barcode.mjs +98 -0
- package/esm/components/barcode/src/barcode.mjs.map +1 -0
- package/esm/components/barcode/src/barcode.vue.mjs +194 -0
- package/esm/components/barcode/src/barcode.vue.mjs.map +1 -0
- package/esm/components/barcode/src/chunk--em_ddB3.js +23 -0
- package/esm/components/button/index.mjs +126 -0
- package/esm/components/button/index.mjs.map +1 -0
- package/esm/components/button/src/button.mjs +14 -0
- package/esm/components/button/src/button.mjs.map +1 -0
- package/esm/components/button/src/button.vue.mjs +117 -0
- package/esm/components/button/src/button.vue.mjs.map +1 -0
- package/esm/components/chunk-BuRq7rDw.js +23 -0
- package/esm/components/date-picker/index.mjs +155 -0
- package/esm/components/date-picker/index.mjs.map +1 -0
- package/esm/components/date-picker/src/date-picker.mjs +23 -0
- package/esm/components/date-picker/src/date-picker.mjs.map +1 -0
- package/esm/components/date-picker/src/date-picker.vue.mjs +146 -0
- package/esm/components/date-picker/src/date-picker.vue.mjs.map +1 -0
- package/esm/components/dialog/index.mjs +335 -0
- package/esm/components/dialog/index.mjs.map +1 -0
- package/esm/components/dialog/src/dialog.mjs +38 -0
- package/esm/components/dialog/src/dialog.mjs.map +1 -0
- package/esm/components/dialog/src/dialog.vue.mjs +334 -0
- package/esm/components/dialog/src/dialog.vue.mjs.map +1 -0
- package/esm/components/index.mjs +9386 -0
- package/esm/components/index.mjs.map +1 -0
- package/esm/components/input/index.mjs +166 -0
- package/esm/components/input/index.mjs.map +1 -0
- package/esm/components/input/src/input.mjs +25 -0
- package/esm/components/input/src/input.mjs.map +1 -0
- package/esm/components/input/src/input.vue.mjs +157 -0
- package/esm/components/input/src/input.vue.mjs.map +1 -0
- package/esm/components/input-number/index.mjs +365 -0
- package/esm/components/input-number/index.mjs.map +1 -0
- package/esm/components/input-number/src/input-number.mjs +45 -0
- package/esm/components/input-number/src/input-number.mjs.map +1 -0
- package/esm/components/input-number/src/input-number.vue.mjs +356 -0
- package/esm/components/input-number/src/input-number.vue.mjs.map +1 -0
- package/esm/components/input-search/index.mjs +277 -0
- package/esm/components/input-search/index.mjs.map +1 -0
- package/esm/components/input-search/src/input-search.mjs +53 -0
- package/esm/components/input-search/src/input-search.mjs.map +1 -0
- package/esm/components/input-search/src/input-search.vue.mjs +268 -0
- package/esm/components/input-search/src/input-search.vue.mjs.map +1 -0
- package/esm/components/qr-code/index.mjs +1967 -0
- package/esm/components/qr-code/index.mjs.map +1 -0
- package/esm/components/qr-code/src/qr-code.mjs +59 -0
- package/esm/components/qr-code/src/qr-code.mjs.map +1 -0
- package/esm/components/qr-code/src/qr-code.vue.mjs +1958 -0
- package/esm/components/qr-code/src/qr-code.vue.mjs.map +1 -0
- package/esm/components/radial-menu/index.mjs +974 -0
- package/esm/components/radial-menu/index.mjs.map +1 -0
- package/esm/components/radial-menu/src/radial-menu.mjs +94 -0
- package/esm/components/radial-menu/src/radial-menu.mjs.map +1 -0
- package/esm/components/radial-menu/src/radial-menu.vue.mjs +916 -0
- package/esm/components/radial-menu/src/radial-menu.vue.mjs.map +1 -0
- package/esm/components/select/index.mjs +154 -0
- package/esm/components/select/index.mjs.map +1 -0
- package/esm/components/select/src/select.mjs +14 -0
- package/esm/components/select/src/select.mjs.map +1 -0
- package/esm/components/select/src/select.vue.mjs +145 -0
- package/esm/components/select/src/select.vue.mjs.map +1 -0
- package/esm/components/table/index.mjs +3342 -0
- package/esm/components/table/index.mjs.map +1 -0
- package/esm/components/table/src/table.mjs +60 -0
- package/esm/components/table/src/table.mjs.map +1 -0
- package/esm/components/table/src/table.vue.mjs +3080 -0
- package/esm/components/table/src/table.vue.mjs.map +1 -0
- package/esm/dialog-Cm3Px-Bu.js +537 -0
- package/esm/dialog-Cm3Px-Bu.js.map +1 -0
- package/esm/dialog-CzZm50XM.js +2 -0
- package/esm/hooks/dialog-d4SMZWbw.js +261 -0
- package/esm/hooks/dialog-d4SMZWbw.js.map +1 -0
- package/esm/hooks/hooks-DdjieG2I.js +281 -0
- package/esm/hooks/hooks-DdjieG2I.js.map +1 -0
- package/esm/hooks/index.mjs +2 -0
- package/esm/icons/index.mjs +79 -0
- package/esm/icons/index.mjs.map +1 -0
- package/esm/index.mjs +9065 -0
- package/esm/index.mjs.map +1 -0
- package/esm/utils/index.mjs +65 -0
- package/esm/utils/index.mjs.map +1 -0
- package/global.d.ts +39 -0
- package/package.json +131 -0
- package/theme/index.css +1 -0
- package/theme/index.scss +16 -0
- package/theme/src/barcode.scss +14 -0
- package/theme/src/button.scss +65 -0
- package/theme/src/date-picker.scss +87 -0
- package/theme/src/dialog.scss +146 -0
- package/theme/src/ep-vars.scss +11 -0
- package/theme/src/input-number.scss +66 -0
- package/theme/src/input-search.scss +78 -0
- package/theme/src/input.scss +66 -0
- package/theme/src/mixins/bem.scss +35 -0
- package/theme/src/mixins/color.scss +8 -0
- package/theme/src/qr-code.scss +23 -0
- package/theme/src/radial-menu.scss +346 -0
- package/theme/src/select.scss +44 -0
- package/theme/src/table.scss +143 -0
- package/theme/src/tokens.scss +26 -0
- package/theme/src/tree-select.scss +45 -0
- package/theme/src/tree.scss +369 -0
- package/types/components/barcode/index.d.ts +183 -0
- package/types/components/barcode/src/barcode.d.ts +147 -0
- package/types/components/barcode/src/barcode.vue.d.ts +184 -0
- package/types/components/button/index.d.ts +135 -0
- package/types/components/button/src/button.d.ts +33 -0
- package/types/components/button/src/button.vue.d.ts +138 -0
- package/types/components/date-picker/index.d.ts +508 -0
- package/types/components/date-picker/src/date-picker.d.ts +35 -0
- package/types/components/date-picker/src/date-picker.vue.d.ts +509 -0
- package/types/components/dialog/index.d.ts +630 -0
- package/types/components/dialog/src/dialog.d.ts +70 -0
- package/types/components/dialog/src/dialog.vue.d.ts +257 -0
- package/types/components/index.d.ts +27 -0
- package/types/components/input/index.d.ts +233 -0
- package/types/components/input/src/input.d.ts +65 -0
- package/types/components/input/src/input.vue.d.ts +239 -0
- package/types/components/input-number/index.d.ts +713 -0
- package/types/components/input-number/src/input-number.d.ts +101 -0
- package/types/components/input-number/src/input-number.vue.d.ts +283 -0
- package/types/components/input-search/index.d.ts +113 -0
- package/types/components/input-search/src/input-search.d.ts +128 -0
- package/types/components/input-search/src/input-search.vue.d.ts +114 -0
- package/types/components/qr-code/index.d.ts +109 -0
- package/types/components/qr-code/src/qr-code.d.ts +93 -0
- package/types/components/qr-code/src/qr-code.vue.d.ts +109 -0
- package/types/components/radial-menu/index.d.ts +499 -0
- package/types/components/radial-menu/src/radial-menu-item.d.ts +40 -0
- package/types/components/radial-menu/src/radial-menu-item.vue.d.ts +95 -0
- package/types/components/radial-menu/src/radial-menu.d.ts +92 -0
- package/types/components/radial-menu/src/radial-menu.vue.d.ts +200 -0
- package/types/components/radial-menu/src/types.d.ts +48 -0
- package/types/components/radial-menu/src/use-radial-menu-items.d.ts +19 -0
- package/types/components/radial-menu/src/use-radial-menu-keyboard.d.ts +17 -0
- package/types/components/radial-menu/src/use-radial-menu-position.d.ts +45 -0
- package/types/components/radial-menu/src/use-radial-menu-shortcut.d.ts +8 -0
- package/types/components/radial-menu/src/use-radial-menu-state.d.ts +15 -0
- package/types/components/select/index.d.ts +5 -0
- package/types/components/select/src/select.d.ts +30 -0
- package/types/components/select/src/select.vue.d.ts +25 -0
- package/types/components/table/index.d.ts +8 -0
- package/types/components/table/src/editor-registry.d.ts +24 -0
- package/types/components/table/src/proxy-data.d.ts +10 -0
- package/types/components/table/src/table-editor.d.ts +18 -0
- package/types/components/table/src/table-editor.vue.d.ts +43 -0
- package/types/components/table/src/table.d.ts +179 -0
- package/types/components/table/src/table.vue.d.ts +121 -0
- package/types/components/tree/index.d.ts +5 -0
- package/types/components/tree/src/tree-node.vue.d.ts +88 -0
- package/types/components/tree/src/tree-types.d.ts +90 -0
- package/types/components/tree/src/tree.d.ts +448 -0
- package/types/components/tree/src/tree.vue.d.ts +301 -0
- package/types/components/tree/src/use-tree-check-conduct.d.ts +43 -0
- package/types/components/tree/src/use-tree-checked-state.d.ts +34 -0
- package/types/components/tree/src/use-tree-drag.d.ts +45 -0
- package/types/components/tree/src/use-tree-expanded-state.d.ts +41 -0
- package/types/components/tree/src/use-tree-keyboard.d.ts +21 -0
- package/types/components/tree/src/use-tree-load.d.ts +25 -0
- package/types/components/tree/src/use-tree-scroll.d.ts +17 -0
- package/types/components/tree/src/use-tree-selected-state.d.ts +29 -0
- package/types/components/tree-select/index.d.ts +5 -0
- package/types/components/tree-select/src/tree-select.d.ts +26 -0
- package/types/components/tree-select/src/tree-select.vue.d.ts +25 -0
- package/types/falcon-ui/index.d.ts +8 -0
- package/types/hooks/index.d.ts +3 -0
- package/types/hooks/src/use-clearable-state.d.ts +10 -0
- package/types/hooks/src/use-component.d.ts +15 -0
- package/types/hooks/src/use-dialog.d.ts +49 -0
- package/types/icons/index.d.ts +1 -0
- package/types/icons/src/components/holder-outlined.vue.d.ts +3 -0
- package/types/icons/src/components/index.d.ts +3 -0
- package/types/icons/src/components/minus-square-outlined.vue.d.ts +3 -0
- package/types/icons/src/components/plus-square-outlined.vue.d.ts +3 -0
- package/types/utils/index.d.ts +3 -0
- package/types/utils/src/bem.d.ts +11 -0
- package/types/utils/src/component.d.ts +6 -0
- package/types/utils/src/install.d.ts +5 -0
- package/umd/falcon-ui.umd.js +13297 -0
- package/umd/falcon-ui.umd.js.map +1 -0
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
Object.defineProperties(exports, {
|
|
2
|
+
__esModule: { value: true },
|
|
3
|
+
[Symbol.toStringTag]: { value: "Module" }
|
|
4
|
+
});
|
|
5
|
+
let vue = require("vue");
|
|
6
|
+
let __element_plus_icons_vue = require("@element-plus/icons-vue");
|
|
7
|
+
let element_plus = require("element-plus");
|
|
8
|
+
var defaultNamespace = "fl";
|
|
9
|
+
var statePrefix = "is-";
|
|
10
|
+
var buildBemName = (namespace, block, blockSuffix = "", element = "", modifier = "") => {
|
|
11
|
+
let className = `${namespace}-${block}`;
|
|
12
|
+
if (blockSuffix) className += `-${blockSuffix}`;
|
|
13
|
+
if (element) className += `__${element}`;
|
|
14
|
+
if (modifier) className += `--${modifier}`;
|
|
15
|
+
return className;
|
|
16
|
+
};
|
|
17
|
+
const useNamespace = (block, namespace = defaultNamespace) => {
|
|
18
|
+
const b = (blockSuffix = "") => buildBemName(namespace, block, blockSuffix);
|
|
19
|
+
const e = (element) => element ? buildBemName(namespace, block, "", element) : "";
|
|
20
|
+
const m = (modifier) => modifier ? buildBemName(namespace, block, "", "", modifier) : "";
|
|
21
|
+
const be = (blockSuffix, element) => {
|
|
22
|
+
if (!blockSuffix || !element) return "";
|
|
23
|
+
return buildBemName(namespace, block, blockSuffix, element);
|
|
24
|
+
};
|
|
25
|
+
const em = (element, modifier) => {
|
|
26
|
+
if (!element || !modifier) return "";
|
|
27
|
+
return buildBemName(namespace, block, "", element, modifier);
|
|
28
|
+
};
|
|
29
|
+
const bm = (blockSuffix, modifier) => {
|
|
30
|
+
if (!blockSuffix || !modifier) return "";
|
|
31
|
+
return buildBemName(namespace, block, blockSuffix, "", modifier);
|
|
32
|
+
};
|
|
33
|
+
const bem = (blockSuffix, element, modifier) => {
|
|
34
|
+
if (!blockSuffix && !element && !modifier) return b();
|
|
35
|
+
return buildBemName(namespace, block, blockSuffix, element, modifier);
|
|
36
|
+
};
|
|
37
|
+
const is = (name, state = true) => state ? `${statePrefix}${name}` : "";
|
|
38
|
+
return {
|
|
39
|
+
namespace,
|
|
40
|
+
b,
|
|
41
|
+
e,
|
|
42
|
+
m,
|
|
43
|
+
be,
|
|
44
|
+
em,
|
|
45
|
+
bm,
|
|
46
|
+
bem,
|
|
47
|
+
is
|
|
48
|
+
};
|
|
49
|
+
};
|
|
50
|
+
const withInstall = (component) => {
|
|
51
|
+
const installable = component;
|
|
52
|
+
installable.install = (app) => {
|
|
53
|
+
if (!component.name) return;
|
|
54
|
+
app.component(component.name, component);
|
|
55
|
+
};
|
|
56
|
+
return installable;
|
|
57
|
+
};
|
|
58
|
+
const flInputSearchProps = {
|
|
59
|
+
modelValue: {
|
|
60
|
+
type: [String, Number],
|
|
61
|
+
default: null
|
|
62
|
+
},
|
|
63
|
+
label: {
|
|
64
|
+
type: String,
|
|
65
|
+
default: ""
|
|
66
|
+
},
|
|
67
|
+
fetchApi: {
|
|
68
|
+
type: Function,
|
|
69
|
+
default: void 0
|
|
70
|
+
},
|
|
71
|
+
mapResult: {
|
|
72
|
+
type: Function,
|
|
73
|
+
required: true
|
|
74
|
+
},
|
|
75
|
+
placeholder: {
|
|
76
|
+
type: String,
|
|
77
|
+
default: ""
|
|
78
|
+
},
|
|
79
|
+
disabled: {
|
|
80
|
+
type: Boolean,
|
|
81
|
+
default: false
|
|
82
|
+
},
|
|
83
|
+
clearable: {
|
|
84
|
+
type: Boolean,
|
|
85
|
+
default: false
|
|
86
|
+
},
|
|
87
|
+
isError: {
|
|
88
|
+
type: Boolean,
|
|
89
|
+
default: false
|
|
90
|
+
},
|
|
91
|
+
isTable: {
|
|
92
|
+
type: Boolean,
|
|
93
|
+
default: false
|
|
94
|
+
},
|
|
95
|
+
clearOnBlurUnconfirmed: {
|
|
96
|
+
type: Boolean,
|
|
97
|
+
default: true
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
const flInputSearchEmits = {
|
|
101
|
+
"update:modelValue": (value) => value === null || typeof value === "string" || typeof value === "number",
|
|
102
|
+
"update:label": (value) => typeof value === "string",
|
|
103
|
+
openDialog: (payload) => typeof payload.keyword === "string" && (payload.reason === "manual" || payload.reason === "multi-match") && (payload.results === void 0 || Array.isArray(payload.results)),
|
|
104
|
+
"selection-commit": (payload) => typeof payload.label === "string" && payload.source === "enter" && (payload.value === null || typeof payload.value === "string" || typeof payload.value === "number"),
|
|
105
|
+
"search-error": (payload) => typeof payload.keyword === "string",
|
|
106
|
+
clear: (payload) => payload.reason === "manual-empty" || payload.reason === "blur-unconfirmed" || payload.reason === "error"
|
|
107
|
+
};
|
|
108
|
+
var input_search_vue_vue_type_script_setup_true_lang_default = /* @__PURE__ */ (0, vue.defineComponent)({
|
|
109
|
+
name: "FlInputSearch",
|
|
110
|
+
inheritAttrs: false,
|
|
111
|
+
__name: "input-search",
|
|
112
|
+
props: flInputSearchProps,
|
|
113
|
+
emits: flInputSearchEmits,
|
|
114
|
+
setup(__props, { expose: __expose, emit: __emit }) {
|
|
115
|
+
const props = __props;
|
|
116
|
+
const emit = __emit;
|
|
117
|
+
const ns = useNamespace("input-search");
|
|
118
|
+
const inputRef = (0, vue.ref)(null);
|
|
119
|
+
const innerLabel = (0, vue.ref)(props.label);
|
|
120
|
+
const isLoading = (0, vue.ref)(false);
|
|
121
|
+
const latestSearchToken = (0, vue.ref)(0);
|
|
122
|
+
const lastValidLabel = (0, vue.ref)(props.label);
|
|
123
|
+
const lastValidValue = (0, vue.ref)(props.modelValue);
|
|
124
|
+
const inputClass = (0, vue.computed)(() => [ns.b(), {
|
|
125
|
+
"is-error": props.isError,
|
|
126
|
+
"is-table": props.isTable
|
|
127
|
+
}]);
|
|
128
|
+
const searchTriggerClass = ns.e("trigger");
|
|
129
|
+
const normalizeLabel = (value) => typeof value === "string" ? value : "";
|
|
130
|
+
const normalizeValue = (value) => {
|
|
131
|
+
if (value === null || typeof value === "string" || typeof value === "number") return value;
|
|
132
|
+
return null;
|
|
133
|
+
};
|
|
134
|
+
const syncSnapshot = (value, label) => {
|
|
135
|
+
lastValidValue.value = value;
|
|
136
|
+
lastValidLabel.value = label;
|
|
137
|
+
};
|
|
138
|
+
const clearSelection = (reason) => {
|
|
139
|
+
innerLabel.value = "";
|
|
140
|
+
syncSnapshot(null, "");
|
|
141
|
+
emit("update:modelValue", null);
|
|
142
|
+
emit("update:label", "");
|
|
143
|
+
emit("clear", { reason });
|
|
144
|
+
};
|
|
145
|
+
const commitSelection = (result) => {
|
|
146
|
+
const nextValue = normalizeValue(result.value);
|
|
147
|
+
const nextLabel = normalizeLabel(result.label);
|
|
148
|
+
innerLabel.value = nextLabel;
|
|
149
|
+
syncSnapshot(nextValue, nextLabel);
|
|
150
|
+
emit("update:modelValue", nextValue);
|
|
151
|
+
emit("update:label", nextLabel);
|
|
152
|
+
emit("selection-commit", {
|
|
153
|
+
value: nextValue,
|
|
154
|
+
label: nextLabel,
|
|
155
|
+
source: "enter"
|
|
156
|
+
});
|
|
157
|
+
};
|
|
158
|
+
const handleInput = (value) => {
|
|
159
|
+
const nextLabel = normalizeLabel(value);
|
|
160
|
+
innerLabel.value = nextLabel;
|
|
161
|
+
emit("update:label", nextLabel);
|
|
162
|
+
};
|
|
163
|
+
const handleManualSearch = () => {
|
|
164
|
+
emit("openDialog", {
|
|
165
|
+
keyword: innerLabel.value.trim(),
|
|
166
|
+
reason: "manual"
|
|
167
|
+
});
|
|
168
|
+
};
|
|
169
|
+
const handleEnter = async () => {
|
|
170
|
+
if (isLoading.value) return;
|
|
171
|
+
const keyword = innerLabel.value.trim();
|
|
172
|
+
if (!keyword) return;
|
|
173
|
+
if (!props.fetchApi) {
|
|
174
|
+
emit("openDialog", {
|
|
175
|
+
keyword,
|
|
176
|
+
reason: "manual"
|
|
177
|
+
});
|
|
178
|
+
return;
|
|
179
|
+
}
|
|
180
|
+
const currentToken = latestSearchToken.value + 1;
|
|
181
|
+
latestSearchToken.value = currentToken;
|
|
182
|
+
isLoading.value = true;
|
|
183
|
+
try {
|
|
184
|
+
const response = await props.fetchApi(keyword);
|
|
185
|
+
if (currentToken !== latestSearchToken.value) return;
|
|
186
|
+
const results = Array.isArray(response) ? response : [];
|
|
187
|
+
if (results.length === 1) {
|
|
188
|
+
commitSelection(props.mapResult(results[0]));
|
|
189
|
+
return;
|
|
190
|
+
}
|
|
191
|
+
if (results.length > 1) emit("openDialog", {
|
|
192
|
+
keyword,
|
|
193
|
+
reason: "multi-match",
|
|
194
|
+
results
|
|
195
|
+
});
|
|
196
|
+
} catch (error) {
|
|
197
|
+
if (currentToken !== latestSearchToken.value) return;
|
|
198
|
+
emit("search-error", {
|
|
199
|
+
keyword,
|
|
200
|
+
error
|
|
201
|
+
});
|
|
202
|
+
} finally {
|
|
203
|
+
if (currentToken === latestSearchToken.value) isLoading.value = false;
|
|
204
|
+
}
|
|
205
|
+
};
|
|
206
|
+
const handleNativeClear = () => {
|
|
207
|
+
clearSelection("manual-empty");
|
|
208
|
+
};
|
|
209
|
+
const handleBlur = () => {
|
|
210
|
+
if (isLoading.value) return;
|
|
211
|
+
const currentLabel = innerLabel.value;
|
|
212
|
+
if (currentLabel === lastValidLabel.value) return;
|
|
213
|
+
if (!currentLabel) {
|
|
214
|
+
clearSelection("manual-empty");
|
|
215
|
+
return;
|
|
216
|
+
}
|
|
217
|
+
if (props.clearOnBlurUnconfirmed) clearSelection("blur-unconfirmed");
|
|
218
|
+
};
|
|
219
|
+
const focus = () => {
|
|
220
|
+
inputRef.value?.focus();
|
|
221
|
+
};
|
|
222
|
+
const blur = () => {
|
|
223
|
+
inputRef.value?.blur();
|
|
224
|
+
};
|
|
225
|
+
const clear = () => {
|
|
226
|
+
inputRef.value?.clear();
|
|
227
|
+
};
|
|
228
|
+
(0, vue.watch)(() => props.label, (value) => {
|
|
229
|
+
innerLabel.value = value;
|
|
230
|
+
});
|
|
231
|
+
(0, vue.watch)(() => props.modelValue, (value) => {
|
|
232
|
+
if (value === lastValidValue.value) return;
|
|
233
|
+
syncSnapshot(normalizeValue(value), props.label);
|
|
234
|
+
});
|
|
235
|
+
(0, vue.watch)(() => props.isError, (isError, previousIsError) => {
|
|
236
|
+
if (isError && previousIsError !== true) clearSelection("error");
|
|
237
|
+
}, { immediate: true });
|
|
238
|
+
__expose({
|
|
239
|
+
focus,
|
|
240
|
+
blur,
|
|
241
|
+
clear
|
|
242
|
+
});
|
|
243
|
+
return (_ctx, _cache) => {
|
|
244
|
+
return (0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(element_plus.ElInput), {
|
|
245
|
+
ref_key: "inputRef",
|
|
246
|
+
ref: inputRef,
|
|
247
|
+
class: (0, vue.normalizeClass)(inputClass.value),
|
|
248
|
+
clearable: props.clearable,
|
|
249
|
+
disabled: props.disabled || isLoading.value,
|
|
250
|
+
"model-value": innerLabel.value,
|
|
251
|
+
placeholder: props.placeholder,
|
|
252
|
+
onBlur: handleBlur,
|
|
253
|
+
onClear: handleNativeClear,
|
|
254
|
+
onKeydown: (0, vue.withKeys)((0, vue.withModifiers)(handleEnter, ["prevent"]), ["enter"]),
|
|
255
|
+
"onUpdate:modelValue": handleInput
|
|
256
|
+
}, {
|
|
257
|
+
suffix: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("span", {
|
|
258
|
+
class: (0, vue.normalizeClass)((0, vue.unref)(searchTriggerClass)),
|
|
259
|
+
"aria-label": "Search",
|
|
260
|
+
role: "button",
|
|
261
|
+
tabindex: "-1",
|
|
262
|
+
onClick: handleManualSearch,
|
|
263
|
+
onMousedown: _cache[0] || (_cache[0] = (0, vue.withModifiers)(() => {}, ["prevent"]))
|
|
264
|
+
}, [(0, vue.createVNode)((0, vue.unref)(element_plus.ElIcon), { class: (0, vue.normalizeClass)((0, vue.unref)(ns).is("loading", isLoading.value)) }, {
|
|
265
|
+
default: (0, vue.withCtx)(() => [isLoading.value ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(__element_plus_icons_vue.Loading), { key: 0 })) : ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.unref)(__element_plus_icons_vue.Search), { key: 1 }))]),
|
|
266
|
+
_: 1
|
|
267
|
+
}, 8, ["class"])], 34)]),
|
|
268
|
+
_: 1
|
|
269
|
+
}, 8, [
|
|
270
|
+
"class",
|
|
271
|
+
"clearable",
|
|
272
|
+
"disabled",
|
|
273
|
+
"model-value",
|
|
274
|
+
"placeholder",
|
|
275
|
+
"onKeydown"
|
|
276
|
+
]);
|
|
277
|
+
};
|
|
278
|
+
}
|
|
279
|
+
});
|
|
280
|
+
var input_search_default$1 = input_search_vue_vue_type_script_setup_true_lang_default;
|
|
281
|
+
const FlInputSearch = withInstall(input_search_default$1);
|
|
282
|
+
var input_search_default = FlInputSearch;
|
|
283
|
+
exports.FlInputSearch = FlInputSearch;
|
|
284
|
+
exports.default = input_search_default;
|
|
285
|
+
|
|
286
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":[],"sources":["../../../../../packages/utils/src/bem.ts","../../../../../packages/utils/src/install.ts","../../../../../packages/components/input-search/src/input-search.ts","../../../../../packages/components/input-search/src/input-search.vue","../../../../../packages/components/input-search/src/input-search.vue","../../../../../packages/components/input-search/index.ts"],"sourcesContent":["const defaultNamespace = 'fl'\r\nconst statePrefix = 'is-'\r\n\r\nconst buildBemName = (\r\n namespace: string,\r\n block: string,\r\n blockSuffix = '',\r\n element = '',\r\n modifier = ''\r\n) => {\r\n let className = `${namespace}-${block}`\r\n\r\n if (blockSuffix) {\r\n className += `-${blockSuffix}`\r\n }\r\n\r\n if (element) {\r\n className += `__${element}`\r\n }\r\n\r\n if (modifier) {\r\n className += `--${modifier}`\r\n }\r\n\r\n return className\r\n}\r\n\r\nexport const useNamespace = (block: string, namespace = defaultNamespace) => {\r\n const b = (blockSuffix = '') => buildBemName(namespace, block, blockSuffix)\r\n\r\n const e = (element?: string) => (element ? buildBemName(namespace, block, '', element) : '')\r\n\r\n const m = (modifier?: string) =>\r\n modifier ? buildBemName(namespace, block, '', '', modifier) : ''\r\n\r\n const be = (blockSuffix?: string, element?: string) => {\r\n if (!blockSuffix || !element) {\r\n return ''\r\n }\r\n\r\n return buildBemName(namespace, block, blockSuffix, element)\r\n }\r\n\r\n const em = (element?: string, modifier?: string) => {\r\n if (!element || !modifier) {\r\n return ''\r\n }\r\n\r\n return buildBemName(namespace, block, '', element, modifier)\r\n }\r\n\r\n const bm = (blockSuffix?: string, modifier?: string) => {\r\n if (!blockSuffix || !modifier) {\r\n return ''\r\n }\r\n\r\n return buildBemName(namespace, block, blockSuffix, '', modifier)\r\n }\r\n\r\n const bem = (blockSuffix?: string, element?: string, modifier?: string) => {\r\n if (!blockSuffix && !element && !modifier) {\r\n return b()\r\n }\r\n\r\n return buildBemName(namespace, block, blockSuffix, element, modifier)\r\n }\r\n\r\n const is = (name: string, state = true) => (state ? `${statePrefix}${name}` : '')\r\n\r\n return {\r\n namespace,\r\n b,\r\n e,\r\n m,\r\n be,\r\n em,\r\n bm,\r\n bem,\r\n is\r\n }\r\n}\r\n","import type { App, Plugin } from 'vue'\r\n\r\nexport type SFCWithInstall<T> = T & Plugin\r\n\r\nexport const withInstall = <T extends { name?: string }>(component: T): SFCWithInstall<T> => {\r\n const installable = component as SFCWithInstall<T>\r\n\r\n installable.install = (app: App) => {\r\n if (!component.name) {\r\n return\r\n }\r\n\r\n app.component(component.name, component as unknown as object)\r\n }\r\n\r\n return installable\r\n}\r\n","import type { ExtractPublicPropTypes, PropType } from 'vue'\r\n\r\nexport type FlInputSearchValue = string | number | null\r\n\r\nexport interface FlInputSearchMappedResult {\r\n label: string\r\n value: FlInputSearchValue\r\n}\r\n\r\nexport type FlInputSearchFetchApi = (keyword: string) => Promise<unknown[]>\r\nexport type FlInputSearchMapResult = (item: unknown) => FlInputSearchMappedResult\r\n\r\nexport const flInputSearchProps = {\r\n /**\r\n * 绑定值,通常为业务实体 ID。\r\n */\r\n modelValue: {\r\n type: [String, Number] as PropType<string | number | null>,\r\n default: null\r\n },\r\n /**\r\n * 输入框显示值(业务标签)。\r\n */\r\n label: {\r\n type: String,\r\n default: ''\r\n },\r\n /**\r\n * 回车检索方法。\r\n */\r\n fetchApi: {\r\n type: Function as PropType<FlInputSearchFetchApi>,\r\n default: undefined\r\n },\r\n /**\r\n * 外部结果映射方法,统一映射到 value/label。\r\n */\r\n mapResult: {\r\n type: Function as PropType<FlInputSearchMapResult>,\r\n required: true\r\n },\r\n /**\r\n * 占位提示文案。\r\n */\r\n placeholder: {\r\n type: String,\r\n default: ''\r\n },\r\n /**\r\n * 是否禁用输入。\r\n */\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 是否显示清空按钮。\r\n */\r\n clearable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 是否进入错误态。\r\n */\r\n isError: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 是否用于表格单元格输入。\r\n */\r\n isTable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * Blur 时未确认输入是否强制清空。\r\n */\r\n clearOnBlurUnconfirmed: {\r\n type: Boolean,\r\n default: true\r\n }\r\n} as const\r\n\r\nexport type FlInputSearchOpenDialogReason = 'manual' | 'multi-match'\r\n\r\nexport interface FlInputSearchOpenDialogPayload {\r\n keyword: string\r\n reason: FlInputSearchOpenDialogReason\r\n results?: unknown[]\r\n}\r\n\r\nexport interface FlInputSearchSelectionCommitPayload {\r\n label: string\r\n source: 'enter'\r\n value: FlInputSearchValue\r\n}\r\n\r\nexport interface FlInputSearchSearchErrorPayload {\r\n error: unknown\r\n keyword: string\r\n}\r\n\r\nexport interface FlInputSearchClearPayload {\r\n reason: 'manual-empty' | 'blur-unconfirmed' | 'error'\r\n}\r\n\r\nexport const flInputSearchEmits = {\r\n /**\r\n * 绑定值更新事件。\r\n */\r\n 'update:modelValue': (value: FlInputSearchValue) =>\r\n value === null || typeof value === 'string' || typeof value === 'number',\r\n /**\r\n * 显示值更新事件。\r\n */\r\n 'update:label': (value: string) => typeof value === 'string',\r\n /**\r\n * 触发外部弹窗占位事件。\r\n */\r\n openDialog: (payload: FlInputSearchOpenDialogPayload) =>\r\n typeof payload.keyword === 'string' &&\r\n (payload.reason === 'manual' || payload.reason === 'multi-match') &&\r\n (payload.results === undefined || Array.isArray(payload.results)),\r\n /**\r\n * 唯一结果选中提交事件。\r\n */\r\n 'selection-commit': (payload: FlInputSearchSelectionCommitPayload) =>\r\n typeof payload.label === 'string' &&\r\n payload.source === 'enter' &&\r\n (payload.value === null ||\r\n typeof payload.value === 'string' ||\r\n typeof payload.value === 'number'),\r\n /**\r\n * 回车检索失败事件。\r\n */\r\n 'search-error': (payload: FlInputSearchSearchErrorPayload) => typeof payload.keyword === 'string',\r\n /**\r\n * 清空行为事件。\r\n */\r\n clear: (payload: FlInputSearchClearPayload) =>\r\n payload.reason === 'manual-empty' ||\r\n payload.reason === 'blur-unconfirmed' ||\r\n payload.reason === 'error'\r\n} as const\r\n\r\nexport type FlInputSearchProps = ExtractPublicPropTypes<typeof flInputSearchProps>\r\nexport type FlInputSearchEmits = typeof flInputSearchEmits\r\n\r\nexport type InputSearchProps = FlInputSearchProps\r\nexport type InputSearchEmits = FlInputSearchEmits\r\n","<template>\r\n <el-input\r\n ref=\"inputRef\"\r\n :class=\"inputClass\"\r\n :clearable=\"props.clearable\"\r\n :disabled=\"props.disabled || isLoading\"\r\n :model-value=\"innerLabel\"\r\n :placeholder=\"props.placeholder\"\r\n @blur=\"handleBlur\"\r\n @clear=\"handleNativeClear\"\r\n @keydown.enter.prevent=\"handleEnter\"\r\n @update:model-value=\"handleInput\">\r\n <template #suffix>\r\n <span\r\n :class=\"searchTriggerClass\"\r\n aria-label=\"Search\"\r\n role=\"button\"\r\n tabindex=\"-1\"\r\n @click=\"handleManualSearch\"\r\n @mousedown.prevent>\r\n <el-icon :class=\"ns.is('loading', isLoading)\">\r\n <Loading v-if=\"isLoading\" />\r\n <Search v-else />\r\n </el-icon>\r\n </span>\r\n </template>\r\n </el-input>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { Loading, Search } from '@element-plus/icons-vue'\r\nimport { ElIcon, ElInput } from 'element-plus'\r\nimport { computed, ref, watch } from 'vue'\r\nimport { useNamespace } from '@falcon-ui/utils'\r\nimport type { FlInputSearchMappedResult, FlInputSearchValue } from './input-search'\r\nimport { flInputSearchEmits, flInputSearchProps } from './input-search'\r\n\r\ndefineOptions({\r\n name: 'FlInputSearch',\r\n inheritAttrs: false\r\n})\r\n\r\ntype ElInputExpose = {\r\n blur: () => void\r\n clear: () => void\r\n focus: () => void\r\n}\r\n\r\nconst props = defineProps(flInputSearchProps)\r\nconst emit = defineEmits(flInputSearchEmits)\r\nconst ns = useNamespace('input-search')\r\n\r\nconst inputRef = ref<ElInputExpose | null>(null)\r\nconst innerLabel = ref(props.label)\r\nconst isLoading = ref(false)\r\nconst latestSearchToken = ref(0)\r\nconst lastValidLabel = ref(props.label)\r\nconst lastValidValue = ref<FlInputSearchValue>(props.modelValue)\r\n\r\nconst inputClass = computed(() => [\r\n ns.b(),\r\n {\r\n 'is-error': props.isError,\r\n 'is-table': props.isTable\r\n }\r\n])\r\n\r\nconst searchTriggerClass = ns.e('trigger')\r\n\r\nconst normalizeLabel = (value: unknown): string => (typeof value === 'string' ? value : '')\r\n\r\nconst normalizeValue = (value: unknown): FlInputSearchValue => {\r\n if (value === null || typeof value === 'string' || typeof value === 'number') {\r\n return value\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst syncSnapshot = (value: FlInputSearchValue, label: string) => {\r\n lastValidValue.value = value\r\n lastValidLabel.value = label\r\n}\r\n\r\nconst clearSelection = (reason: 'manual-empty' | 'blur-unconfirmed' | 'error') => {\r\n innerLabel.value = ''\r\n syncSnapshot(null, '')\r\n\r\n emit('update:modelValue', null)\r\n emit('update:label', '')\r\n emit('clear', { reason })\r\n}\r\n\r\nconst commitSelection = (result: FlInputSearchMappedResult) => {\r\n const nextValue = normalizeValue(result.value)\r\n const nextLabel = normalizeLabel(result.label)\r\n\r\n innerLabel.value = nextLabel\r\n syncSnapshot(nextValue, nextLabel)\r\n\r\n emit('update:modelValue', nextValue)\r\n emit('update:label', nextLabel)\r\n emit('selection-commit', {\r\n value: nextValue,\r\n label: nextLabel,\r\n source: 'enter'\r\n })\r\n}\r\n\r\nconst handleInput = (value: string) => {\r\n const nextLabel = normalizeLabel(value)\r\n innerLabel.value = nextLabel\r\n emit('update:label', nextLabel)\r\n}\r\n\r\nconst handleManualSearch = () => {\r\n emit('openDialog', {\r\n keyword: innerLabel.value.trim(),\r\n reason: 'manual'\r\n })\r\n}\r\n\r\nconst handleEnter = async () => {\r\n if (isLoading.value) {\r\n return\r\n }\r\n\r\n const keyword = innerLabel.value.trim()\r\n if (!keyword) {\r\n return\r\n }\r\n\r\n if (!props.fetchApi) {\r\n emit('openDialog', {\r\n keyword,\r\n reason: 'manual'\r\n })\r\n return\r\n }\r\n\r\n const currentToken = latestSearchToken.value + 1\r\n latestSearchToken.value = currentToken\r\n isLoading.value = true\r\n\r\n try {\r\n const response = await props.fetchApi(keyword)\r\n if (currentToken !== latestSearchToken.value) {\r\n return\r\n }\r\n\r\n const results = Array.isArray(response) ? response : []\r\n\r\n if (results.length === 1) {\r\n commitSelection(props.mapResult(results[0]))\r\n return\r\n }\r\n\r\n if (results.length > 1) {\r\n emit('openDialog', {\r\n keyword,\r\n reason: 'multi-match',\r\n results\r\n })\r\n }\r\n } catch (error) {\r\n if (currentToken !== latestSearchToken.value) {\r\n return\r\n }\r\n\r\n emit('search-error', {\r\n keyword,\r\n error\r\n })\r\n } finally {\r\n if (currentToken === latestSearchToken.value) {\r\n isLoading.value = false\r\n }\r\n }\r\n}\r\n\r\nconst handleNativeClear = () => {\r\n clearSelection('manual-empty')\r\n}\r\n\r\nconst handleBlur = () => {\r\n if (isLoading.value) {\r\n return\r\n }\r\n\r\n const currentLabel = innerLabel.value\r\n if (currentLabel === lastValidLabel.value) {\r\n return\r\n }\r\n\r\n if (!currentLabel) {\r\n clearSelection('manual-empty')\r\n return\r\n }\r\n\r\n if (props.clearOnBlurUnconfirmed) {\r\n clearSelection('blur-unconfirmed')\r\n }\r\n}\r\n\r\nconst focus = () => {\r\n inputRef.value?.focus()\r\n}\r\n\r\nconst blur = () => {\r\n inputRef.value?.blur()\r\n}\r\n\r\nconst clear = () => {\r\n inputRef.value?.clear()\r\n}\r\n\r\nwatch(\r\n () => props.label,\r\n (value) => {\r\n innerLabel.value = value\r\n }\r\n)\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (value) => {\r\n if (value === lastValidValue.value) {\r\n return\r\n }\r\n\r\n syncSnapshot(normalizeValue(value), props.label)\r\n }\r\n)\r\n\r\nwatch(\r\n () => props.isError,\r\n (isError, previousIsError) => {\r\n if (isError && previousIsError !== true) {\r\n clearSelection('error')\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\ndefineExpose({\r\n focus,\r\n blur,\r\n clear\r\n})\r\n</script>\r\n","<template>\r\n <el-input\r\n ref=\"inputRef\"\r\n :class=\"inputClass\"\r\n :clearable=\"props.clearable\"\r\n :disabled=\"props.disabled || isLoading\"\r\n :model-value=\"innerLabel\"\r\n :placeholder=\"props.placeholder\"\r\n @blur=\"handleBlur\"\r\n @clear=\"handleNativeClear\"\r\n @keydown.enter.prevent=\"handleEnter\"\r\n @update:model-value=\"handleInput\">\r\n <template #suffix>\r\n <span\r\n :class=\"searchTriggerClass\"\r\n aria-label=\"Search\"\r\n role=\"button\"\r\n tabindex=\"-1\"\r\n @click=\"handleManualSearch\"\r\n @mousedown.prevent>\r\n <el-icon :class=\"ns.is('loading', isLoading)\">\r\n <Loading v-if=\"isLoading\" />\r\n <Search v-else />\r\n </el-icon>\r\n </span>\r\n </template>\r\n </el-input>\r\n</template>\r\n\r\n<script lang=\"ts\" setup>\r\nimport { Loading, Search } from '@element-plus/icons-vue'\r\nimport { ElIcon, ElInput } from 'element-plus'\r\nimport { computed, ref, watch } from 'vue'\r\nimport { useNamespace } from '@falcon-ui/utils'\r\nimport type { FlInputSearchMappedResult, FlInputSearchValue } from './input-search'\r\nimport { flInputSearchEmits, flInputSearchProps } from './input-search'\r\n\r\ndefineOptions({\r\n name: 'FlInputSearch',\r\n inheritAttrs: false\r\n})\r\n\r\ntype ElInputExpose = {\r\n blur: () => void\r\n clear: () => void\r\n focus: () => void\r\n}\r\n\r\nconst props = defineProps(flInputSearchProps)\r\nconst emit = defineEmits(flInputSearchEmits)\r\nconst ns = useNamespace('input-search')\r\n\r\nconst inputRef = ref<ElInputExpose | null>(null)\r\nconst innerLabel = ref(props.label)\r\nconst isLoading = ref(false)\r\nconst latestSearchToken = ref(0)\r\nconst lastValidLabel = ref(props.label)\r\nconst lastValidValue = ref<FlInputSearchValue>(props.modelValue)\r\n\r\nconst inputClass = computed(() => [\r\n ns.b(),\r\n {\r\n 'is-error': props.isError,\r\n 'is-table': props.isTable\r\n }\r\n])\r\n\r\nconst searchTriggerClass = ns.e('trigger')\r\n\r\nconst normalizeLabel = (value: unknown): string => (typeof value === 'string' ? value : '')\r\n\r\nconst normalizeValue = (value: unknown): FlInputSearchValue => {\r\n if (value === null || typeof value === 'string' || typeof value === 'number') {\r\n return value\r\n }\r\n\r\n return null\r\n}\r\n\r\nconst syncSnapshot = (value: FlInputSearchValue, label: string) => {\r\n lastValidValue.value = value\r\n lastValidLabel.value = label\r\n}\r\n\r\nconst clearSelection = (reason: 'manual-empty' | 'blur-unconfirmed' | 'error') => {\r\n innerLabel.value = ''\r\n syncSnapshot(null, '')\r\n\r\n emit('update:modelValue', null)\r\n emit('update:label', '')\r\n emit('clear', { reason })\r\n}\r\n\r\nconst commitSelection = (result: FlInputSearchMappedResult) => {\r\n const nextValue = normalizeValue(result.value)\r\n const nextLabel = normalizeLabel(result.label)\r\n\r\n innerLabel.value = nextLabel\r\n syncSnapshot(nextValue, nextLabel)\r\n\r\n emit('update:modelValue', nextValue)\r\n emit('update:label', nextLabel)\r\n emit('selection-commit', {\r\n value: nextValue,\r\n label: nextLabel,\r\n source: 'enter'\r\n })\r\n}\r\n\r\nconst handleInput = (value: string) => {\r\n const nextLabel = normalizeLabel(value)\r\n innerLabel.value = nextLabel\r\n emit('update:label', nextLabel)\r\n}\r\n\r\nconst handleManualSearch = () => {\r\n emit('openDialog', {\r\n keyword: innerLabel.value.trim(),\r\n reason: 'manual'\r\n })\r\n}\r\n\r\nconst handleEnter = async () => {\r\n if (isLoading.value) {\r\n return\r\n }\r\n\r\n const keyword = innerLabel.value.trim()\r\n if (!keyword) {\r\n return\r\n }\r\n\r\n if (!props.fetchApi) {\r\n emit('openDialog', {\r\n keyword,\r\n reason: 'manual'\r\n })\r\n return\r\n }\r\n\r\n const currentToken = latestSearchToken.value + 1\r\n latestSearchToken.value = currentToken\r\n isLoading.value = true\r\n\r\n try {\r\n const response = await props.fetchApi(keyword)\r\n if (currentToken !== latestSearchToken.value) {\r\n return\r\n }\r\n\r\n const results = Array.isArray(response) ? response : []\r\n\r\n if (results.length === 1) {\r\n commitSelection(props.mapResult(results[0]))\r\n return\r\n }\r\n\r\n if (results.length > 1) {\r\n emit('openDialog', {\r\n keyword,\r\n reason: 'multi-match',\r\n results\r\n })\r\n }\r\n } catch (error) {\r\n if (currentToken !== latestSearchToken.value) {\r\n return\r\n }\r\n\r\n emit('search-error', {\r\n keyword,\r\n error\r\n })\r\n } finally {\r\n if (currentToken === latestSearchToken.value) {\r\n isLoading.value = false\r\n }\r\n }\r\n}\r\n\r\nconst handleNativeClear = () => {\r\n clearSelection('manual-empty')\r\n}\r\n\r\nconst handleBlur = () => {\r\n if (isLoading.value) {\r\n return\r\n }\r\n\r\n const currentLabel = innerLabel.value\r\n if (currentLabel === lastValidLabel.value) {\r\n return\r\n }\r\n\r\n if (!currentLabel) {\r\n clearSelection('manual-empty')\r\n return\r\n }\r\n\r\n if (props.clearOnBlurUnconfirmed) {\r\n clearSelection('blur-unconfirmed')\r\n }\r\n}\r\n\r\nconst focus = () => {\r\n inputRef.value?.focus()\r\n}\r\n\r\nconst blur = () => {\r\n inputRef.value?.blur()\r\n}\r\n\r\nconst clear = () => {\r\n inputRef.value?.clear()\r\n}\r\n\r\nwatch(\r\n () => props.label,\r\n (value) => {\r\n innerLabel.value = value\r\n }\r\n)\r\n\r\nwatch(\r\n () => props.modelValue,\r\n (value) => {\r\n if (value === lastValidValue.value) {\r\n return\r\n }\r\n\r\n syncSnapshot(normalizeValue(value), props.label)\r\n }\r\n)\r\n\r\nwatch(\r\n () => props.isError,\r\n (isError, previousIsError) => {\r\n if (isError && previousIsError !== true) {\r\n clearSelection('error')\r\n }\r\n },\r\n { immediate: true }\r\n)\r\n\r\ndefineExpose({\r\n focus,\r\n blur,\r\n clear\r\n})\r\n</script>\r\n","import InputSearch from './src/input-search.vue'\r\nimport { withInstall } from '@falcon-ui/utils'\r\n\r\nexport const FlInputSearch = withInstall(InputSearch)\r\n\r\nexport default FlInputSearch\r\n\r\nexport type {\r\n FlInputSearchClearPayload,\r\n FlInputSearchEmits,\r\n FlInputSearchFetchApi,\r\n FlInputSearchMappedResult,\r\n FlInputSearchMapResult,\r\n FlInputSearchOpenDialogPayload,\r\n FlInputSearchOpenDialogReason,\r\n FlInputSearchProps,\r\n FlInputSearchSearchErrorPayload,\r\n FlInputSearchSelectionCommitPayload,\r\n FlInputSearchValue,\r\n InputSearchEmits,\r\n InputSearchProps\r\n} from './src/input-search'\r\n"],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
2
|
+
const flInputSearchProps = {
|
|
3
|
+
modelValue: {
|
|
4
|
+
type: [String, Number],
|
|
5
|
+
default: null
|
|
6
|
+
},
|
|
7
|
+
label: {
|
|
8
|
+
type: String,
|
|
9
|
+
default: ""
|
|
10
|
+
},
|
|
11
|
+
fetchApi: {
|
|
12
|
+
type: Function,
|
|
13
|
+
default: void 0
|
|
14
|
+
},
|
|
15
|
+
mapResult: {
|
|
16
|
+
type: Function,
|
|
17
|
+
required: true
|
|
18
|
+
},
|
|
19
|
+
placeholder: {
|
|
20
|
+
type: String,
|
|
21
|
+
default: ""
|
|
22
|
+
},
|
|
23
|
+
disabled: {
|
|
24
|
+
type: Boolean,
|
|
25
|
+
default: false
|
|
26
|
+
},
|
|
27
|
+
clearable: {
|
|
28
|
+
type: Boolean,
|
|
29
|
+
default: false
|
|
30
|
+
},
|
|
31
|
+
isError: {
|
|
32
|
+
type: Boolean,
|
|
33
|
+
default: false
|
|
34
|
+
},
|
|
35
|
+
isTable: {
|
|
36
|
+
type: Boolean,
|
|
37
|
+
default: false
|
|
38
|
+
},
|
|
39
|
+
clearOnBlurUnconfirmed: {
|
|
40
|
+
type: Boolean,
|
|
41
|
+
default: true
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
const flInputSearchEmits = {
|
|
45
|
+
"update:modelValue": (value) => value === null || typeof value === "string" || typeof value === "number",
|
|
46
|
+
"update:label": (value) => typeof value === "string",
|
|
47
|
+
openDialog: (payload) => typeof payload.keyword === "string" && (payload.reason === "manual" || payload.reason === "multi-match") && (payload.results === void 0 || Array.isArray(payload.results)),
|
|
48
|
+
"selection-commit": (payload) => typeof payload.label === "string" && payload.source === "enter" && (payload.value === null || typeof payload.value === "string" || typeof payload.value === "number"),
|
|
49
|
+
"search-error": (payload) => typeof payload.keyword === "string",
|
|
50
|
+
clear: (payload) => payload.reason === "manual-empty" || payload.reason === "blur-unconfirmed" || payload.reason === "error"
|
|
51
|
+
};
|
|
52
|
+
exports.flInputSearchEmits = flInputSearchEmits;
|
|
53
|
+
exports.flInputSearchProps = flInputSearchProps;
|
|
54
|
+
|
|
55
|
+
//# sourceMappingURL=input-search.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input-search.cjs","names":[],"sources":["../../../../../../packages/components/input-search/src/input-search.ts"],"sourcesContent":["import type { ExtractPublicPropTypes, PropType } from 'vue'\r\n\r\nexport type FlInputSearchValue = string | number | null\r\n\r\nexport interface FlInputSearchMappedResult {\r\n label: string\r\n value: FlInputSearchValue\r\n}\r\n\r\nexport type FlInputSearchFetchApi = (keyword: string) => Promise<unknown[]>\r\nexport type FlInputSearchMapResult = (item: unknown) => FlInputSearchMappedResult\r\n\r\nexport const flInputSearchProps = {\r\n /**\r\n * 绑定值,通常为业务实体 ID。\r\n */\r\n modelValue: {\r\n type: [String, Number] as PropType<string | number | null>,\r\n default: null\r\n },\r\n /**\r\n * 输入框显示值(业务标签)。\r\n */\r\n label: {\r\n type: String,\r\n default: ''\r\n },\r\n /**\r\n * 回车检索方法。\r\n */\r\n fetchApi: {\r\n type: Function as PropType<FlInputSearchFetchApi>,\r\n default: undefined\r\n },\r\n /**\r\n * 外部结果映射方法,统一映射到 value/label。\r\n */\r\n mapResult: {\r\n type: Function as PropType<FlInputSearchMapResult>,\r\n required: true\r\n },\r\n /**\r\n * 占位提示文案。\r\n */\r\n placeholder: {\r\n type: String,\r\n default: ''\r\n },\r\n /**\r\n * 是否禁用输入。\r\n */\r\n disabled: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 是否显示清空按钮。\r\n */\r\n clearable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 是否进入错误态。\r\n */\r\n isError: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * 是否用于表格单元格输入。\r\n */\r\n isTable: {\r\n type: Boolean,\r\n default: false\r\n },\r\n /**\r\n * Blur 时未确认输入是否强制清空。\r\n */\r\n clearOnBlurUnconfirmed: {\r\n type: Boolean,\r\n default: true\r\n }\r\n} as const\r\n\r\nexport type FlInputSearchOpenDialogReason = 'manual' | 'multi-match'\r\n\r\nexport interface FlInputSearchOpenDialogPayload {\r\n keyword: string\r\n reason: FlInputSearchOpenDialogReason\r\n results?: unknown[]\r\n}\r\n\r\nexport interface FlInputSearchSelectionCommitPayload {\r\n label: string\r\n source: 'enter'\r\n value: FlInputSearchValue\r\n}\r\n\r\nexport interface FlInputSearchSearchErrorPayload {\r\n error: unknown\r\n keyword: string\r\n}\r\n\r\nexport interface FlInputSearchClearPayload {\r\n reason: 'manual-empty' | 'blur-unconfirmed' | 'error'\r\n}\r\n\r\nexport const flInputSearchEmits = {\r\n /**\r\n * 绑定值更新事件。\r\n */\r\n 'update:modelValue': (value: FlInputSearchValue) =>\r\n value === null || typeof value === 'string' || typeof value === 'number',\r\n /**\r\n * 显示值更新事件。\r\n */\r\n 'update:label': (value: string) => typeof value === 'string',\r\n /**\r\n * 触发外部弹窗占位事件。\r\n */\r\n openDialog: (payload: FlInputSearchOpenDialogPayload) =>\r\n typeof payload.keyword === 'string' &&\r\n (payload.reason === 'manual' || payload.reason === 'multi-match') &&\r\n (payload.results === undefined || Array.isArray(payload.results)),\r\n /**\r\n * 唯一结果选中提交事件。\r\n */\r\n 'selection-commit': (payload: FlInputSearchSelectionCommitPayload) =>\r\n typeof payload.label === 'string' &&\r\n payload.source === 'enter' &&\r\n (payload.value === null ||\r\n typeof payload.value === 'string' ||\r\n typeof payload.value === 'number'),\r\n /**\r\n * 回车检索失败事件。\r\n */\r\n 'search-error': (payload: FlInputSearchSearchErrorPayload) => typeof payload.keyword === 'string',\r\n /**\r\n * 清空行为事件。\r\n */\r\n clear: (payload: FlInputSearchClearPayload) =>\r\n payload.reason === 'manual-empty' ||\r\n payload.reason === 'blur-unconfirmed' ||\r\n payload.reason === 'error'\r\n} as const\r\n\r\nexport type FlInputSearchProps = ExtractPublicPropTypes<typeof flInputSearchProps>\r\nexport type FlInputSearchEmits = typeof flInputSearchEmits\r\n\r\nexport type InputSearchProps = FlInputSearchProps\r\nexport type InputSearchEmits = FlInputSearchEmits\r\n"],"mappings":";AAYA,MAAa,qBAAqB;CAIhC,YAAY;EACV,MAAM,CAAC,QAAQ,OAAO;EACtB,SAAS;EACV;CAID,OAAO;EACL,MAAM;EACN,SAAS;EACV;CAID,UAAU;EACR,MAAM;EACN,SAAS,KAAA;EACV;CAID,WAAW;EACT,MAAM;EACN,UAAU;EACX;CAID,aAAa;EACX,MAAM;EACN,SAAS;EACV;CAID,UAAU;EACR,MAAM;EACN,SAAS;EACV;CAID,WAAW;EACT,MAAM;EACN,SAAS;EACV;CAID,SAAS;EACP,MAAM;EACN,SAAS;EACV;CAID,SAAS;EACP,MAAM;EACN,SAAS;EACV;CAID,wBAAwB;EACtB,MAAM;EACN,SAAS;EACV;CACF;AAyBD,MAAa,qBAAqB;CAIhC,sBAAsB,UACpB,UAAU,QAAQ,OAAO,UAAU,YAAY,OAAO,UAAU;CAIlE,iBAAiB,UAAkB,OAAO,UAAU;CAIpD,aAAa,YACX,OAAO,QAAQ,YAAY,aAC1B,QAAQ,WAAW,YAAY,QAAQ,WAAW,mBAClD,QAAQ,YAAY,KAAA,KAAa,MAAM,QAAQ,QAAQ,QAAQ;CAIlE,qBAAqB,YACnB,OAAO,QAAQ,UAAU,YACzB,QAAQ,WAAW,YAClB,QAAQ,UAAU,QACjB,OAAO,QAAQ,UAAU,YACzB,OAAO,QAAQ,UAAU;CAI7B,iBAAiB,YAA6C,OAAO,QAAQ,YAAY;CAIzF,QAAQ,YACN,QAAQ,WAAW,kBACnB,QAAQ,WAAW,sBACnB,QAAQ,WAAW;CACtB"}
|