smart-admin-web 10.21.0 → 10.23.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 (60) hide show
  1. package/dist/assets/icons/ph-subset.json.js +1 -1
  2. package/dist/components/FormContainer/index.vue.js +67 -67
  3. package/dist/components/FormContainer/index.vue.js.map +1 -1
  4. package/dist/components/SidePanelDrawer/index.vue.d.ts +25 -0
  5. package/dist/components/SidePanelDrawer/index.vue.js +40 -0
  6. package/dist/components/SidePanelDrawer/index.vue.js.map +1 -0
  7. package/dist/components/SidePanelDrawer/index3.vue.js +6 -0
  8. package/dist/components/SidePanelDrawer/index3.vue.js.map +1 -0
  9. package/dist/composables/authMenuRoute.d.ts +10 -0
  10. package/dist/composables/authMenuRoute.js +39 -23
  11. package/dist/composables/authMenuRoute.js.map +1 -1
  12. package/dist/composables/useModule.d.ts +3 -1
  13. package/dist/composables/useModule.js +44 -32
  14. package/dist/composables/useModule.js.map +1 -1
  15. package/dist/composables/useShellBreakpoint.js +14 -13
  16. package/dist/composables/useShellBreakpoint.js.map +1 -1
  17. package/dist/composables/useSidePanel.d.ts +9 -0
  18. package/dist/composables/useSidePanel.js +12 -0
  19. package/dist/composables/useSidePanel.js.map +1 -0
  20. package/dist/index.d.ts +2 -0
  21. package/dist/index.js +297 -290
  22. package/dist/index.js.map +1 -1
  23. package/dist/layouts/components/SideNav.vue.js +2 -2
  24. package/dist/layouts/components/SideNav2.vue.js.map +1 -1
  25. package/dist/layouts/default.vue.js +2 -2
  26. package/dist/layouts/default2.vue.js.map +1 -1
  27. package/dist/lib/runtime.js +1 -1
  28. package/dist/locales/en-US.d.ts +6 -0
  29. package/dist/locales/en-US.js +9 -2
  30. package/dist/locales/en-US.js.map +1 -1
  31. package/dist/locales/zh-CN.d.ts +6 -0
  32. package/dist/locales/zh-CN.js +9 -2
  33. package/dist/locales/zh-CN.js.map +1 -1
  34. package/dist/style.css +1 -1
  35. package/dist/utils/tree.d.ts +15 -0
  36. package/dist/utils/tree.js +43 -29
  37. package/dist/utils/tree.js.map +1 -1
  38. package/dist/utils/treeCard.d.ts +6 -0
  39. package/dist/utils/treeCard.js +9 -0
  40. package/dist/utils/treeCard.js.map +1 -0
  41. package/dist/views/error/404.vue.js +2 -2
  42. package/dist/views/error/4042.vue.js +81 -24
  43. package/dist/views/error/4042.vue.js.map +1 -1
  44. package/dist/views/login/components/LoginDesk.vue.js +2 -2
  45. package/dist/views/login/components/LoginDesk2.vue.js.map +1 -1
  46. package/dist/views/login/components/LoginHeroPanel.vue.js +2 -2
  47. package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -1
  48. package/dist/views/system/job-monitor/index.vue.js +2 -2
  49. package/dist/views/system/job-monitor/index2.vue.js +46 -46
  50. package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
  51. package/dist/views/system/menu/index.vue.js +2 -2
  52. package/dist/views/system/menu/index2.vue.js +161 -150
  53. package/dist/views/system/menu/index2.vue.js.map +1 -1
  54. package/dist/views/system/org/index.vue.js +2 -2
  55. package/dist/views/system/org/index2.vue.js +182 -176
  56. package/dist/views/system/org/index2.vue.js.map +1 -1
  57. package/dist/views/system/user/index.vue.js +1 -1
  58. package/dist/views/system/user/index2.vue.js +296 -277
  59. package/dist/views/system/user/index2.vue.js.map +1 -1
  60. 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 // 树的缩进和展开箭头落在这一列:不指定时 Naive 取第一个没有 type 的列,正好是 64px 宽的序号列,\n // 层级一深序号就被缩进挤出列外\n tree: true,\n align: 'left',\n width: 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":"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"}
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":"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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 m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-1a6d7cc8"]]);
4
+ const m = /* @__PURE__ */ t(o, [["__scopeId", "data-v-efde0606"]]);
5
5
  export {
6
6
  m as default
7
7
  };