smart-admin-web 10.20.1 → 10.21.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/index.js +248 -246
- package/dist/lib/runtime.js +1 -1
- package/dist/lib/watermark.d.ts +1 -1
- package/dist/locales/en-US.d.ts +62 -3
- package/dist/locales/en-US.js +65 -6
- 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 +62 -3
- package/dist/locales/zh-CN.js +65 -6
- 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/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 +1 -1
- package/dist/views/login/components/LoginDesk2.vue.js +59 -47
- package/dist/views/login/components/LoginDesk2.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/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 +2 -2
- package/dist/views/system/menu/index2.vue.js +11 -11
- 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 +70 -67
- 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 +250 -207
- package/dist/views/system/user/index2.vue.js.map +1 -1
- package/package.json +3 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.vue.js","sources":["../../../src/components/FormContainer/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 弹窗/抽屉二合一表单容器:消化 CRUD 页「saving ref + 手写 footer + n-modal 包装」样板。\n// 形态默认跟随全局偏好(app.formStyle,外观设置里切,默认弹窗),variant 按实例覆盖。\n// 抽屉形态按壳层档位走:宽 / 中档 = 右侧抽屉,窄档(< 600)= 底部抽屉,高 92%,\n// 底栏两个按钮等分整行。弹窗形态不分档,仍是居中卡片。\n// onConfirm 协议:返回 Promise → 确认钮自动 loading;reject 或 resolve(false) → 不关闭\n// (n-form 校验放 onConfirm 首行,失败 reject 即挡住关闭);其余情况自动关。\nimport { computed, onDeactivated, ref } from 'vue'\nimport { NModal, NDrawer, NDrawerContent, NButton, NSpace } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { useWindowSize } from '@vueuse/core'\nimport { useCompactScreen } from '#/composables/useCompactScreen'\nimport { useShellBreakpoint } from '#/composables/useShellBreakpoint'\nimport { useAppStore, type FormStyle } from '#/stores/app'\n\nconst show = defineModel<boolean>('show', { default: false })\n\nconst props = defineProps<{\n title: string\n /** 不传 → 跟随 app.formStyle 全局偏好 */\n variant?: FormStyle\n /** modal=卡片宽 / drawer=抽屉宽,实际生效 min(width, 90vw) */\n width?: number\n /** 见顶部协议注释;不传则确认钮直接关闭 */\n onConfirm?: () => unknown | Promise<unknown>\n confirmText?: string\n cancelText?: string\n /** 默认 false:表单防误触丢输入 */\n maskClosable?: boolean\n /**\n * 铺满视口。默认 `false` —— 不给 `'auto'` 当默认值是刻意的:没传这个 prop 的既有页面\n * 不该因为换了台平板就换一种形态。字段多的表单显式传 `true`,想跟着屏幕走再传 `'auto'`\n * (紧凑屏判定见 composables/useCompactScreen)。\n */\n fullscreen?: boolean | 'auto'\n}>()\n\nconst { t } = useI18n()\nconst app = useAppStore()\n\nconst mode = computed(() => props.variant ?? app.formStyle)\nconst loading = ref(false)\n// 窄屏不溢出:同 SettingsDrawer 惯例,宽度取 min(width, 90vw)。\nconst { width: winW } = useWindowSize()\nconst compact = useCompactScreen()\nconst fullscreen = computed(() =>\n props.fullscreen === 'auto' ? compact.value : props.fullscreen === true,\n)\n// 窄档抽屉改底部抽屉。全屏表单(fullscreen)本就铺满视口,不叠底部抽屉形态。\nconst { bp } = useShellBreakpoint()\nconst sheet = computed(() => mode.value === 'drawer' && bp.value === 'narrow' && !fullscreen.value)\nconst btnSize = computed(() => (sheet.value ? 'large' : 'medium'))\nconst w = computed(() =>\n fullscreen.value ? winW.value : Math.min(props.width ?? 560, Math.round(winW.value * 0.9)),\n)\n// 全屏时不再钉宽度,交给 .smart-form--fullscreen 那条全局样式铺满。\nconst modalStyle = computed(() => (fullscreen.value ? undefined : { width: `${w.value}px` }))\n// 提交中禁止任何途径关闭(esc/遮罩/关闭钮/取消钮),防提交中途关闭导致状态错乱。\nconst canClose = computed(() => !loading.value)\nconst maskClose = computed(() => (props.maskClosable ?? false) && !loading.value)\n\nasync function handleConfirm() {\n if (!props.onConfirm) {\n show.value = false\n return\n }\n loading.value = true\n try {\n if ((await props.onConfirm()) !== false) show.value = false\n } catch {\n // 静默:n-form 校验失败已有内联提示;API 错误 toast 由业务 onConfirm 内负责。\n } finally {\n loading.value = false\n }\n}\n\n// keep-alive 页签切走时,teleport 到 body 的弹层会残留可见 → 强制收起。\nonDeactivated(() => {\n show.value = false\n})\n</script>\n\n<template>\n <n-modal\n v-if=\"mode === 'modal'\"\n v-model:show=\"show\"\n preset=\"card\"\n :title=\"title\"\n :closable=\"canClose\"\n :close-on-esc=\"canClose\"\n :mask-closable=\"maskClose\"\n :class=\"{ 'smart-form--fullscreen': fullscreen }\"\n :style=\"modalStyle\"\n >\n <template v-if=\"$slots['header-extra']\" #header-extra>\n <slot name=\"header-extra\" />\n </template>\n <slot />\n <template #footer>\n <slot name=\"footer\">\n <n-space justify=\"end\">\n <n-button secondary :disabled=\"loading\" @click=\"show = false\">\n {{ cancelText ?? t('common.cancel') }}\n </n-button>\n <n-button type=\"primary\" :loading=\"loading\" @click=\"handleConfirm\">\n {{ confirmText ?? t('common.confirm') }}\n </n-button>\n </n-space>\n </slot>\n </template>\n </n-modal>\n\n <n-drawer\n v-else\n v-model:show=\"show\"\n :placement=\"sheet ? 'bottom' : 'right'\"\n :width=\"sheet ? undefined : w\"\n :height=\"sheet ? '92%' : undefined\"\n :class=\"{ 'smart-form-sheet': sheet }\"\n :close-on-esc=\"canClose\"\n :mask-closable=\"maskClose\"\n >\n <n-drawer-content :title=\"title\" :closable=\"canClose\" :native-scrollbar=\"false\">\n <!-- n-drawer-content 无 header-extra 原生槽:业务传了才自拼 #header(标题 + 附加区并排) -->\n <template v-if=\"$slots['header-extra']\" #header>\n <span>{{ title }}</span>\n <slot name=\"header-extra\" />\n </template>\n <slot />\n <template #footer>\n <slot name=\"footer\">\n <!-- 窄档底部抽屉:两个按钮等分整行、大号 -->\n <div v-if=\"sheet\" class=\"smart-form-foot\">\n <n-button secondary :size=\"btnSize\" :disabled=\"loading\" @click=\"show = false\">\n {{ cancelText ?? t('common.cancel') }}\n </n-button>\n <n-button type=\"primary\" :size=\"btnSize\" :loading=\"loading\" @click=\"handleConfirm\">\n {{ confirmText ?? t('common.confirm') }}\n </n-button>\n </div>\n <n-space v-else justify=\"end\">\n <n-button secondary :disabled=\"loading\" @click=\"show = false\">\n {{ cancelText ?? t('common.cancel') }}\n </n-button>\n <n-button type=\"primary\" :loading=\"loading\" @click=\"handleConfirm\">\n {{ confirmText ?? t('common.confirm') }}\n </n-button>\n </n-space>\n </slot>\n </template>\n </n-drawer-content>\n </n-drawer>\n</template>\n\n<!-- 不能加 scoped:n-modal / n-drawer 的内容 teleport 到 body,scoped 编译出的 data-v 属性到不了那棵子树,\n 写了等于没写(这正是\"全屏样式不生效\"最常见的原因)。故用带前缀的类名自行隔离。 -->\n<style>\n.smart-form--fullscreen {\n width: 100vw;\n max-width: 100vw;\n height: 100dvh;\n max-height: 100dvh;\n display: flex;\n flex-direction: column;\n border-radius: 0;\n}\n/* 头/脚按内容高,正文吃满剩余并自己滚 —— 否则长表单会把整张卡撑出视口,底部按钮点不到。 */\n.smart-form--fullscreen > .n-card__content {\n flex: 1;\n min-height: 0;\n overflow: auto;\n}\n/* 窄档底部抽屉:圆角只在上沿;按钮等分整行。\n 高度用 92% 而不是随内容:表单长短不一,固定高度让不同表单的抽屉一致,正文自己滚。 */\n.n-drawer.smart-form-sheet {\n border-radius: var(--radius-xl) var(--radius-xl) 0 0;\n}\n.smart-form-foot {\n display: flex;\n gap: 10px;\n width: 100%;\n}\n.smart-form-foot > .n-button {\n flex: 1;\n}\n</style>\n"],"names":["show","_useModel","__props","props","t","useI18n","app","useAppStore","mode","computed","loading","ref","winW","useWindowSize","compact","useCompactScreen","fullscreen","bp","useShellBreakpoint","sheet","btnSize","w","modalStyle","canClose","maskClose","handleConfirm","onDeactivated","_createBlock","_unref","NModal","$event","_renderSlot","_ctx","_createVNode","NSpace","NButton","_createTextVNode","_toDisplayString","$slots","NDrawer","NDrawerContent","_openBlock","_createElementBlock","_hoisted_1","_createElementVNode"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAeA,UAAMA,IAAOC,EAAoBC,GAAC,MAA0B,GAEtDC,IAAQD,GAoBR,EAAE,GAAAE,EAAA,IAAMC,EAAA,GACRC,IAAMC,EAAA,GAENC,IAAOC,EAAS,MAAMN,EAAM,WAAWG,EAAI,SAAS,GACpDI,IAAUC,EAAI,EAAK,GAEnB,EAAE,OAAOC,EAAA,IAASC,EAAA,GAClBC,IAAUC,EAAA,GACVC,IAAaP;AAAA,MAAS,MAC1BN,EAAM,eAAe,SAASW,EAAQ,QAAQX,EAAM,eAAe;AAAA,IAAA,GAG/D,EAAE,IAAAc,EAAA,IAAOC,EAAA,GACTC,IAAQV,EAAS,MAAMD,EAAK,UAAU,YAAYS,EAAG,UAAU,YAAY,CAACD,EAAW,KAAK,GAC5FI,IAAUX,EAAS,MAAOU,EAAM,QAAQ,UAAU,QAAS,GAC3DE,IAAIZ;AAAA,MAAS,MACjBO,EAAW,QAAQJ,EAAK,QAAQ,KAAK,IAAIT,EAAM,SAAS,KAAK,KAAK,MAAMS,EAAK,QAAQ,GAAG,CAAC;AAAA,IAAA,GAGrFU,IAAab,EAAS,MAAOO,EAAW,QAAQ,SAAY,EAAE,OAAO,GAAGK,EAAE,KAAK,KAAA,CAAO,GAEtFE,IAAWd,EAAS,MAAM,CAACC,EAAQ,KAAK,GACxCc,IAAYf,EAAS,OAAON,EAAM,gBAAgB,OAAU,CAACO,EAAQ,KAAK;AAEhF,mBAAee,IAAgB;AAC7B,UAAI,CAACtB,EAAM,WAAW;AACpB,QAAAH,EAAK,QAAQ;AACb;AAAA,MACF;AACA,MAAAU,EAAQ,QAAQ;AAChB,UAAI;AACF,QAAK,MAAMP,EAAM,UAAA,MAAiB,SAAY,QAAQ;AAAA,MACxD,QAAQ;AAAA,MAER,UAAA;AACE,QAAAO,EAAQ,QAAQ;AAAA,MAClB;AAAA,IACF;AAGA,WAAAgB,EAAc,MAAM;AAClB,MAAA1B,EAAK,QAAQ;AAAA,IACf,CAAC,aAKSQ,EAAA,UAAI,gBADZmB,EA2BUC,EAAAC,CAAA,GAAA;AAAA;MAzBA,MAAM7B,EAAA;AAAA,8CAAAA,EAAI,QAAA8B;AAAA,MAClB,QAAO;AAAA,MACN,OAAO5B,EAAA;AAAA,MACP,UAAUqB,EAAA;AAAA,MACV,gBAAcA,EAAA;AAAA,MACd,iBAAeC,EAAA;AAAA,MACf,qCAAmCR,EAAA,OAAU;AAAA,MAC7C,SAAOM,EAAA,KAAU;AAAA,IAAA;MAMP,UACT,MASO;AAAA,QATPS,EASOC,wBATP,MASO;AAAA,UARLC,EAOUL,EAAAM,CAAA,GAAA,EAPD,SAAQ,SAAK;AAAA,uBACpB,MAEW;AAAA,cAFXD,EAEWL,EAAAO,CAAA,GAAA;AAAA,gBAFD,WAAA;AAAA,gBAAW,UAAUzB,EAAA;AAAA,gBAAU,gCAAOV,EAAA,QAAI;AAAA,cAAA;2BAClD,MAAsC;AAAA,kBAAnCoC,EAAAC,EAAAnC,EAAA,cAAc0B,EAAAxB,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;cAEpB6B,EAEWL,EAAAO,CAAA,GAAA;AAAA,gBAFD,MAAK;AAAA,gBAAW,SAASzB,EAAA;AAAA,gBAAU,SAAOe;AAAA,cAAA;2BAClD,MAAwC;AAAA,kBAArCW,EAAAC,EAAAnC,EAAA,eAAe0B,EAAAxB,CAAA,EAAC,gBAAA,CAAA,GAAA,CAAA;AAAA,gBAAA;;;;;;;;iBAR3B,MAAQ;AAAA,QAAR2B,EAAQC,EAAA,QAAA,SAAA;AAAA,MAAA;;;MAHQM,EAAAA,OAAM,cAAA;cAAmB;AAAA,cACvC,MAA4B;AAAA,UAA5BP,EAA4BC,EAAA,QAAA,cAAA;AAAA,QAAA;;;yGAiBhCL,EAuCWC,EAAAW,CAAA,GAAA;AAAA;MArCD,MAAMvC,EAAA;AAAA,8CAAAA,EAAI,QAAA8B;AAAA,MACjB,WAAWX,EAAA,QAAK,WAAA;AAAA,MAChB,OAAOA,EAAA,QAAQ,SAAYE,EAAA;AAAA,MAC3B,QAAQF,EAAA,QAAK,QAAW;AAAA,MACxB,+BAA6BA,EAAA,OAAK;AAAA,MAClC,gBAAcI,EAAA;AAAA,MACd,iBAAeC,EAAA;AAAA,IAAA;iBAEhB,MA4BmB;AAAA,QA5BnBS,EA4BmBL,EAAAY,CAAA,GAAA;AAAA,UA5BA,OAAOtC,EAAA;AAAA,UAAQ,UAAUqB,EAAA;AAAA,UAAW,oBAAkB;AAAA,QAAA;UAO5D,UACT,MAkBO;AAAA,YAlBPQ,EAkBOC,wBAlBP,MAkBO;AAAA,cAhBMb,EAAA,SAAXsB,EAAA,GAAAC,EAOM,OAPNC,GAOM;AAAA,gBANJV,EAEWL,EAAAO,CAAA,GAAA;AAAA,kBAFD,WAAA;AAAA,kBAAW,MAAMf,EAAA;AAAA,kBAAU,UAAUV,EAAA;AAAA,kBAAU,gCAAOV,EAAA,QAAI;AAAA,gBAAA;6BAClE,MAAsC;AAAA,oBAAnCoC,EAAAC,EAAAnC,EAAA,cAAc0B,EAAAxB,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;gBAEpB6B,EAEWL,EAAAO,CAAA,GAAA;AAAA,kBAFD,MAAK;AAAA,kBAAW,MAAMf,EAAA;AAAA,kBAAU,SAASV,EAAA;AAAA,kBAAU,SAAOe;AAAA,gBAAA;6BAClE,MAAwC;AAAA,oBAArCW,EAAAC,EAAAnC,EAAA,eAAe0B,EAAAxB,CAAA,EAAC,gBAAA,CAAA,GAAA,CAAA;AAAA,kBAAA;;;0BAGvBuB,EAOUC,EAAAM,CAAA,GAAA;AAAA;gBAPM,SAAQ;AAAA,cAAA;2BACtB,MAEW;AAAA,kBAFXD,EAEWL,EAAAO,CAAA,GAAA;AAAA,oBAFD,WAAA;AAAA,oBAAW,UAAUzB,EAAA;AAAA,oBAAU,gCAAOV,EAAA,QAAI;AAAA,kBAAA;+BAClD,MAAsC;AAAA,sBAAnCoC,EAAAC,EAAAnC,EAAA,cAAc0B,EAAAxB,CAAA,EAAC,eAAA,CAAA,GAAA,CAAA;AAAA,oBAAA;;;kBAEpB6B,EAEWL,EAAAO,CAAA,GAAA;AAAA,oBAFD,MAAK;AAAA,oBAAW,SAASzB,EAAA;AAAA,oBAAU,SAAOe;AAAA,kBAAA;+BAClD,MAAwC;AAAA,sBAArCW,EAAAC,EAAAnC,EAAA,eAAe0B,EAAAxB,CAAA,EAAC,gBAAA,CAAA,GAAA,CAAA;AAAA,oBAAA;;;;;;;;qBAjB3B,MAAQ;AAAA,YAAR2B,EAAQC,EAAA,QAAA,SAAA;AAAA,UAAA;;;UAJQM,EAAAA,OAAM,cAAA;kBAAmB;AAAA,kBACvC,MAAwB;AAAA,cAAxBM,EAAwB,gBAAf1C,EAAA,KAAK,GAAA,CAAA;AAAA,cACd6B,EAA4BC,EAAA,QAAA,cAAA;AAAA,YAAA;;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"index.vue.js","sources":["../../../src/components/FormContainer/index.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 弹窗/抽屉二合一表单容器:消化 CRUD 页「saving ref + 手写 footer + n-modal 包装」样板。\n// 形态默认跟随全局偏好(app.formStyle,外观设置里切,默认弹窗),variant 按实例覆盖。\n// 抽屉形态按壳层档位走:宽 / 中档 = 右侧抽屉,窄档(< 600)= 底部抽屉,高 92%,\n// 底栏两个按钮等分整行。弹窗形态不分档,仍是居中卡片。\n// onConfirm 协议:返回 Promise → 确认钮自动 loading;reject 或 resolve(false) → 不关闭\n// (n-form 校验放 onConfirm 首行,失败 reject 即挡住关闭);其余情况自动关。\n// 弹窗形态下,没提交成功(校验不过 / 业务拒绝)时卡片左右晃一下,像 macOS 拒绝输入的提示框,\n// 补足内联提示之外的就地反馈;抽屉与全屏形态不晃(整块贴边,位移会露出缝)。\nimport { computed, onDeactivated, ref } from 'vue'\nimport { NModal, NDrawer, NDrawerContent, NButton, NSpace } from 'naive-ui'\nimport { useI18n } from 'vue-i18n'\nimport { useWindowSize } from '@vueuse/core'\nimport { useCompactScreen } from '#/composables/useCompactScreen'\nimport { useShellBreakpoint } from '#/composables/useShellBreakpoint'\nimport { useAppStore, type FormStyle } from '#/stores/app'\nimport { shake } from '#/utils/shake'\n\nconst show = defineModel<boolean>('show', { default: false })\n\nconst props = defineProps<{\n title: string\n /** 不传 → 跟随 app.formStyle 全局偏好 */\n variant?: FormStyle\n /** modal=卡片宽 / drawer=抽屉宽,实际生效 min(width, 90vw) */\n width?: number\n /** 见顶部协议注释;不传则确认钮直接关闭 */\n onConfirm?: () => unknown | Promise<unknown>\n confirmText?: string\n cancelText?: string\n /** 默认 false:表单防误触丢输入 */\n maskClosable?: boolean\n /**\n * 铺满视口。默认 `false` —— 不给 `'auto'` 当默认值是刻意的:没传这个 prop 的既有页面\n * 不该因为换了台平板就换一种形态。字段多的表单显式传 `true`,想跟着屏幕走再传 `'auto'`\n * (紧凑屏判定见 composables/useCompactScreen)。\n */\n fullscreen?: boolean | 'auto'\n}>()\n\nconst { t } = useI18n()\nconst app = useAppStore()\n\nconst mode = computed(() => props.variant ?? app.formStyle)\nconst loading = ref(false)\n// 窄屏不溢出:同 SettingsDrawer 惯例,宽度取 min(width, 90vw)。\nconst { width: winW } = useWindowSize()\nconst compact = useCompactScreen()\nconst fullscreen = computed(() =>\n props.fullscreen === 'auto' ? compact.value : props.fullscreen === true,\n)\n// 窄档抽屉改底部抽屉。全屏表单(fullscreen)本就铺满视口,不叠底部抽屉形态。\nconst { bp } = useShellBreakpoint()\nconst sheet = computed(() => mode.value === 'drawer' && bp.value === 'narrow' && !fullscreen.value)\nconst btnSize = computed(() => (sheet.value ? 'large' : 'medium'))\nconst w = computed(() =>\n fullscreen.value ? winW.value : Math.min(props.width ?? 560, Math.round(winW.value * 0.9)),\n)\n// 全屏时不再钉宽度,交给 .smart-form--fullscreen 那条全局样式铺满。\nconst modalStyle = computed(() => (fullscreen.value ? undefined : { width: `${w.value}px` }))\n// 提交中禁止任何途径关闭(esc/遮罩/关闭钮/取消钮),防提交中途关闭导致状态错乱。\nconst canClose = computed(() => !loading.value)\nconst maskClose = computed(() => (props.maskClosable ?? false) && !loading.value)\n\n// 卡片 teleport 到 body,拿不到它的 ref;在正文里放一个不可见的锚点,从锚点向上找到所在的卡片。\nconst anchor = ref<HTMLElement>()\nfunction shakeCard() {\n if (mode.value !== 'modal' || fullscreen.value) return\n shake(anchor.value?.closest('.n-card.n-modal'))\n}\n\nasync function handleConfirm() {\n if (!props.onConfirm) {\n show.value = false\n return\n }\n loading.value = true\n try {\n if ((await props.onConfirm()) !== false) show.value = false\n else shakeCard()\n } catch {\n // 静默:n-form 校验失败已有内联提示;API 错误 toast 由业务 onConfirm 内负责。这里只补一下晃动。\n shakeCard()\n } finally {\n loading.value = false\n }\n}\n\n// keep-alive 页签切走时,teleport 到 body 的弹层会残留可见 → 强制收起。\nonDeactivated(() => {\n show.value = false\n})\n</script>\n\n<template>\n <n-modal\n v-if=\"mode === 'modal'\"\n v-model:show=\"show\"\n preset=\"card\"\n :title=\"title\"\n :closable=\"canClose\"\n :close-on-esc=\"canClose\"\n :mask-closable=\"maskClose\"\n :class=\"{ 'smart-form--fullscreen': fullscreen }\"\n :style=\"modalStyle\"\n >\n <template v-if=\"$slots['header-extra']\" #header-extra>\n <slot name=\"header-extra\" />\n </template>\n <i ref=\"anchor\" hidden aria-hidden=\"true\" />\n <slot />\n <template #footer>\n <slot name=\"footer\">\n <n-space justify=\"end\">\n <n-button secondary :disabled=\"loading\" @click=\"show = false\">\n {{ cancelText ?? t('common.cancel') }}\n </n-button>\n <n-button type=\"primary\" :loading=\"loading\" @click=\"handleConfirm\">\n {{ confirmText ?? t('common.confirm') }}\n </n-button>\n </n-space>\n </slot>\n </template>\n </n-modal>\n\n <n-drawer\n v-else\n v-model:show=\"show\"\n :placement=\"sheet ? 'bottom' : 'right'\"\n :width=\"sheet ? undefined : w\"\n :height=\"sheet ? '92%' : undefined\"\n :class=\"{ 'smart-form-sheet': sheet }\"\n :close-on-esc=\"canClose\"\n :mask-closable=\"maskClose\"\n >\n <n-drawer-content :title=\"title\" :closable=\"canClose\" :native-scrollbar=\"false\">\n <!-- n-drawer-content 无 header-extra 原生槽:业务传了才自拼 #header(标题 + 附加区并排) -->\n <template v-if=\"$slots['header-extra']\" #header>\n <span>{{ title }}</span>\n <slot name=\"header-extra\" />\n </template>\n <slot />\n <template #footer>\n <slot name=\"footer\">\n <!-- 窄档底部抽屉:两个按钮等分整行、大号 -->\n <div v-if=\"sheet\" class=\"smart-form-foot\">\n <n-button secondary :size=\"btnSize\" :disabled=\"loading\" @click=\"show = false\">\n {{ cancelText ?? t('common.cancel') }}\n </n-button>\n <n-button type=\"primary\" :size=\"btnSize\" :loading=\"loading\" @click=\"handleConfirm\">\n {{ confirmText ?? t('common.confirm') }}\n </n-button>\n </div>\n <n-space v-else justify=\"end\">\n <n-button secondary :disabled=\"loading\" @click=\"show = false\">\n {{ cancelText ?? t('common.cancel') }}\n </n-button>\n <n-button type=\"primary\" :loading=\"loading\" @click=\"handleConfirm\">\n {{ confirmText ?? t('common.confirm') }}\n </n-button>\n </n-space>\n </slot>\n </template>\n </n-drawer-content>\n </n-drawer>\n</template>\n\n<!-- 不能加 scoped:n-modal / n-drawer 的内容 teleport 到 body,scoped 编译出的 data-v 属性到不了那棵子树,\n 写了等于没写(这正是\"全屏样式不生效\"最常见的原因)。故用带前缀的类名自行隔离。 -->\n<style>\n.smart-form--fullscreen {\n width: 100vw;\n max-width: 100vw;\n height: 100dvh;\n max-height: 100dvh;\n display: flex;\n flex-direction: column;\n border-radius: 0;\n}\n/* 头/脚按内容高,正文吃满剩余并自己滚 —— 否则长表单会把整张卡撑出视口,底部按钮点不到。 */\n.smart-form--fullscreen > .n-card__content {\n flex: 1;\n min-height: 0;\n overflow: auto;\n}\n/* 窄档底部抽屉:圆角只在上沿;按钮等分整行。\n 高度用 92% 而不是随内容:表单长短不一,固定高度让不同表单的抽屉一致,正文自己滚。 */\n.n-drawer.smart-form-sheet {\n border-radius: var(--radius-xl) var(--radius-xl) 0 0;\n}\n.smart-form-foot {\n display: flex;\n gap: 10px;\n width: 100%;\n}\n.smart-form-foot > .n-button {\n flex: 1;\n}\n</style>\n"],"names":["show","_useModel","__props","props","t","useI18n","app","useAppStore","mode","computed","loading","ref","winW","useWindowSize","compact","useCompactScreen","fullscreen","bp","useShellBreakpoint","sheet","btnSize","w","modalStyle","canClose","maskClose","anchor","shakeCard","shake","_a","handleConfirm","onDeactivated","_createBlock","_unref","NModal","$event","_renderSlot","_ctx","_createVNode","NSpace","NButton","_createTextVNode","_toDisplayString","_createElementVNode","$slots","NDrawer","NDrawerContent","_openBlock","_createElementBlock","_hoisted_1"],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
type __VLS_Props = {
|
|
2
|
+
name?: string | null;
|
|
3
|
+
src?: string | null;
|
|
4
|
+
size: number;
|
|
5
|
+
};
|
|
6
|
+
declare const __VLS_export: import('vue').DefineComponent<__VLS_Props, {}, {}, {}, {}, import('vue').ComponentOptionsMixin, import('vue').ComponentOptionsMixin, {}, string, import('vue').PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {}, {}, {}, {}, string, import('vue').ComponentProvideOptions, false, {}, any>;
|
|
7
|
+
declare const _default: typeof __VLS_export;
|
|
8
|
+
export default _default;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserAvatar.vue.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { defineComponent as i, ref as u, watch as m, computed as o, openBlock as r, createElementBlock as a, normalizeStyle as p, Fragment as f, createTextVNode as v, toDisplayString as d } from "vue";
|
|
2
|
+
const x = ["src"], k = /* @__PURE__ */ i({
|
|
3
|
+
__name: "UserAvatar",
|
|
4
|
+
props: {
|
|
5
|
+
name: {},
|
|
6
|
+
src: {},
|
|
7
|
+
size: {}
|
|
8
|
+
},
|
|
9
|
+
setup(t) {
|
|
10
|
+
const e = t, s = u(!1);
|
|
11
|
+
m(
|
|
12
|
+
() => e.src,
|
|
13
|
+
() => s.value = !1
|
|
14
|
+
);
|
|
15
|
+
const l = o(() => (e.name || "?").slice(0, 1)), c = o(() => ({
|
|
16
|
+
width: `${e.size}px`,
|
|
17
|
+
height: `${e.size}px`,
|
|
18
|
+
fontSize: `${Math.round(e.size * 0.44)}px`
|
|
19
|
+
}));
|
|
20
|
+
return (y, n) => (r(), a("span", {
|
|
21
|
+
class: "user-avatar",
|
|
22
|
+
style: p(c.value)
|
|
23
|
+
}, [
|
|
24
|
+
t.src && !s.value ? (r(), a("img", {
|
|
25
|
+
key: 0,
|
|
26
|
+
src: t.src,
|
|
27
|
+
alt: "",
|
|
28
|
+
onError: n[0] || (n[0] = (z) => s.value = !0)
|
|
29
|
+
}, null, 40, x)) : (r(), a(f, { key: 1 }, [
|
|
30
|
+
v(d(l.value), 1)
|
|
31
|
+
], 64))
|
|
32
|
+
], 4));
|
|
33
|
+
}
|
|
34
|
+
});
|
|
35
|
+
export {
|
|
36
|
+
k as default
|
|
37
|
+
};
|
|
38
|
+
//# sourceMappingURL=UserAvatar2.vue.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"UserAvatar2.vue.js","sources":["../../../src/components/UserPicker/UserAvatar.vue"],"sourcesContent":["<script setup lang=\"ts\">\n// 选择器内部用的小头像:有头像用图,没有(或图挂了)回落姓名首字。\n// 不用 NAvatar:它的文字头像在挂载时量自身宽度来缩放文字,而「已选」页挂载时常处于 display:none\n// (窄档两页形态),量到 0,首字就被缩得变形。这里首字是纯 CSS 居中,不依赖测量。\nimport { computed, ref, watch } from 'vue'\n\nconst props = defineProps<{ name?: string | null; src?: string | null; size: number }>()\n\nconst broken = ref(false)\nwatch(\n () => props.src,\n () => (broken.value = false),\n)\n\nconst initial = computed(() => (props.name || '?').slice(0, 1))\nconst style = computed(() => ({\n width: `${props.size}px`,\n height: `${props.size}px`,\n fontSize: `${Math.round(props.size * 0.44)}px`,\n}))\n</script>\n\n<template>\n <span class=\"user-avatar\" :style=\"style\">\n <img v-if=\"src && !broken\" :src=\"src\" alt=\"\" @error=\"broken = true\" />\n <template v-else>{{ initial }}</template>\n </span>\n</template>\n\n<style scoped>\n.user-avatar {\n flex-shrink: 0;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n overflow: hidden;\n border-radius: 999px;\n background: var(--sel-halo);\n color: var(--sel-fg);\n font-weight: 600;\n line-height: 1;\n}\n.user-avatar img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n}\n</style>\n"],"names":["props","__props","broken","ref","watch","initial","computed","style","_createElementBlock","_Fragment"],"mappings":";;;;;;;;;AAMA,UAAMA,IAAQC,GAERC,IAASC,EAAI,EAAK;AACxB,IAAAC;AAAA,MACE,MAAMJ,EAAM;AAAA,MACZ,MAAOE,EAAO,QAAQ;AAAA,IAAA;AAGxB,UAAMG,IAAUC,EAAS,OAAON,EAAM,QAAQ,KAAK,MAAM,GAAG,CAAC,CAAC,GACxDO,IAAQD,EAAS,OAAO;AAAA,MAC5B,OAAO,GAAGN,EAAM,IAAI;AAAA,MACpB,QAAQ,GAAGA,EAAM,IAAI;AAAA,MACrB,UAAU,GAAG,KAAK,MAAMA,EAAM,OAAO,IAAI,CAAC;AAAA,IAAA,EAC1C;2BAIAQ,EAGO,QAAA;AAAA,MAHD,OAAM;AAAA,MAAe,SAAOD,EAAA,KAAK;AAAA,IAAA;MAC1BN,EAAA,QAAQC,EAAA,cAAnBM,EAAsE,OAAA;AAAA;QAA1C,KAAKP,EAAA;AAAA,QAAK,KAAI;AAAA,QAAI,gCAAOC,EAAA,QAAM;AAAA,MAAA,yBAC3DM,EAAyCC,GAAA,EAAA,KAAA,KAAA;AAAA,YAArBJ,EAAA,KAAO,GAAA,CAAA;AAAA,MAAA;;;;"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import o from "./index2.vue.js";
|
|
2
2
|
/* empty css */
|
|
3
3
|
import r from "../../_virtual/_plugin-vue_export-helper.js";
|
|
4
|
-
const m = /* @__PURE__ */ r(o, [["__scopeId", "data-v-
|
|
4
|
+
const m = /* @__PURE__ */ r(o, [["__scopeId", "data-v-4f437906"]]);
|
|
5
5
|
export {
|
|
6
6
|
m as default
|
|
7
7
|
};
|