inl-ui 0.0.30 → 0.0.32

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,672 +0,0 @@
1
- import { defineComponent, createVNode, ref, watch, resolveComponent, isVNode, computed, inject, withDirectives, vShow } from 'vue';
2
- import { createFromIconfontCN, SearchOutlined, LeftOutlined, CloseOutlined, RightOutlined, MenuUnfoldOutlined, MenuFoldOutlined } from '@ant-design/icons-vue';
3
- import { useMounted, useThrottleFn, useVModel, watchArray, useToggle } from '@vueuse/core';
4
- import { Menu, MenuItem, Input, Badge, Avatar, SubMenu, Dropdown, Layout as Layout$1, LayoutHeader, LayoutSider, LayoutContent } from 'ant-design-vue';
5
- import { useRoute, useRouter } from 'vue-router';
6
- import _, { differenceBy } from 'lodash';
7
- import { loadMicroApp } from 'qiankun';
8
- import appList from '@/micro-apps/apps';
9
-
10
- const config = {
11
- prefix: "inl",
12
- requestOmitParams: ["createDt", "createUser", "updateDt", "updateUser"]
13
- };
14
-
15
- const {
16
- prefix
17
- } = config;
18
- function installComponent(component, name, withPrefix = true) {
19
- component.install = app => {
20
- name = withPrefix ? `${prefix}-${name}` : name;
21
- app.component(name, component);
22
- };
23
- return component;
24
- }
25
-
26
- const Demo = defineComponent({
27
- props: {
28
- name: {
29
- type: String,
30
- default: "\u5F20\u4E09"
31
- }
32
- },
33
- setup(props) {
34
- return () => createVNode("div", {
35
- "class": "Demo"
36
- }, ["\u6211\u662Fdemo, ", props.name]);
37
- }
38
- });
39
- var index$2 = installComponent(Demo, "demo");
40
-
41
- const IconFont = createFromIconfontCN();
42
- var index$1 = installComponent(IconFont, "icon-font", false);
43
-
44
- function getMenuByKeyPath(menuList, keyPath, keyProp = "id") {
45
- function getMenuByKey2(list2, key) {
46
- return list2.find(item => item[keyProp] && item[keyProp] === key);
47
- }
48
- let list = menuList;
49
- for (let i = 0; i < keyPath.length; i++) {
50
- const menu = getMenuByKey2(list, keyPath[i]);
51
- if (!menu) return;
52
- if (i === keyPath.length - 1) {
53
- return menu;
54
- }
55
- list = menu.subList;
56
- }
57
- }
58
- function flattenMenu(menuList) {
59
- const res = [];
60
- for (const menu of menuList) {
61
- res.push(menu);
62
- res.push(...menu.subList);
63
- }
64
- return res;
65
- }
66
- function getMenuByKey(menuList, key, propName = "id") {
67
- const flattenMenuList = flattenMenu(menuList);
68
- return flattenMenuList.find(item => item[propName] && item[propName] === key);
69
- }
70
- function getNavByChildKey(navList, key, propName = "id") {
71
- for (const nav of navList) {
72
- const menu = getMenuByKey(nav.subList, key, propName);
73
- if (menu) {
74
- return nav;
75
- }
76
- }
77
- }
78
-
79
- function useActiveMenu(menuList, extraPages, isNav = false, watchOnce = false) {
80
- const route = useRoute();
81
- const isMounted = useMounted();
82
- const menu = ref();
83
- const unwatch = watch([menuList, isMounted, route], _.debounce(([list]) => {
84
- if (list.length && isMounted) {
85
- watchOnce && unwatch();
86
- const {
87
- query,
88
- path
89
- } = route;
90
- const id = "" + query.iframeId;
91
- if (query.iframeId) {
92
- menu.value = isNav ? getNavByChildKey(list, id, "id") : getMenuByKey(list, id, "id");
93
- } else if (query.extraPageKey) {
94
- const page = extraPages.find(item => item.key === query.extraPageKey);
95
- menu.value = page;
96
- } else if (path !== "/") {
97
- menu.value = isNav ? getNavByChildKey(list, path, "url") : getMenuByKey(list, path, "url");
98
- } else {
99
- const getFirstMenu = list2 => {
100
- if (list2[0].subList?.length) {
101
- return getFirstMenu(list2[0].subList);
102
- }
103
- return list2[0];
104
- };
105
- const firstMenu = getFirstMenu(list);
106
- menu.value = firstMenu;
107
- }
108
- }
109
- }, 10, {
110
- leading: false
111
- }));
112
- return menu;
113
- }
114
-
115
- function _isSlot$1(s) {
116
- return typeof s === 'function' || Object.prototype.toString.call(s) === '[object Object]' && !isVNode(s);
117
- }
118
- const Header = defineComponent({
119
- emits: ["navSelect"],
120
- props: {
121
- menu: {
122
- type: Array,
123
- required: true
124
- },
125
- logo: {
126
- type: String
127
- },
128
- userInfo: {
129
- type: Object,
130
- required: true
131
- },
132
- extraPages: {
133
- type: Array,
134
- required: true
135
- },
136
- messageCount: {
137
- type: Number
138
- }
139
- },
140
- setup(props, {
141
- emit
142
- }) {
143
- const isMounted = useMounted();
144
- const router = useRouter();
145
- const searchText = ref("");
146
- const handleGlobalSearch = () => {
147
- searchText.value = "";
148
- };
149
- const acitveMenuKey = ref([]);
150
- const handleMenuSelected = ({
151
- key
152
- }) => {
153
- emit("navSelect", key);
154
- };
155
- const activeMenu = useActiveMenu(() => props.menu, props.extraPages, true);
156
- watch(activeMenu, val => {
157
- if (val && val.id) {
158
- handleMenuSelected({
159
- key: val.id
160
- });
161
- acitveMenuKey.value = [val.id];
162
- }
163
- });
164
- const cancleWatch = watch([isMounted, () => props.menu], ([mounted, list]) => {
165
- if (mounted && list.length) {
166
- cancleWatch();
167
- if (!activeMenu.value) {
168
- const firstNav = list[0];
169
- emit("navSelect", firstNav.id);
170
- acitveMenuKey.value = [firstNav.id];
171
- }
172
- }
173
- });
174
- const handlePersonalCenter = () => {
175
- router.push({
176
- path: "/",
177
- query: {
178
- extraPageKey: "personalCenter"
179
- }
180
- });
181
- };
182
- return () => {
183
- let _slot;
184
- return createVNode("div", {
185
- "class": "header"
186
- }, [createVNode("div", {
187
- "class": "logo"
188
- }, [createVNode("img", {
189
- "src": props.logo,
190
- "alt": ""
191
- }, null)]), createVNode(Menu, {
192
- "class": "menu",
193
- "mode": "horizontal",
194
- "selectedKeys": acitveMenuKey.value,
195
- "onUpdate:selectedKeys": $event => acitveMenuKey.value = $event,
196
- "onSelect": handleMenuSelected
197
- }, _isSlot$1(_slot = props.menu.map(item => createVNode(MenuItem, {
198
- "key": item.id,
199
- "icon": createVNode(resolveComponent("icon-font"), {
200
- "type": item.icon
201
- }, null)
202
- }, {
203
- default: () => [item.name]
204
- }))) ? _slot : {
205
- default: () => [_slot]
206
- }), createVNode(Input, {
207
- "class": "search",
208
- "placeholder": "\u641C\u7D22",
209
- "allowClear": true,
210
- "value": searchText.value,
211
- "onUpdate:value": $event => searchText.value = $event,
212
- "onPressEnter": handleGlobalSearch
213
- }, {
214
- suffix: () => createVNode(SearchOutlined, null, null)
215
- }), createVNode("div", {
216
- "class": "user-info"
217
- }, [createVNode("span", {
218
- "class": "username"
219
- }, [props.userInfo.userName]), createVNode("div", {
220
- "onClick": handlePersonalCenter
221
- }, [createVNode(Badge, {
222
- "dot": !!props.messageCount
223
- }, {
224
- default: () => [createVNode(Avatar, {
225
- "class": "avatar",
226
- "src": "https://joeschmoe.io/api/v1/random"
227
- }, null)]
228
- })])])]);
229
- };
230
- }
231
- });
232
-
233
- function _isSlot(s) {
234
- return typeof s === 'function' || Object.prototype.toString.call(s) === '[object Object]' && !isVNode(s);
235
- }
236
- const renderMenuItem = item => {
237
- if (item.subList?.length) {
238
- let _slot;
239
- return createVNode(SubMenu, {
240
- "key": item.id,
241
- "icon": createVNode(resolveComponent("icon-font"), {
242
- "type": item.icon
243
- }, null),
244
- "title": item.name
245
- }, _isSlot(_slot = item.subList.map(i => renderMenuItem(i))) ? _slot : {
246
- default: () => [_slot]
247
- });
248
- }
249
- return createVNode(MenuItem, {
250
- "key": item.id,
251
- "icon": createVNode(resolveComponent("icon-font"), {
252
- "type": item.icon
253
- }, null)
254
- }, {
255
- default: () => [item.name]
256
- });
257
- };
258
- const SideMenu = defineComponent({
259
- emits: ["menuSelect"],
260
- props: {
261
- menu: {
262
- type: Array,
263
- required: true
264
- },
265
- extraPages: {
266
- type: Array,
267
- required: true
268
- }
269
- },
270
- setup(props, {
271
- emit
272
- }) {
273
- const activeMenu = ref([]);
274
- const initialMenu = useActiveMenu(() => props.menu, props.extraPages);
275
- watch(initialMenu, val => {
276
- if (val?.id) {
277
- activeMenu.value = [val.id];
278
- } else {
279
- activeMenu.value = [];
280
- }
281
- });
282
- const handleMenuSelect = param => {
283
- const {
284
- keyPath
285
- } = param;
286
- const menu = getMenuByKeyPath(props.menu, keyPath);
287
- if (menu) {
288
- emit("menuSelect", menu);
289
- }
290
- };
291
- return () => {
292
- let _slot2;
293
- return createVNode(Menu, {
294
- "mode": "inline",
295
- "selectedKeys": activeMenu.value,
296
- "onUpdate:selectedKeys": $event => activeMenu.value = $event,
297
- "onSelect": handleMenuSelect
298
- }, _isSlot(_slot2 = props.menu.map(item => renderMenuItem(item))) ? _slot2 : {
299
- default: () => [_slot2]
300
- });
301
- };
302
- }
303
- });
304
-
305
- function useActiveApp() {
306
- const route = useRoute();
307
- const activeAppName = computed(() => {
308
- return route.path.split("/")[1];
309
- });
310
- return activeAppName;
311
- }
312
-
313
- function useMicroApp() {
314
- const route = useRoute();
315
- const activeAppName = useActiveApp();
316
- const loadAppList = ref([]);
317
- const handleRouteChange = useThrottleFn(async () => {
318
- const microAppName = activeAppName.value;
319
- const loadApp = loadAppList.value.find(item => item.name === microAppName);
320
- if (loadApp) return;
321
- const microApp = appList.find(item => item.name === microAppName);
322
- if (!microApp) return;
323
- const domId = `microApp_${microAppName}`;
324
- const app = loadMicroApp({
325
- name: microApp.name,
326
- entry: microApp.entry,
327
- container: `#${domId}`
328
- });
329
- loadAppList.value.push({
330
- name: microAppName,
331
- domId,
332
- app
333
- });
334
- }, 100);
335
- watch(route, handleRouteChange, {
336
- immediate: true
337
- });
338
- return loadAppList;
339
- }
340
-
341
- function onAddExtraTabs(handler) {
342
- const qiankunState = inject("qiankunState");
343
- watch(() => qiankunState.value.extraTabs, (val = [], prev = []) => {
344
- if (val.length > prev.length) {
345
- const added = differenceBy(val, prev, item => item.key);
346
- handler(added);
347
- }
348
- }, {
349
- deep: true,
350
- immediate: true
351
- });
352
- }
353
-
354
- const TabList = defineComponent({
355
- emits: ["update:activeKey", "update:list", "tabSelect"],
356
- props: {
357
- list: {
358
- type: Array,
359
- default: () => []
360
- },
361
- activeKey: {
362
- type: String
363
- }
364
- },
365
- setup(props, {
366
- emit
367
- }) {
368
- const qiankunState = inject("qiankunState");
369
- const tabContainerRef = ref();
370
- const tabList = useVModel(props, "list", emit);
371
- const activeTabKey = useVModel(props, "activeKey", emit);
372
- const scrollLeft = val => {
373
- if (!tabContainerRef.value) return;
374
- tabContainerRef.value.scrollTo({
375
- left: tabContainerRef.value.scrollLeft + val,
376
- behavior: "smooth"
377
- });
378
- };
379
- const handleScroll = e => {
380
- if (!e.deltaX) {
381
- scrollLeft(e.deltaY < 0 ? -300 : 300);
382
- }
383
- };
384
- const handleRemove = async (e, tab, index) => {
385
- e.stopPropagation();
386
- if (tab.key === activeTabKey.value) {
387
- const next = tabList.value[index + 1];
388
- const prev = tabList.value[index - 1];
389
- if (next) {
390
- activeTabKey.value = next.key;
391
- emit("tabSelect", next);
392
- } else if (prev) {
393
- activeTabKey.value = prev.key;
394
- emit("tabSelect", prev);
395
- } else {
396
- return;
397
- }
398
- }
399
- tabList.value.splice(index, 1);
400
- };
401
- const closeToRight = index => tabList.value = tabList.value.filter((_2, i) => i <= index);
402
- const closeToLeft = index => tabList.value = tabList.value.filter((_2, i) => i >= index);
403
- const closeOther = index => {
404
- activeTabKey.value = tabList.value[index].key;
405
- tabList.value = tabList.value.filter((_2, i) => i === index);
406
- };
407
- watchArray(tabList, (val, prev, added, removed) => {
408
- for (const tab of removed) {
409
- if (tab.isExtraTab) {
410
- const idx = qiankunState.value.extraTabs.find(item => item.key === tab.key);
411
- idx !== -1 && qiankunState.value.extraTabs.splice(idx, 1);
412
- }
413
- }
414
- }, {
415
- deep: true
416
- });
417
- return () => createVNode("div", {
418
- "class": "tab-list"
419
- }, [createVNode("div", {
420
- "class": "handle",
421
- "onClick": () => scrollLeft(-150)
422
- }, [createVNode(LeftOutlined, null, null)]), createVNode("div", {
423
- "class": "tabs-container",
424
- "ref": tabContainerRef,
425
- "onWheel": handleScroll
426
- }, [tabList.value.map((item, index) => createVNode(Dropdown, {
427
- "placement": "bottomLeft",
428
- "trigger": ["contextmenu"]
429
- }, {
430
- default: () => [createVNode("div", {
431
- "key": item.id,
432
- "class": ["tab", {
433
- active: item.key === activeTabKey.value
434
- }],
435
- "onClick": () => emit("tabSelect", item)
436
- }, [createVNode(resolveComponent("icon-font"), {
437
- "class": "icon",
438
- "type": item.icon
439
- }, null), createVNode("span", {
440
- "class": "tab-name"
441
- }, [item.name]), tabList.value.length > 1 && createVNode(CloseOutlined, {
442
- "class": "close",
443
- "onClick": e => handleRemove(e, item, index)
444
- }, null)])],
445
- overlay: () => createVNode(Menu, null, {
446
- default: () => [createVNode(MenuItem, {
447
- "key": "right",
448
- "onClick": () => closeToRight(index)
449
- }, {
450
- default: () => ["\u5173\u95ED\u53F3\u4FA7"]
451
- }), createVNode(MenuItem, {
452
- "key": "left",
453
- "onClick": () => closeToLeft(index)
454
- }, {
455
- default: () => ["\u5173\u95ED\u5DE6\u4FA7"]
456
- }), createVNode(MenuItem, {
457
- "key": "other",
458
- "onClick": () => closeOther(index)
459
- }, {
460
- default: () => ["\u5173\u95ED\u5176\u4ED6"]
461
- })]
462
- })
463
- }))]), createVNode("div", {
464
- "class": "handle",
465
- "onClick": () => scrollLeft(150)
466
- }, [createVNode(RightOutlined, null, null)])]);
467
- }
468
- });
469
-
470
- const PageContent = defineComponent({
471
- props: {
472
- currMenu: {
473
- type: Object
474
- },
475
- menu: {
476
- type: Array,
477
- default: () => []
478
- },
479
- extraPages: {
480
- type: Array,
481
- required: true
482
- }
483
- },
484
- setup(props, {
485
- emit
486
- }) {
487
- const router = useRouter();
488
- const qiankunState = inject("qiankunState");
489
- const activeKey = ref();
490
- const tabList = ref([]);
491
- const activeAppName = useActiveApp();
492
- const loadAppList = useMicroApp();
493
- const iframeList = ref([]);
494
- const extraPageList = ref([]);
495
- const handleMenuChange = _.throttle(val => {
496
- if (!val) return;
497
- if (val.isExtra) {
498
- const exist = extraPageList.value.find(item => item.key === val.key);
499
- if (!exist) {
500
- tabList.value.push(val);
501
- extraPageList.value.push(val);
502
- }
503
- router.push(`/?extraPageKey=${val.key}`);
504
- activeKey.value = val.key;
505
- return;
506
- }
507
- const {
508
- key,
509
- id,
510
- mode = 0,
511
- url
512
- } = val;
513
- const isOpened = tabList.value.find(item => item.id === id);
514
- const tab = _.cloneDeep(val);
515
- switch (mode) {
516
- case 0:
517
- if (!isOpened) tabList.value.push({
518
- ...tab,
519
- key: key ?? id
520
- });
521
- router.push(url);
522
- break;
523
- case 1:
524
- window.open(url);
525
- break;
526
- case 2:
527
- if (!isOpened) {
528
- iframeList.value.push(val);
529
- tabList.value.push({
530
- ...tab,
531
- key: id
532
- });
533
- }
534
- router.push({
535
- path: "/",
536
- query: {
537
- iframeId: id
538
- }
539
- });
540
- break;
541
- }
542
- activeKey.value = key ?? id;
543
- }, 100, {
544
- trailing: false
545
- });
546
- const activeMenu = useActiveMenu(() => props.menu, props.extraPages);
547
- watch(activeMenu, handleMenuChange);
548
- watch(() => props.currMenu, handleMenuChange, {
549
- immediate: true
550
- });
551
- watch(activeKey, val => qiankunState.value.activeTabKey = val, {
552
- immediate: true
553
- });
554
- watch(() => qiankunState.value.activeTabKey, val => activeKey.value = val);
555
- onAddExtraTabs(added => {
556
- tabList.value.push(...added);
557
- });
558
- return () => createVNode("div", {
559
- "class": "page-content"
560
- }, [createVNode(TabList, {
561
- "activeKey": activeKey.value,
562
- "onUpdate:activeKey": $event => activeKey.value = $event,
563
- "list": tabList.value,
564
- "onUpdate:list": $event => tabList.value = $event,
565
- "onTabSelect": handleMenuChange
566
- }, null), createVNode("div", {
567
- "class": "page-container"
568
- }, [loadAppList.value.map(item => withDirectives(createVNode("div", {
569
- "id": item.domId
570
- }, null), [[vShow, item.name === activeAppName.value]])), iframeList.value.map(item => withDirectives(createVNode("iframe", {
571
- "src": item.url,
572
- "width": "100%",
573
- "height": "100%",
574
- "frameborder": "0"
575
- }, null), [[vShow, item.id === activeKey.value]])), extraPageList.value.map(item => withDirectives(createVNode("div", {
576
- "style": {
577
- height: "100%"
578
- }
579
- }, [createVNode(item.component, null, null)]), [[vShow, item.key === activeKey.value]]))])]);
580
- }
581
- });
582
-
583
- const Layout = defineComponent({
584
- props: {
585
- userMenu: {
586
- type: Array,
587
- required: true
588
- },
589
- copyRight: {
590
- type: String
591
- },
592
- userInfo: {
593
- type: Object,
594
- required: true
595
- },
596
- extraPages: {
597
- type: Array,
598
- default: () => []
599
- },
600
- messageCount: {
601
- type: Number,
602
- default: 0
603
- },
604
- logo: {
605
- type: String
606
- }
607
- },
608
- setup(props, {
609
- emit
610
- }) {
611
- const [isFolder, toggleFolder] = useToggle(false);
612
- const currentNavKey = ref();
613
- const siderMenu = ref([]);
614
- const handleNavSelect = id => {
615
- currentNavKey.value = id;
616
- };
617
- watch(currentNavKey, val => {
618
- if (!val) return;
619
- const nav = props.userMenu.find(item => item.id === val);
620
- if (nav) {
621
- siderMenu.value = nav.subList;
622
- }
623
- }, {
624
- immediate: true,
625
- flush: "post"
626
- });
627
- const currMenu = ref();
628
- const handleMenuSelect = menu => {
629
- currMenu.value = menu;
630
- };
631
- return () => createVNode("div", {
632
- "class": "Layout"
633
- }, [createVNode(Layout$1, null, {
634
- default: () => [createVNode(LayoutHeader, null, {
635
- default: () => [createVNode(Header, {
636
- "menu": props.userMenu,
637
- "onNavSelect": handleNavSelect,
638
- "userInfo": props.userInfo,
639
- "extraPages": props.extraPages,
640
- "messageCount": props.messageCount,
641
- "logo": props.logo
642
- }, null)]
643
- }), createVNode(Layout$1, null, {
644
- default: () => [createVNode(LayoutSider, {
645
- "width": "10.416vw",
646
- "collapsedWidth": "3.125vw",
647
- "collapsed": isFolder.value
648
- }, {
649
- default: () => [createVNode("div", {
650
- "class": "folder",
651
- "onClick": () => toggleFolder()
652
- }, [isFolder.value ? createVNode(MenuUnfoldOutlined, null, null) : createVNode(MenuFoldOutlined, null, null)]), createVNode(SideMenu, {
653
- "menu": siderMenu.value,
654
- "onMenuSelect": handleMenuSelect,
655
- "extraPages": props.extraPages
656
- }, null), createVNode("div", {
657
- "class": "copyright"
658
- }, [props.copyRight])]
659
- }), createVNode(LayoutContent, null, {
660
- default: () => [createVNode(PageContent, {
661
- "currMenu": currMenu.value,
662
- "menu": props.userMenu,
663
- "extraPages": props.extraPages
664
- }, null)]
665
- })]
666
- })]
667
- })]);
668
- }
669
- });
670
- var index = installComponent(Layout, "layout");
671
-
672
- export { index$2 as Demo, index$1 as IconFont, index as Layout };