jky-component-lib 0.0.123 → 0.0.125

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.
@@ -1,14 +1,7 @@
1
- /* AMap 高德地图组件样式 */
2
- .jky-amap-container {
3
- /* 地图容器样式 */
4
- position: relative;
5
- overflow: hidden;
6
1
 
7
- /* 隐藏高德地图的 logo 和版权信息(注意:商业使用请遵守高德地图条款) */
8
- .amap-logo {
9
- display: none !important;
10
- }
11
- .amap-copyright {
12
- display: none !important;
13
- }
2
+ /* JkyAMarker 组件样式 - 参考高德官方示例 */
3
+ .amap-icon img,
4
+ .amap-marker-content img {
5
+ width: 25px;
6
+ height: 34px;
14
7
  }
@@ -1,7 +1,14 @@
1
+ /* AMap 高德地图组件样式 */
2
+ .jky-amap-container {
3
+ /* 地图容器样式 */
4
+ position: relative;
5
+ overflow: hidden;
1
6
 
2
- /* JkyAMarker 组件样式 - 参考高德官方示例 */
3
- .amap-icon img,
4
- .amap-marker-content img {
5
- width: 25px;
6
- height: 34px;
7
+ /* 隐藏高德地图的 logo 和版权信息(注意:商业使用请遵守高德地图条款) */
8
+ .amap-logo {
9
+ display: none !important;
10
+ }
11
+ .amap-copyright {
12
+ display: none !important;
13
+ }
7
14
  }
@@ -57,6 +57,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
57
57
  footerClass: { default: "" },
58
58
  submitText: { default: "提交" },
59
59
  cancelText: { default: "取消" },
60
+ submitIcon: {},
61
+ cancelIcon: {},
60
62
  submitDisabled: { type: Boolean, default: false },
61
63
  cancelDisabled: { type: Boolean, default: false },
62
64
  showCount: { default: 999 },
@@ -218,7 +220,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
218
220
  onClick: handleCancel
219
221
  }, {
220
222
  default: withCtx(() => [
221
- createTextVNode(toDisplayString(__props.cancelText), 1)
223
+ props.cancelIcon ? (openBlock(), createElementBlock("span", {
224
+ key: 0,
225
+ class: normalizeClass([props.cancelIcon, "mr-2"])
226
+ }, null, 2)) : createCommentVNode("", true),
227
+ createTextVNode(" " + toDisplayString(__props.cancelText), 1)
222
228
  ]),
223
229
  _: 1
224
230
  }, 8, ["disabled"]),
@@ -229,7 +235,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
229
235
  onClick: handleSubmit
230
236
  }, {
231
237
  default: withCtx(() => [
232
- createTextVNode(toDisplayString(__props.submitText), 1)
238
+ props.submitIcon ? (openBlock(), createElementBlock("span", {
239
+ key: 0,
240
+ class: normalizeClass([props.submitIcon, "mr-2"])
241
+ }, null, 2)) : createCommentVNode("", true),
242
+ createTextVNode(" " + toDisplayString(__props.submitText), 1)
233
243
  ]),
234
244
  _: 1
235
245
  }, 8, ["disabled"])
@@ -104,6 +104,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
104
104
  const props = __props;
105
105
  const loading = ref(false);
106
106
  const componentProps = ref({});
107
+ const rules = ref(null);
107
108
  function loadComponentProps() {
108
109
  return __async(this, null, function* () {
109
110
  const configProps = props.config.componentProps;
@@ -131,14 +132,43 @@ const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
131
132
  componentProps.value = configProps;
132
133
  });
133
134
  }
135
+ function loadRules() {
136
+ return __async(this, null, function* () {
137
+ const configRules = props.config.rules;
138
+ if (!configRules) {
139
+ rules.value = null;
140
+ return;
141
+ }
142
+ if (typeof configRules === "function") {
143
+ loading.value = true;
144
+ try {
145
+ const result = yield configRules({
146
+ model: props.model,
147
+ field: props.field,
148
+ $form: props.model
149
+ });
150
+ rules.value = result || null;
151
+ } catch (error) {
152
+ console.error("Failed to load rules:", error);
153
+ rules.value = null;
154
+ } finally {
155
+ loading.value = false;
156
+ }
157
+ return;
158
+ }
159
+ rules.value = configRules;
160
+ });
161
+ }
134
162
  watch(
135
163
  () => props.model,
136
164
  () => {
137
165
  loadComponentProps();
166
+ loadRules();
138
167
  },
139
168
  { deep: true }
140
169
  );
141
170
  loadComponentProps();
171
+ loadRules();
142
172
  const modelValue = computed({
143
173
  get: () => props.model[props.field],
144
174
  set: (val) => {
@@ -264,11 +294,20 @@ const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
264
294
  return h(ElAutocomplete, autocompleteProps, _componentSlotsObj);
265
295
  }
266
296
  case "datepicker":
267
- return h(ElDatePicker, __spreadValues(__spreadValues({}, commonProps), componentProps.value), _componentSlotsObj);
297
+ return h(ElDatePicker, __spreadValues(__spreadValues({
298
+ startPlaceholder: "开始日期",
299
+ endPlaceholder: "结束日期"
300
+ }, commonProps), componentProps.value), _componentSlotsObj);
268
301
  case "datetime-picker":
269
- return h(ElDatePicker, __spreadValues(__spreadValues({}, commonProps), componentProps.value), _componentSlotsObj);
302
+ return h(ElDatePicker, __spreadValues(__spreadValues({
303
+ startPlaceholder: "开始日期",
304
+ endPlaceholder: "结束日期"
305
+ }, commonProps), componentProps.value), _componentSlotsObj);
270
306
  case "time-picker":
271
- return h(ElTimePicker, __spreadValues(__spreadValues({}, commonProps), componentProps.value), _componentSlotsObj);
307
+ return h(ElTimePicker, __spreadValues(__spreadValues({
308
+ startPlaceholder: "开始时间",
309
+ endPlaceholder: "结束时间"
310
+ }, commonProps), componentProps.value), _componentSlotsObj);
272
311
  case "time-select":
273
312
  return h(ElTimeSelect, __spreadValues(__spreadValues({}, commonProps), componentProps.value), _componentSlotsObj);
274
313
  case "radio-group": {
@@ -508,7 +547,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
508
547
  return (_ctx, _cache) => {
509
548
  return isHidden.value ? (openBlock(), createElementBlock("div", _hoisted_1)) : __props.config.title && !__props.config.label ? (openBlock(), createBlock(unref(ElFormItem), mergeProps({
510
549
  key: 1,
511
- prop: __props.field
550
+ prop: __props.field,
551
+ rules: rules.value
512
552
  }, __spreadValues(__spreadValues({}, formItemProps.value), _ctx.$attrs), {
513
553
  class: ["jky-form-item jky-form-item--no-label", [__props.config.useDefaultBorderClass ? "border-l-4 border-solid border-l-(--el-color-primary) bg-(--el-color-primary)/50 pl-1.5" : "", __props.config.class]],
514
554
  style: [__props.config.customStyle]
@@ -524,10 +564,11 @@ const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
524
564
  __props.config.help && !__props.config.help.tooltip ? (openBlock(), createBlock(resolveDynamicComponent(renderHelpText()), { key: 0 })) : createCommentVNode("", true)
525
565
  ]),
526
566
  _: 1
527
- }, 16, ["prop", "class", "style"])) : (openBlock(), createBlock(unref(ElFormItem), mergeProps({
567
+ }, 16, ["prop", "rules", "class", "style"])) : (openBlock(), createBlock(unref(ElFormItem), mergeProps({
528
568
  key: 2,
529
569
  label: __props.config.label,
530
- prop: __props.field
570
+ prop: __props.field,
571
+ rules: rules.value
531
572
  }, __spreadValues(__spreadValues({}, formItemProps.value), _ctx.$attrs), {
532
573
  class: ["jky-form-item", [__props.config.class]]
533
574
  }), createSlots({
@@ -551,7 +592,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
551
592
  ]),
552
593
  key: "0"
553
594
  } : void 0
554
- ]), 1040, ["label", "prop", "class"]));
595
+ ]), 1040, ["label", "prop", "rules", "class"]));
555
596
  };
556
597
  }
557
598
  }));
@@ -1,4 +1,4 @@
1
- const version = "0.0.123";
1
+ const version = "0.0.125";
2
2
  export {
3
3
  version
4
4
  };
@@ -19,7 +19,7 @@ var __spreadValues = (a, b) => {
19
19
  var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
20
20
  import { defineComponent, computed, openBlock, createElementBlock, Fragment, renderList, createBlock, unref, normalizeClass, withCtx, createTextVNode, toDisplayString, createVNode, createElementVNode, createCommentVNode } from "vue";
21
21
  import { ElButton, ElDropdown, ElDropdownMenu, ElDropdownItem } from "element-plus";
22
- const _hoisted_1 = { class: "jky-action-column flex gap-2 items-center" };
22
+ const _hoisted_1 = { class: "jky-action-column flex items-center justify-center" };
23
23
  const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({}, {
24
24
  name: "JkyActionColumn"
25
25
  }), {
@@ -70,11 +70,17 @@ const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
70
70
  }
71
71
  emit("click", button, props.row, props.index);
72
72
  }
73
+ function getButtonLabel(button) {
74
+ if (typeof button.label === "function") {
75
+ return button.label(props.row, props.index);
76
+ }
77
+ return button.label;
78
+ }
73
79
  return (_ctx, _cache) => {
74
80
  return openBlock(), createElementBlock("div", _hoisted_1, [
75
- (openBlock(true), createElementBlock(Fragment, null, renderList(displayButtons.value, (button) => {
81
+ (openBlock(true), createElementBlock(Fragment, null, renderList(displayButtons.value, (button, i) => {
76
82
  return openBlock(), createBlock(unref(ElButton), {
77
- key: button.label,
83
+ key: i,
78
84
  type: button.type || "primary",
79
85
  size: button.size || "small",
80
86
  disabled: button.disabled,
@@ -85,7 +91,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
85
91
  onClick: ($event) => handleButtonClick(button)
86
92
  }, {
87
93
  default: withCtx(() => [
88
- createTextVNode(toDisplayString(button.label), 1)
94
+ createTextVNode(toDisplayString(getButtonLabel(button)), 1)
89
95
  ]),
90
96
  _: 2
91
97
  }, 1032, ["type", "size", "disabled", "icon", "plain", "class", "onClick"]);
@@ -99,12 +105,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
99
105
  default: withCtx(() => [
100
106
  (openBlock(true), createElementBlock(Fragment, null, renderList(collapsedButtons.value, (button) => {
101
107
  return openBlock(), createBlock(unref(ElDropdownItem), {
102
- key: button.label,
108
+ key: typeof button.label === "function" ? button.label(__props.row, __props.index) : button.label,
103
109
  disabled: button.disabled,
104
110
  onClick: ($event) => handleButtonClick(button)
105
111
  }, {
106
112
  default: withCtx(() => [
107
- createTextVNode(toDisplayString(button.label), 1)
113
+ createTextVNode(toDisplayString(getButtonLabel(button)), 1)
108
114
  ]),
109
115
  _: 2
110
116
  }, 1032, ["disabled", "onClick"]);
@@ -29,6 +29,8 @@ declare function __VLS_template(): {
29
29
  readonly footerClass?: string | undefined;
30
30
  readonly submitText?: string | undefined;
31
31
  readonly cancelText?: string | undefined;
32
+ readonly submitIcon?: string | undefined;
33
+ readonly cancelIcon?: string | undefined;
32
34
  readonly submitDisabled?: boolean | undefined;
33
35
  readonly cancelDisabled?: boolean | undefined;
34
36
  readonly showCount?: number | undefined;
@@ -2816,6 +2818,8 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_PublicProps,
2816
2818
  showSearchButton: boolean;
2817
2819
  searchText: string;
2818
2820
  resetText: string;
2821
+ searchIcon: string;
2822
+ resetIcon: string;
2819
2823
  selection: boolean;
2820
2824
  selectionColumn: import('./types').TableColumnConfig;
2821
2825
  selectedRows: any[];
@@ -2843,6 +2847,8 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_PublicProps,
2843
2847
  readonly footerClass?: string | undefined;
2844
2848
  readonly submitText?: string | undefined;
2845
2849
  readonly cancelText?: string | undefined;
2850
+ readonly submitIcon?: string | undefined;
2851
+ readonly cancelIcon?: string | undefined;
2846
2852
  readonly submitDisabled?: boolean | undefined;
2847
2853
  readonly cancelDisabled?: boolean | undefined;
2848
2854
  readonly showCount?: number | undefined;
@@ -61,6 +61,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
61
61
  showSearchButton: { type: Boolean, default: true },
62
62
  searchText: { default: "查询" },
63
63
  resetText: { default: "重置" },
64
+ searchIcon: { default: "icon-[ant-design--search-outlined]" },
65
+ resetIcon: { default: "icon-[ant-design--sync-outlined]" },
64
66
  selection: { type: Boolean, default: false },
65
67
  selectionColumn: { default: () => ({}) },
66
68
  selectable: {},
@@ -388,14 +390,18 @@ const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
388
390
  createVNode(unref(JkyForm), mergeProps({
389
391
  ref_key: "formRef",
390
392
  ref: formRef
391
- }, __spreadValues({ inline: true }, __props.formProps), {
393
+ }, __spreadValues({
394
+ inline: true,
395
+ submitText: props.searchText,
396
+ cancelText: props.resetText,
397
+ submitIcon: props.searchIcon,
398
+ cancelIcon: props.resetIcon
399
+ }, __props.formProps), {
392
400
  modelValue: form.value,
393
401
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => form.value = $event),
394
402
  "show-footer": true,
395
403
  items: __props.filterItems,
396
404
  disabled: isLoading.value,
397
- "submit-text": "搜索",
398
- "cancel-text": "重置",
399
405
  onReset: handleReset,
400
406
  onSubmit: handleSearch
401
407
  }), null, 16, ["modelValue", "items", "disabled"])
@@ -505,7 +511,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent(__spreadProps(__spreadValues({
505
511
  layout: ((_b2 = pagination.value) == null ? void 0 : _b2.layout) || "total, sizes, prev, pager, next, jumper",
506
512
  "show-size-picker": (_d = (_c2 = pagination.value) == null ? void 0 : _c2.showSizePicker) != null ? _d : true,
507
513
  "show-total": (_f = (_e = pagination.value) == null ? void 0 : _e.showTotal) != null ? _f : true,
508
- "show-jumper": (_h = (_g = pagination.value) == null ? void 0 : _g.showJumper) != null ? _h : true
514
+ "show-jumper": (_h = (_g = pagination.value) == null ? void 0 : _g.showJumper) != null ? _h : true,
515
+ class: "justify-end"
509
516
  }, __props.paginationProps, {
510
517
  onSizeChange: handlePageSizeChange,
511
518
  onCurrentChange: handlePageChange
@@ -64,6 +64,8 @@ declare const _default: import('vue').DefineComponent<PageTableV2Props, {
64
64
  readonly footerClass?: string | undefined;
65
65
  readonly submitText?: string | undefined;
66
66
  readonly cancelText?: string | undefined;
67
+ readonly submitIcon?: string | undefined;
68
+ readonly cancelIcon?: string | undefined;
67
69
  readonly submitDisabled?: boolean | undefined;
68
70
  readonly cancelDisabled?: boolean | undefined;
69
71
  readonly showCount?: number | undefined;
package/dist/es/style.css CHANGED
@@ -682,6 +682,38 @@
682
682
  mask-repeat: no-repeat;
683
683
  }
684
684
 
685
+ .icon-\[ant-design--search-outlined\] {
686
+ width: 1em;
687
+ height: 1em;
688
+ -webkit-mask-image: var(--svg);
689
+ -webkit-mask-image: var(--svg);
690
+ -webkit-mask-image: var(--svg);
691
+ mask-image: var(--svg);
692
+ --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024' width='1024' height='1024'%3E%3Cpath fill='black' d='M909.6 854.5L649.9 594.8C690.2 542.7 712 479 712 412c0-80.2-31.3-155.4-87.9-212.1S492.1 112 412 112s-155.5 31.3-212.1 87.9C143.2 256.5 112 331.8 112 412c0 80.1 31.3 155.5 87.9 212.1C256.5 680.8 331.8 712 412 712c67 0 130.6-21.8 182.7-62l259.7 259.6a8.2 8.2 0 0 0 11.6 0l43.6-43.5a8.2 8.2 0 0 0 0-11.6M570.4 570.4C528 612.7 471.8 636 412 636s-116-23.3-158.4-65.6C211.3 528 188 471.8 188 412s23.3-116.1 65.6-158.4C296 211.3 352.2 188 412 188s116.1 23.2 158.4 65.6S636 352.2 636 412s-23.3 116.1-65.6 158.4'/%3E%3C/svg%3E");
693
+ background-color: currentColor;
694
+ display: inline-block;
695
+ -webkit-mask-size: 100% 100%;
696
+ mask-size: 100% 100%;
697
+ -webkit-mask-repeat: no-repeat;
698
+ mask-repeat: no-repeat;
699
+ }
700
+
701
+ .icon-\[ant-design--sync-outlined\] {
702
+ width: 1em;
703
+ height: 1em;
704
+ -webkit-mask-image: var(--svg);
705
+ -webkit-mask-image: var(--svg);
706
+ -webkit-mask-image: var(--svg);
707
+ mask-image: var(--svg);
708
+ --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024' width='1024' height='1024'%3E%3Cpath fill='black' d='M168 504.2c1-43.7 10-86.1 26.9-126c17.3-41 42.1-77.7 73.7-109.4S337 212.3 378 195c42.4-17.9 87.4-27 133.9-27s91.5 9.1 133.8 27A341.5 341.5 0 0 1 755 268.8c9.9 9.9 19.2 20.4 27.8 31.4l-60.2 47a8 8 0 0 0 3 14.1l175.7 43c5 1.2 9.9-2.6 9.9-7.7l.8-180.9c0-6.7-7.7-10.5-12.9-6.3l-56.4 44.1C765.8 155.1 646.2 92 511.8 92C282.7 92 96.3 275.6 92 503.8a8 8 0 0 0 8 8.2h60c4.4 0 7.9-3.5 8-7.8m756 7.8h-60c-4.4 0-7.9 3.5-8 7.8c-1 43.7-10 86.1-26.9 126c-17.3 41-42.1 77.8-73.7 109.4A342.45 342.45 0 0 1 512.1 856a342.24 342.24 0 0 1-243.2-100.8c-9.9-9.9-19.2-20.4-27.8-31.4l60.2-47a8 8 0 0 0-3-14.1l-175.7-43c-5-1.2-9.9 2.6-9.9 7.7l-.7 181c0 6.7 7.7 10.5 12.9 6.3l56.4-44.1C258.2 868.9 377.8 932 512.2 932c229.2 0 415.5-183.7 419.8-411.8a8 8 0 0 0-8-8.2'/%3E%3C/svg%3E");
709
+ background-color: currentColor;
710
+ display: inline-block;
711
+ -webkit-mask-size: 100% 100%;
712
+ mask-size: 100% 100%;
713
+ -webkit-mask-repeat: no-repeat;
714
+ mask-repeat: no-repeat;
715
+ }
716
+
685
717
  .icon-\[carbon--apple\] {
686
718
  width: 1em;
687
719
  height: 1em;
@@ -1,14 +1,7 @@
1
- /* AMap 高德地图组件样式 */
2
- .jky-amap-container {
3
- /* 地图容器样式 */
4
- position: relative;
5
- overflow: hidden;
6
1
 
7
- /* 隐藏高德地图的 logo 和版权信息(注意:商业使用请遵守高德地图条款) */
8
- .amap-logo {
9
- display: none !important;
10
- }
11
- .amap-copyright {
12
- display: none !important;
13
- }
2
+ /* JkyAMarker 组件样式 - 参考高德官方示例 */
3
+ .amap-icon img,
4
+ .amap-marker-content img {
5
+ width: 25px;
6
+ height: 34px;
14
7
  }
@@ -1,7 +1,14 @@
1
+ /* AMap 高德地图组件样式 */
2
+ .jky-amap-container {
3
+ /* 地图容器样式 */
4
+ position: relative;
5
+ overflow: hidden;
1
6
 
2
- /* JkyAMarker 组件样式 - 参考高德官方示例 */
3
- .amap-icon img,
4
- .amap-marker-content img {
5
- width: 25px;
6
- height: 34px;
7
+ /* 隐藏高德地图的 logo 和版权信息(注意:商业使用请遵守高德地图条款) */
8
+ .amap-logo {
9
+ display: none !important;
10
+ }
11
+ .amap-copyright {
12
+ display: none !important;
13
+ }
7
14
  }
@@ -59,6 +59,8 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
59
59
  footerClass: { default: "" },
60
60
  submitText: { default: "提交" },
61
61
  cancelText: { default: "取消" },
62
+ submitIcon: {},
63
+ cancelIcon: {},
62
64
  submitDisabled: { type: Boolean, default: false },
63
65
  cancelDisabled: { type: Boolean, default: false },
64
66
  showCount: { default: 999 },
@@ -220,7 +222,11 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
220
222
  onClick: handleCancel
221
223
  }, {
222
224
  default: vue.withCtx(() => [
223
- vue.createTextVNode(vue.toDisplayString(__props.cancelText), 1)
225
+ props.cancelIcon ? (vue.openBlock(), vue.createElementBlock("span", {
226
+ key: 0,
227
+ class: vue.normalizeClass([props.cancelIcon, "mr-2"])
228
+ }, null, 2)) : vue.createCommentVNode("", true),
229
+ vue.createTextVNode(" " + vue.toDisplayString(__props.cancelText), 1)
224
230
  ]),
225
231
  _: 1
226
232
  }, 8, ["disabled"]),
@@ -231,7 +237,11 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
231
237
  onClick: handleSubmit
232
238
  }, {
233
239
  default: vue.withCtx(() => [
234
- vue.createTextVNode(vue.toDisplayString(__props.submitText), 1)
240
+ props.submitIcon ? (vue.openBlock(), vue.createElementBlock("span", {
241
+ key: 0,
242
+ class: vue.normalizeClass([props.submitIcon, "mr-2"])
243
+ }, null, 2)) : vue.createCommentVNode("", true),
244
+ vue.createTextVNode(" " + vue.toDisplayString(__props.submitText), 1)
235
245
  ]),
236
246
  _: 1
237
247
  }, 8, ["disabled"])
@@ -106,6 +106,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
106
106
  const props = __props;
107
107
  const loading = vue.ref(false);
108
108
  const componentProps = vue.ref({});
109
+ const rules = vue.ref(null);
109
110
  function loadComponentProps() {
110
111
  return __async(this, null, function* () {
111
112
  const configProps = props.config.componentProps;
@@ -133,14 +134,43 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
133
134
  componentProps.value = configProps;
134
135
  });
135
136
  }
137
+ function loadRules() {
138
+ return __async(this, null, function* () {
139
+ const configRules = props.config.rules;
140
+ if (!configRules) {
141
+ rules.value = null;
142
+ return;
143
+ }
144
+ if (typeof configRules === "function") {
145
+ loading.value = true;
146
+ try {
147
+ const result = yield configRules({
148
+ model: props.model,
149
+ field: props.field,
150
+ $form: props.model
151
+ });
152
+ rules.value = result || null;
153
+ } catch (error) {
154
+ console.error("Failed to load rules:", error);
155
+ rules.value = null;
156
+ } finally {
157
+ loading.value = false;
158
+ }
159
+ return;
160
+ }
161
+ rules.value = configRules;
162
+ });
163
+ }
136
164
  vue.watch(
137
165
  () => props.model,
138
166
  () => {
139
167
  loadComponentProps();
168
+ loadRules();
140
169
  },
141
170
  { deep: true }
142
171
  );
143
172
  loadComponentProps();
173
+ loadRules();
144
174
  const modelValue = vue.computed({
145
175
  get: () => props.model[props.field],
146
176
  set: (val) => {
@@ -266,11 +296,20 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
266
296
  return vue.h(ElementPlus.ElAutocomplete, autocompleteProps, _componentSlotsObj);
267
297
  }
268
298
  case "datepicker":
269
- return vue.h(ElementPlus.ElDatePicker, __spreadValues(__spreadValues({}, commonProps), componentProps.value), _componentSlotsObj);
299
+ return vue.h(ElementPlus.ElDatePicker, __spreadValues(__spreadValues({
300
+ startPlaceholder: "开始日期",
301
+ endPlaceholder: "结束日期"
302
+ }, commonProps), componentProps.value), _componentSlotsObj);
270
303
  case "datetime-picker":
271
- return vue.h(ElementPlus.ElDatePicker, __spreadValues(__spreadValues({}, commonProps), componentProps.value), _componentSlotsObj);
304
+ return vue.h(ElementPlus.ElDatePicker, __spreadValues(__spreadValues({
305
+ startPlaceholder: "开始日期",
306
+ endPlaceholder: "结束日期"
307
+ }, commonProps), componentProps.value), _componentSlotsObj);
272
308
  case "time-picker":
273
- return vue.h(ElementPlus.ElTimePicker, __spreadValues(__spreadValues({}, commonProps), componentProps.value), _componentSlotsObj);
309
+ return vue.h(ElementPlus.ElTimePicker, __spreadValues(__spreadValues({
310
+ startPlaceholder: "开始时间",
311
+ endPlaceholder: "结束时间"
312
+ }, commonProps), componentProps.value), _componentSlotsObj);
274
313
  case "time-select":
275
314
  return vue.h(ElementPlus.ElTimeSelect, __spreadValues(__spreadValues({}, commonProps), componentProps.value), _componentSlotsObj);
276
315
  case "radio-group": {
@@ -510,7 +549,8 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
510
549
  return (_ctx, _cache) => {
511
550
  return isHidden.value ? (vue.openBlock(), vue.createElementBlock("div", _hoisted_1)) : __props.config.title && !__props.config.label ? (vue.openBlock(), vue.createBlock(vue.unref(ElementPlus.ElFormItem), vue.mergeProps({
512
551
  key: 1,
513
- prop: __props.field
552
+ prop: __props.field,
553
+ rules: rules.value
514
554
  }, __spreadValues(__spreadValues({}, formItemProps.value), _ctx.$attrs), {
515
555
  class: ["jky-form-item jky-form-item--no-label", [__props.config.useDefaultBorderClass ? "border-l-4 border-solid border-l-(--el-color-primary) bg-(--el-color-primary)/50 pl-1.5" : "", __props.config.class]],
516
556
  style: [__props.config.customStyle]
@@ -526,10 +566,11 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
526
566
  __props.config.help && !__props.config.help.tooltip ? (vue.openBlock(), vue.createBlock(vue.resolveDynamicComponent(renderHelpText()), { key: 0 })) : vue.createCommentVNode("", true)
527
567
  ]),
528
568
  _: 1
529
- }, 16, ["prop", "class", "style"])) : (vue.openBlock(), vue.createBlock(vue.unref(ElementPlus.ElFormItem), vue.mergeProps({
569
+ }, 16, ["prop", "rules", "class", "style"])) : (vue.openBlock(), vue.createBlock(vue.unref(ElementPlus.ElFormItem), vue.mergeProps({
530
570
  key: 2,
531
571
  label: __props.config.label,
532
- prop: __props.field
572
+ prop: __props.field,
573
+ rules: rules.value
533
574
  }, __spreadValues(__spreadValues({}, formItemProps.value), _ctx.$attrs), {
534
575
  class: ["jky-form-item", [__props.config.class]]
535
576
  }), vue.createSlots({
@@ -553,7 +594,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
553
594
  ]),
554
595
  key: "0"
555
596
  } : void 0
556
- ]), 1040, ["label", "prop", "class"]));
597
+ ]), 1040, ["label", "prop", "rules", "class"]));
557
598
  };
558
599
  }
559
600
  }));
@@ -1,4 +1,4 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
3
- const version = "0.0.123";
3
+ const version = "0.0.125";
4
4
  exports.version = version;
@@ -21,7 +21,7 @@ var __spreadProps = (a, b) => __defProps(a, __getOwnPropDescs(b));
21
21
  Object.defineProperties(exports, { __esModule: { value: true }, [Symbol.toStringTag]: { value: "Module" } });
22
22
  const vue = require("vue");
23
23
  const ElementPlus = require("element-plus");
24
- const _hoisted_1 = { class: "jky-action-column flex gap-2 items-center" };
24
+ const _hoisted_1 = { class: "jky-action-column flex items-center justify-center" };
25
25
  const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValues({}, {
26
26
  name: "JkyActionColumn"
27
27
  }), {
@@ -72,11 +72,17 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
72
72
  }
73
73
  emit("click", button, props.row, props.index);
74
74
  }
75
+ function getButtonLabel(button) {
76
+ if (typeof button.label === "function") {
77
+ return button.label(props.row, props.index);
78
+ }
79
+ return button.label;
80
+ }
75
81
  return (_ctx, _cache) => {
76
82
  return vue.openBlock(), vue.createElementBlock("div", _hoisted_1, [
77
- (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(displayButtons.value, (button) => {
83
+ (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(displayButtons.value, (button, i) => {
78
84
  return vue.openBlock(), vue.createBlock(vue.unref(ElementPlus.ElButton), {
79
- key: button.label,
85
+ key: i,
80
86
  type: button.type || "primary",
81
87
  size: button.size || "small",
82
88
  disabled: button.disabled,
@@ -87,7 +93,7 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
87
93
  onClick: ($event) => handleButtonClick(button)
88
94
  }, {
89
95
  default: vue.withCtx(() => [
90
- vue.createTextVNode(vue.toDisplayString(button.label), 1)
96
+ vue.createTextVNode(vue.toDisplayString(getButtonLabel(button)), 1)
91
97
  ]),
92
98
  _: 2
93
99
  }, 1032, ["type", "size", "disabled", "icon", "plain", "class", "onClick"]);
@@ -101,12 +107,12 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
101
107
  default: vue.withCtx(() => [
102
108
  (vue.openBlock(true), vue.createElementBlock(vue.Fragment, null, vue.renderList(collapsedButtons.value, (button) => {
103
109
  return vue.openBlock(), vue.createBlock(vue.unref(ElementPlus.ElDropdownItem), {
104
- key: button.label,
110
+ key: typeof button.label === "function" ? button.label(__props.row, __props.index) : button.label,
105
111
  disabled: button.disabled,
106
112
  onClick: ($event) => handleButtonClick(button)
107
113
  }, {
108
114
  default: vue.withCtx(() => [
109
- vue.createTextVNode(vue.toDisplayString(button.label), 1)
115
+ vue.createTextVNode(vue.toDisplayString(getButtonLabel(button)), 1)
110
116
  ]),
111
117
  _: 2
112
118
  }, 1032, ["disabled", "onClick"]);
@@ -29,6 +29,8 @@ declare function __VLS_template(): {
29
29
  readonly footerClass?: string | undefined;
30
30
  readonly submitText?: string | undefined;
31
31
  readonly cancelText?: string | undefined;
32
+ readonly submitIcon?: string | undefined;
33
+ readonly cancelIcon?: string | undefined;
32
34
  readonly submitDisabled?: boolean | undefined;
33
35
  readonly cancelDisabled?: boolean | undefined;
34
36
  readonly showCount?: number | undefined;
@@ -2816,6 +2818,8 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_PublicProps,
2816
2818
  showSearchButton: boolean;
2817
2819
  searchText: string;
2818
2820
  resetText: string;
2821
+ searchIcon: string;
2822
+ resetIcon: string;
2819
2823
  selection: boolean;
2820
2824
  selectionColumn: import('./types').TableColumnConfig;
2821
2825
  selectedRows: any[];
@@ -2843,6 +2847,8 @@ declare const __VLS_component: import('vue').DefineComponent<__VLS_PublicProps,
2843
2847
  readonly footerClass?: string | undefined;
2844
2848
  readonly submitText?: string | undefined;
2845
2849
  readonly cancelText?: string | undefined;
2850
+ readonly submitIcon?: string | undefined;
2851
+ readonly cancelIcon?: string | undefined;
2846
2852
  readonly submitDisabled?: boolean | undefined;
2847
2853
  readonly cancelDisabled?: boolean | undefined;
2848
2854
  readonly showCount?: number | undefined;
@@ -63,6 +63,8 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
63
63
  showSearchButton: { type: Boolean, default: true },
64
64
  searchText: { default: "查询" },
65
65
  resetText: { default: "重置" },
66
+ searchIcon: { default: "icon-[ant-design--search-outlined]" },
67
+ resetIcon: { default: "icon-[ant-design--sync-outlined]" },
66
68
  selection: { type: Boolean, default: false },
67
69
  selectionColumn: { default: () => ({}) },
68
70
  selectable: {},
@@ -390,14 +392,18 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
390
392
  vue.createVNode(vue.unref(index.JkyForm), vue.mergeProps({
391
393
  ref_key: "formRef",
392
394
  ref: formRef
393
- }, __spreadValues({ inline: true }, __props.formProps), {
395
+ }, __spreadValues({
396
+ inline: true,
397
+ submitText: props.searchText,
398
+ cancelText: props.resetText,
399
+ submitIcon: props.searchIcon,
400
+ cancelIcon: props.resetIcon
401
+ }, __props.formProps), {
394
402
  modelValue: form.value,
395
403
  "onUpdate:modelValue": _cache[0] || (_cache[0] = ($event) => form.value = $event),
396
404
  "show-footer": true,
397
405
  items: __props.filterItems,
398
406
  disabled: isLoading.value,
399
- "submit-text": "搜索",
400
- "cancel-text": "重置",
401
407
  onReset: handleReset,
402
408
  onSubmit: handleSearch
403
409
  }), null, 16, ["modelValue", "items", "disabled"])
@@ -507,7 +513,8 @@ const _sfc_main = /* @__PURE__ */ vue.defineComponent(__spreadProps(__spreadValu
507
513
  layout: ((_b2 = pagination.value) == null ? void 0 : _b2.layout) || "total, sizes, prev, pager, next, jumper",
508
514
  "show-size-picker": (_d = (_c2 = pagination.value) == null ? void 0 : _c2.showSizePicker) != null ? _d : true,
509
515
  "show-total": (_f = (_e = pagination.value) == null ? void 0 : _e.showTotal) != null ? _f : true,
510
- "show-jumper": (_h = (_g = pagination.value) == null ? void 0 : _g.showJumper) != null ? _h : true
516
+ "show-jumper": (_h = (_g = pagination.value) == null ? void 0 : _g.showJumper) != null ? _h : true,
517
+ class: "justify-end"
511
518
  }, __props.paginationProps, {
512
519
  onSizeChange: handlePageSizeChange,
513
520
  onCurrentChange: handlePageChange
@@ -64,6 +64,8 @@ declare const _default: import('vue').DefineComponent<PageTableV2Props, {
64
64
  readonly footerClass?: string | undefined;
65
65
  readonly submitText?: string | undefined;
66
66
  readonly cancelText?: string | undefined;
67
+ readonly submitIcon?: string | undefined;
68
+ readonly cancelIcon?: string | undefined;
67
69
  readonly submitDisabled?: boolean | undefined;
68
70
  readonly cancelDisabled?: boolean | undefined;
69
71
  readonly showCount?: number | undefined;
@@ -682,6 +682,38 @@
682
682
  mask-repeat: no-repeat;
683
683
  }
684
684
 
685
+ .icon-\[ant-design--search-outlined\] {
686
+ width: 1em;
687
+ height: 1em;
688
+ -webkit-mask-image: var(--svg);
689
+ -webkit-mask-image: var(--svg);
690
+ -webkit-mask-image: var(--svg);
691
+ mask-image: var(--svg);
692
+ --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024' width='1024' height='1024'%3E%3Cpath fill='black' d='M909.6 854.5L649.9 594.8C690.2 542.7 712 479 712 412c0-80.2-31.3-155.4-87.9-212.1S492.1 112 412 112s-155.5 31.3-212.1 87.9C143.2 256.5 112 331.8 112 412c0 80.1 31.3 155.5 87.9 212.1C256.5 680.8 331.8 712 412 712c67 0 130.6-21.8 182.7-62l259.7 259.6a8.2 8.2 0 0 0 11.6 0l43.6-43.5a8.2 8.2 0 0 0 0-11.6M570.4 570.4C528 612.7 471.8 636 412 636s-116-23.3-158.4-65.6C211.3 528 188 471.8 188 412s23.3-116.1 65.6-158.4C296 211.3 352.2 188 412 188s116.1 23.2 158.4 65.6S636 352.2 636 412s-23.3 116.1-65.6 158.4'/%3E%3C/svg%3E");
693
+ background-color: currentColor;
694
+ display: inline-block;
695
+ -webkit-mask-size: 100% 100%;
696
+ mask-size: 100% 100%;
697
+ -webkit-mask-repeat: no-repeat;
698
+ mask-repeat: no-repeat;
699
+ }
700
+
701
+ .icon-\[ant-design--sync-outlined\] {
702
+ width: 1em;
703
+ height: 1em;
704
+ -webkit-mask-image: var(--svg);
705
+ -webkit-mask-image: var(--svg);
706
+ -webkit-mask-image: var(--svg);
707
+ mask-image: var(--svg);
708
+ --svg: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 1024 1024' width='1024' height='1024'%3E%3Cpath fill='black' d='M168 504.2c1-43.7 10-86.1 26.9-126c17.3-41 42.1-77.7 73.7-109.4S337 212.3 378 195c42.4-17.9 87.4-27 133.9-27s91.5 9.1 133.8 27A341.5 341.5 0 0 1 755 268.8c9.9 9.9 19.2 20.4 27.8 31.4l-60.2 47a8 8 0 0 0 3 14.1l175.7 43c5 1.2 9.9-2.6 9.9-7.7l.8-180.9c0-6.7-7.7-10.5-12.9-6.3l-56.4 44.1C765.8 155.1 646.2 92 511.8 92C282.7 92 96.3 275.6 92 503.8a8 8 0 0 0 8 8.2h60c4.4 0 7.9-3.5 8-7.8m756 7.8h-60c-4.4 0-7.9 3.5-8 7.8c-1 43.7-10 86.1-26.9 126c-17.3 41-42.1 77.8-73.7 109.4A342.45 342.45 0 0 1 512.1 856a342.24 342.24 0 0 1-243.2-100.8c-9.9-9.9-19.2-20.4-27.8-31.4l60.2-47a8 8 0 0 0-3-14.1l-175.7-43c-5-1.2-9.9 2.6-9.9 7.7l-.7 181c0 6.7 7.7 10.5 12.9 6.3l56.4-44.1C258.2 868.9 377.8 932 512.2 932c229.2 0 415.5-183.7 419.8-411.8a8 8 0 0 0-8-8.2'/%3E%3C/svg%3E");
709
+ background-color: currentColor;
710
+ display: inline-block;
711
+ -webkit-mask-size: 100% 100%;
712
+ mask-size: 100% 100%;
713
+ -webkit-mask-repeat: no-repeat;
714
+ mask-repeat: no-repeat;
715
+ }
716
+
685
717
  .icon-\[carbon--apple\] {
686
718
  width: 1em;
687
719
  height: 1em;
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "jky-component-lib",
3
3
  "type": "module",
4
- "version": "0.0.123",
4
+ "version": "0.0.125",
5
5
  "publishConfig": {
6
6
  "access": "public"
7
7
  },