@epxing/dashboard 0.0.0-stage → 5.3.0-beta.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.
Files changed (64) hide show
  1. package/API.md +79 -0
  2. package/README.md +40 -2
  3. package/dist/_virtual/_plugin-vue_export-helper.js +10 -0
  4. package/dist/_virtual/preload-helper.js +88 -0
  5. package/dist/assets/technology_bg-oWIS2awO.jpg +0 -0
  6. package/dist/src/Dashboard.js +332 -0
  7. package/dist/src/DashboardGrid.js +182 -0
  8. package/dist/src/DesignGrid.js +711 -0
  9. package/dist/src/DesignItem.js +63 -0
  10. package/dist/src/Div.js +408 -0
  11. package/dist/src/Header.js +385 -0
  12. package/dist/src/Preview.js +27 -0
  13. package/dist/src/Tabs.js +468 -0
  14. package/dist/src/Title.js +101 -0
  15. package/dist/src/Widget.js +266 -0
  16. package/dist/src/chart-request-scope.js +32 -0
  17. package/dist/src/design-target.js +57 -0
  18. package/dist/src/grid/compact.js +68 -0
  19. package/dist/src/grid/compat/GridItem.js +35 -0
  20. package/dist/src/grid/compat/GridLayout.js +76 -0
  21. package/dist/src/grid/designState.js +21 -0
  22. package/dist/src/grid/engines.js +25 -0
  23. package/dist/src/grid/geometry.js +44 -0
  24. package/dist/src/grid/gridstackParams.js +69 -0
  25. package/dist/src/grid/mixins.js +108 -0
  26. package/dist/src/grid/model.js +223 -0
  27. package/dist/src/grid/useViewportGate.js +55 -0
  28. package/dist/src/index.js +26 -0
  29. package/dist/src/layout-util.js +108 -0
  30. package/dist/src/mobile-design.js +50 -0
  31. package/dist/src/theme-style.js +133 -0
  32. package/dist/style.css +1009 -0
  33. package/package.json +85 -3
  34. package/src/Dashboard.vue +459 -0
  35. package/src/DashboardGrid.vue +189 -0
  36. package/src/DesignGrid.vue +851 -0
  37. package/src/DesignItem.vue +124 -0
  38. package/src/Div.vue +419 -0
  39. package/src/Header.vue +501 -0
  40. package/src/Preview.vue +30 -0
  41. package/src/Tabs.vue +484 -0
  42. package/src/Title.vue +107 -0
  43. package/src/Widget.vue +354 -0
  44. package/src/chart-request-scope.js +22 -0
  45. package/src/design-target.js +55 -0
  46. package/src/grid/compact.js +81 -0
  47. package/src/grid/compat/GridItem.vue +30 -0
  48. package/src/grid/compat/GridLayout.vue +76 -0
  49. package/src/grid/designState.js +17 -0
  50. package/src/grid/engines.js +22 -0
  51. package/src/grid/geometry.js +55 -0
  52. package/src/grid/gridstackParams.js +72 -0
  53. package/src/grid/mixins.js +114 -0
  54. package/src/grid/model.js +259 -0
  55. package/src/grid/useViewportGate.js +57 -0
  56. package/src/index.js +28 -0
  57. package/src/layout-util.js +157 -0
  58. package/src/mobile-design.js +50 -0
  59. package/src/theme-style.js +185 -0
  60. package/types/div.d.ts +1 -0
  61. package/types/index.d.ts +7 -0
  62. package/types/tabs.d.ts +1 -0
  63. package/types/title.d.ts +1 -0
  64. package/types/widget.d.ts +1 -0
@@ -0,0 +1,385 @@
1
+ import Header from "@epxing/components/src/header";
2
+ import { evalWith } from "@epxing/utils/src/eval-with";
3
+ import { MobileSheet } from "@epxing/components/src/mobile";
4
+ import { resolveComponent, openBlock, createElementBlock, normalizeStyle, createElementVNode, toDisplayString, createVNode, withCtx, Fragment, renderList, normalizeClass, createTextVNode, createCommentVNode, createBlock, withDirectives, vShow } from "vue";
5
+ /* empty css */
6
+ import _export_sfc from "../_virtual/_plugin-vue_export-helper.js";
7
+ const _sfc_main = {
8
+ name: "epx-dashboard-header",
9
+ extends: Header,
10
+ components: { MobileSheet },
11
+ data() {
12
+ return {
13
+ fullscreen: false,
14
+ showSearchFields: !!this.searchDefaultFlag
15
+ };
16
+ },
17
+ props: {
18
+ scopeFlag: Boolean,
19
+ globalSearchFields: {
20
+ type: Array,
21
+ default() {
22
+ return [];
23
+ }
24
+ },
25
+ searchDefaultFlag: Boolean,
26
+ title: {
27
+ type: String,
28
+ default: ""
29
+ }
30
+ },
31
+ computed: {
32
+ // AI 助手右侧预览(AiChatPage 打开看板时传 isAiAgentPage):隐藏返回和设计按钮,
33
+ // 面板自带关闭按钮,设计入口对临时注入的看板页面无意义
34
+ isAiAgentPage() {
35
+ return !!this.$query.isAiAgentPage;
36
+ },
37
+ // 常用报表看板(FM_CA_REPORT_BOARD)的报表记录 id:
38
+ // 1) previewReport 透传的 $query.reportBoardId;
39
+ // 2) 兜底从临时页面 id(report-board-<报表ID>)解析,避免依赖配置是否重新应用。
40
+ // 有它就把"设计"按钮放开(即便在 AI 面板里),并走报表设计模式。
41
+ reportBoardId() {
42
+ if (this.$query.reportBoardId) return this.$query.reportBoardId;
43
+ const pid = this.upPage && this.upPage.$pageId;
44
+ if (pid && /^report-board-/.test(pid)) return pid.replace(/^report-board-/, "");
45
+ return "";
46
+ },
47
+ pageTitle() {
48
+ const _this = this;
49
+ const { config: pageConfigs = {} } = this.$pageInfo;
50
+ const { title = "" } = pageConfigs;
51
+ const pageTitle = title.replace(/\$\[([^[]+)\]/g, (macth, key) => {
52
+ try {
53
+ return evalWith(`_this.${key}`, { _this }) || evalWith(`_this.$query.${key}`, { _this }) || "";
54
+ } catch (error) {
55
+ console.error(error);
56
+ return "";
57
+ }
58
+ });
59
+ return pageTitle || this.$query.title || this.defaultTitle || this.$query.menuTitle;
60
+ }
61
+ },
62
+ methods: {
63
+ newPageSettingVisual() {
64
+ if (this.reportBoardId) {
65
+ const routePath = this.$util.getRootPath();
66
+ window.open(`${routePath}/config/reportboard/${this.appConfig["CLIENT|CODE"]}/${this.appConfig["SYSTEM|CODE"]}/${this.reportBoardId}`);
67
+ document.removeEventListener("visibilitychange", this.onReportBoardReturn);
68
+ document.addEventListener("visibilitychange", this.onReportBoardReturn);
69
+ return;
70
+ }
71
+ if (!this.upPage.$pageId) {
72
+ this.$message.error(this.$t("The default page cannot be edited"));
73
+ return;
74
+ }
75
+ const pageId = this.upPage.$pageId;
76
+ setTimeout(() => {
77
+ const routePath = this.$util.getRootPath();
78
+ window.open(`${routePath}/config/dashboard/${this.appConfig["CLIENT|CODE"]}/${this.appConfig["SYSTEM|CODE"]}/${pageId}`);
79
+ window.removeEventListener("message", this.reloadPageConfig);
80
+ window.addEventListener("message", this.reloadPageConfig);
81
+ }, 200);
82
+ },
83
+ switchFullscreen() {
84
+ this.$emit("fullscreen");
85
+ },
86
+ search(v) {
87
+ if (this.timer) {
88
+ clearTimeout(this.timer);
89
+ this.timer = null;
90
+ }
91
+ this.timer = setTimeout(() => {
92
+ this.$emit("search", v);
93
+ clearTimeout(this.timer);
94
+ this.timer = null;
95
+ }, 1e3);
96
+ },
97
+ reloadPageConfig(e) {
98
+ if (this.timer) {
99
+ this.timer = null;
100
+ clearTimeout(this.timer);
101
+ }
102
+ this.timer = setTimeout(() => {
103
+ this.$store.commit("DELETE_PAGE", { pageId: this.upPage.$pageId });
104
+ this.reloadPage();
105
+ this.timer = null;
106
+ clearTimeout(this.timer);
107
+ }, 1e3);
108
+ },
109
+ // 从报表设计标签页切回预览时:重新拉取 FM_CA_REPORT_BOARD 配置,重建临时看板页面并刷新
110
+ onReportBoardReturn() {
111
+ if (document.visibilityState !== "visible") return;
112
+ document.removeEventListener("visibilitychange", this.onReportBoardReturn);
113
+ const reportId = this.reportBoardId;
114
+ const pid = this.upPage && this.upPage.$pageId;
115
+ if (!reportId || !pid) return;
116
+ this.$http.get({ entityId: "FM_CA_REPORT_BOARD", id: reportId }).then((res) => {
117
+ const record = res && res.data || {};
118
+ let config = {};
119
+ try {
120
+ const raw = record.DASHBOARD_CONFIG;
121
+ config = raw ? typeof raw === "string" ? JSON.parse(raw) : raw : {};
122
+ } catch (err) {
123
+ config = {};
124
+ }
125
+ if (config && config.config && (config.config.items || config.config.itemConfigs)) {
126
+ config = Object.assign({ title: config.title, metaId: config.metaId }, config.config);
127
+ }
128
+ this.$store.commit("DELETE_PAGE", { pageId: pid });
129
+ this.$store.commit("ADD_PAGE", {
130
+ pageId: pid,
131
+ pageCode: "dashboard",
132
+ metaId: config.metaId || "",
133
+ pageMetaId: config.metaId || "",
134
+ title: record.REPORT_NAME || config.title || "报表预览",
135
+ label: record.REPORT_NAME || config.title || "报表预览",
136
+ config
137
+ });
138
+ this.reloadPage();
139
+ }).catch(() => {
140
+ });
141
+ }
142
+ },
143
+ beforeUnmount() {
144
+ document.removeEventListener("visibilitychange", this.onReportBoardReturn);
145
+ }
146
+ };
147
+ const _hoisted_1 = { class: "title" };
148
+ const _hoisted_2 = {
149
+ key: 0,
150
+ class: "mobile-opera"
151
+ };
152
+ const _hoisted_3 = { class: "setting-list" };
153
+ const _hoisted_4 = ["onClick"];
154
+ const _hoisted_5 = {
155
+ key: 1,
156
+ class: "el-icon-more",
157
+ style: { transform: "rotate(90deg)" }
158
+ };
159
+ const _hoisted_6 = { class: "menu-container" };
160
+ const _hoisted_7 = {
161
+ key: 1,
162
+ class: "mobile-opera"
163
+ };
164
+ const _hoisted_8 = ["onClick"];
165
+ const _hoisted_9 = { class: "header-inner" };
166
+ const _hoisted_10 = { class: "title" };
167
+ const _hoisted_11 = { class: "" };
168
+ const _hoisted_12 = {
169
+ key: 0,
170
+ class: "tabs"
171
+ };
172
+ const _hoisted_13 = ["onClick"];
173
+ const _hoisted_14 = { class: "opera" };
174
+ const _hoisted_15 = { class: "help-header" };
175
+ const _hoisted_16 = ["innerHTML"];
176
+ const _hoisted_17 = { class: "search-fields" };
177
+ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
178
+ const _component_el_popover = resolveComponent("el-popover");
179
+ const _component_epx_menu = resolveComponent("epx-menu");
180
+ const _component_mobile_sheet = resolveComponent("mobile-sheet");
181
+ const _component_el_switch = resolveComponent("el-switch");
182
+ const _component_el_button = resolveComponent("el-button");
183
+ const _component_el_dialog = resolveComponent("el-dialog");
184
+ const _component_epx_search_fields = resolveComponent("epx-search-fields");
185
+ return _ctx.$isMobile ? (openBlock(), createElementBlock("div", {
186
+ key: 0,
187
+ class: "mobile-header",
188
+ style: normalizeStyle(_ctx.$component.style)
189
+ }, [
190
+ createElementVNode("div", _hoisted_1, [
191
+ createElementVNode("i", {
192
+ class: "el-icon-arrow-left",
193
+ onClick: _cache[0] || (_cache[0] = (...args) => _ctx.backPage && _ctx.backPage(...args))
194
+ }),
195
+ createElementVNode("span", null, toDisplayString($options.pageTitle), 1)
196
+ ]),
197
+ _ctx.operates.length > 1 ? (openBlock(), createElementBlock("div", _hoisted_2, [
198
+ createVNode(_component_el_popover, {
199
+ "popper-class": "popper",
200
+ placement: "bottom",
201
+ trigger: "click"
202
+ }, {
203
+ reference: withCtx(() => [
204
+ _ctx.$configs.icon ? (openBlock(), createElementBlock("i", {
205
+ key: 0,
206
+ class: normalizeClass([_ctx.$configs.icon]),
207
+ style: { transform: "rotate(90deg)" }
208
+ }, null, 2)) : (openBlock(), createElementBlock("i", _hoisted_5))
209
+ ]),
210
+ default: withCtx(() => [
211
+ createElementVNode("ul", _hoisted_3, [
212
+ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.operates, (operate) => {
213
+ return openBlock(), createElementBlock("li", {
214
+ key: operate.text,
215
+ onClick: ($event) => _ctx.listHandler(operate)
216
+ }, [
217
+ createElementVNode("i", {
218
+ class: normalizeClass(["fa", operate.icon])
219
+ }, null, 2),
220
+ createTextVNode(" " + toDisplayString(operate.text), 1)
221
+ ], 8, _hoisted_4);
222
+ }), 128))
223
+ ])
224
+ ]),
225
+ _: 1
226
+ }),
227
+ _ctx.menu ? (openBlock(), createElementBlock("i", {
228
+ key: 0,
229
+ class: "menu-icon el-icon-s-fold",
230
+ onClick: _cache[1] || (_cache[1] = ($event) => _ctx.isMenuShow = true)
231
+ })) : createCommentVNode("", true),
232
+ createVNode(_component_mobile_sheet, {
233
+ modelValue: _ctx.isMenuShow,
234
+ "onUpdate:modelValue": _cache[3] || (_cache[3] = ($event) => _ctx.isMenuShow = $event),
235
+ position: "right",
236
+ size: "60%"
237
+ }, {
238
+ default: withCtx(() => [
239
+ createElementVNode("div", _hoisted_6, [
240
+ _ctx.menu ? (openBlock(), createBlock(_component_epx_menu, {
241
+ key: 0,
242
+ class: "menu",
243
+ modules: _ctx.menu,
244
+ moduleId: _ctx.module.ID,
245
+ moduleName: _ctx.module.NAME
246
+ }, null, 8, ["modules", "moduleId", "moduleName"])) : createCommentVNode("", true),
247
+ createElementVNode("div", {
248
+ class: "to-index",
249
+ onClick: _cache[2] || (_cache[2] = (...args) => _ctx.backIndex && _ctx.backIndex(...args))
250
+ }, [
251
+ _cache[8] || (_cache[8] = createElementVNode("i", { class: "el-icon-house" }, null, -1)),
252
+ createTextVNode(" " + toDisplayString(_ctx.$t("return home")), 1)
253
+ ])
254
+ ])
255
+ ]),
256
+ _: 1
257
+ }, 8, ["modelValue"])
258
+ ])) : (openBlock(), createElementBlock("div", _hoisted_7, [
259
+ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.operates, (operate) => {
260
+ return openBlock(), createElementBlock("li", {
261
+ class: "mobile-operate-btn",
262
+ key: operate.text,
263
+ onClick: ($event) => _ctx.listHandler(operate)
264
+ }, [
265
+ createElementVNode("i", {
266
+ class: normalizeClass(["fa", operate.icon])
267
+ }, null, 2),
268
+ createTextVNode(" " + toDisplayString(operate.text), 1)
269
+ ], 8, _hoisted_8);
270
+ }), 128))
271
+ ]))
272
+ ], 4)) : (openBlock(), createElementBlock("div", {
273
+ key: 1,
274
+ class: "header",
275
+ style: normalizeStyle(_ctx.$component.style)
276
+ }, [
277
+ createElementVNode("div", _hoisted_9, [
278
+ createElementVNode("div", _hoisted_10, [
279
+ (_ctx.routeLength !== 1 || _ctx.showBack || $options.reportBoardId) && !$options.isAiAgentPage ? (openBlock(), createElementBlock("i", {
280
+ key: 0,
281
+ class: "el-icon-arrow-left",
282
+ onClick: _cache[4] || (_cache[4] = (...args) => _ctx.backPage && _ctx.backPage(...args))
283
+ })) : createCommentVNode("", true),
284
+ createElementVNode("span", _hoisted_11, toDisplayString($options.pageTitle), 1)
285
+ ]),
286
+ _ctx.tabs && _ctx.tabs.length > 0 ? (openBlock(), createElementBlock("ul", _hoisted_12, [
287
+ (openBlock(true), createElementBlock(Fragment, null, renderList(_ctx.tabs, (tab, index) => {
288
+ return openBlock(), createElementBlock("li", {
289
+ class: normalizeClass(["tab-item", { "active": tab.active }]),
290
+ key: index,
291
+ onClick: ($event) => _ctx.change(tab, index)
292
+ }, toDisplayString(_ctx.tabTitle(tab, index)), 11, _hoisted_13);
293
+ }), 128))
294
+ ])) : createCommentVNode("", true),
295
+ createElementVNode("div", _hoisted_14, [
296
+ $props.scopeFlag && $props.globalSearchFields.length > 0 ? (openBlock(), createBlock(_component_el_switch, {
297
+ key: 0,
298
+ class: "seach-flag",
299
+ modelValue: $data.showSearchFields,
300
+ "onUpdate:modelValue": _cache[5] || (_cache[5] = ($event) => $data.showSearchFields = $event),
301
+ "inactive-text": "查询筛选:"
302
+ }, null, 8, ["modelValue"])) : createCommentVNode("", true),
303
+ createVNode(_component_el_button, {
304
+ class: "opera-item",
305
+ type: "primary",
306
+ link: "",
307
+ onClick: $options.reloadPageConfig
308
+ }, {
309
+ default: withCtx(() => [..._cache[9] || (_cache[9] = [
310
+ createElementVNode("i", { class: "el-icon-refresh" }, null, -1),
311
+ createTextVNode(" " + toDisplayString("刷新页面"), -1)
312
+ ])]),
313
+ _: 1
314
+ }, 8, ["onClick"]),
315
+ createVNode(_component_el_button, {
316
+ class: "opera-item",
317
+ type: "primary",
318
+ link: "",
319
+ onClick: $options.switchFullscreen
320
+ }, {
321
+ default: withCtx(() => [
322
+ _cache[10] || (_cache[10] = createElementVNode("i", { class: "el-icon-full-screen" }, null, -1)),
323
+ createTextVNode(" " + toDisplayString($data.fullscreen ? "取消全屏" : "全屏"), 1)
324
+ ]),
325
+ _: 1
326
+ }, 8, ["onClick"]),
327
+ _ctx.showPageConfigBtn && !$options.isAiAgentPage || $options.reportBoardId ? (openBlock(), createBlock(_component_el_button, {
328
+ key: 1,
329
+ class: "opera-item",
330
+ type: "primary",
331
+ link: "",
332
+ onClick: $options.newPageSettingVisual
333
+ }, {
334
+ default: withCtx(() => [..._cache[11] || (_cache[11] = [
335
+ createElementVNode("i", { class: "el-icon-edit-outline" }, null, -1),
336
+ createTextVNode(" 设计 ", -1)
337
+ ])]),
338
+ _: 1
339
+ }, 8, ["onClick"])) : createCommentVNode("", true),
340
+ _ctx.$configs.showHelp && _ctx.$configs.help ? (openBlock(), createBlock(_component_el_dialog, {
341
+ key: 2,
342
+ class: "help-dialog",
343
+ modelValue: _ctx.showHelpDialog,
344
+ "onUpdate:modelValue": _cache[7] || (_cache[7] = ($event) => _ctx.showHelpDialog = $event),
345
+ modal: false,
346
+ width: "70%",
347
+ fullscreen: _ctx.helpDialogFullscreen
348
+ }, {
349
+ header: withCtx(() => [
350
+ createElementVNode("div", _hoisted_15, [
351
+ createElementVNode("span", null, toDisplayString(this.$t("helptext")), 1),
352
+ createElementVNode("i", {
353
+ class: "full-btn el-icon-full-screen",
354
+ onClick: _cache[6] || (_cache[6] = ($event) => _ctx.helpDialogFullscreen = !_ctx.helpDialogFullscreen)
355
+ })
356
+ ])
357
+ ]),
358
+ default: withCtx(() => [
359
+ createElementVNode("div", {
360
+ class: "help-content",
361
+ innerHTML: _ctx.xss.process(_ctx.$configs.help)
362
+ }, null, 8, _hoisted_16)
363
+ ]),
364
+ _: 1
365
+ }, 8, ["modelValue", "fullscreen"])) : createCommentVNode("", true)
366
+ ])
367
+ ]),
368
+ withDirectives(createElementVNode("div", _hoisted_17, [
369
+ createVNode(_component_epx_search_fields, {
370
+ metaId: _ctx.$metaId,
371
+ fields: $props.globalSearchFields,
372
+ showFilter: true,
373
+ showKeyword: false,
374
+ showSearchLabel: true,
375
+ onSearch: $options.search
376
+ }, null, 8, ["metaId", "fields", "onSearch"])
377
+ ], 512), [
378
+ [vShow, $data.showSearchFields]
379
+ ])
380
+ ], 4));
381
+ }
382
+ const DashboardHeader = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render], ["__scopeId", "data-v-370a2887"]]);
383
+ export {
384
+ DashboardHeader as default
385
+ };
@@ -0,0 +1,27 @@
1
+ import { openBlock, createElementBlock } from "vue";
2
+ import _export_sfc from "../_virtual/_plugin-vue_export-helper.js";
3
+ const _sfc_main = {
4
+ name: "epx-dashboard--preview",
5
+ props: {
6
+ compConfigs: {
7
+ type: Object,
8
+ default() {
9
+ return {};
10
+ }
11
+ }
12
+ },
13
+ inject: ["pageMetaId"],
14
+ computed: {
15
+ currentMetaId() {
16
+ const { metaId = this.pageMetaId } = this.compConfigs;
17
+ return metaId;
18
+ }
19
+ }
20
+ };
21
+ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
22
+ return openBlock(), createElementBlock("div", null, " 仪表盘预览 ");
23
+ }
24
+ const Preview = /* @__PURE__ */ _export_sfc(_sfc_main, [["render", _sfc_render]]);
25
+ export {
26
+ Preview as default
27
+ };