smart-admin-web 10.20.1 → 10.22.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 (165) hide show
  1. package/dist/api/index.d.ts +19 -1
  2. package/dist/api/index.js +85 -66
  3. package/dist/api/index.js.map +1 -1
  4. package/dist/api/schema.d.ts +448 -1
  5. package/dist/assets/icons/ph-subset.json.js +1 -1
  6. package/dist/components/FormContainer/index.vue.js +87 -75
  7. package/dist/components/FormContainer/index.vue.js.map +1 -1
  8. package/dist/components/UserPicker/UserAvatar.vue.d.ts +8 -0
  9. package/dist/components/UserPicker/UserAvatar.vue.js +8 -0
  10. package/dist/components/UserPicker/UserAvatar.vue.js.map +1 -0
  11. package/dist/components/UserPicker/UserAvatar2.vue.js +38 -0
  12. package/dist/components/UserPicker/UserAvatar2.vue.js.map +1 -0
  13. package/dist/components/UserPicker/index.vue.js +1 -1
  14. package/dist/components/UserPicker/index2.vue.js +328 -186
  15. package/dist/components/UserPicker/index2.vue.js.map +1 -1
  16. package/dist/composables/authMenuRoute.d.ts +10 -0
  17. package/dist/composables/authMenuRoute.js +39 -23
  18. package/dist/composables/authMenuRoute.js.map +1 -1
  19. package/dist/composables/useModule.d.ts +3 -1
  20. package/dist/composables/useModule.js +44 -32
  21. package/dist/composables/useModule.js.map +1 -1
  22. package/dist/index.js +246 -242
  23. package/dist/layouts/components/SideNav.vue.js +2 -2
  24. package/dist/layouts/components/SideNav2.vue.js.map +1 -1
  25. package/dist/lib/runtime.js +1 -1
  26. package/dist/lib/watermark.d.ts +1 -1
  27. package/dist/locales/en-US.d.ts +68 -3
  28. package/dist/locales/en-US.js +74 -8
  29. package/dist/locales/en-US.js.map +1 -1
  30. package/dist/locales/kernelMenuTitles.js +1 -0
  31. package/dist/locales/kernelMenuTitles.js.map +1 -1
  32. package/dist/locales/zh-CN.d.ts +68 -3
  33. package/dist/locales/zh-CN.js +74 -8
  34. package/dist/locales/zh-CN.js.map +1 -1
  35. package/dist/router/viewRegistry.js +6 -6
  36. package/dist/router/viewRegistry.js.map +1 -1
  37. package/dist/style.css +1 -1
  38. package/dist/theme/naive-theme.js +80 -77
  39. package/dist/theme/naive-theme.js.map +1 -1
  40. package/dist/types/api.d.ts +91 -0
  41. package/dist/types/api.js +17 -15
  42. package/dist/types/api.js.map +1 -1
  43. package/dist/utils/shake.d.ts +1 -0
  44. package/dist/utils/shake.js +30 -0
  45. package/dist/utils/shake.js.map +1 -0
  46. package/dist/utils/tree.d.ts +15 -0
  47. package/dist/utils/tree.js +43 -29
  48. package/dist/utils/tree.js.map +1 -1
  49. package/dist/utils/treeCard.d.ts +6 -0
  50. package/dist/utils/treeCard.js +9 -0
  51. package/dist/utils/treeCard.js.map +1 -0
  52. package/dist/views/error/404.vue.js +2 -2
  53. package/dist/views/error/4042.vue.js +81 -24
  54. package/dist/views/error/4042.vue.js.map +1 -1
  55. package/dist/views/login/LoginForm.vue.js +2 -2
  56. package/dist/views/login/LoginForm2.vue.js +135 -135
  57. package/dist/views/login/LoginForm2.vue.js.map +1 -1
  58. package/dist/views/login/components/LoginDesk.vue.js +2 -2
  59. package/dist/views/login/components/LoginDesk2.vue.js +59 -47
  60. package/dist/views/login/components/LoginDesk2.vue.js.map +1 -1
  61. package/dist/views/login/components/LoginHeroPanel.vue.js +2 -2
  62. package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -1
  63. package/dist/views/personal/notice2.vue.js +1 -1
  64. package/dist/views/personal/notice2.vue.js.map +1 -1
  65. package/dist/views/personal/sessions.vue.js +2 -2
  66. package/dist/views/personal/sessions2.vue.js +41 -40
  67. package/dist/views/personal/sessions2.vue.js.map +1 -1
  68. package/dist/views/system/ai-usage/index.vue.js +3 -3
  69. package/dist/views/system/ai-usage/index2.vue.js +13 -12
  70. package/dist/views/system/ai-usage/index2.vue.js.map +1 -1
  71. package/dist/views/system/config/components/AdvancedSection.vue.js +3 -3
  72. package/dist/views/system/config/components/AdvancedSection2.vue.js +2 -1
  73. package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -1
  74. package/dist/views/system/dict/index.vue.js +2 -2
  75. package/dist/views/system/dict/index2.vue.js +12 -1
  76. package/dist/views/system/dict/index2.vue.js.map +1 -1
  77. package/dist/views/system/file/index2.vue.js +1 -0
  78. package/dist/views/system/file/index2.vue.js.map +1 -1
  79. package/dist/views/system/job/index.vue.js +3 -3
  80. package/dist/views/system/job/index2.vue.js +182 -181
  81. package/dist/views/system/job/index2.vue.js.map +1 -1
  82. package/dist/views/system/job-log/components/AttemptTable2.vue.js +8 -3
  83. package/dist/views/system/job-log/components/AttemptTable2.vue.js.map +1 -1
  84. package/dist/views/system/job-log/index.vue.js +1 -1
  85. package/dist/views/system/job-log/index2.vue.js +5 -5
  86. package/dist/views/system/job-log/index2.vue.js.map +1 -1
  87. package/dist/views/system/job-monitor/index.vue.js +2 -2
  88. package/dist/views/system/job-monitor/index2.vue.js +46 -46
  89. package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
  90. package/dist/views/system/log/exception/index.vue.js +2 -2
  91. package/dist/views/system/log/exception/index2.vue.js +8 -5
  92. package/dist/views/system/log/exception/index2.vue.js.map +1 -1
  93. package/dist/views/system/log/login/index2.vue.js +21 -12
  94. package/dist/views/system/log/login/index2.vue.js.map +1 -1
  95. package/dist/views/system/log/op/index.vue.js +2 -2
  96. package/dist/views/system/log/op/index2.vue.js +50 -40
  97. package/dist/views/system/log/op/index2.vue.js.map +1 -1
  98. package/dist/views/system/menu/components/ButtonManager.vue.js +2 -2
  99. package/dist/views/system/menu/components/ButtonManager2.vue.js +45 -36
  100. package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -1
  101. package/dist/views/system/menu/index.vue.js +1 -1
  102. package/dist/views/system/menu/index2.vue.js +162 -151
  103. package/dist/views/system/menu/index2.vue.js.map +1 -1
  104. package/dist/views/system/module/index.vue.js +1 -1
  105. package/dist/views/system/module/index2.vue.js +171 -117
  106. package/dist/views/system/module/index2.vue.js.map +1 -1
  107. package/dist/views/system/notice/index.vue.js +3 -3
  108. package/dist/views/system/notice/index2.vue.js +1 -0
  109. package/dist/views/system/notice/index2.vue.js.map +1 -1
  110. package/dist/views/system/org/index.vue.js +2 -2
  111. package/dist/views/system/org/index2.vue.js +204 -195
  112. package/dist/views/system/org/index2.vue.js.map +1 -1
  113. package/dist/views/system/position/index.vue.js +2 -2
  114. package/dist/views/system/position/index2.vue.js +57 -48
  115. package/dist/views/system/position/index2.vue.js.map +1 -1
  116. package/dist/views/system/recycle/index.vue.js +1 -1
  117. package/dist/views/system/recycle/index2.vue.js +3 -1
  118. package/dist/views/system/recycle/index2.vue.js.map +1 -1
  119. package/dist/views/system/role/components/GrantMenuSheet.vue.d.ts +2 -0
  120. package/dist/views/system/role/components/GrantMenuSheet.vue.js +2 -2
  121. package/dist/views/system/role/components/GrantMenuSheet2.vue.js +54 -49
  122. package/dist/views/system/role/components/GrantMenuSheet2.vue.js.map +1 -1
  123. package/dist/views/system/role/components/GrantMenuTable.vue.js +1 -1
  124. package/dist/views/system/role/components/GrantMenuTable2.vue.js +159 -195
  125. package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -1
  126. package/dist/views/system/role/components/grantMenuGroups.d.ts +54 -0
  127. package/dist/views/system/role/components/grantMenuGroups.js +116 -76
  128. package/dist/views/system/role/components/grantMenuGroups.js.map +1 -1
  129. package/dist/views/system/role/index.vue.js +2 -2
  130. package/dist/views/system/role/index2.vue.js +152 -145
  131. package/dist/views/system/role/index2.vue.js.map +1 -1
  132. package/dist/views/system/session/index2.vue.js +39 -35
  133. package/dist/views/system/session/index2.vue.js.map +1 -1
  134. package/dist/views/system/user/components/UserGrantEffectiveTable.vue.d.ts +10 -0
  135. package/dist/views/system/user/components/UserGrantEffectiveTable.vue.js +5 -0
  136. package/dist/views/system/user/components/UserGrantEffectiveTable.vue.js.map +1 -0
  137. package/dist/views/system/user/components/UserGrantEffectiveTable2.vue.js +96 -0
  138. package/dist/views/system/user/components/UserGrantEffectiveTable2.vue.js.map +1 -0
  139. package/dist/views/system/user/components/UserGrantMenuSheet.vue.d.ts +13 -0
  140. package/dist/views/system/user/components/UserGrantMenuSheet.vue.js +8 -0
  141. package/dist/views/system/user/components/UserGrantMenuSheet.vue.js.map +1 -0
  142. package/dist/views/system/user/components/UserGrantMenuSheet2.vue.js +216 -0
  143. package/dist/views/system/user/components/UserGrantMenuSheet2.vue.js.map +1 -0
  144. package/dist/views/system/user/components/UserGrantMenuTable.vue.d.ts +13 -0
  145. package/dist/views/system/user/components/UserGrantMenuTable.vue.js +8 -0
  146. package/dist/views/system/user/components/UserGrantMenuTable.vue.js.map +1 -0
  147. package/dist/views/system/user/components/UserGrantMenuTable2.vue.js +186 -0
  148. package/dist/views/system/user/components/UserGrantMenuTable2.vue.js.map +1 -0
  149. package/dist/views/system/user/components/UserGrantNodeRow.vue.d.ts +31 -0
  150. package/dist/views/system/user/components/UserGrantNodeRow.vue.js +8 -0
  151. package/dist/views/system/user/components/UserGrantNodeRow.vue.js.map +1 -0
  152. package/dist/views/system/user/components/UserGrantNodeRow2.vue.js +171 -0
  153. package/dist/views/system/user/components/UserGrantNodeRow2.vue.js.map +1 -0
  154. package/dist/views/system/user/components/UserGrantOverviewDrawer.vue.d.ts +21 -0
  155. package/dist/views/system/user/components/UserGrantOverviewDrawer.vue.js +5 -0
  156. package/dist/views/system/user/components/UserGrantOverviewDrawer.vue.js.map +1 -0
  157. package/dist/views/system/user/components/UserGrantOverviewDrawer2.vue.js +178 -0
  158. package/dist/views/system/user/components/UserGrantOverviewDrawer2.vue.js.map +1 -0
  159. package/dist/views/system/user/components/userGrantState.d.ts +64 -0
  160. package/dist/views/system/user/components/userGrantState.js +117 -0
  161. package/dist/views/system/user/components/userGrantState.js.map +1 -0
  162. package/dist/views/system/user/index.vue.js +2 -2
  163. package/dist/views/system/user/index2.vue.js +369 -295
  164. package/dist/views/system/user/index2.vue.js.map +1 -1
  165. package/package.json +3 -3
@@ -1,38 +1,38 @@
1
- import { defineComponent as H, computed as M, ref as c, onMounted as V, reactive as $, resolveDirective as j, openBlock as z, createElementBlock as W, Fragment as G, createVNode as o, unref as l, withCtx as r, withDirectives as Q, createBlock as J, createTextVNode as K, toDisplayString as E, mergeProps as X, createElementVNode as Y, h as u } from "vue";
2
- import { useMessage as Z, NButton as g, NForm as ee, NFormItem as d, NInput as f, NSpace as x, NInputNumber as le, NSwitch as te, NTag as q, NTooltip as ae, NPopconfirm as oe } from "naive-ui";
3
- import { useMediaQuery as ie } from "@vueuse/core";
4
- import { SmartTable as ne } from "smart-naive-table";
1
+ import { defineComponent as Q, computed as N, ref as p, onMounted as J, reactive as K, resolveDirective as X, openBlock as S, createElementBlock as Y, Fragment as Z, createVNode as o, unref as l, withCtx as d, withDirectives as ee, createBlock as le, createTextVNode as A, toDisplayString as h, mergeProps as te, createElementVNode as R, h as u } from "vue";
2
+ import { useMessage as ae, NButton as w, NForm as oe, NFormItem as r, NInput as f, NSpace as k, NInputNumber as ie, NSwitch as O, NTooltip as F, NTag as T, NPopconfirm as ne } from "naive-ui";
3
+ import { useMediaQuery as de } from "@vueuse/core";
4
+ import { SmartTable as ue } from "smart-naive-table";
5
5
  import { useI18n as re } from "vue-i18n";
6
- import P from "../../../components/AppIcon.vue.js";
7
- import ue from "../../../components/IconPicker/index.vue.js";
8
- import de from "../../../components/FormContainer/index.vue.js";
6
+ import D from "../../../components/AppIcon.vue.js";
7
+ import se from "../../../components/IconPicker/index.vue.js";
8
+ import me from "../../../components/FormContainer/index.vue.js";
9
9
  /* empty css */
10
- import se from "../../../components/StatusSwitch/index.vue.js";
11
- import { useConfirm as me } from "../../../composables/useConfirm.js";
12
- import { useAuthStore as ce } from "../../../stores/auth.js";
13
- import { moduleApi as p } from "../../../api/index.js";
14
- import { translateError as C } from "../../../utils/error.js";
15
- import { TABLE_MIN_ROW_HEIGHT as fe, TABLE_TOOLBAR as pe } from "../../../utils/tableToolbar.js";
16
- import { deriveHeaderFilters as ve } from "../../../utils/tableFilter.js";
17
- import { lineIcon as be } from "../../../utils/menuIcon.js";
18
- const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
10
+ import ce from "../../../components/StatusSwitch/index.vue.js";
11
+ import { useConfirm as pe } from "../../../composables/useConfirm.js";
12
+ import { useAuthStore as fe } from "../../../stores/auth.js";
13
+ import { moduleApi as b } from "../../../api/index.js";
14
+ import { translateError as H } from "../../../utils/error.js";
15
+ import { TABLE_MIN_ROW_HEIGHT as be, TABLE_TOOLBAR as ve } from "../../../utils/tableToolbar.js";
16
+ import { deriveHeaderFilters as ge } from "../../../utils/tableFilter.js";
17
+ import { lineIcon as ye } from "../../../utils/menuIcon.js";
18
+ const he = { class: "hint" }, we = { style: { display: "inline-flex" } }, ke = { class: "hint" }, He = /* @__PURE__ */ Q({
19
19
  __name: "index",
20
- setup(he) {
21
- const { t } = re(), w = Z(), { run: B } = me(), k = ce(), S = ie("(max-width: 640px)"), A = M(
22
- () => S.value ? { labelPlacement: "top", labelWidth: void 0 } : { labelPlacement: "left", labelWidth: 90 }
23
- ), v = c(!1), _ = c([]), b = (e) => e.code === "system";
24
- async function y() {
20
+ setup(xe) {
21
+ const { t } = re(), x = ae(), { run: L } = pe(), _ = fe(), M = de("(max-width: 640px)"), V = N(
22
+ () => M.value ? { labelPlacement: "top", labelWidth: void 0 } : { labelPlacement: "left", labelWidth: 90 }
23
+ ), v = p(!1), z = p([]), c = (e) => e.code === "system";
24
+ async function g() {
25
25
  v.value = !0;
26
26
  try {
27
- _.value = await p.list();
27
+ z.value = await b.list();
28
28
  } catch (e) {
29
- w.error(C(e));
29
+ x.error(H(e));
30
30
  } finally {
31
31
  v.value = !1;
32
32
  }
33
33
  }
34
- V(y);
35
- const h = c(!1), N = c(null), O = {
34
+ J(g);
35
+ const y = p(!1), U = p(null), $ = {
36
36
  // whitespace: 纯空白不算填写
37
37
  code: {
38
38
  required: !0,
@@ -46,7 +46,10 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
46
46
  message: () => t("module.nameRequired"),
47
47
  trigger: ["input", "blur"]
48
48
  }
49
- }, m = c(null), R = () => ({
49
+ }, s = p(null), P = N(() => s.value !== null && i.code === "system"), I = N({
50
+ get: () => !P.value && i.isDelegatable === !0,
51
+ set: (e) => i.isDelegatable = e
52
+ }), E = () => ({
50
53
  code: "",
51
54
  title: "",
52
55
  icon: "",
@@ -54,8 +57,9 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
54
57
  apiPrefix: "",
55
58
  sort: 0,
56
59
  enabled: !0,
57
- remark: ""
58
- }), i = $(R()), T = (e) => ({
60
+ remark: "",
61
+ isDelegatable: !0
62
+ }), i = K(E()), q = (e) => ({
59
63
  code: e.code,
60
64
  title: e.title,
61
65
  icon: e.icon ?? "",
@@ -63,53 +67,69 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
63
67
  apiPrefix: e.apiPrefix ?? "",
64
68
  sort: e.sort,
65
69
  enabled: e.enabled,
66
- remark: e.remark ?? ""
70
+ remark: e.remark ?? "",
71
+ // 内置模块恒为不可转授:编辑回填与行内改状态都提交 false,不把后端偶发的 true 带回去
72
+ isDelegatable: c(e) ? !1 : e.isDelegatable ?? !1
67
73
  });
68
- function D() {
69
- m.value = null, Object.assign(i, R()), h.value = !0;
74
+ function j() {
75
+ s.value = null, Object.assign(i, E()), y.value = !0;
70
76
  }
71
- function F(e) {
72
- m.value = e.id, Object.assign(i, T(e)), h.value = !0;
77
+ function W(e) {
78
+ s.value = e.id, Object.assign(i, q(e)), y.value = !0;
73
79
  }
74
- async function L() {
80
+ async function G() {
75
81
  var e;
76
- await ((e = N.value) == null ? void 0 : e.validate());
82
+ await ((e = U.value) == null ? void 0 : e.validate());
77
83
  try {
78
- m.value === null ? await p.add({ ...i }) : await p.update(m.value, { ...i }), w.success(t("module.saved")), await y();
84
+ s.value === null ? await b.add({ ...i }) : await b.update(s.value, { ...i }), x.success(t("module.saved")), await g();
79
85
  } catch (a) {
80
- return w.error(C(a)), !1;
86
+ return x.error(H(a)), !1;
81
87
  }
82
88
  }
83
- const I = (e) => e ? u("span", { class: "mono muted" }, e) : u("span", { class: "faint" }, "—"), U = [
89
+ const B = (e) => e ? u("span", { class: "mono muted" }, e) : u("span", { class: "faint" }, "—"), C = [
84
90
  { type: "index", title: () => t("common.rowNo"), width: 64, align: "center" },
85
91
  {
86
92
  title: () => t("module.code"),
87
93
  key: "code",
94
+ width: 160,
95
+ ellipsis: { tooltip: !0 },
88
96
  search: {},
89
97
  render: (e) => u("span", { class: "mono" }, e.code)
90
98
  },
91
99
  {
92
100
  title: () => t("module.name"),
93
101
  key: "title",
102
+ ellipsis: { tooltip: !0 },
94
103
  // 窄档卡片以名称作标题(默认取第一个数据列 = 编码)
95
104
  card: "title",
96
105
  search: {},
97
- render: (e) => u(x, { align: "center", size: 6, wrapItem: !1 }, () => [
98
- e.icon ? u(P, { icon: be(e.icon), size: 18 }) : null,
106
+ render: (e) => u(k, { align: "center", size: 6, wrapItem: !1 }, () => [
107
+ e.icon ? u(D, { icon: ye(e.icon), size: 18 }) : null,
99
108
  e.title,
100
- b(e) ? u(q, { size: "small", type: "info", bordered: !1 }, () => t("module.builtin")) : null
109
+ c(e) ? u(T, { size: "small", type: "info", bordered: !1 }, () => t("module.builtin")) : null
101
110
  ])
102
111
  },
103
112
  {
104
113
  title: () => t("module.defaultRoute"),
105
114
  key: "defaultRoute",
106
- render: (e) => I(e.defaultRoute)
115
+ ellipsis: { tooltip: !0 },
116
+ render: (e) => B(e.defaultRoute)
107
117
  },
108
118
  {
109
119
  title: () => t("module.apiPrefix"),
110
120
  key: "apiPrefix",
111
121
  width: 120,
112
- render: (e) => I(e.apiPrefix)
122
+ render: (e) => B(e.apiPrefix)
123
+ },
124
+ {
125
+ title: () => t("module.delegatable"),
126
+ key: "isDelegatable",
127
+ width: 100,
128
+ render: (e) => u(
129
+ T,
130
+ { size: "small", bordered: !1, type: e.isDelegatable ? "success" : "default" },
131
+ () => t(e.isDelegatable ? "common.yes" : "common.no")
132
+ )
113
133
  },
114
134
  {
115
135
  title: () => t("module.sort"),
@@ -123,25 +143,25 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
123
143
  width: 90,
124
144
  // 无启停(update)权限者不见开关,退化为只读状态标签,保留状态可见性。
125
145
  render: (e) => {
126
- if (!k.hasPerm("PUT:/api/v1/sys/module/{id}"))
146
+ if (!_.hasPerm("PUT:/api/v1/sys/module/{id}"))
127
147
  return u(
128
- q,
148
+ T,
129
149
  { size: "small", bordered: !1, type: e.enabled ? "success" : "default" },
130
150
  () => t(e.enabled ? "common.enabled" : "common.disabled")
131
151
  );
132
- const a = u(se, {
152
+ const a = u(ce, {
133
153
  value: e.enabled,
134
154
  // 内置 system 应用停用会让门户失联(模块/菜单管理页都在它下面,停了就没法从 UI 恢复)——
135
155
  // 与「禁删」同级的前端保护;后端停用与删除内置模块都拒绝(42013),这里只是不给点。
136
- disabled: b(e),
156
+ disabled: c(e),
137
157
  // 停用会把应用从门户隐藏,先确认;启用无副作用,跳过确认(返回 null)。
138
- confirm: (s) => s ? null : t("module.disableConfirm", { title: e.title }),
139
- request: (s) => p.update(e.id, { ...T(e), enabled: s }),
140
- "onUpdate:value": (s) => {
141
- e.enabled = s;
158
+ confirm: (m) => m ? null : t("module.disableConfirm", { title: e.title }),
159
+ request: (m) => b.update(e.id, { ...q(e), enabled: m }),
160
+ "onUpdate:value": (m) => {
161
+ e.enabled = m;
142
162
  }
143
163
  });
144
- return b(e) ? u(ae, null, {
164
+ return c(e) ? u(F, null, {
145
165
  trigger: () => u("span", { style: "display: inline-flex" }, [a]),
146
166
  default: () => t("module.builtinNoDisable")
147
167
  }) : a;
@@ -154,23 +174,23 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
154
174
  align: "right",
155
175
  fixed: "right",
156
176
  hideInSetting: !0,
157
- render: (e) => u(x, { size: 2, justify: "end", wrapItem: !1 }, () => [
158
- k.hasPerm("PUT:/api/v1/sys/module/{id}") ? u(
159
- g,
160
- { size: "small", quaternary: !0, type: "primary", onClick: () => F(e) },
177
+ render: (e) => u(k, { size: 2, justify: "end", wrapItem: !1 }, () => [
178
+ _.hasPerm("PUT:/api/v1/sys/module/{id}") ? u(
179
+ w,
180
+ { size: "small", quaternary: !0, type: "primary", onClick: () => W(e) },
161
181
  () => t("common.edit")
162
182
  ) : null,
163
- b(e) || !k.hasPerm("DELETE:/api/v1/sys/module/{id}") ? null : u(
164
- oe,
183
+ c(e) || !_.hasPerm("DELETE:/api/v1/sys/module/{id}") ? null : u(
184
+ ne,
165
185
  {
166
186
  // popconfirm 留在模板层当触发器,「执行→toast」后半段交给 useConfirm().run。
167
- onPositiveClick: () => B(() => p.remove(e.id), t("module.deleted")).then((a) => {
168
- a && y();
187
+ onPositiveClick: () => L(() => b.remove(e.id), t("module.deleted")).then((a) => {
188
+ a && g();
169
189
  })
170
190
  },
171
191
  {
172
192
  trigger: () => u(
173
- g,
193
+ w,
174
194
  { size: "small", quaternary: !0, type: "error" },
175
195
  () => t("common.delete")
176
196
  ),
@@ -180,49 +200,49 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
180
200
  ])
181
201
  }
182
202
  ];
183
- return ve(U), (e, a) => {
184
- const s = j("auth");
185
- return z(), W(G, null, [
186
- o(l(ne), {
187
- columns: U,
188
- data: _.value,
203
+ return ge(C), (e, a) => {
204
+ const m = X("auth");
205
+ return S(), Y(Z, null, [
206
+ o(l(ue), {
207
+ columns: C,
208
+ data: z.value,
189
209
  loading: v.value,
190
210
  "row-key": "id",
191
211
  pagination: !1,
192
- toolbar: l(pe),
212
+ toolbar: l(ve),
193
213
  search: { container: "table" },
194
214
  "fill-height": "",
195
- "min-row-height": l(fe),
215
+ "min-row-height": l(be),
196
216
  "card-on-narrow": "",
197
217
  "storage-key": "sys-module"
198
218
  }, {
199
- "toolbar-right": r(() => [
200
- Q((z(), J(l(g), {
219
+ "toolbar-right": d(() => [
220
+ ee((S(), le(l(w), {
201
221
  type: "primary",
202
- onClick: D
222
+ onClick: j
203
223
  }, {
204
- icon: r(() => [
205
- o(P, {
224
+ icon: d(() => [
225
+ o(D, {
206
226
  icon: "ph:plus",
207
227
  size: 16
208
228
  })
209
229
  ]),
210
- default: r(() => [
211
- K(" " + E(l(t)("common.add")), 1)
230
+ default: d(() => [
231
+ A(" " + h(l(t)("common.add")), 1)
212
232
  ]),
213
233
  _: 1
214
234
  })), [
215
- [s, "POST:/api/v1/sys/module/add"]
235
+ [m, "POST:/api/v1/sys/module/add"]
216
236
  ]),
217
- o(l(g), {
237
+ o(l(w), {
218
238
  quaternary: "",
219
239
  circle: "",
220
240
  loading: v.value,
221
241
  "aria-label": l(t)("table.refresh"),
222
- onClick: y
242
+ onClick: g
223
243
  }, {
224
- icon: r(() => [
225
- o(P, {
244
+ icon: d(() => [
245
+ o(D, {
226
246
  icon: "ph:arrow-clockwise",
227
247
  size: 16
228
248
  })
@@ -232,43 +252,43 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
232
252
  ]),
233
253
  _: 1
234
254
  }, 8, ["data", "loading", "toolbar", "min-row-height"]),
235
- o(de, {
236
- show: h.value,
237
- "onUpdate:show": a[8] || (a[8] = (n) => h.value = n),
238
- title: m.value === null ? l(t)("module.addTitle") : l(t)("module.editTitle"),
255
+ o(me, {
256
+ show: y.value,
257
+ "onUpdate:show": a[9] || (a[9] = (n) => y.value = n),
258
+ title: s.value === null ? l(t)("module.addTitle") : l(t)("module.editTitle"),
239
259
  width: 520,
240
- "on-confirm": L,
260
+ "on-confirm": G,
241
261
  "confirm-text": l(t)("common.save")
242
262
  }, {
243
- default: r(() => [
244
- o(l(ee), X({
263
+ default: d(() => [
264
+ o(l(oe), te({
245
265
  ref_key: "formRef",
246
- ref: N,
266
+ ref: U,
247
267
  model: i,
248
- rules: O,
268
+ rules: $,
249
269
  "require-mark-placement": "left"
250
- }, A.value), {
251
- default: r(() => [
252
- o(l(d), {
270
+ }, V.value), {
271
+ default: d(() => [
272
+ o(l(r), {
253
273
  label: l(t)("module.code"),
254
274
  path: "code"
255
275
  }, {
256
- default: r(() => [
276
+ default: d(() => [
257
277
  o(l(f), {
258
278
  value: i.code,
259
279
  "onUpdate:value": a[0] || (a[0] = (n) => i.code = n),
260
280
  class: "mono",
261
281
  placeholder: l(t)("module.code"),
262
- disabled: m.value !== null
282
+ disabled: s.value !== null
263
283
  }, null, 8, ["value", "placeholder", "disabled"])
264
284
  ]),
265
285
  _: 1
266
286
  }, 8, ["label"]),
267
- o(l(d), {
287
+ o(l(r), {
268
288
  label: l(t)("module.name"),
269
289
  path: "title"
270
290
  }, {
271
- default: r(() => [
291
+ default: d(() => [
272
292
  o(l(f), {
273
293
  value: i.title,
274
294
  "onUpdate:value": a[1] || (a[1] = (n) => i.title = n),
@@ -277,21 +297,21 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
277
297
  ]),
278
298
  _: 1
279
299
  }, 8, ["label"]),
280
- o(l(d), {
300
+ o(l(r), {
281
301
  label: l(t)("module.icon")
282
302
  }, {
283
- default: r(() => [
284
- o(ue, {
303
+ default: d(() => [
304
+ o(se, {
285
305
  "model-value": i.icon ?? "",
286
306
  "onUpdate:modelValue": a[2] || (a[2] = (n) => i.icon = n)
287
307
  }, null, 8, ["model-value"])
288
308
  ]),
289
309
  _: 1
290
310
  }, 8, ["label"]),
291
- o(l(d), {
311
+ o(l(r), {
292
312
  label: l(t)("module.defaultRoute")
293
313
  }, {
294
- default: r(() => [
314
+ default: d(() => [
295
315
  o(l(f), {
296
316
  value: i.defaultRoute,
297
317
  "onUpdate:value": a[3] || (a[3] = (n) => i.defaultRoute = n),
@@ -301,34 +321,34 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
301
321
  ]),
302
322
  _: 1
303
323
  }, 8, ["label"]),
304
- o(l(d), {
324
+ o(l(r), {
305
325
  label: l(t)("module.apiPrefix")
306
326
  }, {
307
- default: r(() => [
308
- o(l(x), {
327
+ default: d(() => [
328
+ o(l(k), {
309
329
  vertical: "",
310
330
  size: 2,
311
331
  style: { width: "100%" }
312
332
  }, {
313
- default: r(() => [
333
+ default: d(() => [
314
334
  o(l(f), {
315
335
  value: i.apiPrefix,
316
336
  "onUpdate:value": a[4] || (a[4] = (n) => i.apiPrefix = n),
317
337
  class: "mono",
318
338
  placeholder: "sys"
319
339
  }, null, 8, ["value"]),
320
- Y("span", ye, E(l(t)("module.apiPrefixHint")), 1)
340
+ R("span", he, h(l(t)("module.apiPrefixHint")), 1)
321
341
  ]),
322
342
  _: 1
323
343
  })
324
344
  ]),
325
345
  _: 1
326
346
  }, 8, ["label"]),
327
- o(l(d), {
347
+ o(l(r), {
328
348
  label: l(t)("module.sort")
329
349
  }, {
330
- default: r(() => [
331
- o(l(le), {
350
+ default: d(() => [
351
+ o(l(ie), {
332
352
  value: i.sort,
333
353
  "onUpdate:value": a[5] || (a[5] = (n) => i.sort = n),
334
354
  min: 0,
@@ -337,24 +357,58 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
337
357
  ]),
338
358
  _: 1
339
359
  }, 8, ["label"]),
340
- o(l(d), {
360
+ o(l(r), {
341
361
  label: l(t)("common.status")
342
362
  }, {
343
- default: r(() => [
344
- o(l(te), {
363
+ default: d(() => [
364
+ o(l(O), {
345
365
  value: i.enabled,
346
366
  "onUpdate:value": a[6] || (a[6] = (n) => i.enabled = n)
347
367
  }, null, 8, ["value"])
348
368
  ]),
349
369
  _: 1
350
370
  }, 8, ["label"]),
351
- o(l(d), {
371
+ o(l(r), {
372
+ label: l(t)("module.delegatable")
373
+ }, {
374
+ default: d(() => [
375
+ o(l(k), {
376
+ vertical: "",
377
+ size: 2,
378
+ style: { width: "100%" }
379
+ }, {
380
+ default: d(() => [
381
+ o(l(F), {
382
+ disabled: !P.value
383
+ }, {
384
+ trigger: d(() => [
385
+ R("span", we, [
386
+ o(l(O), {
387
+ value: I.value,
388
+ "onUpdate:value": a[7] || (a[7] = (n) => I.value = n),
389
+ disabled: P.value
390
+ }, null, 8, ["value", "disabled"])
391
+ ])
392
+ ]),
393
+ default: d(() => [
394
+ A(" " + h(l(t)("module.builtinNotDelegatable")), 1)
395
+ ]),
396
+ _: 1
397
+ }, 8, ["disabled"]),
398
+ R("span", ke, h(l(t)("module.delegatableHint")), 1)
399
+ ]),
400
+ _: 1
401
+ })
402
+ ]),
403
+ _: 1
404
+ }, 8, ["label"]),
405
+ o(l(r), {
352
406
  label: l(t)("module.remark")
353
407
  }, {
354
- default: r(() => [
408
+ default: d(() => [
355
409
  o(l(f), {
356
410
  value: i.remark,
357
- "onUpdate:value": a[7] || (a[7] = (n) => i.remark = n),
411
+ "onUpdate:value": a[8] || (a[8] = (n) => i.remark = n),
358
412
  type: "textarea",
359
413
  autosize: { minRows: 2 }
360
414
  }, null, 8, ["value"])
@@ -372,6 +426,6 @@ const ye = { class: "hint" }, Ae = /* @__PURE__ */ H({
372
426
  }
373
427
  });
374
428
  export {
375
- Ae as default
429
+ He as default
376
430
  };
377
431
  //# sourceMappingURL=index2.vue.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/module/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, onMounted, reactive, ref } from 'vue'\nimport {\n NButton,\n NSpace,\n NTag,\n NTooltip,\n NForm,\n NFormItem,\n NInput,\n NInputNumber,\n NSwitch,\n NPopconfirm,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { useMediaQuery } from '@vueuse/core'\nimport { SmartTable, type SmartTableColumn } from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport IconPicker from '#/components/IconPicker/index.vue'\nimport FormContainer from '#/components/FormContainer/index.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useAuthStore } from '#/stores/auth'\nimport { moduleApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport type { ModuleInput, ModuleRow } from '#/types/api'\n\nimport { deriveHeaderFilters } from '#/utils/tableFilter'\nimport { lineIcon } from '#/utils/menuIcon'\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\n\n// 窄屏:表单标签放上方(底部抽屉里横排标签太挤);宽 / 中档沿用左标签\nconst narrowForm = useMediaQuery('(max-width: 640px)')\nconst formLayout = computed(() =>\n narrowForm.value\n ? { labelPlacement: 'top' as const, labelWidth: undefined }\n : { labelPlacement: 'left' as const, labelWidth: 90 },\n)\n\nconst loading = ref(false)\nconst rows = ref<ModuleRow[]>([])\n\n/** 内置 system 模块受保护(后端 42013),前端据 code 禁删,避免明知不可为的请求。 */\nconst isBuiltin = (r: ModuleRow) => r.code === 'system'\n\nasync function load() {\n loading.value = true\n try {\n rows.value = await moduleApi.list()\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\nonMounted(load)\n\n// ── 新增/编辑弹窗(FormContainer:loading/底栏/关闭时机由容器按 onConfirm 协议接管)──\nconst show = ref(false)\nconst formRef = ref<FormInst | null>(null)\nconst rules: FormRules = {\n // whitespace: 纯空白不算填写\n code: {\n required: true,\n whitespace: true,\n message: () => t('module.codeRequired'),\n trigger: ['input', 'blur'],\n },\n title: {\n required: true,\n whitespace: true,\n message: () => t('module.nameRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst editingId = ref<number | null>(null)\nconst blank = (): ModuleInput => ({\n code: '',\n title: '',\n icon: '',\n defaultRoute: '',\n apiPrefix: '',\n sort: 0,\n enabled: true,\n remark: '',\n})\nconst form = reactive<ModuleInput>(blank())\n\n/** 行数据 → 完整入参:openEdit 回填与 StatusSwitch 行内改状态共用(后端无独立启停端点,均走全量 update)。 */\nconst toInput = (r: ModuleRow): ModuleInput => ({\n code: r.code,\n title: r.title,\n icon: r.icon ?? '',\n defaultRoute: r.defaultRoute ?? '',\n apiPrefix: r.apiPrefix ?? '',\n sort: r.sort,\n enabled: r.enabled,\n remark: r.remark ?? '',\n})\n\nfunction openAdd() {\n editingId.value = null\n Object.assign(form, blank())\n show.value = true\n}\nfunction openEdit(r: ModuleRow) {\n editingId.value = r.id\n Object.assign(form, toInput(r))\n show.value = true\n}\n\n/** FormContainer onConfirm:校验失败 reject / API 失败 return false → 弹层不关;成功正常返回自动关。 */\nasync function save() {\n await formRef.value?.validate()\n try {\n if (editingId.value === null) await moduleApi.add({ ...form })\n else await moduleApi.update(editingId.value, { ...form })\n message.success(t('module.saved'))\n await load()\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n\n/** 默认路由 / 路由前缀单元格:有值用等宽次级色,空值画灰色的「—」。 */\nconst cellText = (v?: string | null) =>\n v ? h('span', { class: 'mono muted' }, v) : h('span', { class: 'faint' }, '—')\n\nconst columns: SmartTableColumn<ModuleRow>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n title: () => t('module.code'),\n key: 'code',\n search: {},\n render: r => h('span', { class: 'mono' }, r.code),\n },\n {\n title: () => t('module.name'),\n key: 'title',\n // 窄档卡片以名称作标题(默认取第一个数据列 = 编码)\n card: 'title',\n search: {},\n render: r =>\n h(NSpace, { align: 'center', size: 6, wrapItem: false }, () => [\n r.icon ? h(AppIcon, { icon: lineIcon(r.icon), size: 18 }) : null,\n r.title,\n isBuiltin(r)\n ? h(NTag, { size: 'small', type: 'info', bordered: false }, () => t('module.builtin'))\n : null,\n ]),\n },\n {\n title: () => t('module.defaultRoute'),\n key: 'defaultRoute',\n render: r => cellText(r.defaultRoute),\n },\n {\n title: () => t('module.apiPrefix'),\n key: 'apiPrefix',\n width: 120,\n render: r => cellText(r.apiPrefix),\n },\n {\n title: () => t('module.sort'),\n key: 'sort',\n width: 80,\n render: r => h('span', { class: 'num muted' }, r.sort),\n },\n {\n title: () => t('common.status'),\n key: 'enabled',\n width: 90,\n // 无启停(update)权限者不见开关,退化为只读状态标签,保留状态可见性。\n render: r => {\n if (!authStore.hasPerm('PUT:/api/v1/sys/module/{id}'))\n return h(\n NTag,\n { size: 'small', bordered: false, type: r.enabled ? 'success' : 'default' },\n () => t(r.enabled ? 'common.enabled' : 'common.disabled'),\n )\n const sw = h(StatusSwitch, {\n value: r.enabled,\n // 内置 system 应用停用会让门户失联(模块/菜单管理页都在它下面,停了就没法从 UI 恢复)——\n // 与「禁删」同级的前端保护;后端停用与删除内置模块都拒绝(42013),这里只是不给点。\n disabled: isBuiltin(r),\n // 停用会把应用从门户隐藏,先确认;启用无副作用,跳过确认(返回 null)。\n confirm: (next: boolean) => (next ? null : t('module.disableConfirm', { title: r.title })),\n request: (next: boolean) => moduleApi.update(r.id, { ...toInput(r), enabled: next }),\n 'onUpdate:value': (v: boolean) => {\n r.enabled = v\n },\n })\n // 灰掉的开关悬停说明原因(包一层 span:禁用的开关自己收不到鼠标事件)\n return isBuiltin(r)\n ? h(NTooltip, null, {\n trigger: () => h('span', { style: 'display: inline-flex' }, [sw]),\n default: () => t('module.builtinNoDisable'),\n })\n : sw\n },\n },\n {\n title: () => t('common.operation'),\n key: 'op',\n width: 140,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 2, justify: 'end', wrapItem: false }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/module/{id}')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openEdit(r) },\n () => t('common.edit'),\n )\n : null,\n isBuiltin(r) || !authStore.hasPerm('DELETE:/api/v1/sys/module/{id}')\n ? null\n : h(\n NPopconfirm,\n {\n // popconfirm 留在模板层当触发器,「执行→toast」后半段交给 useConfirm().run。\n onPositiveClick: () =>\n run(() => moduleApi.remove(r.id), t('module.deleted')).then(ok => {\n if (ok) load()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('module.deleteConfirm', { title: r.title }),\n },\n ),\n ]),\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <!-- 静态数据模式:module 只有全量 list 端点,没有分页端点 —— 条件搜索由表格在前端求值;\n 3.0 对静态数据会自己隐藏内置刷新,所以右侧自带一个刷新按钮重新拉取。 -->\n <SmartTable\n :columns=\"columns\"\n :data=\"rows\"\n :loading=\"loading\"\n row-key=\"id\"\n :pagination=\"false\"\n :toolbar=\"TABLE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-module\"\n >\n <template #toolbar-right>\n <n-button v-auth=\"'POST:/api/v1/sys/module/add'\" type=\"primary\" @click=\"openAdd\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n <!-- 静态数据没有内置刷新:这里补一个,形态与内置图标按钮一致(圆形、无底),紧跟在业务按钮后 -->\n <n-button quaternary circle :loading=\"loading\" :aria-label=\"t('table.refresh')\" @click=\"load\">\n <template #icon><AppIcon icon=\"ph:arrow-clockwise\" :size=\"16\" /></template>\n </n-button>\n </template>\n </SmartTable>\n\n <FormContainer\n v-model:show=\"show\"\n :title=\"editingId === null ? t('module.addTitle') : t('module.editTitle')\"\n :width=\"520\"\n :on-confirm=\"save\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form\n ref=\"formRef\"\n :model=\"form\"\n :rules=\"rules\"\n require-mark-placement=\"left\"\n v-bind=\"formLayout\"\n >\n <n-form-item :label=\"t('module.code')\" path=\"code\">\n <n-input\n v-model:value=\"form.code\"\n class=\"mono\"\n :placeholder=\"t('module.code')\"\n :disabled=\"editingId !== null\"\n />\n </n-form-item>\n <n-form-item :label=\"t('module.name')\" path=\"title\">\n <n-input v-model:value=\"form.title\" :placeholder=\"t('module.name')\" />\n </n-form-item>\n <n-form-item :label=\"t('module.icon')\">\n <IconPicker\n :model-value=\"form.icon ?? ''\"\n @update:model-value=\"(v: string) => (form.icon = v)\"\n />\n </n-form-item>\n <n-form-item :label=\"t('module.defaultRoute')\">\n <n-input\n v-model:value=\"form.defaultRoute as string\"\n class=\"mono\"\n placeholder=\"/system/user\"\n />\n </n-form-item>\n <n-form-item :label=\"t('module.apiPrefix')\">\n <n-space vertical :size=\"2\" style=\"width: 100%\">\n <n-input v-model:value=\"form.apiPrefix as string\" class=\"mono\" placeholder=\"sys\" />\n <span class=\"hint\">{{ t('module.apiPrefixHint') }}</span>\n </n-space>\n </n-form-item>\n <n-form-item :label=\"t('module.sort')\">\n <n-input-number v-model:value=\"form.sort\" :min=\"0\" style=\"width: 160px\" />\n </n-form-item>\n <n-form-item :label=\"t('common.status')\">\n <n-switch v-model:value=\"form.enabled\" />\n </n-form-item>\n <n-form-item :label=\"t('module.remark')\">\n <n-input v-model:value=\"form.remark as string\" type=\"textarea\" :autosize=\"{ minRows: 2 }\" />\n </n-form-item>\n </n-form>\n </FormContainer>\n</template>\n\n<style scoped>\n.hint {\n font-size: 13px;\n line-height: 1.5;\n color: var(--text-3);\n}\n\n/* 辅助字样(表格单元格由库渲染,用 :deep;表单里的输入框是自己的元素,直接命中) */\n.mono,\n:deep(.mono) {\n font-family: var(--font-mono);\n font-size: 13.5px;\n letter-spacing: 0;\n}\n:deep(.muted) {\n color: var(--text-2);\n}\n:deep(.faint) {\n color: var(--text-3);\n}\n:deep(.num) {\n font-variant-numeric: tabular-nums;\n}\n</style>\n"],"names":["useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","narrowForm","useMediaQuery","formLayout","computed","loading","ref","rows","isBuiltin","r","load","moduleApi","translateError","onMounted","show","formRef","rules","editingId","blank","form","reactive","toInput","openAdd","openEdit","save","_a","e","cellText","v","h","columns","NSpace","AppIcon","lineIcon","NTag","sw","StatusSwitch","next","NTooltip","NButton","NPopconfirm","ok","deriveHeaderFilters","_createVNode","_unref","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_createBlock","_createTextVNode","FormContainer","$event","_mergeProps","NFormItem","NInput","_cache","IconPicker","_createElementVNode","_hoisted_1","_toDisplayString","NInputNumber","NSwitch"],"mappings":"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"}
1
+ {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/module/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { computed, h, onMounted, reactive, ref } from 'vue'\nimport {\n NButton,\n NSpace,\n NTag,\n NTooltip,\n NForm,\n NFormItem,\n NInput,\n NInputNumber,\n NSwitch,\n NPopconfirm,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { useMediaQuery } from '@vueuse/core'\nimport { SmartTable, type SmartTableColumn } from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport IconPicker from '#/components/IconPicker/index.vue'\nimport FormContainer from '#/components/FormContainer/index.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useAuthStore } from '#/stores/auth'\nimport { moduleApi } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport type { ModuleInput, ModuleRow } from '#/types/api'\n\nimport { deriveHeaderFilters } from '#/utils/tableFilter'\nimport { lineIcon } from '#/utils/menuIcon'\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\n\n// 窄屏:表单标签放上方(底部抽屉里横排标签太挤);宽 / 中档沿用左标签\nconst narrowForm = useMediaQuery('(max-width: 640px)')\nconst formLayout = computed(() =>\n narrowForm.value\n ? { labelPlacement: 'top' as const, labelWidth: undefined }\n : { labelPlacement: 'left' as const, labelWidth: 90 },\n)\n\nconst loading = ref(false)\nconst rows = ref<ModuleRow[]>([])\n\n/** 内置 system 模块受保护(后端 42013),前端据 code 禁删,避免明知不可为的请求。 */\nconst isBuiltin = (r: ModuleRow) => r.code === 'system'\n\nasync function load() {\n loading.value = true\n try {\n rows.value = await moduleApi.list()\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\nonMounted(load)\n\n// ── 新增/编辑弹窗(FormContainer:loading/底栏/关闭时机由容器按 onConfirm 协议接管)──\nconst show = ref(false)\nconst formRef = ref<FormInst | null>(null)\nconst rules: FormRules = {\n // whitespace: 纯空白不算填写\n code: {\n required: true,\n whitespace: true,\n message: () => t('module.codeRequired'),\n trigger: ['input', 'blur'],\n },\n title: {\n required: true,\n whitespace: true,\n message: () => t('module.nameRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst editingId = ref<number | null>(null)\n/** 正在编辑内置 system 模块:可转授开关固定关、置灰(后端读写都按 false)。 */\nconst editingBuiltin = computed(() => editingId.value !== null && form.code === 'system')\n/** NSwitch 只收布尔,null(存量模块)按关显示;内置模块恒显示为关,不论后端返回什么。 */\nconst delegatable = computed({\n get: () => !editingBuiltin.value && form.isDelegatable === true,\n set: (v: boolean) => (form.isDelegatable = v),\n})\nconst blank = (): ModuleInput => ({\n code: '',\n title: '',\n icon: '',\n defaultRoute: '',\n apiPrefix: '',\n sort: 0,\n enabled: true,\n remark: '',\n isDelegatable: true,\n})\nconst form = reactive<ModuleInput>(blank())\n\n/** 行数据 → 完整入参:openEdit 回填与 StatusSwitch 行内改状态共用(后端无独立启停端点,均走全量 update)。 */\nconst toInput = (r: ModuleRow): ModuleInput => ({\n code: r.code,\n title: r.title,\n icon: r.icon ?? '',\n defaultRoute: r.defaultRoute ?? '',\n apiPrefix: r.apiPrefix ?? '',\n sort: r.sort,\n enabled: r.enabled,\n remark: r.remark ?? '',\n // 内置模块恒为不可转授:编辑回填与行内改状态都提交 false,不把后端偶发的 true 带回去\n isDelegatable: isBuiltin(r) ? false : (r.isDelegatable ?? false),\n})\n\nfunction openAdd() {\n editingId.value = null\n Object.assign(form, blank())\n show.value = true\n}\nfunction openEdit(r: ModuleRow) {\n editingId.value = r.id\n Object.assign(form, toInput(r))\n show.value = true\n}\n\n/** FormContainer onConfirm:校验失败 reject / API 失败 return false → 弹层不关;成功正常返回自动关。 */\nasync function save() {\n await formRef.value?.validate()\n try {\n if (editingId.value === null) await moduleApi.add({ ...form })\n else await moduleApi.update(editingId.value, { ...form })\n message.success(t('module.saved'))\n await load()\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n\n/** 默认路由 / 路由前缀单元格:有值用等宽次级色,空值画灰色的「—」。 */\nconst cellText = (v?: string | null) =>\n v ? h('span', { class: 'mono muted' }, v) : h('span', { class: 'faint' }, '—')\n\nconst columns: SmartTableColumn<ModuleRow>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n title: () => t('module.code'),\n key: 'code',\n width: 160,\n ellipsis: { tooltip: true },\n search: {},\n render: r => h('span', { class: 'mono' }, r.code),\n },\n {\n title: () => t('module.name'),\n key: 'title',\n ellipsis: { tooltip: true },\n // 窄档卡片以名称作标题(默认取第一个数据列 = 编码)\n card: 'title',\n search: {},\n render: r =>\n h(NSpace, { align: 'center', size: 6, wrapItem: false }, () => [\n r.icon ? h(AppIcon, { icon: lineIcon(r.icon), size: 18 }) : null,\n r.title,\n isBuiltin(r)\n ? h(NTag, { size: 'small', type: 'info', bordered: false }, () => t('module.builtin'))\n : null,\n ]),\n },\n {\n title: () => t('module.defaultRoute'),\n key: 'defaultRoute',\n ellipsis: { tooltip: true },\n render: r => cellText(r.defaultRoute),\n },\n {\n title: () => t('module.apiPrefix'),\n key: 'apiPrefix',\n width: 120,\n render: r => cellText(r.apiPrefix),\n },\n {\n title: () => t('module.delegatable'),\n key: 'isDelegatable',\n width: 100,\n render: r =>\n h(\n NTag,\n { size: 'small', bordered: false, type: r.isDelegatable ? 'success' : 'default' },\n () => t(r.isDelegatable ? 'common.yes' : 'common.no'),\n ),\n },\n {\n title: () => t('module.sort'),\n key: 'sort',\n width: 80,\n render: r => h('span', { class: 'num muted' }, r.sort),\n },\n {\n title: () => t('common.status'),\n key: 'enabled',\n width: 90,\n // 无启停(update)权限者不见开关,退化为只读状态标签,保留状态可见性。\n render: r => {\n if (!authStore.hasPerm('PUT:/api/v1/sys/module/{id}'))\n return h(\n NTag,\n { size: 'small', bordered: false, type: r.enabled ? 'success' : 'default' },\n () => t(r.enabled ? 'common.enabled' : 'common.disabled'),\n )\n const sw = h(StatusSwitch, {\n value: r.enabled,\n // 内置 system 应用停用会让门户失联(模块/菜单管理页都在它下面,停了就没法从 UI 恢复)——\n // 与「禁删」同级的前端保护;后端停用与删除内置模块都拒绝(42013),这里只是不给点。\n disabled: isBuiltin(r),\n // 停用会把应用从门户隐藏,先确认;启用无副作用,跳过确认(返回 null)。\n confirm: (next: boolean) => (next ? null : t('module.disableConfirm', { title: r.title })),\n request: (next: boolean) => moduleApi.update(r.id, { ...toInput(r), enabled: next }),\n 'onUpdate:value': (v: boolean) => {\n r.enabled = v\n },\n })\n // 灰掉的开关悬停说明原因(包一层 span:禁用的开关自己收不到鼠标事件)\n return isBuiltin(r)\n ? h(NTooltip, null, {\n trigger: () => h('span', { style: 'display: inline-flex' }, [sw]),\n default: () => t('module.builtinNoDisable'),\n })\n : sw\n },\n },\n {\n title: () => t('common.operation'),\n key: 'op',\n width: 140,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 2, justify: 'end', wrapItem: false }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/module/{id}')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openEdit(r) },\n () => t('common.edit'),\n )\n : null,\n isBuiltin(r) || !authStore.hasPerm('DELETE:/api/v1/sys/module/{id}')\n ? null\n : h(\n NPopconfirm,\n {\n // popconfirm 留在模板层当触发器,「执行→toast」后半段交给 useConfirm().run。\n onPositiveClick: () =>\n run(() => moduleApi.remove(r.id), t('module.deleted')).then(ok => {\n if (ok) load()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('module.deleteConfirm', { title: r.title }),\n },\n ),\n ]),\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <!-- 静态数据模式:module 只有全量 list 端点,没有分页端点 —— 条件搜索由表格在前端求值;\n 3.0 对静态数据会自己隐藏内置刷新,所以右侧自带一个刷新按钮重新拉取。 -->\n <SmartTable\n :columns=\"columns\"\n :data=\"rows\"\n :loading=\"loading\"\n row-key=\"id\"\n :pagination=\"false\"\n :toolbar=\"TABLE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-module\"\n >\n <template #toolbar-right>\n <n-button v-auth=\"'POST:/api/v1/sys/module/add'\" type=\"primary\" @click=\"openAdd\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n <!-- 静态数据没有内置刷新:这里补一个,形态与内置图标按钮一致(圆形、无底),紧跟在业务按钮后 -->\n <n-button quaternary circle :loading=\"loading\" :aria-label=\"t('table.refresh')\" @click=\"load\">\n <template #icon><AppIcon icon=\"ph:arrow-clockwise\" :size=\"16\" /></template>\n </n-button>\n </template>\n </SmartTable>\n\n <FormContainer\n v-model:show=\"show\"\n :title=\"editingId === null ? t('module.addTitle') : t('module.editTitle')\"\n :width=\"520\"\n :on-confirm=\"save\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form\n ref=\"formRef\"\n :model=\"form\"\n :rules=\"rules\"\n require-mark-placement=\"left\"\n v-bind=\"formLayout\"\n >\n <n-form-item :label=\"t('module.code')\" path=\"code\">\n <n-input\n v-model:value=\"form.code\"\n class=\"mono\"\n :placeholder=\"t('module.code')\"\n :disabled=\"editingId !== null\"\n />\n </n-form-item>\n <n-form-item :label=\"t('module.name')\" path=\"title\">\n <n-input v-model:value=\"form.title\" :placeholder=\"t('module.name')\" />\n </n-form-item>\n <n-form-item :label=\"t('module.icon')\">\n <IconPicker\n :model-value=\"form.icon ?? ''\"\n @update:model-value=\"(v: string) => (form.icon = v)\"\n />\n </n-form-item>\n <n-form-item :label=\"t('module.defaultRoute')\">\n <n-input\n v-model:value=\"form.defaultRoute as string\"\n class=\"mono\"\n placeholder=\"/system/user\"\n />\n </n-form-item>\n <n-form-item :label=\"t('module.apiPrefix')\">\n <n-space vertical :size=\"2\" style=\"width: 100%\">\n <n-input v-model:value=\"form.apiPrefix as string\" class=\"mono\" placeholder=\"sys\" />\n <span class=\"hint\">{{ t('module.apiPrefixHint') }}</span>\n </n-space>\n </n-form-item>\n <n-form-item :label=\"t('module.sort')\">\n <n-input-number v-model:value=\"form.sort\" :min=\"0\" style=\"width: 160px\" />\n </n-form-item>\n <n-form-item :label=\"t('common.status')\">\n <n-switch v-model:value=\"form.enabled\" />\n </n-form-item>\n <n-form-item :label=\"t('module.delegatable')\">\n <n-space vertical :size=\"2\" style=\"width: 100%\">\n <n-tooltip :disabled=\"!editingBuiltin\">\n <template #trigger>\n <span style=\"display: inline-flex\">\n <n-switch v-model:value=\"delegatable\" :disabled=\"editingBuiltin\" />\n </span>\n </template>\n {{ t('module.builtinNotDelegatable') }}\n </n-tooltip>\n <span class=\"hint\">{{ t('module.delegatableHint') }}</span>\n </n-space>\n </n-form-item>\n <n-form-item :label=\"t('module.remark')\">\n <n-input v-model:value=\"form.remark as string\" type=\"textarea\" :autosize=\"{ minRows: 2 }\" />\n </n-form-item>\n </n-form>\n </FormContainer>\n</template>\n\n<style scoped>\n.hint {\n font-size: 13px;\n line-height: 1.5;\n color: var(--text-3);\n}\n\n/* 辅助字样(表格单元格由库渲染,用 :deep;表单里的输入框是自己的元素,直接命中) */\n.mono,\n:deep(.mono) {\n font-family: var(--font-mono);\n font-size: 13.5px;\n letter-spacing: 0;\n}\n:deep(.muted) {\n color: var(--text-2);\n}\n:deep(.faint) {\n color: var(--text-3);\n}\n:deep(.num) {\n font-variant-numeric: tabular-nums;\n}\n</style>\n"],"names":["useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","narrowForm","useMediaQuery","formLayout","computed","loading","ref","rows","isBuiltin","r","load","moduleApi","translateError","onMounted","show","formRef","rules","editingId","editingBuiltin","form","delegatable","v","blank","reactive","toInput","openAdd","openEdit","save","_a","e","cellText","h","columns","NSpace","AppIcon","lineIcon","NTag","sw","StatusSwitch","next","NTooltip","NButton","NPopconfirm","ok","deriveHeaderFilters","_createVNode","_unref","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_createBlock","_createTextVNode","FormContainer","$event","_mergeProps","NFormItem","NInput","_cache","IconPicker","_createElementVNode","_hoisted_1","_toDisplayString","NInputNumber","NSwitch","_hoisted_2","_hoisted_3"],"mappings":";;;;;;;;;;;;;;;;;;;;AAiCA,UAAM,EAAE,EAAA,IAAMA,GAAA,GACRC,IAAUC,GAAA,GACV,EAAE,KAAAC,EAAA,IAAQC,GAAA,GACVC,IAAYC,GAAA,GAGZC,IAAaC,GAAc,oBAAoB,GAC/CC,IAAaC;AAAA,MAAS,MAC1BH,EAAW,QACP,EAAE,gBAAgB,OAAgB,YAAY,OAAA,IAC9C,EAAE,gBAAgB,QAAiB,YAAY,GAAA;AAAA,IAAG,GAGlDI,IAAUC,EAAI,EAAK,GACnBC,IAAOD,EAAiB,EAAE,GAG1BE,IAAY,CAACC,MAAiBA,EAAE,SAAS;AAE/C,mBAAeC,IAAO;AACpB,MAAAL,EAAQ,QAAQ;AAChB,UAAI;AACF,QAAAE,EAAK,QAAQ,MAAMI,EAAU,KAAA;AAAA,MAC/B,SAAS,GAAG;AACV,QAAAhB,EAAQ,MAAMiB,EAAe,CAAC,CAAC;AAAA,MACjC,UAAA;AACE,QAAAP,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AACA,IAAAQ,EAAUH,CAAI;AAGd,UAAMI,IAAOR,EAAI,EAAK,GAChBS,IAAUT,EAAqB,IAAI,GACnCU,IAAmB;AAAA;AAAA,MAEvB,MAAM;AAAA,QACJ,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,SAAS,MAAM,EAAE,qBAAqB;AAAA,QACtC,SAAS,CAAC,SAAS,MAAM;AAAA,MAAA;AAAA,MAE3B,OAAO;AAAA,QACL,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,SAAS,MAAM,EAAE,qBAAqB;AAAA,QACtC,SAAS,CAAC,SAAS,MAAM;AAAA,MAAA;AAAA,IAC3B,GAEIC,IAAYX,EAAmB,IAAI,GAEnCY,IAAiBd,EAAS,MAAMa,EAAU,UAAU,QAAQE,EAAK,SAAS,QAAQ,GAElFC,IAAchB,EAAS;AAAA,MAC3B,KAAK,MAAM,CAACc,EAAe,SAASC,EAAK,kBAAkB;AAAA,MAC3D,KAAK,CAACE,MAAgBF,EAAK,gBAAgBE;AAAA,IAAA,CAC5C,GACKC,IAAQ,OAAoB;AAAA,MAChC,MAAM;AAAA,MACN,OAAO;AAAA,MACP,MAAM;AAAA,MACN,cAAc;AAAA,MACd,WAAW;AAAA,MACX,MAAM;AAAA,MACN,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,eAAe;AAAA,IAAA,IAEXH,IAAOI,EAAsBD,GAAO,GAGpCE,IAAU,CAACf,OAA+B;AAAA,MAC9C,MAAMA,EAAE;AAAA,MACR,OAAOA,EAAE;AAAA,MACT,MAAMA,EAAE,QAAQ;AAAA,MAChB,cAAcA,EAAE,gBAAgB;AAAA,MAChC,WAAWA,EAAE,aAAa;AAAA,MAC1B,MAAMA,EAAE;AAAA,MACR,SAASA,EAAE;AAAA,MACX,QAAQA,EAAE,UAAU;AAAA;AAAA,MAEpB,eAAeD,EAAUC,CAAC,IAAI,KAASA,EAAE,iBAAiB;AAAA,IAAA;AAG5D,aAASgB,IAAU;AACjB,MAAAR,EAAU,QAAQ,MAClB,OAAO,OAAOE,GAAMG,GAAO,GAC3BR,EAAK,QAAQ;AAAA,IACf;AACA,aAASY,EAASjB,GAAc;AAC9B,MAAAQ,EAAU,QAAQR,EAAE,IACpB,OAAO,OAAOU,GAAMK,EAAQf,CAAC,CAAC,GAC9BK,EAAK,QAAQ;AAAA,IACf;AAGA,mBAAea,IAAO;;AACpB,cAAMC,IAAAb,EAAQ,UAAR,gBAAAa,EAAe;AACrB,UAAI;AACF,QAAIX,EAAU,UAAU,OAAM,MAAMN,EAAU,IAAI,EAAE,GAAGQ,GAAM,IACxD,MAAMR,EAAU,OAAOM,EAAU,OAAO,EAAE,GAAGE,GAAM,GACxDxB,EAAQ,QAAQ,EAAE,cAAc,CAAC,GACjC,MAAMe,EAAA;AAAA,MACR,SAASmB,GAAG;AACV,eAAAlC,EAAQ,MAAMiB,EAAeiB,CAAC,CAAC,GACxB;AAAA,MACT;AAAA,IACF;AAGA,UAAMC,IAAW,CAACT,MAChBA,IAAIU,EAAE,QAAQ,EAAE,OAAO,aAAA,GAAgBV,CAAC,IAAIU,EAAE,QAAQ,EAAE,OAAO,QAAA,GAAW,GAAG,GAEzEC,IAAyC;AAAA,MAC7C,EAAE,MAAM,SAAS,OAAO,MAAM,EAAE,cAAc,GAAG,OAAO,IAAI,OAAO,SAAA;AAAA,MACnE;AAAA,QACE,OAAO,MAAM,EAAE,aAAa;AAAA,QAC5B,KAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,EAAE,SAAS,GAAA;AAAA,QACrB,QAAQ,CAAA;AAAA,QACR,QAAQ,OAAKD,EAAE,QAAQ,EAAE,OAAO,UAAUtB,EAAE,IAAI;AAAA,MAAA;AAAA,MAElD;AAAA,QACE,OAAO,MAAM,EAAE,aAAa;AAAA,QAC5B,KAAK;AAAA,QACL,UAAU,EAAE,SAAS,GAAA;AAAA;AAAA,QAErB,MAAM;AAAA,QACN,QAAQ,CAAA;AAAA,QACR,QAAQ,CAAAA,MACNsB,EAAEE,GAAQ,EAAE,OAAO,UAAU,MAAM,GAAG,UAAU,GAAA,GAAS,MAAM;AAAA,UAC7DxB,EAAE,OAAOsB,EAAEG,GAAS,EAAE,MAAMC,GAAS1B,EAAE,IAAI,GAAG,MAAM,GAAA,CAAI,IAAI;AAAA,UAC5DA,EAAE;AAAA,UACFD,EAAUC,CAAC,IACPsB,EAAEK,GAAM,EAAE,MAAM,SAAS,MAAM,QAAQ,UAAU,GAAA,GAAS,MAAM,EAAE,gBAAgB,CAAC,IACnF;AAAA,QAAA,CACL;AAAA,MAAA;AAAA,MAEL;AAAA,QACE,OAAO,MAAM,EAAE,qBAAqB;AAAA,QACpC,KAAK;AAAA,QACL,UAAU,EAAE,SAAS,GAAA;AAAA,QACrB,QAAQ,CAAA3B,MAAKqB,EAASrB,EAAE,YAAY;AAAA,MAAA;AAAA,MAEtC;AAAA,QACE,OAAO,MAAM,EAAE,kBAAkB;AAAA,QACjC,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAAAA,MAAKqB,EAASrB,EAAE,SAAS;AAAA,MAAA;AAAA,MAEnC;AAAA,QACE,OAAO,MAAM,EAAE,oBAAoB;AAAA,QACnC,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAAAA,MACNsB;AAAA,UACEK;AAAA,UACA,EAAE,MAAM,SAAS,UAAU,IAAO,MAAM3B,EAAE,gBAAgB,YAAY,UAAA;AAAA,UACtE,MAAM,EAAEA,EAAE,gBAAgB,eAAe,WAAW;AAAA,QAAA;AAAA,MACtD;AAAA,MAEJ;AAAA,QACE,OAAO,MAAM,EAAE,aAAa;AAAA,QAC5B,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,OAAKsB,EAAE,QAAQ,EAAE,OAAO,eAAetB,EAAE,IAAI;AAAA,MAAA;AAAA,MAEvD;AAAA,QACE,OAAO,MAAM,EAAE,eAAe;AAAA,QAC9B,KAAK;AAAA,QACL,OAAO;AAAA;AAAA,QAEP,QAAQ,CAAAA,MAAK;AACX,cAAI,CAACV,EAAU,QAAQ,6BAA6B;AAClD,mBAAOgC;AAAA,cACLK;AAAA,cACA,EAAE,MAAM,SAAS,UAAU,IAAO,MAAM3B,EAAE,UAAU,YAAY,UAAA;AAAA,cAChE,MAAM,EAAEA,EAAE,UAAU,mBAAmB,iBAAiB;AAAA,YAAA;AAE5D,gBAAM4B,IAAKN,EAAEO,IAAc;AAAA,YACzB,OAAO7B,EAAE;AAAA;AAAA;AAAA,YAGT,UAAUD,EAAUC,CAAC;AAAA;AAAA,YAErB,SAAS,CAAC8B,MAAmBA,IAAO,OAAO,EAAE,yBAAyB,EAAE,OAAO9B,EAAE,OAAO;AAAA,YACxF,SAAS,CAAC8B,MAAkB5B,EAAU,OAAOF,EAAE,IAAI,EAAE,GAAGe,EAAQf,CAAC,GAAG,SAAS8B,GAAM;AAAA,YACnF,kBAAkB,CAAClB,MAAe;AAChC,cAAAZ,EAAE,UAAUY;AAAA,YACd;AAAA,UAAA,CACD;AAED,iBAAOb,EAAUC,CAAC,IACdsB,EAAES,GAAU,MAAM;AAAA,YAChB,SAAS,MAAMT,EAAE,QAAQ,EAAE,OAAO,uBAAA,GAA0B,CAACM,CAAE,CAAC;AAAA,YAChE,SAAS,MAAM,EAAE,yBAAyB;AAAA,UAAA,CAC3C,IACDA;AAAA,QACN;AAAA,MAAA;AAAA,MAEF;AAAA,QACE,OAAO,MAAM,EAAE,kBAAkB;AAAA,QACjC,KAAK;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,eAAe;AAAA,QACf,QAAQ,CAAA5B,MACNsB,EAAEE,GAAQ,EAAE,MAAM,GAAG,SAAS,OAAO,UAAU,GAAA,GAAS,MAAM;AAAA,UAC5DlC,EAAU,QAAQ,6BAA6B,IAC3CgC;AAAA,YACEU;AAAA,YACA,EAAE,MAAM,SAAS,YAAY,IAAM,MAAM,WAAW,SAAS,MAAMf,EAASjB,CAAC,EAAA;AAAA,YAC7E,MAAM,EAAE,aAAa;AAAA,UAAA,IAEvB;AAAA,UACJD,EAAUC,CAAC,KAAK,CAACV,EAAU,QAAQ,gCAAgC,IAC/D,OACAgC;AAAA,YACEW;AAAA,YACA;AAAA;AAAA,cAEE,iBAAiB,MACf7C,EAAI,MAAMc,EAAU,OAAOF,EAAE,EAAE,GAAG,EAAE,gBAAgB,CAAC,EAAE,KAAK,CAAAkC,MAAM;AAChE,gBAAIA,KAAIjC,EAAA;AAAA,cACV,CAAC;AAAA,YAAA;AAAA,YAEL;AAAA,cACE,SAAS,MACPqB;AAAA,gBAAEU;AAAA,gBAAS,EAAE,MAAM,SAAS,YAAY,IAAM,MAAM,QAAA;AAAA,gBAAW,MAC7D,EAAE,eAAe;AAAA,cAAA;AAAA,cAErB,SAAS,MAAM,EAAE,wBAAwB,EAAE,OAAOhC,EAAE,OAAO;AAAA,YAAA;AAAA,UAC7D;AAAA,QACF,CACL;AAAA,MAAA;AAAA,IACL;AAEF,WAAAmC,GAAoBZ,CAAO;;;QAMzBa,EAuBaC,EAAAC,EAAA,GAAA;AAAA,UAtBV,SAAAf;AAAA,UACA,MAAMzB,EAAA;AAAA,UACN,SAASF,EAAA;AAAA,UACV,WAAQ;AAAA,UACP,YAAY;AAAA,UACZ,SAASyC,EAAAE,EAAA;AAAA,UACT,QAAQ,EAAA,WAAA,QAAA;AAAA,UACT,eAAA;AAAA,UACC,kBAAgBF,EAAAG,EAAA;AAAA,UACjB,kBAAA;AAAA,UACA,eAAY;AAAA,QAAA;UAED,mBACT,MAGW;AAAA,qBAHXC,GAGWJ,EAAAL,CAAA,GAAA;AAAA,cAHsC,MAAK;AAAA,cAAW,SAAOhB;AAAA,YAAA;cAC3D,QAAK,MAAqC;AAAA,gBAArCoB,EAAqCX,GAAA;AAAA,kBAA5B,MAAK;AAAA,kBAAW,MAAM;AAAA,gBAAA;;yBAAiB,MAChE;AAAA,gBADgEiB,EAAA,QAC7DL,EAAA,CAAA,EAAC,YAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;kBAFY,6BAA6B;AAAA,YAAA;YAK/CD,EAEWC,EAAAL,CAAA,GAAA;AAAA,cAFD,YAAA;AAAA,cAAW,QAAA;AAAA,cAAQ,SAASpC,EAAA;AAAA,cAAU,cAAYyC,EAAA,CAAA,EAAC,eAAA;AAAA,cAAoB,SAAOpC;AAAA,YAAA;cAC3E,QAAK,MAAgD;AAAA,gBAAhDmC,EAAgDX,GAAA;AAAA,kBAAvC,MAAK;AAAA,kBAAsB,MAAM;AAAA,gBAAA;;;;;;;QAKhEW,EAmEgBO,IAAA;AAAA,UAlEN,MAAMtC,EAAA;AAAA,kDAAAA,EAAI,QAAAuC;AAAA,UACjB,OAAOpC,EAAA,UAAS,OAAY6B,EAAA,CAAA,uBAAuBA,EAAA,CAAA,EAAC,kBAAA;AAAA,UACpD,OAAO;AAAA,UACP,cAAYnB;AAAA,UACZ,gBAAcmB,EAAA,CAAA,EAAC,aAAA;AAAA,QAAA;qBAEhB,MA2DS;AAAA,YA3DTD,EA2DSC,OA3DTQ,GA2DS;AAAA,uBA1DH;AAAA,cAAJ,KAAIvC;AAAA,cACH,OAAOI;AAAA,cACP,OAAAH;AAAA,cACD,0BAAuB;AAAA,YAAA,GACfb,EAAA,KAAU,GAAA;AAAA,yBAElB,MAOc;AAAA,gBAPd0C,EAOcC,EAAAS,CAAA,GAAA;AAAA,kBAPA,OAAOT,EAAA,CAAA,EAAC,aAAA;AAAA,kBAAiB,MAAK;AAAA,gBAAA;6BAC1C,MAKE;AAAA,oBALFD,EAKEC,EAAAU,CAAA,GAAA;AAAA,sBAJQ,OAAOrC,EAAK;AAAA,sBAAL,kBAAAsC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAJ,MAAAlC,EAAK,OAAIkC;AAAA,sBACxB,OAAM;AAAA,sBACL,aAAaP,EAAA,CAAA,EAAC,aAAA;AAAA,sBACd,UAAU7B,EAAA,UAAS;AAAA,oBAAA;;;;gBAGxB4B,EAEcC,EAAAS,CAAA,GAAA;AAAA,kBAFA,OAAOT,EAAA,CAAA,EAAC,aAAA;AAAA,kBAAiB,MAAK;AAAA,gBAAA;6BAC1C,MAAsE;AAAA,oBAAtED,EAAsEC,EAAAU,CAAA,GAAA;AAAA,sBAArD,OAAOrC,EAAK;AAAA,sBAAL,kBAAAsC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAJ,MAAAlC,EAAK,QAAKkC;AAAA,sBAAG,aAAaP,EAAA,CAAA,EAAC,aAAA;AAAA,oBAAA;;;;gBAErDD,EAKcC,EAAAS,CAAA,GAAA;AAAA,kBALA,OAAOT,EAAA,CAAA,EAAC,aAAA;AAAA,gBAAA;6BACpB,MAGE;AAAA,oBAHFD,EAGEa,IAAA;AAAA,sBAFC,eAAavC,EAAK,QAAI;AAAA,sBACtB,wCAAqBE,MAAeF,EAAK,OAAOE;AAAA,oBAAA;;;;gBAGrDwB,EAMcC,EAAAS,CAAA,GAAA;AAAA,kBANA,OAAOT,EAAA,CAAA,EAAC,qBAAA;AAAA,gBAAA;6BACpB,MAIE;AAAA,oBAJFD,EAIEC,EAAAU,CAAA,GAAA;AAAA,sBAHQ,OAAOrC,EAAK;AAAA,sBAAL,kBAAAsC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAJ,MAAAlC,EAAK,eAAYkC;AAAA,sBAChC,OAAM;AAAA,sBACN,aAAY;AAAA,oBAAA;;;;gBAGhBR,EAKcC,EAAAS,CAAA,GAAA;AAAA,kBALA,OAAOT,EAAA,CAAA,EAAC,kBAAA;AAAA,gBAAA;6BACpB,MAGU;AAAA,oBAHVD,EAGUC,EAAAb,CAAA,GAAA;AAAA,sBAHD,UAAA;AAAA,sBAAU,MAAM;AAAA,sBAAG,OAAA,EAAA,OAAA,OAAA;AAAA,oBAAA;iCAC1B,MAAmF;AAAA,wBAAnFY,EAAmFC,EAAAU,CAAA,GAAA;AAAA,0BAAlE,OAAOrC,EAAK;AAAA,0BAAL,kBAAAsC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAJ,MAAAlC,EAAK,YAASkC;AAAA,0BAAY,OAAM;AAAA,0BAAO,aAAY;AAAA,wBAAA;wBAC3EM,EAAyD,QAAzDC,IAAyDC,EAAnCf,EAAA,CAAA,EAAC,sBAAA,CAAA,GAAA,CAAA;AAAA,sBAAA;;;;;;gBAG3BD,EAEcC,EAAAS,CAAA,GAAA;AAAA,kBAFA,OAAOT,EAAA,CAAA,EAAC,aAAA;AAAA,gBAAA;6BACpB,MAA0E;AAAA,oBAA1ED,EAA0EC,EAAAgB,EAAA,GAAA;AAAA,sBAAlD,OAAO3C,EAAK;AAAA,sBAAL,kBAAAsC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAJ,MAAAlC,EAAK,OAAIkC;AAAA,sBAAG,KAAK;AAAA,sBAAG,OAAA,EAAA,OAAA,QAAA;AAAA,oBAAA;;;;gBAErDR,EAEcC,EAAAS,CAAA,GAAA;AAAA,kBAFA,OAAOT,EAAA,CAAA,EAAC,eAAA;AAAA,gBAAA;6BACpB,MAAyC;AAAA,oBAAzCD,EAAyCC,EAAAiB,CAAA,GAAA;AAAA,sBAAvB,OAAO5C,EAAK;AAAA,sBAAL,kBAAAsC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAJ,MAAAlC,EAAK,UAAOkC;AAAA,oBAAA;;;;gBAEvCR,EAYcC,EAAAS,CAAA,GAAA;AAAA,kBAZA,OAAOT,EAAA,CAAA,EAAC,oBAAA;AAAA,gBAAA;6BACpB,MAUU;AAAA,oBAVVD,EAUUC,EAAAb,CAAA,GAAA;AAAA,sBAVD,UAAA;AAAA,sBAAU,MAAM;AAAA,sBAAG,OAAA,EAAA,OAAA,OAAA;AAAA,oBAAA;iCAC1B,MAOY;AAAA,wBAPZY,EAOYC,EAAAN,CAAA,GAAA;AAAA,0BAPA,WAAWtB,EAAA;AAAA,wBAAA;0BACV,WACT,MAEO;AAAA,4BAFPyC,EAEO,QAFPK,IAEO;AAAA,8BADLnB,EAAmEC,EAAAiB,CAAA,GAAA;AAAA,gCAAjD,OAAO3C,EAAA;AAAA,yEAAAA,EAAW,QAAAiC;AAAA,gCAAG,UAAUnC,EAAA;AAAA,8BAAA;;;qCAE1C,MACX;AAAA,4BADWiC,EAAA,QACRL,EAAA,CAAA,EAAC,8BAAA,CAAA,GAAA,CAAA;AAAA,0BAAA;;;wBAENa,EAA2D,QAA3DM,IAA2DJ,EAArCf,EAAA,CAAA,EAAC,wBAAA,CAAA,GAAA,CAAA;AAAA,sBAAA;;;;;;gBAG3BD,EAEcC,EAAAS,CAAA,GAAA;AAAA,kBAFA,OAAOT,EAAA,CAAA,EAAC,eAAA;AAAA,gBAAA;6BACpB,MAA4F;AAAA,oBAA5FD,EAA4FC,EAAAU,CAAA,GAAA;AAAA,sBAA3E,OAAOrC,EAAK;AAAA,sBAAL,kBAAAsC,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAJ,MAAAlC,EAAK,SAAMkC;AAAA,sBAAY,MAAK;AAAA,sBAAY,UAAU,EAAA,SAAA,EAAA;AAAA,oBAAA;;;;;;;;;;;;;;"}