jky-component-lib 0.0.64 → 0.0.67

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.
Files changed (71) hide show
  1. package/dist/es/components.d.ts +1 -0
  2. package/dist/es/components.js +4 -1
  3. package/dist/es/form/Form.vue.d.ts +10 -6
  4. package/dist/es/form/Form.vue.js +131 -81
  5. package/dist/es/form/FormItem.vue.js +55 -3
  6. package/dist/es/form/SelectTable.vue.d.ts +38 -0
  7. package/dist/es/form/SelectTable.vue.js +217 -0
  8. package/dist/es/form/SelectTable.vue3.js +5 -0
  9. package/dist/es/form/style.css +56 -0
  10. package/dist/es/index.js +15 -0
  11. package/dist/es/package.json.js +1 -1
  12. package/dist/es/page-header/PageHeader.vue.js +2 -2
  13. package/dist/es/page-header/PopoverMenu.vue.js +2 -2
  14. package/dist/es/page-layout/PageLayout.vue.js +1 -1
  15. package/dist/es/page-layout/style.css +2 -0
  16. package/dist/es/page-table/PageTable.vue.d.ts +44 -28
  17. package/dist/es/page-table/PageTable.vue.js +91 -25
  18. package/dist/es/page-table/style.css +9 -1
  19. package/dist/es/style.css +164 -26
  20. package/dist/es/styles.css +1 -1
  21. package/dist/es/tabs/TabContent.vue.d.ts +16 -0
  22. package/dist/es/tabs/TabContent.vue.js +65 -0
  23. package/dist/es/tabs/TabContent.vue3.js +5 -0
  24. package/dist/es/tabs/Tabs.vue.d.ts +46 -0
  25. package/dist/es/tabs/Tabs.vue.js +275 -0
  26. package/dist/es/tabs/Tabs.vue3.js +5 -0
  27. package/dist/es/tabs/index.d.ts +9 -0
  28. package/dist/es/tabs/index.js +8 -0
  29. package/dist/es/tabs/routeListener.d.ts +19 -0
  30. package/dist/es/tabs/routeListener.js +26 -0
  31. package/dist/es/tabs/style.css +29 -0
  32. package/dist/es/tabs/useTabs.d.ts +27 -0
  33. package/dist/es/tabs/useTabs.js +59 -0
  34. package/dist/es/tabs/useTabsStore.d.ts +53 -0
  35. package/dist/es/tabs/useTabsStore.js +208 -0
  36. package/dist/lib/components.d.ts +1 -0
  37. package/dist/lib/components.js +4 -1
  38. package/dist/lib/form/Form.vue.d.ts +10 -6
  39. package/dist/lib/form/Form.vue.js +129 -79
  40. package/dist/lib/form/FormItem.vue.js +54 -2
  41. package/dist/lib/form/SelectTable.vue.d.ts +38 -0
  42. package/dist/lib/form/SelectTable.vue.js +217 -0
  43. package/dist/lib/form/SelectTable.vue3.js +5 -0
  44. package/dist/lib/form/style.css +56 -0
  45. package/dist/lib/index.js +15 -0
  46. package/dist/lib/package.json.js +1 -1
  47. package/dist/lib/page-header/PageHeader.vue.js +3 -3
  48. package/dist/lib/page-header/PopoverMenu.vue.js +2 -2
  49. package/dist/lib/page-layout/PageLayout.vue.js +1 -1
  50. package/dist/lib/page-layout/style.css +2 -0
  51. package/dist/lib/page-table/PageTable.vue.d.ts +44 -28
  52. package/dist/lib/page-table/PageTable.vue.js +90 -24
  53. package/dist/lib/page-table/style.css +9 -1
  54. package/dist/lib/style.css +164 -26
  55. package/dist/lib/styles.css +1 -1
  56. package/dist/lib/tabs/TabContent.vue.d.ts +16 -0
  57. package/dist/lib/tabs/TabContent.vue.js +65 -0
  58. package/dist/lib/tabs/TabContent.vue3.js +5 -0
  59. package/dist/lib/tabs/Tabs.vue.d.ts +46 -0
  60. package/dist/lib/tabs/Tabs.vue.js +275 -0
  61. package/dist/lib/tabs/Tabs.vue3.js +5 -0
  62. package/dist/lib/tabs/index.d.ts +9 -0
  63. package/dist/lib/tabs/index.js +8 -0
  64. package/dist/lib/tabs/routeListener.d.ts +19 -0
  65. package/dist/lib/tabs/routeListener.js +26 -0
  66. package/dist/lib/tabs/style.css +29 -0
  67. package/dist/lib/tabs/useTabs.d.ts +27 -0
  68. package/dist/lib/tabs/useTabs.js +59 -0
  69. package/dist/lib/tabs/useTabsStore.d.ts +53 -0
  70. package/dist/lib/tabs/useTabsStore.js +208 -0
  71. package/package.json +10 -2
@@ -0,0 +1,208 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __getOwnPropSymbols = Object.getOwnPropertySymbols;
3
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
4
+ var __propIsEnum = Object.prototype.propertyIsEnumerable;
5
+ var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
6
+ var __spreadValues = (a, b) => {
7
+ for (var prop in b || (b = {}))
8
+ if (__hasOwnProp.call(b, prop))
9
+ __defNormalProp(a, prop, b[prop]);
10
+ if (__getOwnPropSymbols)
11
+ for (var prop of __getOwnPropSymbols(b)) {
12
+ if (__propIsEnum.call(b, prop))
13
+ __defNormalProp(a, prop, b[prop]);
14
+ }
15
+ return a;
16
+ };
17
+ import { defineStore } from "pinia";
18
+ import { ref, shallowRef, computed, inject } from "vue";
19
+ const PERSIST_KEY_SYMBOL = Symbol("jky-tabs-persist-key");
20
+ const DEFAULT_PERSIST_KEY = "jky-tabs-state";
21
+ function getPersistConfig(persist, persistKey) {
22
+ const injectedPersistKey = inject(PERSIST_KEY_SYMBOL, void 0);
23
+ const finalPersistKey = injectedPersistKey || persistKey || DEFAULT_PERSIST_KEY;
24
+ return {
25
+ enabled: persist !== void 0 ? persist : false,
26
+ key: finalPersistKey
27
+ };
28
+ }
29
+ function loadFromStorage(key) {
30
+ try {
31
+ const stored = localStorage.getItem(key);
32
+ if (stored) {
33
+ return JSON.parse(stored);
34
+ }
35
+ } catch (error) {
36
+ console.warn("Failed to load tabs from storage:", error);
37
+ }
38
+ return null;
39
+ }
40
+ function saveToStorage(key, data) {
41
+ try {
42
+ localStorage.setItem(key, JSON.stringify(data));
43
+ } catch (error) {
44
+ console.warn("Failed to save tabs to storage:", error);
45
+ }
46
+ }
47
+ function createTabsStore(persist, persistKey) {
48
+ const persistConfig = getPersistConfig(persist, persistKey);
49
+ const initialData = persistConfig.enabled ? loadFromStorage(persistConfig.key) : null;
50
+ const store = defineStore("jky-tabs", () => {
51
+ const tabList = ref((initialData == null ? void 0 : initialData.tabList) || []);
52
+ const activeTab = ref((initialData == null ? void 0 : initialData.activeTab) || "");
53
+ const cacheTabs = shallowRef((initialData == null ? void 0 : initialData.cacheTabs) || []);
54
+ const closedTabs = shallowRef((initialData == null ? void 0 : initialData.closedTabs) || []);
55
+ const cacheSet = computed(() => new Set(cacheTabs.value));
56
+ const closedSet = computed(() => new Set(closedTabs.value));
57
+ function persistState() {
58
+ if (!persistConfig.enabled)
59
+ return;
60
+ saveToStorage(persistConfig.key, {
61
+ tabList: tabList.value,
62
+ activeTab: activeTab.value,
63
+ cacheTabs: cacheTabs.value,
64
+ closedTabs: closedTabs.value
65
+ });
66
+ }
67
+ function addTab(tab) {
68
+ const index = tabList.value.findIndex((t) => t.name === tab.name);
69
+ if (index !== -1) {
70
+ tabList.value[index] = __spreadValues(__spreadValues({}, tabList.value[index]), tab);
71
+ } else {
72
+ tabList.value.push(tab);
73
+ }
74
+ persistState();
75
+ }
76
+ function updateTab(name, tab) {
77
+ const index = tabList.value.findIndex((t) => t.name === name);
78
+ if (index !== -1) {
79
+ tabList.value[index] = __spreadValues(__spreadValues({}, tabList.value[index]), tab);
80
+ persistState();
81
+ }
82
+ }
83
+ function removeTab(name) {
84
+ const index = tabList.value.findIndex((t) => t.name === name);
85
+ if (index !== -1) {
86
+ tabList.value.splice(index, 1);
87
+ removeCache(name);
88
+ if (activeTab.value === name && tabList.value.length > 0) {
89
+ const nextTab = tabList.value[index] || tabList.value[index - 1];
90
+ if (nextTab) {
91
+ activeTab.value = nextTab.name;
92
+ }
93
+ }
94
+ persistState();
95
+ }
96
+ }
97
+ function setActiveTab(name) {
98
+ activeTab.value = name;
99
+ persistState();
100
+ }
101
+ function addCache(name) {
102
+ if (!cacheSet.value.has(name)) {
103
+ cacheTabs.value = [...cacheTabs.value, name];
104
+ persistState();
105
+ }
106
+ }
107
+ function removeCache(name) {
108
+ cacheTabs.value = cacheTabs.value.filter((t) => t !== name);
109
+ persistState();
110
+ }
111
+ function bulkRemove(names) {
112
+ tabList.value = tabList.value.filter((tab) => !names.includes(tab.name));
113
+ names.forEach((name) => removeCache(name));
114
+ persistState();
115
+ }
116
+ function closeLeft(name) {
117
+ const index = tabList.value.findIndex((t) => t.name === name);
118
+ if (index > 0) {
119
+ const leftTabs = tabList.value.slice(0, index);
120
+ const removableTabs = leftTabs.filter((tab) => !tab.affix);
121
+ bulkRemove(removableTabs.map((tab) => tab.name));
122
+ }
123
+ }
124
+ function closeRight(name) {
125
+ const index = tabList.value.findIndex((t) => t.name === name);
126
+ if (index >= 0 && index < tabList.value.length - 1) {
127
+ const rightTabs = tabList.value.slice(index + 1);
128
+ const removableTabs = rightTabs.filter((tab) => !tab.affix);
129
+ bulkRemove(removableTabs.map((tab) => tab.name));
130
+ }
131
+ }
132
+ function closeOther(name) {
133
+ const removableTabs = tabList.value.filter(
134
+ (tab) => tab.name !== name && !tab.affix
135
+ );
136
+ bulkRemove(removableTabs.map((tab) => tab.name));
137
+ }
138
+ function closeAll() {
139
+ const removableTabs = tabList.value.filter((tab) => !tab.affix);
140
+ bulkRemove(removableTabs.map((tab) => tab.name));
141
+ }
142
+ function refresh(name) {
143
+ removeCache(name);
144
+ setTimeout(() => {
145
+ addCache(name);
146
+ }, 0);
147
+ }
148
+ function getTabList() {
149
+ return [...tabList.value];
150
+ }
151
+ function getCacheTabs() {
152
+ return [...cacheTabs.value];
153
+ }
154
+ function isClosed(name) {
155
+ return closedSet.value.has(name);
156
+ }
157
+ function isCached(name) {
158
+ return cacheSet.value.has(name);
159
+ }
160
+ function reset() {
161
+ tabList.value = [];
162
+ activeTab.value = "";
163
+ cacheTabs.value = [];
164
+ closedTabs.value = [];
165
+ persistState();
166
+ }
167
+ return {
168
+ tabList,
169
+ activeTab,
170
+ cacheTabs,
171
+ closedTabs,
172
+ addTab,
173
+ updateTab,
174
+ removeTab,
175
+ setActiveTab,
176
+ addCache,
177
+ removeCache,
178
+ bulkRemove,
179
+ closeLeft,
180
+ closeRight,
181
+ closeOther,
182
+ closeAll,
183
+ refresh,
184
+ getTabList,
185
+ getCacheTabs,
186
+ isClosed,
187
+ isCached,
188
+ reset
189
+ };
190
+ });
191
+ return store();
192
+ }
193
+ const storeInstances = /* @__PURE__ */ new Map();
194
+ function useTabsStore(persist, persistKey) {
195
+ const key = persistKey || DEFAULT_PERSIST_KEY;
196
+ if (!storeInstances.has(key)) {
197
+ storeInstances.set(key, () => createTabsStore(persist, persistKey));
198
+ }
199
+ return storeInstances.get(key)();
200
+ }
201
+ function resetTabsStore() {
202
+ storeInstances.clear();
203
+ }
204
+ export {
205
+ createTabsStore,
206
+ resetTabsStore,
207
+ useTabsStore
208
+ };
@@ -10,5 +10,6 @@ export * from './page-layout';
10
10
  export * from './page-table';
11
11
  export * from './rich-editor';
12
12
  export * from './say-hello';
13
+ export * from './tabs';
13
14
  export declare const components: Plugin[];
14
15
  export default components;
@@ -11,6 +11,7 @@ const index$7 = require("./page-layout/index.js");
11
11
  const index$8 = require("./page-table/index.js");
12
12
  const index$9 = require("./rich-editor/index.js");
13
13
  const index$a = require("./say-hello/index.js");
14
+ const index$b = require("./tabs/index.js");
14
15
  const components = [
15
16
  index$a.JkySayHello,
16
17
  index$1.JkyButton,
@@ -22,7 +23,8 @@ const components = [
22
23
  index.JkyAddInput,
23
24
  index$9.JkyRichEditor,
24
25
  index$8.JkyPageTable,
25
- index$7.JkyPageLayout
26
+ index$7.JkyPageLayout,
27
+ index$b.JkyTabs
26
28
  ];
27
29
  exports.JkyAddInput = index.JkyAddInput;
28
30
  exports.JkyButton = index$1.JkyButton;
@@ -35,4 +37,5 @@ exports.JkyPageLayout = index$7.JkyPageLayout;
35
37
  exports.JkyPageTable = index$8.JkyPageTable;
36
38
  exports.JkyRichEditor = index$9.JkyRichEditor;
37
39
  exports.JkySayHello = index$a.JkySayHello;
40
+ exports.JkyTabs = index$b.JkyTabs;
38
41
  exports.components = components;
@@ -88,7 +88,7 @@ declare function getFormInstance(): ({
88
88
  validateOnRuleChange: boolean;
89
89
  }> & Omit<Readonly<import('element-plus').FormProps> & Readonly<{
90
90
  onValidate?: ((prop: import('element-plus').FormItemProp, isValid: boolean, message: string) => any) | undefined;
91
- }>, "labelWidth" | "labelPosition" | "showMessage" | "validate" | "clearValidate" | "requireAsteriskPosition" | "labelSuffix" | "validateOnRuleChange" | "scrollIntoViewOptions" | "validateField" | "resetFields" | "scrollToField" | "getField" | "fields" | "setInitialValues"> & import('vue').ShallowUnwrapRef<{
91
+ }>, "labelPosition" | "requireAsteriskPosition" | "labelWidth" | "labelSuffix" | "showMessage" | "validateOnRuleChange" | "scrollIntoViewOptions" | "validate" | "validateField" | "resetFields" | "clearValidate" | "scrollToField" | "getField" | "fields" | "setInitialValues"> & import('vue').ShallowUnwrapRef<{
92
92
  validate: (callback?: import('element-plus').FormValidateCallback) => import('element-plus').FormValidationResult;
93
93
  validateField: (props?: import('element-plus/es/utils').Arrayable<import('element-plus').FormItemProp>, callback?: import('element-plus').FormValidateCallback) => import('element-plus').FormValidationResult;
94
94
  resetFields: (props?: import('element-plus/es/utils').Arrayable<import('element-plus').FormItemProp>) => void;
@@ -195,7 +195,7 @@ declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {
195
195
  validateOnRuleChange: boolean;
196
196
  }> & Omit<Readonly<import('element-plus').FormProps> & Readonly<{
197
197
  onValidate?: ((prop: import('element-plus').FormItemProp, isValid: boolean, message: string) => any) | undefined;
198
- }>, "labelWidth" | "labelPosition" | "showMessage" | "validate" | "clearValidate" | "requireAsteriskPosition" | "labelSuffix" | "validateOnRuleChange" | "scrollIntoViewOptions" | "validateField" | "resetFields" | "scrollToField" | "getField" | "fields" | "setInitialValues"> & import('vue').ShallowUnwrapRef<{
198
+ }>, "labelPosition" | "requireAsteriskPosition" | "labelWidth" | "labelSuffix" | "showMessage" | "validateOnRuleChange" | "scrollIntoViewOptions" | "validate" | "validateField" | "resetFields" | "clearValidate" | "scrollToField" | "getField" | "fields" | "setInitialValues"> & import('vue').ShallowUnwrapRef<{
199
199
  validate: (callback?: import('element-plus').FormValidateCallback) => import('element-plus').FormValidationResult;
200
200
  validateField: (props?: import('element-plus/es/utils').Arrayable<import('element-plus').FormItemProp>, callback?: import('element-plus').FormValidateCallback) => import('element-plus').FormValidationResult;
201
201
  resetFields: (props?: import('element-plus/es/utils').Arrayable<import('element-plus').FormItemProp>) => void;
@@ -293,7 +293,7 @@ declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {
293
293
  validateOnRuleChange: boolean;
294
294
  }> & Omit<Readonly<import('element-plus').FormProps> & Readonly<{
295
295
  onValidate?: ((prop: import('element-plus').FormItemProp, isValid: boolean, message: string) => any) | undefined;
296
- }>, "labelWidth" | "labelPosition" | "showMessage" | "validate" | "clearValidate" | "requireAsteriskPosition" | "labelSuffix" | "validateOnRuleChange" | "scrollIntoViewOptions" | "validateField" | "resetFields" | "scrollToField" | "getField" | "fields" | "setInitialValues"> & import('vue').ShallowUnwrapRef<{
296
+ }>, "labelPosition" | "requireAsteriskPosition" | "labelWidth" | "labelSuffix" | "showMessage" | "validateOnRuleChange" | "scrollIntoViewOptions" | "validate" | "validateField" | "resetFields" | "clearValidate" | "scrollToField" | "getField" | "fields" | "setInitialValues"> & import('vue').ShallowUnwrapRef<{
297
297
  validate: (callback?: import('element-plus').FormValidateCallback) => import('element-plus').FormValidationResult;
298
298
  validateField: (props?: import('element-plus/es/utils').Arrayable<import('element-plus').FormItemProp>, callback?: import('element-plus').FormValidateCallback) => import('element-plus').FormValidationResult;
299
299
  resetFields: (props?: import('element-plus/es/utils').Arrayable<import('element-plus').FormItemProp>) => void;
@@ -327,16 +327,20 @@ declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {
327
327
  }) => any) | undefined;
328
328
  }>, {
329
329
  size: import('element-plus').ComponentSize;
330
- labelWidth: string | number;
330
+ grid: import('./types').GridConfig;
331
+ inline: boolean;
331
332
  labelPosition: "left" | "right" | "top";
332
- showFooter: boolean;
333
+ labelWidth: string | number;
333
334
  showTitle: boolean;
334
335
  gutter: number;
335
336
  defaultSpan: number;
336
337
  responsive: boolean;
337
338
  watchDeep: boolean;
339
+ showFooter: boolean;
340
+ footerClass: string;
338
341
  submitText: string;
339
342
  cancelText: string;
343
+ showCount: number;
340
344
  }, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {
341
345
  formRef: ({
342
346
  $: import('vue').ComponentInternalInstance;
@@ -423,7 +427,7 @@ declare const _default: import('vue').DefineComponent<__VLS_PublicProps, {
423
427
  validateOnRuleChange: boolean;
424
428
  }> & Omit<Readonly<import('element-plus').FormProps> & Readonly<{
425
429
  onValidate?: ((prop: import('element-plus').FormItemProp, isValid: boolean, message: string) => any) | undefined;
426
- }>, "labelWidth" | "labelPosition" | "showMessage" | "validate" | "clearValidate" | "requireAsteriskPosition" | "labelSuffix" | "validateOnRuleChange" | "scrollIntoViewOptions" | "validateField" | "resetFields" | "scrollToField" | "getField" | "fields" | "setInitialValues"> & import('vue').ShallowUnwrapRef<{
430
+ }>, "labelPosition" | "requireAsteriskPosition" | "labelWidth" | "labelSuffix" | "showMessage" | "validateOnRuleChange" | "scrollIntoViewOptions" | "validate" | "validateField" | "resetFields" | "clearValidate" | "scrollToField" | "getField" | "fields" | "setInitialValues"> & import('vue').ShallowUnwrapRef<{
427
431
  validate: (callback?: import('element-plus').FormValidateCallback) => import('element-plus').FormValidationResult;
428
432
  validateField: (props?: import('element-plus/es/utils').Arrayable<import('element-plus').FormItemProp>, callback?: import('element-plus').FormValidateCallback) => import('element-plus').FormValidationResult;
429
433
  resetFields: (props?: import('element-plus/es/utils').Arrayable<import('element-plus').FormItemProp>) => void;
@@ -59,10 +59,6 @@ const _hoisted_1 = {
59
59
  key: 0,
60
60
  class: "jky-form__title mb-4 text-xl font-semibold"
61
61
  };
62
- const _hoisted_2 = {
63
- key: 1,
64
- class: "jky-form__footer mt-6 flex justify-end gap-2"
65
- };
66
62
  const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValues({}, {
67
63
  name: "JkyForm",
68
64
  inheritAttrs: false
@@ -76,15 +72,18 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
76
72
  gutter: { default: 0 },
77
73
  defaultSpan: { default: 24 },
78
74
  responsive: { type: Boolean, default: true },
75
+ grid: { type: [Boolean, Object], default: false },
79
76
  className: {},
80
77
  readonly: { type: Boolean },
81
78
  disabled: { type: Boolean },
82
79
  watchDeep: { type: Boolean, default: true },
83
- showFooter: { type: Boolean, default: false },
80
+ showFooter: { type: Boolean, default: true },
81
+ footerClass: { default: "" },
84
82
  submitText: { default: "提交" },
85
83
  cancelText: { default: "取消" },
86
84
  submitDisabled: { type: Boolean },
87
85
  cancelDisabled: { type: Boolean },
86
+ showCount: { default: 999 },
88
87
  onValidate: {},
89
88
  onSubmit: {},
90
89
  onReset: {},
@@ -94,7 +93,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
94
93
  requireAsteriskPosition: {},
95
94
  labelWidth: { default: "100" },
96
95
  labelSuffix: {},
97
- inline: { type: Boolean },
96
+ inline: { type: Boolean, default: false },
98
97
  inlineMessage: { type: Boolean },
99
98
  statusIcon: { type: Boolean },
100
99
  showMessage: { type: Boolean },
@@ -112,57 +111,83 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
112
111
  const props = __props;
113
112
  const emit = __emit;
114
113
  const modelValue = vue.useModel(__props, "modelValue");
114
+ vue.provide("formModel", modelValue);
115
115
  const formRef = vue.ref();
116
+ const attrs = vue.useAttrs();
117
+ const JKY_FORM_PROPS = [
118
+ "modelValue",
119
+ "items",
120
+ "showTitle",
121
+ "title",
122
+ "gutter",
123
+ "defaultSpan",
124
+ "responsive",
125
+ "readonly",
126
+ "disabled",
127
+ "watchDeep",
128
+ "showFooter",
129
+ "footerClass",
130
+ "submitText",
131
+ "cancelText",
132
+ "submitDisabled",
133
+ "cancelDisabled",
134
+ "onValidate",
135
+ "onSubmit",
136
+ "onReset",
137
+ "className",
138
+ "grid",
139
+ "showCount"
140
+ ];
141
+ const elFormProps = vue.computed(() => {
142
+ const formProps = Object.fromEntries(
143
+ Object.entries(props).filter(([key]) => !JKY_FORM_PROPS.includes(key))
144
+ );
145
+ const _a = attrs, { class: _, style } = _a, restAttrs = __objRest(_a, ["class", "style"]);
146
+ return __spreadValues(__spreadValues({}, formProps), restAttrs);
147
+ });
116
148
  const formClass = vue.computed(() => {
117
149
  return [
118
- "jky-form"
150
+ "jky-form",
151
+ attrs.class
119
152
  ].filter(Boolean).join(" ");
120
153
  });
121
- const attrs = vue.useAttrs();
122
- const elFormProps = vue.computed(() => {
123
- const _a = props, {
124
- modelValue: modelValue2,
125
- items,
126
- showTitle,
127
- title,
128
- gutter,
129
- defaultSpan,
130
- responsive,
131
- readonly,
132
- disabled,
133
- watchDeep,
134
- showFooter,
135
- submitText,
136
- cancelText,
137
- submitDisabled,
138
- cancelDisabled,
139
- onValidate,
140
- onSubmit,
141
- onReset
142
- } = _a, rest = __objRest(_a, [
143
- // JkyForm 自己的 props(不传递给 ElForm)
144
- "modelValue",
145
- "items",
146
- "showTitle",
147
- "title",
148
- "gutter",
149
- "defaultSpan",
150
- "responsive",
151
- "readonly",
152
- "disabled",
153
- "watchDeep",
154
- "showFooter",
155
- "submitText",
156
- "cancelText",
157
- "submitDisabled",
158
- "cancelDisabled",
159
- "onValidate",
160
- "onSubmit",
161
- "onReset"
162
- ]);
163
- const _b = rest, { model } = _b, formProps = __objRest(_b, ["model"]);
164
- return __spreadValues(__spreadValues({}, formProps), attrs);
154
+ const _elFormClass = vue.computed(() => {
155
+ const classes = [];
156
+ if (props.inline && props.grid) {
157
+ classes.push("jky-form--grid");
158
+ }
159
+ return classes;
160
+ });
161
+ const _gridStyle = vue.computed(() => {
162
+ if (!props.inline || !props.grid || typeof props.grid === "boolean") {
163
+ return {};
164
+ }
165
+ const style = {};
166
+ const breakpoints = ["xs", "sm", "md", "lg", "xl", "2xl", "3xl"];
167
+ breakpoints.forEach((breakpoint) => {
168
+ const columns = props.grid[breakpoint];
169
+ if (columns !== void 0) {
170
+ style[`--jky-form-grid-cols-${breakpoint}`] = columns;
171
+ }
172
+ });
173
+ return style;
174
+ });
175
+ const showAllItems = vue.ref(false);
176
+ const visibleItems = vue.computed(() => {
177
+ if (!props.items || props.items.length <= props.showCount) {
178
+ return props.items;
179
+ }
180
+ if (showAllItems.value) {
181
+ return props.items;
182
+ }
183
+ return props.items.slice(0, props.showCount);
165
184
  });
185
+ const showMoreButton = vue.computed(() => {
186
+ return props.items && props.items.length > props.showCount;
187
+ });
188
+ function toggleShowMore() {
189
+ showAllItems.value = !showAllItems.value;
190
+ }
166
191
  vue.watch(
167
192
  () => props.modelValue,
168
193
  (newVal, oldVal) => {
@@ -229,11 +254,14 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
229
254
  __props.showTitle && __props.title ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1, vue.toDisplayString(__props.title), 1)) : vue.createCommentVNode("", true),
230
255
  vue.createVNode(vue.unref(ElementPlus.ElForm), vue.mergeProps({
231
256
  ref_key: "formRef",
232
- ref: formRef,
233
- model: modelValue.value
234
- }, elFormProps.value), {
257
+ ref: formRef
258
+ }, elFormProps.value, {
259
+ model: modelValue.value,
260
+ class: _elFormClass.value,
261
+ style: _gridStyle.value
262
+ }), {
235
263
  default: vue.withCtx(() => [
236
- (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(__props.items, (item) => {
264
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(visibleItems.value, (item) => {
237
265
  return vue.openBlock(), vue.createBlock(FormItem_vue_vue_type_script_setup_true_lang.default, {
238
266
  key: item.field,
239
267
  field: item.field,
@@ -242,32 +270,54 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
242
270
  readonly: __props.readonly,
243
271
  disabled: __props.disabled
244
272
  }, null, 8, ["field", "config", "model", "readonly", "disabled"]);
245
- }), 128))
273
+ }), 128)),
274
+ showMoreButton.value || props.showFooter ? (vue.openBlock(), vue.createBlock(vue.unref(ElementPlus.ElFormItem), {
275
+ key: 0,
276
+ "label-width": 0
277
+ }, {
278
+ default: vue.withCtx(() => [
279
+ vue.createElementVNode("div", {
280
+ class: vue.normalizeClass(["w-full flex gap-2", [props.grid && props.inline ? "justify-center" : "justify-end", props.footerClass]])
281
+ }, [
282
+ showMoreButton.value ? (vue.openBlock(), vue.createBlock(vue.unref(ElementPlus.ElButton), {
283
+ key: 0,
284
+ type: "primary",
285
+ onClick: toggleShowMore
286
+ }, {
287
+ default: vue.withCtx(() => [
288
+ vue.createTextVNode(vue.toDisplayString(showAllItems.value ? "收起" : `展开 (${props.items.length - props.showCount})`), 1)
289
+ ]),
290
+ _: 1
291
+ })) : vue.createCommentVNode("", true),
292
+ props.showFooter ? (vue.openBlock(), vue.createElementBlock(vue.Fragment, { key: 1 }, [
293
+ vue.createVNode(vue.unref(ElementPlus.ElButton), {
294
+ disabled: __props.cancelDisabled || __props.disabled,
295
+ onClick: handleCancel
296
+ }, {
297
+ default: vue.withCtx(() => [
298
+ vue.createTextVNode(vue.toDisplayString(__props.cancelText), 1)
299
+ ]),
300
+ _: 1
301
+ }, 8, ["disabled"]),
302
+ vue.createVNode(vue.unref(ElementPlus.ElButton), {
303
+ type: "primary",
304
+ disabled: __props.submitDisabled || __props.disabled,
305
+ loading: false,
306
+ onClick: handleSubmit
307
+ }, {
308
+ default: vue.withCtx(() => [
309
+ vue.createTextVNode(vue.toDisplayString(__props.submitText), 1)
310
+ ]),
311
+ _: 1
312
+ }, 8, ["disabled"])
313
+ ], 64)) : vue.createCommentVNode("", true)
314
+ ], 2)
315
+ ]),
316
+ _: 1
317
+ })) : vue.createCommentVNode("", true)
246
318
  ]),
247
319
  _: 1
248
- }, 16, ["model"]),
249
- props.showFooter ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_2, [
250
- vue.createVNode(vue.unref(ElementPlus.ElButton), {
251
- disabled: __props.cancelDisabled || __props.disabled,
252
- onClick: handleCancel
253
- }, {
254
- default: vue.withCtx(() => [
255
- vue.createTextVNode(vue.toDisplayString(__props.cancelText), 1)
256
- ]),
257
- _: 1
258
- }, 8, ["disabled"]),
259
- vue.createVNode(vue.unref(ElementPlus.ElButton), {
260
- type: "primary",
261
- disabled: __props.submitDisabled || __props.disabled,
262
- loading: false,
263
- onClick: handleSubmit
264
- }, {
265
- default: vue.withCtx(() => [
266
- vue.createTextVNode(vue.toDisplayString(__props.submitText), 1)
267
- ]),
268
- _: 1
269
- }, 8, ["disabled"])
270
- ])) : vue.createCommentVNode("", true)
320
+ }, 16, ["model", "class", "style"])
271
321
  ], 2);
272
322
  };
273
323
  }
@@ -57,6 +57,8 @@ const ElementPlus = require("element-plus");
57
57
  const index = require("../add-input/index.js");
58
58
  const index$2 = require("../code-mirror-editor/index.js");
59
59
  const index$1 = require("../rich-editor/index.js");
60
+ const SelectTable_vue_vue_type_script_setup_true_lang = require("./SelectTable.vue.js");
61
+ ;/* empty css */
60
62
  const _hoisted_1 = {
61
63
  key: 0,
62
64
  style: { "display": "none" }
@@ -211,7 +213,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
211
213
  default: () => props.config.children || null
212
214
  });
213
215
  }
214
- const commonProps = __spreadValues({
216
+ const commonProps = __spreadProps(__spreadValues({
215
217
  // use `undefined` to fix placeholder issue
216
218
  "modelValue": modelValue.value || void 0,
217
219
  "onUpdate:modelValue": (val) => {
@@ -220,7 +222,9 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
220
222
  "placeholder": props.config.placeholder || void 0,
221
223
  "disabled": props.disabled,
222
224
  "clearable": props.config.clearable
223
- }, componentProps.value);
225
+ }, componentProps.value), {
226
+ "class": ["w-full min-w-25", componentProps.value.class]
227
+ });
224
228
  switch (type) {
225
229
  case "input":
226
230
  return vue.h(ElementPlus.ElInput, __spreadProps(__spreadValues({}, commonProps), {
@@ -317,6 +321,54 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
317
321
  }
318
322
  case "color-picker":
319
323
  return vue.h(ElementPlus.ElColorPicker, __spreadValues(__spreadValues({}, commonProps), componentProps.value));
324
+ // 颜色选择器面板
325
+ case "color-picker-panel":
326
+ return vue.h(ElementPlus.ElColorPickerPanel, __spreadValues(__spreadValues({}, commonProps), componentProps.value));
327
+ // 标签输入框
328
+ case "input-tag": {
329
+ const inputTagProps = __spreadValues(__spreadProps(__spreadValues({}, commonProps), {
330
+ "modelValue": modelValue.value || [],
331
+ "onUpdate:modelValue": (val) => {
332
+ props.model[props.field] = val;
333
+ }
334
+ }), componentProps.value);
335
+ return vue.h(ElementPlus.ElInputTag, inputTagProps);
336
+ }
337
+ // 提及组件
338
+ case "mention": {
339
+ const mentionProps = __spreadValues(__spreadProps(__spreadValues({}, commonProps), {
340
+ "modelValue": modelValue.value || "",
341
+ "onUpdate:modelValue": (val) => {
342
+ props.model[props.field] = val;
343
+ }
344
+ }), componentProps.value);
345
+ return vue.h(ElementPlus.ElMention, mentionProps);
346
+ }
347
+ // 虚拟化选择器
348
+ case "select-v2": {
349
+ const selectV2Props = __spreadValues(__spreadProps(__spreadValues({}, commonProps), {
350
+ "modelValue": modelValue.value,
351
+ "onUpdate:modelValue": (val) => {
352
+ props.model[props.field] = val;
353
+ },
354
+ "options": componentProps.value.options || []
355
+ }), componentProps.value);
356
+ return vue.h(ElementPlus.ElSelectV2, selectV2Props);
357
+ }
358
+ // 穿梭框
359
+ case "transfer": {
360
+ const transferProps = __spreadValues(__spreadProps(__spreadValues({}, commonProps), {
361
+ "modelValue": modelValue.value || [],
362
+ "onUpdate:modelValue": (val) => {
363
+ props.model[props.field] = val;
364
+ },
365
+ "data": componentProps.value.data || []
366
+ }), componentProps.value);
367
+ return vue.h(ElementPlus.ElTransfer, transferProps);
368
+ }
369
+ // 表格选择器
370
+ case "select-table":
371
+ return vue.h(SelectTable_vue_vue_type_script_setup_true_lang.default, __spreadValues(__spreadValues({}, commonProps), componentProps.value));
320
372
  case "rate":
321
373
  return vue.h(ElementPlus.ElRate, __spreadValues(__spreadValues({}, commonProps), componentProps.value));
322
374
  case "input-number": {