vome-core 0.0.20 → 0.0.22
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/admin/config/plugin-dev.js +1 -1
- package/dist/admin/crud/components/vm-audio.vue +217 -0
- package/dist/admin/crud/components/vm-column-custom.vue +50 -56
- package/dist/admin/crud/components/vm-file-preview.vue +90 -0
- package/dist/admin/crud/components/vm-image.vue +197 -0
- package/dist/admin/crud/components/vm-preview-viewer.vue +524 -0
- package/dist/admin/crud/components/vm-richtext.vue +275 -0
- package/dist/admin/crud/components/vm-upload-item.vue +92 -31
- package/dist/admin/crud/components/vm-upload.vue +2 -6
- package/dist/admin/crud/components/vm-user-select.vue +48 -49
- package/dist/admin/crud/config.js +1 -1
- package/dist/admin/crud/confirm.js +1 -1
- package/dist/admin/crud/dict.js +1 -1
- package/dist/admin/crud/index.d.ts +5 -3
- package/dist/admin/crud/index.js +1 -1
- package/dist/admin/crud/key.js +1 -1
- package/dist/admin/crud/mitt.js +1 -1
- package/dist/admin/crud/plugins.js +1 -1
- package/dist/admin/crud/span.js +1 -1
- package/dist/admin/crud/style.js +1 -1
- package/dist/admin/crud/validate.js +1 -1
- package/dist/admin/crud/vm-adv-search.vue +39 -32
- package/dist/admin/crud/vm-crud.vue +3 -8
- package/dist/admin/crud/{vm-flex1.vue → vm-flex.vue} +3 -3
- package/dist/admin/crud/vm-upsert.vue +9 -92
- package/dist/admin/directives/perm.js +1 -1
- package/dist/admin/hooks/useUpload.js +1 -1
- package/dist/admin/lib/browser.js +1 -1
- package/dist/admin/lib/cn.js +1 -1
- package/dist/admin/lib/dialog-float.d.ts +2 -0
- package/dist/admin/lib/dialog-float.js +1 -1
- package/dist/admin/lib/export-excel.js +1 -1
- package/dist/admin/lib/file-preview.d.ts +11 -0
- package/dist/admin/lib/file-preview.js +1 -0
- package/dist/admin/lib/menu.js +1 -1
- package/dist/admin/lib/tree.js +1 -1
- package/dist/admin/lib/upload.js +1 -1
- package/dist/admin/lib/video-frame.d.ts +9 -0
- package/dist/admin/lib/video-frame.js +1 -0
- package/dist/admin/styles/base.css +100 -0
- package/dist/index.js +1 -1
- package/dist/server/index.js +1 -1
- package/dist/shared/excel.js +1 -1
- package/dist/shared/index.js +1 -1
- package/dist/shared/tree.js +1 -1
- package/package.json +1 -1
- package/typings/admin/comm/crud.d.ts +2 -2
- package/typings/admin/comm/crud.ts +2 -3
- package/dist/admin/crud/components/vm-file-icon.vue +0 -55
- package/dist/admin/crud/vm-dialog.vue +0 -235
- package/dist/admin/static/fileicon/demo.css +0 -539
- package/dist/admin/static/fileicon/demo_index.html +0 -901
- package/dist/admin/static/fileicon/iconfont.css +0 -139
- package/dist/admin/static/fileicon/iconfont.js +0 -1
- package/dist/admin/static/fileicon/iconfont.json +0 -226
- package/dist/admin/static/fileicon/iconfont.ttf +0 -0
- package/dist/admin/static/fileicon/iconfont.woff +0 -0
- package/dist/admin/static/fileicon/iconfont.woff2 +0 -0
package/dist/shared/excel.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(
|
|
1
|
+
(function(_0x260f02,_0x4eb8e3){const _0x257f87=_0xd213,_0x3d8644=_0x260f02();while(!![]){try{const _0x3b2aae=parseInt(_0x257f87(0x99))/0x1*(-parseInt(_0x257f87(0x94))/0x2)+-parseInt(_0x257f87(0xa7))/0x3+parseInt(_0x257f87(0x98))/0x4+parseInt(_0x257f87(0xa0))/0x5+-parseInt(_0x257f87(0xa3))/0x6+parseInt(_0x257f87(0xa4))/0x7*(parseInt(_0x257f87(0x93))/0x8)+-parseInt(_0x257f87(0x9b))/0x9*(-parseInt(_0x257f87(0x9d))/0xa);if(_0x3b2aae===_0x4eb8e3)break;else _0x3d8644['push'](_0x3d8644['shift']());}catch(_0x5c1b45){_0x3d8644['push'](_0x3d8644['shift']());}}}(_0x166d,0x5d95e));import*as _0x38b4c9 from'xlsx';function _0x166d(){const _0x3c8465=['mta5mdK0mvLtzhDcsq','DxrPBhm','mtzJu2TRsKy','mtrYtLvVz0K','u2HLzxqX','D3jPDgu','yxjYyxK','mtmYote0ogr6zuPUua','nde0mdzMrwTMwui','yM9VA19HChbLBMrFC2HLzxq','ndvpz09bugC','lNHSC3G','ntqZodyWuvHQvKjK','BwfW','zw5KC1DPDgG','mJeZmZuWnvDoDunbDG','ChjVCa','EgXZEa','ndiXnZi4nKj2zffPBW','mJq4mdCYm3jevMj1Da','BgfIzwW','yxbWBgLJyxrPB24VDM5KlM9Wzw54BwXMB3jTyxrZlw9MzMLJzwrVy3vTzw50lNnWCMvHzhnOzwv0BwWUC2HLzxq'];_0x166d=function(){return _0x3c8465;};return _0x166d();}export function buildExcelBuffer(_0x27d320,_0x316bb4,_0x4d3524){const _0xa3be92=_0xd213,_0x324ce6=_0x27d320[_0xa3be92(0x9e)](_0x53de53=>_0x53de53[_0xa3be92(0xa5)]||_0x53de53[_0xa3be92(0xa1)]),_0x56bed1=_0x316bb4[_0xa3be92(0x9e)](_0x1eb758=>_0x27d320[_0xa3be92(0x9e)](_0x4fb0a3=>{const _0x25fc50=_0xa3be92;if(_0x4d3524)return _0x4d3524(_0x4fb0a3[_0x25fc50(0xa1)],_0x1eb758);const _0x380dad=_0x1eb758[_0x4fb0a3[_0x25fc50(0xa1)]];if(_0x380dad==null)return'';return String(_0x380dad);})),_0x443571=_0x38b4c9[_0xa3be92(0x92)]['aoa_to_sheet']([_0x324ce6,..._0x56bed1]),_0x2f79fa=_0x38b4c9[_0xa3be92(0x92)]['book_new']();return _0x38b4c9[_0xa3be92(0x92)][_0xa3be92(0x9a)](_0x2f79fa,_0x443571,_0xa3be92(0x95)),_0x38b4c9[_0xa3be92(0x96)](_0x2f79fa,{'bookType':_0xa3be92(0xa2),'type':_0xa3be92(0x97)});}export function excelFilename(_0x1220d0){const _0x52d087=_0xd213;return _0x1220d0[_0x52d087(0x9f)](_0x52d087(0x9c))?_0x1220d0:_0x1220d0+_0x52d087(0x9c);}function _0xd213(_0x324e74,_0x55c54d){_0x324e74=_0x324e74-0x92;const _0x166d4a=_0x166d();let _0xd213ed=_0x166d4a[_0x324e74];if(_0xd213['DhlOIs']===undefined){var _0x287289=function(_0x32eb7e){const _0x34cbb5='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x38b4c9='',_0x27d320='';for(let _0x316bb4=0x0,_0x4d3524,_0x324ce6,_0x56bed1=0x0;_0x324ce6=_0x32eb7e['charAt'](_0x56bed1++);~_0x324ce6&&(_0x4d3524=_0x316bb4%0x4?_0x4d3524*0x40+_0x324ce6:_0x324ce6,_0x316bb4++%0x4)?_0x38b4c9+=String['fromCharCode'](0xff&_0x4d3524>>(-0x2*_0x316bb4&0x6)):0x0){_0x324ce6=_0x34cbb5['indexOf'](_0x324ce6);}for(let _0x443571=0x0,_0x2f79fa=_0x38b4c9['length'];_0x443571<_0x2f79fa;_0x443571++){_0x27d320+='%'+('00'+_0x38b4c9['charCodeAt'](_0x443571)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x27d320);};_0xd213['lnxQBp']=_0x287289,_0xd213['waVQDK']={},_0xd213['DhlOIs']=!![];}const _0x14bbb5=_0x166d4a[0x0],_0x426d93=_0x324e74+_0x14bbb5,_0x5705d3=_0xd213['waVQDK'][_0x426d93];return!_0x5705d3?(_0xd213ed=_0xd213['lnxQBp'](_0xd213ed),_0xd213['waVQDK'][_0x426d93]=_0xd213ed):_0xd213ed=_0x5705d3,_0xd213ed;}export function excelResponseHeaders(_0x273696){const _0x28f9bb=_0xd213,_0x211bc2=excelFilename(_0x273696);return{'Content-Type':_0x28f9bb(0xa6),'Content-Disposition':'attachment;\x20filename*=UTF-8\x27\x27'+encodeURIComponent(_0x211bc2)};}
|
package/dist/shared/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function
|
|
1
|
+
(function(_0x3a0d67,_0x57b8b1){var _0x318c32=_0x5b7f,_0x1c67c9=_0x3a0d67();while(!![]){try{var _0x4ba707=-parseInt(_0x318c32(0xb8))/0x1+parseInt(_0x318c32(0xb4))/0x2*(-parseInt(_0x318c32(0xb1))/0x3)+-parseInt(_0x318c32(0xb3))/0x4*(parseInt(_0x318c32(0xb7))/0x5)+-parseInt(_0x318c32(0xb9))/0x6+parseInt(_0x318c32(0xb6))/0x7*(parseInt(_0x318c32(0xb2))/0x8)+-parseInt(_0x318c32(0xb0))/0x9+parseInt(_0x318c32(0xb5))/0xa;if(_0x4ba707===_0x57b8b1)break;else _0x1c67c9['push'](_0x1c67c9['shift']());}catch(_0x456abb){_0x1c67c9['push'](_0x1c67c9['shift']());}}}(_0x4ca6,0xeaa28));export{merge}from'../comm/merge';export{deepTree,flattenTree}from'./tree';function _0x4ca6(){var _0x30ce42=['mtq0mde5odbnzejOq2q','mJCWrLHty0zj','ohfss0fpsW','ndy2oti3nKT1Cg1nta','odeXnhLjDKnRAG','ntGWotCWndbrrgTgDey','ntm4nZm0mg5UtgviEa','nxDdqKDoDG','nZm3mdqXyLLjyLLc','mta0oteZmdbMCgviywm'];_0x4ca6=function(){return _0x30ce42;};return _0x4ca6();}function _0x5b7f(_0x3aa82f,_0x219f1c){_0x3aa82f=_0x3aa82f-0xb0;var _0x4ca6af=_0x4ca6();var _0x5b7f7d=_0x4ca6af[_0x3aa82f];if(_0x5b7f['xrYDYG']===undefined){var _0x1b20f0=function(_0x4e8895){var _0x2464d7='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';var _0x5b3df3='',_0x1d67ed='';for(var _0x26a19e=0x0,_0x12bb98,_0x450b12,_0x42c775=0x0;_0x450b12=_0x4e8895['charAt'](_0x42c775++);~_0x450b12&&(_0x12bb98=_0x26a19e%0x4?_0x12bb98*0x40+_0x450b12:_0x450b12,_0x26a19e++%0x4)?_0x5b3df3+=String['fromCharCode'](0xff&_0x12bb98>>(-0x2*_0x26a19e&0x6)):0x0){_0x450b12=_0x2464d7['indexOf'](_0x450b12);}for(var _0x7fe9c1=0x0,_0xaa52cf=_0x5b3df3['length'];_0x7fe9c1<_0xaa52cf;_0x7fe9c1++){_0x1d67ed+='%'+('00'+_0x5b3df3['charCodeAt'](_0x7fe9c1)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0x1d67ed);};_0x5b7f['FXUhvu']=_0x1b20f0,_0x5b7f['nxWCLN']={},_0x5b7f['xrYDYG']=!![];}var _0x4c9ea6=_0x4ca6af[0x0],_0x4bcffd=_0x3aa82f+_0x4c9ea6,_0x1ee847=_0x5b7f['nxWCLN'][_0x4bcffd];return!_0x1ee847?(_0x5b7f7d=_0x5b7f['FXUhvu'](_0x5b7f7d),_0x5b7f['nxWCLN'][_0x4bcffd]=_0x5b7f7d):_0x5b7f7d=_0x1ee847,_0x5b7f7d;}export{RES_CODE}from'../routing/base';export{buildExcelBuffer,excelFilename,excelResponseHeaders}from'./excel';
|
package/dist/shared/tree.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const _0x29157d=_0x52e4;function _0x52e4(_0x1ab655,_0x132beb){_0x1ab655=_0x1ab655-0x10f;const _0x35ca67=_0x35ca();let _0x52e41d=_0x35ca67[_0x1ab655];if(_0x52e4['stqTJW']===undefined){var _0x567f31=function(_0x2f9a69){const _0x5b786b='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789+/=';let _0x6731de='',_0xaac1e='';for(let _0x5a6091=0x0,_0x460c82,_0x361535,_0x44ab80=0x0;_0x361535=_0x2f9a69['charAt'](_0x44ab80++);~_0x361535&&(_0x460c82=_0x5a6091%0x4?_0x460c82*0x40+_0x361535:_0x361535,_0x5a6091++%0x4)?_0x6731de+=String['fromCharCode'](0xff&_0x460c82>>(-0x2*_0x5a6091&0x6)):0x0){_0x361535=_0x5b786b['indexOf'](_0x361535);}for(let _0x463a8b=0x0,_0x3fe6f1=_0x6731de['length'];_0x463a8b<_0x3fe6f1;_0x463a8b++){_0xaac1e+='%'+('00'+_0x6731de['charCodeAt'](_0x463a8b)['toString'](0x10))['slice'](-0x2);}return decodeURIComponent(_0xaac1e);};_0x52e4['nPFSqO']=_0x567f31,_0x52e4['CkALhF']={},_0x52e4['stqTJW']=!![];}const _0x385427=_0x35ca67[0x0],_0x458d3e=_0x1ab655+_0x385427,_0x1edd89=_0x52e4['CkALhF'][_0x458d3e];return!_0x1edd89?(_0x52e41d=_0x52e4['nPFSqO'](_0x52e41d),_0x52e4['CkALhF'][_0x458d3e]=_0x52e41d):_0x52e41d=_0x1edd89,_0x52e41d;}(function(_0x92ca87,_0xc79200){const _0x1a5a56=_0x52e4,_0x52ccc6=_0x92ca87();while(!![]){try{const _0x162052=parseInt(_0x1a5a56(0x119))/0x1+-parseInt(_0x1a5a56(0x116))/0x2+-parseInt(_0x1a5a56(0x115))/0x3*(parseInt(_0x1a5a56(0x121))/0x4)+parseInt(_0x1a5a56(0x11f))/0x5+parseInt(_0x1a5a56(0x120))/0x6*(parseInt(_0x1a5a56(0x110))/0x7)+parseInt(_0x1a5a56(0x114))/0x8+parseInt(_0x1a5a56(0x10f))/0x9;if(_0x162052===_0xc79200)break;else _0x52ccc6['push'](_0x52ccc6['shift']());}catch(_0x223685){_0x52ccc6['push'](_0x52ccc6['shift']());}}}(_0x35ca,0x9f8e8));export function deepTree(_0x6731de,_0xaac1e=_0x29157d(0x11a)){const _0x2c167e=_0x29157d,_0x5a6091=new Map();for(const _0x44ab80 of _0x6731de){if(_0x44ab80['id']==null)continue;_0x5a6091[_0x2c167e(0x117)](_0x44ab80['id'],{..._0x44ab80,'children':[]});}const _0x460c82=[];for(const _0x463a8b of _0x5a6091[_0x2c167e(0x11e)]()){const _0x3fe6f1=_0x463a8b[_0x2c167e(0x118)];_0x3fe6f1!=null&&_0x3fe6f1!==''&&_0x5a6091['has'](_0x3fe6f1)?_0x5a6091[_0x2c167e(0x113)](_0x3fe6f1)['children']['push'](_0x463a8b):_0x460c82[_0x2c167e(0x111)](_0x463a8b);}const _0x361535=_0x2463a8=>{const _0x2a0e87=_0x2c167e;_0x2463a8['sort']((_0x258e43,_0x410b24)=>{const _0x173415=_0x52e4,_0x2b538a=_0x258e43['orderNum']??0x0,_0x168290=_0x410b24[_0x173415(0x11c)]??0x0,_0x9bda25=_0xaac1e===_0x173415(0x11b)?_0x168290-_0x2b538a:_0x2b538a-_0x168290;return _0x9bda25||Number(_0x258e43['id'])-Number(_0x410b24['id']);});for(const _0x43a1db of _0x2463a8)if(_0x43a1db[_0x2a0e87(0x11d)]?.['length'])_0x361535(_0x43a1db[_0x2a0e87(0x11d)]);};return _0x361535(_0x460c82),_0x460c82;}export function flattenTree(_0x5699b4,_0x1c4ee9,_0x86a6da=0x0,_0x4f441f=[]){const _0x429142=_0x29157d;for(const _0x3a3f8f of _0x5699b4){const _0x259719=_0x3a3f8f['children']||[];_0x4f441f[_0x429142(0x111)]({..._0x3a3f8f,'depth':_0x86a6da,'hasChildren':_0x259719[_0x429142(0x112)]>0x0});if(_0x259719['length']&&_0x1c4ee9['has'](_0x3a3f8f['id']))flattenTree(_0x259719,_0x1c4ee9,_0x86a6da+0x1,_0x4f441f);}return _0x4f441f;}function _0x35ca(){const _0x54cfb7=['DMfSDwvZ','odCWodu1wuTWzKL0','mJKXmZiYmLP5r21gtq','mZzTyxPQAKG','mZa1mJGWouDWDK5NDq','n2nQDgPQCG','ChvZAa','BgvUz3rO','z2v0','nJu5oda0meHtuKDzrG','mJu5mtaXsg5muhP1','mtGXndqZmKPbyxDtrq','C2v0','CgfYzw50swq','nte0mZK5EgX3Bvn0','yxnJ','zgvZyW','B3jKzxjoDw0','y2HPBgrYzw4'];_0x35ca=function(){return _0x54cfb7;};return _0x35ca();}
|
package/package.json
CHANGED
|
@@ -166,8 +166,8 @@ export type CrudDeleteHelpers = {
|
|
|
166
166
|
next: (params?: Record<string, unknown>) => Promise<unknown>;
|
|
167
167
|
};
|
|
168
168
|
export type CrudOptions = {
|
|
169
|
-
/** service.base.user
|
|
170
|
-
service: CrudService
|
|
169
|
+
/** EPS service 对象,如 service.base.user */
|
|
170
|
+
service: CrudService;
|
|
171
171
|
dict?: Partial<CrudDict>;
|
|
172
172
|
permission?: Partial<CrudPermission>;
|
|
173
173
|
onRefresh?: (params: Record<string, unknown>, helpers: CrudRefreshHelpers) => void | Promise<void>;
|
|
@@ -158,9 +158,8 @@ export type CrudDeleteHelpers = {
|
|
|
158
158
|
}
|
|
159
159
|
|
|
160
160
|
export type CrudOptions = {
|
|
161
|
-
/** service.base.user
|
|
162
|
-
|
|
163
|
-
service: CrudService | string | any
|
|
161
|
+
/** EPS service 对象,如 service.base.user */
|
|
162
|
+
service: CrudService
|
|
164
163
|
dict?: Partial<CrudDict>
|
|
165
164
|
permission?: Partial<CrudPermission>
|
|
166
165
|
onRefresh?: (
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
<script setup lang="ts">
|
|
2
|
-
import { computed, onMounted } from 'vue'
|
|
3
|
-
import { extname } from '../../lib/upload'
|
|
4
|
-
|
|
5
|
-
defineOptions({ name: 'vm-file-icon' })
|
|
6
|
-
|
|
7
|
-
const props = withDefaults(
|
|
8
|
-
defineProps<{
|
|
9
|
-
/** 扩展名、文件名或 iconfont 类名 */
|
|
10
|
-
name: string
|
|
11
|
-
size?: number | string
|
|
12
|
-
}>(),
|
|
13
|
-
{ size: 24 },
|
|
14
|
-
)
|
|
15
|
-
|
|
16
|
-
let loaded = false
|
|
17
|
-
|
|
18
|
-
onMounted(async () => {
|
|
19
|
-
if (loaded) return
|
|
20
|
-
loaded = true
|
|
21
|
-
await import('../../static/fileicon/iconfont.js')
|
|
22
|
-
})
|
|
23
|
-
|
|
24
|
-
const symbolId = computed(() => {
|
|
25
|
-
const raw = props.name.replace(/^\./, '')
|
|
26
|
-
if (raw.startsWith('icon-')) return `#${raw}`
|
|
27
|
-
const ext = extname(raw) || raw
|
|
28
|
-
const key = ext.toUpperCase()
|
|
29
|
-
if (key === '3GP') return '#icon-a-3GP'
|
|
30
|
-
return `#icon-${key}`
|
|
31
|
-
})
|
|
32
|
-
|
|
33
|
-
const px = computed(() =>
|
|
34
|
-
typeof props.size === 'number' ? `${props.size}px` : props.size,
|
|
35
|
-
)
|
|
36
|
-
</script>
|
|
37
|
-
|
|
38
|
-
<template>
|
|
39
|
-
<svg
|
|
40
|
-
class="vm-file-icon"
|
|
41
|
-
aria-hidden="true"
|
|
42
|
-
:style="{ width: px, height: px }"
|
|
43
|
-
>
|
|
44
|
-
<use :xlink:href="symbolId" />
|
|
45
|
-
</svg>
|
|
46
|
-
</template>
|
|
47
|
-
|
|
48
|
-
<style lang="scss" scoped>
|
|
49
|
-
.vm-file-icon {
|
|
50
|
-
display: inline-block;
|
|
51
|
-
vertical-align: middle;
|
|
52
|
-
fill: currentColor;
|
|
53
|
-
flex-shrink: 0;
|
|
54
|
-
}
|
|
55
|
-
</style>
|
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<Dialog :open="open" @update:open="onOpenChange">
|
|
3
|
-
<DialogContent
|
|
4
|
-
shell="crud"
|
|
5
|
-
class="vm-dialog"
|
|
6
|
-
:class="{ 'is-empty': !hasBody, 'is-fill': fill }"
|
|
7
|
-
@pointer-down-outside="onPointerDownOutside"
|
|
8
|
-
@focus-outside="onFocusOutside"
|
|
9
|
-
@interact-outside="onInteractOutside"
|
|
10
|
-
>
|
|
11
|
-
<DialogHeader class="vm-dialog__head">
|
|
12
|
-
<DialogTitle class="vm-dialog__title">{{ title }}</DialogTitle>
|
|
13
|
-
</DialogHeader>
|
|
14
|
-
<div class="vm-dialog__body">
|
|
15
|
-
<slot v-if="hasBody" />
|
|
16
|
-
<div v-else class="vm-dialog__empty">
|
|
17
|
-
<vm-empty kind="暂无内容" />
|
|
18
|
-
</div>
|
|
19
|
-
</div>
|
|
20
|
-
<DialogFooter class="vm-dialog__foot">
|
|
21
|
-
<slot v-if="$slots.footer" name="footer" />
|
|
22
|
-
<template v-else>
|
|
23
|
-
<button
|
|
24
|
-
type="button"
|
|
25
|
-
class="vm-dialog__btn is-ghost"
|
|
26
|
-
:disabled="confirmLoading"
|
|
27
|
-
@click="onCloseClick"
|
|
28
|
-
>
|
|
29
|
-
{{ closeText }}
|
|
30
|
-
</button>
|
|
31
|
-
<button
|
|
32
|
-
v-if="confirm"
|
|
33
|
-
type="button"
|
|
34
|
-
class="vm-dialog__btn is-primary"
|
|
35
|
-
:disabled="confirmLoading"
|
|
36
|
-
@click="onConfirmClick"
|
|
37
|
-
>
|
|
38
|
-
{{ confirmLoading ? '提交中…' : confirmText }}
|
|
39
|
-
</button>
|
|
40
|
-
</template>
|
|
41
|
-
</DialogFooter>
|
|
42
|
-
</DialogContent>
|
|
43
|
-
</Dialog>
|
|
44
|
-
</template>
|
|
45
|
-
|
|
46
|
-
<script setup lang="ts">
|
|
47
|
-
import { computed, getCurrentInstance, useSlots } from 'vue'
|
|
48
|
-
import { isDialogFloatTarget } from '../lib/dialog-float'
|
|
49
|
-
|
|
50
|
-
defineOptions({ name: 'vm-dialog' })
|
|
51
|
-
|
|
52
|
-
const props = withDefaults(
|
|
53
|
-
defineProps<{
|
|
54
|
-
open?: boolean
|
|
55
|
-
title?: string
|
|
56
|
-
/** 宽度:桌面 50vw,移动端全屏 */
|
|
57
|
-
width?: string
|
|
58
|
-
/** 是否显示确定按钮,默认 true;说明类弹窗传 false */
|
|
59
|
-
confirm?: boolean
|
|
60
|
-
confirmLoading?: boolean
|
|
61
|
-
confirmText?: string
|
|
62
|
-
closeText?: string
|
|
63
|
-
/** 拉满 CRUD 壳层最高高度(800px),列表类弹窗用 */
|
|
64
|
-
fill?: boolean
|
|
65
|
-
}>(),
|
|
66
|
-
{
|
|
67
|
-
open: false,
|
|
68
|
-
title: '',
|
|
69
|
-
width: '50vw',
|
|
70
|
-
confirm: true,
|
|
71
|
-
confirmLoading: false,
|
|
72
|
-
confirmText: '确定',
|
|
73
|
-
closeText: '关闭',
|
|
74
|
-
fill: false,
|
|
75
|
-
},
|
|
76
|
-
)
|
|
77
|
-
|
|
78
|
-
const emit = defineEmits<{
|
|
79
|
-
'update:open': [v: boolean]
|
|
80
|
-
/** 关闭动作;监听时可拦截(不调 done 则不关) */
|
|
81
|
-
close: [done: () => void]
|
|
82
|
-
/** 确定动作;监听时可拦截(不调 done 则不关) */
|
|
83
|
-
confirm: [done: () => void]
|
|
84
|
-
}>()
|
|
85
|
-
|
|
86
|
-
const slots = useSlots()
|
|
87
|
-
const hasBody = computed(() => Boolean(slots.default))
|
|
88
|
-
const instance = getCurrentInstance()
|
|
89
|
-
|
|
90
|
-
function finishClose() {
|
|
91
|
-
emit('update:open', false)
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
/** 声明式 emit 不在 attrs 里,从 vnode.props 判断是否有监听 */
|
|
95
|
-
function hasListener(event: 'close' | 'confirm') {
|
|
96
|
-
const p = instance?.vnode.props
|
|
97
|
-
if (!p) return false
|
|
98
|
-
const key = `on${event[0]!.toUpperCase()}${event.slice(1)}`
|
|
99
|
-
return typeof p[key] === 'function' || Array.isArray(p[key])
|
|
100
|
-
}
|
|
101
|
-
|
|
102
|
-
function onOpenChange(v: boolean) {
|
|
103
|
-
if (v) {
|
|
104
|
-
emit('update:open', true)
|
|
105
|
-
return
|
|
106
|
-
}
|
|
107
|
-
onCloseClick()
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
function onCloseClick() {
|
|
111
|
-
if (hasListener('close')) {
|
|
112
|
-
emit('close', finishClose)
|
|
113
|
-
return
|
|
114
|
-
}
|
|
115
|
-
finishClose()
|
|
116
|
-
}
|
|
117
|
-
|
|
118
|
-
function onConfirmClick() {
|
|
119
|
-
if (props.confirmLoading) return
|
|
120
|
-
if (hasListener('confirm')) {
|
|
121
|
-
emit('confirm', finishClose)
|
|
122
|
-
return
|
|
123
|
-
}
|
|
124
|
-
finishClose()
|
|
125
|
-
}
|
|
126
|
-
|
|
127
|
-
function onPointerDownOutside(event: Event) {
|
|
128
|
-
if (isDialogFloatTarget(event)) event.preventDefault()
|
|
129
|
-
}
|
|
130
|
-
|
|
131
|
-
function onFocusOutside(event: Event) {
|
|
132
|
-
if (isDialogFloatTarget(event)) event.preventDefault()
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
function onInteractOutside(event: Event) {
|
|
136
|
-
if (isDialogFloatTarget(event)) event.preventDefault()
|
|
137
|
-
}
|
|
138
|
-
</script>
|
|
139
|
-
|
|
140
|
-
<style lang="scss" scoped>
|
|
141
|
-
.vm-dialog__head {
|
|
142
|
-
flex-shrink: 0;
|
|
143
|
-
padding: 12px 22px;
|
|
144
|
-
border-bottom: 1px solid var(--border);
|
|
145
|
-
|
|
146
|
-
@media (max-width: 768px) {
|
|
147
|
-
padding: 8px 12px;
|
|
148
|
-
}
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
.vm-dialog__title {
|
|
152
|
-
font-size: 15px;
|
|
153
|
-
font-weight: 650;
|
|
154
|
-
letter-spacing: -0.01em;
|
|
155
|
-
line-height: 1.3;
|
|
156
|
-
color: var(--foreground);
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
.vm-dialog__body {
|
|
160
|
-
display: flex;
|
|
161
|
-
flex: 1 1 auto;
|
|
162
|
-
flex-direction: column;
|
|
163
|
-
min-height: 0;
|
|
164
|
-
overflow: auto;
|
|
165
|
-
overscroll-behavior: contain;
|
|
166
|
-
padding: 18px 22px 16px;
|
|
167
|
-
|
|
168
|
-
@media (max-width: 768px) {
|
|
169
|
-
flex: 1;
|
|
170
|
-
padding: 12px;
|
|
171
|
-
}
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
.vm-dialog__empty {
|
|
175
|
-
display: flex;
|
|
176
|
-
min-height: 160px;
|
|
177
|
-
align-items: center;
|
|
178
|
-
justify-content: center;
|
|
179
|
-
}
|
|
180
|
-
|
|
181
|
-
.vm-dialog__foot {
|
|
182
|
-
display: flex;
|
|
183
|
-
flex-shrink: 0;
|
|
184
|
-
justify-content: flex-end;
|
|
185
|
-
gap: 8px;
|
|
186
|
-
padding: 10px 22px;
|
|
187
|
-
border-top: 1px solid var(--border);
|
|
188
|
-
|
|
189
|
-
@media (max-width: 768px) {
|
|
190
|
-
flex-direction: column-reverse;
|
|
191
|
-
gap: 8px;
|
|
192
|
-
padding: 8px 12px calc(8px + env(safe-area-inset-bottom, 0px));
|
|
193
|
-
|
|
194
|
-
.vm-dialog__btn {
|
|
195
|
-
width: 100%;
|
|
196
|
-
}
|
|
197
|
-
}
|
|
198
|
-
}
|
|
199
|
-
|
|
200
|
-
.vm-dialog__btn {
|
|
201
|
-
height: 36px;
|
|
202
|
-
padding: 0 16px;
|
|
203
|
-
border: none;
|
|
204
|
-
border-radius: 12px;
|
|
205
|
-
font-size: 13px;
|
|
206
|
-
font-weight: 600;
|
|
207
|
-
cursor: pointer;
|
|
208
|
-
transition:
|
|
209
|
-
background 0.15s ease,
|
|
210
|
-
color 0.15s ease;
|
|
211
|
-
|
|
212
|
-
&.is-primary {
|
|
213
|
-
background: var(--brand);
|
|
214
|
-
color: #fff;
|
|
215
|
-
|
|
216
|
-
&:hover:not(:disabled) {
|
|
217
|
-
background: var(--brand-deep);
|
|
218
|
-
}
|
|
219
|
-
}
|
|
220
|
-
|
|
221
|
-
&.is-ghost {
|
|
222
|
-
background: var(--muted);
|
|
223
|
-
color: var(--foreground);
|
|
224
|
-
|
|
225
|
-
&:hover:not(:disabled) {
|
|
226
|
-
background: color-mix(in srgb, var(--muted) 70%, var(--foreground) 8%);
|
|
227
|
-
}
|
|
228
|
-
}
|
|
229
|
-
|
|
230
|
-
&:disabled {
|
|
231
|
-
cursor: wait;
|
|
232
|
-
opacity: 0.65;
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
</style>
|