@done-coding/admin-core 0.25.0 → 0.25.1-alpha.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (69) hide show
  1. package/es/components/app-layout/AppPage.vue.mjs +1 -1
  2. package/es/components/app-layout/AppPage.vue2.mjs +42 -23
  3. package/es/components/app-layout/use-content-box.mjs +17 -0
  4. package/es/components/data-view/DataGridView.vue.mjs +1 -1
  5. package/es/components/data-view/DataGridView.vue2.mjs +34 -14
  6. package/es/components/data-view/DataListView.vue.mjs +1 -1
  7. package/es/components/data-view/DataListView.vue2.mjs +27 -7
  8. package/es/components/data-view/DataListViewItem.vue.mjs +1 -1
  9. package/es/components/data-view/DataListViewItem.vue2.mjs +3 -2
  10. package/es/components/list-layout/ListLayout.vue.mjs +1 -1
  11. package/es/components/list-layout/ListLayout.vue2.mjs +34 -11
  12. package/es/components/modal/ModalConfirm.vue.mjs +1 -1
  13. package/es/components/modal/ModalConfirm.vue2.mjs +67 -49
  14. package/es/components/page-layout/AppPageDetail.vue.mjs +7 -0
  15. package/es/components/page-layout/AppPageDetail.vue2.mjs +89 -0
  16. package/es/components/page-layout/AppPageListDetailLayout.vue.mjs +153 -0
  17. package/es/components/page-layout/AppPageListDetailLayout.vue2.mjs +4 -0
  18. package/es/components/page-layout/AppPageListDetailSheet.vue.mjs +96 -0
  19. package/es/components/page-layout/AppPageListDetailSheet.vue2.mjs +4 -0
  20. package/es/components/page-layout/AppPageListDetailSplit.vue.mjs +7 -0
  21. package/es/components/page-layout/AppPageListDetailSplit.vue2.mjs +83 -0
  22. package/es/components/page-layout/use-list-detail.mjs +110 -0
  23. package/es/components/panel/PanelEditSwitch.vue.mjs +1 -1
  24. package/es/components/table/TableMain.vue.mjs +1 -1
  25. package/es/components/table/TableMain.vue2.mjs +55 -5
  26. package/es/components/view-layout/ViewLayout.vue.mjs +1 -1
  27. package/es/components/view-layout/ViewLayout.vue2.mjs +34 -4
  28. package/es/components/view-layout/ViewLayoutNavigation.vue.mjs +7 -0
  29. package/es/components/view-layout/ViewLayoutNavigation.vue2.mjs +34 -0
  30. package/es/hooks/use-active-record.mjs +100 -0
  31. package/es/index.mjs +146 -141
  32. package/es/inject/key.mjs +4 -0
  33. package/es/style.css +129 -96
  34. package/package.json +2 -2
  35. package/src/components/app-layout/README.md +8 -1
  36. package/src/components/app-layout/docs/README-AppPage.md +48 -2
  37. package/src/components/data-view/docs/README-DataGridView.md +2 -1
  38. package/src/components/data-view/docs/README-DataListView.md +13 -4
  39. package/src/components/list-layout/docs/README-ListLayout.md +1 -1
  40. package/src/components/modal/docs/README-ModalConfirm.md +2 -0
  41. package/src/components/page-layout/README.md +47 -0
  42. package/src/components/page-layout/docs/README-AppPageDetail.md +57 -0
  43. package/src/components/page-layout/docs/README-AppPageListDetailLayout.md +142 -0
  44. package/src/components/table/docs/README-TableMain.md +1 -1
  45. package/src/components/view-layout/docs/README-ViewLayout.md +14 -0
  46. package/types/components/app-layout/AppPage.vue.d.ts +14 -0
  47. package/types/components/app-layout/use-content-box.d.ts +31 -0
  48. package/types/components/data-view/DataGridView.vue.d.ts +9 -2
  49. package/types/components/data-view/DataListView.vue.d.ts +10 -2
  50. package/types/components/data-view/DataListViewItem.vue.d.ts +4 -2
  51. package/types/components/data-view/types.d.ts +5 -1
  52. package/types/components/list-layout/ListLayout.vue.d.ts +7 -2
  53. package/types/components/modal/ModalConfirm.vue.d.ts +18 -0
  54. package/types/components/page-layout/AppPageDetail.vue.d.ts +40 -0
  55. package/types/components/page-layout/AppPageListDetailLayout.vue.d.ts +39 -0
  56. package/types/components/page-layout/AppPageListDetailSheet.vue.d.ts +44 -0
  57. package/types/components/page-layout/AppPageListDetailSplit.vue.d.ts +47 -0
  58. package/types/components/page-layout/index.d.ts +4 -0
  59. package/types/components/page-layout/types.d.ts +102 -0
  60. package/types/components/page-layout/use-list-detail.d.ts +58 -0
  61. package/types/components/panel/PanelEditSwitch.vue.d.ts +30 -0
  62. package/types/components/table/TableMain.vue.d.ts +9 -2
  63. package/types/components/view-layout/ViewLayoutNavigation.vue.d.ts +13 -0
  64. package/types/components/view-layout/types.d.ts +46 -0
  65. package/types/hooks/use-active-record.d.ts +64 -0
  66. package/types/index.d.ts +1 -0
  67. package/types/inject/key.d.ts +29 -0
  68. package/types/injectInfo.json.d.ts +1 -1
  69. package/types/types/utility-types.d.ts +17 -0
@@ -1,7 +1,7 @@
1
1
  import _sfc_main from "./AppPage.vue2.mjs";
2
2
  /* empty css */
3
3
  import _export_sfc from "../../_virtual/_plugin-vue_export-helper.mjs";
4
- const AppPage = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-2359c6df"]]);
4
+ const AppPage = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-3ef165a7"]]);
5
5
  export {
6
6
  AppPage as default
7
7
  };
@@ -2,7 +2,8 @@ import { defineComponent, useCssVars, computed, useSlots, ref, shallowRef, injec
2
2
  import _debounce from "lodash/debounce";
3
3
  import _sfc_main$1 from "../modal/ModalShelf.vue.mjs";
4
4
  import _sfc_main$2 from "../display/WatchSize.vue.mjs";
5
- import { computeAppPageReducedViewportHeight, computeAppPageContentInset, computeAppPageReducedViewportWidth, computeAppPageSlotStyles, computeAppPageSlotShimStyles } from "./app-page-geometry.mjs";
5
+ import { computeAppPageReducedViewportHeight, computeAppPageReducedViewportWidth, computeAppPageContentInset, computeAppPageSlotStyles, computeAppPageSlotShimStyles } from "./app-page-geometry.mjs";
6
+ import { useAppPageContentBox } from "./use-content-box.mjs";
6
7
  import { BODY_CONTENT_VIEWPORT_RECT, SCOPE_VIEWPORT_MAX_HEIGHT, BODY_CONTENT_VIEWPORT_HEIGHT, BODY_CONTENT_VIEWPORT_INSET, APP_PAGE_CONTENT_INSET } from "../../inject/key.mjs";
7
8
  import { useActivated } from "../../hooks/activated.mjs";
8
9
  import { SlotRegion } from "../../config/slot-region.mjs";
@@ -30,17 +31,19 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
30
31
  topObserveResize: { type: Boolean, default: false },
31
32
  bottomObserveResize: { type: Boolean, default: false },
32
33
  leftObserveResize: { type: Boolean, default: false },
33
- rightObserveResize: { type: Boolean, default: false }
34
+ rightObserveResize: { type: Boolean, default: false },
35
+ contentCentered: { type: Boolean, default: false },
36
+ contentMaxWidth: { default: 1200 }
34
37
  },
35
38
  setup(__props) {
36
39
  useCssVars((_ctx) => ({
37
- "v55181597": pageCssVars.value.top,
38
- "v5f04c6a9": pageCssVars.value.bottom,
39
- "v4de6d405": pageCssVars.value.left,
40
- "v6f4a0dde": pageCssVars.value.right,
41
- "v6f907988": pageCssVars.value.width,
42
- "v68afbda5": pageCssVars.value.height,
43
- "v2e2782e4": props.nextViewportMaxHeight
40
+ "v6b53f4c2": pageCssVars.value.top,
41
+ "v1c770cbe": pageCssVars.value.bottom,
42
+ "ff323606": pageCssVars.value.left,
43
+ "e667c834": pageCssVars.value.right,
44
+ "e5daf0e0": pageCssVars.value.width,
45
+ "v09211ec6": pageCssVars.value.height,
46
+ "v0bd4b228": props.nextViewportMaxHeight
44
47
  }));
45
48
  const props = __props;
46
49
  const style = computed(() => {
@@ -142,17 +145,6 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
142
145
  viewportMaxHeight: reducedViewportHeight,
143
146
  parent: parentScope
144
147
  });
145
- const NO_APP_CHROME_INSET = ref({
146
- top: 0,
147
- bottom: 0,
148
- left: 0,
149
- right: 0
150
- });
151
- const bodyInset = inject(BODY_CONTENT_VIEWPORT_INSET, NO_APP_CHROME_INSET);
152
- const contentInset = computed(
153
- () => computeAppPageContentInset(bodyInset.value, slotSizes.value, props.gap)
154
- );
155
- provide(APP_PAGE_CONTENT_INSET, readonly(contentInset));
156
148
  const pageBoxWidth = ref(0);
157
149
  const measurePageWidth = () => {
158
150
  if (appPageRef.value) pageBoxWidth.value = appPageRef.value.clientWidth;
@@ -179,6 +171,28 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
179
171
  shimPadding.value
180
172
  )
181
173
  );
174
+ const { contentGutter } = useAppPageContentBox({
175
+ enabled: () => props.contentCentered,
176
+ maxWidth: () => props.contentMaxWidth,
177
+ availableWidth: () => reducedViewportWidth.value
178
+ });
179
+ const NO_APP_CHROME_INSET = ref({
180
+ top: 0,
181
+ bottom: 0,
182
+ left: 0,
183
+ right: 0
184
+ });
185
+ const bodyInset = inject(BODY_CONTENT_VIEWPORT_INSET, NO_APP_CHROME_INSET);
186
+ const contentInset = computed(() => {
187
+ const base = computeAppPageContentInset(
188
+ bodyInset.value,
189
+ slotSizes.value,
190
+ props.gap
191
+ );
192
+ const g = contentGutter.value;
193
+ return g ? { ...base, left: base.left + g, right: base.right + g } : base;
194
+ });
195
+ provide(APP_PAGE_CONTENT_INSET, readonly(contentInset));
182
196
  const pageCssVars = computed(() => {
183
197
  const inset = contentInset.value;
184
198
  return {
@@ -186,7 +200,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
186
200
  bottom: `${inset.bottom}px`,
187
201
  left: `${inset.left}px`,
188
202
  right: `${inset.right}px`,
189
- width: `${reducedViewportWidth.value}px`,
203
+ width: `${Math.max(
204
+ 0,
205
+ reducedViewportWidth.value - contentGutter.value * 2
206
+ )}px`,
190
207
  height: `${reducedViewportHeight.value}px`
191
208
  };
192
209
  });
@@ -204,12 +221,14 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
204
221
  });
205
222
  const shimStyle = computed(() => {
206
223
  const sp = shimPadding.value;
224
+ const g = contentGutter.value;
207
225
  const inset = (v) => `${Math.max(0, v ? v - sp : 0)}px`;
226
+ const insetX = (v) => `${Math.max(0, v ? v - sp : 0) + g}px`;
208
227
  return {
209
228
  paddingTop: inset(topH.value),
210
229
  paddingBottom: inset(bottomH.value),
211
- paddingLeft: inset(leftW.value),
212
- paddingRight: inset(rightW.value)
230
+ paddingLeft: insetX(leftW.value),
231
+ paddingRight: insetX(rightW.value)
213
232
  };
214
233
  });
215
234
  return (_ctx, _cache) => {
@@ -0,0 +1,17 @@
1
+ import { computed } from "vue";
2
+ function computeAppPageContentGutter(availableWidth, maxWidth) {
3
+ return Math.max(0, (availableWidth - maxWidth) / 2);
4
+ }
5
+ function useAppPageContentBox(options) {
6
+ const contentGutter = computed(
7
+ () => options.enabled() ? computeAppPageContentGutter(
8
+ options.availableWidth(),
9
+ options.maxWidth()
10
+ ) : 0
11
+ );
12
+ return { contentGutter };
13
+ }
14
+ export {
15
+ computeAppPageContentGutter,
16
+ useAppPageContentBox
17
+ };
@@ -1,7 +1,7 @@
1
1
  import _sfc_main from "./DataGridView.vue2.mjs";
2
2
  /* empty css */
3
3
  import _export_sfc from "../../_virtual/_plugin-vue_export-helper.mjs";
4
- const DataGridView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-d9e5439d"]]);
4
+ const DataGridView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-16f88920"]]);
5
5
  export {
6
6
  DataGridView as default
7
7
  };
@@ -1,4 +1,4 @@
1
- import { defineComponent, useModel, shallowRef, ref, computed, onMounted, onActivated, watch, openBlock, createElementBlock, createBlock, unref, withCtx, createVNode, mergeProps, createCommentVNode, createElementVNode, toDisplayString, createTextVNode, normalizeStyle, Fragment, renderList, renderSlot, resolveDynamicComponent, mergeModels } from "vue";
1
+ import { defineComponent, useModel, shallowRef, ref, computed, onMounted, onActivated, watch, openBlock, createElementBlock, createBlock, unref, withCtx, createVNode, mergeProps, createCommentVNode, createElementVNode, toDisplayString, createTextVNode, normalizeStyle, Fragment, renderList, normalizeClass, renderSlot, resolveDynamicComponent, mergeModels } from "vue";
2
2
  import { ElButton } from "element-plus";
3
3
  import TableToolbar from "../table/TableToolbar.vue.mjs";
4
4
  import _sfc_main$2 from "../table/TableEmpty.vue.mjs";
@@ -9,16 +9,18 @@ import _set from "lodash/set";
9
9
  import _get from "lodash/get";
10
10
  import InfiniteListView from "./InfiniteListView.vue.mjs";
11
11
  import { useDataViewFieldMap } from "./use-data-view-field-map.mjs";
12
+ import { useActiveRecord, activeRecordValueOf } from "../../hooks/use-active-record.mjs";
12
13
  import { resolveGridColumnsByBreakpoint, createDataListViewInstance } from "./utils.mjs";
13
14
  import { useBreakpoint } from "../../hooks/use-breakpoint.mjs";
14
15
  import { pickExportColumns } from "../../utils/export.mjs";
15
16
  import { useChannelViewportHeight } from "../../hooks/use-channel-viewport-height.mjs";
16
17
  import { APP_API_LIST_MODEL_KEY_CONFIG } from "../../config/list-model.mjs";
17
18
  const _hoisted_1 = { class: "dc-data-grid-view data-grid-view" };
18
- const _hoisted_2 = { class: "data-grid-view__card" };
19
- const _hoisted_3 = { class: "data-grid-view__field-label" };
20
- const _hoisted_4 = { class: "data-grid-view__field-value" };
21
- const _hoisted_5 = {
19
+ const _hoisted_2 = ["onClick"];
20
+ const _hoisted_3 = { class: "data-grid-view__card" };
21
+ const _hoisted_4 = { class: "data-grid-view__field-label" };
22
+ const _hoisted_5 = { class: "data-grid-view__field-value" };
23
+ const _hoisted_6 = {
22
24
  key: 0,
23
25
  class: "data-grid-view__empty-error"
24
26
  };
@@ -49,9 +51,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
49
51
  "isAutoRefresh": { type: Boolean },
50
52
  "isAutoRefreshModifiers": {},
51
53
  "refreshInterval": {},
52
- "refreshIntervalModifiers": {}
54
+ "refreshIntervalModifiers": {},
55
+ "activeId": {},
56
+ "activeIdModifiers": {},
57
+ "activeData": {},
58
+ "activeDataModifiers": {}
53
59
  }),
54
- emits: /* @__PURE__ */ mergeModels(["pageChange", "pageSizeChange", "dataChange", "selectionChange", "loadingChange", "pageInfoChange"], ["update:isAutoRefresh", "update:refreshInterval"]),
60
+ emits: /* @__PURE__ */ mergeModels(["pageChange", "pageSizeChange", "dataChange", "selectionChange", "loadingChange", "pageInfoChange"], ["update:isAutoRefresh", "update:refreshInterval", "update:activeId", "update:activeData"]),
55
61
  setup(__props, { expose: __expose, emit: __emit }) {
56
62
  const props = __props;
57
63
  const emits = __emit;
@@ -209,6 +215,17 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
209
215
  const rk = props.rowKey;
210
216
  return typeof rk === "function" ? rk(row) : String(row[rk]);
211
217
  };
218
+ const activeId = useModel(__props, "activeId");
219
+ const activeData = useModel(__props, "activeData");
220
+ const { isActive, setActive } = useActiveRecord({
221
+ // 用存量扁平数据(非 chunk 后的 gridRows)——「一项」= 一条记录
222
+ data: () => store.value,
223
+ // 出口值保原始类型(数字 id 出数字);比对由 hook 内部 String 归一,与渲染用的 keyOf 不冲突
224
+ keyOf: (row) => activeRecordValueOf(row, props.rowKey),
225
+ activeId,
226
+ activeData,
227
+ name: "DataGridView"
228
+ });
212
229
  const rowKeyOfRow = (row) => row.length ? keyOf(row[0]) : "empty-row";
213
230
  const getRenderCtxParams = () => ({
214
231
  injectInfo: props.injectInfo || {},
@@ -262,7 +279,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
262
279
  row,
263
280
  index,
264
281
  selected: isSelected(row),
265
- toggleSelect: () => toggleSelect(row)
282
+ toggleSelect: () => toggleSelect(row),
283
+ active: isActive(row),
284
+ setActive: () => setActive(row)
266
285
  });
267
286
  const expose = {
268
287
  refresh,
@@ -393,17 +412,18 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
393
412
  (openBlock(true), createElementBlock(Fragment, null, renderList(item, (row, colIndex) => {
394
413
  return openBlock(), createElementBlock("div", {
395
414
  key: keyOf(row),
396
- class: "data-grid-view__cell"
415
+ class: normalizeClass(["data-grid-view__cell", { "is-active": unref(isActive)(row) }]),
416
+ onClick: ($event) => unref(setActive)(row)
397
417
  }, [
398
418
  renderSlot(_ctx.$slots, "custom-view-item", mergeProps({ ref_for: true }, assertItemScope(row, index * gridColumnsFinal.value + colIndex)), () => [
399
- createElementVNode("div", _hoisted_2, [
419
+ createElementVNode("div", _hoisted_3, [
400
420
  (openBlock(true), createElementBlock(Fragment, null, renderList(__props.columns, (column) => {
401
421
  return openBlock(), createElementBlock("div", {
402
422
  key: column.prop ?? column.type,
403
423
  class: "data-grid-view__field"
404
424
  }, [
405
- createElementVNode("span", _hoisted_3, toDisplayString(column.label ?? column.prop) + ":", 1),
406
- createElementVNode("span", _hoisted_4, [
425
+ createElementVNode("span", _hoisted_4, toDisplayString(column.label ?? column.prop) + ":", 1),
426
+ createElementVNode("span", _hoisted_5, [
407
427
  (openBlock(), createBlock(resolveDynamicComponent(unref(fieldComponentMap)[fieldKeyOf(column)]), {
408
428
  row,
409
429
  index: index * gridColumnsFinal.value + colIndex,
@@ -415,12 +435,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
415
435
  }), 128))
416
436
  ])
417
437
  ], true)
418
- ]);
438
+ ], 10, _hoisted_2);
419
439
  }), 128))
420
440
  ], 4)
421
441
  ]),
422
442
  empty: withCtx(() => [
423
- error.value && !store.value.length ? (openBlock(), createElementBlock("div", _hoisted_5, [
443
+ error.value && !store.value.length ? (openBlock(), createElementBlock("div", _hoisted_6, [
424
444
  createElementVNode("span", null, toDisplayString(errorText.value), 1),
425
445
  createVNode(unref(ElButton), {
426
446
  size: "small",
@@ -1,7 +1,7 @@
1
1
  import _sfc_main from "./DataListView.vue2.mjs";
2
2
  /* empty css */
3
3
  import _export_sfc from "../../_virtual/_plugin-vue_export-helper.mjs";
4
- const DataListView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-ce0bb05b"]]);
4
+ const DataListView = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-467a86a8"]]);
5
5
  export {
6
6
  DataListView as default
7
7
  };
@@ -1,15 +1,16 @@
1
- import { defineComponent, computed, ref, watch, openBlock, createElementBlock, normalizeStyle, Fragment, renderList, createBlock, withCtx, renderSlot, unref, createVNode } from "vue";
1
+ import { defineComponent, computed, useModel, ref, watch, openBlock, createElementBlock, normalizeStyle, Fragment, renderList, createBlock, unref, withCtx, renderSlot, createVNode, mergeModels } from "vue";
2
2
  import { ElEmpty } from "element-plus";
3
3
  import DataListViewItem from "./DataListViewItem.vue.mjs";
4
4
  import { createDataListViewInstance } from "./utils.mjs";
5
5
  import { useDataViewFieldMap } from "./use-data-view-field-map.mjs";
6
+ import { useActiveRecord, activeRecordValueOf } from "../../hooks/use-active-record.mjs";
6
7
  const _hoisted_1 = {
7
8
  key: 1,
8
9
  class: "data-list-view-empty"
9
10
  };
10
11
  const _sfc_main = /* @__PURE__ */ defineComponent({
11
12
  __name: "DataListView",
12
- props: {
13
+ props: /* @__PURE__ */ mergeModels({
13
14
  data: {},
14
15
  rowKey: {},
15
16
  columns: {},
@@ -17,8 +18,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
17
18
  minHeight: {},
18
19
  selectable: { type: Boolean, default: false },
19
20
  getRenderCtxParams: {}
20
- },
21
- emits: ["selectionChange"],
21
+ }, {
22
+ "activeId": {},
23
+ "activeIdModifiers": {},
24
+ "activeData": {},
25
+ "activeDataModifiers": {}
26
+ }),
27
+ emits: /* @__PURE__ */ mergeModels(["selectionChange"], ["update:activeId", "update:activeData"]),
22
28
  setup(__props, { expose: __expose, emit: __emit }) {
23
29
  const props = __props;
24
30
  const emits = __emit;
@@ -37,6 +43,16 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
37
43
  }
38
44
  return Object.keys(style).length ? style : void 0;
39
45
  });
46
+ const activeId = useModel(__props, "activeId");
47
+ const activeData = useModel(__props, "activeData");
48
+ const { isActive, setActive } = useActiveRecord({
49
+ data: () => props.data,
50
+ // 出口值保原始类型(数字 id 出数字);比对由 hook 内部 String 归一,与渲染用的 keyOf 不冲突
51
+ keyOf: (row) => activeRecordValueOf(row, props.rowKey),
52
+ activeId,
53
+ activeData,
54
+ name: "DataListView"
55
+ });
40
56
  const selectedKeys = ref(/* @__PURE__ */ new Set());
41
57
  const selectAll = computed(() => selectedKeys.value.size === props.data.length);
42
58
  const isSelected = (row) => props.selectable && selectedKeys.value.has(keyOf(row));
@@ -88,7 +104,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
88
104
  __props.data.length ? (openBlock(true), createElementBlock(Fragment, { key: 0 }, renderList(__props.data, (row, index) => {
89
105
  return openBlock(), createBlock(DataListViewItem, {
90
106
  key: keyOf(row),
91
- selected: isSelected(row)
107
+ selected: isSelected(row),
108
+ active: unref(isActive)(row),
109
+ onClick: ($event) => unref(setActive)(row)
92
110
  }, {
93
111
  default: withCtx(() => [
94
112
  renderSlot(_ctx.$slots, "item", {
@@ -96,11 +114,13 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
96
114
  row,
97
115
  index,
98
116
  selected: isSelected(row),
99
- toggleSelect: () => toggleSelect(row)
117
+ toggleSelect: () => toggleSelect(row),
118
+ active: unref(isActive)(row),
119
+ setActive: () => unref(setActive)(row)
100
120
  }, void 0, true)
101
121
  ]),
102
122
  _: 2
103
- }, 1032, ["selected"]);
123
+ }, 1032, ["selected", "active", "onClick"]);
104
124
  }), 128)) : (openBlock(), createElementBlock("div", _hoisted_1, [
105
125
  renderSlot(_ctx.$slots, "empty", {}, () => [
106
126
  createVNode(unref(ElEmpty))
@@ -1,7 +1,7 @@
1
1
  import _sfc_main from "./DataListViewItem.vue2.mjs";
2
2
  /* empty css */
3
3
  import _export_sfc from "../../_virtual/_plugin-vue_export-helper.mjs";
4
- const DataListViewItem = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-d9b5d5ca"]]);
4
+ const DataListViewItem = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-c2a6c6be"]]);
5
5
  export {
6
6
  DataListViewItem as default
7
7
  };
@@ -2,12 +2,13 @@ import { defineComponent, openBlock, createElementBlock, normalizeClass, renderS
2
2
  const _sfc_main = /* @__PURE__ */ defineComponent({
3
3
  __name: "DataListViewItem",
4
4
  props: {
5
- selected: { type: Boolean }
5
+ selected: { type: Boolean },
6
+ active: { type: Boolean }
6
7
  },
7
8
  setup(__props) {
8
9
  return (_ctx, _cache) => {
9
10
  return openBlock(), createElementBlock("div", {
10
- class: normalizeClass(["data-list-view-item", { "is-selected": __props.selected }])
11
+ class: normalizeClass(["data-list-view-item", { "is-selected": __props.selected, "is-active": __props.active }])
11
12
  }, [
12
13
  renderSlot(_ctx.$slots, "default", {}, void 0, true)
13
14
  ], 2);
@@ -1,7 +1,7 @@
1
1
  import _sfc_main from "./ListLayout.vue2.mjs";
2
2
  /* empty css */
3
3
  import _export_sfc from "../../_virtual/_plugin-vue_export-helper.mjs";
4
- const ListLayout = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-a47ec619"]]);
4
+ const ListLayout = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-84c13797"]]);
5
5
  export {
6
6
  ListLayout as default
7
7
  };
@@ -56,15 +56,19 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
56
56
  "refreshInterval": {},
57
57
  "refreshIntervalModifiers": {},
58
58
  "customView": { type: Boolean, ...{ default: false } },
59
- "customViewModifiers": {}
59
+ "customViewModifiers": {},
60
+ "activeId": {},
61
+ "activeIdModifiers": {},
62
+ "activeData": {},
63
+ "activeDataModifiers": {}
60
64
  }),
61
- emits: /* @__PURE__ */ mergeModels(["dataChange", "pageInfoChange"], ["update:isAutoRefresh", "update:refreshInterval", "update:customView"]),
65
+ emits: /* @__PURE__ */ mergeModels(["dataChange", "pageInfoChange"], ["update:isAutoRefresh", "update:refreshInterval", "update:customView", "update:activeId", "update:activeData"]),
62
66
  setup(__props, { expose: __expose, emit: __emit }) {
63
67
  useCssVars((_ctx) => ({
64
- "v37fdcdf2": minHeight.value,
65
- "v5bcb0a52": unref(searchStickyTop),
66
- "v489faec3": unref(toolbarStickyTop),
67
- "v17e649c5": unref(pagerStickyBottom)
68
+ "d1ae0a92": minHeight.value,
69
+ "e3e22ffc": unref(searchStickyTop),
70
+ "v5ed78713": unref(toolbarStickyTop),
71
+ "v6ead0916": unref(pagerStickyBottom)
68
72
  }));
69
73
  const props = __props;
70
74
  const listLayoutEmits = __emit;
@@ -80,6 +84,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
80
84
  const isAutoRefresh = useModel(__props, "isAutoRefresh");
81
85
  const refreshInterval = useModel(__props, "refreshInterval");
82
86
  const customView = useModel(__props, "customView");
87
+ const activeId = useModel(__props, "activeId");
88
+ const activeData = useModel(__props, "activeData");
83
89
  const data = ref({});
84
90
  const query = ref(
85
91
  {}
@@ -292,9 +298,18 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
292
298
  showSearch.value = status;
293
299
  };
294
300
  __expose(expose);
301
+ const isSameListShape = (a, b) => a.length === b.length && a.every((item, i) => {
302
+ var _a;
303
+ return (item == null ? void 0 : item.key) === ((_a = b[i]) == null ? void 0 : _a.key);
304
+ });
295
305
  watch(
296
306
  () => props.list,
297
- (n) => {
307
+ (n, o) => {
308
+ if (o && n !== o && isSameListShape(n, o)) {
309
+ console.warn(
310
+ '[ListLayout] `list` 引用变了但内容形状没变,已按变更重新查询一次。常见原因是模板里写了内联字面量(如 :list="[]")——父组件每次重渲染都是新数组,会反复触发查询甚至成环。[MUST] 把它提成模块级 / setup 级稳定引用(或 computed)。'
311
+ );
312
+ }
298
313
  const fData = generateFormData(n);
299
314
  data.value = fData;
300
315
  if (props.initialSearch) {
@@ -383,6 +398,10 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
383
398
  "onUpdate:refreshInterval": _cache[1] || (_cache[1] = ($event) => refreshInterval.value = $event),
384
399
  "custom-view": customView.value,
385
400
  "onUpdate:customView": _cache[2] || (_cache[2] = ($event) => customView.value = $event),
401
+ "active-id": activeId.value,
402
+ "onUpdate:activeId": _cache[3] || (_cache[3] = ($event) => activeId.value = $event),
403
+ "active-data": activeData.value,
404
+ "onUpdate:activeData": _cache[4] || (_cache[4] = ($event) => activeData.value = $event),
386
405
  api: __props.api,
387
406
  columns: __props.columns,
388
407
  query: queryMerge.value,
@@ -425,14 +444,18 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
425
444
  })
426
445
  };
427
446
  })
428
- ]), 1040, ["is-auto-refresh", "refresh-interval", "custom-view", "api", "columns", "query", "maxHeight", "rowKey", "toolbar", "showSwitchView", "initial-search", "injectInfo"])) : (openBlock(), createBlock(unref(DataGridView), mergeProps({
447
+ ]), 1040, ["is-auto-refresh", "refresh-interval", "custom-view", "active-id", "active-data", "api", "columns", "query", "maxHeight", "rowKey", "toolbar", "showSwitchView", "initial-search", "injectInfo"])) : (openBlock(), createBlock(unref(DataGridView), mergeProps({
429
448
  key: 1,
430
449
  ref_key: "tableMain",
431
450
  ref: tableMain,
432
451
  "is-auto-refresh": isAutoRefresh.value,
433
- "onUpdate:isAutoRefresh": _cache[3] || (_cache[3] = ($event) => isAutoRefresh.value = $event),
452
+ "onUpdate:isAutoRefresh": _cache[5] || (_cache[5] = ($event) => isAutoRefresh.value = $event),
434
453
  "refresh-interval": refreshInterval.value,
435
- "onUpdate:refreshInterval": _cache[4] || (_cache[4] = ($event) => refreshInterval.value = $event),
454
+ "onUpdate:refreshInterval": _cache[6] || (_cache[6] = ($event) => refreshInterval.value = $event),
455
+ "active-id": activeId.value,
456
+ "onUpdate:activeId": _cache[7] || (_cache[7] = ($event) => activeId.value = $event),
457
+ "active-data": activeData.value,
458
+ "onUpdate:activeData": _cache[8] || (_cache[8] = ($event) => activeData.value = $event),
436
459
  api: __props.api,
437
460
  columns: __props.columns,
438
461
  query: queryMerge.value,
@@ -453,7 +476,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
453
476
  renderSlot(_ctx.$slots, "custom-view-item", normalizeProps(guardReactiveProps(assertDataViewItemScope(scope))), void 0, true)
454
477
  ]),
455
478
  _: 3
456
- }, 16, ["is-auto-refresh", "refresh-interval", "api", "columns", "query", "maxHeight", "rowKey", "toolbar", "initial-search", "injectInfo", "gridColumns", "infinite-list-props"]))
479
+ }, 16, ["is-auto-refresh", "refresh-interval", "active-id", "active-data", "api", "columns", "query", "maxHeight", "rowKey", "toolbar", "initial-search", "injectInfo", "gridColumns", "infinite-list-props"]))
457
480
  ]),
458
481
  _: 3
459
482
  }, 8, ["class", "separate", "type", "gap", "aside-width", "aside-max-height"])), [
@@ -2,7 +2,7 @@ import _sfc_main from "./ModalConfirm.vue2.mjs";
2
2
  /* empty css */
3
3
  /* empty css */
4
4
  import _export_sfc from "../../_virtual/_plugin-vue_export-helper.mjs";
5
- const ModalConfirm = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-fca575ec"]]);
5
+ const ModalConfirm = /* @__PURE__ */ _export_sfc(_sfc_main, [["__scopeId", "data-v-7ef0be5c"]]);
6
6
  export {
7
7
  ModalConfirm as default
8
8
  };
@@ -1,4 +1,4 @@
1
- import { defineComponent, computed, shallowRef, ref, inject, provide, openBlock, createBlock, resolveDynamicComponent, mergeProps, withCtx, createElementVNode, normalizeClass, renderSlot, createElementBlock, Fragment, createTextVNode, toDisplayString, unref, createCommentVNode, createVNode } from "vue";
1
+ import { defineComponent, computed, shallowRef, ref, inject, provide, openBlock, createBlock, resolveDynamicComponent, mergeProps, createSlots, withCtx, createElementVNode, normalizeClass, renderSlot, createElementBlock, Fragment, createTextVNode, toDisplayString, unref, createCommentVNode, createVNode } from "vue";
2
2
  import { ElDrawer, ElDialog, ElButton } from "element-plus";
3
3
  import { BODY_CONTENT_VIEWPORT_HEIGHT, SCOPE_VIEWPORT_MAX_HEIGHT } from "../../inject/key.mjs";
4
4
  import { useActivated } from "../../hooks/activated.mjs";
@@ -21,6 +21,8 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
21
21
  cancelText: { type: [String, Function], default: "取消" },
22
22
  confirmText: { type: [String, Function], default: "确定" },
23
23
  hiddenCancel: { type: Boolean, default: false },
24
+ hiddenHeader: { type: Boolean, default: false },
25
+ hiddenFooter: { type: Boolean, default: false },
24
26
  width: { default: 420 },
25
27
  reverse: { type: Boolean, default: false },
26
28
  closeOnPressEscape: { type: Boolean, default: true },
@@ -82,7 +84,12 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
82
84
  });
83
85
  const layerComponent = computed(() => isDrawer.value ? ElDrawer : ElDialog);
84
86
  const layerBind = computed(
85
- () => isDrawer.value ? { size: props.width, direction: props.direction } : { width: props.width, alignCenter: true }
87
+ () => isDrawer.value ? {
88
+ size: props.width,
89
+ direction: props.direction,
90
+ // drawer 有 EP 原生开关,隐藏时节点真不渲染(优于 CSS 兜)
91
+ withHeader: !props.hiddenHeader
92
+ } : { width: props.width, alignCenter: true }
86
93
  );
87
94
  const showLoading = ref(false);
88
95
  const loading = computed(() => {
@@ -122,7 +129,9 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
122
129
  "confirm-modal",
123
130
  {
124
131
  "confirm-modal_header-divider": showHeaderDivider.value,
125
- "confirm-modal_footer-divider": showFooterDivider.value
132
+ "confirm-modal_footer-divider": showFooterDivider.value,
133
+ // modal 形态用它兜 header 隐藏(EP 的 el-dialog__header 无条件渲染,见下方样式块)
134
+ "confirm-modal_hidden-header": __props.hiddenHeader
126
135
  }
127
136
  ],
128
137
  "show-close": __props.showClose,
@@ -130,50 +139,7 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
130
139
  "close-on-click-modal": __props.closeOnClickModal,
131
140
  "close-on-press-escape": __props.closeOnPressEscape,
132
141
  onClose: closeHandler
133
- }), {
134
- header: withCtx(() => [
135
- createElementVNode("div", _hoisted_1, [
136
- renderSlot(_ctx.$slots, "title", {}, () => [
137
- typeof __props.title === "function" ? (openBlock(), createBlock(resolveDynamicComponent(__props.title), { key: 0 })) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
138
- createTextVNode(toDisplayString(__props.title), 1)
139
- ], 64))
140
- ], true)
141
- ])
142
- ]),
143
- footer: withCtx(() => [
144
- createElementVNode("div", {
145
- class: "confirm-modal__footer",
146
- reverse: __props.reverse
147
- }, [
148
- renderSlot(_ctx.$slots, "footer", {
149
- cancelHandler,
150
- confirmHandler,
151
- loading: loading.value
152
- }, () => [
153
- !__props.hiddenCancel ? (openBlock(), createBlock(unref(ElButton), {
154
- key: 0,
155
- class: "confirm-modal__cancel",
156
- onClick: cancelHandler
157
- }, {
158
- default: withCtx(() => [
159
- createTextVNode(toDisplayString(typeof __props.cancelText === "function" ? __props.cancelText() : __props.cancelText), 1)
160
- ]),
161
- _: 1
162
- })) : createCommentVNode("", true),
163
- createVNode(unref(ElButton), {
164
- class: "confirm-modal__confirm",
165
- type: __props.type,
166
- loading: loading.value,
167
- onClick: confirmHandler
168
- }, {
169
- default: withCtx(() => [
170
- createTextVNode(toDisplayString(typeof __props.confirmText === "function" ? __props.confirmText() : __props.confirmText), 1)
171
- ]),
172
- _: 1
173
- }, 8, ["type", "loading"])
174
- ], true)
175
- ], 8, _hoisted_2)
176
- ]),
142
+ }), createSlots({
177
143
  default: withCtx(() => [
178
144
  createElementVNode("div", {
179
145
  ref_key: "contentRef",
@@ -189,8 +155,60 @@ const _sfc_main = /* @__PURE__ */ defineComponent({
189
155
  renderSlot(_ctx.$slots, "main-footer", {}, void 0, true)
190
156
  ], 2)
191
157
  ]),
192
- _: 3
193
- }, 16, ["model-value", "class", "show-close", "close-on-click-modal", "close-on-press-escape"]);
158
+ _: 2
159
+ }, [
160
+ !__props.hiddenHeader ? {
161
+ name: "header",
162
+ fn: withCtx(() => [
163
+ createElementVNode("div", _hoisted_1, [
164
+ renderSlot(_ctx.$slots, "title", {}, () => [
165
+ typeof __props.title === "function" ? (openBlock(), createBlock(resolveDynamicComponent(__props.title), { key: 0 })) : (openBlock(), createElementBlock(Fragment, { key: 1 }, [
166
+ createTextVNode(toDisplayString(__props.title), 1)
167
+ ], 64))
168
+ ], true)
169
+ ])
170
+ ]),
171
+ key: "0"
172
+ } : void 0,
173
+ !__props.hiddenFooter ? {
174
+ name: "footer",
175
+ fn: withCtx(() => [
176
+ createElementVNode("div", {
177
+ class: "confirm-modal__footer",
178
+ reverse: __props.reverse
179
+ }, [
180
+ renderSlot(_ctx.$slots, "footer", {
181
+ cancelHandler,
182
+ confirmHandler,
183
+ loading: loading.value
184
+ }, () => [
185
+ !__props.hiddenCancel ? (openBlock(), createBlock(unref(ElButton), {
186
+ key: 0,
187
+ class: "confirm-modal__cancel",
188
+ onClick: cancelHandler
189
+ }, {
190
+ default: withCtx(() => [
191
+ createTextVNode(toDisplayString(typeof __props.cancelText === "function" ? __props.cancelText() : __props.cancelText), 1)
192
+ ]),
193
+ _: 1
194
+ })) : createCommentVNode("", true),
195
+ createVNode(unref(ElButton), {
196
+ class: "confirm-modal__confirm",
197
+ type: __props.type,
198
+ loading: loading.value,
199
+ onClick: confirmHandler
200
+ }, {
201
+ default: withCtx(() => [
202
+ createTextVNode(toDisplayString(typeof __props.confirmText === "function" ? __props.confirmText() : __props.confirmText), 1)
203
+ ]),
204
+ _: 1
205
+ }, 8, ["type", "loading"])
206
+ ], true)
207
+ ], 8, _hoisted_2)
208
+ ]),
209
+ key: "1"
210
+ } : void 0
211
+ ]), 1040, ["model-value", "class", "show-close", "close-on-click-modal", "close-on-press-escape"]);
194
212
  };
195
213
  }
196
214
  });