@ctzy-web-client/plugin-component-vue 1.0.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.
Files changed (138) hide show
  1. package/package.json +43 -0
  2. package/src/advance-select/advance-operation.vue +44 -0
  3. package/src/advance-select/advance-option.vue +115 -0
  4. package/src/advance-select/advance-select.vue +343 -0
  5. package/src/advance-select/events-helpers.js +40 -0
  6. package/src/advance-select/index.js +13 -0
  7. package/src/advance-select/use-advance-option.js +58 -0
  8. package/src/advance-select/use-advance-select.js +142 -0
  9. package/src/application-slot/application-slot.js +70 -0
  10. package/src/application-slot/breadcrumb-item.vue +12 -0
  11. package/src/application-slot/header-tools-item.vue +12 -0
  12. package/src/application-slot/index.js +17 -0
  13. package/src/breadcrumb-select/breadcrumb-select.vue +97 -0
  14. package/src/breadcrumb-select/index.js +6 -0
  15. package/src/components.js +39 -0
  16. package/src/contextmenu/contextmenu-item.vue +13 -0
  17. package/src/contextmenu/contextmenu.vue +56 -0
  18. package/src/contextmenu/index.js +11 -0
  19. package/src/contextmenu/use-contextmenu.js +117 -0
  20. package/src/data-form/data-form-item.vue +49 -0
  21. package/src/data-form/data-form.vue +212 -0
  22. package/src/data-form/dynamic-component.js +24 -0
  23. package/src/data-form/form-components/Blots/AtBlot.js +32 -0
  24. package/src/data-form/form-components/bwa-date-picker.vue +43 -0
  25. package/src/data-form/form-components/bwa-date-time-picker.vue +49 -0
  26. package/src/data-form/form-components/bwa-input-float.vue +41 -0
  27. package/src/data-form/form-components/bwa-input-integer.vue +58 -0
  28. package/src/data-form/form-components/bwa-input.vue +32 -0
  29. package/src/data-form/form-components/bwa-multi-select.vue +27 -0
  30. package/src/data-form/form-components/bwa-rich-text-tinymce.vue +561 -0
  31. package/src/data-form/form-components/bwa-rich-text.vue +395 -0
  32. package/src/data-form/form-components/bwa-select.vue +67 -0
  33. package/src/data-form/form-components/bwa-textarea.vue +28 -0
  34. package/src/data-form/form-components/bwa-upload.vue +145 -0
  35. package/src/data-form/form-components/bwa-user-multi-select.vue +25 -0
  36. package/src/data-form/form-components/bwa-user-select.vue +81 -0
  37. package/src/data-form/index.js +35 -0
  38. package/src/data-table/data-column-view.vue +131 -0
  39. package/src/data-table/data-table-card.vue +81 -0
  40. package/src/data-table/data-table-column.vue +52 -0
  41. package/src/data-table/data-table.vue +426 -0
  42. package/src/data-table/dynamic-component.js +58 -0
  43. package/src/data-table/index.js +13 -0
  44. package/src/data-table/use-datatable-drag.js +156 -0
  45. package/src/datatable-settings/datatable-settings.vue +323 -0
  46. package/src/datatable-settings/index.js +6 -0
  47. package/src/date-range/date-picker.vue +115 -0
  48. package/src/date-range/date-range.vue +202 -0
  49. package/src/date-range/index.js +6 -0
  50. package/src/drag-list/constants.js +1 -0
  51. package/src/drag-list/drag-item.vue +46 -0
  52. package/src/drag-list/drag-list.vue +50 -0
  53. package/src/drag-list/index.js +6 -0
  54. package/src/drag-list/use-drag-list.js +209 -0
  55. package/src/dragable/constants.js +3 -0
  56. package/src/dragable/dragable-item.vue +19 -0
  57. package/src/dragable/dragable-operation.vue +28 -0
  58. package/src/dragable/dragable.vue +26 -0
  59. package/src/dragable/index.js +14 -0
  60. package/src/dragable/use-dragable.js +227 -0
  61. package/src/filter-panel/conditions/condition.js +35 -0
  62. package/src/filter-panel/conditions/date-range-condition.vue +35 -0
  63. package/src/filter-panel/conditions/department-condition/data.json +29537 -0
  64. package/src/filter-panel/conditions/department-condition/department-condition.vue +92 -0
  65. package/src/filter-panel/conditions/department-condition/department-node.vue +52 -0
  66. package/src/filter-panel/conditions/index.js +22 -0
  67. package/src/filter-panel/conditions/input-condition.vue +63 -0
  68. package/src/filter-panel/conditions/multi-user-condition.vue +56 -0
  69. package/src/filter-panel/conditions/multiple-menu-condition.vue +45 -0
  70. package/src/filter-panel/conditions/single-menu-condition.vue +58 -0
  71. package/src/filter-panel/conditions/single-user-condition.vue +56 -0
  72. package/src/filter-panel/filter-panel-item.vue +46 -0
  73. package/src/filter-panel/filter-panel.vue +149 -0
  74. package/src/filter-panel/index.js +17 -0
  75. package/src/filter-panel/use-filter-panel-item.js +59 -0
  76. package/src/filter-panel/use-filter-panel.js +203 -0
  77. package/src/hooks/use-data/index.js +234 -0
  78. package/src/index.js +48 -0
  79. package/src/layout/index.js +6 -0
  80. package/src/layout/layout.vue +74 -0
  81. package/src/make-installer.js +36 -0
  82. package/src/math/Rectangle.js +28 -0
  83. package/src/menu/index.js +6 -0
  84. package/src/menu/menu-item.vue +41 -0
  85. package/src/menu/menu.vue +53 -0
  86. package/src/panel/index.js +6 -0
  87. package/src/panel/panel.vue +42 -0
  88. package/src/panel-tabs/index.js +6 -0
  89. package/src/panel-tabs/panel-tabs.js +92 -0
  90. package/src/pct-filter-panel/index.js +10 -0
  91. package/src/pct-filter-panel/pct-compents/index.js +10 -0
  92. package/src/pct-filter-panel/pct-compents/pct-Input-condition.vue +63 -0
  93. package/src/pct-filter-panel/pct-compents/pct-date-range-condition.vue +60 -0
  94. package/src/pct-filter-panel/pct-compents/pct-multiple-menu-condition.vue +177 -0
  95. package/src/pct-filter-panel/pct-compents/pct-multiple-menu-condition2.vue +142 -0
  96. package/src/pct-filter-panel/pct-filter-panel-item.vue +46 -0
  97. package/src/pct-filter-panel/pct-filter-panel.vue +201 -0
  98. package/src/pct-filter-panel/use-filter-panel-item.js +61 -0
  99. package/src/pct-filter-panel/use-filter-panel.js +206 -0
  100. package/src/plugins.js +3 -0
  101. package/src/progress/index.js +8 -0
  102. package/src/progress/progress-item.vue +81 -0
  103. package/src/progress/progress.vue +58 -0
  104. package/src/progress/use-progress.js +66 -0
  105. package/src/utils/db.js +8 -0
  106. package/src/utils.js +263 -0
  107. package/src/where-filter-panel/index.js +0 -0
  108. package/src/where-filter-panel/use-where-filter-panel.js +28 -0
  109. package/src/where-filter-panel/where-filter-panel.vue +9 -0
  110. package/style/advance-select.scss +316 -0
  111. package/style/breadcrumb-select.scss +80 -0
  112. package/style/common/var.scss +240 -0
  113. package/style/common.scss +48 -0
  114. package/style/contextmenu.scss +58 -0
  115. package/style/data-form.scss +35 -0
  116. package/style/data-table.scss +81 -0
  117. package/style/datatable-settings.scss +125 -0
  118. package/style/date-range.scss +136 -0
  119. package/style/department-condition.scss +39 -0
  120. package/style/drag-list.scss +68 -0
  121. package/style/dragable.scss +8 -0
  122. package/style/filter-panel.scss +199 -0
  123. package/style/index.scss +22 -0
  124. package/style/input-condition.scss +30 -0
  125. package/style/layout.scss +70 -0
  126. package/style/menu.scss +184 -0
  127. package/style/mixins/_var.scss +21 -0
  128. package/style/mixins/config.scss +4 -0
  129. package/style/mixins/function.scss +62 -0
  130. package/style/mixins/mixins.scss +88 -0
  131. package/style/panel-tabs.scss +60 -0
  132. package/style/panel.scss +110 -0
  133. package/style/pct-filter-panel.scss +306 -0
  134. package/style/progress.scss +122 -0
  135. package/style/rich-text.scss +30 -0
  136. package/style/theme/theme.scss +161 -0
  137. package/style/theme/var.scss +34 -0
  138. package/style/var.scss +21 -0
@@ -0,0 +1,59 @@
1
+ import {
2
+ inject,
3
+ watch,
4
+ computed,
5
+ unref,
6
+ onBeforeUnmount,
7
+ onMounted,
8
+ resolveComponent,
9
+ } from 'vue';
10
+ import { filterPanelKey } from 'web-base-client-vue';
11
+
12
+ export const useFilterPanelItem = (props) => {
13
+ const filterPanelContext = inject(filterPanelKey);
14
+
15
+ const filterPanel = computed(() => filterPanelContext.filterPanel);
16
+
17
+ const column = computed(() => {
18
+ if (!unref(filterPanel)) {
19
+ return null;
20
+ }
21
+ return unref(filterPanel).getColumn(props.prop);
22
+ });
23
+
24
+ const value = computed({
25
+ get: () => {
26
+ if (!unref(column)) {
27
+ return null;
28
+ }
29
+ return unref(filterPanel).getFilterParam(unref(column));
30
+ },
31
+ set: (v) => {
32
+ if (!unref(column)) {
33
+ return;
34
+ }
35
+ unref(filterPanel).setFilterParam(unref(column), v);
36
+ },
37
+ });
38
+
39
+ const allowClose = computed(() => props.close || !!unref(column)?.closable);
40
+
41
+ const closeHandle = () => {
42
+ if (!unref(column)) {
43
+ return;
44
+ }
45
+ unref(filterPanel).closeColumn(unref(column));
46
+
47
+ unref(filterPanel).dataTable.refresh();
48
+ };
49
+
50
+ onMounted(() => {
51
+ unref(filterPanel).changeOriginFilterParams();
52
+ });
53
+
54
+ onBeforeUnmount(() => {
55
+ unref(filterPanel).changeOriginFilterParams();
56
+ });
57
+
58
+ return { value, column, allowClose, closeHandle };
59
+ };
@@ -0,0 +1,203 @@
1
+ import { useProp } from 'element-plus';
2
+ import { useEventDispatcher, useService, useValue } from 'web-base-client-vue';
3
+ import {
4
+ computed,
5
+ getCurrentInstance,
6
+ nextTick,
7
+ onBeforeUnmount,
8
+ resolveComponent,
9
+ unref,
10
+ watch,
11
+ withCtx,
12
+ } from 'vue';
13
+ import { Observable } from 'rxjs';
14
+ import { dataModelDB } from '../utils/db';
15
+
16
+ export const useFilterPanel = (props, context) => {
17
+ const dataTable = useProp('dataTable');
18
+ const filterPanel = computed(() => unref(dataTable).filterPanel);
19
+
20
+ /** @type {import('dexie').Table} */
21
+ const filterPanelTable = dataModelDB.filterPanel;
22
+
23
+ const currentFilterColumns = computed(() =>
24
+ unref(filterPanel).getAppliedColumns()
25
+ );
26
+
27
+ const userService = useService('UserService');
28
+ const _userID = userService?.userInfo?.id || '0';
29
+
30
+ const searchParams = computed(() => unref(filterPanel)._filterParams);
31
+
32
+ const selectedColumnAttrNames = computed({
33
+ get: () => unref(filterPanel).getSelectedColumnAttrNames(),
34
+ set: (v) => {
35
+ const oldSelectedColumnAttrNames = selectedColumnAttrNames.value;
36
+ unref(filterPanel).setSelectedColumnAttrNames(v);
37
+
38
+ if (unref(filterPanel).ready) {
39
+ const existsOldAttrNames = oldSelectedColumnAttrNames.filter(
40
+ (attrName) => v.includes(attrName)
41
+ );
42
+ if (existsOldAttrNames.length < oldSelectedColumnAttrNames.length) {
43
+ unref(dataTable).refresh();
44
+ }
45
+ }
46
+ },
47
+ });
48
+ const closableColumns = computed(() =>
49
+ unref(filterPanel).getSearchClosableColumns()
50
+ );
51
+
52
+ const searchValue = computed({
53
+ get: () => unref(filterPanel).getSearchValue(),
54
+ set: (v) => unref(filterPanel).setSeachValue(v),
55
+ });
56
+
57
+ const isChange = computed(() => unref(filterPanel).isChange());
58
+
59
+ watch(
60
+ useProp('searchAttr'),
61
+ (searchAttr) => {
62
+ unref(filterPanel).setSearchAttr(searchAttr);
63
+ },
64
+ { immediate: true }
65
+ );
66
+
67
+ watch(
68
+ useProp('searchFields'),
69
+ (searchFields) => {
70
+ unref(filterPanel).setSearchFields(searchFields);
71
+ },
72
+ { immediate: true }
73
+ );
74
+
75
+ const handleFieldSearch = (value) => {
76
+ unref(filterPanel).fieldSearchValue = value;
77
+ };
78
+
79
+ const handleReset = () => {
80
+ unref(filterPanel).resetFilterParams();
81
+
82
+ context.emit('reset');
83
+ };
84
+
85
+ useEventDispatcher(filterPanel, 'params-change', () => {
86
+ const _filterPanel = unref(filterPanel);
87
+
88
+ context.emit('filter', {
89
+ ..._filterPanel.getFilterParams(),
90
+ [_filterPanel.getSearchAttr()]: _filterPanel.getSearchValue(),
91
+ });
92
+ });
93
+
94
+ const appName = useValue('AppName');
95
+
96
+ const selectedColumnChangeSubscription = new Observable((observer) =>
97
+ useEventDispatcher(
98
+ filterPanel,
99
+ 'selected-column-change',
100
+ observer.next.bind(observer)
101
+ )
102
+ ).subscribe(async () => {
103
+ const _appName = unref(appName);
104
+ const _tableName = unref(dataTable).name;
105
+
106
+ let result = await filterPanelTable
107
+ .where('[app+tableName+userID]')
108
+ .equals([_appName, _tableName, _userID])
109
+ .toArray();
110
+
111
+ let filterPanelOrder = result.length ? result[0].order ?? [] : [];
112
+
113
+ const attrNames = unref(filterPanel).getSelectedColumnAttrNames();
114
+
115
+ attrNames.sort((a1, a2) => {
116
+ const index1 = filterPanelOrder.indexOf(a1);
117
+ const index2 = filterPanelOrder.indexOf(a2);
118
+
119
+ if (index1 === -1 && index2 === -1) {
120
+ return 1;
121
+ }
122
+
123
+ if (index1 === -1) {
124
+ return 1;
125
+ }
126
+
127
+ if (index2 === -1) {
128
+ return -1;
129
+ }
130
+
131
+ return index1 - index2;
132
+ });
133
+
134
+ filterPanelTable.put({
135
+ app: _appName,
136
+ tableName: _tableName,
137
+ userID: _userID,
138
+ order: attrNames,
139
+ });
140
+ });
141
+
142
+ const loadFilterPanelItemOrder = () => {
143
+ filterPanelTable
144
+ .where('[app+tableName+userID]')
145
+ .equals([unref(appName), unref(dataTable).name, _userID])
146
+ .toArray((res) => {
147
+ selectedColumnAttrNames.value = res[0]?.order ?? [];
148
+
149
+ // 因为设置值监听会有一个异步过程,所以等待一次tick
150
+ nextTick(() => {
151
+ unref(filterPanel).ready = true;
152
+ unref(filterPanel).changeOriginFilterParams();
153
+ unref(filterPanel).changeOriginSearchValue();
154
+ });
155
+ });
156
+ };
157
+
158
+ if (!unref(filterPanel).isInited) {
159
+ useEventDispatcher(filterPanel, 'initCompleted', loadFilterPanelItemOrder);
160
+ } else {
161
+ loadFilterPanelItemOrder();
162
+ }
163
+
164
+ onBeforeUnmount(() => {
165
+ selectedColumnChangeSubscription.unsubscribe();
166
+ });
167
+
168
+ const columns = computed(() => unref(filterPanel).getColumns());
169
+
170
+ const instance = getCurrentInstance();
171
+
172
+ watch(
173
+ computed(() => unref(columns).map((column) => column.componentTitle)),
174
+ withCtx(() => {
175
+ for (const column of unref(columns)) {
176
+ const component = resolveComponent(
177
+ column.component || 'BwaMultipleMenuCondition'
178
+ );
179
+
180
+ if (!component) {
181
+ unref(column).componentTitle = '';
182
+ return;
183
+ }
184
+
185
+ unref(column).componentTitle = component.__conditionTitle__;
186
+ }
187
+ }, instance),
188
+ { immediate: true }
189
+ );
190
+
191
+ return {
192
+ dataTable,
193
+ filterPanel,
194
+ currentFilterColumns,
195
+ searchParams,
196
+ selectedColumnAttrNames,
197
+ closableColumns,
198
+ handleFieldSearch,
199
+ searchValue,
200
+ isChange,
201
+ handleReset,
202
+ };
203
+ };
@@ -0,0 +1,234 @@
1
+ import {
2
+ useService,
3
+ HttpRequest,
4
+ useEventDispatcher,
5
+ useGlobalConfig,
6
+ filterPanelItemKey,
7
+ } from 'web-base-client-vue';
8
+ import { ElMessage, useProp } from 'element-plus';
9
+ import {
10
+ computed,
11
+ getCurrentInstance,
12
+ onBeforeUnmount,
13
+ onUnmounted,
14
+ ref,
15
+ unref,
16
+ watch,
17
+ inject,
18
+ } from 'vue';
19
+ import {
20
+ catchError,
21
+ combineLatest,
22
+ debounceTime,
23
+ filter,
24
+ from,
25
+ map,
26
+ mergeAll,
27
+ Observable,
28
+ of,
29
+ tap,
30
+ } from 'rxjs';
31
+ import { isEqual } from 'lodash';
32
+ import { BehaviorSubject } from 'rxjs';
33
+
34
+ export const dataProps = {
35
+ dataTable: {
36
+ type: Object,
37
+ },
38
+ itfInfo: {
39
+ type: Object,
40
+ },
41
+ labelAttr: {
42
+ type: String,
43
+ },
44
+ valueAttr: {
45
+ type: String,
46
+ },
47
+ searchAttr: {
48
+ type: String,
49
+ },
50
+ lazy: {
51
+ type: Boolean,
52
+ default: true,
53
+ },
54
+ };
55
+
56
+ export function useData(disabled, search) {
57
+ const httpRequest = useService(HttpRequest);
58
+
59
+ const data = ref([]);
60
+
61
+ const debounceDelay = useGlobalConfig('debounceDelay', 500);
62
+
63
+ const filterPanelItem = inject(filterPanelItemKey, null);
64
+
65
+ const _dataTable = useProp('dataTable');
66
+ const dataTable = ref(null);
67
+ const itfInfo = useProp('itfInfo');
68
+ const _labelAttr = useProp('labelAttr');
69
+ const labelAttr = computed(() => unref(_labelAttr) || 'label');
70
+ const _valueAttr = useProp('valueAttr');
71
+ const valueAttr = computed(() => unref(_valueAttr) || 'value');
72
+ const _searchAttr = useProp('searchAttr');
73
+ const searchAttr = computed(() => unref(_searchAttr) || 'search');
74
+ const lazy = useProp('lazy');
75
+
76
+ const loading = ref(false);
77
+
78
+ const searchAttrObserable = new Observable((observer) =>
79
+ watch(
80
+ searchAttr,
81
+ (value, oldValue) => {
82
+ observer.next([value, oldValue]);
83
+ },
84
+ { immediate: true }
85
+ )
86
+ );
87
+
88
+ const searchObserable = new Observable((observer) =>
89
+ watch(search, observer.next.bind(observer), { immediate: true })
90
+ ).pipe(debounceTime(unref(debounceDelay)));
91
+
92
+ const searchObservable = combineLatest([
93
+ searchAttrObserable,
94
+ searchObserable,
95
+ ]).pipe(
96
+ debounceTime(unref(debounceDelay)),
97
+ filter(() => !unref(disabled))
98
+ );
99
+
100
+ const disabledObservable = new Observable((observer) =>
101
+ watch(disabled, observer.next.bind(observer), { immediate: true })
102
+ );
103
+
104
+ if (unref(_dataTable)) {
105
+ dataTable.value = unref(_dataTable).clone();
106
+
107
+ const loadDataSubscription = new Observable((observer) =>
108
+ useEventDispatcher(
109
+ dataTable,
110
+ 'load-successfully',
111
+ observer.next.bind(observer)
112
+ )
113
+ ).subscribe((res) => {
114
+ if (res.code != 0) {
115
+ data.value = [];
116
+ ElMessage.error(res.msg);
117
+ return;
118
+ }
119
+ data.value = (res.data || []).map((item) => ({
120
+ value: item[unref(valueAttr)],
121
+ label: item[unref(labelAttr)],
122
+ }));
123
+ });
124
+
125
+ const loadingSubscription = new Observable((observer) =>
126
+ watch(
127
+ computed(() => unref(dataTable).locking),
128
+ observer.next.bind(observer),
129
+ { immediate: true }
130
+ )
131
+ ).subscribe((locking) => {
132
+ loading.value = locking;
133
+ });
134
+
135
+ const searchSubscription = searchObservable.subscribe(
136
+ ([[searchAttr, oldSearchAttr], search]) => {
137
+ if (oldSearchAttr) {
138
+ unref(dataTable).removeParam(oldSearchAttr);
139
+ }
140
+
141
+ if (searchAttr) {
142
+ unref(dataTable).setParam(searchAttr, search);
143
+ }
144
+
145
+ unref(dataTable).refresh();
146
+ }
147
+ );
148
+
149
+ unref(dataTable).setParam(unref(searchAttr), '');
150
+
151
+ const disabledSubscription = disabledObservable
152
+ .pipe(filter((disabled) => !disabled))
153
+ .subscribe(() => {
154
+ unref(dataTable).refresh();
155
+ });
156
+
157
+ onBeforeUnmount(() => {
158
+ loadDataSubscription.unsubscribe();
159
+ loadingSubscription.unsubscribe();
160
+ searchSubscription.unsubscribe();
161
+ disabledSubscription.unsubscribe();
162
+ });
163
+ } else if (unref(itfInfo)) {
164
+ const _itfInfo = computed(() => ({
165
+ url: unref(itfInfo).url,
166
+ method: unref(itfInfo).method || 'POST',
167
+ options: unref(itfInfo).options || {},
168
+ }));
169
+
170
+ const inputParamsOberserble = new Observable((observer) => {
171
+ watch(
172
+ computed(() => unref(itfInfo).params),
173
+ (newVal = {}, oldVall) => {
174
+ if (!isEqual(oldVall, newVal)) {
175
+ observer.next(newVal);
176
+ }
177
+ },
178
+ { immediate: true }
179
+ );
180
+ });
181
+
182
+ const paramsObserable = combineLatest([
183
+ searchAttrObserable,
184
+ searchObserable,
185
+ inputParamsOberserble,
186
+ ]).pipe(
187
+ map(([[searchAttr], search, params]) => ({
188
+ ...params,
189
+ [searchAttr]: search,
190
+ }))
191
+ );
192
+
193
+ let inited = false;
194
+
195
+ const subscription = combineLatest([paramsObserable, disabledObservable])
196
+ .pipe(
197
+ tap(() => {
198
+ loading.value = true;
199
+ }),
200
+ debounceTime(unref(debounceDelay)),
201
+ filter(([_, disabled]) => {
202
+ return (!inited && !unref(lazy)) || !disabled;
203
+ }),
204
+ map(([params]) => ({ ...unref(_itfInfo), params })),
205
+ map(({ url, method, params, options }) =>
206
+ from(
207
+ unref(httpRequest)[method.toLowerCase()](url, params, options)
208
+ ).pipe(catchError(() => of({ code: 1, msg: '网络异常!' })))
209
+ ),
210
+ mergeAll()
211
+ )
212
+ .subscribe((result) => {
213
+ try {
214
+ inited = true;
215
+ if (result.code != 0) {
216
+ data.value = [];
217
+ ElMessage.error(result.msg);
218
+ return;
219
+ }
220
+
221
+ data.value = (result.data || []).map((item) => ({
222
+ value: item[unref(valueAttr)],
223
+ label: item[unref(labelAttr)],
224
+ }));
225
+ } finally {
226
+ loading.value = false;
227
+ }
228
+ });
229
+
230
+ onBeforeUnmount(subscription.unsubscribe.bind(subscription));
231
+ }
232
+
233
+ return { data, loading };
234
+ }
package/src/index.js ADDED
@@ -0,0 +1,48 @@
1
+ import { makeInstaller } from './make-installer';
2
+ import components from './components';
3
+ import plugins from './plugins';
4
+
5
+ export const install = makeInstaller([...components, ...plugins]);
6
+ export default { install };
7
+
8
+ export { BwaDataForm, BwaDataFormItem } from './data-form';
9
+ export {
10
+ BwaDataTable,
11
+ BwaDataTableColumn,
12
+ BwaDataColumnView,
13
+ } from './data-table';
14
+ export { BwaFilterPanel, BwaFilterpanelItem } from './filter-panel';
15
+
16
+ export {
17
+ BwaAdvanceSelect,
18
+ BwaAdvanceOption,
19
+ BwaAdvanceOperation,
20
+ } from './advance-select';
21
+
22
+ export { BwaDateRange } from './date-range';
23
+
24
+ export {
25
+ BwaApplicationSlot,
26
+ BwaBreadcrumbItem,
27
+ BwaHeaderToolsItem,
28
+ } from './application-slot';
29
+
30
+ export { BwaLayout } from './layout';
31
+
32
+ export { BwaMenu } from './menu';
33
+
34
+ export { BwaPanel } from './panel';
35
+
36
+ export { BwaPanelTab } from './panel-tabs';
37
+
38
+ export { BwaContextmenu, useContextmenu } from './contextmenu';
39
+
40
+ export { BwaBreadcrumbSelect } from './breadcrumb-select';
41
+
42
+ export { BwaDataTableSetting } from './datatable-settings';
43
+
44
+ export { BwaDraglist } from './drag-list';
45
+
46
+ export { BwaProgress, BwaProgressItem } from './progress';
47
+
48
+ export { BwaDragable, BwaDragableItem, BwaDragableOperation } from './dragable';
@@ -0,0 +1,6 @@
1
+ import { withInstall } from 'element-plus/es/utils/vue/install';
2
+ import Layout from './layout.vue';
3
+
4
+ export const BwaLayout = withInstall(Layout);
5
+
6
+ export default BwaLayout;
@@ -0,0 +1,74 @@
1
+ <template>
2
+ <div :class="[ns.b(), 'justify-between']">
3
+ <ElScrollbar :class="ns.e('menu-wrapper')" height="100%">
4
+ <slot name="left-panel">
5
+ <BwaMenu
6
+ :class="ns.e('menu')"
7
+ :menus="menus"
8
+ :currentMenuID="currentMenuID"
9
+ :collapsed="isCollapsed"
10
+ @select="handleSelect"
11
+ />
12
+ </slot>
13
+
14
+ <slot name="left-panel-append"> </slot>
15
+ </ElScrollbar>
16
+
17
+ <div :class="ns.e('main')">
18
+ <slot></slot>
19
+ </div>
20
+ </div>
21
+ </template>
22
+
23
+ <script setup>
24
+ import { useRouter } from 'vue-router';
25
+ import { computed, ref, unref } from 'vue';
26
+ import { useNamespace, useService } from 'web-base-client-vue';
27
+ import BwaMenu from '../menu';
28
+
29
+ defineOptions({
30
+ name: 'BwaLayout',
31
+ });
32
+
33
+ const router = useRouter();
34
+
35
+ const ns = useNamespace('layout');
36
+
37
+ const menuService = useService('MenuService');
38
+
39
+ const isCollapsed = computed(() => unref(menuService)?.isCollapsed ?? false);
40
+
41
+ const menus = computed(() => unref(menuService)?.getMenus() ?? []);
42
+ const currentMenuID = computed(
43
+ () => unref(menuService)?.getCurrentMenu()?.id ?? ''
44
+ );
45
+
46
+ const handleSelect = (menu) => {
47
+ if (!menu) {
48
+ return;
49
+ }
50
+
51
+ switch (menu?.type) {
52
+ case 0:
53
+ unref(menuService).setCurrentMenuById(menu.id);
54
+ router.push(menu.path);
55
+ break;
56
+ case 1:
57
+ let openLink = '';
58
+
59
+ if (
60
+ path.toLowerCase().indexOf('https://') == 0 ||
61
+ path.toLowerCase().indexOf('http://') == 0
62
+ ) {
63
+ openLink = path;
64
+ } else if (path.startsWith('//')) {
65
+ openLink = location.protocol + path;
66
+ } else {
67
+ openLink = path;
68
+ }
69
+
70
+ window.open(openLink);
71
+ break;
72
+ }
73
+ };
74
+ </script>
@@ -0,0 +1,36 @@
1
+ import ElementPlus from 'element-plus';
2
+ import * as icons from '@element-plus/icons';
3
+ import zhCn from 'element-plus/es/locale/lang/zh-cn';
4
+ import { provideGlobalConfig } from 'web-base-client-vue';
5
+
6
+ const INSTALLED_KEY = Symbol('INSTALLED_KEY');
7
+
8
+ export const makeInstaller = (components = []) => {
9
+ const install = (app, options) => {
10
+ if (app[INSTALLED_KEY]) {
11
+ return;
12
+ }
13
+
14
+ app[INSTALLED_KEY] = true;
15
+
16
+ options = { ...options, locale: zhCn };
17
+
18
+ app.use(ElementPlus, options);
19
+
20
+ app.use({
21
+ install: (app) => {
22
+ Object.keys(icons).forEach((key) =>
23
+ app.component(icons[key].name, icons[key])
24
+ );
25
+ },
26
+ });
27
+
28
+ components.forEach((component) => app.use(component));
29
+
30
+ if (options) {
31
+ provideGlobalConfig({ ...options, namespace: 'bwa' }, app, true);
32
+ }
33
+ };
34
+
35
+ return install;
36
+ };
@@ -0,0 +1,28 @@
1
+ export class Rectangle {
2
+ constructor(x, y, width, height) {
3
+ if (width < 0) {
4
+ x = x - (width = -width);
5
+ }
6
+
7
+ if (height < 0) {
8
+ y = y - (height = -height);
9
+ }
10
+
11
+ this.x = x;
12
+ this.y = y;
13
+ this.width = width;
14
+ this.height = height;
15
+ this.left = x;
16
+ this.top = y;
17
+ this.right = x + width;
18
+ this.bottom = y + height;
19
+ this.cx = x + width / 2;
20
+ this.cy = y + height / 2;
21
+ }
22
+
23
+ pointIn(x, y) {
24
+ return (
25
+ x >= this.left && x <= this.right && y >= this.top && y <= this.bottom
26
+ );
27
+ }
28
+ }
@@ -0,0 +1,6 @@
1
+ import { withInstall } from 'element-plus/es/utils/vue/install';
2
+ import Menu from './menu.vue';
3
+
4
+ export const BwaMenu = withInstall(Menu);
5
+
6
+ export default BwaMenu;