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.
- package/dist/api/index.d.ts +19 -1
- package/dist/api/index.js +85 -66
- package/dist/api/index.js.map +1 -1
- package/dist/api/schema.d.ts +448 -1
- package/dist/assets/icons/ph-subset.json.js +1 -1
- package/dist/components/FormContainer/index.vue.js +87 -75
- package/dist/components/FormContainer/index.vue.js.map +1 -1
- package/dist/components/UserPicker/UserAvatar.vue.d.ts +8 -0
- package/dist/components/UserPicker/UserAvatar.vue.js +8 -0
- package/dist/components/UserPicker/UserAvatar.vue.js.map +1 -0
- package/dist/components/UserPicker/UserAvatar2.vue.js +38 -0
- package/dist/components/UserPicker/UserAvatar2.vue.js.map +1 -0
- package/dist/components/UserPicker/index.vue.js +1 -1
- package/dist/components/UserPicker/index2.vue.js +328 -186
- package/dist/components/UserPicker/index2.vue.js.map +1 -1
- package/dist/composables/authMenuRoute.d.ts +10 -0
- package/dist/composables/authMenuRoute.js +39 -23
- package/dist/composables/authMenuRoute.js.map +1 -1
- package/dist/composables/useModule.d.ts +3 -1
- package/dist/composables/useModule.js +44 -32
- package/dist/composables/useModule.js.map +1 -1
- package/dist/index.js +246 -242
- package/dist/layouts/components/SideNav.vue.js +2 -2
- package/dist/layouts/components/SideNav2.vue.js.map +1 -1
- package/dist/lib/runtime.js +1 -1
- package/dist/lib/watermark.d.ts +1 -1
- package/dist/locales/en-US.d.ts +68 -3
- package/dist/locales/en-US.js +74 -8
- package/dist/locales/en-US.js.map +1 -1
- package/dist/locales/kernelMenuTitles.js +1 -0
- package/dist/locales/kernelMenuTitles.js.map +1 -1
- package/dist/locales/zh-CN.d.ts +68 -3
- package/dist/locales/zh-CN.js +74 -8
- package/dist/locales/zh-CN.js.map +1 -1
- package/dist/router/viewRegistry.js +6 -6
- package/dist/router/viewRegistry.js.map +1 -1
- package/dist/style.css +1 -1
- package/dist/theme/naive-theme.js +80 -77
- package/dist/theme/naive-theme.js.map +1 -1
- package/dist/types/api.d.ts +91 -0
- package/dist/types/api.js +17 -15
- package/dist/types/api.js.map +1 -1
- package/dist/utils/shake.d.ts +1 -0
- package/dist/utils/shake.js +30 -0
- package/dist/utils/shake.js.map +1 -0
- package/dist/utils/tree.d.ts +15 -0
- package/dist/utils/tree.js +43 -29
- package/dist/utils/tree.js.map +1 -1
- package/dist/utils/treeCard.d.ts +6 -0
- package/dist/utils/treeCard.js +9 -0
- package/dist/utils/treeCard.js.map +1 -0
- package/dist/views/error/404.vue.js +2 -2
- package/dist/views/error/4042.vue.js +81 -24
- package/dist/views/error/4042.vue.js.map +1 -1
- package/dist/views/login/LoginForm.vue.js +2 -2
- package/dist/views/login/LoginForm2.vue.js +135 -135
- package/dist/views/login/LoginForm2.vue.js.map +1 -1
- package/dist/views/login/components/LoginDesk.vue.js +2 -2
- package/dist/views/login/components/LoginDesk2.vue.js +59 -47
- package/dist/views/login/components/LoginDesk2.vue.js.map +1 -1
- package/dist/views/login/components/LoginHeroPanel.vue.js +2 -2
- package/dist/views/login/components/LoginHeroPanel2.vue.js.map +1 -1
- package/dist/views/personal/notice2.vue.js +1 -1
- package/dist/views/personal/notice2.vue.js.map +1 -1
- package/dist/views/personal/sessions.vue.js +2 -2
- package/dist/views/personal/sessions2.vue.js +41 -40
- package/dist/views/personal/sessions2.vue.js.map +1 -1
- package/dist/views/system/ai-usage/index.vue.js +3 -3
- package/dist/views/system/ai-usage/index2.vue.js +13 -12
- package/dist/views/system/ai-usage/index2.vue.js.map +1 -1
- package/dist/views/system/config/components/AdvancedSection.vue.js +3 -3
- package/dist/views/system/config/components/AdvancedSection2.vue.js +2 -1
- package/dist/views/system/config/components/AdvancedSection2.vue.js.map +1 -1
- package/dist/views/system/dict/index.vue.js +2 -2
- package/dist/views/system/dict/index2.vue.js +12 -1
- package/dist/views/system/dict/index2.vue.js.map +1 -1
- package/dist/views/system/file/index2.vue.js +1 -0
- package/dist/views/system/file/index2.vue.js.map +1 -1
- package/dist/views/system/job/index.vue.js +3 -3
- package/dist/views/system/job/index2.vue.js +182 -181
- package/dist/views/system/job/index2.vue.js.map +1 -1
- package/dist/views/system/job-log/components/AttemptTable2.vue.js +8 -3
- package/dist/views/system/job-log/components/AttemptTable2.vue.js.map +1 -1
- package/dist/views/system/job-log/index.vue.js +1 -1
- package/dist/views/system/job-log/index2.vue.js +5 -5
- package/dist/views/system/job-log/index2.vue.js.map +1 -1
- package/dist/views/system/job-monitor/index.vue.js +2 -2
- package/dist/views/system/job-monitor/index2.vue.js +46 -46
- package/dist/views/system/job-monitor/index2.vue.js.map +1 -1
- package/dist/views/system/log/exception/index.vue.js +2 -2
- package/dist/views/system/log/exception/index2.vue.js +8 -5
- package/dist/views/system/log/exception/index2.vue.js.map +1 -1
- package/dist/views/system/log/login/index2.vue.js +21 -12
- package/dist/views/system/log/login/index2.vue.js.map +1 -1
- package/dist/views/system/log/op/index.vue.js +2 -2
- package/dist/views/system/log/op/index2.vue.js +50 -40
- package/dist/views/system/log/op/index2.vue.js.map +1 -1
- package/dist/views/system/menu/components/ButtonManager.vue.js +2 -2
- package/dist/views/system/menu/components/ButtonManager2.vue.js +45 -36
- package/dist/views/system/menu/components/ButtonManager2.vue.js.map +1 -1
- package/dist/views/system/menu/index.vue.js +1 -1
- package/dist/views/system/menu/index2.vue.js +162 -151
- package/dist/views/system/menu/index2.vue.js.map +1 -1
- package/dist/views/system/module/index.vue.js +1 -1
- package/dist/views/system/module/index2.vue.js +171 -117
- package/dist/views/system/module/index2.vue.js.map +1 -1
- package/dist/views/system/notice/index.vue.js +3 -3
- package/dist/views/system/notice/index2.vue.js +1 -0
- package/dist/views/system/notice/index2.vue.js.map +1 -1
- package/dist/views/system/org/index.vue.js +2 -2
- package/dist/views/system/org/index2.vue.js +204 -195
- package/dist/views/system/org/index2.vue.js.map +1 -1
- package/dist/views/system/position/index.vue.js +2 -2
- package/dist/views/system/position/index2.vue.js +57 -48
- package/dist/views/system/position/index2.vue.js.map +1 -1
- package/dist/views/system/recycle/index.vue.js +1 -1
- package/dist/views/system/recycle/index2.vue.js +3 -1
- package/dist/views/system/recycle/index2.vue.js.map +1 -1
- package/dist/views/system/role/components/GrantMenuSheet.vue.d.ts +2 -0
- package/dist/views/system/role/components/GrantMenuSheet.vue.js +2 -2
- package/dist/views/system/role/components/GrantMenuSheet2.vue.js +54 -49
- package/dist/views/system/role/components/GrantMenuSheet2.vue.js.map +1 -1
- package/dist/views/system/role/components/GrantMenuTable.vue.js +1 -1
- package/dist/views/system/role/components/GrantMenuTable2.vue.js +159 -195
- package/dist/views/system/role/components/GrantMenuTable2.vue.js.map +1 -1
- package/dist/views/system/role/components/grantMenuGroups.d.ts +54 -0
- package/dist/views/system/role/components/grantMenuGroups.js +116 -76
- package/dist/views/system/role/components/grantMenuGroups.js.map +1 -1
- package/dist/views/system/role/index.vue.js +2 -2
- package/dist/views/system/role/index2.vue.js +152 -145
- package/dist/views/system/role/index2.vue.js.map +1 -1
- package/dist/views/system/session/index2.vue.js +39 -35
- package/dist/views/system/session/index2.vue.js.map +1 -1
- package/dist/views/system/user/components/UserGrantEffectiveTable.vue.d.ts +10 -0
- package/dist/views/system/user/components/UserGrantEffectiveTable.vue.js +5 -0
- package/dist/views/system/user/components/UserGrantEffectiveTable.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantEffectiveTable2.vue.js +96 -0
- package/dist/views/system/user/components/UserGrantEffectiveTable2.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantMenuSheet.vue.d.ts +13 -0
- package/dist/views/system/user/components/UserGrantMenuSheet.vue.js +8 -0
- package/dist/views/system/user/components/UserGrantMenuSheet.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantMenuSheet2.vue.js +216 -0
- package/dist/views/system/user/components/UserGrantMenuSheet2.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantMenuTable.vue.d.ts +13 -0
- package/dist/views/system/user/components/UserGrantMenuTable.vue.js +8 -0
- package/dist/views/system/user/components/UserGrantMenuTable.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantMenuTable2.vue.js +186 -0
- package/dist/views/system/user/components/UserGrantMenuTable2.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantNodeRow.vue.d.ts +31 -0
- package/dist/views/system/user/components/UserGrantNodeRow.vue.js +8 -0
- package/dist/views/system/user/components/UserGrantNodeRow.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantNodeRow2.vue.js +171 -0
- package/dist/views/system/user/components/UserGrantNodeRow2.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantOverviewDrawer.vue.d.ts +21 -0
- package/dist/views/system/user/components/UserGrantOverviewDrawer.vue.js +5 -0
- package/dist/views/system/user/components/UserGrantOverviewDrawer.vue.js.map +1 -0
- package/dist/views/system/user/components/UserGrantOverviewDrawer2.vue.js +178 -0
- package/dist/views/system/user/components/UserGrantOverviewDrawer2.vue.js.map +1 -0
- package/dist/views/system/user/components/userGrantState.d.ts +64 -0
- package/dist/views/system/user/components/userGrantState.js +117 -0
- package/dist/views/system/user/components/userGrantState.js.map +1 -0
- package/dist/views/system/user/index.vue.js +2 -2
- package/dist/views/system/user/index2.vue.js +369 -295
- package/dist/views/system/user/index2.vue.js.map +1 -1
- 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":"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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,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
|
|
4
|
+
const p = /* @__PURE__ */ t(o, [["__scopeId", "data-v-58444a64"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
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
|
|
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
|
|
15
|
-
import
|
|
16
|
-
const
|
|
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(),
|
|
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
|
-
}),
|
|
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: (
|
|
54
|
-
"onUpdate:value": (
|
|
55
|
-
o.enabled =
|
|
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
|
-
{
|
|
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((
|
|
85
|
+
onPositiveClick: () => x(() => u.remove(o.id), t("position.deleted")).then((i) => {
|
|
77
86
|
var d;
|
|
78
|
-
|
|
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(
|
|
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 }),
|
|
110
|
+
}, k = () => ({ name: "", code: "", sort: 0, enabled: !0 }), a = U(k());
|
|
102
111
|
function C() {
|
|
103
|
-
s.value = null, Object.assign(
|
|
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(
|
|
115
|
+
s.value = o.id, Object.assign(a, w(o)), p.value = !0;
|
|
107
116
|
}
|
|
108
117
|
async function A() {
|
|
109
|
-
var o,
|
|
118
|
+
var o, i;
|
|
110
119
|
await ((o = _.value) == null ? void 0 : o.validate());
|
|
111
120
|
try {
|
|
112
|
-
s.value === null ? await u.add({ ...
|
|
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,
|
|
126
|
+
return (o, i) => {
|
|
118
127
|
const d = B("auth");
|
|
119
128
|
return T(), O(z, null, [
|
|
120
|
-
|
|
121
|
-
toolbar: e(
|
|
129
|
+
n(e(K), {
|
|
130
|
+
toolbar: e(ae),
|
|
122
131
|
ref_key: "tableRef",
|
|
123
132
|
ref: b,
|
|
124
|
-
columns:
|
|
133
|
+
columns: g,
|
|
125
134
|
fetcher: e(u).page,
|
|
126
135
|
search: { container: "table" },
|
|
127
136
|
"fill-height": "",
|
|
128
|
-
"min-row-height": e(
|
|
137
|
+
"min-row-height": e(ie),
|
|
129
138
|
"card-on-narrow": "",
|
|
130
139
|
"storage-key": "sys-position",
|
|
131
|
-
onError:
|
|
140
|
+
onError: i[0] || (i[0] = (r) => e(v).error(e(I)(r)))
|
|
132
141
|
}, {
|
|
133
|
-
"pagination-prefix": l(({ itemCount:
|
|
134
|
-
|
|
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
|
-
|
|
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
|
-
|
|
166
|
+
n(X, {
|
|
158
167
|
show: p.value,
|
|
159
|
-
"onUpdate:show":
|
|
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
|
-
|
|
175
|
+
n(e(M), {
|
|
167
176
|
ref_key: "formRef",
|
|
168
177
|
ref: _,
|
|
169
|
-
model:
|
|
178
|
+
model: a,
|
|
170
179
|
rules: S,
|
|
171
180
|
"label-placement": "left",
|
|
172
181
|
"label-width": 80
|
|
173
182
|
}, {
|
|
174
183
|
default: l(() => [
|
|
175
|
-
|
|
184
|
+
n(e(f), {
|
|
176
185
|
label: e(t)("position.name"),
|
|
177
186
|
path: "name"
|
|
178
187
|
}, {
|
|
179
188
|
default: l(() => [
|
|
180
|
-
|
|
181
|
-
value:
|
|
182
|
-
"onUpdate:value":
|
|
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
|
-
|
|
197
|
+
n(e(f), {
|
|
189
198
|
label: e(t)("position.code"),
|
|
190
199
|
path: "code"
|
|
191
200
|
}, F({
|
|
192
201
|
default: l(() => [
|
|
193
|
-
|
|
194
|
-
value:
|
|
195
|
-
"onUpdate:value":
|
|
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",
|
|
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
|
-
|
|
219
|
+
n(e(f), {
|
|
211
220
|
label: e(t)("position.sort")
|
|
212
221
|
}, {
|
|
213
222
|
default: l(() => [
|
|
214
|
-
|
|
215
|
-
value:
|
|
216
|
-
"onUpdate:value":
|
|
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
|
-
|
|
232
|
+
n(e(f), {
|
|
224
233
|
label: e(t)("common.status")
|
|
225
234
|
}, {
|
|
226
235
|
default: l(() => [
|
|
227
|
-
|
|
228
|
-
value:
|
|
229
|
-
"onUpdate:value":
|
|
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-
|
|
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":"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"}
|
|
@@ -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
|
|
4
|
+
const f = /* @__PURE__ */ o(t, [["__scopeId", "data-v-0fc6fe0a"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
f as default
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=GrantMenuSheet.vue.js.map
|