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":"AdvancedSection2.vue.js","sources":["../../../../../src/views/system/config/components/AdvancedSection.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 高级:给开发者看的原始键值表。列出所有没被结构化表单认领的配置行——\n// 结构化分组里的零散键、业务模块自己加的配置都在这里;认领清单来自草稿(draft.claimedKeys)。\n// 列驱动搜索/分页/竞态交 SmartTable,新增/编辑弹窗是 ConfigFormModal。\nimport { computed, h, ref, watch } from 'vue'\nimport { NButton, NSpace, NPopconfirm, useMessage } 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 { useConfirm } from '#/composables/useConfirm'\nimport { useAuthStore } from '#/stores/auth'\nimport { configApi } from '#/api'\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 { SysConfig } from '#/types/api'\nimport ConfigFormModal from './ConfigFormModal.vue'\nimport SectionLayout from './SectionLayout.vue'\nimport { bumpConfigRevision, configRevision } from '../groups'\nimport { useConfigDraft } from '../draft'\nimport { useConfigLayout } from '../layoutMode'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\nconst draft = useConfigDraft()\nconst { nar, side } = useConfigLayout()\n// 窄档卡片里的行内按钮放大,方便手指点\nconst btnSize = computed(() => (nar.value ? 'medium' : 'small'))\nconst tableRef = ref<SmartTableInst<SysConfig>>()\n\n// 在库里排除已认领的键,分页总数才准\nconst fetchConfigs = (params: Parameters<typeof configApi.page>[0]) =>\n configApi.page({ ...params, excludedKeys: draft.claimedKeys.value })\n\n// 保存或增删改了配置行都刷当前页(不回第 1 页)\nwatch(configRevision, () => tableRef.value?.refresh())\n\nconst columns: SmartTableColumn<SysConfig>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n key: 'configKey',\n title: () => t('config.key'),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n ellipsis: { tooltip: true },\n },\n {\n key: 'name',\n title: () => t('config.name'),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n ellipsis: { tooltip: true },\n },\n {\n key: 'configValue',\n title: () => t('config.value'),\n ellipsis: { tooltip: true },\n render: r => r.configValue || '—',\n },\n {\n key: 'groupCode',\n title: () => t('config.group'),\n search: { actions: SEARCH_ACTIONS.exact },\n render: r => r.groupCode || '—',\n },\n { key: 'sort', title: () => t('config.sort'), width: 80 },\n { key: 'createTime', title: () => t('common.createTime'), format: 'datetime' },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 140,\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 4, wrapItem: false }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/config/{id}')\n ? h(\n NButton,\n {\n size: btnSize.value,\n quaternary: true,\n type: 'primary',\n onClick: () => openEdit(r),\n },\n () => t('common.edit'),\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/config/{id}')\n ? h(\n NPopconfirm,\n {\n // popconfirm 当触发器,「执行→toast」交给 useConfirm().run(与 module 页一致)。\n onPositiveClick: () =>\n run(() => configApi.remove(r.id), t('config.deleted')).then(ok => {\n if (ok) bumpConfigRevision()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: btnSize.value, quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('config.deleteConfirm', { name: r.name }),\n },\n )\n : null,\n ]),\n },\n]\nderiveHeaderFilters(columns)\n\nconst show = ref(false)\nconst editing = ref<SysConfig | null>(null)\nfunction openAdd() {\n editing.value = null\n show.value = true\n}\nfunction openEdit(r: SysConfig) {\n editing.value = r\n show.value = true\n}\n</script>\n\n<template>\n <SectionLayout :title=\"t('config.tab.advanced')\" :desc=\"t('config.advanced.desc')\">\n <!-- .fill-main 接上内核的高度链(styles/layout.css):页面不滚,只有表体滚。\n 窄档整页自然滚动:表收成卡片列表、不再定高;中档(单栏)给固定高度,宽档吃满剩余高度 -->\n <div :class=\"['fill-main', 'adv', { 'adv--fixed': !side && !nar }]\">\n <SmartTable\n :toolbar=\"TABLE_TOOLBAR\"\n :fill-height=\"!nar\"\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"fetchConfigs\"\n :search=\"{ container: 'table' }\"\n storage-key=\"sys-config\"\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/config'\" 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 </div>\n </SectionLayout>\n\n <ConfigFormModal v-model:show=\"show\" :row=\"editing\" />\n</template>\n\n<style scoped>\n.adv--fixed {\n flex: none;\n height: 560px;\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","draft","useConfigDraft","nar","side","useConfigLayout","btnSize","computed","tableRef","ref","fetchConfigs","params","configApi","watch","configRevision","_a","columns","SEARCH_ACTIONS","r","h","NSpace","NButton","openEdit","NPopconfirm","ok","bumpConfigRevision","deriveHeaderFilters","show","editing","openAdd","_createVNode","SectionLayout","_unref","_createElementVNode","_normalizeClass","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_cache","e","translateError","_withCtx","itemCount","TableTotal","_createBlock","AppIcon","_createTextVNode","ConfigFormModal","$event"],"mappings":";;;;;;;;;;;;;;;;;;;;AAuBA,UAAM,EAAE,GAAAA,EAAA,IAAMC,EAAA,GACRC,IAAUC,EAAA,GACV,EAAE,KAAAC,EAAA,IAAQC,EAAA,GACVC,IAAYC,EAAA,GACZC,IAAQC,GAAA,GACR,EAAE,KAAAC,GAAK,MAAAC,EAAA,IAASC,GAAA,GAEhBC,IAAUC,EAAS,MAAOJ,EAAI,QAAQ,WAAW,OAAQ,GACzDK,IAAWC,EAAA,GAGXC,IAAe,CAACC,MACpBC,EAAU,KAAK,EAAE,GAAGD,GAAQ,cAAcV,EAAM,YAAY,MAAA,CAAO;AAGrE,IAAAY,EAAMC,IAAgB,MAAA;;AAAM,cAAAC,IAAAP,EAAS,UAAT,gBAAAO,EAAgB;AAAA,KAAS;AAErD,UAAMC,IAAyC;AAAA,MAC7C,EAAE,MAAM,SAAS,OAAO,MAAMvB,EAAE,cAAc,GAAG,OAAO,IAAI,OAAO,SAAA;AAAA,MACnE;AAAA,QACE,KAAK;AAAA,QACL,OAAO,MAAMA,EAAE,YAAY;AAAA,QAC3B,QAAQ,EAAE,SAASwB,EAAe,MAAA;AAAA,QAClC,UAAU,EAAE,SAAS,GAAA;AAAA,MAAK;AAAA,MAE5B;AAAA,QACE,KAAK;AAAA,QACL,OAAO,MAAMxB,EAAE,aAAa;AAAA,QAC5B,QAAQ,EAAE,SAASwB,EAAe,MAAA;AAAA,QAClC,UAAU,EAAE,SAAS,GAAA;AAAA,MAAK;AAAA,MAE5B;AAAA,QACE,KAAK;AAAA,QACL,OAAO,MAAMxB,EAAE,cAAc;AAAA,QAC7B,UAAU,EAAE,SAAS,GAAA;AAAA,QACrB,QAAQ,CAAAyB,MAAKA,EAAE,eAAe;AAAA,MAAA;AAAA,MAEhC;AAAA,QACE,KAAK;AAAA,QACL,OAAO,MAAMzB,EAAE,cAAc;AAAA,QAC7B,QAAQ,EAAE,SAASwB,EAAe,MAAA;AAAA,QAClC,QAAQ,CAAAC,MAAKA,EAAE,aAAa;AAAA,MAAA;AAAA,MAE9B,EAAE,KAAK,QAAQ,OAAO,MAAMzB,EAAE,aAAa,GAAG,OAAO,GAAA;AAAA,MACrD,EAAE,KAAK,cAAc,OAAO,MAAMA,EAAE,mBAAmB,GAAG,QAAQ,WAAA;AAAA,
|
|
1
|
+
{"version":3,"file":"AdvancedSection2.vue.js","sources":["../../../../../src/views/system/config/components/AdvancedSection.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 高级:给开发者看的原始键值表。列出所有没被结构化表单认领的配置行——\n// 结构化分组里的零散键、业务模块自己加的配置都在这里;认领清单来自草稿(draft.claimedKeys)。\n// 列驱动搜索/分页/竞态交 SmartTable,新增/编辑弹窗是 ConfigFormModal。\nimport { computed, h, ref, watch } from 'vue'\nimport { NButton, NSpace, NPopconfirm, useMessage } 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 { useConfirm } from '#/composables/useConfirm'\nimport { useAuthStore } from '#/stores/auth'\nimport { configApi } from '#/api'\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 { SysConfig } from '#/types/api'\nimport ConfigFormModal from './ConfigFormModal.vue'\nimport SectionLayout from './SectionLayout.vue'\nimport { bumpConfigRevision, configRevision } from '../groups'\nimport { useConfigDraft } from '../draft'\nimport { useConfigLayout } from '../layoutMode'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\nconst draft = useConfigDraft()\nconst { nar, side } = useConfigLayout()\n// 窄档卡片里的行内按钮放大,方便手指点\nconst btnSize = computed(() => (nar.value ? 'medium' : 'small'))\nconst tableRef = ref<SmartTableInst<SysConfig>>()\n\n// 在库里排除已认领的键,分页总数才准\nconst fetchConfigs = (params: Parameters<typeof configApi.page>[0]) =>\n configApi.page({ ...params, excludedKeys: draft.claimedKeys.value })\n\n// 保存或增删改了配置行都刷当前页(不回第 1 页)\nwatch(configRevision, () => tableRef.value?.refresh())\n\nconst columns: SmartTableColumn<SysConfig>[] = [\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n key: 'configKey',\n title: () => t('config.key'),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n ellipsis: { tooltip: true },\n },\n {\n key: 'name',\n title: () => t('config.name'),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n ellipsis: { tooltip: true },\n },\n {\n key: 'configValue',\n title: () => t('config.value'),\n ellipsis: { tooltip: true },\n render: r => r.configValue || '—',\n },\n {\n key: 'groupCode',\n ellipsis: { tooltip: true },\n title: () => t('config.group'),\n search: { actions: SEARCH_ACTIONS.exact },\n render: r => r.groupCode || '—',\n },\n { key: 'sort', title: () => t('config.sort'), width: 80 },\n { key: 'createTime', width: 170, title: () => t('common.createTime'), format: 'datetime' },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 140,\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 4, wrapItem: false }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/config/{id}')\n ? h(\n NButton,\n {\n size: btnSize.value,\n quaternary: true,\n type: 'primary',\n onClick: () => openEdit(r),\n },\n () => t('common.edit'),\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/config/{id}')\n ? h(\n NPopconfirm,\n {\n // popconfirm 当触发器,「执行→toast」交给 useConfirm().run(与 module 页一致)。\n onPositiveClick: () =>\n run(() => configApi.remove(r.id), t('config.deleted')).then(ok => {\n if (ok) bumpConfigRevision()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: btnSize.value, quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('config.deleteConfirm', { name: r.name }),\n },\n )\n : null,\n ]),\n },\n]\nderiveHeaderFilters(columns)\n\nconst show = ref(false)\nconst editing = ref<SysConfig | null>(null)\nfunction openAdd() {\n editing.value = null\n show.value = true\n}\nfunction openEdit(r: SysConfig) {\n editing.value = r\n show.value = true\n}\n</script>\n\n<template>\n <SectionLayout :title=\"t('config.tab.advanced')\" :desc=\"t('config.advanced.desc')\">\n <!-- .fill-main 接上内核的高度链(styles/layout.css):页面不滚,只有表体滚。\n 窄档整页自然滚动:表收成卡片列表、不再定高;中档(单栏)给固定高度,宽档吃满剩余高度 -->\n <div :class=\"['fill-main', 'adv', { 'adv--fixed': !side && !nar }]\">\n <SmartTable\n :toolbar=\"TABLE_TOOLBAR\"\n :fill-height=\"!nar\"\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"fetchConfigs\"\n :search=\"{ container: 'table' }\"\n storage-key=\"sys-config\"\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/config'\" 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 </div>\n </SectionLayout>\n\n <ConfigFormModal v-model:show=\"show\" :row=\"editing\" />\n</template>\n\n<style scoped>\n.adv--fixed {\n flex: none;\n height: 560px;\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","draft","useConfigDraft","nar","side","useConfigLayout","btnSize","computed","tableRef","ref","fetchConfigs","params","configApi","watch","configRevision","_a","columns","SEARCH_ACTIONS","r","h","NSpace","NButton","openEdit","NPopconfirm","ok","bumpConfigRevision","deriveHeaderFilters","show","editing","openAdd","_createVNode","SectionLayout","_unref","_createElementVNode","_normalizeClass","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_cache","e","translateError","_withCtx","itemCount","TableTotal","_createBlock","AppIcon","_createTextVNode","ConfigFormModal","$event"],"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-59350c7e"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
p as default
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=index.vue.js.map
|
|
@@ -76,12 +76,15 @@ const Je = { class: "sheet-foot" }, Xe = {
|
|
|
76
76
|
{ type: "index", title: () => a("common.rowNo"), width: 64, align: "center" },
|
|
77
77
|
{
|
|
78
78
|
key: "code",
|
|
79
|
+
width: 180,
|
|
80
|
+
ellipsis: { tooltip: !0 },
|
|
79
81
|
title: () => a("dict.code"),
|
|
80
82
|
render: (e) => u("span", { class: "mono muted" }, e.code)
|
|
81
83
|
},
|
|
82
84
|
// 窄档卡片以类型名称作标题(默认取第一个数据列 = 编码,不如名称好认)
|
|
83
85
|
{
|
|
84
86
|
key: "name",
|
|
87
|
+
ellipsis: { tooltip: !0 },
|
|
85
88
|
title: () => a("dict.name"),
|
|
86
89
|
card: "title",
|
|
87
90
|
search: { actions: Qe.fuzzy }
|
|
@@ -195,10 +198,18 @@ const Je = { class: "sheet-foot" }, Xe = {
|
|
|
195
198
|
}), F = [
|
|
196
199
|
{ type: "selection" },
|
|
197
200
|
{ type: "index", title: () => a("common.rowNo"), width: 64, align: "center" },
|
|
198
|
-
{
|
|
201
|
+
{
|
|
202
|
+
title: () => a("dict.itemLabel"),
|
|
203
|
+
key: "label",
|
|
204
|
+
ellipsis: { tooltip: !0 },
|
|
205
|
+
card: "title",
|
|
206
|
+
search: {}
|
|
207
|
+
},
|
|
199
208
|
{
|
|
200
209
|
title: () => a("dict.itemValue"),
|
|
201
210
|
key: "value",
|
|
211
|
+
width: 160,
|
|
212
|
+
ellipsis: { tooltip: !0 },
|
|
202
213
|
search: {},
|
|
203
214
|
render: (e) => u("span", { class: "mono muted" }, e.value)
|
|
204
215
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/dict/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 字典管理 = 主从:上=类型 SmartTable(CRUD),点击行选中 → 下=该类型的字典项(同样是 SmartTable,静态数据模式 + CRUD)。\n// 关键约束:下方走管理端 dict/item/page(含停用项、带 id);下拉用的 dict/items/{code} 只回启用项且丢 id,不能复用。\n// 任何类型/项的增删改后调 useDictStore().invalidate(code) 失效下拉缓存,变更即时生效。\nimport { computed, h, reactive, ref } from 'vue'\nimport {\n NButton,\n NCard,\n NDrawer,\n NDrawerContent,\n NSpace,\n NInput,\n NInputNumber,\n NPopconfirm,\n NForm,\n NFormItem,\n NEmpty,\n NSwitch,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { useElementSize, useMediaQuery } from '@vueuse/core'\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 { useBatchDelete } from '#/composables/useBatchDelete'\nimport { dictAdminApi } from '#/api'\nimport { useAuthStore } from '#/stores/auth'\nimport { useDictStore } from '#/stores/dict'\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 { DictItemInput, DictTypeInput, SysDictItem, SysDictType } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\nconst dictStore = useDictStore()\nconst typeTableRef = ref<SmartTableInst<SysDictType>>()\n\n// 本页不开「放大」:上下两栏各自定高、表体内部滚动,放大层会把主从关系拆散。\nconst TYPE_TOOLBAR = { ...TABLE_TOOLBAR, maximize: false }\n\n// ── 窄档:类型表换成卡片列表,字典项不内联,点卡片从底部抽屉看 ──\n// 阈值与 smart-naive-table 的 card-on-narrow 一致(根节点宽 < 600);页面外壳宽 = 类型表根节点宽。\n// 首帧量到 0 不算窄档,免得宽屏刷新时闪一下卡片。\nconst layoutRef = ref<HTMLElement>()\nconst { width: layoutWidth } = useElementSize(layoutRef)\nconst narrow = computed(() => layoutWidth.value > 0 && layoutWidth.value < 600)\nconst itemSheet = ref(false)\n\n// 表单:窄屏标签放上方(底部抽屉里横排标签太挤),宽 / 中档沿用左标签\nconst narrowForm = useMediaQuery('(max-width: 640px)')\nconst formLayout = computed(() =>\n narrowForm.value\n ? { labelPlacement: 'top' as const, labelWidth: undefined }\n : { labelPlacement: 'left' as const, labelWidth: 80 },\n)\n\n// ── 主从选中态 + 下方字典项 ──\nconst selectedType = ref<SysDictType | null>(null)\nconst items = ref<SysDictItem[]>([])\nconst itemsLoading = ref(false)\n\nasync function loadItems() {\n const code = selectedType.value?.code\n if (!code) {\n items.value = []\n return\n }\n itemsLoading.value = true\n try {\n const list = await dictAdminApi.items(code)\n // 竞态守卫:await 期间用户可能已切换类型,过期响应不得覆盖当前选中项\n if (selectedType.value?.code === code) items.value = list\n } catch (e) {\n if (selectedType.value?.code === code) {\n message.error(translateError(e))\n items.value = []\n }\n } finally {\n if (selectedType.value?.code === code) itemsLoading.value = false\n }\n}\nasync function selectType(r: SysDictType) {\n selectedType.value = r\n await loadItems()\n}\n/** 点类型行 / 卡片:窄档同时拉起底部抽屉(此时下栏卡片不渲染)。 */\nfunction onTypeClick(r: SysDictType) {\n if (narrow.value) itemSheet.value = true\n return selectType(r)\n}\n\n// 批量删除:类型批删后清空选中类型 + 全量失效下拉缓存;项批删后仅重载下栏 + 失效缓存。\nconst { checkedKeys: typeCheckedKeys, run: typeBatchDelete } = useBatchDelete({\n remove: dictAdminApi.typeBatchRemove,\n refresh: () => {\n selectedType.value = null\n items.value = []\n dictStore.invalidate()\n typeTableRef.value?.refresh()\n },\n successMsg: t('dict.typeDeleted'),\n})\nconst {\n checkedKeys: itemCheckedKeys,\n hasSelection: itemHasSelection,\n run: itemBatchDelete,\n} = useBatchDelete({\n remove: dictAdminApi.itemBatchRemove,\n refresh: () => {\n dictStore.invalidate()\n loadItems()\n },\n successMsg: t('dict.itemDeleted'),\n})\n\n// ── 上:字典类型 SmartTable ──\n// 窄栏同样用条件构造器(container: 'table'):容器宽小于 600 时 3.0 自动收成「输入框 + 筛选」,按名称过滤走列声明式 search。\nconst typeToInput = (r: SysDictType): DictTypeInput => ({\n code: r.code,\n name: r.name,\n sort: r.sort,\n enabled: r.enabled,\n remark: r.remark ?? '',\n})\nconst typeColumns: SmartTableColumn<SysDictType>[] = [\n { type: 'selection' },\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n key: 'code',\n title: () => t('dict.code'),\n render: r => h('span', { class: 'mono muted' }, r.code),\n },\n // 窄档卡片以类型名称作标题(默认取第一个数据列 = 编码,不如名称好认)\n {\n key: 'name',\n title: () => t('dict.name'),\n card: 'title',\n search: { actions: SEARCH_ACTIONS.fuzzy },\n },\n {\n key: 'sort',\n title: () => t('dict.sort'),\n width: 70,\n render: r => h('span', { class: 'num muted' }, r.sort),\n },\n {\n key: 'enabled',\n title: () => t('common.status'),\n width: 90,\n // 包一层 stopPropagation:开关点击不得冒泡到行 onClick(否则误切选中类型)\n render: r =>\n h('div', { onClick: (e: Event) => e.stopPropagation() }, [\n h(StatusSwitch, {\n value: r.enabled,\n request: (next: boolean) =>\n dictAdminApi.typeUpdate(r.id, { ...typeToInput(r), enabled: next }),\n 'onUpdate:value': (v: boolean) => {\n r.enabled = v\n dictStore.invalidate(r.code)\n },\n }),\n ]),\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 130,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n // stopPropagation:操作按钮点击不得冒泡到行 onClick(否则误切选中类型)\n render: r =>\n h(\n NSpace,\n { size: 2, justify: 'end', wrapItem: false, onClick: (e: Event) => e.stopPropagation() },\n () => [\n authStore.hasPerm('PUT:/api/v1/sys/dict/type/{id}')\n ? h(\n NButton,\n {\n size: 'small',\n quaternary: true,\n type: 'primary',\n onClick: () => openTypeEdit(r),\n },\n () => t('common.edit'),\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/dict/type/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => dictAdminApi.typeRemove(r.id), t('dict.typeDeleted')).then(ok => {\n if (!ok) return\n dictStore.invalidate(r.code)\n if (selectedType.value?.id === r.id) {\n selectedType.value = null\n items.value = []\n }\n typeTableRef.value?.refresh()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('dict.typeDeleteConfirm', { name: r.name }),\n },\n )\n : null,\n ],\n ),\n },\n]\nderiveHeaderFilters(typeColumns)\n\n// ── 类型 新增/编辑弹窗 ──\nconst typeShow = ref(false)\nconst typeFormRef = ref<FormInst | null>(null)\nconst typeEditingId = ref<number | null>(null)\nconst typeRules: FormRules = {\n code: {\n required: true,\n whitespace: true,\n message: () => t('dict.codeRequired'),\n trigger: ['input', 'blur'],\n },\n name: {\n required: true,\n whitespace: true,\n message: () => t('dict.nameRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst blankType = (): DictTypeInput => ({ code: '', name: '', sort: 0, enabled: true, remark: '' })\nconst typeForm = reactive<DictTypeInput>(blankType())\n\nfunction openTypeAdd() {\n typeEditingId.value = null\n Object.assign(typeForm, blankType())\n typeShow.value = true\n}\nfunction openTypeEdit(r: SysDictType) {\n typeEditingId.value = r.id\n Object.assign(typeForm, typeToInput(r))\n typeShow.value = true\n}\nasync function saveType() {\n await typeFormRef.value?.validate()\n try {\n if (typeEditingId.value === null) await dictAdminApi.typeAdd({ ...typeForm })\n else await dictAdminApi.typeUpdate(typeEditingId.value, { ...typeForm })\n dictStore.invalidate(typeForm.code)\n message.success(t('dict.typeSaved'))\n await typeTableRef.value?.refresh()\n // 若编辑的是当前选中类型,同步其名称/编码到下栏标题与后续项提交\n if (selectedType.value?.id === typeEditingId.value)\n Object.assign(selectedType.value, { name: typeForm.name })\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n\n// ── 下:字典项 表格 ──\nconst itemToInput = (r: SysDictItem): DictItemInput => ({\n dictTypeCode: r.dictTypeCode,\n label: r.label,\n value: r.value,\n sort: r.sort,\n enabled: r.enabled,\n})\n/** 字典项启停:悲观更新(StatusSwitch 请求成功才 emit);表格行与窄档抽屉卡片共用。 */\nconst itemEnabledRequest = (r: SysDictItem) => (next: boolean) =>\n dictAdminApi.itemUpdate(r.id, { ...itemToInput(r), enabled: next })\nfunction onItemEnabled(r: SysDictItem, v: boolean) {\n r.enabled = v\n dictStore.invalidate(r.dictTypeCode)\n}\n/** 字典项删除成功后失效缓存并重载下栏;表格行与窄档抽屉卡片共用。 */\nconst removeItem = (r: SysDictItem) =>\n run(() => dictAdminApi.itemRemove(r.id), t('dict.itemDeleted')).then(ok => {\n if (!ok) return\n dictStore.invalidate(r.dictTypeCode)\n loadItems()\n })\n// 字典项是静态数据(整类一次取回),条件搜索由 SmartTable 前端求值\nconst itemColumns: SmartTableColumn<SysDictItem>[] = [\n { type: 'selection' },\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n { title: () => t('dict.itemLabel'), key: 'label', card: 'title', search: {} },\n {\n title: () => t('dict.itemValue'),\n key: 'value',\n search: {},\n render: r => h('span', { class: 'mono muted' }, r.value),\n },\n {\n title: () => t('dict.sort'),\n key: 'sort',\n width: 70,\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 request: itemEnabledRequest(r),\n 'onUpdate:value': (v: boolean) => onItemEnabled(r, v),\n }),\n },\n {\n title: () => t('common.operation'),\n key: 'op',\n width: 130,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 2, justify: 'end', wrapItem: false }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/dict/item/{id}')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openItemEdit(r) },\n () => t('common.edit'),\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/dict/item/{id}')\n ? h(\n NPopconfirm,\n { onPositiveClick: () => removeItem(r) },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('dict.itemDeleteConfirm', { label: r.label }),\n },\n )\n : null,\n ]),\n },\n]\nderiveHeaderFilters(itemColumns)\n\n// ── 字典项 新增/编辑弹窗 ──\nconst itemShow = ref(false)\nconst itemFormRef = ref<FormInst | null>(null)\nconst itemEditingId = ref<number | null>(null)\nconst itemRules: FormRules = {\n label: {\n required: true,\n whitespace: true,\n message: () => t('dict.itemLabelRequired'),\n trigger: ['input', 'blur'],\n },\n value: {\n required: true,\n whitespace: true,\n message: () => t('dict.itemValueRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst blankItem = (): DictItemInput => ({\n dictTypeCode: '',\n label: '',\n value: '',\n sort: 0,\n enabled: true,\n})\nconst itemForm = reactive<DictItemInput>(blankItem())\n\nfunction openItemAdd() {\n if (!selectedType.value) return\n itemEditingId.value = null\n Object.assign(itemForm, blankItem(), { dictTypeCode: selectedType.value.code })\n itemShow.value = true\n}\nfunction openItemEdit(r: SysDictItem) {\n itemEditingId.value = r.id\n Object.assign(itemForm, itemToInput(r))\n itemShow.value = true\n}\nasync function saveItem() {\n await itemFormRef.value?.validate()\n try {\n if (itemEditingId.value === null) await dictAdminApi.itemAdd({ ...itemForm })\n else await dictAdminApi.itemUpdate(itemEditingId.value, { ...itemForm })\n dictStore.invalidate(itemForm.dictTypeCode)\n message.success(t('dict.itemSaved'))\n await loadItems()\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n</script>\n<template>\n <!-- 上下两栏、各吃一半 = styles/layout.css 的形状 5(.fill-split)套在整页外壳 .fill-page 里:\n 字典类型在上、字典项在下,宽度都是整行,类型表的条件搜索因此能排成单行三段式。\n 上栏的 SmartTable 自己就是一张卡片,直接作为 .fill-split 的子元素均分高度,外面不再套卡片(否则卡中卡);\n 下栏的字典项表同样是 SmartTable(静态数据模式),也直接作为 .fill-split 的子元素均分;\n 没选中类型时下栏是一张带提示的空卡片(挂 .fill-main 参与均分)。\n .fill-page--soft:矮屏让页面滚动,不把两张表压成一条缝。\n 窄档(外壳宽 < 600):类型表由库换成卡片列表(card-on-narrow),下栏卡片不渲染,\n 点卡片 = @row-click,从底部抽屉看字典项(抽屉里也是同一套列的 SmartTable 卡片列表,底部固定「批量删除 / 新增字典项」)。\n 工具栏里不放表名:选中的是哪个类型由类型表的行高亮表达,字典项表上方也不再写类型名。\n (注释里别写带尖括号的标签名:listSearch.spec.ts 的正则会把它当成一张表而误判。) -->\n <div ref=\"layoutRef\" class=\"dict-layout fill-page fill-page--soft fill-split\">\n <SmartTable\n :toolbar=\"TYPE_TOOLBAR\"\n ref=\"typeTableRef\"\n :columns=\"typeColumns\"\n :fetcher=\"dictAdminApi.typePage\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n :search=\"{ container: 'table' }\"\n storage-key=\"sys-dict-type\"\n :active-row-key=\"selectedType?.id ?? null\"\n :row-props=\"() => ({ style: 'cursor: pointer' })\"\n :checked-row-keys=\"typeCheckedKeys\"\n @row-click=\"(row: SysDictType) => onTypeClick(row)\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (typeCheckedKeys = keys)\"\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/dict/type'\" type=\"primary\" @click=\"openTypeAdd\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n </template>\n <!-- 勾选后工具栏换成批量栏(本页全选 + 已选 N 项 + 这里的按钮 + 取消选择),按钮出现即代表有勾选 -->\n <template #batch>\n <n-button\n v-auth=\"'POST:/api/v1/sys/dict/type/batch-delete'\"\n secondary\n type=\"error\"\n @click=\"typeBatchDelete\"\n >\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('common.batchDelete') }}\n </n-button>\n </template>\n </SmartTable>\n\n <SmartTable\n v-if=\"!narrow && selectedType\"\n :columns=\"itemColumns\"\n :data=\"items\"\n row-key=\"id\"\n :loading=\"itemsLoading\"\n :toolbar=\"TYPE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n :checked-row-keys=\"itemCheckedKeys\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n storage-key=\"sys-dict-item\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (itemCheckedKeys = keys)\"\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/dict/item'\" type=\"primary\" @click=\"openItemAdd\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('dict.addItem') }}\n </n-button>\n </template>\n <template #batch>\n <n-button\n v-auth=\"'POST:/api/v1/sys/dict/item/batch-delete'\"\n secondary\n type=\"error\"\n @click=\"itemBatchDelete\"\n >\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('common.batchDelete') }}\n </n-button>\n </template>\n </SmartTable>\n <n-card v-else-if=\"!narrow\" class=\"dict-pane fill-main\" :bordered=\"true\">\n <n-empty :description=\"t('dict.selectTypeHint')\" style=\"padding: 48px 0; margin: auto\" />\n </n-card>\n </div>\n\n <!-- 窄档:字典项底部抽屉。卡片里的开关 / 勾选 / 编辑 / 删除与宽档表格行是同一套请求与权限 -->\n <n-drawer\n :show=\"itemSheet && narrow && !!selectedType\"\n placement=\"bottom\"\n height=\"85vh\"\n style=\"border-radius: 16px 16px 0 0\"\n @update:show=\"(v: boolean) => (itemSheet = v)\"\n >\n <n-drawer-content\n :title=\"\n selectedType ? t('dict.itemsOf', { name: selectedType.name }) : t('dict.itemsSheetTitle')\n \"\n closable\n >\n <SmartTable\n :columns=\"itemColumns\"\n :data=\"items\"\n row-key=\"id\"\n :loading=\"itemsLoading\"\n :toolbar=\"TYPE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n :checked-row-keys=\"itemCheckedKeys\"\n card-on-narrow\n storage-key=\"sys-dict-item-sheet\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (itemCheckedKeys = keys)\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n </SmartTable>\n <template #footer>\n <div class=\"sheet-foot\">\n <n-button\n v-auth=\"'POST:/api/v1/sys/dict/item/batch-delete'\"\n secondary\n type=\"error\"\n size=\"large\"\n :disabled=\"!itemHasSelection\"\n @click=\"itemBatchDelete\"\n >\n {{ t('common.batchDelete') }}\n </n-button>\n <n-button\n v-auth=\"'POST:/api/v1/sys/dict/item'\"\n type=\"primary\"\n size=\"large\"\n @click=\"openItemAdd\"\n >\n {{ t('dict.addItem') }}\n </n-button>\n </div>\n </template>\n </n-drawer-content>\n </n-drawer>\n\n <FormContainer\n v-model:show=\"typeShow\"\n :title=\"typeEditingId === null ? t('dict.addTypeTitle') : t('dict.editTypeTitle')\"\n :width=\"480\"\n :on-confirm=\"saveType\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form\n ref=\"typeFormRef\"\n :model=\"typeForm\"\n :rules=\"typeRules\"\n require-mark-placement=\"left\"\n v-bind=\"formLayout\"\n >\n <n-form-item :label=\"t('dict.code')\" path=\"code\">\n <n-input\n v-model:value=\"typeForm.code\"\n class=\"mono\"\n :placeholder=\"t('dict.code')\"\n :disabled=\"typeEditingId !== null\"\n />\n <!-- 反馈槽只在编辑时有内容;新增时槽为空,校验提示照常显示 -->\n <template #feedback>\n <span v-if=\"typeEditingId !== null\" class=\"field-hint\">\n {{ t('dict.codeImmutable') }}\n </span>\n </template>\n </n-form-item>\n <n-form-item :label=\"t('dict.name')\" path=\"name\">\n <n-input v-model:value=\"typeForm.name\" :placeholder=\"t('dict.name')\" />\n </n-form-item>\n <n-form-item :label=\"t('dict.sort')\">\n <n-input-number v-model:value=\"typeForm.sort\" :min=\"0\" style=\"width: 160px\" />\n </n-form-item>\n <n-form-item :label=\"t('dict.remark')\">\n <n-input\n v-model:value=\"typeForm.remark as string\"\n type=\"textarea\"\n :autosize=\"{ minRows: 2 }\"\n />\n </n-form-item>\n <n-form-item :label=\"t('common.status')\">\n <n-switch v-model:value=\"typeForm.enabled\" />\n </n-form-item>\n </n-form>\n </FormContainer>\n\n <FormContainer\n v-model:show=\"itemShow\"\n :title=\"itemEditingId === null ? t('dict.addItemTitle') : t('dict.editItemTitle')\"\n :width=\"480\"\n :on-confirm=\"saveItem\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form\n ref=\"itemFormRef\"\n :model=\"itemForm\"\n :rules=\"itemRules\"\n require-mark-placement=\"left\"\n v-bind=\"formLayout\"\n >\n <n-form-item :label=\"t('dict.itemLabel')\" path=\"label\">\n <n-input v-model:value=\"itemForm.label\" :placeholder=\"t('dict.itemLabel')\" />\n </n-form-item>\n <n-form-item :label=\"t('dict.itemValue')\" path=\"value\">\n <n-input v-model:value=\"itemForm.value\" class=\"mono\" :placeholder=\"t('dict.itemValue')\" />\n </n-form-item>\n <n-form-item :label=\"t('dict.sort')\">\n <n-input-number v-model:value=\"itemForm.sort\" :min=\"0\" style=\"width: 160px\" />\n </n-form-item>\n <n-form-item :label=\"t('common.status')\">\n <n-switch v-model:value=\"itemForm.enabled\" />\n </n-form-item>\n </n-form>\n </FormContainer>\n</template>\n\n<style scoped>\n/* 上下均分、整屏高度都在 styles/layout.css(.fill-page / .fill-split),这里只给每栏一个最小高度:\n 矮屏时整页滚动,而不是把表压扁。 */\n.dict-layout > :deep(.smart-table),\n.dict-pane {\n min-width: 0;\n min-height: 280px;\n}\n\n/* 单元格里的辅助字样:编码 / 值用等宽,序号 / 排序用等宽数字。\n 表格单元格由库与 naive 渲染,要 :deep 才够得着;抽屉卡片是自己的元素,直接命中。 */\n.mono,\n:deep(.mono) {\n font-family: var(--font-mono);\n font-size: 13.5px;\n letter-spacing: 0;\n}\n.muted,\n:deep(.muted) {\n color: var(--text-2);\n}\n.faint,\n:deep(.faint) {\n color: var(--text-3);\n}\n.num,\n:deep(.num) {\n font-variant-numeric: tabular-nums;\n}\n\n.sheet-foot {\n display: flex;\n gap: 10px;\n width: 100%;\n}\n.sheet-foot .n-button {\n flex: 1;\n}\n\n/* 表单里的字段提示(编码创建后不可改) */\n.field-hint {\n font-size: 13px;\n color: var(--text-3);\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","dictStore","useDictStore","typeTableRef","ref","TYPE_TOOLBAR","TABLE_TOOLBAR","layoutRef","layoutWidth","useElementSize","narrow","computed","itemSheet","narrowForm","useMediaQuery","formLayout","selectedType","items","itemsLoading","loadItems","code","_a","list","dictAdminApi","_b","e","_c","translateError","_d","selectType","r","onTypeClick","typeCheckedKeys","typeBatchDelete","useBatchDelete","itemCheckedKeys","itemHasSelection","itemBatchDelete","typeToInput","typeColumns","h","SEARCH_ACTIONS","StatusSwitch","next","v","NSpace","NButton","openTypeEdit","NPopconfirm","ok","deriveHeaderFilters","typeShow","typeFormRef","typeEditingId","typeRules","blankType","typeForm","reactive","openTypeAdd","saveType","itemToInput","itemEnabledRequest","onItemEnabled","removeItem","itemColumns","openItemEdit","itemShow","itemFormRef","itemEditingId","itemRules","blankItem","itemForm","openItemAdd","saveItem","_createElementVNode","_createVNode","_unref","SmartTable","TABLE_MIN_ROW_HEIGHT","_cache","row","keys","_withCtx","itemCount","TableTotal","_createBlock","AppIcon","_createTextVNode","NCard","NEmpty","NDrawer","NDrawerContent","_hoisted_1","FormContainer","$event","_mergeProps","NFormItem","_createElementBlock","_hoisted_2","_toDisplayString","NInput","NInputNumber","NSwitch"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/dict/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 字典管理 = 主从:上=类型 SmartTable(CRUD),点击行选中 → 下=该类型的字典项(同样是 SmartTable,静态数据模式 + CRUD)。\n// 关键约束:下方走管理端 dict/item/page(含停用项、带 id);下拉用的 dict/items/{code} 只回启用项且丢 id,不能复用。\n// 任何类型/项的增删改后调 useDictStore().invalidate(code) 失效下拉缓存,变更即时生效。\nimport { computed, h, reactive, ref } from 'vue'\nimport {\n NButton,\n NCard,\n NDrawer,\n NDrawerContent,\n NSpace,\n NInput,\n NInputNumber,\n NPopconfirm,\n NForm,\n NFormItem,\n NEmpty,\n NSwitch,\n useMessage,\n type FormInst,\n type FormRules,\n} from 'naive-ui'\nimport { useElementSize, useMediaQuery } from '@vueuse/core'\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 { useBatchDelete } from '#/composables/useBatchDelete'\nimport { dictAdminApi } from '#/api'\nimport { useAuthStore } from '#/stores/auth'\nimport { useDictStore } from '#/stores/dict'\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 { DictItemInput, DictTypeInput, SysDictItem, SysDictType } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\nconst dictStore = useDictStore()\nconst typeTableRef = ref<SmartTableInst<SysDictType>>()\n\n// 本页不开「放大」:上下两栏各自定高、表体内部滚动,放大层会把主从关系拆散。\nconst TYPE_TOOLBAR = { ...TABLE_TOOLBAR, maximize: false }\n\n// ── 窄档:类型表换成卡片列表,字典项不内联,点卡片从底部抽屉看 ──\n// 阈值与 smart-naive-table 的 card-on-narrow 一致(根节点宽 < 600);页面外壳宽 = 类型表根节点宽。\n// 首帧量到 0 不算窄档,免得宽屏刷新时闪一下卡片。\nconst layoutRef = ref<HTMLElement>()\nconst { width: layoutWidth } = useElementSize(layoutRef)\nconst narrow = computed(() => layoutWidth.value > 0 && layoutWidth.value < 600)\nconst itemSheet = ref(false)\n\n// 表单:窄屏标签放上方(底部抽屉里横排标签太挤),宽 / 中档沿用左标签\nconst narrowForm = useMediaQuery('(max-width: 640px)')\nconst formLayout = computed(() =>\n narrowForm.value\n ? { labelPlacement: 'top' as const, labelWidth: undefined }\n : { labelPlacement: 'left' as const, labelWidth: 80 },\n)\n\n// ── 主从选中态 + 下方字典项 ──\nconst selectedType = ref<SysDictType | null>(null)\nconst items = ref<SysDictItem[]>([])\nconst itemsLoading = ref(false)\n\nasync function loadItems() {\n const code = selectedType.value?.code\n if (!code) {\n items.value = []\n return\n }\n itemsLoading.value = true\n try {\n const list = await dictAdminApi.items(code)\n // 竞态守卫:await 期间用户可能已切换类型,过期响应不得覆盖当前选中项\n if (selectedType.value?.code === code) items.value = list\n } catch (e) {\n if (selectedType.value?.code === code) {\n message.error(translateError(e))\n items.value = []\n }\n } finally {\n if (selectedType.value?.code === code) itemsLoading.value = false\n }\n}\nasync function selectType(r: SysDictType) {\n selectedType.value = r\n await loadItems()\n}\n/** 点类型行 / 卡片:窄档同时拉起底部抽屉(此时下栏卡片不渲染)。 */\nfunction onTypeClick(r: SysDictType) {\n if (narrow.value) itemSheet.value = true\n return selectType(r)\n}\n\n// 批量删除:类型批删后清空选中类型 + 全量失效下拉缓存;项批删后仅重载下栏 + 失效缓存。\nconst { checkedKeys: typeCheckedKeys, run: typeBatchDelete } = useBatchDelete({\n remove: dictAdminApi.typeBatchRemove,\n refresh: () => {\n selectedType.value = null\n items.value = []\n dictStore.invalidate()\n typeTableRef.value?.refresh()\n },\n successMsg: t('dict.typeDeleted'),\n})\nconst {\n checkedKeys: itemCheckedKeys,\n hasSelection: itemHasSelection,\n run: itemBatchDelete,\n} = useBatchDelete({\n remove: dictAdminApi.itemBatchRemove,\n refresh: () => {\n dictStore.invalidate()\n loadItems()\n },\n successMsg: t('dict.itemDeleted'),\n})\n\n// ── 上:字典类型 SmartTable ──\n// 窄栏同样用条件构造器(container: 'table'):容器宽小于 600 时 3.0 自动收成「输入框 + 筛选」,按名称过滤走列声明式 search。\nconst typeToInput = (r: SysDictType): DictTypeInput => ({\n code: r.code,\n name: r.name,\n sort: r.sort,\n enabled: r.enabled,\n remark: r.remark ?? '',\n})\nconst typeColumns: SmartTableColumn<SysDictType>[] = [\n { type: 'selection' },\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n key: 'code',\n width: 180,\n ellipsis: { tooltip: true },\n title: () => t('dict.code'),\n render: r => h('span', { class: 'mono muted' }, r.code),\n },\n // 窄档卡片以类型名称作标题(默认取第一个数据列 = 编码,不如名称好认)\n {\n key: 'name',\n ellipsis: { tooltip: true },\n title: () => t('dict.name'),\n card: 'title',\n search: { actions: SEARCH_ACTIONS.fuzzy },\n },\n {\n key: 'sort',\n title: () => t('dict.sort'),\n width: 70,\n render: r => h('span', { class: 'num muted' }, r.sort),\n },\n {\n key: 'enabled',\n title: () => t('common.status'),\n width: 90,\n // 包一层 stopPropagation:开关点击不得冒泡到行 onClick(否则误切选中类型)\n render: r =>\n h('div', { onClick: (e: Event) => e.stopPropagation() }, [\n h(StatusSwitch, {\n value: r.enabled,\n request: (next: boolean) =>\n dictAdminApi.typeUpdate(r.id, { ...typeToInput(r), enabled: next }),\n 'onUpdate:value': (v: boolean) => {\n r.enabled = v\n dictStore.invalidate(r.code)\n },\n }),\n ]),\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 130,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n // stopPropagation:操作按钮点击不得冒泡到行 onClick(否则误切选中类型)\n render: r =>\n h(\n NSpace,\n { size: 2, justify: 'end', wrapItem: false, onClick: (e: Event) => e.stopPropagation() },\n () => [\n authStore.hasPerm('PUT:/api/v1/sys/dict/type/{id}')\n ? h(\n NButton,\n {\n size: 'small',\n quaternary: true,\n type: 'primary',\n onClick: () => openTypeEdit(r),\n },\n () => t('common.edit'),\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/dict/type/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => dictAdminApi.typeRemove(r.id), t('dict.typeDeleted')).then(ok => {\n if (!ok) return\n dictStore.invalidate(r.code)\n if (selectedType.value?.id === r.id) {\n selectedType.value = null\n items.value = []\n }\n typeTableRef.value?.refresh()\n }),\n },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('dict.typeDeleteConfirm', { name: r.name }),\n },\n )\n : null,\n ],\n ),\n },\n]\nderiveHeaderFilters(typeColumns)\n\n// ── 类型 新增/编辑弹窗 ──\nconst typeShow = ref(false)\nconst typeFormRef = ref<FormInst | null>(null)\nconst typeEditingId = ref<number | null>(null)\nconst typeRules: FormRules = {\n code: {\n required: true,\n whitespace: true,\n message: () => t('dict.codeRequired'),\n trigger: ['input', 'blur'],\n },\n name: {\n required: true,\n whitespace: true,\n message: () => t('dict.nameRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst blankType = (): DictTypeInput => ({ code: '', name: '', sort: 0, enabled: true, remark: '' })\nconst typeForm = reactive<DictTypeInput>(blankType())\n\nfunction openTypeAdd() {\n typeEditingId.value = null\n Object.assign(typeForm, blankType())\n typeShow.value = true\n}\nfunction openTypeEdit(r: SysDictType) {\n typeEditingId.value = r.id\n Object.assign(typeForm, typeToInput(r))\n typeShow.value = true\n}\nasync function saveType() {\n await typeFormRef.value?.validate()\n try {\n if (typeEditingId.value === null) await dictAdminApi.typeAdd({ ...typeForm })\n else await dictAdminApi.typeUpdate(typeEditingId.value, { ...typeForm })\n dictStore.invalidate(typeForm.code)\n message.success(t('dict.typeSaved'))\n await typeTableRef.value?.refresh()\n // 若编辑的是当前选中类型,同步其名称/编码到下栏标题与后续项提交\n if (selectedType.value?.id === typeEditingId.value)\n Object.assign(selectedType.value, { name: typeForm.name })\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n\n// ── 下:字典项 表格 ──\nconst itemToInput = (r: SysDictItem): DictItemInput => ({\n dictTypeCode: r.dictTypeCode,\n label: r.label,\n value: r.value,\n sort: r.sort,\n enabled: r.enabled,\n})\n/** 字典项启停:悲观更新(StatusSwitch 请求成功才 emit);表格行与窄档抽屉卡片共用。 */\nconst itemEnabledRequest = (r: SysDictItem) => (next: boolean) =>\n dictAdminApi.itemUpdate(r.id, { ...itemToInput(r), enabled: next })\nfunction onItemEnabled(r: SysDictItem, v: boolean) {\n r.enabled = v\n dictStore.invalidate(r.dictTypeCode)\n}\n/** 字典项删除成功后失效缓存并重载下栏;表格行与窄档抽屉卡片共用。 */\nconst removeItem = (r: SysDictItem) =>\n run(() => dictAdminApi.itemRemove(r.id), t('dict.itemDeleted')).then(ok => {\n if (!ok) return\n dictStore.invalidate(r.dictTypeCode)\n loadItems()\n })\n// 字典项是静态数据(整类一次取回),条件搜索由 SmartTable 前端求值\nconst itemColumns: SmartTableColumn<SysDictItem>[] = [\n { type: 'selection' },\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n title: () => t('dict.itemLabel'),\n key: 'label',\n ellipsis: { tooltip: true },\n card: 'title',\n search: {},\n },\n {\n title: () => t('dict.itemValue'),\n key: 'value',\n width: 160,\n ellipsis: { tooltip: true },\n search: {},\n render: r => h('span', { class: 'mono muted' }, r.value),\n },\n {\n title: () => t('dict.sort'),\n key: 'sort',\n width: 70,\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 request: itemEnabledRequest(r),\n 'onUpdate:value': (v: boolean) => onItemEnabled(r, v),\n }),\n },\n {\n title: () => t('common.operation'),\n key: 'op',\n width: 130,\n align: 'right',\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 2, justify: 'end', wrapItem: false }, () => [\n authStore.hasPerm('PUT:/api/v1/sys/dict/item/{id}')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => openItemEdit(r) },\n () => t('common.edit'),\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/dict/item/{id}')\n ? h(\n NPopconfirm,\n { onPositiveClick: () => removeItem(r) },\n {\n trigger: () =>\n h(NButton, { size: 'small', quaternary: true, type: 'error' }, () =>\n t('common.delete'),\n ),\n default: () => t('dict.itemDeleteConfirm', { label: r.label }),\n },\n )\n : null,\n ]),\n },\n]\nderiveHeaderFilters(itemColumns)\n\n// ── 字典项 新增/编辑弹窗 ──\nconst itemShow = ref(false)\nconst itemFormRef = ref<FormInst | null>(null)\nconst itemEditingId = ref<number | null>(null)\nconst itemRules: FormRules = {\n label: {\n required: true,\n whitespace: true,\n message: () => t('dict.itemLabelRequired'),\n trigger: ['input', 'blur'],\n },\n value: {\n required: true,\n whitespace: true,\n message: () => t('dict.itemValueRequired'),\n trigger: ['input', 'blur'],\n },\n}\nconst blankItem = (): DictItemInput => ({\n dictTypeCode: '',\n label: '',\n value: '',\n sort: 0,\n enabled: true,\n})\nconst itemForm = reactive<DictItemInput>(blankItem())\n\nfunction openItemAdd() {\n if (!selectedType.value) return\n itemEditingId.value = null\n Object.assign(itemForm, blankItem(), { dictTypeCode: selectedType.value.code })\n itemShow.value = true\n}\nfunction openItemEdit(r: SysDictItem) {\n itemEditingId.value = r.id\n Object.assign(itemForm, itemToInput(r))\n itemShow.value = true\n}\nasync function saveItem() {\n await itemFormRef.value?.validate()\n try {\n if (itemEditingId.value === null) await dictAdminApi.itemAdd({ ...itemForm })\n else await dictAdminApi.itemUpdate(itemEditingId.value, { ...itemForm })\n dictStore.invalidate(itemForm.dictTypeCode)\n message.success(t('dict.itemSaved'))\n await loadItems()\n } catch (e) {\n message.error(translateError(e))\n return false\n }\n}\n</script>\n<template>\n <!-- 上下两栏、各吃一半 = styles/layout.css 的形状 5(.fill-split)套在整页外壳 .fill-page 里:\n 字典类型在上、字典项在下,宽度都是整行,类型表的条件搜索因此能排成单行三段式。\n 上栏的 SmartTable 自己就是一张卡片,直接作为 .fill-split 的子元素均分高度,外面不再套卡片(否则卡中卡);\n 下栏的字典项表同样是 SmartTable(静态数据模式),也直接作为 .fill-split 的子元素均分;\n 没选中类型时下栏是一张带提示的空卡片(挂 .fill-main 参与均分)。\n .fill-page--soft:矮屏让页面滚动,不把两张表压成一条缝。\n 窄档(外壳宽 < 600):类型表由库换成卡片列表(card-on-narrow),下栏卡片不渲染,\n 点卡片 = @row-click,从底部抽屉看字典项(抽屉里也是同一套列的 SmartTable 卡片列表,底部固定「批量删除 / 新增字典项」)。\n 工具栏里不放表名:选中的是哪个类型由类型表的行高亮表达,字典项表上方也不再写类型名。\n (注释里别写带尖括号的标签名:listSearch.spec.ts 的正则会把它当成一张表而误判。) -->\n <div ref=\"layoutRef\" class=\"dict-layout fill-page fill-page--soft fill-split\">\n <SmartTable\n :toolbar=\"TYPE_TOOLBAR\"\n ref=\"typeTableRef\"\n :columns=\"typeColumns\"\n :fetcher=\"dictAdminApi.typePage\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n :search=\"{ container: 'table' }\"\n storage-key=\"sys-dict-type\"\n :active-row-key=\"selectedType?.id ?? null\"\n :row-props=\"() => ({ style: 'cursor: pointer' })\"\n :checked-row-keys=\"typeCheckedKeys\"\n @row-click=\"(row: SysDictType) => onTypeClick(row)\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (typeCheckedKeys = keys)\"\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/dict/type'\" type=\"primary\" @click=\"openTypeAdd\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('common.add') }}\n </n-button>\n </template>\n <!-- 勾选后工具栏换成批量栏(本页全选 + 已选 N 项 + 这里的按钮 + 取消选择),按钮出现即代表有勾选 -->\n <template #batch>\n <n-button\n v-auth=\"'POST:/api/v1/sys/dict/type/batch-delete'\"\n secondary\n type=\"error\"\n @click=\"typeBatchDelete\"\n >\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('common.batchDelete') }}\n </n-button>\n </template>\n </SmartTable>\n\n <SmartTable\n v-if=\"!narrow && selectedType\"\n :columns=\"itemColumns\"\n :data=\"items\"\n row-key=\"id\"\n :loading=\"itemsLoading\"\n :toolbar=\"TYPE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n :checked-row-keys=\"itemCheckedKeys\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n storage-key=\"sys-dict-item\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (itemCheckedKeys = keys)\"\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/dict/item'\" type=\"primary\" @click=\"openItemAdd\">\n <template #icon><AppIcon icon=\"ph:plus\" :size=\"16\" /></template>\n {{ t('dict.addItem') }}\n </n-button>\n </template>\n <template #batch>\n <n-button\n v-auth=\"'POST:/api/v1/sys/dict/item/batch-delete'\"\n secondary\n type=\"error\"\n @click=\"itemBatchDelete\"\n >\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('common.batchDelete') }}\n </n-button>\n </template>\n </SmartTable>\n <n-card v-else-if=\"!narrow\" class=\"dict-pane fill-main\" :bordered=\"true\">\n <n-empty :description=\"t('dict.selectTypeHint')\" style=\"padding: 48px 0; margin: auto\" />\n </n-card>\n </div>\n\n <!-- 窄档:字典项底部抽屉。卡片里的开关 / 勾选 / 编辑 / 删除与宽档表格行是同一套请求与权限 -->\n <n-drawer\n :show=\"itemSheet && narrow && !!selectedType\"\n placement=\"bottom\"\n height=\"85vh\"\n style=\"border-radius: 16px 16px 0 0\"\n @update:show=\"(v: boolean) => (itemSheet = v)\"\n >\n <n-drawer-content\n :title=\"\n selectedType ? t('dict.itemsOf', { name: selectedType.name }) : t('dict.itemsSheetTitle')\n \"\n closable\n >\n <SmartTable\n :columns=\"itemColumns\"\n :data=\"items\"\n row-key=\"id\"\n :loading=\"itemsLoading\"\n :toolbar=\"TYPE_TOOLBAR\"\n :search=\"{ container: 'table' }\"\n :checked-row-keys=\"itemCheckedKeys\"\n card-on-narrow\n storage-key=\"sys-dict-item-sheet\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (itemCheckedKeys = keys)\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n </SmartTable>\n <template #footer>\n <div class=\"sheet-foot\">\n <n-button\n v-auth=\"'POST:/api/v1/sys/dict/item/batch-delete'\"\n secondary\n type=\"error\"\n size=\"large\"\n :disabled=\"!itemHasSelection\"\n @click=\"itemBatchDelete\"\n >\n {{ t('common.batchDelete') }}\n </n-button>\n <n-button\n v-auth=\"'POST:/api/v1/sys/dict/item'\"\n type=\"primary\"\n size=\"large\"\n @click=\"openItemAdd\"\n >\n {{ t('dict.addItem') }}\n </n-button>\n </div>\n </template>\n </n-drawer-content>\n </n-drawer>\n\n <FormContainer\n v-model:show=\"typeShow\"\n :title=\"typeEditingId === null ? t('dict.addTypeTitle') : t('dict.editTypeTitle')\"\n :width=\"480\"\n :on-confirm=\"saveType\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form\n ref=\"typeFormRef\"\n :model=\"typeForm\"\n :rules=\"typeRules\"\n require-mark-placement=\"left\"\n v-bind=\"formLayout\"\n >\n <n-form-item :label=\"t('dict.code')\" path=\"code\">\n <n-input\n v-model:value=\"typeForm.code\"\n class=\"mono\"\n :placeholder=\"t('dict.code')\"\n :disabled=\"typeEditingId !== null\"\n />\n <!-- 反馈槽只在编辑时有内容;新增时槽为空,校验提示照常显示 -->\n <template #feedback>\n <span v-if=\"typeEditingId !== null\" class=\"field-hint\">\n {{ t('dict.codeImmutable') }}\n </span>\n </template>\n </n-form-item>\n <n-form-item :label=\"t('dict.name')\" path=\"name\">\n <n-input v-model:value=\"typeForm.name\" :placeholder=\"t('dict.name')\" />\n </n-form-item>\n <n-form-item :label=\"t('dict.sort')\">\n <n-input-number v-model:value=\"typeForm.sort\" :min=\"0\" style=\"width: 160px\" />\n </n-form-item>\n <n-form-item :label=\"t('dict.remark')\">\n <n-input\n v-model:value=\"typeForm.remark as string\"\n type=\"textarea\"\n :autosize=\"{ minRows: 2 }\"\n />\n </n-form-item>\n <n-form-item :label=\"t('common.status')\">\n <n-switch v-model:value=\"typeForm.enabled\" />\n </n-form-item>\n </n-form>\n </FormContainer>\n\n <FormContainer\n v-model:show=\"itemShow\"\n :title=\"itemEditingId === null ? t('dict.addItemTitle') : t('dict.editItemTitle')\"\n :width=\"480\"\n :on-confirm=\"saveItem\"\n :confirm-text=\"t('common.save')\"\n >\n <n-form\n ref=\"itemFormRef\"\n :model=\"itemForm\"\n :rules=\"itemRules\"\n require-mark-placement=\"left\"\n v-bind=\"formLayout\"\n >\n <n-form-item :label=\"t('dict.itemLabel')\" path=\"label\">\n <n-input v-model:value=\"itemForm.label\" :placeholder=\"t('dict.itemLabel')\" />\n </n-form-item>\n <n-form-item :label=\"t('dict.itemValue')\" path=\"value\">\n <n-input v-model:value=\"itemForm.value\" class=\"mono\" :placeholder=\"t('dict.itemValue')\" />\n </n-form-item>\n <n-form-item :label=\"t('dict.sort')\">\n <n-input-number v-model:value=\"itemForm.sort\" :min=\"0\" style=\"width: 160px\" />\n </n-form-item>\n <n-form-item :label=\"t('common.status')\">\n <n-switch v-model:value=\"itemForm.enabled\" />\n </n-form-item>\n </n-form>\n </FormContainer>\n</template>\n\n<style scoped>\n/* 上下均分、整屏高度都在 styles/layout.css(.fill-page / .fill-split),这里只给每栏一个最小高度:\n 矮屏时整页滚动,而不是把表压扁。 */\n.dict-layout > :deep(.smart-table),\n.dict-pane {\n min-width: 0;\n min-height: 280px;\n}\n\n/* 单元格里的辅助字样:编码 / 值用等宽,序号 / 排序用等宽数字。\n 表格单元格由库与 naive 渲染,要 :deep 才够得着;抽屉卡片是自己的元素,直接命中。 */\n.mono,\n:deep(.mono) {\n font-family: var(--font-mono);\n font-size: 13.5px;\n letter-spacing: 0;\n}\n.muted,\n:deep(.muted) {\n color: var(--text-2);\n}\n.faint,\n:deep(.faint) {\n color: var(--text-3);\n}\n.num,\n:deep(.num) {\n font-variant-numeric: tabular-nums;\n}\n\n.sheet-foot {\n display: flex;\n gap: 10px;\n width: 100%;\n}\n.sheet-foot .n-button {\n flex: 1;\n}\n\n/* 表单里的字段提示(编码创建后不可改) */\n.field-hint {\n font-size: 13px;\n color: var(--text-3);\n}\n</style>\n"],"names":["t","useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","dictStore","useDictStore","typeTableRef","ref","TYPE_TOOLBAR","TABLE_TOOLBAR","layoutRef","layoutWidth","useElementSize","narrow","computed","itemSheet","narrowForm","useMediaQuery","formLayout","selectedType","items","itemsLoading","loadItems","code","_a","list","dictAdminApi","_b","e","_c","translateError","_d","selectType","r","onTypeClick","typeCheckedKeys","typeBatchDelete","useBatchDelete","itemCheckedKeys","itemHasSelection","itemBatchDelete","typeToInput","typeColumns","h","SEARCH_ACTIONS","StatusSwitch","next","v","NSpace","NButton","openTypeEdit","NPopconfirm","ok","deriveHeaderFilters","typeShow","typeFormRef","typeEditingId","typeRules","blankType","typeForm","reactive","openTypeAdd","saveType","itemToInput","itemEnabledRequest","onItemEnabled","removeItem","itemColumns","openItemEdit","itemShow","itemFormRef","itemEditingId","itemRules","blankItem","itemForm","openItemAdd","saveItem","_createElementVNode","_createVNode","_unref","SmartTable","TABLE_MIN_ROW_HEIGHT","_cache","row","keys","_withCtx","itemCount","TableTotal","_createBlock","AppIcon","_createTextVNode","NCard","NEmpty","NDrawer","NDrawerContent","_hoisted_1","FormContainer","$event","_mergeProps","NFormItem","_createElementBlock","_hoisted_2","_toDisplayString","NInput","NInputNumber","NSwitch"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/file/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 文件管理 = 只读 SmartTable(搜索 originalName→FileName)+ 工具栏 FileUpload 触发器 + 行内下载/删除。\n// 下载走 blob(Bearer 自动带)→ createObjectURL + <a download> + revoke;删除走 useConfirm。\nimport { h, ref } from 'vue'\nimport { NButton, NSpace, NPopconfirm, useMessage } 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 FileUpload from '#/components/FileUpload/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useBatchDelete } from '#/composables/useBatchDelete'\nimport { useAuthStore } from '#/stores/auth'\nimport { fileApi } from '#/api'\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 { fmtBytes, fmtDateTime } from '#/utils/format'\nimport type { SysFile } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\nconst tableRef = ref<SmartTableInst<SysFile>>()\nconst { checkedKeys, run: batchDelete } = useBatchDelete({\n remove: fileApi.batchRemove,\n refresh: () => tableRef.value?.refresh(),\n successMsg: t('file.deleted'),\n})\n\nfunction onUploaded() {\n message.success(t('file.uploaded'))\n tableRef.value?.refresh()\n}\n\nasync function download(r: SysFile) {\n try {\n const blob = await fileApi.download(r.id)\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = r.originalName\n document.body.appendChild(a)\n a.click()\n a.remove()\n URL.revokeObjectURL(url)\n } catch (e) {\n message.error(translateError(e))\n }\n}\n\nconst columns: SmartTableColumn<SysFile>[] = [\n { type: 'selection' },\n\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n key: 'originalName',\n title: () => t('file.name'),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n ellipsis: { tooltip: true },\n },\n {\n key: 'extension',\n title: () => t('file.extension'),\n width: 90,\n render: r => (r.extension ? h('span', { class: 'mono muted' }, r.extension) : '—'),\n },\n {\n key: 'sizeBytes',\n title: () => t('file.size'),\n width: 110,\n render: r => h('span', { class: 'num' }, fmtBytes(r.sizeBytes)),\n },\n {\n key: 'contentType',\n title: () => t('file.contentType'),\n ellipsis: { tooltip: true },\n render: r => h('span', { class: 'muted' }, r.contentType || '—'),\n },\n {\n key: 'createTime',\n title: () => t('file.uploadTime'),\n render: r =>\n h('span', { class: 'num muted', style: 'white-space: nowrap' }, fmtDateTime(r.createTime)),\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 140,\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 4, wrapItem: false }, () => [\n authStore.hasPerm('GET:/api/v1/sys/file/{id}/download')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => download(r) },\n {\n default: () => t('file.download'),\n icon: () => h(AppIcon, { icon: 'ph:download-simple', size: 15 }),\n },\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/file/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => fileApi.remove(r.id), t('file.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('file.deleteConfirm', { name: r.originalName }),\n },\n )\n : null,\n ]),\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <SmartTable\n :toolbar=\"TABLE_TOOLBAR\"\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"fileApi.page\"\n :search=\"{ container: 'table' }\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-file\"\n :checked-row-keys=\"checkedKeys\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (checkedKeys = keys)\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n <template #toolbar-right>\n <FileUpload\n v-auth=\"'POST:/api/v1/sys/file/upload'\"\n :show-file-list=\"false\"\n @uploaded=\"onUploaded\"\n >\n <n-button type=\"primary\">\n <template #icon><AppIcon icon=\"ph:upload-simple\" :size=\"16\" /></template>\n {{ t('file.upload') }}\n </n-button>\n </FileUpload>\n <FileUpload\n v-auth=\"'POST:/api/v1/sys/file/chunk/init'\"\n chunked\n :show-file-list=\"false\"\n @uploaded=\"onUploaded\"\n >\n <n-button secondary>\n <template #icon><AppIcon icon=\"ph:stack\" :size=\"16\" /></template>\n {{ t('file.uploadChunked') }}\n </n-button>\n </FileUpload>\n </template>\n <!-- 勾选后工具栏换成批量栏(本页全选 + 已选 N 项 + 这里的按钮 + 取消选择),按钮出现即代表有勾选 -->\n <template #batch>\n <n-button\n v-auth=\"'POST:/api/v1/sys/file/batch-delete'\"\n secondary\n type=\"error\"\n @click=\"batchDelete\"\n >\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('common.batchDelete') }}\n </n-button>\n </template>\n </SmartTable>\n</template>\n"],"names":["useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","tableRef","ref","checkedKeys","batchDelete","useBatchDelete","fileApi","_a","onUploaded","download","r","blob","url","a","e","translateError","columns","SEARCH_ACTIONS","h","fmtBytes","fmtDateTime","NSpace","NButton","AppIcon","NPopconfirm","ok","deriveHeaderFilters","_createBlock","_unref","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_cache","keys","_withCtx","itemCount","_createVNode","TableTotal","FileUpload","_createTextVNode"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index2.vue.js","sources":["../../../../src/views/system/file/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 文件管理 = 只读 SmartTable(搜索 originalName→FileName)+ 工具栏 FileUpload 触发器 + 行内下载/删除。\n// 下载走 blob(Bearer 自动带)→ createObjectURL + <a download> + revoke;删除走 useConfirm。\nimport { h, ref } from 'vue'\nimport { NButton, NSpace, NPopconfirm, useMessage } 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 FileUpload from '#/components/FileUpload/index.vue'\nimport { useConfirm } from '#/composables/useConfirm'\nimport { useBatchDelete } from '#/composables/useBatchDelete'\nimport { useAuthStore } from '#/stores/auth'\nimport { fileApi } from '#/api'\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 { fmtBytes, fmtDateTime } from '#/utils/format'\nimport type { SysFile } from '#/types/api'\n\nconst { t } = useI18n()\nconst message = useMessage()\nconst { run } = useConfirm()\nconst authStore = useAuthStore()\nconst tableRef = ref<SmartTableInst<SysFile>>()\nconst { checkedKeys, run: batchDelete } = useBatchDelete({\n remove: fileApi.batchRemove,\n refresh: () => tableRef.value?.refresh(),\n successMsg: t('file.deleted'),\n})\n\nfunction onUploaded() {\n message.success(t('file.uploaded'))\n tableRef.value?.refresh()\n}\n\nasync function download(r: SysFile) {\n try {\n const blob = await fileApi.download(r.id)\n const url = URL.createObjectURL(blob)\n const a = document.createElement('a')\n a.href = url\n a.download = r.originalName\n document.body.appendChild(a)\n a.click()\n a.remove()\n URL.revokeObjectURL(url)\n } catch (e) {\n message.error(translateError(e))\n }\n}\n\nconst columns: SmartTableColumn<SysFile>[] = [\n { type: 'selection' },\n\n { type: 'index', title: () => t('common.rowNo'), width: 64, align: 'center' },\n {\n key: 'originalName',\n title: () => t('file.name'),\n search: { actions: SEARCH_ACTIONS.fuzzy },\n ellipsis: { tooltip: true },\n },\n {\n key: 'extension',\n title: () => t('file.extension'),\n width: 90,\n render: r => (r.extension ? h('span', { class: 'mono muted' }, r.extension) : '—'),\n },\n {\n key: 'sizeBytes',\n title: () => t('file.size'),\n width: 110,\n render: r => h('span', { class: 'num' }, fmtBytes(r.sizeBytes)),\n },\n {\n key: 'contentType',\n title: () => t('file.contentType'),\n ellipsis: { tooltip: true },\n render: r => h('span', { class: 'muted' }, r.contentType || '—'),\n },\n {\n key: 'createTime',\n width: 170,\n title: () => t('file.uploadTime'),\n render: r =>\n h('span', { class: 'num muted', style: 'white-space: nowrap' }, fmtDateTime(r.createTime)),\n },\n {\n key: 'op',\n title: () => t('common.operation'),\n width: 140,\n fixed: 'right',\n hideInSetting: true,\n render: r =>\n h(NSpace, { size: 4, wrapItem: false }, () => [\n authStore.hasPerm('GET:/api/v1/sys/file/{id}/download')\n ? h(\n NButton,\n { size: 'small', quaternary: true, type: 'primary', onClick: () => download(r) },\n {\n default: () => t('file.download'),\n icon: () => h(AppIcon, { icon: 'ph:download-simple', size: 15 }),\n },\n )\n : null,\n authStore.hasPerm('DELETE:/api/v1/sys/file/{id}')\n ? h(\n NPopconfirm,\n {\n onPositiveClick: () =>\n run(() => fileApi.remove(r.id), t('file.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('file.deleteConfirm', { name: r.originalName }),\n },\n )\n : null,\n ]),\n },\n]\nderiveHeaderFilters(columns)\n</script>\n\n<template>\n <SmartTable\n :toolbar=\"TABLE_TOOLBAR\"\n ref=\"tableRef\"\n :columns=\"columns\"\n :fetcher=\"fileApi.page\"\n :search=\"{ container: 'table' }\"\n fill-height\n :min-row-height=\"TABLE_MIN_ROW_HEIGHT\"\n card-on-narrow\n storage-key=\"sys-file\"\n :checked-row-keys=\"checkedKeys\"\n @update:checked-row-keys=\"(keys: (string | number)[]) => (checkedKeys = keys)\"\n @error=\"e => message.error(translateError(e))\"\n >\n <template #pagination-prefix=\"{ itemCount }\">\n <TableTotal :count=\"itemCount\" />\n </template>\n <template #toolbar-right>\n <FileUpload\n v-auth=\"'POST:/api/v1/sys/file/upload'\"\n :show-file-list=\"false\"\n @uploaded=\"onUploaded\"\n >\n <n-button type=\"primary\">\n <template #icon><AppIcon icon=\"ph:upload-simple\" :size=\"16\" /></template>\n {{ t('file.upload') }}\n </n-button>\n </FileUpload>\n <FileUpload\n v-auth=\"'POST:/api/v1/sys/file/chunk/init'\"\n chunked\n :show-file-list=\"false\"\n @uploaded=\"onUploaded\"\n >\n <n-button secondary>\n <template #icon><AppIcon icon=\"ph:stack\" :size=\"16\" /></template>\n {{ t('file.uploadChunked') }}\n </n-button>\n </FileUpload>\n </template>\n <!-- 勾选后工具栏换成批量栏(本页全选 + 已选 N 项 + 这里的按钮 + 取消选择),按钮出现即代表有勾选 -->\n <template #batch>\n <n-button\n v-auth=\"'POST:/api/v1/sys/file/batch-delete'\"\n secondary\n type=\"error\"\n @click=\"batchDelete\"\n >\n <template #icon><AppIcon icon=\"ph:trash\" :size=\"16\" /></template>\n {{ t('common.batchDelete') }}\n </n-button>\n </template>\n </SmartTable>\n</template>\n"],"names":["useI18n","message","useMessage","run","useConfirm","authStore","useAuthStore","tableRef","ref","checkedKeys","batchDelete","useBatchDelete","fileApi","_a","onUploaded","download","r","blob","url","a","e","translateError","columns","SEARCH_ACTIONS","h","fmtBytes","fmtDateTime","NSpace","NButton","AppIcon","NPopconfirm","ok","deriveHeaderFilters","_createBlock","_unref","SmartTable","TABLE_TOOLBAR","TABLE_MIN_ROW_HEIGHT","_cache","keys","_withCtx","itemCount","_createVNode","TableTotal","FileUpload","_createTextVNode"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import o from "./index2.vue.js";
|
|
2
2
|
/* empty css */
|
|
3
|
-
import
|
|
4
|
-
const
|
|
3
|
+
import a from "../../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
+
const m = /* @__PURE__ */ a(o, [["__scopeId", "data-v-7af9adaf"]]);
|
|
5
5
|
export {
|
|
6
|
-
|
|
6
|
+
m as default
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=index.vue.js.map
|