@ditari/bsui 5.0.29 → 5.1.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/cjs/components/card/Card.cjs +49 -0
- package/dist/cjs/components/card/Card.cjs.map +1 -0
- package/dist/cjs/components/card/index.cjs +8 -0
- package/dist/cjs/components/card/index.cjs.map +1 -0
- package/dist/cjs/components/card/style.cjs +40 -0
- package/dist/cjs/components/card/style.cjs.map +1 -0
- package/dist/cjs/components/index.cjs +11 -0
- package/dist/cjs/components/index.cjs.map +1 -1
- package/dist/cjs/components/layout/AppContext.cjs +7 -0
- package/dist/cjs/components/layout/AppContext.cjs.map +1 -0
- package/dist/cjs/components/layout/Layout.vue2.cjs +11 -16
- package/dist/cjs/components/layout/Layout.vue2.cjs.map +1 -1
- package/dist/cjs/components/layout/Show.cjs +6 -1
- package/dist/cjs/components/layout/Show.cjs.map +1 -1
- package/dist/cjs/components/layout/components/layout/ThemeApp.vue2.cjs +0 -1
- package/dist/cjs/components/layout/components/layout/ThemeApp.vue2.cjs.map +1 -1
- package/dist/cjs/components/layout/components/menu/Menu.cjs +38 -39
- package/dist/cjs/components/layout/components/menu/Menu.cjs.map +1 -1
- package/dist/cjs/components/table-form/TableForm.cjs +109 -0
- package/dist/cjs/components/table-form/TableForm.cjs.map +1 -0
- package/dist/cjs/components/table-form/TableFormItem.cjs +112 -0
- package/dist/cjs/components/table-form/TableFormItem.cjs.map +1 -0
- package/dist/cjs/components/table-form/index.cjs +16 -0
- package/dist/cjs/components/table-form/index.cjs.map +1 -0
- package/dist/cjs/components/table-form/interface.cjs +58 -0
- package/dist/cjs/components/table-form/interface.cjs.map +1 -0
- package/dist/cjs/components/table-form/style.cjs +124 -0
- package/dist/cjs/components/table-form/style.cjs.map +1 -0
- package/dist/cjs/hooks/useDesign.cjs +31 -0
- package/dist/cjs/hooks/useDesign.cjs.map +1 -0
- package/dist/cjs/index.cjs +13 -3
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/utils/withInstall.cjs +18 -0
- package/dist/cjs/utils/withInstall.cjs.map +1 -0
- package/dist/esm/components/card/Card.mjs +47 -0
- package/dist/esm/components/card/Card.mjs.map +1 -0
- package/dist/esm/components/card/index.mjs +4 -0
- package/dist/esm/components/card/index.mjs.map +1 -0
- package/dist/esm/components/card/style.mjs +38 -0
- package/dist/esm/components/card/style.mjs.map +1 -0
- package/dist/esm/components/index.mjs +5 -0
- package/dist/esm/components/index.mjs.map +1 -1
- package/dist/esm/components/layout/AppContext.mjs +5 -0
- package/dist/esm/components/layout/AppContext.mjs.map +1 -0
- package/dist/esm/components/layout/Layout.vue2.mjs +12 -17
- package/dist/esm/components/layout/Layout.vue2.mjs.map +1 -1
- package/dist/esm/components/layout/Show.mjs +7 -2
- package/dist/esm/components/layout/Show.mjs.map +1 -1
- package/dist/esm/components/layout/components/layout/ThemeApp.vue2.mjs +0 -1
- package/dist/esm/components/layout/components/layout/ThemeApp.vue2.mjs.map +1 -1
- package/dist/esm/components/layout/components/menu/Menu.mjs +41 -42
- package/dist/esm/components/layout/components/menu/Menu.mjs.map +1 -1
- package/dist/esm/components/table-form/TableForm.mjs +106 -0
- package/dist/esm/components/table-form/TableForm.mjs.map +1 -0
- package/dist/esm/components/table-form/TableFormItem.mjs +110 -0
- package/dist/esm/components/table-form/TableFormItem.mjs.map +1 -0
- package/dist/esm/components/table-form/index.mjs +10 -0
- package/dist/esm/components/table-form/index.mjs.map +1 -0
- package/dist/esm/components/table-form/interface.mjs +54 -0
- package/dist/esm/components/table-form/interface.mjs.map +1 -0
- package/dist/esm/components/table-form/style.mjs +122 -0
- package/dist/esm/components/table-form/style.mjs.map +1 -0
- package/dist/esm/hooks/useDesign.mjs +28 -0
- package/dist/esm/hooks/useDesign.mjs.map +1 -0
- package/dist/esm/index.mjs +4 -0
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/utils/withInstall.mjs +16 -0
- package/dist/esm/utils/withInstall.mjs.map +1 -0
- package/dist/types/components/card/Card.d.ts +6 -0
- package/dist/types/components/card/Card.d.ts.map +1 -0
- package/dist/types/components/card/index.d.ts +3 -0
- package/dist/types/components/card/index.d.ts.map +1 -0
- package/dist/types/components/card/style.d.ts +9 -0
- package/dist/types/components/card/style.d.ts.map +1 -0
- package/dist/types/components/index.d.ts +2 -0
- package/dist/types/components/index.d.ts.map +1 -1
- package/dist/types/components/layout/AppContext.d.ts +11 -0
- package/dist/types/components/layout/AppContext.d.ts.map +1 -0
- package/dist/types/components/layout/Layout.vue.d.ts +11 -2
- package/dist/types/components/layout/Layout.vue.d.ts.map +1 -1
- package/dist/types/components/layout/Show.d.ts.map +1 -1
- package/dist/types/components/layout/components/layout/ThemeApp.vue.d.ts.map +1 -1
- package/dist/types/components/layout/components/menu/Menu.d.ts.map +1 -1
- package/dist/types/components/table-form/TableForm.d.ts +57 -0
- package/dist/types/components/table-form/TableForm.d.ts.map +1 -0
- package/dist/types/components/table-form/TableFormItem.d.ts +23 -0
- package/dist/types/components/table-form/TableFormItem.d.ts.map +1 -0
- package/dist/types/components/table-form/index.d.ts +9 -0
- package/dist/types/components/table-form/index.d.ts.map +1 -0
- package/dist/types/components/table-form/interface.d.ts +57 -0
- package/dist/types/components/table-form/interface.d.ts.map +1 -0
- package/dist/types/components/table-form/style.d.ts +12 -0
- package/dist/types/components/table-form/style.d.ts.map +1 -0
- package/dist/types/hooks/useDesign.d.ts +8 -0
- package/dist/types/hooks/useDesign.d.ts.map +1 -0
- package/dist/types/utils/withInstall.d.ts +12 -0
- package/dist/types/utils/withInstall.d.ts.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { defineComponent, createVNode } from 'vue';
|
|
2
|
+
import { cx } from '@emotion/css';
|
|
3
|
+
import { useDesign } from '../../hooks/useDesign.mjs';
|
|
4
|
+
import { withInstall } from '../../utils/withInstall.mjs';
|
|
5
|
+
import { useStyle } from './style.mjs';
|
|
6
|
+
|
|
7
|
+
"use strict";
|
|
8
|
+
const _Card = /* @__PURE__ */ defineComponent({
|
|
9
|
+
name: "DCard",
|
|
10
|
+
props: {
|
|
11
|
+
title: String
|
|
12
|
+
},
|
|
13
|
+
setup(props, {
|
|
14
|
+
slots
|
|
15
|
+
}) {
|
|
16
|
+
const {
|
|
17
|
+
getPrefixCls
|
|
18
|
+
} = useDesign("card");
|
|
19
|
+
const styles = useStyle();
|
|
20
|
+
return () => {
|
|
21
|
+
var _a;
|
|
22
|
+
const rootCls = getPrefixCls();
|
|
23
|
+
const headerCls = getPrefixCls("head");
|
|
24
|
+
const iconCls = getPrefixCls("icon");
|
|
25
|
+
const titleCls = getPrefixCls("title");
|
|
26
|
+
const actionCls = getPrefixCls("action");
|
|
27
|
+
const bodyCls = getPrefixCls("body");
|
|
28
|
+
return createVNode("div", {
|
|
29
|
+
"class": cx(rootCls, styles.container)
|
|
30
|
+
}, [createVNode("div", {
|
|
31
|
+
"class": cx(headerCls, styles.header)
|
|
32
|
+
}, [slots.icon && createVNode("div", {
|
|
33
|
+
"class": cx(iconCls, styles.icon)
|
|
34
|
+
}, [slots.icon()]), createVNode("div", {
|
|
35
|
+
"class": cx(titleCls, styles.header_title)
|
|
36
|
+
}, [props.title])]), slots.action && createVNode("div", {
|
|
37
|
+
"class": cx(actionCls, styles.action)
|
|
38
|
+
}, [slots.action()]), createVNode("div", {
|
|
39
|
+
"class": cx(bodyCls, styles.body)
|
|
40
|
+
}, [(_a = slots.default) == null ? void 0 : _a.call(slots)])]);
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
const Card = withInstall(_Card);
|
|
45
|
+
|
|
46
|
+
export { Card };
|
|
47
|
+
//# sourceMappingURL=Card.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Card.mjs","sources":["../../../../src/components/card/Card.tsx"],"sourcesContent":["// components/card/index.tsx\r\nimport { defineComponent } from \"vue\";\r\n\r\nimport { cx } from \"@emotion/css\"; // 引入 cx\r\n\r\nimport { useDesign } from \"../../hooks/useDesign\"; // 引入我们刚才写的 hook\r\nimport { withInstall } from \"../../utils/withInstall\";\r\n\r\nimport { useStyle } from \"./style\";\r\n\r\nconst _Card = defineComponent({\r\n name: \"DCard\",\r\n props: {\r\n title: String\r\n },\r\n setup(props, { slots }) {\r\n // 初始化 Design Hook,传入组件名 'card'\r\n const { getPrefixCls } = useDesign(\"card\");\r\n\r\n // 初始化 Emotion 样式\r\n const styles = useStyle();\r\n\r\n return () => {\r\n // 生成语义化类名\r\n const rootCls = getPrefixCls();\r\n const headerCls = getPrefixCls(\"head\");\r\n const iconCls = getPrefixCls(\"icon\");\r\n const titleCls = getPrefixCls(\"title\");\r\n const actionCls = getPrefixCls(\"action\");\r\n const bodyCls = getPrefixCls(\"body\");\r\n\r\n return (\r\n <div class={cx(rootCls, styles.container)}>\r\n {/* Header 区域 */}\r\n <div class={cx(headerCls, styles.header)}>\r\n {slots.icon && <div class={cx(iconCls, styles.icon)}>{slots.icon()}</div>}\r\n <div class={cx(titleCls, styles.header_title)}>{props.title}</div>\r\n </div>\r\n {/*action*/}\r\n {slots.action && <div class={cx(actionCls, styles.action)}>{slots.action()}</div>}\r\n\r\n {/* Body 区域 */}\r\n <div class={cx(bodyCls, styles.body)}>{slots.default?.()}</div>\r\n </div>\r\n );\r\n };\r\n }\r\n});\r\n\r\nexport const Card = withInstall(_Card);\r\n"],"names":["_Card","defineComponent","name","props","title","String","setup","slots","getPrefixCls","useDesign","styles","useStyle","rootCls","headerCls","iconCls","titleCls","actionCls","bodyCls","_createVNode","cx","container","header","icon","header_title","action","body","default","Card","withInstall"],"mappings":";;;;;;;AAUA,MAAMA,wBAAQC,eAAAA,CAAgB;AAAA,EAC5BC,IAAAA,EAAM,OAAA;AAAA,EACNC,KAAAA,EAAO;AAAA,IACLC,KAAAA,EAAOC;AAAAA,GACT;AAAA,EACAC,MAAMH,KAAAA,EAAO;AAAA,IAAEI;AAAAA,GAAM,EAAG;AAEtB,IAAA,MAAM;AAAA,MAAEC;AAAAA,KAAa,GAAIC,UAAU,MAAM,CAAA;AAGzC,IAAA,MAAMC,SAASC,QAAAA,EAAS;AAExB,IAAA,OAAO,MAAM;AAtBjB,MAAA,IAAA,EAAA;AAwBM,MAAA,MAAMC,UAAUJ,YAAAA,EAAa;AAC7B,MAAA,MAAMK,SAAAA,GAAYL,aAAa,MAAM,CAAA;AACrC,MAAA,MAAMM,OAAAA,GAAUN,aAAa,MAAM,CAAA;AACnC,MAAA,MAAMO,QAAAA,GAAWP,aAAa,OAAO,CAAA;AACrC,MAAA,MAAMQ,SAAAA,GAAYR,aAAa,QAAQ,CAAA;AACvC,MAAA,MAAMS,OAAAA,GAAUT,aAAa,MAAM,CAAA;AAEnC,MAAA,OAAAU,YAAA,KAAA,EAAA;AAAA,QAAA,OAAA,EACcC,EAAAA,CAAGP,OAAAA,EAASF,MAAAA,CAAOU,SAAS;AAAA,OAAC,EAAA,CAAAF,WAAAA,CAAA,KAAA,EAAA;AAAA,QAAA,OAAA,EAE3BC,EAAAA,CAAGN,SAAAA,EAAWH,MAAAA,CAAOW,MAAM;AAAA,OAAC,EAAA,CACrCd,KAAAA,CAAMe,IAAAA,IAAIJ,YAAA,KAAA,EAAA;AAAA,QAAA,OAAA,EAAgBC,EAAAA,CAAGL,OAAAA,EAASJ,MAAAA,CAAOY,IAAI;AAAA,OAAC,EAAA,CAAGf,KAAAA,CAAMe,IAAAA,EAAM,CAAA,CAAA,EAAOJ,YAAA,KAAA,EAAA;AAAA,QAAA,OAAA,EAC7DC,EAAAA,CAAGJ,QAAAA,EAAUL,MAAAA,CAAOa,YAAY;AAAA,OAAC,EAAA,CAAGpB,KAAAA,CAAMC,KAAK,CAAA,CAAA,CAAA,CAAA,EAG5DG,KAAAA,CAAMiB,MAAAA,IAAMN,WAAAA,CAAA,KAAA,EAAA;AAAA,QAAA,OAAA,EAAgBC,EAAAA,CAAGH,SAAAA,EAAWN,MAAAA,CAAOc,MAAM;AAAA,OAAC,EAAA,CAAGjB,KAAAA,CAAMiB,MAAAA,EAAQ,CAAA,CAAA,EAAON,YAAA,KAAA,EAAA;AAAA,QAAA,OAAA,EAGrEC,EAAAA,CAAGF,OAAAA,EAASP,MAAAA,CAAOe,IAAI;AAAA,SAAC,CAAA,CAAGlB,EAAAA,GAAAA,KAAAA,CAAMmB,YAANnB,IAAAA,GAAAA,KAAAA,CAAAA,GAAAA,EAAAA,CAAAA,IAAAA,CAAAA,KAAAA,CAAiB,CAAA,CAAA,CAAA,CAAA;AAAA,IAG9D,CAAA;AAAA,EACF;AACF,CAAC,CAAA;AAEM,MAAMoB,IAAAA,GAAOC,YAAY5B,KAAK;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { css } from '@emotion/css';
|
|
2
|
+
|
|
3
|
+
"use strict";
|
|
4
|
+
const useStyle = () => {
|
|
5
|
+
return {
|
|
6
|
+
container: css`
|
|
7
|
+
display: flex;
|
|
8
|
+
flex-direction: column;
|
|
9
|
+
background-color: #fff;
|
|
10
|
+
`,
|
|
11
|
+
header: css`
|
|
12
|
+
display: flex;
|
|
13
|
+
margin-bottom: 20px;
|
|
14
|
+
`,
|
|
15
|
+
header_title: css`
|
|
16
|
+
line-height: 1.5;
|
|
17
|
+
/* 如果标题过长,防止换行破坏布局,可以加这行 */
|
|
18
|
+
white-space: nowrap;
|
|
19
|
+
`,
|
|
20
|
+
// 可选:如果你需要对 icon 容器做特殊处理(例如防止图标被压缩)
|
|
21
|
+
icon: css`
|
|
22
|
+
margin-right: 10px;
|
|
23
|
+
display: inline-flex;
|
|
24
|
+
align-items: center;
|
|
25
|
+
flex-shrink: 0; /* 防止标题过长时挤压图标 */
|
|
26
|
+
`,
|
|
27
|
+
action: css`
|
|
28
|
+
margin-bottom: 10px;
|
|
29
|
+
`,
|
|
30
|
+
body: css`
|
|
31
|
+
display: flex;
|
|
32
|
+
flex-direction: column;
|
|
33
|
+
`
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
export { useStyle };
|
|
38
|
+
//# sourceMappingURL=style.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"style.mjs","sources":["../../../../src/components/card/style.ts"],"sourcesContent":["import { css } from \"@emotion/css\";\r\n\r\nexport const useStyle = () => {\r\n return {\r\n container: css`\r\n display: flex;\r\n flex-direction: column;\r\n background-color: #fff;\r\n `,\r\n header: css`\r\n display: flex;\r\n margin-bottom: 20px;\r\n `,\r\n header_title: css`\r\n line-height: 1.5;\r\n /* 如果标题过长,防止换行破坏布局,可以加这行 */\r\n white-space: nowrap;\r\n `,\r\n // 可选:如果你需要对 icon 容器做特殊处理(例如防止图标被压缩)\r\n icon: css`\r\n margin-right: 10px;\r\n display: inline-flex;\r\n align-items: center;\r\n flex-shrink: 0; /* 防止标题过长时挤压图标 */\r\n `,\r\n action: css`\r\n margin-bottom: 10px;\r\n `,\r\n body: css`\r\n display: flex;\r\n flex-direction: column;\r\n `\r\n };\r\n};\r\n"],"names":[],"mappings":";;;AAEO,MAAM,WAAW,MAAM;AAC5B,EAAA,OAAO;AAAA,IACL,SAAA,EAAW,GAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAKX,MAAA,EAAQ,GAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAIR,YAAA,EAAc,GAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA;AAAA,IAMd,IAAA,EAAM,GAAA;AAAA;AAAA;AAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAMN,MAAA,EAAQ,GAAA;AAAA;AAAA,IAAA,CAAA;AAAA,IAGR,IAAA,EAAM,GAAA;AAAA;AAAA;AAAA,IAAA;AAAA,GAIR;AACF;;;;"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import './card/index.mjs';
|
|
1
2
|
import './date/index.mjs';
|
|
2
3
|
import './dic/index.mjs';
|
|
3
4
|
import './form/index.mjs';
|
|
@@ -6,10 +7,12 @@ import './layout/index.mjs';
|
|
|
6
7
|
import './select/index.mjs';
|
|
7
8
|
import './tab/index.mjs';
|
|
8
9
|
import './table/index.mjs';
|
|
10
|
+
export { TableForm } from './table-form/index.mjs';
|
|
9
11
|
export { default as DicRep } from './dic/DicReplace.mjs';
|
|
10
12
|
export { default as Select } from './select/Select.vue2.mjs';
|
|
11
13
|
export { default as Tab } from './tab/Tab.vue2.mjs';
|
|
12
14
|
export { default as Table } from './table/Table.mjs';
|
|
15
|
+
export { Card } from './card/Card.mjs';
|
|
13
16
|
export { default as RangePicker } from './date/RangePicker.vue2.mjs';
|
|
14
17
|
export { default as FormLayout } from './form/FormLayout.mjs';
|
|
15
18
|
export { default as Moon } from './icon/Moon.vue.mjs';
|
|
@@ -20,6 +23,8 @@ export { default as Menu } from './layout/components/menu/Menu.mjs';
|
|
|
20
23
|
export { default as Layout } from './layout/Layout.vue2.mjs';
|
|
21
24
|
export { default as List } from './layout/List.mjs';
|
|
22
25
|
export { default as Show } from './layout/Show.mjs';
|
|
26
|
+
export { DEFAULT_STYLES_CONFIG, tableFormItemProps, tableFormProps } from './table-form/interface.mjs';
|
|
27
|
+
export { TableFormItem } from './table-form/TableFormItem.mjs';
|
|
23
28
|
|
|
24
29
|
"use strict";
|
|
25
30
|
//# sourceMappingURL=index.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.mjs","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"AppContext.mjs","sources":["../../../../src/components/layout/AppContext.ts"],"sourcesContent":["import { ComputedRef, VNode } from \"vue\";\r\n\r\nexport const AppContextKey = Symbol(\"d-bsui-context\");\r\nexport interface AppContext {\r\n // 水印\r\n watermarkContent?: ComputedRef<{ content: string }>;\r\n renderMenuIcon?: (item: {\r\n icon: string;\r\n }) => VNode | VNode[];\r\n}\r\n"],"names":[],"mappings":";AAEO,MAAM,aAAA,GAAgB,OAAO,gBAAgB;;;;"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
|
-
import { defineComponent,
|
|
1
|
+
import { defineComponent, provide, computed, watch, resolveComponent, createElementBlock, openBlock, Fragment, createVNode, createBlock, createCommentVNode, normalizeClass, unref, withCtx, createElementVNode, renderSlot } from 'vue';
|
|
2
2
|
import { useRoute } from 'vue-router';
|
|
3
3
|
import { storeToRefs } from 'pinia';
|
|
4
|
+
import { AppContextKey } from './AppContext.mjs';
|
|
4
5
|
import Menu from './components/menu/Menu.mjs';
|
|
5
6
|
import SettingDrawer from './components/settings/SettingDrawer.mjs';
|
|
6
7
|
import { useAppStore, useKeepAliveStore } from '@ditari/store';
|
|
@@ -18,16 +19,19 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
18
19
|
watermark: { type: Object, required: false, default: () => ({
|
|
19
20
|
content: ""
|
|
20
21
|
}) },
|
|
21
|
-
isSettings: { type: Boolean, required: false, default:
|
|
22
|
+
isSettings: { type: Boolean, required: false, default: false },
|
|
23
|
+
renderMenuIcon: { type: Function, required: false, default: void 0 }
|
|
22
24
|
},
|
|
23
25
|
emits: ["onMenuClick"],
|
|
24
26
|
setup(__props, { emit: __emit }) {
|
|
25
27
|
const props = __props;
|
|
26
28
|
const emits = __emit;
|
|
27
29
|
const { layout, modeConfig, sideTokenStyle } = storeToRefs(useAppStore());
|
|
28
|
-
const route = useRoute();
|
|
29
|
-
useWatermark();
|
|
30
30
|
const { onMenuClick } = useMenu();
|
|
31
|
+
provide(AppContextKey, {
|
|
32
|
+
watermarkContent: computed(() => props.watermark || ""),
|
|
33
|
+
renderMenuIcon: props.renderMenuIcon
|
|
34
|
+
});
|
|
31
35
|
const {
|
|
32
36
|
layoutStyle,
|
|
33
37
|
siderStyle,
|
|
@@ -36,6 +40,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
36
40
|
} = useStyle();
|
|
37
41
|
useKeepAlive();
|
|
38
42
|
function useKeepAlive() {
|
|
43
|
+
const route = useRoute();
|
|
39
44
|
const { save } = useKeepAliveStore();
|
|
40
45
|
watch(
|
|
41
46
|
() => route.path,
|
|
@@ -47,17 +52,6 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
47
52
|
}
|
|
48
53
|
);
|
|
49
54
|
}
|
|
50
|
-
function useWatermark() {
|
|
51
|
-
const watermarkContent = ref("");
|
|
52
|
-
provide("watermarkContent", watermarkContent);
|
|
53
|
-
watch(
|
|
54
|
-
() => props.watermark,
|
|
55
|
-
(val) => {
|
|
56
|
-
watermarkContent.value = val.content || "";
|
|
57
|
-
},
|
|
58
|
-
{ deep: true, immediate: true }
|
|
59
|
-
);
|
|
60
|
-
}
|
|
61
55
|
function useStyle() {
|
|
62
56
|
const layoutStyle2 = css`
|
|
63
57
|
height: 100vh;
|
|
@@ -131,7 +125,8 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
131
125
|
theme: "light",
|
|
132
126
|
collapsible: "",
|
|
133
127
|
trigger: null,
|
|
134
|
-
class: normalizeClass(unref(siderStyle))
|
|
128
|
+
class: normalizeClass(unref(siderStyle)),
|
|
129
|
+
width: unref(layout).sideWidth
|
|
135
130
|
}, {
|
|
136
131
|
default: withCtx(() => [
|
|
137
132
|
createElementVNode("div", _hoisted_1, [
|
|
@@ -141,7 +136,7 @@ var _sfc_main = /* @__PURE__ */ defineComponent({
|
|
|
141
136
|
]),
|
|
142
137
|
_: 3
|
|
143
138
|
/* FORWARDED */
|
|
144
|
-
}, 8, ["collapsed", "class"]),
|
|
139
|
+
}, 8, ["collapsed", "class", "width"]),
|
|
145
140
|
createVNode(_component_a_layout, {
|
|
146
141
|
class: normalizeClass(unref(rightStyle))
|
|
147
142
|
}, {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Layout.vue2.mjs","sources":["../../../../src/components/layout/Layout.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, provide,
|
|
1
|
+
{"version":3,"file":"Layout.vue2.mjs","sources":["../../../../src/components/layout/Layout.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { computed, provide, VNode, watch } from \"vue\";\r\nimport { useRoute } from \"vue-router\";\r\nimport { storeToRefs } from \"pinia\";\r\n\r\nimport { AppContext, AppContextKey } from \"./AppContext\";\r\nimport DMenu from \"./components/menu/Menu\";\r\nimport SettingDrawer from \"./components/settings/SettingDrawer\";\r\nimport {\r\n useAppStore,\r\n useKeepAliveStore\r\n} from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\n\r\nimport HeaderLayout from \"./components/layout/HeaderLayout.vue\";\r\nimport RouterContent from \"./components/layout/RouterContent.vue\";\r\n\r\nconst props = defineProps({\n watermark: { type: Object, required: false, default: () => ({\r\n content: \"\"\r\n }) },\n isSettings: { type: Boolean, required: false, default: false },\n renderMenuIcon: { type: Function, required: false, default: undefined }\n});\r\nconst emits = defineEmits([\"onMenuClick\"]);\r\n\r\nconst { layout, modeConfig, sideTokenStyle } =\r\n storeToRefs(useAppStore());\r\n\r\nconst { onMenuClick } = useMenu();\r\n\r\nprovide<AppContext>(AppContextKey, {\r\n watermarkContent: computed(() => props.watermark || \"\"),\r\n renderMenuIcon: props.renderMenuIcon\r\n});\r\n\r\nconst {\r\n layoutStyle,\r\n siderStyle,\r\n rightStyle,\r\n rightContentStyle\r\n} = useStyle();\r\nuseKeepAlive();\r\n\r\nfunction useKeepAlive() {\r\n const route = useRoute();\r\n // 保存需要被缓存的标签\r\n const { save } = useKeepAliveStore();\r\n\r\n watch(\r\n () => route.path,\r\n () => {\r\n save(route);\r\n },\r\n {\r\n immediate: true\r\n }\r\n );\r\n}\r\n\r\nfunction useStyle() {\r\n const layoutStyle = css`\r\n height: 100vh;\r\n `;\r\n\r\n const transitionStyle = css`\r\n transition: margin-left 0.4s\r\n cubic-bezier(0.22, 1.2, 0.36, 1);\r\n `;\r\n\r\n const left = computed(\r\n () =>\r\n `${layout.value.collapsed ? layout.value.collapsedWidth : layout.value.sideWidth}px`\r\n );\r\n\r\n const siderStyle = computed(\r\n () => css`\r\n position: fixed !important;\r\n top: 0;\r\n bottom: 0;\r\n left: 0;\r\n z-index: 1;\r\n width: ${layout.value.sideWidth}px;\r\n\r\n .app-side {\r\n height: 100%;\r\n display: flex;\r\n flex-direction: column;\r\n ${modeConfig.value.mode === \"light\"\r\n ? `background:${sideTokenStyle.value.bgColor};`\r\n : \"\"}\r\n }\r\n `\r\n );\r\n\r\n const rightStyle = computed(\r\n () => css`\r\n margin-left: ${left.value};\r\n ${transitionStyle}\r\n `\r\n );\r\n\r\n const rightContentStyle = computed(\r\n () => css`\r\n padding-top: ${layout.value.headerHeight}px;\r\n `\r\n );\r\n\r\n return {\r\n layoutStyle,\r\n siderStyle,\r\n rightStyle,\r\n rightContentStyle\r\n };\r\n}\r\n\r\nfunction useMenu() {\r\n const onMenuClick = (item: never) => {\r\n emits(\"onMenuClick\", item);\r\n };\r\n\r\n return {\r\n onMenuClick\r\n };\r\n}\r\n</script>\r\n\r\n<template>\r\n <a-layout :class=\"layoutStyle\">\r\n <a-layout-sider\r\n v-model:collapsed=\"layout.collapsed\"\r\n theme=\"light\"\r\n collapsible\r\n :trigger=\"null\"\r\n :class=\"siderStyle\"\r\n :width=\"layout.sideWidth\"\r\n >\r\n <div class=\"app-side\">\r\n <slot name=\"logo\"></slot>\r\n <d-menu @onMenuClick=\"onMenuClick\" />\r\n </div>\r\n </a-layout-sider>\r\n <a-layout :class=\"rightStyle\">\r\n <header-layout>\r\n <slot name=\"headerRight\"></slot>\r\n </header-layout>\r\n <a-layout-content :class=\"rightContentStyle\">\r\n <RouterContent />\r\n </a-layout-content>\r\n </a-layout>\r\n </a-layout>\r\n\r\n <SettingDrawer v-if=\"isSettings\" />\r\n <a-back-top></a-back-top>\r\n</template>\r\n\r\n<style scoped></style>\r\n"],"names":["layoutStyle","siderStyle","rightStyle","rightContentStyle","onMenuClick","_createVNode","_unref","_createElementVNode","_renderSlot","DMenu","HeaderLayout","RouterContent","_createBlock"],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import { defineComponent,
|
|
1
|
+
import { defineComponent, inject, computed, createVNode, ref } from 'vue';
|
|
2
2
|
import { useRoute, useRouter } from 'vue-router';
|
|
3
3
|
import { theme, Watermark, Flex, PageHeader } from 'ant-design-vue';
|
|
4
4
|
import { storeToRefs } from 'pinia';
|
|
5
5
|
import { useWindowScroll } from '@vueuse/core';
|
|
6
|
+
import { AppContextKey } from './AppContext.mjs';
|
|
6
7
|
import { LeftOutlined } from '@ant-design/icons-vue';
|
|
7
8
|
import { useAppStore, useNavTabStore } from '@ditari/store';
|
|
8
9
|
import { css } from '@emotion/css';
|
|
@@ -26,7 +27,11 @@ const show = /* @__PURE__ */ defineComponent({
|
|
|
26
27
|
const {
|
|
27
28
|
useToken
|
|
28
29
|
} = theme;
|
|
29
|
-
const
|
|
30
|
+
const appContext = inject(AppContextKey, null);
|
|
31
|
+
const watermarkContent = computed(() => {
|
|
32
|
+
var _a;
|
|
33
|
+
return (_a = appContext == null ? void 0 : appContext.watermarkContent) == null ? void 0 : _a.value.content;
|
|
34
|
+
});
|
|
30
35
|
const {
|
|
31
36
|
token
|
|
32
37
|
} = useToken();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Show.mjs","sources":["../../../../src/components/layout/Show.tsx"],"sourcesContent":["import {\r\n computed,\r\n ComputedRef,\r\n defineComponent,\r\n inject,\r\n ref\r\n} from \"vue\";\r\nimport { useRoute, useRouter } from \"vue-router\";\r\nimport {\r\n Flex,\r\n PageHeader,\r\n theme,\r\n Watermark\r\n} from \"ant-design-vue\";\r\nimport { storeToRefs } from \"pinia\";\r\nimport { useWindowScroll } from \"@vueuse/core\";\r\n\r\nimport { LeftOutlined } from \"@ant-design/icons-vue\";\r\nimport { useAppStore, useNavTabStore } from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\nimport type { GlobalToken } from \"ant-design-vue/es/theme/interface\";\r\n\r\nconst getProps = () => {\r\n return {\r\n close: {\r\n type: Boolean,\r\n default: false\r\n }\r\n };\r\n};\r\nconst show = defineComponent({\r\n name: \"DShowLayout\",\r\n props: getProps(),\r\n setup(props, { slots, expose }) {\r\n const { useToken } = theme;\r\n const
|
|
1
|
+
{"version":3,"file":"Show.mjs","sources":["../../../../src/components/layout/Show.tsx"],"sourcesContent":["import {\r\n computed,\r\n ComputedRef,\r\n defineComponent,\r\n inject,\r\n ref\r\n} from \"vue\";\r\nimport { useRoute, useRouter } from \"vue-router\";\r\nimport {\r\n Flex,\r\n PageHeader,\r\n theme,\r\n Watermark\r\n} from \"ant-design-vue\";\r\nimport { storeToRefs } from \"pinia\";\r\nimport { useWindowScroll } from \"@vueuse/core\";\r\n\r\nimport { AppContext, AppContextKey } from \"./AppContext\";\r\nimport { LeftOutlined } from \"@ant-design/icons-vue\";\r\nimport { useAppStore, useNavTabStore } from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\nimport type { GlobalToken } from \"ant-design-vue/es/theme/interface\";\r\n\r\nconst getProps = () => {\r\n return {\r\n close: {\r\n type: Boolean,\r\n default: false\r\n }\r\n };\r\n};\r\nconst show = defineComponent({\r\n name: \"DShowLayout\",\r\n props: getProps(),\r\n setup(props, { slots, expose }) {\r\n const { useToken } = theme;\r\n\r\n const appContext = inject<AppContext | null>(\r\n AppContextKey,\r\n null\r\n );\r\n\r\n const watermarkContent = computed(\r\n () => appContext?.watermarkContent?.value.content\r\n );\r\n\r\n const { token }: { token: ComputedRef<GlobalToken> } =\r\n useToken();\r\n\r\n const { layout, modeConfig, refresh } =\r\n storeToRefs(useAppStore());\r\n const { deleteTabs } = useNavTabStore();\r\n\r\n const route = useRoute();\r\n const router = useRouter();\r\n\r\n const { y } = useWindowScroll();\r\n\r\n const pageHeaderStyle = computed(\r\n () => css`\r\n position: sticky;\r\n top: ${layout.value.headerHeight}px;\r\n z-index: 10;\r\n padding: 0;\r\n transition: all 0.3s;\r\n background-color: ${token.value.colorBgLayout};\r\n\r\n ${y.value > 0\r\n ? \"box-shadow:0 10px 10px rgba(0, 0, 0, 0.15);\"\r\n : \"\"}\r\n .ant-page-header-back {\r\n height: 100%;\r\n margin-right: 0;\r\n\r\n .ant-page-header-back-button {\r\n height: 100%;\r\n padding: 0 6px !important;\r\n display: flex !important;\r\n align-items: center;\r\n justify-content: center;\r\n }\r\n }\r\n\r\n .ant-page-header-heading-title {\r\n font-size: 14px;\r\n }\r\n `\r\n );\r\n const contentStyle = computed(\r\n () => css`\r\n padding: 10px 10px\r\n ${slots.bottomFooter ? \"50px\" : \"0\"};\r\n background: ${token.value.colorBgLayout};\r\n `\r\n );\r\n const footerStyle = computed(\r\n () => css`\r\n position: fixed;\r\n right: 0;\r\n bottom: 0;\r\n height: 50px;\r\n left: ${layout.value.collapsed\r\n ? layout.value.collapsedWidth\r\n : layout.value.sideWidth}px;\r\n z-index: 10;\r\n padding: 10px;\r\n background: ${modeConfig.value.mode !== \"light\"\r\n ? token.value.colorBgContainer\r\n : \"#fff\"};\r\n box-shadow: 6px 0 10px rgba(0, 0, 0, 0.15);\r\n transition: left 0.4s\r\n cubic-bezier(0.22, 1.2, 0.36, 1);\r\n `\r\n );\r\n const pageTitle = () => (\r\n <div>{route.meta.title || \"无标题\"}</div>\r\n );\r\n const ghost = ref(false);\r\n\r\n const onBack = () => {\r\n if (props.close) {\r\n // 返回关闭标签\r\n deleteTabs(route.fullPath);\r\n router.go(-1);\r\n } else {\r\n // 不关闭标签\r\n router.go(-1);\r\n }\r\n };\r\n\r\n const onClosePage = () => {\r\n refresh.value = true;\r\n deleteTabs(route.fullPath);\r\n router.go(-1);\r\n };\r\n\r\n expose({\r\n close: onClosePage\r\n });\r\n\r\n return () => (\r\n <Watermark content={watermarkContent.value}>\r\n <Flex vertical={true}>\r\n <PageHeader\r\n ghost={ghost.value}\r\n class={pageHeaderStyle.value}\r\n onBack={() => onBack()}\r\n title={pageTitle()}\r\n >\r\n {{\r\n backIcon: () => (\r\n <div>\r\n <LeftOutlined\r\n style={{ fontSize: \"26px\" }}\r\n />\r\n </div>\r\n ),\r\n extra: () => slots.extra?.(),\r\n footer: () => slots.footer?.(),\r\n subTitle: () => slots.subTitle?.()\r\n }}\r\n </PageHeader>\r\n <div class={contentStyle.value}>\r\n {slots.default?.()}\r\n </div>\r\n {slots.bottomFooter ? (\r\n <div class={footerStyle.value}>\r\n {slots.bottomFooter?.()}\r\n </div>\r\n ) : null}\r\n </Flex>\r\n </Watermark>\r\n );\r\n }\r\n});\r\n\r\nexport default show;\r\n"],"names":["getProps","close","type","Boolean","default","show","defineComponent","name","props","setup","slots","expose","useToken","theme","appContext","inject","AppContextKey","watermarkContent","computed","value","content","token","layout","modeConfig","refresh","storeToRefs","useAppStore","deleteTabs","useNavTabStore","route","useRoute","router","useRouter","y","useWindowScroll","pageHeaderStyle","css","headerHeight","colorBgLayout","contentStyle","bottomFooter","footerStyle","collapsed","collapsedWidth","sideWidth","mode","colorBgContainer","pageTitle","_createVNode","meta","title","ghost","ref","onBack","fullPath","go","onClosePage","Watermark","Flex","PageHeader","backIcon","LeftOutlined","fontSize","extra","_a","footer","subTitle"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ThemeApp.vue2.mjs","sources":["../../../../../../src/components/layout/components/layout/ThemeApp.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { Ref, ref, watch } from \"vue\";\r\nimport { theme } from \"ant-design-vue\";\r\nimport { storeToRefs } from \"pinia\";\r\n\r\nimport { useAppStore } from \"@ditari/store\";\r\n\r\nconst props = defineProps({\n themeJson: { type: Object, required: false, default: () => ({}) }\n});\r\n\r\nconst { appTheme } = useTheme();\r\n\r\nfunction useTheme(): { appTheme: Ref<unknown> } {\r\n const { modeConfig, isCompact } =\r\n storeToRefs(useAppStore());\r\n const appTheme = ref<Record<string, unknown>>({});\r\n const { useToken } = theme;\r\n const { token } = useToken();\r\n\r\n watch(\r\n () => modeConfig.value.mode,\r\n () => {\r\n handleTheme();\r\n },\r\n { immediate: true }\r\n );\r\n\r\n watch(\r\n () => isCompact.value,\r\n () => {\r\n handleTheme();\r\n }\r\n );\r\n\r\n function handleTheme() {\r\n const isDarkMode =\r\n window.matchMedia &&\r\n window.matchMedia(\"(prefers-color-scheme: dark)\")\r\n .matches;\r\n switch (modeConfig.value.mode) {\r\n case \"light\":\r\n if (isCompact.value) {\r\n appTheme.value.algorithm = theme.compactAlgorithm;\r\n appTheme.value.token = {};\r\n } else {\r\n appTheme.value.algorithm = theme.defaultAlgorithm;\r\n appTheme.value.token = {};\r\n }\r\n break;\r\n case \"dark\":\r\n if (isCompact.value) {\r\n appTheme.value.token = props.themeJson;\r\n } else {\r\n appTheme.value.algorithm = theme.darkAlgorithm;\r\n appTheme.value.token = {};\r\n }\r\n break;\r\n case \"os\":\r\n if (isCompact.value && isDarkMode) {\r\n appTheme.value.token = props.themeJson;\r\n }\r\n break;\r\n }\r\n
|
|
1
|
+
{"version":3,"file":"ThemeApp.vue2.mjs","sources":["../../../../../../src/components/layout/components/layout/ThemeApp.vue"],"sourcesContent":["<script setup lang=\"ts\">\r\nimport { Ref, ref, watch } from \"vue\";\r\nimport { theme } from \"ant-design-vue\";\r\nimport { storeToRefs } from \"pinia\";\r\n\r\nimport { useAppStore } from \"@ditari/store\";\r\n\r\nconst props = defineProps({\n themeJson: { type: Object, required: false, default: () => ({}) }\n});\r\n\r\nconst { appTheme } = useTheme();\r\n\r\nfunction useTheme(): { appTheme: Ref<unknown> } {\r\n const { modeConfig, isCompact } =\r\n storeToRefs(useAppStore());\r\n const appTheme = ref<Record<string, unknown>>({});\r\n const { useToken } = theme;\r\n const { token } = useToken();\r\n\r\n watch(\r\n () => modeConfig.value.mode,\r\n () => {\r\n handleTheme();\r\n },\r\n { immediate: true }\r\n );\r\n\r\n watch(\r\n () => isCompact.value,\r\n () => {\r\n handleTheme();\r\n }\r\n );\r\n\r\n function handleTheme() {\r\n const isDarkMode =\r\n window.matchMedia &&\r\n window.matchMedia(\"(prefers-color-scheme: dark)\")\r\n .matches;\r\n switch (modeConfig.value.mode) {\r\n case \"light\":\r\n if (isCompact.value) {\r\n appTheme.value.algorithm = theme.compactAlgorithm;\r\n appTheme.value.token = {};\r\n } else {\r\n appTheme.value.algorithm = theme.defaultAlgorithm;\r\n appTheme.value.token = {};\r\n }\r\n break;\r\n case \"dark\":\r\n if (isCompact.value) {\r\n appTheme.value.token = props.themeJson;\r\n } else {\r\n appTheme.value.algorithm = theme.darkAlgorithm;\r\n appTheme.value.token = {};\r\n }\r\n break;\r\n case \"os\":\r\n if (isCompact.value && isDarkMode) {\r\n appTheme.value.token = props.themeJson;\r\n }\r\n break;\r\n }\r\n }\r\n\r\n return {\r\n appTheme\r\n };\r\n}\r\n</script>\r\n\r\n<template>\r\n <a-config-provider :theme=\"appTheme\">\r\n <slot></slot>\r\n </a-config-provider>\r\n</template>\r\n\r\n<style scoped></style>\r\n"],"names":["appTheme","_createBlock","_unref","_renderSlot"],"mappings":";;;;;;;;;;;;AAOA,IAAA,MAAM,KAAA,GAAQ,OAAA;AAId,IAAA,MAAM,EAAE,QAAA,EAAS,GAAI,QAAA,EAAS;AAE9B,IAAA,SAAS,QAAA,GAAuC;AAC9C,MAAA,MAAM,EAAE,UAAA,EAAY,SAAA,EAAU,GAC5B,WAAA,CAAY,aAAa,CAAA;AAC3B,MAAA,MAAMA,SAAAA,GAAW,GAAA,CAA6B,EAAE,CAAA;AAChD,MAAA,MAAM,EAAE,UAAS,GAAI,KAAA;AACrB,MAAA,MAAM,EAAE,KAAA,EAAM,GAAI,QAAA,EAAS;AAE3B,MAAA,KAAA;AAAA,QACE,MAAM,WAAW,KAAA,CAAM,IAAA;AAAA,QACvB,MAAM;AACJ,UAAA,WAAA,EAAY;AAAA,QACd,CAAA;AAAA,QACA,EAAE,WAAW,IAAA;AAAK,OACpB;AAEA,MAAA,KAAA;AAAA,QACE,MAAM,SAAA,CAAU,KAAA;AAAA,QAChB,MAAM;AACJ,UAAA,WAAA,EAAY;AAAA,QACd;AAAA,OACF;AAEA,MAAA,SAAS,WAAA,GAAc;AACrB,QAAA,MAAM,aACJ,MAAA,CAAO,UAAA,IACP,MAAA,CAAO,UAAA,CAAW,8BAA8B,CAAA,CAC7C,OAAA;AACL,QAAA,QAAQ,UAAA,CAAW,MAAM,IAAA;AAAM,UAC7B,KAAK,OAAA;AACH,YAAA,IAAI,UAAU,KAAA,EAAO;AACnB,cAAAA,SAAAA,CAAS,KAAA,CAAM,SAAA,GAAY,KAAA,CAAM,gBAAA;AACjC,cAAAA,SAAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,EAAC;AAAA,YAC1B,CAAA,MAAO;AACL,cAAAA,SAAAA,CAAS,KAAA,CAAM,SAAA,GAAY,KAAA,CAAM,gBAAA;AACjC,cAAAA,SAAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,EAAC;AAAA,YAC1B;AACA,YAAA;AAAA,UACF,KAAK,MAAA;AACH,YAAA,IAAI,UAAU,KAAA,EAAO;AACnB,cAAAA,SAAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,SAAA;AAAA,YAC/B,CAAA,MAAO;AACL,cAAAA,SAAAA,CAAS,KAAA,CAAM,SAAA,GAAY,KAAA,CAAM,aAAA;AACjC,cAAAA,SAAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,EAAC;AAAA,YAC1B;AACA,YAAA;AAAA,UACF,KAAK,IAAA;AACH,YAAA,IAAI,SAAA,CAAU,SAAS,UAAA,EAAY;AACjC,cAAAA,SAAAA,CAAS,KAAA,CAAM,KAAA,GAAQ,KAAA,CAAM,SAAA;AAAA,YAC/B;AACA,YAAA;AAAA;AACJ,MACF;AAEA,MAAA,OAAO;AAAA,QACL,QAAA,EAAAA;AAAA,OACF;AAAA,IACF;;;0BAIEC,WAAA,CAEoB,4BAAA,EAAA,EAFA,KAAA,EAAOC,KAAA,CAAA,QAAA,CAAA,EAAQ,EAAA;AAAA,yBACjC,MAAa;AAAA,UAAbC,UAAA,CAAa,IAAA,CAAA,MAAA,EAAA,SAAA;AAAA;;;;;;;;;;"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import { defineComponent,
|
|
1
|
+
import { defineComponent, inject, computed, watch, createVNode, resolveComponent } from 'vue';
|
|
2
2
|
import { useRoute, useRouter } from 'vue-router';
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
3
|
+
import { storeToRefs } from 'pinia';
|
|
4
|
+
import { AppContextKey } from '../../AppContext.mjs';
|
|
5
|
+
import { useAppStore, useMenuStore } from '@ditari/store';
|
|
5
6
|
import { css } from '@emotion/css';
|
|
6
7
|
import useMenuCore from '../../../../utils/useMenuCore.mjs';
|
|
7
8
|
|
|
@@ -32,39 +33,37 @@ var Menu = /* @__PURE__ */ defineComponent({
|
|
|
32
33
|
setup(_, {
|
|
33
34
|
emit
|
|
34
35
|
}) {
|
|
35
|
-
const
|
|
36
|
-
const
|
|
37
|
-
const
|
|
38
|
-
const
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
const selectedKeys = menuStore ? storeToRefs(menuStore).selectedKeys : defaultSelectedKeys;
|
|
67
|
-
const data = menuStore ? storeToRefs(menuStore).data : defaultData;
|
|
36
|
+
const appStore = useAppStore();
|
|
37
|
+
const menuStore = useMenuStore();
|
|
38
|
+
const appContext = inject(AppContextKey, null);
|
|
39
|
+
const renderMenuIcon = appContext == null ? void 0 : appContext.renderMenuIcon;
|
|
40
|
+
const {
|
|
41
|
+
layout,
|
|
42
|
+
modeConfig
|
|
43
|
+
} = storeToRefs(appStore);
|
|
44
|
+
const {
|
|
45
|
+
openKeys,
|
|
46
|
+
selectedKeys,
|
|
47
|
+
data
|
|
48
|
+
} = storeToRefs(menuStore);
|
|
49
|
+
const menuList = computed(() => {
|
|
50
|
+
const menuData = JSON.parse(JSON.stringify(data.value));
|
|
51
|
+
return renderIcon(menuData);
|
|
52
|
+
});
|
|
53
|
+
function renderIcon(data2) {
|
|
54
|
+
data2.forEach((item) => {
|
|
55
|
+
if (item.icon) {
|
|
56
|
+
const icon = item.icon;
|
|
57
|
+
item.icon = () => renderMenuIcon == null ? void 0 : renderMenuIcon({
|
|
58
|
+
icon
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (item.children && item.children.length) {
|
|
62
|
+
renderIcon(item.children);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
return data2;
|
|
66
|
+
}
|
|
68
67
|
const {
|
|
69
68
|
findMatchedMenuById,
|
|
70
69
|
findMenuItemByUrl
|
|
@@ -88,7 +87,7 @@ var Menu = /* @__PURE__ */ defineComponent({
|
|
|
88
87
|
|
|
89
88
|
${modeConfig.value.mode === "light" ? "background:transparent;" : ""}
|
|
90
89
|
/* Webkit 浏览器 */
|
|
91
|
-
|
|
90
|
+
::-webkit-scrollbar {
|
|
92
91
|
display: none;
|
|
93
92
|
}
|
|
94
93
|
}
|
|
@@ -165,15 +164,15 @@ var Menu = /* @__PURE__ */ defineComponent({
|
|
|
165
164
|
keyPath,
|
|
166
165
|
item
|
|
167
166
|
}) => {
|
|
168
|
-
var _a, _b, _c, _d
|
|
167
|
+
var _a, _b, _c, _d;
|
|
169
168
|
const rs = findMatchedMenuById(key, data.value);
|
|
170
|
-
if ((
|
|
169
|
+
if ((_a = item.originItemValue) == null ? void 0 : _a.isExternalLink) {
|
|
171
170
|
emit("onMenuClick", item);
|
|
172
171
|
} else {
|
|
173
172
|
openKeys.value = keyPath;
|
|
174
|
-
selectedKeys.value = [(
|
|
175
|
-
if (((
|
|
176
|
-
router.push((
|
|
173
|
+
selectedKeys.value = [(_b = rs.matchItem) == null ? void 0 : _b.key];
|
|
174
|
+
if (((_c = rs.matchItem) == null ? void 0 : _c.url) !== route.path) {
|
|
175
|
+
router.push((_d = rs.matchItem) == null ? void 0 : _d.url).then((r) => {
|
|
177
176
|
if (r) {
|
|
178
177
|
console.warn(r);
|
|
179
178
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Menu.mjs","sources":["../../../../../../src/components/layout/components/menu/Menu.tsx"],"sourcesContent":["import { computed, defineComponent, ref, watch } from \"vue\";\r\nimport { useRoute, useRouter } from \"vue-router\";\r\nimport { getActivePinia, storeToRefs } from \"pinia\";\r\n\r\nimport {\r\n useAppStore,\r\n useMenuStore,\r\n useNoStore\r\n} from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\n\r\nimport useMenuCore from \"../../../../utils/useMenuCore\";\r\n\r\nexport default defineComponent({\r\n name: \"DMenu\",\r\n emits: [\"onMenuClick\"],\r\n setup(_, { emit }) {\r\n // 检查 Pinia 是否可用\r\n const pinia = getActivePinia();\r\n const appStore = pinia ? useAppStore() : null;\r\n const menuStore = pinia ? useMenuStore() : null;\r\n const noStore = pinia ? useNoStore() : null;\r\n\r\n // 提供默认值当 Pinia 不可用时\r\n const defaultLayout = {\r\n sideWidth: 200,\r\n headerHeight: 44,\r\n collapsedWidth: 80,\r\n collapsed: false\r\n };\r\n\r\n const defaultModeConfig = {\r\n mode: \"light\",\r\n list: [\r\n { value: \"light\", label: \"亮色\" },\r\n { value: \"dark\", label: \"深色\" },\r\n { value: \"os\", label: \"跟随系统\" }\r\n ]\r\n };\r\n\r\n const defaultMenuList = ref<any[]>([]);\r\n const defaultOpenKeys = ref<string[]>([]);\r\n const defaultSelectedKeys = ref<string[]>([]);\r\n const defaultData = ref<any[]>([]);\r\n\r\n const layout = appStore ? storeToRefs(appStore).layout : ref(defaultLayout);\r\n const modeConfig = appStore ? storeToRefs(appStore).modeConfig : ref(defaultModeConfig);\r\n const menuList = noStore ? storeToRefs(noStore).menuList : defaultMenuList;\r\n const openKeys = menuStore ? storeToRefs(menuStore).openKeys : defaultOpenKeys;\r\n const selectedKeys = menuStore ? storeToRefs(menuStore).selectedKeys : defaultSelectedKeys;\r\n const data = menuStore ? storeToRefs(menuStore).data : defaultData;\r\n\r\n const { findMatchedMenuById, findMenuItemByUrl } =\r\n useMenuCore();\r\n const { menuWrapperStyle } = useStyle();\r\n const { onClick } = useMenu();\r\n\r\n function useStyle() {\r\n const menuWrapperStyle = computed(\r\n () => css`\r\n flex: 1;\r\n overflow: hidden;\r\n\r\n .ant-menu {\r\n height: 100%;\r\n overflow: scroll;\r\n -ms-overflow-style: none; /* 对 IE 和 Edge 生效 */\r\n scrollbar-width: none; /* 对 Firefox 生效 */\r\n\r\n ${modeConfig.value.mode === \"light\"\r\n ? \"background:transparent;\"\r\n : \"\"}\r\n /* Webkit 浏览器 */\r\n ::-webkit-scrollbar {\r\n display: none;\r\n }\r\n }\r\n `\r\n );\r\n return {\r\n menuWrapperStyle\r\n };\r\n }\r\n\r\n function useMenu() {\r\n const route = useRoute();\r\n const router = useRouter();\r\n\r\n /**\r\n * 根据URL路径查找最接近的父级菜单\r\n */\r\n const findClosestParentMenu = (\r\n url: string,\r\n menus: any[]\r\n ): any => {\r\n // 移除查询参数和哈希\r\n const cleanUrl = url.split(\"?\")[0].split(\"#\")[0];\r\n const pathSegments = cleanUrl\r\n .split(\"/\")\r\n .filter(Boolean);\r\n\r\n // 从最长路径开始尝试匹配\r\n for (let i = pathSegments.length; i > 0; i--) {\r\n const testPath =\r\n \"/\" + pathSegments.slice(0, i).join(\"/\");\r\n const foundItem = findMenuItemByUrl(\r\n testPath,\r\n menus\r\n );\r\n if (foundItem) return foundItem;\r\n }\r\n\r\n return null;\r\n };\r\n\r\n /**\r\n * 在标签切换的时候,路由会变化,需要动态关联左侧菜单的选中状态\r\n */\r\n watch(\r\n () => route.fullPath,\r\n async path => {\r\n const flag = selectedKeys.value.some(\r\n (item: string) => item === path\r\n );\r\n if (!flag) {\r\n let menuItem = findMenuItemByUrl(\r\n path,\r\n data.value\r\n );\r\n\r\n // 如果没有精确匹配,尝试匹配父级路径\r\n if (!menuItem) {\r\n menuItem = findClosestParentMenu(\r\n path,\r\n data.value\r\n );\r\n }\r\n\r\n if (!menuItem) {\r\n openKeys.value = [];\r\n selectedKeys.value = [path];\r\n } else {\r\n const rs = getFullParentChain(\r\n menuItem.id,\r\n data.value as never\r\n );\r\n if (!layout.value.collapsed) {\r\n openKeys.value = rs!;\r\n }\r\n selectedKeys.value = [menuItem.key];\r\n }\r\n }\r\n }\r\n );\r\n\r\n watch(\r\n () => layout.value.collapsed,\r\n val => {\r\n const id = selectedKeys.value[0];\r\n const rs = findMatchedMenuById(\r\n id,\r\n data.value as never\r\n );\r\n\r\n if (val) {\r\n openKeys.value = [];\r\n } else {\r\n if (rs?.parentItem) {\r\n openKeys.value = [rs.parentItem.key];\r\n } else {\r\n openKeys.value = [rs!.matchItem.key];\r\n }\r\n }\r\n }\r\n );\r\n\r\n /**\r\n * 获取从根到目标菜单项的完整 key 链\r\n * @param targetId 目标菜单项 id\r\n * @param menus 菜单数据\r\n * @param parentChain 递归传递的父级链\r\n */\r\n const getFullParentChain = (\r\n targetId: string,\r\n menus: any[],\r\n parentChain: string[] = []\r\n ): string[] | null => {\r\n for (const menu of menus) {\r\n // 找到目标项,返回完整链(包含自身 key)\r\n if (menu.id === targetId) {\r\n return [...parentChain, menu.key];\r\n }\r\n\r\n // 递归查找子菜单\r\n if (menu.children?.length) {\r\n const result = getFullParentChain(\r\n targetId,\r\n menu.children,\r\n [...parentChain, menu.key] // 传递当前层级的 key\r\n );\r\n if (result) return result;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const onClick = ({\r\n key,\r\n keyPath,\r\n item\r\n }: {\r\n item: { originItemValue: any };\r\n key: string;\r\n keyPath: string[];\r\n }) => {\r\n const rs = findMatchedMenuById(key, data.value);\r\n if (\r\n item.originItemValue?.isFrame &&\r\n item.originItemValue?.isFrame === \"0\"\r\n ) {\r\n emit(\"onMenuClick\", item);\r\n } else {\r\n openKeys.value = keyPath;\r\n selectedKeys.value = [rs.matchItem?.key];\r\n if (rs.matchItem?.url !== route.path) {\r\n // 判断目标路由和当前路由是否相等;\r\n // 不相等的时候再跳转\r\n router.push(rs.matchItem?.url).then(r => {\r\n if (r) {\r\n console.warn(r);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n return {\r\n openKeys,\r\n selectedKeys,\r\n data,\r\n onClick\r\n };\r\n }\r\n\r\n return () => (\r\n <div class={menuWrapperStyle.value}>\r\n <a-menu\r\n v-model:open-keys={openKeys.value}\r\n v-model:selected-keys={selectedKeys.value}\r\n items={menuList.value}\r\n mode=\"inline\"\r\n triggerSubMenuAction={\"hover\"}\r\n onClick={onClick}\r\n ></a-menu>\r\n </div>\r\n );\r\n }\r\n});\r\n"],"names":["name","emits","setup","_","emit","pinia","getActivePinia","appStore","useAppStore","menuStore","useMenuStore","noStore","useNoStore","defaultLayout","sideWidth","headerHeight","collapsedWidth","collapsed","defaultModeConfig","mode","list","value","label","defaultMenuList","ref","defaultOpenKeys","defaultSelectedKeys","defaultData","layout","storeToRefs","modeConfig","menuList","openKeys","selectedKeys","data","findMatchedMenuById","findMenuItemByUrl","useMenuCore","menuWrapperStyle","useStyle","onClick","useMenu","computed","css","route","useRoute","router","useRouter","findClosestParentMenu","url","menus","cleanUrl","split","pathSegments","filter","Boolean","i","length","testPath","slice","join","foundItem","watch","fullPath","path","flag","some","item","menuItem","rs","getFullParentChain","id","key","val","parentItem","matchItem","targetId","parentChain","menu","children","result","keyPath","originItemValue","isFrame","push","then","r","console","warn","_createVNode","_resolveComponent","$event"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Menu.mjs","sources":["../../../../../../src/components/layout/components/menu/Menu.tsx"],"sourcesContent":["import {\r\n computed,\r\n defineComponent,\r\n inject,\r\n watch\r\n} from \"vue\";\r\nimport { useRoute, useRouter } from \"vue-router\";\r\nimport { storeToRefs } from \"pinia\";\r\n\r\nimport {\r\n AppContext,\r\n AppContextKey\r\n} from \"../../AppContext\";\r\nimport { useAppStore, useMenuStore } from \"@ditari/store\";\r\nimport { css } from \"@emotion/css\";\r\n\r\nimport useMenuCore from \"../../../../utils/useMenuCore\";\r\n\r\nexport default defineComponent({\r\n name: \"DMenu\",\r\n emits: [\"onMenuClick\"],\r\n setup(_, { emit }) {\r\n // ⭐️ 修复:直接调用 Store 函数,Pinia 内部机制会处理实例缺失时的行为\r\n const appStore = useAppStore();\r\n const menuStore = useMenuStore();\r\n\r\n const appContext = inject<AppContext | null>(\r\n AppContextKey,\r\n null\r\n );\r\n\r\n const renderMenuIcon = appContext?.renderMenuIcon;\r\n\r\n const { layout, modeConfig } = storeToRefs(appStore);\r\n\r\n const { openKeys, selectedKeys, data } =\r\n storeToRefs(menuStore);\r\n\r\n const menuList = computed(() => {\r\n const menuData = JSON.parse(\r\n JSON.stringify(data.value)\r\n );\r\n return renderIcon(menuData);\r\n });\r\n\r\n function renderIcon(data: []) {\r\n // 需要递归处理\r\n data.forEach(\r\n (item: {\r\n name: string;\r\n icon: unknown;\r\n children: [];\r\n }) => {\r\n if (item.icon) {\r\n const icon = item.icon;\r\n item.icon = () =>\r\n renderMenuIcon?.({ icon } as {\r\n icon: string;\r\n });\r\n }\r\n if (item.children && item.children.length) {\r\n renderIcon(item.children);\r\n }\r\n }\r\n );\r\n return data;\r\n }\r\n\r\n const { findMatchedMenuById, findMenuItemByUrl } =\r\n useMenuCore();\r\n const { menuWrapperStyle } = useStyle();\r\n const { onClick } = useMenu();\r\n\r\n function useStyle() {\r\n const menuWrapperStyle = computed(\r\n () => css`\r\n flex: 1;\r\n overflow: hidden;\r\n\r\n .ant-menu {\r\n height: 100%;\r\n overflow: scroll;\r\n -ms-overflow-style: none; /* 对 IE 和 Edge 生效 */\r\n scrollbar-width: none; /* 对 Firefox 生效 */\r\n\r\n ${modeConfig.value.mode === \"light\"\r\n ? \"background:transparent;\"\r\n : \"\"}\r\n /* Webkit 浏览器 */\r\n ::-webkit-scrollbar {\r\n display: none;\r\n }\r\n }\r\n `\r\n );\r\n return {\r\n menuWrapperStyle\r\n };\r\n }\r\n\r\n function useMenu() {\r\n const route = useRoute();\r\n const router = useRouter();\r\n\r\n /**\r\n * 根据URL路径查找最接近的父级菜单\r\n */\r\n const findClosestParentMenu = (\r\n url: string,\r\n menus: any[]\r\n ): any => {\r\n // 移除查询参数和哈希\r\n const cleanUrl = url.split(\"?\")[0].split(\"#\")[0];\r\n const pathSegments = cleanUrl\r\n .split(\"/\")\r\n .filter(Boolean);\r\n\r\n // 从最长路径开始尝试匹配\r\n for (let i = pathSegments.length; i > 0; i--) {\r\n const testPath =\r\n \"/\" + pathSegments.slice(0, i).join(\"/\");\r\n const foundItem = findMenuItemByUrl(\r\n testPath,\r\n menus\r\n );\r\n if (foundItem) return foundItem;\r\n }\r\n\r\n return null;\r\n };\r\n\r\n /**\r\n * 在标签切换的时候,路由会变化,需要动态关联左侧菜单的选中状态\r\n */\r\n watch(\r\n () => route.fullPath,\r\n async path => {\r\n const flag = selectedKeys.value.some(\r\n (item: string) => item === path\r\n );\r\n if (!flag) {\r\n let menuItem = findMenuItemByUrl(\r\n path,\r\n data.value\r\n );\r\n\r\n // 如果没有精确匹配,尝试匹配父级路径\r\n if (!menuItem) {\r\n menuItem = findClosestParentMenu(\r\n path,\r\n data.value\r\n );\r\n }\r\n\r\n if (!menuItem) {\r\n openKeys.value = [];\r\n selectedKeys.value = [path];\r\n } else {\r\n const rs = getFullParentChain(\r\n menuItem.id,\r\n data.value as never\r\n );\r\n if (!layout.value.collapsed) {\r\n openKeys.value = rs!;\r\n }\r\n selectedKeys.value = [menuItem.key];\r\n }\r\n }\r\n }\r\n );\r\n\r\n watch(\r\n () => layout.value.collapsed,\r\n val => {\r\n const id = selectedKeys.value[0];\r\n const rs = findMatchedMenuById(\r\n id,\r\n data.value as never\r\n );\r\n\r\n if (val) {\r\n openKeys.value = [];\r\n } else {\r\n if (rs?.parentItem) {\r\n openKeys.value = [rs.parentItem.key];\r\n } else {\r\n openKeys.value = [rs!.matchItem.key];\r\n }\r\n }\r\n }\r\n );\r\n\r\n /**\r\n * 获取从根到目标菜单项的完整 key 链\r\n * @param targetId 目标菜单项 id\r\n * @param menus 菜单数据\r\n * @param parentChain 递归传递的父级链\r\n */\r\n const getFullParentChain = (\r\n targetId: string,\r\n menus: any[],\r\n parentChain: string[] = []\r\n ): string[] | null => {\r\n for (const menu of menus) {\r\n // 找到目标项,返回完整链(包含自身 key)\r\n if (menu.id === targetId) {\r\n return [...parentChain, menu.key];\r\n }\r\n\r\n // 递归查找子菜单\r\n if (menu.children?.length) {\r\n const result = getFullParentChain(\r\n targetId,\r\n menu.children,\r\n [...parentChain, menu.key] // 传递当前层级的 key\r\n );\r\n if (result) return result;\r\n }\r\n }\r\n return null;\r\n };\r\n\r\n const onClick = ({\r\n key,\r\n keyPath,\r\n item\r\n }: {\r\n item: { originItemValue: any };\r\n key: string;\r\n keyPath: string[];\r\n }) => {\r\n const rs = findMatchedMenuById(key, data.value);\r\n if (item.originItemValue?.isExternalLink) {\r\n emit(\"onMenuClick\", item);\r\n } else {\r\n openKeys.value = keyPath;\r\n selectedKeys.value = [rs.matchItem?.key];\r\n if (rs.matchItem?.url !== route.path) {\r\n // 判断目标路由和当前路由是否相等;\r\n // 不相等的时候再跳转\r\n router.push(rs.matchItem?.url).then(r => {\r\n if (r) {\r\n console.warn(r);\r\n }\r\n });\r\n }\r\n }\r\n };\r\n\r\n return {\r\n openKeys,\r\n selectedKeys,\r\n data,\r\n onClick\r\n };\r\n }\r\n\r\n return () => (\r\n <div class={menuWrapperStyle.value}>\r\n <a-menu\r\n v-model:open-keys={openKeys.value}\r\n v-model:selected-keys={selectedKeys.value}\r\n items={menuList.value}\r\n mode=\"inline\"\r\n triggerSubMenuAction={\"hover\"}\r\n onClick={onClick}\r\n ></a-menu>\r\n </div>\r\n );\r\n }\r\n});\r\n"],"names":["name","emits","setup","_","emit","appStore","useAppStore","menuStore","useMenuStore","appContext","inject","AppContextKey","renderMenuIcon","layout","modeConfig","storeToRefs","openKeys","selectedKeys","data","menuList","computed","menuData","JSON","parse","stringify","value","renderIcon","forEach","item","icon","children","length","findMatchedMenuById","findMenuItemByUrl","useMenuCore","menuWrapperStyle","useStyle","onClick","useMenu","css","mode","route","useRoute","router","useRouter","findClosestParentMenu","url","menus","cleanUrl","split","pathSegments","filter","Boolean","i","testPath","slice","join","foundItem","watch","fullPath","path","flag","some","menuItem","rs","getFullParentChain","id","collapsed","key","val","parentItem","matchItem","targetId","parentChain","menu","result","keyPath","originItemValue","isExternalLink","push","then","r","console","warn","_createVNode","_resolveComponent","$event"],"mappings":"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"}
|