@epxing/dashboard 0.0.0-stage → 5.3.0-beta.2

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