@jetlinks-web/components 2.0.1 → 2.0.2-1

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.
@@ -1,49 +1,49 @@
1
- import type { VNodeChild, CSSProperties, HTMLAttributes } from 'vue';
2
- import type { Theme } from '../typings';
3
-
4
- export type {
5
- MenuMode,
6
- MenuTheme,
7
- } from 'ant-design-vue/lib/menu/src/interface';
8
-
9
- export interface MenuInfo {
10
- key: string | number;
11
- keyPath: string[] | number[];
12
- item: VNodeChild;
13
- domEvent: MouseEvent;
14
- }
15
-
16
- export interface SelectInfo extends MenuInfo {
17
- selectedKeys: string[];
18
- }
19
-
20
- export type OpenEventHandler = (
21
- keys:
22
- | string[]
23
- | {
24
- key: string;
25
- item: VNodeChild;
26
- trigger: string;
27
- open: boolean;
28
- },
29
- ) => void;
30
-
31
- export type SiderTheme = Theme;
32
-
33
- export type CollapseType = 'clickTrigger' | 'responsive';
34
-
35
- export interface SiderProps extends HTMLAttributes {
36
- prefixCls?: string;
37
- collapsible?: boolean;
38
- collapsed?: boolean;
39
- defaultCollapsed?: boolean;
40
- reverseArrow?: boolean;
41
- onCollapse?: (collapsed: boolean, type: CollapseType) => void;
42
- zeroWidthTriggerStyle?: CSSProperties;
43
- trigger?: VNodeChild | JSX.Element;
44
- width?: number | string;
45
- collapsedWidth?: number | string;
46
- breakpoint?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
47
- theme?: SiderTheme;
48
- onBreakpoint?: (broken: boolean) => void;
49
- }
1
+ import type { VNodeChild, CSSProperties, HTMLAttributes } from 'vue';
2
+ import type { Theme } from '../typings';
3
+
4
+ export type {
5
+ MenuMode,
6
+ MenuTheme,
7
+ } from 'ant-design-vue/es/menu/src/interface';
8
+
9
+ export interface MenuInfo {
10
+ key: string | number;
11
+ keyPath: string[] | number[];
12
+ item: VNodeChild;
13
+ domEvent: MouseEvent;
14
+ }
15
+
16
+ export interface SelectInfo extends MenuInfo {
17
+ selectedKeys: string[];
18
+ }
19
+
20
+ export type OpenEventHandler = (
21
+ keys:
22
+ | string[]
23
+ | {
24
+ key: string;
25
+ item: VNodeChild;
26
+ trigger: string;
27
+ open: boolean;
28
+ },
29
+ ) => void;
30
+
31
+ export type SiderTheme = Theme;
32
+
33
+ export type CollapseType = 'clickTrigger' | 'responsive';
34
+
35
+ export interface SiderProps extends HTMLAttributes {
36
+ prefixCls?: string;
37
+ collapsible?: boolean;
38
+ collapsed?: boolean;
39
+ defaultCollapsed?: boolean;
40
+ reverseArrow?: boolean;
41
+ onCollapse?: (collapsed: boolean, type: CollapseType) => void;
42
+ zeroWidthTriggerStyle?: CSSProperties;
43
+ trigger?: VNodeChild | JSX.Element;
44
+ width?: number | string;
45
+ collapsedWidth?: number | string;
46
+ breakpoint?: 'xs' | 'sm' | 'md' | 'lg' | 'xl' | 'xxl';
47
+ theme?: SiderTheme;
48
+ onBreakpoint?: (broken: boolean) => void;
49
+ }
@@ -1,210 +1,210 @@
1
- import { computed, ref } from 'vue';
2
- import type { RouteRecordRaw } from 'vue-router';
3
- import { default as ResizeObserver } from 'ant-design-vue/lib/vc-resize-observer';
4
- import type { VueNode } from 'ant-design-vue/lib/_util/type';
5
- import type { SiderMenuProps } from '../SiderMenu/SiderMenu';
6
- import {
7
- defaultRenderLogoAndTitle,
8
- siderMenuProps,
9
- } from '../SiderMenu/SiderMenu';
10
- import PropTypes from 'ant-design-vue/lib/_util/vue-types';
11
- import type {
12
- MenuDataItem,
13
- ProProps,
14
- RightContentRender,
15
- WithFalse,
16
- Theme,
17
- } from '../typings';
18
- import { defaultSettingProps } from '../defaultSettings';
19
- import type { PropType, FunctionalComponent, ExtractPropTypes } from 'vue';
20
- import { defaultPrefixCls, useRouteContext } from '../RouteContext';
21
- import BaseMenu from '../SiderMenu/BaseMenu';
22
- import { clearMenuItem } from '../util';
23
-
24
- export const baseHeaderProps = {
25
- ...defaultSettingProps,
26
- prefixCls: PropTypes.string.def('ant-pro'),
27
- collapsed: PropTypes.looseBool,
28
- logo: siderMenuProps.logo,
29
- logoStyle: siderMenuProps.logoStyle,
30
- headerTheme: {
31
- type: String as PropType<Theme>,
32
- default: 'dark',
33
- },
34
- menuData: {
35
- type: Array as PropType<MenuDataItem[]>,
36
- default: () => [],
37
- },
38
- splitMenus: siderMenuProps.splitMenus,
39
- menuRender: {
40
- type: [Object, Function] as PropType<
41
- WithFalse<
42
- (
43
- props: ProProps /* HeaderViewProps */,
44
- defaultDom: VueNode,
45
- ) => VueNode
46
- >
47
- >,
48
- default: () => undefined,
49
- },
50
- menuHeaderRender: siderMenuProps.menuHeaderRender,
51
- menuItemRender: siderMenuProps.menuItemRender,
52
- subMenuItemRender: siderMenuProps.subMenuItemRender,
53
- rightContentRender: {
54
- type: [Object, Function] as PropType<RightContentRender>,
55
- default: () => undefined,
56
- },
57
- collapsedButtonRender: siderMenuProps.collapsedButtonRender,
58
- matchMenuKeys: siderMenuProps.matchMenuKeys,
59
-
60
- // events
61
- onMenuHeaderClick: PropTypes.func,
62
- onCollapse: siderMenuProps.onCollapse,
63
- onOpenKeys: siderMenuProps.onOpenKeys,
64
- onSelect: siderMenuProps.onSelect,
65
- };
66
-
67
- export type BaseHeaderPropsType = ExtractPropTypes<typeof baseHeaderProps>;
68
-
69
- export const topNavHeaderProps = { ...siderMenuProps, ...baseHeaderProps };
70
-
71
- export type TopNavHeaderProps = Partial<
72
- ExtractPropTypes<typeof topNavHeaderProps>
73
- > &
74
- Partial<SiderMenuProps>;
75
-
76
- const RightContent: FunctionalComponent<TopNavHeaderProps> = ({
77
- rightContentRender,
78
- ...props
79
- }) => {
80
- const rightSize = ref<number | string>('auto');
81
-
82
- return (
83
- <div
84
- style={{
85
- minWidth: rightSize.value,
86
- }}
87
- >
88
- <div
89
- style={{
90
- paddingRight: 8,
91
- }}
92
- >
93
- <ResizeObserver
94
- onResize={({ width }: { width: number }) => {
95
- rightSize.value = width;
96
- }}
97
- >
98
- {rightContentRender &&
99
- typeof rightContentRender === 'function' ? (
100
- <div>
101
- {rightContentRender({
102
- ...props,
103
- })}
104
- </div>
105
- ) : (
106
- rightContentRender
107
- )}
108
- </ResizeObserver>
109
- </div>
110
- </div>
111
- );
112
- };
113
-
114
- export const TopNavHeader: FunctionalComponent<TopNavHeaderProps> = (props) => {
115
- const headerRef = ref();
116
- const {
117
- prefixCls: propPrefixCls,
118
- onMenuHeaderClick,
119
- onOpenKeys,
120
- onSelect,
121
- contentWidth,
122
- rightContentRender,
123
- layout,
124
- menuData,
125
- mode,
126
- } = props;
127
- const context = useRouteContext();
128
- const prefixCls = `${propPrefixCls || defaultPrefixCls}-top-nav-header`;
129
- const headerDom = defaultRenderLogoAndTitle(
130
- { ...props, collapsed: false } as SiderMenuProps,
131
- // REMARK:: Any time render header title
132
- // layout === 'mix' ? 'headerTitleRender' : undefined,
133
- // layout !== 'side' ? 'headerTitleRender' : undefined,
134
- 'headerTitleRender',
135
- );
136
- //
137
- let MenusData = props.layout === 'side' ? [] : menuData;
138
- if (props.layout === 'mix' && props.splitMenus) {
139
- const noChildrenMenuData = (menuData || []).map((item) => ({
140
- ...item,
141
- children: undefined,
142
- component: undefined,
143
- })) as RouteRecordRaw[];
144
- MenusData = clearMenuItem(noChildrenMenuData);
145
- }
146
-
147
- const _mode = computed(() =>
148
- props.layout === 'mix' && props.splitMenus ? 'horizontal' : mode,
149
- );
150
-
151
- const className = computed(() => {
152
- return {
153
- [prefixCls]: true,
154
- light: props.theme === 'light',
155
- dark: props.theme === 'dark',
156
- };
157
- });
158
-
159
- return (
160
- <div class={className.value}>
161
- <div
162
- ref={headerRef}
163
- class={`${prefixCls}-main ${
164
- contentWidth === 'Fixed' ? 'wide' : ''
165
- }`}
166
- >
167
- {headerDom && (
168
- <div
169
- class={`${prefixCls}-main-left`}
170
- onClick={onMenuHeaderClick}
171
- >
172
- <div class={`${prefixCls}-logo`} key="logo" id="logo">
173
- {headerDom}
174
- </div>
175
- </div>
176
- )}
177
- <div style={{ flex: 1 }} class={`${prefixCls}-menu`}>
178
- <BaseMenu
179
- prefixCls={propPrefixCls}
180
- locale={props.locale || context.locale}
181
- theme={props.theme}
182
- mode={_mode.value}
183
- collapsed={props.collapsed}
184
- iconfontUrl={props.iconfontUrl}
185
- menuData={MenusData}
186
- menuItemRender={props.menuItemRender}
187
- subMenuItemRender={props.subMenuItemRender}
188
- openKeys={context.openKeys}
189
- selectedKeys={context.selectedKeys}
190
- class={{
191
- 'top-nav-menu': props.mode === 'horizontal',
192
- }}
193
- {...{
194
- 'onUpdate:openKeys': ($event: string[]) =>
195
- onOpenKeys && onOpenKeys($event),
196
- 'onUpdate:selectedKeys': ($event: string[]) =>
197
- onSelect && onSelect($event),
198
- }}
199
- />
200
- </div>
201
- {rightContentRender && (
202
- <RightContent
203
- rightContentRender={rightContentRender}
204
- {...props}
205
- />
206
- )}
207
- </div>
208
- </div>
209
- );
210
- };
1
+ import { computed, ref } from 'vue';
2
+ import type { RouteRecordRaw } from 'vue-router';
3
+ import { default as ResizeObserver } from 'ant-design-vue/es/vc-resize-observer';
4
+ import type { VueNode } from 'ant-design-vue/es/_util/type';
5
+ import type { SiderMenuProps } from '../SiderMenu/SiderMenu';
6
+ import {
7
+ defaultRenderLogoAndTitle,
8
+ siderMenuProps,
9
+ } from '../SiderMenu/SiderMenu';
10
+ import PropTypes from 'ant-design-vue/es/_util/vue-types';
11
+ import type {
12
+ MenuDataItem,
13
+ ProProps,
14
+ RightContentRender,
15
+ WithFalse,
16
+ Theme,
17
+ } from '../typings';
18
+ import { defaultSettingProps } from '../defaultSettings';
19
+ import type { PropType, FunctionalComponent, ExtractPropTypes } from 'vue';
20
+ import { defaultPrefixCls, useRouteContext } from '../RouteContext';
21
+ import BaseMenu from '../SiderMenu/BaseMenu';
22
+ import { clearMenuItem } from '../util';
23
+
24
+ export const baseHeaderProps = {
25
+ ...defaultSettingProps,
26
+ prefixCls: PropTypes.string.def('ant-pro'),
27
+ collapsed: PropTypes.looseBool,
28
+ logo: siderMenuProps.logo,
29
+ logoStyle: siderMenuProps.logoStyle,
30
+ headerTheme: {
31
+ type: String as PropType<Theme>,
32
+ default: 'dark',
33
+ },
34
+ menuData: {
35
+ type: Array as PropType<MenuDataItem[]>,
36
+ default: () => [],
37
+ },
38
+ splitMenus: siderMenuProps.splitMenus,
39
+ menuRender: {
40
+ type: [Object, Function] as PropType<
41
+ WithFalse<
42
+ (
43
+ props: ProProps /* HeaderViewProps */,
44
+ defaultDom: VueNode,
45
+ ) => VueNode
46
+ >
47
+ >,
48
+ default: () => undefined,
49
+ },
50
+ menuHeaderRender: siderMenuProps.menuHeaderRender,
51
+ menuItemRender: siderMenuProps.menuItemRender,
52
+ subMenuItemRender: siderMenuProps.subMenuItemRender,
53
+ rightContentRender: {
54
+ type: [Object, Function] as PropType<RightContentRender>,
55
+ default: () => undefined,
56
+ },
57
+ collapsedButtonRender: siderMenuProps.collapsedButtonRender,
58
+ matchMenuKeys: siderMenuProps.matchMenuKeys,
59
+
60
+ // events
61
+ onMenuHeaderClick: PropTypes.func,
62
+ onCollapse: siderMenuProps.onCollapse,
63
+ onOpenKeys: siderMenuProps.onOpenKeys,
64
+ onSelect: siderMenuProps.onSelect,
65
+ };
66
+
67
+ export type BaseHeaderPropsType = ExtractPropTypes<typeof baseHeaderProps>;
68
+
69
+ export const topNavHeaderProps = { ...siderMenuProps, ...baseHeaderProps };
70
+
71
+ export type TopNavHeaderProps = Partial<
72
+ ExtractPropTypes<typeof topNavHeaderProps>
73
+ > &
74
+ Partial<SiderMenuProps>;
75
+
76
+ const RightContent: FunctionalComponent<TopNavHeaderProps> = ({
77
+ rightContentRender,
78
+ ...props
79
+ }) => {
80
+ const rightSize = ref<number | string>('auto');
81
+
82
+ return (
83
+ <div
84
+ style={{
85
+ minWidth: rightSize.value,
86
+ }}
87
+ >
88
+ <div
89
+ style={{
90
+ paddingRight: 8,
91
+ }}
92
+ >
93
+ <ResizeObserver
94
+ onResize={({ width }: { width: number }) => {
95
+ rightSize.value = width;
96
+ }}
97
+ >
98
+ {rightContentRender &&
99
+ typeof rightContentRender === 'function' ? (
100
+ <div>
101
+ {rightContentRender({
102
+ ...props,
103
+ })}
104
+ </div>
105
+ ) : (
106
+ rightContentRender
107
+ )}
108
+ </ResizeObserver>
109
+ </div>
110
+ </div>
111
+ );
112
+ };
113
+
114
+ export const TopNavHeader: FunctionalComponent<TopNavHeaderProps> = (props) => {
115
+ const headerRef = ref();
116
+ const {
117
+ prefixCls: propPrefixCls,
118
+ onMenuHeaderClick,
119
+ onOpenKeys,
120
+ onSelect,
121
+ contentWidth,
122
+ rightContentRender,
123
+ layout,
124
+ menuData,
125
+ mode,
126
+ } = props;
127
+ const context = useRouteContext();
128
+ const prefixCls = `${propPrefixCls || defaultPrefixCls}-top-nav-header`;
129
+ const headerDom = defaultRenderLogoAndTitle(
130
+ { ...props, collapsed: false } as SiderMenuProps,
131
+ // REMARK:: Any time render header title
132
+ // layout === 'mix' ? 'headerTitleRender' : undefined,
133
+ // layout !== 'side' ? 'headerTitleRender' : undefined,
134
+ 'headerTitleRender',
135
+ );
136
+ //
137
+ let MenusData = props.layout === 'side' ? [] : menuData;
138
+ if (props.layout === 'mix' && props.splitMenus) {
139
+ const noChildrenMenuData = (menuData || []).map((item) => ({
140
+ ...item,
141
+ children: undefined,
142
+ component: undefined,
143
+ })) as RouteRecordRaw[];
144
+ MenusData = clearMenuItem(noChildrenMenuData);
145
+ }
146
+
147
+ const _mode = computed(() =>
148
+ props.layout === 'mix' && props.splitMenus ? 'horizontal' : mode,
149
+ );
150
+
151
+ const className = computed(() => {
152
+ return {
153
+ [prefixCls]: true,
154
+ light: props.theme === 'light',
155
+ dark: props.theme === 'dark',
156
+ };
157
+ });
158
+
159
+ return (
160
+ <div class={className.value}>
161
+ <div
162
+ ref={headerRef}
163
+ class={`${prefixCls}-main ${
164
+ contentWidth === 'Fixed' ? 'wide' : ''
165
+ }`}
166
+ >
167
+ {headerDom && (
168
+ <div
169
+ class={`${prefixCls}-main-left`}
170
+ onClick={onMenuHeaderClick}
171
+ >
172
+ <div class={`${prefixCls}-logo`} key="logo" id="logo">
173
+ {headerDom}
174
+ </div>
175
+ </div>
176
+ )}
177
+ <div style={{ flex: 1 }} class={`${prefixCls}-menu`}>
178
+ <BaseMenu
179
+ prefixCls={propPrefixCls}
180
+ locale={props.locale || context.locale}
181
+ theme={props.theme}
182
+ mode={_mode.value}
183
+ collapsed={props.collapsed}
184
+ iconfontUrl={props.iconfontUrl}
185
+ menuData={MenusData}
186
+ menuItemRender={props.menuItemRender}
187
+ subMenuItemRender={props.subMenuItemRender}
188
+ openKeys={context.openKeys}
189
+ selectedKeys={context.selectedKeys}
190
+ class={{
191
+ 'top-nav-menu': props.mode === 'horizontal',
192
+ }}
193
+ {...{
194
+ 'onUpdate:openKeys': ($event: string[]) =>
195
+ onOpenKeys && onOpenKeys($event),
196
+ 'onUpdate:selectedKeys': ($event: string[]) =>
197
+ onSelect && onSelect($event),
198
+ }}
199
+ />
200
+ </div>
201
+ {rightContentRender && (
202
+ <RightContent
203
+ rightContentRender={rightContentRender}
204
+ {...props}
205
+ />
206
+ )}
207
+ </div>
208
+ </div>
209
+ );
210
+ };