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 +1 @@
1
- {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/org/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 机构管理 = 树表:SmartTable 远程模式(fetcher)+ children 树模式(无分页)。\n// org list 平铺 → buildTree 拼 children;上级机构用 OrgTreeSelect(剪自身子树防成环);\n// 无独立启停端点,StatusSwitch 走全量 update;删除有子机构后端拒,前端照调由 translateError 弹码。\nimport { computed, h, reactive, ref, shallowRef } from 'vue'\nimport {\n NButton,\n NSpace,\n NForm,\n NFormItem,\n NInput,\n NInputNumber,\n NSwitch,\n NDropdown,\n NModal,\n useMessage,\n type DropdownDividerOption,\n type DropdownOption,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport {\n SmartTable,\n type SmartTableColumn,\n type SmartTableFetcher,\n type SmartTableInst,\n} from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport DictSelect from '#/components/DictSelect/index.vue'\nimport DictTag from '#/components/DictTag/index.vue'\nimport FormContainer from '#/components/FormContainer/index.vue'\nimport OrgTreeSelect from '#/components/OrgTreeSelect/index.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { orgApi } from '#/api'\nimport { useAuthStore } from '#/stores/auth'\nimport { translateError } from '#/utils/error'\nimport { SEARCH_ACTIONS, deriveHeaderFilters } from '#/utils/tableFilter'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport { buildTree, expandableIds, type Tree } from '#/utils/tree'\nimport { filterTreeByParams, type TreeSearchFields } from '#/utils/treeFilter'\nimport type { OrgInput, SysOrg } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run, confirm } = useConfirm()\nconst authStore = useAuthStore()\n\nconst loading = ref(false)\n// 整份替换 + 只读(行内改动一律重拉,不往节点上写值),不需要深响应\nconst tree = shallowRef<Tree<SysOrg>[]>([])\n\n/** 从服务端拉全量机构并拼成树。只由 treeFetcher 调用:增删改后一律走 `reload()`(让表格重新取数),不要直接调它。 */\nasync function load() {\n loading.value = true\n try {\n tree.value = buildTree(await orgApi.list())\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\n\n// ── 取数 + 搜索 + 展开控制 ─────────────────────────────────────────\n// 树表用远程模式:3.0 静态模式的条件过滤是平铺的 rows.filter,不递归 children,在树上只会命中顶层行。\n// 所以 fetcher 自己递归过滤,条件构造器只负责收集条件(全局序列化器摊平成 { name, code })。\n// 取数器每次都重新拉一遍服务端:工具栏内置的刷新图标只会重新调 fetcher,\n// 如果这里只过滤内存里的旧树,点刷新就是假刷新(别人新建的机构永远出不来)。机构是全量小表,多拉一次无所谓。\n// 首次进入也由它取数(immediate),所以页面不需要 onMounted(load),也就没有「树还没加载就先过滤出空表」的窗口。\nconst tableRef = ref<SmartTableInst<Tree<SysOrg>>>()\nconst reload = () => tableRef.value?.refresh()\n\nconst SEARCH_FIELDS: TreeSearchFields<Tree<SysOrg>> = {\n name: n => n.name,\n code: n => n.code,\n}\nconst treeFetcher: SmartTableFetcher<Tree<SysOrg>> = async params => {\n await load()\n const items = filterTreeByParams(tree.value, params, SEARCH_FIELDS)\n return { items, total: items.length }\n}\n\n// 展开受控:一旦传了 expanded-row-keys,naive 就以它为准,default-expand-all 会被初始值直接覆盖成\"全折叠\",\n// 所以\"默认全展开\"得自己播种。每次取数完成(首次进入、搜索、清除条件、增删改后重拉)都按结果重算,\n// 否则命中结果藏在折叠的祖先里看不见 —— filterTree 保留的祖先链就是靠它全部展开的。\nconst expandedKeys = ref<number[]>([])\n// 取数器返回的(已过滤的)树:「展开全部」要按它算,而不是按整棵树。\nconst visibleTree = shallowRef<Tree<SysOrg>[]>([])\nfunction onLoaded(rows: Tree<SysOrg>[]) {\n visibleTree.value = rows\n expandedKeys.value = expandableIds(rows)\n}\n\nconst allExpanded = computed(() => expandedKeys.value.length > 0)\nconst toggleExpandAll = () =>\n (expandedKeys.value = allExpanded.value ? [] : expandableIds(visibleTree.value))\n\n// ── 弹窗表单(parentId 可空:OrgTreeSelect clearable → null,save 时归一为 0=根)──\ninterface OrgForm {\n parentId: number | null\n name: string\n code: string\n category: string | null\n sort: number\n enabled: boolean\n}\nconst show = ref(false)\nconst formRef = ref<FormInst | null>(null)\nconst editingId = ref<number | null>(null)\nconst rules: FormRules = {\n name: {\n required: true,\n whitespace: true,\n message: () => t('org.nameRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst blank = (): OrgForm => ({\n parentId: 0,\n name: '',\n code: '',\n category: null,\n sort: 0,\n enabled: true,\n})\nconst form = reactive<OrgForm>(blank())\n\n// 行数据 → 完整入参:openEdit 回填与 StatusSwitch 行内改状态共用(后端无独立启停端点,均走全量 update)。\nconst toInput = (r: SysOrg): OrgInput => ({\n parentId: r.parentId,\n name: r.name,\n code: r.code,\n category: r.category ?? null,\n sort: r.sort,\n enabled: r.enabled,\n})\n\nfunction openAdd(parentId = 0) {\n editingId.value = null\n Object.assign(form, blank(), { parentId })\n show.value = true\n}\nfunction openEdit(r: SysOrg) {\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 const payload: OrgInput = { ...form, parentId: form.parentId ?? 0 }\n if (editingId.value === null) await orgApi.add(payload)\n else await orgApi.update(editingId.value, payload)\n message.success(t('org.saved'))\n await reload()\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n\n// ── 复制弹窗 ──────────────────────────────────────────────────────\nconst copyShow = ref(false)\nconst copyId = ref(0)\nconst copySourceName = ref('')\nconst copyName = ref('')\n\nfunction openCopy(r: SysOrg) {\n copyId.value = r.id\n copySourceName.value = r.name\n copyName.value = r.name + t('common.copySuffix')\n copyShow.value = true\n}\nasync function confirmCopy() {\n const ok = await run(() => orgApi.copy(copyId.value, { name: copyName.value }), t('org.copied'))\n if (ok) {\n copyShow.value = false\n reload()\n }\n}\n\n/** 删除:下拉菜单项不适合内联 popconfirm,走 useConfirm().confirm 的 dialog(它的设计用途)。 */\nconst onDelete = (r: SysOrg) =>\n confirm({\n content: t('org.deleteConfirm', { name: r.name }),\n type: 'error',\n action: () => orgApi.remove(r.id),\n successMsg: t('org.deleted'),\n }).then(ok => {\n if (ok) reload()\n })\n\n// 下拉菜单项的线条图标\nconst menuIcon = (name: string) => () => h(AppIcon, { icon: name, size: 16 })\n\nconst columns: SmartTableColumn<Tree<SysOrg>>[] = [\n // 序号与树列同固定左侧:固定列必须在最左连续,否则横向滚动时树列会压在序号列上。\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center', fixed: 'left' },\n // 树列左对齐,展开缩进才好读;fixed 是为了横向滚动时不丢失「这是哪一行」。\n {\n title: () => t('org.name'),\n key: 'name',\n align: 'left',\n minWidth: 260,\n fixed: 'left',\n ellipsis: { tooltip: true },\n search: { actions: SEARCH_ACTIONS.fuzzy },\n },\n {\n title: () => t('org.code'),\n key: 'code',\n ellipsis: { tooltip: true },\n render: r => h('span', { class: 'mono muted' }, r.code),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n },\n {\n title: () => t('org.category'),\n key: 'category',\n width: 100,\n render: r => h(DictTag, { typeCode: 'org_category', value: r.category }),\n },\n {\n title: () => t('org.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 render: r =>\n h(StatusSwitch, {\n value: r.enabled,\n disabled: !authStore.hasPerm('PUT:/api/v1/sys/org/{id}'),\n request: (next: boolean) => orgApi.update(r.id, { ...toInput(r), enabled: next }),\n // 重拉而非往行对象上写:搜索态下的祖先行是 filterTree 的浅拷贝,写它不会回到源树(开关会弹回去)。\n // StatusSwitch 是悲观更新(请求成功才 emit),所以这里重拉一次就是最终态,和本页其余变更的做法一致。\n 'onUpdate:value': () => reload(),\n }),\n },\n // 操作收敛成「编辑 + 更多▾」:4 个操作塞 260px 会换行、行高参差,且没 fixed 时横向滚动够不着。\n {\n title: () => t('common.operation'),\n key: 'op',\n width: 150,\n fixed: 'right',\n render: r => {\n // 每个操作按各自权限码显隐;更多▾下拉只保留已授权项,全无则不出下拉。\n // 菜单项带线条图标;删除是破坏性操作,前面隔一条分割线并用错误色。\n const canAdd = authStore.hasPerm('POST:/api/v1/sys/org/add')\n const canCopy = authStore.hasPerm('POST:/api/v1/sys/org/{id}/copy')\n const canDelete = authStore.hasPerm('DELETE:/api/v1/sys/org/{id}')\n const rawOptions: (DropdownOption | DropdownDividerOption | null)[] = [\n canAdd ? { key: 'addChild', label: t('org.addChild'), icon: menuIcon('ph:plus') } : null,\n canCopy ? { key: 'copy', label: t('org.copy'), icon: menuIcon('ph:copy') } : null,\n (canAdd || canCopy) && canDelete ? { type: 'divider', key: 'divider' } : null,\n canDelete\n ? {\n key: 'delete',\n label: t('common.delete'),\n icon: menuIcon('ph:trash'),\n props: { style: 'color: var(--err)' },\n }\n : null,\n ]\n const dropdownOptions = rawOptions.filter(\n (o): o is DropdownOption | DropdownDividerOption => o !== null,\n )\n return h(NSpace, { size: 2, wrapItem: false, justify: 'center' }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/org/{id}')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openEdit(r) },\n () => t('common.edit'),\n )\n : null,\n dropdownOptions.length\n ? h(\n NDropdown,\n {\n trigger: 'click',\n options: dropdownOptions,\n onSelect: (key: string) => {\n if (key === 'addChild') openAdd(r.id)\n else if (key === 'copy') openCopy(r)\n else onDelete(r)\n },\n },\n () =>\n h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', iconPlacement: 'right' },\n {\n default: () => t('common.more'),\n icon: () => h(AppIcon, { icon: 'ph:caret-down', size: 12 }),\n },\n ),\n )\n : null,\n ])\n },\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <div class=\"view fill-page\">\n <!-- expanded-row-keys / update:expanded-row-keys 不是 SmartTable 的 prop —— 它 inheritAttrs:false + v-bind=\"attrs\",\n 未声明的 attr 原样透传给内层 n-data-table(:loading 走的也是这条路)。\n card-on-narrow:卡片宽 < 600 换成卡片列表(树的缩进与展开状态库照旧带上,expanded-row-keys 照常生效)。 -->\n <SmartTable\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"treeFetcher\"\n :loading=\"loading\"\n row-key=\"id\"\n :pagination=\"false\"\n :search=\"{ container: 'table' }\"\n :toolbar=\"TABLE_TOOLBAR\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-org\"\n :expanded-row-keys=\"expandedKeys\"\n @update:expanded-row-keys=\"(keys: number[]) => (expandedKeys = keys)\"\n @loaded=\"onLoaded\"\n >\n <template #toolbar-right>\n <n-button secondary @click=\"toggleExpandAll\">\n <template #icon>\n <AppIcon\n :icon=\"allExpanded ? 'ph:arrows-in-line-vertical' : 'ph:arrows-out-line-vertical'\"\n :size=\"16\"\n />\n </template>\n {{ allExpanded ? t('common.collapseAll') : t('common.expandAll') }}\n </n-button>\n <n-button v-auth=\"'POST:/api/v1/sys/org/add'\" type=\"primary\" @click=\"openAdd(0)\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n </template>\n </SmartTable>\n\n <FormContainer\n v-model:show=\"show\"\n :title=\"editingId === null ? t('org.addTitle') : t('org.editTitle')\"\n :width=\"480\"\n :on-confirm=\"save\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form ref=\"formRef\" :model=\"form\" :rules=\"rules\" label-placement=\"left\" :label-width=\"80\">\n <n-form-item :label=\"t('org.parent')\">\n <OrgTreeSelect\n v-model:value=\"form.parentId\"\n clearable\n :exclude-subtree-of=\"editingId\"\n :placeholder=\"t('org.parentPlaceholder')\"\n />\n </n-form-item>\n <n-form-item :label=\"t('org.name')\" path=\"name\">\n <n-input v-model:value=\"form.name\" :placeholder=\"t('org.name')\" />\n </n-form-item>\n <n-form-item :label=\"t('org.code')\">\n <n-input\n v-model:value=\"form.code\"\n :placeholder=\"t('org.codePlaceholder')\"\n :disabled=\"editingId !== null\"\n />\n <template v-if=\"editingId !== null\" #feedback>\n <span class=\"form-hint\">{{ t('org.codeImmutableHint') }}</span>\n </template>\n </n-form-item>\n <n-form-item :label=\"t('org.category')\">\n <DictSelect\n v-model:value=\"form.category\"\n type-code=\"org_category\"\n clearable\n :placeholder=\"t('org.categoryPlaceholder')\"\n />\n </n-form-item>\n <n-form-item :label=\"t('org.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>\n </FormContainer>\n\n <!-- 复制机构:居中小弹窗,遮罩不可关,右上角 × 可关 -->\n <n-modal\n v-model:show=\"copyShow\"\n preset=\"card\"\n :title=\"t('org.copyTitle')\"\n style=\"width: min(420px, calc(100vw - 24px))\"\n :bordered=\"false\"\n :mask-closable=\"false\"\n :segmented=\"{ footer: 'soft' }\"\n >\n <p class=\"copy-tip\">{{ t('org.copyConfirm', { name: copySourceName }) }}</p>\n <n-form label-placement=\"top\" require-mark-placement=\"left\">\n <n-form-item :label=\"t('org.copyNameLabel')\">\n <n-input v-model:value=\"copyName\" :placeholder=\"t('org.copyNameLabel')\" />\n </n-form-item>\n </n-form>\n <template #footer>\n <n-space justify=\"end\">\n <n-button secondary @click=\"copyShow = false\">{{ t('common.cancel') }}</n-button>\n <n-button type=\"primary\" @click=\"confirmCopy\">{{ t('common.confirm') }}</n-button>\n </n-space>\n </template>\n </n-modal>\n </div>\n</template>\n\n<style scoped>\n/* display / flex-direction / 整屏高度链都在 styles/layout.css 的 .fill-page,这里只留卡片间距。 */\n.view {\n gap: var(--gap-card);\n}\n\n/* 编码「创建后不可修改」提示,挂在表单项的 feedback 位 */\n.form-hint {\n font-size: 13px;\n color: var(--text-3);\n}\n\n/* 复制弹窗说明文字 */\n.copy-tip {\n margin: 0 0 14px;\n font-size: 14px;\n line-height: 1.6;\n color: var(--text-2);\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","run","confirm","useConfirm","authStore","useAuthStore","loading","ref","tree","shallowRef","load","buildTree","orgApi","translateError","tableRef","reload","_a","SEARCH_FIELDS","n","treeFetcher","params","items","filterTreeByParams","expandedKeys","visibleTree","onLoaded","rows","expandableIds","allExpanded","computed","toggleExpandAll","show","formRef","editingId","rules","blank","form","reactive","toInput","r","openAdd","parentId","openEdit","save","payload","e","copyShow","copyId","copySourceName","copyName","openCopy","confirmCopy","onDelete","ok","menuIcon","name","h","AppIcon","columns","SEARCH_ACTIONS","DictTag","StatusSwitch","next","canAdd","canCopy","canDelete","dropdownOptions","o","NSpace","NButton","NDropdown","key","deriveHeaderFilters","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_cache","keys","_createTextVNode","_toDisplayString","_createBlock","FormContainer","$event","NForm","NFormItem","OrgTreeSelect","NInput","_createElementVNode","_hoisted_2","DictSelect","NInputNumber","NSwitch","NModal","_hoisted_3"],"mappings":";;;;;;;;;;;;;;;;;;;;;;AA4CA,UAAM,EAAE,GAAAA,EAAA,IAAMC,GAAA,GACRC,IAAUC,GAAA,GACV,EAAE,KAAAC,GAAK,SAAAC,EAAA,IAAYC,GAAA,GACnBC,IAAYC,GAAA,GAEZC,IAAUC,EAAI,EAAK,GAEnBC,IAAOC,EAA2B,EAAE;AAG1C,mBAAeC,IAAO;AACpB,MAAAJ,EAAQ,QAAQ;AAChB,UAAI;AACF,QAAAE,EAAK,QAAQG,GAAU,MAAMC,EAAO,MAAM;AAAA,MAC5C,SAAS,GAAG;AACV,QAAAb,EAAQ,MAAMc,EAAe,CAAC,CAAC;AAAA,MACjC,UAAA;AACE,QAAAP,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAQA,UAAMQ,IAAWP,EAAA,GACXQ,IAAS,MAAA;;AAAM,cAAAC,IAAAF,EAAS,UAAT,gBAAAE,EAAgB;AAAA,OAE/BC,IAAgD;AAAA,MACpD,MAAM,OAAKC,EAAE;AAAA,MACb,MAAM,OAAKA,EAAE;AAAA,IAAA,GAETC,IAA+C,OAAMC,MAAU;AACnE,YAAMV,EAAA;AACN,YAAMW,IAAQC,GAAmBd,EAAK,OAAOY,GAAQH,CAAa;AAClE,aAAO,EAAE,OAAAI,GAAO,OAAOA,EAAM,OAAA;AAAA,IAC/B,GAKME,IAAehB,EAAc,EAAE,GAE/BiB,IAAcf,EAA2B,EAAE;AACjD,aAASgB,GAASC,GAAsB;AACtC,MAAAF,EAAY,QAAQE,GACpBH,EAAa,QAAQI,EAAcD,CAAI;AAAA,IACzC;AAEA,UAAME,IAAcC,GAAS,MAAMN,EAAa,MAAM,SAAS,CAAC,GAC1DO,KAAkB,MACrBP,EAAa,QAAQK,EAAY,QAAQ,KAAKD,EAAcH,EAAY,KAAK,GAW1EO,IAAOxB,EAAI,EAAK,GAChByB,IAAUzB,EAAqB,IAAI,GACnC0B,IAAY1B,EAAmB,IAAI,GACnC2B,KAAmB;AAAA,MACvB,MAAM;AAAA,QACJ,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,SAAS,MAAMrC,EAAE,kBAAkB;AAAA,QACnC,SAAS,CAAC,SAAS,MAAM;AAAA,MAAA;AAAA,IAC3B,GAEIsC,IAAQ,OAAgB;AAAA,MAC5B,UAAU;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IAAA,IAELC,IAAOC,GAAkBF,GAAO,GAGhCG,IAAU,CAACC,OAAyB;AAAA,MACxC,UAAUA,EAAE;AAAA,MACZ,MAAMA,EAAE;AAAA,MACR,MAAMA,EAAE;AAAA,MACR,UAAUA,EAAE,YAAY;AAAA,MACxB,MAAMA,EAAE;AAAA,MACR,SAASA,EAAE;AAAA,IAAA;AAGb,aAASC,EAAQC,IAAW,GAAG;AAC7B,MAAAR,EAAU,QAAQ,MAClB,OAAO,OAAOG,GAAMD,EAAA,GAAS,EAAE,UAAAM,GAAU,GACzCV,EAAK,QAAQ;AAAA,IACf;AACA,aAASW,GAASH,GAAW;AAC3B,MAAAN,EAAU,QAAQM,EAAE,IACpB,OAAO,OAAOH,GAAME,EAAQC,CAAC,CAAC,GAC9BR,EAAK,QAAQ;AAAA,IACf;AAGA,mBAAeY,KAAO;;AACpB,cAAM3B,IAAAgB,EAAQ,UAAR,gBAAAhB,EAAe;AACrB,UAAI;AACF,cAAM4B,IAAoB,EAAE,GAAGR,GAAM,UAAUA,EAAK,YAAY,EAAA;AAChE,QAAIH,EAAU,UAAU,OAAM,MAAMrB,EAAO,IAAIgC,CAAO,IACjD,MAAMhC,EAAO,OAAOqB,EAAU,OAAOW,CAAO,GACjD7C,EAAQ,QAAQF,EAAE,WAAW,CAAC,GAC9B,MAAMkB,EAAA;AAAA,MACR,SAAS8B,GAAG;AACV,eAAA9C,EAAQ,MAAMc,EAAegC,CAAC,CAAC,GACxB;AAAA,MACT;AAAA,IACF;AAGA,UAAMC,IAAWvC,EAAI,EAAK,GACpBwC,IAASxC,EAAI,CAAC,GACdyC,IAAiBzC,EAAI,EAAE,GACvB0C,IAAW1C,EAAI,EAAE;AAEvB,aAAS2C,GAASX,GAAW;AAC3B,MAAAQ,EAAO,QAAQR,EAAE,IACjBS,EAAe,QAAQT,EAAE,MACzBU,EAAS,QAAQV,EAAE,OAAO1C,EAAE,mBAAmB,GAC/CiD,EAAS,QAAQ;AAAA,IACnB;AACA,mBAAeK,KAAc;AAE3B,MADW,MAAMlD,EAAI,MAAMW,EAAO,KAAKmC,EAAO,OAAO,EAAE,MAAME,EAAS,MAAA,CAAO,GAAGpD,EAAE,YAAY,CAAC,MAE7FiD,EAAS,QAAQ,IACjB/B,EAAA;AAAA,IAEJ;AAGA,UAAMqC,KAAW,CAACb,MAChBrC,EAAQ;AAAA,MACN,SAASL,EAAE,qBAAqB,EAAE,MAAM0C,EAAE,MAAM;AAAA,MAChD,MAAM;AAAA,MACN,QAAQ,MAAM3B,EAAO,OAAO2B,EAAE,EAAE;AAAA,MAChC,YAAY1C,EAAE,aAAa;AAAA,IAAA,CAC5B,EAAE,KAAK,CAAAwD,MAAM;AACZ,MAAIA,KAAItC,EAAA;AAAA,IACV,CAAC,GAGGuC,IAAW,CAACC,MAAiB,MAAMC,EAAEC,GAAS,EAAE,MAAMF,GAAM,MAAM,IAAI,GAEtEG,IAA4C;AAAA;AAAA,MAEhD,EAAE,MAAM,SAAS,OAAO,MAAM7D,EAAE,cAAc,GAAG,OAAO,IAAI,OAAO,UAAU,OAAO,OAAA;AAAA;AAAA,MAEpF;AAAA,QACE,OAAO,MAAMA,EAAE,UAAU;AAAA,QACzB,KAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU;AAAA,QACV,OAAO;AAAA,QACP,UAAU,EAAE,SAAS,GAAA;AAAA,QACrB,QAAQ,EAAE,SAAS8D,EAAe,MAAA;AAAA,MAAM;AAAA,MAE1C;AAAA,QACE,OAAO,MAAM9D,EAAE,UAAU;AAAA,QACzB,KAAK;AAAA,QACL,UAAU,EAAE,SAAS,GAAA;AAAA,QACrB,QAAQ,OAAK2D,EAAE,QAAQ,EAAE,OAAO,aAAA,GAAgBjB,EAAE,IAAI;AAAA,QACtD,QAAQ,EAAE,SAASoB,EAAe,MAAA;AAAA,MAAM;AAAA,MAE1C;AAAA,QACE,OAAO,MAAM9D,EAAE,cAAc;AAAA,QAC7B,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAAA0C,MAAKiB,EAAEI,IAAS,EAAE,UAAU,gBAAgB,OAAOrB,EAAE,SAAA,CAAU;AAAA,MAAA;AAAA,MAEzE;AAAA,QACE,OAAO,MAAM1C,EAAE,UAAU;AAAA,QACzB,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,OAAK2D,EAAE,QAAQ,EAAE,OAAO,eAAejB,EAAE,IAAI;AAAA,MAAA;AAAA,MAEvD;AAAA,QACE,OAAO,MAAM1C,EAAE,eAAe;AAAA,QAC9B,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAAA0C,MACNiB,EAAEK,IAAc;AAAA,UACd,OAAOtB,EAAE;AAAA,UACT,UAAU,CAACnC,EAAU,QAAQ,0BAA0B;AAAA,UACvD,SAAS,CAAC0D,MAAkBlD,EAAO,OAAO2B,EAAE,IAAI,EAAE,GAAGD,EAAQC,CAAC,GAAG,SAASuB,GAAM;AAAA;AAAA;AAAA,UAGhF,kBAAkB,MAAM/C,EAAA;AAAA,QAAO,CAChC;AAAA,MAAA;AAAA;AAAA,MAGL;AAAA,QACE,OAAO,MAAMlB,EAAE,kBAAkB;AAAA,QACjC,KAAK;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,QAAQ,CAAA0C,MAAK;AAGX,gBAAMwB,IAAS3D,EAAU,QAAQ,0BAA0B,GACrD4D,IAAU5D,EAAU,QAAQ,gCAAgC,GAC5D6D,IAAY7D,EAAU,QAAQ,6BAA6B,GAc3D8D,IAbgE;AAAA,YACpEH,IAAS,EAAE,KAAK,YAAY,OAAOlE,EAAE,cAAc,GAAG,MAAMyD,EAAS,SAAS,EAAA,IAAM;AAAA,YACpFU,IAAU,EAAE,KAAK,QAAQ,OAAOnE,EAAE,UAAU,GAAG,MAAMyD,EAAS,SAAS,EAAA,IAAM;AAAA,aAC5ES,KAAUC,MAAYC,IAAY,EAAE,MAAM,WAAW,KAAK,cAAc;AAAA,YACzEA,IACI;AAAA,cACE,KAAK;AAAA,cACL,OAAOpE,EAAE,eAAe;AAAA,cACxB,MAAMyD,EAAS,UAAU;AAAA,cACzB,OAAO,EAAE,OAAO,oBAAA;AAAA,YAAoB,IAEtC;AAAA,UAAA,EAE6B;AAAA,YACjC,CAACa,MAAmDA,MAAM;AAAA,UAAA;AAE5D,iBAAOX,EAAEY,GAAQ,EAAE,MAAM,GAAG,UAAU,IAAO,SAAS,SAAA,GAAY,MAAM;AAAA,YACtEhE,EAAU,QAAQ,0BAA0B,IACxCoD;AAAA,cACEa;AAAA,cACA,EAAE,MAAM,SAAS,YAAY,IAAM,MAAM,WAAW,SAAS,MAAM3B,GAASH,CAAC,EAAA;AAAA,cAC7E,MAAM1C,EAAE,aAAa;AAAA,YAAA,IAEvB;AAAA,YACJqE,EAAgB,SACZV;AAAA,cACEc;AAAA,cACA;AAAA,gBACE,SAAS;AAAA,gBACT,SAASJ;AAAA,gBACT,UAAU,CAACK,MAAgB;AACzB,kBAAIA,MAAQ,aAAY/B,EAAQD,EAAE,EAAE,IAC3BgC,MAAQ,SAAQrB,GAASX,CAAC,OACrBA,CAAC;AAAA,gBACjB;AAAA,cAAA;AAAA,cAEF,MACEiB;AAAA,gBACEa;AAAA,gBACA,EAAE,MAAM,SAAS,YAAY,IAAM,MAAM,WAAW,eAAe,QAAA;AAAA,gBACnE;AAAA,kBACE,SAAS,MAAMxE,EAAE,aAAa;AAAA,kBAC9B,MAAM,MAAM2D,EAAEC,GAAS,EAAE,MAAM,iBAAiB,MAAM,GAAA,CAAI;AAAA,gBAAA;AAAA,cAC5D;AAAA,YACF,IAEJ;AAAA,UAAA,CACL;AAAA,QACH;AAAA,MAAA;AAAA,IACF;AAEF,WAAAe,GAAoBd,CAAO;;AAIzB,aAAAe,EAAA,GAAAC,GA2GM,OA3GNC,IA2GM;AAAA,QAvGJC,EAgCaC,EAAAC,EAAA,GAAA;AAAA,mBA/BP;AAAA,UAAJ,KAAIhE;AAAA,UACH,SAAA4C;AAAA,UACA,SAASvC;AAAA,UACT,SAASb,EAAA;AAAA,UACV,WAAQ;AAAA,UACP,YAAY;AAAA,UACZ,QAAQ,EAAA,WAAA,QAAA;AAAA,UACR,SAASuE,EAAAE,EAAA;AAAA,UACV,eAAA;AAAA,UACC,kBAAgBF,EAAAG,EAAA;AAAA,UACjB,kBAAA;AAAA,UACA,eAAY;AAAA,UACX,qBAAmBzD,EAAA;AAAA,UACnB,4BAAwB0D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAGC,MAAoB3D,EAAA,QAAe2D;AAAA,UAC9D,UAAAzD;AAAA,QAAA;UAEU,mBACT,MAQW;AAAA,YARXmD,EAQWC,EAAAR,CAAA,GAAA;AAAA,cARD,WAAA;AAAA,cAAW,SAAOvC;AAAA,YAAA;cACf,QACT,MAGE;AAAA,gBAHF8C,EAGEnB,GAAA;AAAA,kBAFC,MAAM7B,EAAA,QAAW,+BAAA;AAAA,kBACjB,MAAM;AAAA,gBAAA;;yBAEA,MACX;AAAA,gBADWuD,EAAA,MACXC,EAAGxD,EAAA,QAAciD,EAAAhF,CAAA,0BAA0BgF,EAAAhF,CAAA,EAAC,kBAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;qBAE9CwF,GAGWR,EAAAR,CAAA,GAAA;AAAA,cAHmC,MAAK;AAAA,cAAW,gCAAO7B,EAAO,CAAA;AAAA,YAAA;cAC/D,QAAK,MAAqC;AAAA,gBAArCoC,EAAqCnB,GAAA;AAAA,kBAA5B,MAAK;AAAA,kBAAW,MAAM;AAAA,gBAAA;;yBAAiB,MAChE;AAAA,gBADgE0B,EAAA,QAC7DN,EAAAhF,CAAA,EAAC,YAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;kBAFY,0BAA0B;AAAA,YAAA;;;;QAOhD+E,EA4CgBU,IAAA;AAAA,UA3CN,MAAMvD,EAAA;AAAA,kDAAAA,EAAI,QAAAwD;AAAA,UACjB,OAAOtD,EAAA,UAAS,OAAY4C,EAAAhF,CAAA,oBAAoBgF,EAAAhF,CAAA,EAAC,eAAA;AAAA,UACjD,OAAO;AAAA,UACP,cAAY8C;AAAA,UACZ,gBAAckC,EAAAhF,CAAA,EAAC,aAAA;AAAA,QAAA;qBAEhB,MAoCS;AAAA,YApCT+E,EAoCSC,EAAAW,CAAA,GAAA;AAAA,uBApCG;AAAA,cAAJ,KAAIxD;AAAA,cAAW,OAAOI;AAAA,cAAO,OAAAF;AAAA,cAAc,mBAAgB;AAAA,cAAQ,eAAa;AAAA,YAAA;yBACtF,MAOc;AAAA,gBAPd0C,EAOcC,EAAAY,CAAA,GAAA;AAAA,kBAPA,OAAOZ,EAAAhF,CAAA,EAAC,YAAA;AAAA,gBAAA;6BACpB,MAKE;AAAA,oBALF+E,EAKEc,IAAA;AAAA,sBAJQ,OAAOtD,EAAK;AAAA,sBAAL,kBAAA6C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAM,MAAAnD,EAAK,WAAQmD;AAAA,sBAC5B,WAAA;AAAA,sBACC,sBAAoBtD,EAAA;AAAA,sBACpB,aAAa4C,EAAAhF,CAAA,EAAC,uBAAA;AAAA,oBAAA;;;;gBAGnB+E,EAEcC,EAAAY,CAAA,GAAA;AAAA,kBAFA,OAAOZ,EAAAhF,CAAA,EAAC,UAAA;AAAA,kBAAc,MAAK;AAAA,gBAAA;6BACvC,MAAkE;AAAA,oBAAlE+E,EAAkEC,EAAAc,CAAA,GAAA;AAAA,sBAAjD,OAAOvD,EAAK;AAAA,sBAAL,kBAAA6C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAM,MAAAnD,EAAK,OAAImD;AAAA,sBAAG,aAAaV,EAAAhF,CAAA,EAAC,UAAA;AAAA,oBAAA;;;;gBAEpD+E,EAScC,EAAAY,CAAA,GAAA;AAAA,kBATA,OAAOZ,EAAAhF,CAAA,EAAC,UAAA;AAAA,gBAAA;6BACpB,MAIE;AAAA,oBAJF+E,EAIEC,EAAAc,CAAA,GAAA;AAAA,sBAHQ,OAAOvD,EAAK;AAAA,sBAAL,kBAAA6C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAM,MAAAnD,EAAK,OAAImD;AAAA,sBACvB,aAAaV,EAAAhF,CAAA,EAAC,qBAAA;AAAA,sBACd,UAAUoC,EAAA,UAAS;AAAA,oBAAA;;;;kBAENA,EAAA,UAAS;0BAAY;AAAA,0BACnC,MAA+D;AAAA,sBAA/D2D,EAA+D,QAA/DC,IAA+DT,EAApCP,EAAAhF,CAAA,EAAC,uBAAA,CAAA,GAAA,CAAA;AAAA,oBAAA;;;;gBAGhC+E,EAOcC,EAAAY,CAAA,GAAA;AAAA,kBAPA,OAAOZ,EAAAhF,CAAA,EAAC,cAAA;AAAA,gBAAA;6BACpB,MAKE;AAAA,oBALF+E,EAKEkB,IAAA;AAAA,sBAJQ,OAAO1D,EAAK;AAAA,sBAAL,kBAAA6C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAM,MAAAnD,EAAK,WAAQmD;AAAA,sBAC5B,aAAU;AAAA,sBACV,WAAA;AAAA,sBACC,aAAaV,EAAAhF,CAAA,EAAC,yBAAA;AAAA,oBAAA;;;;gBAGnB+E,EAEcC,EAAAY,CAAA,GAAA;AAAA,kBAFA,OAAOZ,EAAAhF,CAAA,EAAC,UAAA;AAAA,gBAAA;6BACpB,MAA0E;AAAA,oBAA1E+E,EAA0EC,EAAAkB,EAAA,GAAA;AAAA,sBAAlD,OAAO3D,EAAK;AAAA,sBAAL,kBAAA6C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAM,MAAAnD,EAAK,OAAImD;AAAA,sBAAG,KAAK;AAAA,sBAAG,OAAA,EAAA,OAAA,QAAA;AAAA,oBAAA;;;;gBAErDX,EAEcC,EAAAY,CAAA,GAAA;AAAA,kBAFA,OAAOZ,EAAAhF,CAAA,EAAC,eAAA;AAAA,gBAAA;6BACpB,MAAyC;AAAA,oBAAzC+E,EAAyCC,EAAAmB,EAAA,GAAA;AAAA,sBAAvB,OAAO5D,EAAK;AAAA,sBAAL,kBAAA6C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAM,MAAAnD,EAAK,UAAOmD;AAAA,oBAAA;;;;;;;;;;QAM3CX,EAqBUC,EAAAoB,EAAA,GAAA;AAAA,UApBA,MAAMnD,EAAA;AAAA,oDAAAA,EAAQ,QAAAyC;AAAA,UACtB,QAAO;AAAA,UACN,OAAOV,EAAAhF,CAAA,EAAC,eAAA;AAAA,UACT,OAAA,EAAA,OAAA,iCAAA;AAAA,UACC,UAAU;AAAA,UACV,iBAAe;AAAA,UACf,WAAW,EAAA,QAAA,OAAA;AAAA,QAAA;UAQD,UACT,MAGU;AAAA,YAHV+E,EAGUC,EAAAT,CAAA,GAAA,EAHD,SAAQ,SAAK;AAAA,yBACpB,MAAiF;AAAA,gBAAjFQ,EAAiFC,EAAAR,CAAA,GAAA;AAAA,kBAAvE,WAAA;AAAA,kBAAW,kCAAOvB,EAAA,QAAQ;AAAA,gBAAA;6BAAU,MAAwB;AAAA,wBAArB+B,EAAAhF,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;gBAClD+E,EAAkFC,EAAAR,CAAA,GAAA;AAAA,kBAAxE,MAAK;AAAA,kBAAW,SAAOlB;AAAA,gBAAA;6BAAa,MAAyB;AAAA,wBAAtB0B,EAAAhF,CAAA,EAAC,gBAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;;;;;qBATtD,MAA4E;AAAA,YAA5E+F,EAA4E,KAA5EM,IAA4Ed,EAArDP,EAAAhF,CAAA,6BAA6BmD,EAAA,MAAA,CAAc,CAAA,GAAA,CAAA;AAAA,YAClE4B,EAISC,EAAAW,CAAA,GAAA;AAAA,cAJD,mBAAgB;AAAA,cAAM,0BAAuB;AAAA,YAAA;yBACnD,MAEc;AAAA,gBAFdZ,EAEcC,EAAAY,CAAA,GAAA;AAAA,kBAFA,OAAOZ,EAAAhF,CAAA,EAAC,mBAAA;AAAA,gBAAA;6BACpB,MAA0E;AAAA,oBAA1E+E,EAA0EC,EAAAc,CAAA,GAAA;AAAA,sBAAzD,OAAO1C,EAAA;AAAA,+DAAAA,EAAQ,QAAAsC;AAAA,sBAAG,aAAaV,EAAAhF,CAAA,EAAC,mBAAA;AAAA,oBAAA;;;;;;;;;;;;;;"}
1
+ {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/org/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 机构管理 = 树表:SmartTable 远程模式(fetcher)+ children 树模式(无分页)。\n// org list 平铺 → buildTree 拼 children;上级机构用 OrgTreeSelect(剪自身子树防成环);\n// 无独立启停端点,StatusSwitch 走全量 update;删除有子机构后端拒,前端照调由 translateError 弹码。\nimport { computed, h, reactive, ref, shallowRef, watch } from 'vue'\nimport {\n NButton,\n NSpace,\n NForm,\n NFormItem,\n NInput,\n NInputNumber,\n NSwitch,\n NDropdown,\n NModal,\n useMessage,\n type DropdownDividerOption,\n type DropdownOption,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport {\n SmartTable,\n type SmartTableColumn,\n type SmartTableFetcher,\n type SmartTableInst,\n} from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport AppIcon from '#/components/AppIcon.vue'\nimport DictSelect from '#/components/DictSelect/index.vue'\nimport DictTag from '#/components/DictTag/index.vue'\nimport FormContainer from '#/components/FormContainer/index.vue'\nimport OrgTreeSelect from '#/components/OrgTreeSelect/index.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useShellBreakpoint } from '#/composables/useShellBreakpoint'\nimport { orgApi } from '#/api'\nimport { useAuthStore } from '#/stores/auth'\nimport { translateError } from '#/utils/error'\nimport { SEARCH_ACTIONS, deriveHeaderFilters } from '#/utils/tableFilter'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport { buildTree, expandableIds, flattenTree, type Tree } from '#/utils/tree'\nimport { indentByDepth } from '#/utils/treeCard'\nimport { filterTreeByParams, type TreeSearchFields } from '#/utils/treeFilter'\nimport type { OrgInput, SysOrg } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run, confirm } = useConfirm()\nconst authStore = useAuthStore()\n\nconst loading = ref(false)\n// 整份替换 + 只读(行内改动一律重拉,不往节点上写值),不需要深响应\nconst tree = shallowRef<Tree<SysOrg>[]>([])\n\n/** 从服务端拉全量机构并拼成树。只由 treeFetcher 调用:增删改后一律走 `reload()`(让表格重新取数),不要直接调它。 */\nasync function load() {\n loading.value = true\n try {\n tree.value = buildTree(await orgApi.list())\n } catch (e) {\n message.error(translateError(e))\n } finally {\n loading.value = false\n }\n}\n\n// ── 取数 + 搜索 + 展开控制 ─────────────────────────────────────────\n// 树表用远程模式:3.0 静态模式的条件过滤是平铺的 rows.filter,不递归 children,在树上只会命中顶层行。\n// 所以 fetcher 自己递归过滤,条件构造器只负责收集条件(全局序列化器摊平成 { name, code })。\n// 取数器每次都重新拉一遍服务端:工具栏内置的刷新图标只会重新调 fetcher,\n// 如果这里只过滤内存里的旧树,点刷新就是假刷新(别人新建的机构永远出不来)。机构是全量小表,多拉一次无所谓。\n// 首次进入也由它取数(immediate),所以页面不需要 onMounted(load),也就没有「树还没加载就先过滤出空表」的窗口。\nconst tableRef = ref<SmartTableInst<Tree<SysOrg>>>()\nconst reload = () => tableRef.value?.refresh()\n\nconst SEARCH_FIELDS: TreeSearchFields<Tree<SysOrg>> = {\n name: n => n.name,\n code: n => n.code,\n}\n// 窄档(整页自然滚动)表格是卡片列表,库的卡片模式不渲染 children:取数器把整棵树摊成一列带 depth 的行,\n// 标题按 depth 缩进。此时没有折叠态可言(每个节点一张卡),工具栏的「展开 / 折叠全部」也就不显示。\nconst { bp } = useShellBreakpoint()\nconst narrow = computed(() => bp.value === 'narrow')\nconst treeFetcher: SmartTableFetcher<Tree<SysOrg>> = async params => {\n await load()\n const matched = filterTreeByParams(tree.value, params, SEARCH_FIELDS)\n const items = narrow.value ? flattenTree(matched) : matched\n return { items, total: items.length }\n}\n// 宽窄档切换(旋转屏幕、拖动窗口)时行的形状变了,重取一遍\nwatch(narrow, () => reload())\n\n// 展开受控:一旦传了 expanded-row-keys,naive 就以它为准,default-expand-all 会被初始值直接覆盖成\"全折叠\",\n// 所以\"默认全展开\"得自己播种。每次取数完成(首次进入、搜索、清除条件、增删改后重拉)都按结果重算,\n// 否则命中结果藏在折叠的祖先里看不见 —— filterTree 保留的祖先链就是靠它全部展开的。\nconst expandedKeys = ref<number[]>([])\n// 取数器返回的(已过滤的)树:「展开全部」要按它算,而不是按整棵树。\nconst visibleTree = shallowRef<Tree<SysOrg>[]>([])\nfunction onLoaded(rows: Tree<SysOrg>[]) {\n visibleTree.value = rows\n expandedKeys.value = expandableIds(rows)\n}\n\nconst allExpanded = computed(() => expandedKeys.value.length > 0)\nconst toggleExpandAll = () =>\n (expandedKeys.value = allExpanded.value ? [] : expandableIds(visibleTree.value))\n\n// ── 弹窗表单(parentId 可空:OrgTreeSelect clearable → null,save 时归一为 0=根)──\ninterface OrgForm {\n parentId: number | null\n name: string\n code: string\n category: string | null\n sort: number\n enabled: boolean\n}\nconst show = ref(false)\nconst formRef = ref<FormInst | null>(null)\nconst editingId = ref<number | null>(null)\nconst rules: FormRules = {\n name: {\n required: true,\n whitespace: true,\n message: () => t('org.nameRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst blank = (): OrgForm => ({\n parentId: 0,\n name: '',\n code: '',\n category: null,\n sort: 0,\n enabled: true,\n})\nconst form = reactive<OrgForm>(blank())\n\n// 行数据 → 完整入参:openEdit 回填与 StatusSwitch 行内改状态共用(后端无独立启停端点,均走全量 update)。\nconst toInput = (r: SysOrg): OrgInput => ({\n parentId: r.parentId,\n name: r.name,\n code: r.code,\n category: r.category ?? null,\n sort: r.sort,\n enabled: r.enabled,\n})\n\nfunction openAdd(parentId = 0) {\n editingId.value = null\n Object.assign(form, blank(), { parentId })\n show.value = true\n}\nfunction openEdit(r: SysOrg) {\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 const payload: OrgInput = { ...form, parentId: form.parentId ?? 0 }\n if (editingId.value === null) await orgApi.add(payload)\n else await orgApi.update(editingId.value, payload)\n message.success(t('org.saved'))\n await reload()\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n\n// ── 复制弹窗 ──────────────────────────────────────────────────────\nconst copyShow = ref(false)\nconst copyId = ref(0)\nconst copySourceName = ref('')\nconst copyName = ref('')\n\nfunction openCopy(r: SysOrg) {\n copyId.value = r.id\n copySourceName.value = r.name\n copyName.value = r.name + t('common.copySuffix')\n copyShow.value = true\n}\nasync function confirmCopy() {\n const ok = await run(() => orgApi.copy(copyId.value, { name: copyName.value }), t('org.copied'))\n if (ok) {\n copyShow.value = false\n reload()\n }\n}\n\n/** 删除:下拉菜单项不适合内联 popconfirm,走 useConfirm().confirm 的 dialog(它的设计用途)。 */\nconst onDelete = (r: SysOrg) =>\n confirm({\n content: t('org.deleteConfirm', { name: r.name }),\n type: 'error',\n action: () => orgApi.remove(r.id),\n successMsg: t('org.deleted'),\n }).then(ok => {\n if (ok) reload()\n })\n\n// 下拉菜单项的线条图标\nconst menuIcon = (name: string) => () => h(AppIcon, { icon: name, size: 16 })\n\nconst columns: SmartTableColumn<Tree<SysOrg>>[] = [\n // 序号与树列同固定左侧:固定列必须在最左连续,否则横向滚动时树列会压在序号列上。\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center', fixed: 'left' },\n // 树列左对齐,展开缩进才好读;fixed 是为了横向滚动时不丢失「这是哪一行」。\n {\n title: () => t('org.name'),\n key: 'name',\n // 树的缩进和展开箭头落在这一列:不指定时 Naive 取第一个没有 type 的列,正好是 64px 宽的序号列,\n // 层级一深序号就被缩进挤出列外\n tree: true,\n align: 'left',\n width: 260,\n fixed: 'left',\n ellipsis: { tooltip: true },\n render: r => indentByDepth(r, r.name),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n },\n {\n title: () => t('org.code'),\n key: 'code',\n ellipsis: { tooltip: true },\n render: r => h('span', { class: 'mono muted' }, r.code),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n },\n {\n title: () => t('org.category'),\n key: 'category',\n width: 100,\n render: r => h(DictTag, { typeCode: 'org_category', value: r.category }),\n },\n {\n title: () => t('org.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 render: r =>\n h(StatusSwitch, {\n value: r.enabled,\n disabled: !authStore.hasPerm('PUT:/api/v1/sys/org/{id}'),\n request: (next: boolean) => orgApi.update(r.id, { ...toInput(r), enabled: next }),\n // 重拉而非往行对象上写:搜索态下的祖先行是 filterTree 的浅拷贝,写它不会回到源树(开关会弹回去)。\n // StatusSwitch 是悲观更新(请求成功才 emit),所以这里重拉一次就是最终态,和本页其余变更的做法一致。\n 'onUpdate:value': () => reload(),\n }),\n },\n // 操作收敛成「编辑 + 更多▾」:4 个操作塞 260px 会换行、行高参差,且没 fixed 时横向滚动够不着。\n {\n title: () => t('common.operation'),\n key: 'op',\n width: 150,\n fixed: 'right',\n render: r => {\n // 每个操作按各自权限码显隐;更多▾下拉只保留已授权项,全无则不出下拉。\n // 菜单项带线条图标;删除是破坏性操作,前面隔一条分割线并用错误色。\n const canAdd = authStore.hasPerm('POST:/api/v1/sys/org/add')\n const canCopy = authStore.hasPerm('POST:/api/v1/sys/org/{id}/copy')\n const canDelete = authStore.hasPerm('DELETE:/api/v1/sys/org/{id}')\n const rawOptions: (DropdownOption | DropdownDividerOption | null)[] = [\n canAdd ? { key: 'addChild', label: t('org.addChild'), icon: menuIcon('ph:plus') } : null,\n canCopy ? { key: 'copy', label: t('org.copy'), icon: menuIcon('ph:copy') } : null,\n (canAdd || canCopy) && canDelete ? { type: 'divider', key: 'divider' } : null,\n canDelete\n ? {\n key: 'delete',\n label: t('common.delete'),\n icon: menuIcon('ph:trash'),\n props: { style: 'color: var(--err)' },\n }\n : null,\n ]\n const dropdownOptions = rawOptions.filter(\n (o): o is DropdownOption | DropdownDividerOption => o !== null,\n )\n return h(NSpace, { size: 2, wrapItem: false, justify: 'center' }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/org/{id}')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openEdit(r) },\n () => t('common.edit'),\n )\n : null,\n dropdownOptions.length\n ? h(\n NDropdown,\n {\n trigger: 'click',\n options: dropdownOptions,\n onSelect: (key: string) => {\n if (key === 'addChild') openAdd(r.id)\n else if (key === 'copy') openCopy(r)\n else onDelete(r)\n },\n },\n () =>\n h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', iconPlacement: 'right' },\n {\n default: () => t('common.more'),\n icon: () => h(AppIcon, { icon: 'ph:caret-down', size: 12 }),\n },\n ),\n )\n : null,\n ])\n },\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <div class=\"view fill-page\">\n <!-- expanded-row-keys / update:expanded-row-keys 不是 SmartTable 的 prop —— 它 inheritAttrs:false + v-bind=\"attrs\",\n 未声明的 attr 原样透传给内层 n-data-table(:loading 走的也是这条路)。\n card-on-narrow:卡片宽 < 600 换成卡片列表。库的卡片模式不渲染 children,所以窄档由 treeFetcher 把整棵树摊平(带 depth)。 -->\n <SmartTable\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"treeFetcher\"\n :loading=\"loading\"\n row-key=\"id\"\n :pagination=\"false\"\n :search=\"{ container: 'table' }\"\n :toolbar=\"TABLE_TOOLBAR\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-org\"\n :expanded-row-keys=\"expandedKeys\"\n @update:expanded-row-keys=\"(keys: number[]) => (expandedKeys = keys)\"\n @loaded=\"onLoaded\"\n >\n <template #toolbar-right>\n <n-button v-if=\"!narrow\" secondary @click=\"toggleExpandAll\">\n <template #icon>\n <AppIcon\n :icon=\"allExpanded ? 'ph:arrows-in-line-vertical' : 'ph:arrows-out-line-vertical'\"\n :size=\"16\"\n />\n </template>\n {{ allExpanded ? t('common.collapseAll') : t('common.expandAll') }}\n </n-button>\n <n-button v-auth=\"'POST:/api/v1/sys/org/add'\" type=\"primary\" @click=\"openAdd(0)\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n </template>\n </SmartTable>\n\n <FormContainer\n v-model:show=\"show\"\n :title=\"editingId === null ? t('org.addTitle') : t('org.editTitle')\"\n :width=\"480\"\n :on-confirm=\"save\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form ref=\"formRef\" :model=\"form\" :rules=\"rules\" label-placement=\"left\" :label-width=\"80\">\n <n-form-item :label=\"t('org.parent')\">\n <OrgTreeSelect\n v-model:value=\"form.parentId\"\n clearable\n :exclude-subtree-of=\"editingId\"\n :placeholder=\"t('org.parentPlaceholder')\"\n />\n </n-form-item>\n <n-form-item :label=\"t('org.name')\" path=\"name\">\n <n-input v-model:value=\"form.name\" :placeholder=\"t('org.name')\" />\n </n-form-item>\n <n-form-item :label=\"t('org.code')\">\n <n-input\n v-model:value=\"form.code\"\n :placeholder=\"t('org.codePlaceholder')\"\n :disabled=\"editingId !== null\"\n />\n <template v-if=\"editingId !== null\" #feedback>\n <span class=\"form-hint\">{{ t('org.codeImmutableHint') }}</span>\n </template>\n </n-form-item>\n <n-form-item :label=\"t('org.category')\">\n <DictSelect\n v-model:value=\"form.category\"\n type-code=\"org_category\"\n clearable\n :placeholder=\"t('org.categoryPlaceholder')\"\n />\n </n-form-item>\n <n-form-item :label=\"t('org.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>\n </FormContainer>\n\n <!-- 复制机构:居中小弹窗,遮罩不可关,右上角 × 可关 -->\n <n-modal\n v-model:show=\"copyShow\"\n preset=\"card\"\n :title=\"t('org.copyTitle')\"\n style=\"width: min(420px, calc(100vw - 24px))\"\n :bordered=\"false\"\n :mask-closable=\"false\"\n :segmented=\"{ footer: 'soft' }\"\n >\n <p class=\"copy-tip\">{{ t('org.copyConfirm', { name: copySourceName }) }}</p>\n <n-form label-placement=\"top\" require-mark-placement=\"left\">\n <n-form-item :label=\"t('org.copyNameLabel')\">\n <n-input v-model:value=\"copyName\" :placeholder=\"t('org.copyNameLabel')\" />\n </n-form-item>\n </n-form>\n <template #footer>\n <n-space justify=\"end\">\n <n-button secondary @click=\"copyShow = false\">{{ t('common.cancel') }}</n-button>\n <n-button type=\"primary\" @click=\"confirmCopy\">{{ t('common.confirm') }}</n-button>\n </n-space>\n </template>\n </n-modal>\n </div>\n</template>\n\n<style scoped>\n/* display / flex-direction / 整屏高度链都在 styles/layout.css 的 .fill-page,这里只留卡片间距。 */\n.view {\n gap: var(--gap-card);\n}\n\n/* 编码「创建后不可修改」提示,挂在表单项的 feedback 位 */\n.form-hint {\n font-size: 13px;\n color: var(--text-3);\n}\n\n/* 复制弹窗说明文字 */\n.copy-tip {\n margin: 0 0 14px;\n font-size: 14px;\n line-height: 1.6;\n color: var(--text-2);\n}\n</style>\n"],"names":["useI18n","message","useMessage","run","confirm","useConfirm","authStore","useAuthStore","loading","ref","tree","shallowRef","load","buildTree","orgApi","translateError","tableRef","reload","_a","SEARCH_FIELDS","n","bp","useShellBreakpoint","narrow","computed","treeFetcher","params","matched","filterTreeByParams","items","flattenTree","watch","expandedKeys","visibleTree","onLoaded","rows","expandableIds","allExpanded","toggleExpandAll","show","formRef","editingId","rules","blank","form","reactive","toInput","r","openAdd","parentId","openEdit","save","payload","e","copyShow","copyId","copySourceName","copyName","openCopy","confirmCopy","onDelete","ok","menuIcon","name","h","AppIcon","columns","indentByDepth","SEARCH_ACTIONS","DictTag","StatusSwitch","next","canAdd","canCopy","canDelete","dropdownOptions","o","NSpace","NButton","NDropdown","key","deriveHeaderFilters","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_cache","keys","_createBlock","_createTextVNode","_toDisplayString","FormContainer","$event","NForm","NFormItem","OrgTreeSelect","NInput","_createElementVNode","_hoisted_2","DictSelect","NInputNumber","NSwitch","NModal","_hoisted_3"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;AA8CA,UAAM,EAAE,EAAA,IAAMA,GAAA,GACRC,IAAUC,GAAA,GACV,EAAE,KAAAC,GAAK,SAAAC,EAAA,IAAYC,GAAA,GACnBC,IAAYC,GAAA,GAEZC,IAAUC,EAAI,EAAK,GAEnBC,IAAOC,EAA2B,EAAE;AAG1C,mBAAeC,KAAO;AACpB,MAAAJ,EAAQ,QAAQ;AAChB,UAAI;AACF,QAAAE,EAAK,QAAQG,GAAU,MAAMC,EAAO,MAAM;AAAA,MAC5C,SAAS,GAAG;AACV,QAAAb,EAAQ,MAAMc,EAAe,CAAC,CAAC;AAAA,MACjC,UAAA;AACE,QAAAP,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAQA,UAAMQ,IAAWP,EAAA,GACXQ,IAAS,MAAA;;AAAM,cAAAC,IAAAF,EAAS,UAAT,gBAAAE,EAAgB;AAAA,OAE/BC,KAAgD;AAAA,MACpD,MAAM,OAAKC,EAAE;AAAA,MACb,MAAM,OAAKA,EAAE;AAAA,IAAA,GAIT,EAAE,IAAAC,GAAA,IAAOC,GAAA,GACTC,IAASC,EAAS,MAAMH,GAAG,UAAU,QAAQ,GAC7CI,KAA+C,OAAMC,MAAU;AACnE,YAAMd,GAAA;AACN,YAAMe,IAAUC,GAAmBlB,EAAK,OAAOgB,GAAQP,EAAa,GAC9DU,IAAQN,EAAO,QAAQO,GAAYH,CAAO,IAAIA;AACpD,aAAO,EAAE,OAAAE,GAAO,OAAOA,EAAM,OAAA;AAAA,IAC/B;AAEA,IAAAE,GAAMR,GAAQ,MAAMN,GAAQ;AAK5B,UAAMe,IAAevB,EAAc,EAAE,GAE/BwB,IAActB,EAA2B,EAAE;AACjD,aAASuB,GAASC,GAAsB;AACtC,MAAAF,EAAY,QAAQE,GACpBH,EAAa,QAAQI,EAAcD,CAAI;AAAA,IACzC;AAEA,UAAME,IAAcb,EAAS,MAAMQ,EAAa,MAAM,SAAS,CAAC,GAC1DM,KAAkB,MACrBN,EAAa,QAAQK,EAAY,QAAQ,KAAKD,EAAcH,EAAY,KAAK,GAW1EM,IAAO9B,EAAI,EAAK,GAChB+B,IAAU/B,EAAqB,IAAI,GACnCgC,IAAYhC,EAAmB,IAAI,GACnCiC,KAAmB;AAAA,MACvB,MAAM;AAAA,QACJ,UAAU;AAAA,QACV,YAAY;AAAA,QACZ,SAAS,MAAM,EAAE,kBAAkB;AAAA,QACnC,SAAS,CAAC,SAAS,MAAM;AAAA,MAAA;AAAA,IAC3B,GAEIC,IAAQ,OAAgB;AAAA,MAC5B,UAAU;AAAA,MACV,MAAM;AAAA,MACN,MAAM;AAAA,MACN,UAAU;AAAA,MACV,MAAM;AAAA,MACN,SAAS;AAAA,IAAA,IAELC,IAAOC,GAAkBF,GAAO,GAGhCG,IAAU,CAACC,OAAyB;AAAA,MACxC,UAAUA,EAAE;AAAA,MACZ,MAAMA,EAAE;AAAA,MACR,MAAMA,EAAE;AAAA,MACR,UAAUA,EAAE,YAAY;AAAA,MACxB,MAAMA,EAAE;AAAA,MACR,SAASA,EAAE;AAAA,IAAA;AAGb,aAASC,EAAQC,IAAW,GAAG;AAC7B,MAAAR,EAAU,QAAQ,MAClB,OAAO,OAAOG,GAAMD,EAAA,GAAS,EAAE,UAAAM,GAAU,GACzCV,EAAK,QAAQ;AAAA,IACf;AACA,aAASW,GAASH,GAAW;AAC3B,MAAAN,EAAU,QAAQM,EAAE,IACpB,OAAO,OAAOH,GAAME,EAAQC,CAAC,CAAC,GAC9BR,EAAK,QAAQ;AAAA,IACf;AAGA,mBAAeY,KAAO;;AACpB,cAAMjC,IAAAsB,EAAQ,UAAR,gBAAAtB,EAAe;AACrB,UAAI;AACF,cAAMkC,IAAoB,EAAE,GAAGR,GAAM,UAAUA,EAAK,YAAY,EAAA;AAChE,QAAIH,EAAU,UAAU,OAAM,MAAM3B,EAAO,IAAIsC,CAAO,IACjD,MAAMtC,EAAO,OAAO2B,EAAU,OAAOW,CAAO,GACjDnD,EAAQ,QAAQ,EAAE,WAAW,CAAC,GAC9B,MAAMgB,EAAA;AAAA,MACR,SAASoC,GAAG;AACV,eAAApD,EAAQ,MAAMc,EAAesC,CAAC,CAAC,GACxB;AAAA,MACT;AAAA,IACF;AAGA,UAAMC,IAAW7C,EAAI,EAAK,GACpB8C,IAAS9C,EAAI,CAAC,GACd+C,IAAiB/C,EAAI,EAAE,GACvBgD,IAAWhD,EAAI,EAAE;AAEvB,aAASiD,GAASX,GAAW;AAC3B,MAAAQ,EAAO,QAAQR,EAAE,IACjBS,EAAe,QAAQT,EAAE,MACzBU,EAAS,QAAQV,EAAE,OAAO,EAAE,mBAAmB,GAC/CO,EAAS,QAAQ;AAAA,IACnB;AACA,mBAAeK,KAAc;AAE3B,MADW,MAAMxD,EAAI,MAAMW,EAAO,KAAKyC,EAAO,OAAO,EAAE,MAAME,EAAS,MAAA,CAAO,GAAG,EAAE,YAAY,CAAC,MAE7FH,EAAS,QAAQ,IACjBrC,EAAA;AAAA,IAEJ;AAGA,UAAM2C,KAAW,CAACb,MAChB3C,EAAQ;AAAA,MACN,SAAS,EAAE,qBAAqB,EAAE,MAAM2C,EAAE,MAAM;AAAA,MAChD,MAAM;AAAA,MACN,QAAQ,MAAMjC,EAAO,OAAOiC,EAAE,EAAE;AAAA,MAChC,YAAY,EAAE,aAAa;AAAA,IAAA,CAC5B,EAAE,KAAK,CAAAc,MAAM;AACZ,MAAIA,KAAI5C,EAAA;AAAA,IACV,CAAC,GAGG6C,IAAW,CAACC,MAAiB,MAAMC,EAAEC,GAAS,EAAE,MAAMF,GAAM,MAAM,IAAI,GAEtEG,IAA4C;AAAA;AAAA,MAEhD,EAAE,MAAM,SAAS,OAAO,MAAM,EAAE,cAAc,GAAG,OAAO,IAAI,OAAO,UAAU,OAAO,OAAA;AAAA;AAAA,MAEpF;AAAA,QACE,OAAO,MAAM,EAAE,UAAU;AAAA,QACzB,KAAK;AAAA;AAAA;AAAA,QAGL,MAAM;AAAA,QACN,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,UAAU,EAAE,SAAS,GAAA;AAAA,QACrB,QAAQ,CAAAnB,MAAKoB,GAAcpB,GAAGA,EAAE,IAAI;AAAA,QACpC,QAAQ,EAAE,SAASqB,EAAe,MAAA;AAAA,MAAM;AAAA,MAE1C;AAAA,QACE,OAAO,MAAM,EAAE,UAAU;AAAA,QACzB,KAAK;AAAA,QACL,UAAU,EAAE,SAAS,GAAA;AAAA,QACrB,QAAQ,OAAKJ,EAAE,QAAQ,EAAE,OAAO,aAAA,GAAgBjB,EAAE,IAAI;AAAA,QACtD,QAAQ,EAAE,SAASqB,EAAe,MAAA;AAAA,MAAM;AAAA,MAE1C;AAAA,QACE,OAAO,MAAM,EAAE,cAAc;AAAA,QAC7B,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAAArB,MAAKiB,EAAEK,IAAS,EAAE,UAAU,gBAAgB,OAAOtB,EAAE,SAAA,CAAU;AAAA,MAAA;AAAA,MAEzE;AAAA,QACE,OAAO,MAAM,EAAE,UAAU;AAAA,QACzB,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,OAAKiB,EAAE,QAAQ,EAAE,OAAO,eAAejB,EAAE,IAAI;AAAA,MAAA;AAAA,MAEvD;AAAA,QACE,OAAO,MAAM,EAAE,eAAe;AAAA,QAC9B,KAAK;AAAA,QACL,OAAO;AAAA,QACP,QAAQ,CAAAA,MACNiB,EAAEM,IAAc;AAAA,UACd,OAAOvB,EAAE;AAAA,UACT,UAAU,CAACzC,EAAU,QAAQ,0BAA0B;AAAA,UACvD,SAAS,CAACiE,MAAkBzD,EAAO,OAAOiC,EAAE,IAAI,EAAE,GAAGD,EAAQC,CAAC,GAAG,SAASwB,GAAM;AAAA;AAAA;AAAA,UAGhF,kBAAkB,MAAMtD,EAAA;AAAA,QAAO,CAChC;AAAA,MAAA;AAAA;AAAA,MAGL;AAAA,QACE,OAAO,MAAM,EAAE,kBAAkB;AAAA,QACjC,KAAK;AAAA,QACL,OAAO;AAAA,QACP,OAAO;AAAA,QACP,QAAQ,CAAA8B,MAAK;AAGX,gBAAMyB,IAASlE,EAAU,QAAQ,0BAA0B,GACrDmE,IAAUnE,EAAU,QAAQ,gCAAgC,GAC5DoE,IAAYpE,EAAU,QAAQ,6BAA6B,GAc3DqE,IAbgE;AAAA,YACpEH,IAAS,EAAE,KAAK,YAAY,OAAO,EAAE,cAAc,GAAG,MAAMV,EAAS,SAAS,EAAA,IAAM;AAAA,YACpFW,IAAU,EAAE,KAAK,QAAQ,OAAO,EAAE,UAAU,GAAG,MAAMX,EAAS,SAAS,EAAA,IAAM;AAAA,aAC5EU,KAAUC,MAAYC,IAAY,EAAE,MAAM,WAAW,KAAK,cAAc;AAAA,YACzEA,IACI;AAAA,cACE,KAAK;AAAA,cACL,OAAO,EAAE,eAAe;AAAA,cACxB,MAAMZ,EAAS,UAAU;AAAA,cACzB,OAAO,EAAE,OAAO,oBAAA;AAAA,YAAoB,IAEtC;AAAA,UAAA,EAE6B;AAAA,YACjC,CAACc,MAAmDA,MAAM;AAAA,UAAA;AAE5D,iBAAOZ,EAAEa,GAAQ,EAAE,MAAM,GAAG,UAAU,IAAO,SAAS,SAAA,GAAY,MAAM;AAAA,YACtEvE,EAAU,QAAQ,0BAA0B,IACxC0D;AAAA,cACEc;AAAA,cACA,EAAE,MAAM,SAAS,YAAY,IAAM,MAAM,WAAW,SAAS,MAAM5B,GAASH,CAAC,EAAA;AAAA,cAC7E,MAAM,EAAE,aAAa;AAAA,YAAA,IAEvB;AAAA,YACJ4B,EAAgB,SACZX;AAAA,cACEe;AAAA,cACA;AAAA,gBACE,SAAS;AAAA,gBACT,SAASJ;AAAA,gBACT,UAAU,CAACK,MAAgB;AACzB,kBAAIA,MAAQ,aAAYhC,EAAQD,EAAE,EAAE,IAC3BiC,MAAQ,SAAQtB,GAASX,CAAC,OACrBA,CAAC;AAAA,gBACjB;AAAA,cAAA;AAAA,cAEF,MACEiB;AAAA,gBACEc;AAAA,gBACA,EAAE,MAAM,SAAS,YAAY,IAAM,MAAM,WAAW,eAAe,QAAA;AAAA,gBACnE;AAAA,kBACE,SAAS,MAAM,EAAE,aAAa;AAAA,kBAC9B,MAAM,MAAMd,EAAEC,GAAS,EAAE,MAAM,iBAAiB,MAAM,GAAA,CAAI;AAAA,gBAAA;AAAA,cAC5D;AAAA,YACF,IAEJ;AAAA,UAAA,CACL;AAAA,QACH;AAAA,MAAA;AAAA,IACF;AAEF,WAAAgB,GAAoBf,CAAO;;AAIzB,aAAAgB,EAAA,GAAAC,GA2GM,OA3GNC,IA2GM;AAAA,QAvGJC,EAgCaC,EAAAC,EAAA,GAAA;AAAA,mBA/BP;AAAA,UAAJ,KAAIvE;AAAA,UACH,SAAAkD;AAAA,UACA,SAASzC;AAAA,UACT,SAASjB,EAAA;AAAA,UACV,WAAQ;AAAA,UACP,YAAY;AAAA,UACZ,QAAQ,EAAA,WAAA,QAAA;AAAA,UACR,SAAS8E,EAAAE,EAAA;AAAA,UACV,eAAA;AAAA,UACC,kBAAgBF,EAAAG,EAAA;AAAA,UACjB,kBAAA;AAAA,UACA,eAAY;AAAA,UACX,qBAAmBzD,EAAA;AAAA,UACnB,4BAAwB0D,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAGC,MAAoB3D,EAAA,QAAe2D;AAAA,UAC9D,UAAAzD;AAAA,QAAA;UAEU,mBACT,MAQW;AAAA,YARMX,EAAA,2BAAjBqE,EAQWN,EAAAR,CAAA,GAAA;AAAA;cARc,WAAA;AAAA,cAAW,SAAOxC;AAAA,YAAA;cAC9B,QACT,MAGE;AAAA,gBAHF+C,EAGEpB,GAAA;AAAA,kBAFC,MAAM5B,EAAA,QAAW,+BAAA;AAAA,kBACjB,MAAM;AAAA,gBAAA;;yBAEA,MACX;AAAA,gBADWwD,EAAA,MACXC,EAAGzD,EAAA,QAAciD,EAAA,CAAA,0BAA0BA,EAAA,CAAA,EAAC,kBAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;qBAE9CM,EAGWN,EAAAR,CAAA,GAAA;AAAA,cAHmC,MAAK;AAAA,cAAW,gCAAO9B,EAAO,CAAA;AAAA,YAAA;cAC/D,QAAK,MAAqC;AAAA,gBAArCqC,EAAqCpB,GAAA;AAAA,kBAA5B,MAAK;AAAA,kBAAW,MAAM;AAAA,gBAAA;;yBAAiB,MAChE;AAAA,gBADgE4B,EAAA,QAC7DP,EAAA,CAAA,EAAC,YAAA,CAAA,GAAA,CAAA;AAAA,cAAA;;;kBAFY,0BAA0B;AAAA,YAAA;;;;QAOhDD,EA4CgBU,IAAA;AAAA,UA3CN,MAAMxD,EAAA;AAAA,kDAAAA,EAAI,QAAAyD;AAAA,UACjB,OAAOvD,EAAA,UAAS,OAAY6C,EAAA,CAAA,oBAAoBA,EAAA,CAAA,EAAC,eAAA;AAAA,UACjD,OAAO;AAAA,UACP,cAAYnC;AAAA,UACZ,gBAAcmC,EAAA,CAAA,EAAC,aAAA;AAAA,QAAA;qBAEhB,MAoCS;AAAA,YApCTD,EAoCSC,EAAAW,CAAA,GAAA;AAAA,uBApCG;AAAA,cAAJ,KAAIzD;AAAA,cAAW,OAAOI;AAAA,cAAO,OAAAF;AAAA,cAAc,mBAAgB;AAAA,cAAQ,eAAa;AAAA,YAAA;yBACtF,MAOc;AAAA,gBAPd2C,EAOcC,EAAAY,CAAA,GAAA;AAAA,kBAPA,OAAOZ,EAAA,CAAA,EAAC,YAAA;AAAA,gBAAA;6BACpB,MAKE;AAAA,oBALFD,EAKEc,IAAA;AAAA,sBAJQ,OAAOvD,EAAK;AAAA,sBAAL,kBAAA8C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAM,MAAApD,EAAK,WAAQoD;AAAA,sBAC5B,WAAA;AAAA,sBACC,sBAAoBvD,EAAA;AAAA,sBACpB,aAAa6C,EAAA,CAAA,EAAC,uBAAA;AAAA,oBAAA;;;;gBAGnBD,EAEcC,EAAAY,CAAA,GAAA;AAAA,kBAFA,OAAOZ,EAAA,CAAA,EAAC,UAAA;AAAA,kBAAc,MAAK;AAAA,gBAAA;6BACvC,MAAkE;AAAA,oBAAlED,EAAkEC,EAAAc,CAAA,GAAA;AAAA,sBAAjD,OAAOxD,EAAK;AAAA,sBAAL,kBAAA8C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAM,MAAApD,EAAK,OAAIoD;AAAA,sBAAG,aAAaV,EAAA,CAAA,EAAC,UAAA;AAAA,oBAAA;;;;gBAEpDD,EAScC,EAAAY,CAAA,GAAA;AAAA,kBATA,OAAOZ,EAAA,CAAA,EAAC,UAAA;AAAA,gBAAA;6BACpB,MAIE;AAAA,oBAJFD,EAIEC,EAAAc,CAAA,GAAA;AAAA,sBAHQ,OAAOxD,EAAK;AAAA,sBAAL,kBAAA8C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAM,MAAApD,EAAK,OAAIoD;AAAA,sBACvB,aAAaV,EAAA,CAAA,EAAC,qBAAA;AAAA,sBACd,UAAU7C,EAAA,UAAS;AAAA,oBAAA;;;;kBAENA,EAAA,UAAS;0BAAY;AAAA,0BACnC,MAA+D;AAAA,sBAA/D4D,EAA+D,QAA/DC,IAA+DR,EAApCR,EAAA,CAAA,EAAC,uBAAA,CAAA,GAAA,CAAA;AAAA,oBAAA;;;;gBAGhCD,EAOcC,EAAAY,CAAA,GAAA;AAAA,kBAPA,OAAOZ,EAAA,CAAA,EAAC,cAAA;AAAA,gBAAA;6BACpB,MAKE;AAAA,oBALFD,EAKEkB,IAAA;AAAA,sBAJQ,OAAO3D,EAAK;AAAA,sBAAL,kBAAA8C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAM,MAAApD,EAAK,WAAQoD;AAAA,sBAC5B,aAAU;AAAA,sBACV,WAAA;AAAA,sBACC,aAAaV,EAAA,CAAA,EAAC,yBAAA;AAAA,oBAAA;;;;gBAGnBD,EAEcC,EAAAY,CAAA,GAAA;AAAA,kBAFA,OAAOZ,EAAA,CAAA,EAAC,UAAA;AAAA,gBAAA;6BACpB,MAA0E;AAAA,oBAA1ED,EAA0EC,EAAAkB,EAAA,GAAA;AAAA,sBAAlD,OAAO5D,EAAK;AAAA,sBAAL,kBAAA8C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAM,MAAApD,EAAK,OAAIoD;AAAA,sBAAG,KAAK;AAAA,sBAAG,OAAA,EAAA,OAAA,QAAA;AAAA,oBAAA;;;;gBAErDX,EAEcC,EAAAY,CAAA,GAAA;AAAA,kBAFA,OAAOZ,EAAA,CAAA,EAAC,eAAA;AAAA,gBAAA;6BACpB,MAAyC;AAAA,oBAAzCD,EAAyCC,EAAAmB,EAAA,GAAA;AAAA,sBAAvB,OAAO7D,EAAK;AAAA,sBAAL,kBAAA8C,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAAM,MAAApD,EAAK,UAAOoD;AAAA,oBAAA;;;;;;;;;;QAM3CX,EAqBUC,EAAAoB,EAAA,GAAA;AAAA,UApBA,MAAMpD,EAAA;AAAA,oDAAAA,EAAQ,QAAA0C;AAAA,UACtB,QAAO;AAAA,UACN,OAAOV,EAAA,CAAA,EAAC,eAAA;AAAA,UACT,OAAA,EAAA,OAAA,iCAAA;AAAA,UACC,UAAU;AAAA,UACV,iBAAe;AAAA,UACf,WAAW,EAAA,QAAA,OAAA;AAAA,QAAA;UAQD,UACT,MAGU;AAAA,YAHVD,EAGUC,EAAAT,CAAA,GAAA,EAHD,SAAQ,SAAK;AAAA,yBACpB,MAAiF;AAAA,gBAAjFQ,EAAiFC,EAAAR,CAAA,GAAA;AAAA,kBAAvE,WAAA;AAAA,kBAAW,kCAAOxB,EAAA,QAAQ;AAAA,gBAAA;6BAAU,MAAwB;AAAA,wBAArBgC,EAAA,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;gBAClDD,EAAkFC,EAAAR,CAAA,GAAA;AAAA,kBAAxE,MAAK;AAAA,kBAAW,SAAOnB;AAAA,gBAAA;6BAAa,MAAyB;AAAA,wBAAtB2B,EAAA,CAAA,EAAC,gBAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;;;;;qBATtD,MAA4E;AAAA,YAA5Ee,EAA4E,KAA5EM,IAA4Eb,EAArDR,EAAA,CAAA,6BAA6B9B,EAAA,MAAA,CAAc,CAAA,GAAA,CAAA;AAAA,YAClE6B,EAISC,EAAAW,CAAA,GAAA;AAAA,cAJD,mBAAgB;AAAA,cAAM,0BAAuB;AAAA,YAAA;yBACnD,MAEc;AAAA,gBAFdZ,EAEcC,EAAAY,CAAA,GAAA;AAAA,kBAFA,OAAOZ,EAAA,CAAA,EAAC,mBAAA;AAAA,gBAAA;6BACpB,MAA0E;AAAA,oBAA1ED,EAA0EC,EAAAc,CAAA,GAAA;AAAA,sBAAzD,OAAO3C,EAAA;AAAA,+DAAAA,EAAQ,QAAAuC;AAAA,sBAAG,aAAaV,EAAA,CAAA,EAAC,mBAAA;AAAA,oBAAA;;;;;;;;;;;;;;"}
@@ -1,8 +1,8 @@
1
1
  import o from "./index2.vue.js";
2
2
  /* empty css */
3
3
  import t from "../../../_virtual/_plugin-vue_export-helper.js";
4
- const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-73d8eaa2"]]);
4
+ const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-58444a64"]]);
5
5
  export {
6
- m as default
6
+ p as default
7
7
  };
8
8
  //# sourceMappingURL=index.vue.js.map
@@ -1,4 +1,4 @@
1
- import { defineComponent as R, ref as c, h as m, reactive as U, resolveDirective as B, openBlock as T, createElementBlock as O, Fragment as z, createVNode as r, unref as e, withCtx as l, withDirectives as q, createBlock as H, createTextVNode as D, toDisplayString as N, createSlots as F, createElementVNode as L } from "vue";
1
+ import { defineComponent as R, ref as c, h as m, reactive as U, resolveDirective as B, openBlock as T, createElementBlock as O, Fragment as z, createVNode as n, unref as e, withCtx as l, withDirectives as q, createBlock as H, createTextVNode as D, toDisplayString as N, createSlots as F, createElementVNode as L } from "vue";
2
2
  import { useMessage as j, NSpace as V, NButton as y, NPopconfirm as $, NForm as M, NFormItem as f, NInput as E, NInputNumber as G, NSwitch as W } from "naive-ui";
3
3
  import { useI18n as J } from "vue-i18n";
4
4
  import { SmartTable as K } from "smart-naive-table";
@@ -11,26 +11,29 @@ import { positionApi as u } from "../../../api/index.js";
11
11
  import { useAuthStore as ee } from "../../../stores/auth.js";
12
12
  import { translateError as I } from "../../../utils/error.js";
13
13
  import { SEARCH_ACTIONS as te, deriveHeaderFilters as oe } from "../../../utils/tableFilter.js";
14
- import { TABLE_MIN_ROW_HEIGHT as ae, TABLE_TOOLBAR as ie } from "../../../utils/tableToolbar.js";
15
- import ne from "../../../components/TableTotal/index.vue.js";
16
- const re = { class: "form-hint" }, Te = /* @__PURE__ */ R({
14
+ import { TABLE_MIN_ROW_HEIGHT as ie, TABLE_TOOLBAR as ae } from "../../../utils/tableToolbar.js";
15
+ import re from "../../../components/TableTotal/index.vue.js";
16
+ const ne = { class: "form-hint" }, Te = /* @__PURE__ */ R({
17
17
  __name: "index",
18
18
  setup(le) {
19
- const { t } = J(), v = j(), { run: x } = Z(), h = ee(), b = c(), g = (o) => ({
19
+ const { t } = J(), v = j(), { run: x } = Z(), h = ee(), b = c(), w = (o) => ({
20
20
  name: o.name,
21
21
  code: o.code,
22
22
  sort: o.sort,
23
23
  enabled: o.enabled
24
- }), w = [
24
+ }), g = [
25
25
  { type: "index", title: () => t("common.rowNo"), width: 64, align: "center" },
26
26
  {
27
27
  key: "name",
28
+ ellipsis: { tooltip: !0 },
28
29
  title: () => t("position.name"),
29
30
  search: { actions: te.fuzzy },
30
31
  sorter: !0
31
32
  },
32
33
  {
33
34
  key: "code",
35
+ width: 180,
36
+ ellipsis: { tooltip: !0 },
34
37
  title: () => t("position.code"),
35
38
  sorter: !0,
36
39
  render: (o) => m("span", { class: "mono muted" }, o.code)
@@ -50,13 +53,19 @@ const re = { class: "form-hint" }, Te = /* @__PURE__ */ R({
50
53
  render: (o) => m(Y, {
51
54
  value: o.enabled,
52
55
  disabled: !h.hasPerm("PUT:/api/v1/sys/position/{id}"),
53
- request: (a) => u.update(o.id, { ...g(o), enabled: a }),
54
- "onUpdate:value": (a) => {
55
- o.enabled = a;
56
+ request: (i) => u.update(o.id, { ...w(o), enabled: i }),
57
+ "onUpdate:value": (i) => {
58
+ o.enabled = i;
56
59
  }
57
60
  })
58
61
  },
59
- { key: "createTime", title: () => t("common.createTime"), format: "datetime", sorter: !0 },
62
+ {
63
+ key: "createTime",
64
+ width: 170,
65
+ title: () => t("common.createTime"),
66
+ format: "datetime",
67
+ sorter: !0
68
+ },
60
69
  {
61
70
  key: "op",
62
71
  title: () => t("common.operation"),
@@ -73,9 +82,9 @@ const re = { class: "form-hint" }, Te = /* @__PURE__ */ R({
73
82
  h.hasPerm("DELETE:/api/v1/sys/position/{id}") ? m(
74
83
  $,
75
84
  {
76
- onPositiveClick: () => x(() => u.remove(o.id), t("position.deleted")).then((a) => {
85
+ onPositiveClick: () => x(() => u.remove(o.id), t("position.deleted")).then((i) => {
77
86
  var d;
78
- a && ((d = b.value) == null || d.refresh());
87
+ i && ((d = b.value) == null || d.refresh());
79
88
  })
80
89
  },
81
90
  {
@@ -90,7 +99,7 @@ const re = { class: "form-hint" }, Te = /* @__PURE__ */ R({
90
99
  ])
91
100
  }
92
101
  ];
93
- oe(w);
102
+ oe(g);
94
103
  const p = c(!1), _ = c(null), s = c(null), S = {
95
104
  name: {
96
105
  required: !0,
@@ -98,40 +107,40 @@ const re = { class: "form-hint" }, Te = /* @__PURE__ */ R({
98
107
  message: () => t("position.nameRequired"),
99
108
  trigger: ["input", "blur"]
100
109
  }
101
- }, k = () => ({ name: "", code: "", sort: 0, enabled: !0 }), i = U(k());
110
+ }, k = () => ({ name: "", code: "", sort: 0, enabled: !0 }), a = U(k());
102
111
  function C() {
103
- s.value = null, Object.assign(i, k()), p.value = !0;
112
+ s.value = null, Object.assign(a, k()), p.value = !0;
104
113
  }
105
114
  function P(o) {
106
- s.value = o.id, Object.assign(i, g(o)), p.value = !0;
115
+ s.value = o.id, Object.assign(a, w(o)), p.value = !0;
107
116
  }
108
117
  async function A() {
109
- var o, a;
118
+ var o, i;
110
119
  await ((o = _.value) == null ? void 0 : o.validate());
111
120
  try {
112
- s.value === null ? await u.add({ ...i }) : await u.update(s.value, { ...i }), v.success(t("position.saved")), await ((a = b.value) == null ? void 0 : a.refresh());
121
+ s.value === null ? await u.add({ ...a }) : await u.update(s.value, { ...a }), v.success(t("position.saved")), await ((i = b.value) == null ? void 0 : i.refresh());
113
122
  } catch (d) {
114
123
  return v.error(I(d)), !1;
115
124
  }
116
125
  }
117
- return (o, a) => {
126
+ return (o, i) => {
118
127
  const d = B("auth");
119
128
  return T(), O(z, null, [
120
- r(e(K), {
121
- toolbar: e(ie),
129
+ n(e(K), {
130
+ toolbar: e(ae),
122
131
  ref_key: "tableRef",
123
132
  ref: b,
124
- columns: w,
133
+ columns: g,
125
134
  fetcher: e(u).page,
126
135
  search: { container: "table" },
127
136
  "fill-height": "",
128
- "min-row-height": e(ae),
137
+ "min-row-height": e(ie),
129
138
  "card-on-narrow": "",
130
139
  "storage-key": "sys-position",
131
- onError: a[0] || (a[0] = (n) => e(v).error(e(I)(n)))
140
+ onError: i[0] || (i[0] = (r) => e(v).error(e(I)(r)))
132
141
  }, {
133
- "pagination-prefix": l(({ itemCount: n }) => [
134
- r(ne, { count: n }, null, 8, ["count"])
142
+ "pagination-prefix": l(({ itemCount: r }) => [
143
+ n(re, { count: r }, null, 8, ["count"])
135
144
  ]),
136
145
  "toolbar-right": l(() => [
137
146
  q((T(), H(e(y), {
@@ -139,7 +148,7 @@ const re = { class: "form-hint" }, Te = /* @__PURE__ */ R({
139
148
  onClick: C
140
149
  }, {
141
150
  icon: l(() => [
142
- r(Q, {
151
+ n(Q, {
143
152
  icon: "ph:plus",
144
153
  size: 16
145
154
  })
@@ -154,45 +163,45 @@ const re = { class: "form-hint" }, Te = /* @__PURE__ */ R({
154
163
  ]),
155
164
  _: 1
156
165
  }, 8, ["toolbar", "fetcher", "min-row-height"]),
157
- r(X, {
166
+ n(X, {
158
167
  show: p.value,
159
- "onUpdate:show": a[5] || (a[5] = (n) => p.value = n),
168
+ "onUpdate:show": i[5] || (i[5] = (r) => p.value = r),
160
169
  title: s.value === null ? e(t)("position.addTitle") : e(t)("position.editTitle"),
161
170
  width: 480,
162
171
  "on-confirm": A,
163
172
  "confirm-text": e(t)("common.save")
164
173
  }, {
165
174
  default: l(() => [
166
- r(e(M), {
175
+ n(e(M), {
167
176
  ref_key: "formRef",
168
177
  ref: _,
169
- model: i,
178
+ model: a,
170
179
  rules: S,
171
180
  "label-placement": "left",
172
181
  "label-width": 80
173
182
  }, {
174
183
  default: l(() => [
175
- r(e(f), {
184
+ n(e(f), {
176
185
  label: e(t)("position.name"),
177
186
  path: "name"
178
187
  }, {
179
188
  default: l(() => [
180
- r(e(E), {
181
- value: i.name,
182
- "onUpdate:value": a[1] || (a[1] = (n) => i.name = n),
189
+ n(e(E), {
190
+ value: a.name,
191
+ "onUpdate:value": i[1] || (i[1] = (r) => a.name = r),
183
192
  placeholder: e(t)("position.name")
184
193
  }, null, 8, ["value", "placeholder"])
185
194
  ]),
186
195
  _: 1
187
196
  }, 8, ["label"]),
188
- r(e(f), {
197
+ n(e(f), {
189
198
  label: e(t)("position.code"),
190
199
  path: "code"
191
200
  }, F({
192
201
  default: l(() => [
193
- r(e(E), {
194
- value: i.code,
195
- "onUpdate:value": a[2] || (a[2] = (n) => i.code = n),
202
+ n(e(E), {
203
+ value: a.code,
204
+ "onUpdate:value": i[2] || (i[2] = (r) => a.code = r),
196
205
  placeholder: e(t)("position.codePlaceholder"),
197
206
  disabled: s.value !== null
198
207
  }, null, 8, ["value", "placeholder", "disabled"])
@@ -202,31 +211,31 @@ const re = { class: "form-hint" }, Te = /* @__PURE__ */ R({
202
211
  s.value !== null ? {
203
212
  name: "feedback",
204
213
  fn: l(() => [
205
- L("span", re, N(e(t)("position.codeImmutableHint")), 1)
214
+ L("span", ne, N(e(t)("position.codeImmutableHint")), 1)
206
215
  ]),
207
216
  key: "0"
208
217
  } : void 0
209
218
  ]), 1032, ["label"]),
210
- r(e(f), {
219
+ n(e(f), {
211
220
  label: e(t)("position.sort")
212
221
  }, {
213
222
  default: l(() => [
214
- r(e(G), {
215
- value: i.sort,
216
- "onUpdate:value": a[3] || (a[3] = (n) => i.sort = n),
223
+ n(e(G), {
224
+ value: a.sort,
225
+ "onUpdate:value": i[3] || (i[3] = (r) => a.sort = r),
217
226
  min: 0,
218
227
  style: { width: "160px" }
219
228
  }, null, 8, ["value"])
220
229
  ]),
221
230
  _: 1
222
231
  }, 8, ["label"]),
223
- r(e(f), {
232
+ n(e(f), {
224
233
  label: e(t)("common.status")
225
234
  }, {
226
235
  default: l(() => [
227
- r(e(W), {
228
- value: i.enabled,
229
- "onUpdate:value": a[4] || (a[4] = (n) => i.enabled = n)
236
+ n(e(W), {
237
+ value: a.enabled,
238
+ "onUpdate:value": i[4] || (i[4] = (r) => a.enabled = r)
230
239
  }, null, 8, ["value"])
231
240
  ]),
232
241
  _: 1
@@ -1 +1 @@
1
- {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/position/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 岗位管理 = 普通 SmartTable CRUD + 行内启停。岗位与机构无关联(PositionInput 无 orgId)。\n// 后端无独立启停端点 → StatusSwitch 走全量 update(同 module 页);code 编辑禁用。\nimport { h, reactive, ref } from 'vue'\nimport {\n NButton,\n NSpace,\n NInput,\n NInputNumber,\n NPopconfirm,\n NForm,\n NFormItem,\n NSwitch,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport AppIcon from '#/components/AppIcon.vue'\nimport FormContainer from '#/components/FormContainer/index.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { positionApi } from '#/api'\nimport { useAuthStore } from '#/stores/auth'\nimport { translateError } from '#/utils/error'\nimport { SEARCH_ACTIONS, deriveHeaderFilters } from '#/utils/tableFilter'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport TableTotal from '#/components/TableTotal/index.vue'\nimport type { PositionInput, SysPosition } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\nconst tableRef = ref<SmartTableInst<SysPosition>>()\n\n// 行数据 → 完整入参:openEdit 回填与 StatusSwitch 行内改状态共用(后端无独立启停端点,均走全量 update)。\nconst toInput = (r: SysPosition): PositionInput => ({\n name: r.name,\n code: r.code,\n sort: r.sort,\n enabled: r.enabled,\n})\n\nconst columns: SmartTableColumn<SysPosition>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n key: 'name',\n title: () => t('position.name'),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n sorter: true,\n },\n {\n key: 'code',\n title: () => t('position.code'),\n sorter: true,\n render: r => h('span', { class: 'mono muted' }, r.code),\n },\n {\n key: 'sort',\n title: () => t('position.sort'),\n width: 80,\n sorter: true,\n render: r => h('span', { class: 'num muted' }, r.sort),\n },\n {\n key: 'enabled',\n title: () => t('common.status'),\n width: 90,\n sorter: true,\n render: r =>\n h(StatusSwitch, {\n value: r.enabled,\n disabled: !authStore.hasPerm('PUT:/api/v1/sys/position/{id}'),\n request: (next: boolean) => positionApi.update(r.id, { ...toInput(r), enabled: next }),\n 'onUpdate:value': (v: boolean) => {\n r.enabled = v\n },\n }),\n },\n { key: 'createTime', title: () => t('common.createTime'), format: 'datetime', sorter: true },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 140,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 2, wrapItem: false, justify: 'end' }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/position/{id}')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openEdit(r) },\n () => t('common.edit'),\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/position/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => positionApi.remove(r.id), t('position.deleted')).then(ok => {\n if (ok) tableRef.value?.refresh()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('position.deleteConfirm', { name: r.name }),\n },\n )\n : null,\n ]),\n },\n]\nderiveHeaderFilters(columns)\n\n// ── 新增/编辑弹窗 ──\nconst show = ref(false)\nconst formRef = ref<FormInst | null>(null)\nconst editingId = ref<number | null>(null)\nconst rules: FormRules = {\n name: {\n required: true,\n whitespace: true,\n message: () => t('position.nameRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst blank = (): PositionInput => ({ name: '', code: '', sort: 0, enabled: true })\nconst form = reactive<PositionInput>(blank())\n\nfunction openAdd() {\n editingId.value = null\n Object.assign(form, blank())\n show.value = true\n}\nfunction openEdit(r: SysPosition) {\n editingId.value = r.id\n Object.assign(form, toInput(r))\n show.value = true\n}\nasync function save() {\n await formRef.value?.validate()\n try {\n if (editingId.value === null) await positionApi.add({ ...form })\n else await positionApi.update(editingId.value, { ...form })\n message.success(t('position.saved'))\n await tableRef.value?.refresh()\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n</script>\n\n<template>\n <SmartTable\n :toolbar=\"TABLE_TOOLBAR\"\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"positionApi.page\"\n :search=\"{ container: 'table' }\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-position\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n <template #toolbar-right>\n <n-button v-auth=\"'POST:/api/v1/sys/position/add'\" type=\"primary\" @click=\"openAdd\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n </template>\n </SmartTable>\n\n <FormContainer\n v-model:show=\"show\"\n :title=\"editingId === null ? t('position.addTitle') : t('position.editTitle')\"\n :width=\"480\"\n :on-confirm=\"save\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form ref=\"formRef\" :model=\"form\" :rules=\"rules\" label-placement=\"left\" :label-width=\"80\">\n <n-form-item :label=\"t('position.name')\" path=\"name\">\n <n-input v-model:value=\"form.name\" :placeholder=\"t('position.name')\" />\n </n-form-item>\n <n-form-item :label=\"t('position.code')\" path=\"code\">\n <n-input\n v-model:value=\"form.code\"\n :placeholder=\"t('position.codePlaceholder')\"\n :disabled=\"editingId !== null\"\n />\n <template v-if=\"editingId !== null\" #feedback>\n <span class=\"form-hint\">{{ t('position.codeImmutableHint') }}</span>\n </template>\n </n-form-item>\n <n-form-item :label=\"t('position.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>\n </FormContainer>\n</template>\n\n<style scoped>\n/* 编码「创建后不可修改」提示,挂在表单项的 feedback 位 */\n.form-hint {\n font-size: 13px;\n color: var(--text-3);\n}\n</style>\n"],"names":["useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","tableRef","ref","toInput","r","columns","SEARCH_ACTIONS","h","StatusSwitch","next","positionApi","v","NSpace","NButton","openEdit","NPopconfirm","ok","_a","deriveHeaderFilters","show","formRef","editingId","rules","blank","form","reactive","openAdd","save","_b","e","translateError","_createVNode","_unref","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_cache","_withCtx","itemCount","TableTotal","_createBlock","AppIcon","_createTextVNode","FormContainer","$event","NForm","NFormItem","NInput","_createElementVNode","_hoisted_1","_toDisplayString","NInputNumber","NSwitch"],"mappings":"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"}
1
+ {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/position/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 岗位管理 = 普通 SmartTable CRUD + 行内启停。岗位与机构无关联(PositionInput 无 orgId)。\n// 后端无独立启停端点 → StatusSwitch 走全量 update(同 module 页);code 编辑禁用。\nimport { h, reactive, ref } from 'vue'\nimport {\n NButton,\n NSpace,\n NInput,\n NInputNumber,\n NPopconfirm,\n NForm,\n NFormItem,\n NSwitch,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport AppIcon from '#/components/AppIcon.vue'\nimport FormContainer from '#/components/FormContainer/index.vue'\nimport StatusSwitch from '#/components/StatusSwitch/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { positionApi } from '#/api'\nimport { useAuthStore } from '#/stores/auth'\nimport { translateError } from '#/utils/error'\nimport { SEARCH_ACTIONS, deriveHeaderFilters } from '#/utils/tableFilter'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport TableTotal from '#/components/TableTotal/index.vue'\nimport type { PositionInput, SysPosition } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\nconst tableRef = ref<SmartTableInst<SysPosition>>()\n\n// 行数据 → 完整入参:openEdit 回填与 StatusSwitch 行内改状态共用(后端无独立启停端点,均走全量 update)。\nconst toInput = (r: SysPosition): PositionInput => ({\n name: r.name,\n code: r.code,\n sort: r.sort,\n enabled: r.enabled,\n})\n\nconst columns: SmartTableColumn<SysPosition>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n key: 'name',\n ellipsis: { tooltip: true },\n title: () => t('position.name'),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n sorter: true,\n },\n {\n key: 'code',\n width: 180,\n ellipsis: { tooltip: true },\n title: () => t('position.code'),\n sorter: true,\n render: r => h('span', { class: 'mono muted' }, r.code),\n },\n {\n key: 'sort',\n title: () => t('position.sort'),\n width: 80,\n sorter: true,\n render: r => h('span', { class: 'num muted' }, r.sort),\n },\n {\n key: 'enabled',\n title: () => t('common.status'),\n width: 90,\n sorter: true,\n render: r =>\n h(StatusSwitch, {\n value: r.enabled,\n disabled: !authStore.hasPerm('PUT:/api/v1/sys/position/{id}'),\n request: (next: boolean) => positionApi.update(r.id, { ...toInput(r), enabled: next }),\n 'onUpdate:value': (v: boolean) => {\n r.enabled = v\n },\n }),\n },\n {\n key: 'createTime',\n width: 170,\n title: () => t('common.createTime'),\n format: 'datetime',\n sorter: true,\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 140,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 2, wrapItem: false, justify: 'end' }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/position/{id}')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openEdit(r) },\n () => t('common.edit'),\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/position/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => positionApi.remove(r.id), t('position.deleted')).then(ok => {\n if (ok) tableRef.value?.refresh()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('position.deleteConfirm', { name: r.name }),\n },\n )\n : null,\n ]),\n },\n]\nderiveHeaderFilters(columns)\n\n// ── 新增/编辑弹窗 ──\nconst show = ref(false)\nconst formRef = ref<FormInst | null>(null)\nconst editingId = ref<number | null>(null)\nconst rules: FormRules = {\n name: {\n required: true,\n whitespace: true,\n message: () => t('position.nameRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst blank = (): PositionInput => ({ name: '', code: '', sort: 0, enabled: true })\nconst form = reactive<PositionInput>(blank())\n\nfunction openAdd() {\n editingId.value = null\n Object.assign(form, blank())\n show.value = true\n}\nfunction openEdit(r: SysPosition) {\n editingId.value = r.id\n Object.assign(form, toInput(r))\n show.value = true\n}\nasync function save() {\n await formRef.value?.validate()\n try {\n if (editingId.value === null) await positionApi.add({ ...form })\n else await positionApi.update(editingId.value, { ...form })\n message.success(t('position.saved'))\n await tableRef.value?.refresh()\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n</script>\n\n<template>\n <SmartTable\n :toolbar=\"TABLE_TOOLBAR\"\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"positionApi.page\"\n :search=\"{ container: 'table' }\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-position\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n <template #toolbar-right>\n <n-button v-auth=\"'POST:/api/v1/sys/position/add'\" type=\"primary\" @click=\"openAdd\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n </template>\n </SmartTable>\n\n <FormContainer\n v-model:show=\"show\"\n :title=\"editingId === null ? t('position.addTitle') : t('position.editTitle')\"\n :width=\"480\"\n :on-confirm=\"save\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form ref=\"formRef\" :model=\"form\" :rules=\"rules\" label-placement=\"left\" :label-width=\"80\">\n <n-form-item :label=\"t('position.name')\" path=\"name\">\n <n-input v-model:value=\"form.name\" :placeholder=\"t('position.name')\" />\n </n-form-item>\n <n-form-item :label=\"t('position.code')\" path=\"code\">\n <n-input\n v-model:value=\"form.code\"\n :placeholder=\"t('position.codePlaceholder')\"\n :disabled=\"editingId !== null\"\n />\n <template v-if=\"editingId !== null\" #feedback>\n <span class=\"form-hint\">{{ t('position.codeImmutableHint') }}</span>\n </template>\n </n-form-item>\n <n-form-item :label=\"t('position.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>\n </FormContainer>\n</template>\n\n<style scoped>\n/* 编码「创建后不可修改」提示,挂在表单项的 feedback 位 */\n.form-hint {\n font-size: 13px;\n color: var(--text-3);\n}\n</style>\n"],"names":["useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","tableRef","ref","toInput","r","columns","SEARCH_ACTIONS","h","StatusSwitch","next","positionApi","v","NSpace","NButton","openEdit","NPopconfirm","ok","_a","deriveHeaderFilters","show","formRef","editingId","rules","blank","form","reactive","openAdd","save","_b","e","translateError","_createVNode","_unref","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_cache","_withCtx","itemCount","TableTotal","_createBlock","AppIcon","_createTextVNode","FormContainer","$event","NForm","NFormItem","NInput","_createElementVNode","_hoisted_1","_toDisplayString","NInputNumber","NSwitch"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  import o from "./index2.vue.js";
2
2
  /* empty css */
3
3
  import t from "../../../_virtual/_plugin-vue_export-helper.js";
4
- const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-701398fc"]]);
4
+ const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-f42bc8f1"]]);
5
5
  export {
6
6
  p as default
7
7
  };
@@ -37,9 +37,11 @@ const Q = { class: "view fill-page" }, ae = /* @__PURE__ */ z({
37
37
  }
38
38
  const g = [
39
39
  { type: "index", title: () => t("common.rowNo"), width: 64, align: "center" },
40
- { key: "name", title: () => t("recycle.name"), search: {} },
40
+ { key: "name", ellipsis: { tooltip: !0 }, title: () => t("recycle.name"), search: {} },
41
41
  {
42
42
  key: "code",
43
+ width: 180,
44
+ ellipsis: { tooltip: !0 },
43
45
  title: () => t("recycle.code"),
44
46
  search: {},
45
47
  // 编码可能为空(如岗位):空值画灰色的「—」
@@ -1 +1 @@
1
- {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/recycle/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { h, ref } from 'vue'\nimport { NButton, NSpace, NTabs, NTabPane, NPopconfirm, useMessage } from 'naive-ui'\nimport { useMediaQuery } from '@vueuse/core'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useAuthStore } from '#/stores/auth'\nimport { recycleApi, type RecycleBinItem } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport TableTotal from '#/components/TableTotal/index.vue'\nimport {\n createClientFilterFetcher,\n passthroughFilterSerializer,\n deriveHeaderFilters,\n} from '#/utils/tableFilter'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\n\nconst types = [\n 'user',\n 'role',\n 'org',\n 'position',\n 'module',\n 'config',\n 'dict',\n 'menu',\n 'job',\n] as const\ntype RecycleType = (typeof types)[number]\nconst activeTab = ref<RecycleType>('user')\n// 窄屏页签放大到触控尺寸\nconst narrow = useMediaQuery('(max-width: 604px)')\n// 回收站端点没有过滤能力,搜索由前端求值;每个标签的接口不同,各配一个取数器。\n// fields 要与下面声明了 search 的列 key 一致\nconst clientFetchers = Object.fromEntries(\n types.map(type => [type, createClientFilterFetcher(recycleApi.page(type), ['name', 'code'])]),\n) as Record<RecycleType, ReturnType<typeof createClientFilterFetcher<RecycleBinItem>>>\nconst tableRefs = ref<Record<string, SmartTableInst<RecycleBinItem>>>({})\n\nfunction setTableRef(type: string) {\n // 函数 ref 的参数类型是宽泛的组件实例,收窄为 SmartTableInst 后存入映射\n return (el: unknown) => {\n if (el) tableRefs.value[type] = el as SmartTableInst<RecycleBinItem>\n }\n}\n\nfunction refreshTab(type: string) {\n tableRefs.value[type]?.refresh()\n}\n\nconst columns: SmartTableColumn<RecycleBinItem>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n { key: 'name', title: () => t('recycle.name'), search: {} },\n {\n key: 'code',\n title: () => t('recycle.code'),\n search: {},\n // 编码可能为空(如岗位):空值画灰色的「—」\n render: r =>\n r.code ? h('span', { class: 'mono muted' }, r.code) : h('span', { class: 'faint' }, '—'),\n },\n { key: 'deletedAt', title: () => t('recycle.deletedAt'), format: 'datetime', width: 180 },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 180,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 2, justify: 'end', wrapItem: false }, () => [\n authStore.hasPerm('POST:/api/v1/sys/recycle/{type}/{id}/restore')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => recycleApi.restore(activeTab.value, r.id), t('recycle.restored')).then(\n ok => {\n if (ok) refreshTab(activeTab.value)\n },\n ),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'primary' }, () =>\n t('recycle.restore'),\n ),\n default: () => t('recycle.restoreConfirm', { name: r.name }),\n },\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/recycle/{type}/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => recycleApi.purge(activeTab.value, r.id), t('recycle.purged')).then(\n ok => {\n if (ok) refreshTab(activeTab.value)\n },\n ),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('recycle.purge'),\n ),\n default: () => t('recycle.purgeConfirm', { name: r.name }),\n },\n )\n : null,\n ]),\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <div class=\"view fill-page\">\n <!-- 形状 4:.fill-tabs 把 n-tabs → 面板容器 → .n-tab-pane 一路拉成 flex 列,\n 面板里的 SmartTable 就接上高度链了(见 styles/layout.css ⑧)。 -->\n <!-- 9 个资源类型用 macOS 分段控件(轨道 + 滑块)切换:控件按内容收窄、靠左,不撑满整行;\n 窄屏放不下时轨道自己横向滑动。轨道 / 滑块色走主题的 --seg-track / --seg-thumb。 -->\n <n-tabs\n v-model:value=\"activeTab\"\n type=\"segment\"\n animated\n class=\"fill-tabs recycle-seg\"\n :size=\"narrow ? 'large' : 'medium'\"\n :pane-style=\"{ padding: 0 }\"\n >\n <n-tab-pane v-for=\"type in types\" :key=\"type\" :name=\"type\" :tab=\"t(`recycle.tabs.${type}`)\">\n <SmartTable\n :ref=\"setTableRef(type)\"\n :columns=\"columns\"\n :fetcher=\"clientFetchers[type]\"\n :toolbar=\"TABLE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n :filter-serializer=\"passthroughFilterSerializer\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n :storage-key=\"`sys-recycle-${type}`\"\n @error=\"(e: unknown) => message.error(translateError(e))\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n </SmartTable>\n </n-tab-pane>\n </n-tabs>\n </div>\n</template>\n\n<style scoped>\n/* display / flex-direction / 整屏高度链都在 styles/layout.css 的 .fill-page,这里只留卡片间距。 */\n.view {\n gap: var(--gap-card);\n}\n\n/* 分段控件:naive 的 segment 轨道默认 width:100% 且各格等分,9 格会被撑成一条长带。\n 这里让轨道按内容收窄、靠左;格子按文字自适应宽度(滑块位置由 naive 按实际格宽量,不受影响)。 */\n.recycle-seg :deep(.n-tabs-nav) {\n align-self: flex-start;\n max-width: 100%;\n margin-bottom: var(--gap-card);\n}\n.recycle-seg :deep(.n-tabs-rail) {\n width: auto;\n overflow-x: auto;\n scrollbar-width: none;\n}\n.recycle-seg :deep(.n-tabs-rail::-webkit-scrollbar) {\n display: none;\n}\n.recycle-seg :deep(.n-tabs-tab-wrapper) {\n flex: 0 0 auto;\n}\n.recycle-seg :deep(.n-tabs-tab) {\n padding: 4px 14px;\n white-space: nowrap;\n}\n\n/* 辅助字样(表格单元格由库渲染,要 :deep) */\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</style>\n"],"names":["useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","types","activeTab","ref","narrow","useMediaQuery","clientFetchers","type","createClientFilterFetcher","recycleApi","tableRefs","setTableRef","el","refreshTab","_a","columns","r","h","NSpace","NPopconfirm","ok","NButton","deriveHeaderFilters","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","NTabs","$event","_Fragment","_renderList","NTabPane","SmartTable","TABLE_TOOLBAR","passthroughFilterSerializer","TABLE_MIN_ROW_HEIGHT","_cache","e","translateError","_withCtx","itemCount","TableTotal"],"mappings":"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"}
1
+ {"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/recycle/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\nimport { h, ref } from 'vue'\nimport { NButton, NSpace, NTabs, NTabPane, NPopconfirm, useMessage } from 'naive-ui'\nimport { useMediaQuery } from '@vueuse/core'\nimport { SmartTable, type SmartTableColumn, type SmartTableInst } from 'smart-naive-table'\nimport { useI18n } from 'vue-i18n'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useAuthStore } from '#/stores/auth'\nimport { recycleApi, type RecycleBinItem } from '#/api'\nimport { translateError } from '#/utils/error'\nimport { TABLE_MIN_ROW_HEIGHT, TABLE_TOOLBAR } from '#/utils/tableToolbar'\nimport TableTotal from '#/components/TableTotal/index.vue'\nimport {\n createClientFilterFetcher,\n passthroughFilterSerializer,\n deriveHeaderFilters,\n} from '#/utils/tableFilter'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\n\nconst types = [\n 'user',\n 'role',\n 'org',\n 'position',\n 'module',\n 'config',\n 'dict',\n 'menu',\n 'job',\n] as const\ntype RecycleType = (typeof types)[number]\nconst activeTab = ref<RecycleType>('user')\n// 窄屏页签放大到触控尺寸\nconst narrow = useMediaQuery('(max-width: 604px)')\n// 回收站端点没有过滤能力,搜索由前端求值;每个标签的接口不同,各配一个取数器。\n// fields 要与下面声明了 search 的列 key 一致\nconst clientFetchers = Object.fromEntries(\n types.map(type => [type, createClientFilterFetcher(recycleApi.page(type), ['name', 'code'])]),\n) as Record<RecycleType, ReturnType<typeof createClientFilterFetcher<RecycleBinItem>>>\nconst tableRefs = ref<Record<string, SmartTableInst<RecycleBinItem>>>({})\n\nfunction setTableRef(type: string) {\n // 函数 ref 的参数类型是宽泛的组件实例,收窄为 SmartTableInst 后存入映射\n return (el: unknown) => {\n if (el) tableRefs.value[type] = el as SmartTableInst<RecycleBinItem>\n }\n}\n\nfunction refreshTab(type: string) {\n tableRefs.value[type]?.refresh()\n}\n\nconst columns: SmartTableColumn<RecycleBinItem>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n { key: 'name', ellipsis: { tooltip: true }, title: () => t('recycle.name'), search: {} },\n {\n key: 'code',\n width: 180,\n ellipsis: { tooltip: true },\n title: () => t('recycle.code'),\n search: {},\n // 编码可能为空(如岗位):空值画灰色的「—」\n render: r =>\n r.code ? h('span', { class: 'mono muted' }, r.code) : h('span', { class: 'faint' }, '—'),\n },\n { key: 'deletedAt', title: () => t('recycle.deletedAt'), format: 'datetime', width: 180 },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 180,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 2, justify: 'end', wrapItem: false }, () => [\n authStore.hasPerm('POST:/api/v1/sys/recycle/{type}/{id}/restore')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => recycleApi.restore(activeTab.value, r.id), t('recycle.restored')).then(\n ok => {\n if (ok) refreshTab(activeTab.value)\n },\n ),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'primary' }, () =>\n t('recycle.restore'),\n ),\n default: () => t('recycle.restoreConfirm', { name: r.name }),\n },\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/recycle/{type}/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => recycleApi.purge(activeTab.value, r.id), t('recycle.purged')).then(\n ok => {\n if (ok) refreshTab(activeTab.value)\n },\n ),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('recycle.purge'),\n ),\n default: () => t('recycle.purgeConfirm', { name: r.name }),\n },\n )\n : null,\n ]),\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <div class=\"view fill-page\">\n <!-- 形状 4:.fill-tabs 把 n-tabs → 面板容器 → .n-tab-pane 一路拉成 flex 列,\n 面板里的 SmartTable 就接上高度链了(见 styles/layout.css ⑧)。 -->\n <!-- 9 个资源类型用 macOS 分段控件(轨道 + 滑块)切换:控件按内容收窄、靠左,不撑满整行;\n 窄屏放不下时轨道自己横向滑动。轨道 / 滑块色走主题的 --seg-track / --seg-thumb。 -->\n <n-tabs\n v-model:value=\"activeTab\"\n type=\"segment\"\n animated\n class=\"fill-tabs recycle-seg\"\n :size=\"narrow ? 'large' : 'medium'\"\n :pane-style=\"{ padding: 0 }\"\n >\n <n-tab-pane v-for=\"type in types\" :key=\"type\" :name=\"type\" :tab=\"t(`recycle.tabs.${type}`)\">\n <SmartTable\n :ref=\"setTableRef(type)\"\n :columns=\"columns\"\n :fetcher=\"clientFetchers[type]\"\n :toolbar=\"TABLE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n :filter-serializer=\"passthroughFilterSerializer\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n :storage-key=\"`sys-recycle-${type}`\"\n @error=\"(e: unknown) => message.error(translateError(e))\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n </SmartTable>\n </n-tab-pane>\n </n-tabs>\n </div>\n</template>\n\n<style scoped>\n/* display / flex-direction / 整屏高度链都在 styles/layout.css 的 .fill-page,这里只留卡片间距。 */\n.view {\n gap: var(--gap-card);\n}\n\n/* 分段控件:naive 的 segment 轨道默认 width:100% 且各格等分,9 格会被撑成一条长带。\n 这里让轨道按内容收窄、靠左;格子按文字自适应宽度(滑块位置由 naive 按实际格宽量,不受影响)。 */\n.recycle-seg :deep(.n-tabs-nav) {\n align-self: flex-start;\n max-width: 100%;\n margin-bottom: var(--gap-card);\n}\n.recycle-seg :deep(.n-tabs-rail) {\n width: auto;\n overflow-x: auto;\n scrollbar-width: none;\n}\n.recycle-seg :deep(.n-tabs-rail::-webkit-scrollbar) {\n display: none;\n}\n.recycle-seg :deep(.n-tabs-tab-wrapper) {\n flex: 0 0 auto;\n}\n.recycle-seg :deep(.n-tabs-tab) {\n padding: 4px 14px;\n white-space: nowrap;\n}\n\n/* 辅助字样(表格单元格由库渲染,要 :deep) */\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</style>\n"],"names":["useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","types","activeTab","ref","narrow","useMediaQuery","clientFetchers","type","createClientFilterFetcher","recycleApi","tableRefs","setTableRef","el","refreshTab","_a","columns","r","h","NSpace","NPopconfirm","ok","NButton","deriveHeaderFilters","_openBlock","_createElementBlock","_hoisted_1","_createVNode","_unref","NTabs","$event","_Fragment","_renderList","NTabPane","SmartTable","TABLE_TOOLBAR","passthroughFilterSerializer","TABLE_MIN_ROW_HEIGHT","_cache","e","translateError","_withCtx","itemCount","TableTotal"],"mappings":";;;;;;;;;;;;;;;AAkBA,UAAM,EAAE,EAAA,IAAMA,EAAA,GACRC,IAAUC,EAAA,GACV,EAAE,KAAAC,EAAA,IAAQC,EAAA,GACVC,IAAYC,EAAA,GAEZC,IAAQ;AAAA,MACZ;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IAAA,GAGIC,IAAYC,EAAiB,MAAM,GAEnCC,IAASC,EAAc,oBAAoB,GAG3CC,IAAiB,OAAO;AAAA,MAC5BL,EAAM,IAAI,CAAAM,MAAQ,CAACA,GAAMC,EAA0BC,EAAW,KAAKF,CAAI,GAAG,CAAC,QAAQ,MAAM,CAAC,CAAC,CAAC;AAAA,IAAA,GAExFG,IAAYP,EAAoD,EAAE;AAExE,aAASQ,EAAYJ,GAAc;AAEjC,aAAO,CAACK,MAAgB;AACtB,QAAIA,MAAIF,EAAU,MAAMH,CAAI,IAAIK;AAAA,MAClC;AAAA,IACF;AAEA,aAASC,EAAWN,GAAc;;AAChC,OAAAO,IAAAJ,EAAU,MAAMH,CAAI,MAApB,QAAAO,EAAuB;AAAA,IACzB;AAEA,UAAMC,IAA8C;AAAA,MAClD,EAAE,MAAM,SAAS,OAAO,MAAM,EAAE,cAAc,GAAG,OAAO,IAAI,OAAO,SAAA;AAAA,MACnE,EAAE,KAAK,QAAQ,UAAU,EAAE,SAAS,GAAA,GAAQ,OAAO,MAAM,EAAE,cAAc,GAAG,QAAQ,CAAA,EAAC;AAAA,MACrF;AAAA,QACE,KAAK;AAAA,QACL,OAAO;AAAA,QACP,UAAU,EAAE,SAAS,GAAA;AAAA,QACrB,OAAO,MAAM,EAAE,cAAc;AAAA,QAC7B,QAAQ,CAAA;AAAA;AAAA,QAER,QAAQ,CAAAC,MACNA,EAAE,OAAOC,EAAE,QAAQ,EAAE,OAAO,aAAA,GAAgBD,EAAE,IAAI,IAAIC,EAAE,QAAQ,EAAE,OAAO,QAAA,GAAW,GAAG;AAAA,MAAA;AAAA,MAE3F,EAAE,KAAK,aAAa,OAAO,MAAM,EAAE,mBAAmB,GAAG,QAAQ,YAAY,OAAO,IAAA;AAAA,MACpF;AAAA,QACE,KAAK;AAAA,QACL,OAAO,MAAM,EAAE,kBAAkB;AAAA,QACjC,OAAO;AAAA,QACP,OAAO;AAAA,QACP,OAAO;AAAA,QACP,eAAe;AAAA,QACf,QAAQ,CAAAD,MACNC,EAAEC,GAAQ,EAAE,MAAM,GAAG,SAAS,OAAO,UAAU,GAAA,GAAS,MAAM;AAAA,UAC5DnB,EAAU,QAAQ,8CAA8C,IAC5DkB;AAAA,YACEE;AAAA,YACA;AAAA,cACE,iBAAiB,MACftB,EAAI,MAAMY,EAAW,QAAQP,EAAU,OAAOc,EAAE,EAAE,GAAG,EAAE,kBAAkB,CAAC,EAAE;AAAA,gBAC1E,CAAAI,MAAM;AACJ,kBAAIA,KAAIP,EAAWX,EAAU,KAAK;AAAA,gBACpC;AAAA,cAAA;AAAA,YACF;AAAA,YAEJ;AAAA,cACE,SAAS,MACPe;AAAA,gBAAEI;AAAA,gBAAS,EAAE,MAAM,SAAS,YAAY,IAAM,MAAM,UAAA;AAAA,gBAAa,MAC/D,EAAE,iBAAiB;AAAA,cAAA;AAAA,cAEvB,SAAS,MAAM,EAAE,0BAA0B,EAAE,MAAML,EAAE,MAAM;AAAA,YAAA;AAAA,UAC7D,IAEF;AAAA,UACJjB,EAAU,QAAQ,wCAAwC,IACtDkB;AAAA,YACEE;AAAA,YACA;AAAA,cACE,iBAAiB,MACftB,EAAI,MAAMY,EAAW,MAAMP,EAAU,OAAOc,EAAE,EAAE,GAAG,EAAE,gBAAgB,CAAC,EAAE;AAAA,gBACtE,CAAAI,MAAM;AACJ,kBAAIA,KAAIP,EAAWX,EAAU,KAAK;AAAA,gBACpC;AAAA,cAAA;AAAA,YACF;AAAA,YAEJ;AAAA,cACE,SAAS,MACPe;AAAA,gBAAEI;AAAA,gBAAS,EAAE,MAAM,SAAS,YAAY,IAAM,MAAM,QAAA;AAAA,gBAAW,MAC7D,EAAE,eAAe;AAAA,cAAA;AAAA,cAErB,SAAS,MAAM,EAAE,wBAAwB,EAAE,MAAML,EAAE,MAAM;AAAA,YAAA;AAAA,UAC3D,IAEF;AAAA,QAAA,CACL;AAAA,MAAA;AAAA,IACL;AAEF,WAAAM,EAAoBP,CAAO,cAIzBQ,EAAA,GAAAC,EAiCM,OAjCNC,GAiCM;AAAA,MA5BJC,EA2BSC,EAAAC,CAAA,GAAA;AAAA,QA1BC,OAAO1B,EAAA;AAAA,iDAAAA,EAAS,QAAA2B;AAAA,QACxB,MAAK;AAAA,QACL,UAAA;AAAA,QACA,OAAM;AAAA,QACL,MAAMF,EAAAvB,CAAA,IAAM,UAAA;AAAA,QACZ,cAAY,EAAA,SAAA,EAAA;AAAA,MAAA;mBAED,MAAqB;AAAA,gBAAjCoB,EAkBaM,GAAA,MAAAC,EAlBc9B,GAAK,CAAbM,MAAnBmB,EAkBaC,EAAAK,CAAA,GAAA;AAAA,YAlBsB,KAAKzB;AAAA,YAAO,MAAMA;AAAA,YAAO,KAAKoB,EAAA,CAAA,EAAC,gBAAiBpB,CAAI,EAAA;AAAA,UAAA;uBACrF,MAgBa;AAAA,cAhBbmB,EAgBaC,EAAAM,CAAA,GAAA;AAAA;gBAfV,KAAKtB,EAAYJ,CAAI;AAAA,gBACrB,SAAAQ;AAAA,gBACA,SAASY,EAAArB,CAAA,EAAeC,CAAI;AAAA,gBAC5B,SAASoB,EAAAO,CAAA;AAAA,gBACT,QAAQ,EAAA,WAAA,QAAA;AAAA,gBACR,qBAAmBP,EAAAQ,CAAA;AAAA,gBACpB,eAAA;AAAA,gBACC,kBAAgBR,EAAAS,CAAA;AAAA,gBACjB,kBAAA;AAAA,gBACC,8BAA4B7B,CAAI;AAAA,gBAChC,SAAK8B,EAAA,CAAA,MAAAA,EAAA,CAAA,IAAA,CAAGC,MAAeX,EAAAhC,CAAA,EAAQ,MAAMgC,EAAAY,CAAA,EAAeD,CAAC,CAAA;AAAA,cAAA;gBAE3C,qBAAiBE,EAC1B,CAAiC,EADH,WAAAC,QAAS;AAAA,kBACvCf,EAAiCgB,GAAA,EAApB,OAAOD,EAAA,GAAS,MAAA,GAAA,CAAA,OAAA,CAAA;AAAA,gBAAA;;;;;;;;;;;;"}
@@ -5,6 +5,8 @@ type __VLS_Props = {
5
5
  granted: number[];
6
6
  modules: ModuleRow[];
7
7
  defaultModuleId: number;
8
+ /** 列表上方的一行说明(如范围限制);不给不显示 */
9
+ hint?: string;
8
10
  onSave: (ids: number[]) => unknown | Promise<unknown>;
9
11
  };
10
12
  type __VLS_ModelProps = {
@@ -1,8 +1,8 @@
1
1
  import t from "./GrantMenuSheet2.vue.js";
2
2
  /* empty css */
3
3
  import o from "../../../../_virtual/_plugin-vue_export-helper.js";
4
- const m = /* @__PURE__ */ o(t, [["__scopeId", "data-v-cd5d3924"]]);
4
+ const f = /* @__PURE__ */ o(t, [["__scopeId", "data-v-0fc6fe0a"]]);
5
5
  export {
6
- m as default
6
+ f as default
7
7
  };
8
8
  //# sourceMappingURL=GrantMenuSheet.vue.js.map