kd-lane-container 0.0.7 → 0.0.9

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.
package/README.md CHANGED
@@ -1,8 +1,8 @@
1
- # KdLaneChartContainer 组件使用文档
1
+ # KdLaneContainer 组件使用文档
2
2
 
3
3
  ## 1. 组件概述
4
4
 
5
- KdLaneChartContainer 是一个基于 Vue 开发的泳道图容器组件,用于展示和管理泳道模板、线条配置等。
5
+ KdLaneContainer 是一个基于 Vue 开发的泳道图容器组件,用于展示和管理泳道模板、线条配置等。
6
6
 
7
7
  ### 1.1 设计思路
8
8
 
@@ -13,6 +13,21 @@ KdLaneChartContainer 是一个基于 Vue 开发的泳道图容器组件,用于
13
13
  - 适合合作单位使用,提供灵活的数据接入方式
14
14
  - **技术栈无关**:不限制绘制区技术栈,绘制逻辑完全由外部实现,只需要监听组件事件即可动态调整绘制内容
15
15
 
16
+ ### 1.2 组件更名说明
17
+
18
+ **重要通知:从版本 0.0.8 开始,组件名称正式从 `KdLaneChartContainer` 更名为 `KdLaneContainer`**
19
+
20
+ #### 更名必要性:
21
+
22
+ 1. **更准确的功能定位**:原名称包含 "Chart"(图表),但组件实际上是一个通用的泳道容器,不直接负责图表绘制,更名后更符合其实际功能定位
23
+ 2. **简化命名**:去掉冗余的 "Chart" 后缀,使组件名称更简洁易记
24
+ 3. **避免语义混淆**:澄清了组件职责边界,明确表示这是一个容器组件而非图表组件,避免与其他图表组件混淆,和包名保持一致
25
+
26
+ #### 版本兼容性:
27
+
28
+ - 版本 0.0.8 及以后:统一使用 `KdLaneContainer`
29
+ - 版本 0.0.7 及之前:使用旧名称 `KdLaneChartContainer`
30
+
16
31
  ## 2. 组件功能
17
32
 
18
33
  - 加载和展示泳道模板
@@ -31,11 +46,11 @@ KdLaneChartContainer 是一个基于 Vue 开发的泳道图容器组件,用于
31
46
  // npm install kd-lane-container --save
32
47
 
33
48
  // 引入组件
34
- import KdLaneChartContainer from "kd-lane-container";
49
+ import KdLaneContainer from "kd-lane-container";
35
50
  import Vue from "vue";
36
51
 
37
52
  // 注册组件
38
- Vue.use(KdLaneChartContainer);
53
+ Vue.use(KdLaneContainer);
39
54
  ```
40
55
 
41
56
  ### 3.2 在组件中使用
@@ -53,43 +68,85 @@ export default {
53
68
  ### 4.1 基本使用
54
69
 
55
70
  ```vue
56
- <KdLaneChartContainer class="container" :config="config" :customMenuList="customMenuList" @onCustomMenuClicked="onCustomMenuClicked">
57
- <!-- 自定义插槽内容 -->
58
- </KdLaneChartContainer>
71
+ <KdLaneContainer
72
+ class="container"
73
+ :config="config"
74
+ :customMenuList="customMenuList"
75
+ @onCustomMenuClicked="onCustomMenuClicked"
76
+ @template-change="templateChange"
77
+ @line-change="lineChange"
78
+ :themeName="themeName"
79
+ >
80
+ <!-- 动态slot,处理容器抬头自定义布局 -->
81
+ <template v-if="headerSlotName">
82
+ <div :slot="headerSlotName" class="header-slot">
83
+ {{ headerSlotName }}
84
+ </div>
85
+ </template>
86
+ <!-- 处理draw-slot中泳道div -->
87
+ <template v-if="lanes && lanes.length > 0" slot="draw-slot">
88
+ <div class="draw-slot">
89
+ <template v-for="lane in lanes">
90
+ <!-- 如果title定义了,需要和title保持一样宽度 -->
91
+ <div v-if="lane.laneKey == 'depth'" :key="lane.laneId" style="width: 80px; height: 100%; overflow: hidden">
92
+ {{ lane.laneKey }}
93
+ </div>
94
+ <!-- 平分的泳道布局 -->
95
+ <div v-else class="lane-div" :key="`lane-${lane.laneId}`">
96
+ {{ lane.laneId }}
97
+ </div>
98
+ </template>
99
+ </div>
100
+ </template>
101
+ </KdLaneContainer>
59
102
  ```
60
103
 
104
+ #### 使用步骤说明
105
+
106
+ 1. **配置组件**:
107
+ - 通过 `config` 属性传入初始配置,包括数据源类型、案例ID、版本号等。
108
+ - 通过 `customMenuList` 属性传入自定义菜单列表。
109
+
110
+ 2. **监听事件动态渲染**:
111
+ - 监听 `template-change` 事件,获取最新的泳道数据(`lanes`),动态渲染自定义抬头和泳道布局。
112
+ - 监听 `line-change` 事件,处理线条配置的变化。
113
+
114
+ 3. **主题变化处理**:
115
+ - 主题变更是由外部触发的,组件仅负责根据 `themeName` 属性正确渲染标题。
116
+ - 模板和线条的变化需要自行处理,组件不会主动通知这些变化。
117
+
61
118
  ### 4.2 场景与版本控制
62
119
 
63
- #### 4.1.1 场景唯一标识规则
120
+ #### 4.2.1 场景唯一标识规则
64
121
 
65
122
  - **caseId (场景 ID)**:用于唯一标识不同的应用场景或业务模块。
66
123
  - 必须确保在同一应用中唯一,否则会导致数据混淆。
67
124
  - 建议使用业务模块名称或唯一的 UUID。
68
125
  - 所有数据操作都将与该场景 ID 绑定,确保数据隔离。
69
126
 
70
- #### 4.1.2 版本号管理
127
+ #### 4.2.2 版本号管理
71
128
 
72
129
  - **versionCode (版本号)**:用于管理不同版本的初始配置。
73
130
  - 当业务需求发生重大变更时,可以通过升级版本号来重置数据。
74
131
  - 版本号升级后,系统会自动清理旧版本数据并重新初始化。
75
132
  - 版本号必须为整数,建议从 1 开始递增。
76
133
 
77
- #### 4.1.3 数据初始化策略
134
+ #### 4.2.3 数据初始化策略
78
135
 
79
136
  - 首次初始化:系统会将传入的`dataSource`保存为当前版本的初始配置。
80
137
  - 版本冲突:当检测到版本号变更时,系统会自动重置数据并使用新版本的配置。
81
138
  - 异常恢复:如果初始化过程中出现错误,系统会自动执行重置操作。
82
139
 
83
- ### 4.2 配置参数
140
+ ### 4.3 配置参数
84
141
 
85
- #### 4.2.1 数据源类型选择说明
142
+ #### 4.3.1 数据源类型选择说明
86
143
 
87
- KdLaneChartContainer 支持两种数据源类型:
144
+ KdLaneContainer 支持两种数据源类型:
88
145
 
89
146
  - **local**:无后台配置接口,仅需前端单方面维护配置时使用
90
147
  - **custom**:需要本组件 + 后台实时曲线配置接口组合使用时使用
91
148
 
92
- #### 4.2.2 本地数据源 (Local)
149
+ #### 4.3.2 本地数据源 (Local)
93
150
 
94
151
  ```javascript
95
152
  config: {
@@ -159,7 +216,7 @@ config: {
159
216
  }
160
217
  ```
161
218
 
162
- #### 4.2.3 自定义数据源 (Custom)
219
+ #### 4.3.3 自定义数据源 (Custom)
163
220
 
164
221
  ```javascript
165
222
  config: {
@@ -230,11 +287,11 @@ config: {
230
287
  8. `restoreSetting()` (可选)
231
288
  - 返回值:`Promise<void>` - 恢复默认设置的 Promise
232
289
 
233
- ### 4.3 自定义菜单
290
+ ### 4.4 自定义菜单
234
291
 
235
292
  customMenuList 用于在上下文菜单中添加自定义操作选项。当用户在泳道头部或线条上右键点击时,这些自定义选项会出现在上下文菜单中。
236
293
 
237
- #### 4.3.1 菜单结构
294
+ #### 4.4.1 菜单结构
238
295
 
239
296
  ```javascript
240
297
  customMenuList: [
@@ -249,7 +306,7 @@ customMenuList: [
249
306
  ];
250
307
  ```
251
308
 
252
- #### 4.3.2 点击事件
309
+ #### 4.4.2 点击事件
253
310
 
254
311
  当用户点击自定义菜单项时,会触发 `onCustomMenuClicked` 事件,并传递以下参数:
255
312
 
@@ -257,13 +314,13 @@ customMenuList: [
257
314
  - `option`: 被点击的菜单项配置
258
315
  - `item`: 右键点击时的目标对象(可能是泳道或线条)
259
316
 
260
- #### 4.3.3 使用示例
317
+ #### 4.4.3 使用示例
261
318
 
262
- ```html
263
- <kd-lane-chart-container
264
- :customMenuList=\"[{ name: '单屏时长', key: 'timeRange' }]\"
265
- @onCustomMenuClicked=\"handleCustomMenuClick\">
266
- </kd-lane-chart-container>
319
+ ```vue
320
+ <KdLaneContainer
321
+ :customMenuList="[{ name: '单屏时长', key: 'timeRange' }]"
322
+ @onCustomMenuClicked="handleCustomMenuClick">
323
+ </KdLaneContainer>
267
324
  ```
268
325
 
269
326
  ```javascript
@@ -345,7 +402,7 @@ handleCustomMenuClick(event) {
345
402
  组件支持根据泳道 ID 动态生成的插槽,用于自定义泳道头部:
346
403
 
347
404
  ```vue
348
- <KdLaneChartContainer ...>
405
+ <KdLaneContainer ...>
349
406
  <!-- 动态slot名称 -->
350
407
  <template v-if="slotName">
351
408
  <div :slot="slotName" class="demo-slot">
@@ -357,26 +414,26 @@ handleCustomMenuClick(event) {
357
414
  <template v-if="slotName2" :slot="slotName2" slot-scope="slotData">
358
415
  <div class="demo-slot">{{ typeof slotData }}</div>
359
416
  </template>
360
- </KdLaneChartContainer>
417
+ </KdLaneContainer>
361
418
  ```
362
419
 
363
420
  插槽名称格式为 `lane${laneId}`,例如:`lane1556bdbfd0f24c11948b14999947c556`。
364
421
 
365
- ### 6.2 draw-slot 画布插槽
422
+ ### 6.1 draw-slot 画布插槽
366
423
 
367
424
  组件提供 `draw-slot` 插槽用于自定义绘制内容,该插槽占据泳道下方的整个绘制区域:
368
425
 
369
426
  ```vue
370
- <KdLaneChartContainer ...>
427
+ <KdLaneContainer ...>
371
428
  <template slot="draw-slot">
372
429
  <div style="height: 100%; width: 100%; padding: 10px">
373
430
  <!-- 自定义绘制内容 -->
374
431
  </div>
375
432
  </template>
376
- </KdLaneChartContainer>
433
+ </KdLaneContainer>
377
434
  ```
378
435
 
379
- ### 6.3 插槽布局与尺寸注意事项
436
+ ### 6.2 插槽布局与尺寸注意事项
380
437
 
381
438
  1. **布局方式**:
382
439
 
@@ -404,21 +461,45 @@ handleCustomMenuClick(event) {
404
461
  </template>
405
462
  ```
406
463
 
407
- ## 7. 主题颜色设置
464
+ ## 7. 主题与样式定制
408
465
 
409
- ### 7.1 组件主题属性
466
+ ### 7.1 组件级 CSS 变量
410
467
 
411
- 组件支持通过 `themeName` 属性设置当前主题,可选值包括 `white`、`dark` 和 `gray`。
468
+ 可以通过 CSS 变量或直接覆盖样式来自定义组件外观:
469
+
470
+ 组件提供了以下 CSS 变量用于主题适配:
471
+
472
+ | 变量名 | 默认值 | 说明 |
473
+ | ---------------------------------------------------- | --------- | ---------------------- |
474
+ | `--kd-lane-container-border-color` | `#333` | 组件边框颜色 |
475
+ | `--kd-lane-container-header-item-color` | `#333` | 头部线条项文字颜色 |
476
+ | `--kd-lane-container-context-background-color` | `#ecf0f1` | 上下文菜单背景色 |
477
+ | `--kd-lane-container-context-item-color` | `#333` | 上下文菜单文字颜色 |
478
+ | `--kd-lane-container-context-hover-background-color` | `#007aff` | 上下文菜单悬停背景色 |
479
+ | `--kd-lane-container-context-hover-item-color` | `#fff` | 上下文菜单悬停文字颜色 |
480
+ | `--kd-lane-container-context-divider-color` | `#595a5a` | 上下文菜单分割线颜色 |
481
+
482
+ ### 7.2 CSS 变量使用示例
483
+
484
+ ```css
485
+ .kd-lane-chart-container {
486
+ --kd-lane-container-border-color: white;
487
+ --kd-lane-container-context-background-color: darkgray;
488
+ --kd-lane-container-header-item-color: white;
489
+ }
490
+ ```
491
+
492
+ ### 7.3 线条级别主题配置
493
+
494
+ 组件支持通过 `themeName` 属性设置当前主题,配合 line 的 themeConfig 来实现表头线条和图表线条颜色主题适配。
412
495
 
413
496
  ```vue
414
- <KdLaneChartContainer
497
+ <KdLaneContainer
415
498
  :themeName="themeName"
416
499
  ...
417
500
  >
418
501
  ```
419
502
 
420
- ### 7.2 线条级别主题配置
421
-
422
503
  每个线条对象可以通过 `themeConfig` 属性配置不同主题下的颜色,格式为:
423
504
 
424
505
  ```javascript
@@ -446,51 +527,12 @@ lines: [
446
527
 
447
528
  当组件的 `themeName` 变化时,线条会自动应用对应主题的颜色。如果未配置 `themeConfig`,则使用默认的 `lineColor`。
448
529
 
449
- ### 7.3 主题切换示例
450
-
451
- ````vue
452
- <template>
453
- <div id="app">
454
- <KdLaneChartContainer class="container" :config="config" :themeName="themeName" ...>
455
- <!-- 插槽内容 -->
456
- </KdLaneChartContainer>
457
- <div style="display: flex">
458
- <button @click="changeCheme('white')">white</button>
459
- <button @click="changeCheme('dark')">dark</button>
460
- <button @click="changeCheme('gray')">gray</button>
461
- </div>
462
- </div>
463
- </template>
464
-
465
- <script>
466
- export default {
467
- data() {
468
- return {
469
- themeName: "white", // 默认主题
470
- // ...其他配置
471
- };
472
- },
473
- methods: {
474
- changeCheme(themeName) {
475
- this.themeName = themeName;
476
- // 可选:给body设置data-theme属性,用于全局样式切换
477
- document.body.setAttribute("data-theme", themeName);
478
- },
479
- },
480
- };
481
- </script>
482
-
483
- ## 8. 样式定制 可以通过 CSS 变量或直接覆盖样式来自定义组件外观: ```css .kd-lane-chart-container { --kd-lane-container-border-color: white;
484
- --kd-lane-container-context-background-color: darkgray; --kd-lane-container-context-hover-color: darkgray;
485
- --kd-lane-container-header-item-color: white; --app-background-color: gray; }
486
- ````
487
-
488
530
  ## 8. 使用示例
489
531
 
490
532
  ```vue
491
533
  <template>
492
534
  <div id="app">
493
- <KdLaneChartContainer class="container" :config="config" :customMenuList="customMenuList" @onCustomMenuClicked="onCustomMenuClicked">
535
+ <KdLaneContainer class="container" :config="config" :customMenuList="customMenuList" @onCustomMenuClicked="onCustomMenuClicked">
494
536
  <!-- 动态slot名称,这里全部使用的是旧语法 -->
495
537
  <template v-if="slotName">
496
538
  <div :slot="slotName" class="demo-slot">
@@ -500,14 +542,14 @@ export default {
500
542
  <template v-if="slotName2" :slot="slotName2" slot-scope="slotData">
501
543
  <div class="demo-slot">{{ typeof slotData }}</div>
502
544
  </template>
503
- </KdLaneChartContainer>
545
+ </KdLaneContainer>
504
546
  </div>
505
547
  </template>
506
548
 
507
549
  <script>
508
550
  import Vue from "vue";
509
- import KdLaneChartContainer from "kd-lane-container";
510
- Vue.use(KdLaneChartContainer);
551
+ import KdLaneContainer from "kd-lane-container";
552
+ Vue.use(KdLaneContainer);
511
553
  import { data } from "./mock/mockData.js";
512
554
  export default {
513
555
  name: "App",
@@ -572,3 +614,4 @@ export default {
572
614
  }
573
615
  </style>
574
616
  ```
617
+ ````
package/dist/cjs/index.js CHANGED
@@ -2114,7 +2114,7 @@ __vue_render__$5._withStripped = true;
2114
2114
  //
2115
2115
 
2116
2116
  var script$4 = {
2117
- inject: ["upsertLine", "setTargetData", "setExpanded"],
2117
+ inject: ["upsertLine", "setTargetData", "setExpanded", "getThemeName"],
2118
2118
  props: {
2119
2119
  template: {
2120
2120
  type: Object,
@@ -2194,6 +2194,14 @@ var script$4 = {
2194
2194
  .validate()
2195
2195
  .then(() => {
2196
2196
  if (this.upsertLine instanceof Function) {
2197
+ // 检查是否有主题配置
2198
+ const themeName = this.getThemeName();
2199
+ const themeConfig = this.formData.themeConfig;
2200
+ if (themeName && themeConfig && themeConfig[themeName]) {
2201
+ const theme = themeConfig[themeName];
2202
+ theme.lineColor = this.formData.lineColor;
2203
+ }
2204
+ this.saving = true;
2197
2205
  const result = this.upsertLine(this.formData);
2198
2206
  if (result instanceof Promise) {
2199
2207
  result
@@ -2226,7 +2234,22 @@ var script$4 = {
2226
2234
  immediate: false,
2227
2235
  deep: true,
2228
2236
  handler(newD) {
2229
- this.formData = Object.assign({}, newD);
2237
+ // 检查是否有主题配置
2238
+ const themeName = this.getThemeName();
2239
+ const themeConfig = newD.themeConfig;
2240
+ let themeLineColor;
2241
+ if (themeName && themeConfig && themeConfig[themeName]) {
2242
+ const theme = themeConfig[themeName];
2243
+ const lineColor = theme.lineColor;
2244
+ if (lineColor) {
2245
+ themeLineColor = lineColor;
2246
+ }
2247
+ }
2248
+ if (themeLineColor) {
2249
+ this.formData = Object.assign({}, newD, { lineColor: themeLineColor });
2250
+ } else {
2251
+ this.formData = Object.assign({}, newD);
2252
+ }
2230
2253
  },
2231
2254
  },
2232
2255
  },
@@ -2511,10 +2534,6 @@ Vue__default["default"].use(vClickOutside__default["default"]);
2511
2534
  var script$3 = {
2512
2535
  name: "VueSimpleContextMenu",
2513
2536
  props: {
2514
- elementId: {
2515
- type: String,
2516
- required: true,
2517
- },
2518
2537
  options: {
2519
2538
  type: Array,
2520
2539
  required: true,
@@ -2531,7 +2550,7 @@ var script$3 = {
2531
2550
  showMenu(event, item) {
2532
2551
  this.item = item;
2533
2552
 
2534
- var menu = document.getElementById(this.elementId);
2553
+ const menu = this.$refs.refUl;
2535
2554
  if (!menu) {
2536
2555
  return;
2537
2556
  }
@@ -2555,11 +2574,10 @@ var script$3 = {
2555
2574
  } else {
2556
2575
  menu.style.top = event.pageY - 2 + "px";
2557
2576
  }
2558
-
2559
2577
  menu.classList.add("vue-simple-context-menu--active");
2560
2578
  },
2561
2579
  hideContextMenu() {
2562
- const element = document.getElementById(this.elementId);
2580
+ const element = this.$refs.refUl;
2563
2581
  if (element) {
2564
2582
  element.classList.remove("vue-simple-context-menu--active");
2565
2583
  this.$emit("menu-closed");
@@ -2611,8 +2629,8 @@ var __vue_render__$3 = function () {
2611
2629
  expression: "onClickOutside",
2612
2630
  },
2613
2631
  ],
2632
+ ref: "refUl",
2614
2633
  staticClass: "vue-simple-context-menu",
2615
- attrs: { id: _vm.elementId },
2616
2634
  },
2617
2635
  _vm._l(_vm.options, function (option, index) {
2618
2636
  return _c(
@@ -3201,10 +3219,7 @@ var __vue_render__$2 = function () {
3201
3219
  _vm._v(" "),
3202
3220
  _c("VueSimpleContextMenu", {
3203
3221
  ref: "vueSimpleContextMenu",
3204
- attrs: {
3205
- "element-id": "kd-lane-chart-context-menu-2",
3206
- options: _vm.contextMenuOptions,
3207
- },
3222
+ attrs: { options: _vm.contextMenuOptions },
3208
3223
  on: { "option-clicked": _vm.optionClicked },
3209
3224
  }),
3210
3225
  ],
@@ -3419,7 +3434,7 @@ __vue_render__$1._withStripped = true;
3419
3434
  //
3420
3435
 
3421
3436
  var script = {
3422
- name: "KdLaneChartContainer",
3437
+ name: "KdLaneContainer",
3423
3438
  provide() {
3424
3439
  return {
3425
3440
  upsertTemplate: this.upsertTemplate,
@@ -3428,6 +3443,9 @@ var script = {
3428
3443
  delLane: this.delLane,
3429
3444
  upsertLine: this.upsertLine,
3430
3445
  delLine: this.delLine,
3446
+ getThemeName: () => {
3447
+ return this.themeName;
3448
+ },
3431
3449
  };
3432
3450
  },
3433
3451
  components: {
@@ -3958,10 +3976,7 @@ var __vue_render__ = function () {
3958
3976
  _vm._v(" "),
3959
3977
  _c("VueSimpleContextMenu", {
3960
3978
  ref: "vueSimpleContextMenu",
3961
- attrs: {
3962
- "element-id": "kd-lane-chart-context-menu",
3963
- options: _vm.contextMenuOptions,
3964
- },
3979
+ attrs: { options: _vm.contextMenuOptions },
3965
3980
  on: { "option-clicked": _vm.optionClicked },
3966
3981
  }),
3967
3982
  _vm._v(" "),
@@ -1,2 +1,2 @@
1
- !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("vue"),require("v-click-outside")):"function"==typeof define&&define.amd?define(["vue","v-click-outside"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).KdLaneChartContainer=t(e.Vue,e.vClickOutside)}(this,function(e,t){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=n(e),r=n(t);class s{constructor(e){this.strategy=e}getUserTemplates(){return this.strategy.getUserTemplates()}upsertTemplate(e){return this.strategy.upsertTemplate(e)}delTemplate(e){return this.strategy.deleteTemplate(e)}upsertLane(e){return this.strategy.upsertLane(e)}delLane(e){return this.strategy.deleteLane(e)}upsertLine(e){return this.strategy.upsertLine(e)}delLine(e){return this.strategy.delLine(e)}restoreSetting(){return this.strategy.restoreSetting?this.strategy.restoreSetting():Promise.resolve()}}class i{static DB_NAME="KDLaneChartContainerConfigDB";static MAX_UNICODE_CHAR="￿";static DB_VERSION=2;static STORE_NAMES={TEMPLATES:"templates",LANES:"lanes",LINES:"lines",PARAMS:"params",CASE_VERSIONS:"case_versions"};_db=null;_openDB(){return new Promise((e,t)=>{if(this._db)return void e(this._db);const n=indexedDB.open(i.DB_NAME,i.DB_VERSION);n.onupgradeneeded=e=>{const t=e.target.result,{STORE_NAMES:n}=i;t.objectStoreNames.contains(n.CASE_VERSIONS)||t.createObjectStore(n.CASE_VERSIONS,{keyPath:"caseId"}),t.objectStoreNames.contains(n.TEMPLATES)||t.createObjectStore(n.TEMPLATES,{keyPath:["caseId","templateId"]}),t.objectStoreNames.contains(n.LANES)||t.createObjectStore(n.LANES,{keyPath:["caseId","laneId"]}),t.objectStoreNames.contains(n.LINES)||t.createObjectStore(n.LINES,{keyPath:["caseId","lineId"]}),t.objectStoreNames.contains(n.PARAMS)||t.createObjectStore(n.PARAMS,{keyPath:["caseId","paramId"]})},n.onsuccess=t=>{this._db=t.target.result,this._db.onclose=()=>{this._db=null},e(this._db)},n.onerror=e=>{t(new Error(`打开数据库失败:${e.target.error.message}`))},n.onblocked=()=>{t(new Error("数据库操作被阻塞,请关闭其他标签页后重试"))}})}closeDB(){return new Promise(e=>{this._db&&(this._db.close(),this._db=null),e()})}_compareVersion(e,t){const n=e=>String(e).split(".").map(Number),a=n(e),r=n(t),s=Math.max(a.length,r.length);for(let e=0;e<s;e++){const t=a[e]||0,n=r[e]||0;if(t>n)return 1;if(t<n)return-1}return 0}_clearSceneData(e){return this._openDB().then(t=>new Promise((n,a)=>{const r=t.transaction([i.STORE_NAMES.CASE_VERSIONS,i.STORE_NAMES.TEMPLATES,i.STORE_NAMES.LANES,i.STORE_NAMES.LINES,i.STORE_NAMES.PARAMS],"readwrite"),s=r.objectStore(i.STORE_NAMES.TEMPLATES),o=r.objectStore(i.STORE_NAMES.LANES),l=r.objectStore(i.STORE_NAMES.LINES),d=r.objectStore(i.STORE_NAMES.CASE_VERSIONS),c=r.objectStore(i.STORE_NAMES.PARAMS),m=IDBKeyRange.bound([e],[e,i.MAX_UNICODE_CHAR]);s.delete(m),o.delete(m),l.delete(m),c.delete(m),d.delete(e),r.oncomplete=()=>n(),r.onerror=e=>a(new Error(`事务失败:${e.target.error.message}`))}))}_promisifyRequest(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)})}forceInitSceneConfig(e,t,n){return e&&t?this._clearSceneData(e).then(()=>{const a=this.setUpData(e,t,n);return this.batchAddConfig(a)}).catch(e=>{throw new Error(`强制初始化场景配置失败:${e.message}`)}):Promise.reject(new Error("caseId和versionCode为强制初始化的必传参数"))}setUpData(e,t,n){const a=n.templates.map(t=>({...t,caseId:e})),r=n.lanes.map(t=>({...t,caseId:e})),s=n.lines.map(t=>({...t,caseId:e})),i=n.params.map(t=>({...t,caseId:e}));return{caseVersion:{caseId:e,versionCode:t,updateTime:new Date},templates:a,lanes:r,lines:s,params:i}}checkConfigIntegrity(e,t){return this.getCaseVersionByCaseId(e).then(n=>!(!n||n.versionCode!==t)&&this.getTemplatesByCaseId(e).then(t=>{if(0===t.length)return!0;const n=t[0].templateId;return this.getLanesByTemplateId(e,n).then(t=>{if(0===t.length)return!0;const n=t[0].laneId;return this.getLinesByLaneId(e,n).then(e=>0===e.length)})}))}_initSceneConfig(e){const{caseVersion:t}=e,{caseId:n,versionCode:a}=t;return this.getCaseVersionByCaseId(n).then(t=>{if(!t)return this.batchAddConfig(e);const r=this._compareVersion(a,t.versionCode);if(r>0)return this._clearSceneData(n).then(()=>this.batchAddConfig(e));if(0===r)return console.log(`场景${n}已存在版本${a},无需重复创建`),Promise.resolve(t);throw new Error(`场景${n}当前版本${t.versionCode}高于待创建版本${a}。`)})}saveSceneConfig(e,t,n){if(!e||!t)return Promise.reject(new Error("caseId和versionCode为必传参数"));if(!Array.isArray(n.templates)||!Array.isArray(n.lanes)||!Array.isArray(n.lines))return Promise.reject(new Error("templates/lanes/lines必须为数组"));const a=this.setUpData(e,t,n);return this._initSceneConfig(a)}batchAddConfig(e){return this._openDB().then(t=>new Promise((n,a)=>{const r=t.transaction([i.STORE_NAMES.CASE_VERSIONS,i.STORE_NAMES.TEMPLATES,i.STORE_NAMES.LANES,i.STORE_NAMES.LINES,i.STORE_NAMES.PARAMS],"readwrite");r.objectStore(i.STORE_NAMES.CASE_VERSIONS).put(e.caseVersion);const s=r.objectStore(i.STORE_NAMES.TEMPLATES);e.templates.forEach(e=>s.put(e));const o=r.objectStore(i.STORE_NAMES.LANES);e.lanes.forEach(e=>o.put(e));const l=r.objectStore(i.STORE_NAMES.LINES);e.lines.forEach(e=>l.put(e));const d=r.objectStore(i.STORE_NAMES.PARAMS);e.params.forEach(e=>d.put(e)),r.oncomplete=()=>n(e),r.onerror=e=>a(new Error(`批量添加配置失败:${e.target.error.message}`))}))}upsertCaseVersion(e){return this._openDB().then(t=>new Promise((n,a)=>{const r=t.transaction([i.STORE_NAMES.CASE_VERSIONS],"readwrite").objectStore(i.STORE_NAMES.CASE_VERSIONS),s={updateTime:new Date,...e};this._promisifyRequest(r.put(s)).then(()=>n(s)).catch(e=>a(new Error(`更新场景版本失败:${e.message}`)))}))}getCaseVersionByCaseId(e){return this._openDB().then(t=>new Promise((n,a)=>{const r=t.transaction([i.STORE_NAMES.CASE_VERSIONS],"readonly").objectStore(i.STORE_NAMES.CASE_VERSIONS);this._promisifyRequest(r.get(e)).then(e=>n(e||null)).catch(e=>a(new Error(`查询场景版本失败:${e.message}`)))}))}getConfigByCaseId(e){return e?Promise.all([this.getCaseVersionByCaseId(e),this.getTemplatesByCaseId(e),this.getParamsByCaseId(e)]).then(([t,n,a])=>{const r=n.map(t=>this.getLanesByTemplateId(e,t.templateId).then(n=>{const a=n.map(t=>this.getLinesByLaneId(e,t.laneId).then(e=>({...t,lines:e})));return Promise.all(a).then(e=>({...t,lanes:e}))}));return Promise.all(r).then(e=>({caseVersion:t,templates:e,params:a}))}).catch(e=>{throw new Error(`查询场景配置失败:${e.message}`)}):Promise.reject(new Error("caseId为必传参数"))}getConfigByTemplateId(e,t){if(!e||!t)return Promise.reject(new Error("caseId为必传参数"));const n={};return this.getLanesByTemplateId(e,t).then(t=>{const a=t.map(t=>this.getLinesByLaneId(e,t.laneId));return Promise.all(a).then(e=>{e.forEach((e,n)=>{t[n].lines=e}),n.lanes=t})}).then(()=>this.getTemplateById(e,t)).then(e=>(e.lanes=n.lanes,Promise.resolve(e)))}deleteCaseVersion(e){return this._openDB().then(t=>new Promise((n,a)=>{const r=t.transaction([i.STORE_NAMES.CASE_VERSIONS],"readwrite").objectStore(i.STORE_NAMES.CASE_VERSIONS);this._promisifyRequest(r.delete(e)).then(()=>n()).catch(e=>a(new Error(`删除场景版本失败:${e.message}`)))}))}upsertTemplate(e){return this._openDB().then(t=>new Promise((n,a)=>{if(!e.caseId)return void a(new Error("模板数据必须包含caseId"));const r=t.transaction([i.STORE_NAMES.TEMPLATES],"readwrite").objectStore(i.STORE_NAMES.TEMPLATES),s={...e,createDate:e.createDate?new Date(e.createDate):new Date,updateDate:e.updateDate?new Date(e.updateDate):null};return delete s.lanes,this._promisifyRequest(r.put(s)).then(()=>n(s)).catch(e=>a(new Error(`更新模板失败:${e.message}`)))}))}getTemplateById(e,t){return this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.TEMPLATES],"readonly").objectStore(i.STORE_NAMES.TEMPLATES);this._promisifyRequest(s.get([e,t])).then(e=>a(e||null)).catch(e=>r(new Error(`查询模板失败:${e.message}`)))}))}getTemplatesByCaseId(e){return this._openDB().then(t=>new Promise((n,a)=>{const r=t.transaction([i.STORE_NAMES.TEMPLATES],"readonly").objectStore(i.STORE_NAMES.TEMPLATES),s=IDBKeyRange.bound([e],[e,i.MAX_UNICODE_CHAR]);this._promisifyRequest(r.getAll(s)).then(e=>{n(e||[])}).catch(e=>a(new Error(`查询场景下模板失败:${e.message}`)))}))}deleteTemplate(e,t){return this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.TEMPLATES],"readwrite").objectStore(i.STORE_NAMES.TEMPLATES);this._promisifyRequest(s.delete([e,t])).then(()=>a()).catch(e=>r(new Error(`删除模板失败:${e.message}`)))}))}upsertLane(e,t){return this._openDB().then(n=>new Promise((a,r)=>{if(!e||!t.templateId)return void r(new Error("泳道数据必须包含caseId和templateId"));const s=n.transaction([i.STORE_NAMES.LANES],"readwrite").objectStore(i.STORE_NAMES.LANES),o={...t,caseId:e,updateDate:t.updateDate?new Date(t.updateDate):new Date};this._promisifyRequest(s.put(o)).then(()=>a(o)).catch(e=>r(new Error(`更新泳道失败:${e.message}`)))}))}getLaneById(e,t){return this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.LANES],"readonly").objectStore(i.STORE_NAMES.LANES);this._promisifyRequest(s.get([e,t])).then(e=>a(e||null)).catch(e=>r(new Error(`查询泳道失败:${e.message}`)))}))}getLanesByTemplateId(e,t){return this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.LANES],"readonly").objectStore(i.STORE_NAMES.LANES),o=IDBKeyRange.bound([e],[e,i.MAX_UNICODE_CHAR]);this._promisifyRequest(s.getAll(o)).then(e=>e.filter(e=>e.templateId===t)).then(e=>a(e||[])).catch(e=>r(new Error(`查询模板下泳道失败:${e.message}`)))}))}deleteLaneByLaneIds(e,t){return Array.isArray(t)&&0!==t.length?this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.LANES],"readwrite"),o=s.objectStore(i.STORE_NAMES.LANES);t.map(t=>this._promisifyRequest(o.delete([e,t]))),s.oncomplete=()=>a(),s.onerror=e=>r(new Error(`删除泳道失败:${e.target.error.message}`))})):Promise.resolve()}upsertLine(e,t){return this._openDB().then(n=>new Promise((a,r)=>{if(!e||!t.laneId)return void r(new Error("线条数据必须包含caseId和laneId"));const s=n.transaction([i.STORE_NAMES.LINES],"readwrite").objectStore(i.STORE_NAMES.LINES),o={...t,caseId:e,updateDate:t.updateDate?new Date(t.updateDate):new Date};this._promisifyRequest(s.put(o)).then(()=>a(o)).catch(e=>r(new Error(`更新线条失败:${e.message}`)))}))}getLineById(e,t){return this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.LINES],"readonly").objectStore(i.STORE_NAMES.LINES);this._promisifyRequest(s.get([e,t])).then(e=>a(e||null)).catch(e=>r(new Error(`查询线条失败:${e.message}`)))}))}getLinesByLaneId(e,t){return this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.LINES],"readonly").objectStore(i.STORE_NAMES.LINES),o=IDBKeyRange.bound([e],[e,i.MAX_UNICODE_CHAR]);this._promisifyRequest(s.getAll(o)).then(e=>e.filter(e=>e.laneId===t)).then(e=>a(e||[])).catch(e=>r(new Error(`查询泳道下线条失败:${e.message}`)))}))}deleteLineByIds(e,t){return Array.isArray(t)&&0!==t.length?this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.LINES],"readwrite"),o=s.objectStore(i.STORE_NAMES.LINES);t.map(t=>this._promisifyRequest(o.delete([e,t]))),s.oncomplete=()=>a(),s.onerror=e=>r(new Error(`批量删除线条失败:${e.target.error.message}`))})):Promise.resolve()}upsertParam(e){return this._openDB().then(t=>new Promise((n,a)=>{if(!e.caseId)return void a(new Error("参数数据必须包含caseId"));const r=t.transaction([i.STORE_NAMES.PARAMS],"readwrite").objectStore(i.STORE_NAMES.PARAMS),s={...e,updateDate:e.updateDate?new Date(e.updateDate):new Date};this._promisifyRequest(r.put(s)).then(()=>n(s)).catch(e=>a(new Error(`更新参数失败:${e.message}`)))}))}getParamById(e,t){return this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.PARAMS],"readonly").objectStore(i.STORE_NAMES.PARAMS);this._promisifyRequest(s.get([e,t])).then(e=>a(e||null)).catch(e=>r(new Error(`查询参数失败:${e.message}`)))}))}getParamsByCaseId(e){return this._openDB().then(t=>new Promise((n,a)=>{const r=t.transaction([i.STORE_NAMES.PARAMS],"readonly").objectStore(i.STORE_NAMES.PARAMS),s=IDBKeyRange.bound([e],[e,i.MAX_UNICODE_CHAR]);this._promisifyRequest(r.getAll(s)).then(e=>n(e||[])).catch(e=>a(new Error(`查询场景下参数失败:${e.message}`)))}))}deleteParamById(e,t){return this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.PARAMS],"readwrite").objectStore(i.STORE_NAMES.PARAMS);this._promisifyRequest(s.delete([e,t])).then(()=>a()).catch(e=>r(new Error(`删除参数失败:${e.message}`)))}))}}const o=new i;function l(e){return e&&"string"==typeof e&&parseFloat(e.replace("px",""))||0}function d(e){e&&Array.isArray(e.lines)&&e.lines.sort((e,t)=>(e.lineSort??0)-(t.lineSort??0))}function c(e){Array.isArray(e)&&(e.sort((e,t)=>(e.sort??0)-(t.sort??0)),e.forEach(e=>d(e)))}function m(e){return Array.isArray(e)&&0!==e.length?(e.sort((e,t)=>(e.sort??0)-(t.sort??0)),e.forEach(e=>c(e.lanes)),e):e}function h(e){return e?e.lineId&&e.laneId?"line":e.laneId&&e.templateId&&!e.lineId?"lane":e.templateId?"template":null:null}function p(e=!0){let t="";return t="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)}),e?t.replace(/-/g,""):t}class u{constructor(e,t,n,a=!0){this.caseId=e,this.versionCode=t,this.dataSource=n,this.flatData=a,this.ready=o.saveSceneConfig(e,t,n).catch(a=>(console.warn(`初始化数据库出错,直接重置:${a.message}`),o.forceInitSceneConfig(e,t,n)))}getUserTemplates(){return this.ready.then(()=>o.getConfigByCaseId(this.caseId))}upsertTemplate(e){let t;if(e.templateId)t=o.upsertTemplate(e);else{const n=p();if(e.templateId=n,e.baseTemplate){const a={};t=o.getLanesByTemplateId(this.caseId,e.baseTemplate).then(e=>{a.lanes=e;const t=e.map(e=>o.getLinesByLaneId(this.caseId,e.laneId));return Promise.all(t).then(e=>{const t=[];e.forEach((e,r)=>{const s=p();a.lanes[r].laneId=s,a.lanes[r].templateId=n,a.lanes[r].createUser=void 0,e.forEach(e=>{e.lineId=p(),e.laneId=s,e.createUser=void 0,t.push(e)})}),a.lines=t})}).then(()=>{a.templates=[e]}).then(()=>{a.params=[];const e=o.setUpData(this.caseId,this.versionCode,a);return o.batchAddConfig(e)}).then(()=>o.getTemplateById(this.caseId,n))}else t=o.upsertTemplate(e)}return"1"===e.isPublic?t.then(()=>o.getTemplatesByCaseId(this.caseId).then(t=>t.filter(t=>t.templateId!==e.templateId)).then(e=>{e.forEach(e=>{e.isPublic="0"});const t=e.map(e=>o.upsertTemplate(e));return Promise.all(t)}).then(()=>o.getConfigByTemplateId(this.caseId,e.templateId))):t}deleteTemplate(e){return o.getLanesByTemplateId(this.caseId,e.templateId).then(e=>{const t=e.map(e=>e.laneId);let n=t.map(e=>o.getLinesByLaneId(this.caseId,e));return Promise.all(n).then(e=>{const t=e.reduce((e,t)=>e.concat(t),[]).map(e=>e.lineId);return o.deleteLineByIds(this.caseId,t)}).then(()=>Promise.resolve(t))}).then(e=>o.deleteLaneByLaneIds(this.caseId,e)).then(()=>o.deleteTemplate(this.caseId,e.templateId)).then(()=>Promise.resolve(e))}upsertLane(e){return e.laneId||(e.laneId=p()),e.lines||(e.lines=[]),o.upsertLane(this.caseId,e)}delLane(e){const{lines:t,laneId:n}=e,a=t.map(e=>e.lineId);return o.deleteLineByIds(this.caseId,a).then(()=>o.deleteLaneByLaneIds(this.caseId,[n])).then(()=>Promise.resolve(e))}upsertLine(e){return e.lineId||(e.lineId=p()),e.laneId?o.upsertLine(this.caseId,e):Promise.reject(new Error("更新线条数据的时候,必须laneId不能为空!"))}delLine(e){return e.laneId?o.deleteLineByIds(this.caseId,[e.lineId]):Promise.reject(new Error("更新线条数据的时候,必须laneId不能为空!"))}restoreSetting(){return o.forceInitSceneConfig(this.caseId,this.versionCode,this.dataSource)}getType(){return"local-default"}}class f{static createStrategy(e){if("local"===e.type){let n;if((t=e.dataSource)&&Array.isArray(t.templates)&&Array.isArray(t.lanes)&&Array.isArray(t.lines)&&(0===t.templates.length||!t.templates[0].lanes))n={...e};else{if(!function(e){return Array.isArray(e)?0===e.length||!!e[0]&&Array.isArray(e[0].lanes):!!e&&Array.isArray(e.templates)&&(0===e.templates.length||Array.isArray(e.templates[0].lanes))}(e.dataSource))throw new Error("策略数据源格式不匹配");{const t=function(e){const t=[],n=[],a=[];for(const r of e){const{lanes:e,...s}=r;s.templateId||(s.templateId=p()),t.push(s);for(const t of e||[]){const{lines:e,...r}=t;r.templateId=s.templateId,r.laneId||(r.laneId=p()),n.push(r);for(const t of e||[])t.laneId=r.laneId,t.lineId||(t.lineId=p()),a.push(t)}}return{templates:t,lanes:n,lines:a}}(e.dataSource.templates);n={...e,dataSource:{...t,params:e.dataSource.params}}}}const{caseId:a,versionCode:r,dataSource:s}=n;return new u(a,r,s,!1)}return new s(e);var t}}var g={inject:["upsertTemplate","setTargetData","setExpanded"],props:{currentTemplate:{type:Object},formDisable:{type:Boolean},userTemplate:{type:Array},caseId:{type:String,default:""}},data(){return{formData:Object.assign({sort:void 0},this.currentTemplate),rules:{templateName:[{required:!0,message:"请输入模板名称",trigger:"blur"}]},saving:!1}},methods:{editable(){this.$emit("editable")},submitForm(e){this.$refs[e].validate(e=>{if(!e)return;if("function"!=typeof this.upsertTemplate)return void this.$message({type:"error",message:"没有配置模板管理方法"});this.saving=!0;const t={...this.formData};t.caseId||(t.caseId=this.caseId);const n=this.upsertTemplate(t);n instanceof Promise?n.then(e=>{this.setTargetData(e)}).then(()=>{this.$message({type:"success",message:"保存成功"})}).finally(()=>{this.saving=!1}):this.saving=!1})}},computed:{baseTemplate(){return this.userTemplate?[{name:"空白模板",value:""},...this.userTemplate.map(e=>({name:e.templateName,value:e.templateId}))]:[{name:"空白模板",value:""}]}},watch:{currentTemplate:{deep:!0,handler:function(e){this.formData=Object.assign({},e)}}}};function S(e,t){void 0===t&&(t={});var n=t.insertAt;if(e&&"undefined"!=typeof document){var a=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css","top"===n&&a.firstChild?a.insertBefore(r,a.firstChild):a.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}}function y(e,t,n,a,r,s,i,o,l,d){"boolean"!=typeof i&&(l=o,o=i,i=!1);const c="function"==typeof n?n.options:n;let m;if(e&&e.render&&(c.render=e.render,c.staticRenderFns=e.staticRenderFns,c._compiled=!0,r&&(c.functional=!0)),a&&(c._scopeId=a),s?(m=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),t&&t.call(this,l(e)),e&&e._registeredComponents&&e._registeredComponents.add(s)},c._ssrRegister=m):t&&(m=i?function(e){t.call(this,d(e,this.$root.$options.shadowRoot))}:function(e){t.call(this,o(e))}),m)if(c.functional){const e=c.render;c.render=function(t,n){return m.call(n),e(t,n)}}else{const e=c.beforeCreate;c.beforeCreate=e?[].concat(e,m):[m]}return n}S(".kd-lane-template-content {\n display: flex;\n flex-direction: column;\n align-content: center;\n}\n.kd-lane-template-content .template-buttons {\n text-align: center;\n}");const b=g;var v=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"kd-lane-template-content"},[n("el-form",{ref:"template",attrs:{rules:e.rules,model:e.formData,"label-width":"120px"}},[n("el-form-item",{attrs:{label:"模板名称",prop:"templateName"}},[n("el-input",{attrs:{disabled:"SYSTEM_USER"==e.currentTemplate.createUser||e.formDisable},model:{value:e.formData.templateName,callback:function(t){e.$set(e.formData,"templateName",t)},expression:"formData.templateName"}})],1),e._v(" "),n("el-form-item",{attrs:{label:"默认模板",prop:"isPublic"}},[n("el-radio-group",{attrs:{disabled:e.formDisable},model:{value:e.formData.isPublic,callback:function(t){e.$set(e.formData,"isPublic",t)},expression:"formData.isPublic"}},[n("el-radio",{attrs:{label:"1"}},[e._v("是")]),e._v(" "),n("el-radio",{attrs:{label:"0"}},[e._v("否")])],1)],1),e._v(" "),n("el-form-item",{attrs:{label:"曲线高度占比",prop:"col1"}},[n("el-select",{attrs:{disabled:e.formDisable},model:{value:e.formData.col1,callback:function(t){e.$set(e.formData,"col1",t)},expression:"formData.col1"}},[n("el-option",{attrs:{value:"0.5",label:"50%"}}),e._v(" "),n("el-option",{attrs:{value:"0.6",label:"60%"}}),e._v(" "),n("el-option",{attrs:{value:"0.7",label:"70%"}}),e._v(" "),n("el-option",{attrs:{value:"0.8",label:"80%"}}),e._v(" "),n("el-option",{attrs:{value:"0.9",label:"90%"}}),e._v(" "),n("el-option",{attrs:{value:"1",label:"全屏"}})],1)],1),e._v(" "),n("el-form-item",{directives:[{name:"show",rawName:"v-show",value:!e.currentTemplate.templateId,expression:"!currentTemplate.templateId"}],attrs:{label:"选择基础模板",prop:"lineType",disabled:e.formDisable}},[n("el-select",{attrs:{placeholder:"请选择"},model:{value:e.formData.baseTemplate,callback:function(t){e.$set(e.formData,"baseTemplate",t)},expression:"formData.baseTemplate"}},e._l(e.baseTemplate,function(e){return n("el-option",{key:e.value,attrs:{label:e.name,value:e.value}})}),1)],1),e._v(" "),n("el-form-item",{attrs:{label:"顺序",prop:"sort","label-width":"120px"}},[n("el-input",{attrs:{disabled:e.formDisable},model:{value:e.formData.sort,callback:function(t){e.$set(e.formData,"sort",e._n(t))},expression:"formData.sort"}})],1)],1),e._v(" "),n("div",{staticClass:"template-buttons"},[n("el-button",{on:{click:e.editable}},[e._v("编辑")]),e._v(" "),n("el-button",{attrs:{type:"primary",disabled:e.formDisable,loading:e.saving},on:{click:function(t){return e.submitForm("template")}}},[e._v("保存")])],1)],1)};v._withStripped=!0;const I=y({render:v,staticRenderFns:[]},undefined,b,undefined,false,undefined,!1,void 0,void 0,void 0);var E={inject:["upsertLane","setTargetData","setExpanded"],props:{laneInfo:{type:Object},caseId:{type:String,default:""},formDisable:{type:Boolean}},data(){return{formData:Object.assign(this.laneInfo),rules:{sort:[{required:!0,message:"请输入泳道顺序",trigger:"blur"}]},saving:!1}},methods:{editable(){this.$emit("editable")},submitForm(e){this.$refs[e].validate(e=>{if(!e)return;if("function"!=typeof this.upsertLane)return void this.$message({type:"error",message:"没有配置泳道管理方法"});this.saving=!0;const t={...this.formData};t.caseId||(t.caseId=this.caseId);const n=this.upsertLane(t);n instanceof Promise?n.then(e=>{this.setTargetData(e)}).then(()=>{this.$message({type:"success",message:"保存成功"})}).finally(()=>{this.saving=!1}):this.saving=!1})}},computed:{},watch:{laneInfo:{deep:!0,handler:function(e){this.formData=Object.assign({},e)}}}};S(".kd-lane-lane-content {\n display: flex;\n flex-direction: column;\n align-content: center;\n}\n.kd-lane-lane-content .template-buttons {\n text-align: center;\n}");const _=E;var T=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"kd-lane-lane-content"},[n("el-form",{ref:"template",attrs:{rules:e.rules,model:e.formData,"label-width":"120px"}},[n("el-form-item",{attrs:{label:"泳道顺序",prop:"sort"}},[n("el-input",{attrs:{disabled:e.formDisable},model:{value:e.formData.sort,callback:function(t){e.$set(e.formData,"sort",t)},expression:"formData.sort"}})],1)],1),e._v(" "),n("div",{staticClass:"template-buttons"},[n("el-button",{on:{click:e.editable}},[e._v("编辑")]),e._v(" "),n("el-button",{attrs:{type:"primary",disabled:e.formDisable,loading:e.saving},on:{click:function(t){return e.submitForm("template")}}},[e._v("保存")])],1)],1)};T._withStripped=!0;const x=y({render:T,staticRenderFns:[]},undefined,_,undefined,false,undefined,!1,void 0,void 0,void 0);var w={inject:["upsertLine","setTargetData","setExpanded"],props:{template:{type:Object},formDisable:{type:Boolean},params:{type:Array}},mounted(){},data(){const e=(e,t,n)=>{isNaN(t)?n(new Error("请输入数字值")):n()};return{formData:Object.assign({},this.template),lines:[{name:"直线",value:"solid"},{name:"虚线",value:"dashed"},{name:"点线",value:"dotted"},{name:"面积",value:"area"}],lineWidthSliderMarks:{1:"1",2:"2",3:"3",4:"4"},rules:{min:[{required:!0,message:"请输入最小值",trigger:"blur"},{validator:e,trigger:"blur"}],lineSort:[{required:!0,message:"请输入曲线顺序(1-10)",trigger:"blur"},{type:"number",message:"顺序必须为数字值"}],max:[{required:!0,message:"请输入最大值",trigger:"blur"},{validator:e,trigger:"blur"}],lineSize:[{required:!0,message:"请选择曲线粗细",trigger:"blur"}],lineColor:[{required:!0,message:"请选择曲线颜色",trigger:"blur"}],lineType:[{required:!0,message:"请选择线型",trigger:"blur"}],paramId:[{required:!0,message:"请选择参数名称",trigger:"blur"}]}}},methods:{editable(){this.$emit("editable")},submitForm(e){this.$refs[e].validate().then(()=>{if(!(this.upsertLine instanceof Function))return Promise.reject(new Error("未配置线条设置函数"));{const e=this.upsertLine(this.formData);e instanceof Promise?e.then(e=>{this.setTargetData(e)}).then(()=>{this.$message({type:"success",message:"保存成功"})}).finally(()=>{this.saving=!1}):this.saving=!1}}).catch(e=>{console.log(e)})}},watch:{template:{immediate:!1,deep:!0,handler(e){this.formData=Object.assign({},e)}}}};S(".kd-lane-line-content {\n width: 95%;\n display: flex;\n flex-direction: column;\n align-content: center;\n}\n.kd-lane-line-content .template-buttons {\n text-align: center;\n}");const C=w;var A=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"kd-lane-line-content"},[n("el-form",{ref:"template",attrs:{rules:e.rules,model:e.formData,disabled:e.formDisable}},[n("el-form-item",{attrs:{label:"参数名称",prop:"paramId","label-width":"120px"}},[n("el-select",{attrs:{filterable:"",placeholder:"请选择"},model:{value:e.formData.paramId,callback:function(t){e.$set(e.formData,"paramId",t)},expression:"formData.paramId"}},e._l(e.params,function(e){return n("el-option",{key:e.paramId,attrs:{label:e.paramName,value:e.paramId}})}),1)],1),e._v(" "),n("el-form-item",{attrs:{label:"最小值",prop:"min","label-width":"120px"}},[n("el-input",{model:{value:e.formData.min,callback:function(t){e.$set(e.formData,"min",t)},expression:"formData.min"}})],1),e._v(" "),n("el-form-item",{attrs:{label:"最大值",prop:"max","label-width":"120px"}},[n("el-input",{model:{value:e.formData.max,callback:function(t){e.$set(e.formData,"max",t)},expression:"formData.max"}})],1),e._v(" "),n("el-form-item",{attrs:{label:"曲线粗细",prop:"lineSize","label-width":"120px"}},[n("el-input",{attrs:{max:4,min:1,type:"number"},model:{value:e.formData.lineSize,callback:function(t){e.$set(e.formData,"lineSize",t)},expression:"formData.lineSize"}})],1),e._v(" "),n("el-form-item",{attrs:{label:"曲线颜色",prop:"lineColor","label-width":"120px"}},[n("el-color-picker",{attrs:{disabled:e.formData.isGradient},model:{value:e.formData.lineColor,callback:function(t){e.$set(e.formData,"lineColor",t)},expression:"formData.lineColor"}})],1),e._v(" "),n("el-form-item",{attrs:{label:"线型",prop:"lineType","label-width":"120px"}},[n("el-select",{attrs:{placeholder:"请选择",disabled:e.formData.isGradient},model:{value:e.formData.lineType,callback:function(t){e.$set(e.formData,"lineType",t)},expression:"formData.lineType"}},e._l(e.lines,function(e){return n("el-option",{key:e.value,attrs:{label:e.name,value:e.value}})}),1)],1),e._v(" "),n("el-form-item",{attrs:{label:"曲线顺序",prop:"lineSort","label-width":"120px"}},[n("el-input",{model:{value:e.formData.lineSort,callback:function(t){e.$set(e.formData,"lineSort",e._n(t))},expression:"formData.lineSort"}})],1),e._v(" "),e._e()],1),e._v(" "),n("div",{directives:[{name:"show",rawName:"v-show",value:"SYSTEM_USER"!=e.template.createUser,expression:"template.createUser != 'SYSTEM_USER'"}],staticClass:"template-buttons"},[n("el-button",{on:{click:e.editable}},[e._v("编辑")]),e._v(" "),n("el-button",{attrs:{type:"primary",disabled:e.formDisable},on:{click:function(t){return e.submitForm("template")}}},[e._v("保存")])],1)],1)};A._withStripped=!0;const D=y({render:A,staticRenderFns:[]},undefined,C,undefined,false,undefined,!1,void 0,void 0,void 0);a.default.use(r.default);var N={name:"VueSimpleContextMenu",props:{elementId:{type:String,required:!0},options:{type:Array,required:!0}},data:()=>({item:null,menuWidth:null,menuHeight:null}),methods:{showMenu(e,t){this.item=t;var n=document.getElementById(this.elementId);n&&(this.menuWidth&&this.menuHeight||(n.style.visibility="hidden",n.style.display="block",this.menuWidth=n.offsetWidth,this.menuHeight=n.offsetHeight,n.removeAttribute("style")),this.menuWidth+e.pageX>=window.innerWidth?n.style.left=e.pageX-this.menuWidth+2+"px":n.style.left=e.pageX-2+"px",this.menuHeight+e.pageY>=window.innerHeight?n.style.top=e.pageY-this.menuHeight+2+"px":n.style.top=e.pageY-2+"px",n.classList.add("vue-simple-context-menu--active"))},hideContextMenu(){const e=document.getElementById(this.elementId);e&&(e.classList.remove("vue-simple-context-menu--active"),this.$emit("menu-closed"))},onClickOutside(){this.hideContextMenu()},optionClicked(e){this.hideContextMenu(),this.$emit("option-clicked",{item:this.item,option:e})},onEscKeyRelease(e){27===e.keyCode&&this.hideContextMenu()}},mounted(){document.body.addEventListener("keyup",this.onEscKeyRelease)},beforeDestroy(){document.removeEventListener("keyup",this.onEscKeyRelease)}};S('.vue-simple-context-menu {\n top: 0;\n left: 0;\n margin: 0;\n padding: 0;\n display: none;\n list-style: none;\n position: fixed;\n z-index: 1000000;\n background-color: var(--kd-lane-container-context-background-color, #ecf0f1);\n border-bottom-width: 0px;\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;\n box-shadow: 0 3px 6px 0 rgba(var(--kd-lane-container-context-item-color, #333), 0.2);\n border-radius: 4px;\n}\n.vue-simple-context-menu--active {\n display: block;\n}\n.vue-simple-context-menu__item {\n display: flex;\n color: var(--kd-lane-container-context-item-color, #333);\n cursor: pointer;\n padding: 5px 15px;\n align-items: center;\n}\n.vue-simple-context-menu__item:hover {\n background-color: var(--kd-lane-container-context-hover-background-color, #007aff);\n color: var(--kd-lane-container-context-hover-item-color, #fff);\n}\n.vue-simple-context-menu__divider {\n box-sizing: content-box;\n height: 2px;\n background-color: var(--kd-lane-container-context-divider-color, #595a5a);\n padding: 4px 0;\n background-clip: content-box;\n pointer-events: none;\n}\n.vue-simple-context-menu li:first-of-type {\n margin-top: 4px;\n}\n.vue-simple-context-menu li:last-of-type {\n margin-bottom: 4px;\n}');const k=N;var L=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("ul",{directives:[{name:"click-outside",rawName:"v-click-outside",value:e.onClickOutside,expression:"onClickOutside"}],staticClass:"vue-simple-context-menu",attrs:{id:e.elementId}},e._l(e.options,function(t,a){return n("li",{key:a,staticClass:"vue-simple-context-menu__item",class:[t.class,"divider"===t.type?"vue-simple-context-menu__divider":""],on:{click:function(n){return n.stopPropagation(),e.optionClicked(t)}}},[n("span",{domProps:{innerHTML:e._s(t.name)}})])}),0)])};L._withStripped=!0;const M=y({render:L,staticRenderFns:[]},undefined,k,undefined,false,undefined,!1,void 0,void 0,void 0);var R={inject:["delTemplate","delLane","delLine"],provide(){return{setTargetData:this.setTargetData,setExpanded:this.setExpanded}},components:{LineEdit:D,TemplateEdit:I,LaneEdit:x,VueSimpleContextMenu:M},props:{contextItem:{type:Object,default:()=>{}},expended:{type:Object},caseId:{type:String,default:""},inputTempates:{type:Array,default:()=>[]},params:{type:Array,required:!0,default:()=>[]},paramsNameMap:{type:Object,default:()=>{},required:!0}},data:()=>({templateContentShow:!1,templateDisable:!1,laneContentShow:!1,lineContentShow:!1,templateInfo:{},laneInfo:{},lineInfo:{},dataType:"",curveConfigLoading:!1,expandedKeys:[],currentNodeKey:"",targetData:void 0,treeKey:""}),mounted(){},methods:{getLineDataLabel(e){if(!e)return"";const t=this.paramsNameMap[e.paramId];return t?t.paramName:e.paramId},setTargetData(e){this.targetData=e,this.setExpanded();switch(h(e)){case"template":this.templateContentShow=!0,this.laneContentShow=!1,this.lineContentShow=!1,this.templateDisable=!0,this.templateInfo=e;break;case"lane":this.templateContentShow=!1,this.laneContentShow=!0,this.lineContentShow=!1,this.templateDisable=!0,this.laneInfo=e;break;case"line":this.templateContentShow=!1,this.laneContentShow=!1,this.lineContentShow=!0,this.templateDisable=!0,this.lineInfo=e}},setExpanded(){const e=this.targetData;if(e){switch(h(e)){case"template":this.expandedKeys=[e.templateId],this.currentNodeKey=e.templateId;break;case"lane":this.expandedKeys=[e.laneId],this.currentNodeKey=e.laneId;break;case"line":this.expandedKeys=[e.lineId],this.currentNodeKey=e.lineId;break;default:this.expandedKeys=[],this.currentNodeKey=""}}else this.expandedKeys=[],this.currentNodeKey="";this.$refs.refTree&&this.$refs.refTree.setCurrentKey(this.currentNodeKey),this.treeKey=`treeKey${(new Date).getTime()}`},optionClicked(e){const{option:t={},item:n}=e;switch(t.key){case"delTemplate":this.askForDelTemplate(n);break;case"addLane":this.addLane(n);break;case"delLane":this.askForDelLane(n);break;case"addParam":this.addParam(n);break;case"delParam":this.delParam(n)}},hideContextMenu(){const e=this.$refs.vueSimpleContextMenu;e&&e.hideContextMenu()},showRightWindows(e,t,n){const a=this.judgeDataType(n);this.dataType=a,"SYSTEM_USER"!=t.createUser?this.$refs.vueSimpleContextMenu.showMenu(e,t):this.$message.warning("系统模板不能编辑")},clear(){this.expandedKeys=[],this.templateDisable=!0,this.templateContentShow=!1},editable(){this.templateDisable=!1},handleNodeClick(e){this.setTargetData(e)},judgeDataType(e){const{level:t,data:n={}}=e;return 1==t&&n.templateId?"template":2==t&&n.laneId&&n.templateId?"lane":3==t&&n.lineId?"line":null},addTemplate(){this.templateContentShow=!0,this.laneContentShow=!1,this.lineContentShow=!1,this.templateDisable=!1,this.templateInfo={isPublic:"0",baseTemplate:"",col1:"1"}},addLane(e){this.templateContentShow=!1,this.laneContentShow=!0,this.lineContentShow=!1,this.templateDisable=!1,this.laneInfo={templateId:e.templateId,isUsed:"1",sort:e.lanes.length+1}},addParam(e){this.templateContentShow=!1,this.laneContentShow=!1,this.lineContentShow=!0,this.templateDisable=!1,this.lineInfo={laneId:e.laneId,isUsed:"1",lineSize:2}},askForDelTemplate(e){this.$confirm("此操作将删除该模板, 是否继续?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>(e.bsflag="1",this.curveConfigLoading=!0,this.delTemplate instanceof Function?this.delTemplate(e):Promise.reject(new Error("未配置删除模板函数")))).catch(e=>{this.$message.error(e.message||"删除失败")}).finally(()=>{this.curveConfigLoading=!1})},askForDelLane(e){this.$confirm("此操作将删除该泳道, 是否继续?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>(e.bsflag="1",this.curveConfigLoading=!0,this.delLane instanceof Function?this.delLane(e):Promise.reject(new Error("未配置删除模板函数")))).catch(()=>{this.$message.error("删除失败")}).finally(()=>{this.curveConfigLoading=!1})},delParam(e){this.$confirm("此操作将删除该参数, 是否继续?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>(e.bsflag="1",this.delLine instanceof Function?this.delLine(e):Promise.reject(new Error("未配置删除线条函数")))).catch(e=>{this.$message.error(e.message||"删除失败")})}},computed:{contextMenuOptions(){switch(this.dataType){case"template":return[{name:"新增泳道",key:"addLane"},{name:"删除模板",key:"delTemplate"}];case"lane":return[{name:"新增参数",key:"addParam"},{name:"删除泳道",key:"delLane"}];case"line":return[{name:"删除参数",key:"delParam"}];default:return[]}},treeData(){if(this.inputTempates){const e=[];return this.inputTempates.forEach(t=>{const n={...t,id:t.templateId,label:t.templateName};n.children=[],t.lanes||(t.lanes=[]),t.lanes.forEach((e,t)=>{const a={...e,id:e.laneId,label:`泳道${t+1}`};n.children.push(a),a.lines||(a.lines=[]),a.children=[],e.lines.forEach(e=>{const t={...e,id:e.lineId,label:e.lineName||e.paramId};t.label=this.getLineDataLabel(e),a.children.push(t)})}),e.push(n)}),e}return[]},userTemplate(){return this.treeData?[...this.treeData]:[]}},watch:{contextItem:{immediate:!0,deep:!0,handler(e){this.setTargetData(Object.assign({},e))}}},beforeDestroy(){}};S(".kd-lane-el-container {\n height: 60vh;\n border: 1px solid var(--kd-lane-container-border-color, #333);\n width: 100%;\n}\n@media screen and (max-width: 1024px) {\n.kd-lane-el-container {\n height: 70vh;\n}\n}\n.kd-lane-el-container .rtd-config-side {\n border-right: 1px solid var(--kd-lane-container-border-color, #333);\n}\n.kd-lane-el-container .rtd-config-side-tree {\n height: 90%;\n overflow: auto;\n}\n.kd-lane-el-container .rtd-config-side-option {\n text-align: center;\n}\n.kd-lane-el-container .rtd-config-main {\n display: flex;\n align-content: center;\n justify-content: center;\n width: 100%;\n}");const P=R;var $=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("el-container",{directives:[{name:"loading",rawName:"v-loading",value:e.curveConfigLoading,expression:"curveConfigLoading"}],staticClass:"kd-lane-el-container"},[n("el-aside",{staticClass:"rtd-config-side",attrs:{width:"20%"}},[n("el-tree",{key:e.treeKey,ref:"refTree",staticClass:"rtd-config-side-tree",attrs:{data:e.treeData,"expand-on-click-node":!1,"current-node-key":e.currentNodeKey,"default-expanded-keys":e.expandedKeys,"node-key":"id","highlight-current":""},on:{"node-click":e.handleNodeClick,"node-expand":e.hideContextMenu,"node-collapse":e.hideContextMenu},scopedSlots:e._u([{key:"default",fn:function(t){var a=t.node,r=t.data;return n("span",{staticClass:"custom-tree-node",on:{contextmenu:function(t){return t.preventDefault(),e.showRightWindows(t,r,a)}}},[n("span",[e._v(e._s(a.label))]),e._v(" "),n("span",{directives:[{name:"show",rawName:"v-show",value:"1"==r.isPublic,expression:"data.isPublic == '1'"}],staticStyle:{"padding-left":"5px"}},[n("i",{staticClass:"el-icon-star-on"})])])}}])}),e._v(" "),n("div",{staticClass:"rtd-config-side-option"},[n("el-button",{on:{click:e.addTemplate}},[e._v("新增模板")])],1)],1),e._v(" "),n("el-main",{staticClass:"rtd-config-main"},[n("TemplateEdit",e._g({directives:[{name:"show",rawName:"v-show",value:e.templateContentShow,expression:"templateContentShow"}],attrs:{currentTemplate:e.templateInfo,"form-disable":e.templateDisable,userTemplate:e.userTemplate,caseId:e.caseId},on:{editable:e.editable}},e.$listeners)),e._v(" "),n("LaneEdit",e._g({directives:[{name:"show",rawName:"v-show",value:e.laneContentShow,expression:"laneContentShow"}],attrs:{laneInfo:e.laneInfo,"form-disable":e.templateDisable},on:{editable:e.editable}},e.$listeners)),e._v(" "),n("LineEdit",e._g({directives:[{name:"show",rawName:"v-show",value:e.lineContentShow,expression:"lineContentShow"}],attrs:{template:e.lineInfo,params:e.params,"form-disable":e.templateDisable},on:{editable:e.editable}},e.$listeners))],1),e._v(" "),n("VueSimpleContextMenu",{ref:"vueSimpleContextMenu",attrs:{"element-id":"kd-lane-chart-context-menu-2",options:e.contextMenuOptions},on:{"option-clicked":e.optionClicked}})],1)};$._withStripped=!0;const O=y({render:$,staticRenderFns:[]},undefined,P,undefined,false,undefined,!1,void 0,void 0,void 0);var B={props:{itemHeight:{type:Number,default:20},line:{type:Object,default:()=>{}},paramsNameMap:{type:Object,default:()=>{},required:!0},themeName:{type:String,default:void 0}},methods:{getParamName(e){if(!e)return"";const t=this.paramsNameMap[e.paramId];return t?`${t.paramName}${t.paramUnit}`:""},toggleIsUsed(){const e={...this.line};"1"==e.isUsed||1==e.isUsed?e.isUsed="0":e.isUsed="1",this.$emit("updateLine",e)}},computed:{gradientDisplay(){let e,t;return this.themeName&&this.line.themeConfig&&(e=this.line.themeConfig[this.themeName]?.lineColor),t=this.line.isGradient?{background:`${e||this.line.lineColor}`}:{},t},textColor(){let e;return this.themeName&&this.line.themeConfig&&!this.line.isGradient&&(e=this.line.themeConfig[this.themeName]?.lineColor),{color:e||this.line.lineColor}},headerItemStyle(){let e,t;return this.themeName&&this.line.themeConfig&&(e=this.line.themeConfig[this.themeName]?.lineColor),t="area"==this.line.lineType?this.line.isGradient?{}:{"box-shadow":`inset 0 0 8px 0px ${e||this.line.lineColor}`}:{"border-bottom":`2px ${this.line.lineType} ${e||this.line.lineColor}`},{height:`${this.itemHeight}px`,opacity:"1"==this.line.isUsed?1:.5,...t}}},watch:{}};S('@charset "UTF-8";\n.kd-lane-chart-container-header-item {\n color: var(--kd-lane-container-header-item-color, #333);\n border: unset;\n position: relative;\n cursor: pointer;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container {\n height: 100%;\n width: 100%;\n font-size: 10px;\n font-weight: bold;\n position: relative;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .left {\n position: absolute;\n left: 0;\n bottom: 2px;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .center {\n position: absolute;\n left: 50%;\n bottom: 2px;\n transform: translateX(-50%);\n /* 文字不换行,超出显示省略号 */\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .right {\n position: absolute;\n right: 0;\n bottom: 2px;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .gradient-display {\n position: absolute;\n height: 2px;\n left: 0;\n bottom: 0;\n right: 0;\n}');const j=B;var U=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"kd-lane-chart-container-header-item",style:e.headerItemStyle,on:{click:e.toggleIsUsed}},[n("div",{staticClass:"kd-lane-chart-container-text-container"},[n("span",{staticClass:"left",style:e.textColor},[e._v(e._s(e.line.min))]),e._v(" "),n("span",{staticClass:"center"},[e._v(e._s(e.getParamName(e.line)))]),e._v(" "),n("span",{staticClass:"right",style:e.textColor},[e._v(e._s(e.line.max))]),e._v(" "),n("div",{staticClass:"gradient-display",style:e.gradientDisplay})])])};U._withStripped=!0;const V=y({render:U,staticRenderFns:[]},undefined,j,undefined,false,undefined,!1,void 0,void 0,void 0);var q={name:"KdLaneChartContainer",provide(){return{upsertTemplate:this.upsertTemplate,delTemplate:this.delTemplate,upsertLane:this.upsertLane,delLane:this.delLane,upsertLine:this.upsertLine,delLine:this.delLine}},components:{HeaderItem:V,RealTimeCurveConfig:O,VueSimpleContextMenu:M},props:{config:{type:Object,required:!0,validator:function(e){if("object"!=typeof e||null===e)throw new Error("配置必须是一个对象");if(!("type"in e))throw new Error("配置必须包含 type 属性");if(!("caseId"in e)||!("versionCode"in e))throw new Error("配置必须包含 caseId, versionCode 属性");const{type:t}=e;if("local"===t){if(!("dataSource"in e)||null==e.dataSource)throw new Error("local 类型的配置必须包含 dataSource 属性");if(!("params"in e.dataSource))throw new Error("local 类型的配置 dataSource 必须包含 params 属性")}else{if("custom"!==t)throw new Error('type 必须是 "local" 或 "custom"');{const t=["getUserTemplates","upsertTemplate","delTemplate","upsertLane","delLane","upsertLine","delLine"];for(const n of t)if("function"!=typeof e[n])throw new Error(`${n} 必须是一个函数`)}}return!0}},headerPadding:{type:Number,default:4},headerItemHeight:{type:Number,default:20},itemGap:{type:Number,default:2},customMenuList:{type:Array,default:()=>[]},themeName:{type:String,default:void 0}},data:()=>({treeTemplates:null,isLoading:!1,strategy:null,currentTemplate:{},curveConfigVisible:!1,params:[],contextItem:void 0}),created(){this.strategy=f.createStrategy(this.$props.config),this.loadConfig()},mounted(){},methods:{setExpanded(){this.$refs.curveConfig.setExpanded()},delLine(e){return this.strategy.delLine(e).then(()=>{const t=this.currentTemplate.lanes,n=t.findIndex(t=>t.laneId==e.laneId);if(n<0)for(const t of this.treeTemplates){const{lanes:n}=t;for(const t of n)if(t.laneId==e.laneId){const{lines:n}=t,a=n.findIndex(t=>t.lineId==e.lineId);a<0?console.warn("要删除的线条在当前泳道中不存在?"):n.splice(a,1);break}}else{const a=t[n].lines.findIndex(t=>t.lineId==e.lineId);a<0?console.warn("要删除的线条在当前泳道中不存在?"):t[n].lines.splice(a,1),this.onLineChange(e)}})},upsertLine(e){return this.strategy.upsertLine(e).then(e=>{const t=this.currentTemplate.lanes,n=t.findIndex(t=>t.laneId==e.laneId);if(!(n<0)){const a=t[n],r=a.lines,s=r.findIndex(t=>t.lineId==e.lineId);return s<0?r.push(e):this.$set(r,s,e),this.$set(t,n,a),d(a),this.onLineChange(e),e}for(const t of this.treeTemplates){const{lanes:n}=t;for(const t of n)if(t.laneId==e.laneId){const{lines:n}=t,a=n.findIndex(t=>t.lineId==e.lineId);a<0?n.push(e):this.$set(n,a,e),d(t);break}}})},delLane(e){return this.strategy.delLane(e).then(e=>{const{templateId:t}=e,n=this.treeTemplates.findIndex(e=>e.templateId==t);if(n<0)return void console.warn(`template_id not found: '${t}'`);const a=this.treeTemplates[n],r=a.lanes.findIndex(t=>t.laneId==e.laneId);a.lanes.splice(r,1),this.currentTemplate.templateId==t&&this.setDefaultAndNotify()})},upsertLane(e){return this.strategy.upsertLane(e).then(e=>{const t=this.treeTemplates.findIndex(t=>t.templateId==e.templateId);if(t<0)console.warn("template not found");else{const n=this.treeTemplates[t],a=n.lanes||[],r=a.findIndex(t=>t.laneId==e.laneId);r<0?a.push(e):this.$set(a,r,e),c(n.lanes),n.templateId===this.currentTemplate.templateId&&this.setDefaultAndNotify()}return e})},delTemplate(e){return this.strategy.deleteTemplate(e).then(()=>{const t=this.treeTemplates.findIndex(t=>t.templateId===e.templateId);this.treeTemplates.splice(t,1),e.templateId==this.currentTemplate.templateId&&this.setDefaultAndNotify()})},upsertTemplate(e){return this.strategy.upsertTemplate(e).then(e=>{"1"==e.isPublic&&this.treeTemplates.forEach(e=>{e.isPublic="0"});const t=this.treeTemplates.findIndex(t=>t.templateId===e.templateId);if(t>=0){const n=this.treeTemplates[t],a=Object.assign({},n,e);this.$set(this.treeTemplates,t,a)}else this.treeTemplates.push(e);return m(this.treeTemplates),this.setDefaultAndNotify(),e})},onParentContextMenu(e){const t=".kd-lane-chart-lane-header";if(!(e.target&&(e.target.classList.contains(t)||e.target.closest(t)))){e.preventDefault();const t=this.$refs.vueSimpleContextMenu;t&&t.hideContextMenu()}},showContextMenu(e,t){e.stopPropagation(),this.$refs.vueSimpleContextMenu.showMenu(e,t)},optionClicked(e){const{option:t,item:n}=e;this.contextItem=n;const a=this.customMenuList.findIndex(e=>e.key==t.key);if(a<0){if("editTemplate"==t.key)this.curveConfigVisible=!0;else if("restoreSetting"==t.key)return this.restoreSetting()}else this.$emit("onCustomMenuClicked",e)},restoreSetting(){return this.strategy.restoreSetting().then(()=>{this.loadConfig()})},loadConfig(){this.isLoading=!0,this.strategy.getUserTemplates().then(e=>{const{templates:t=[],params:n=[]}=e;this.params=n,m(t),this.treeTemplates=t,this.setDefaultAndNotify()}).catch(e=>{console.error(`加载配置失败: ${this.$props.strategy.caseId},${this.$props.strategy.versionCode},${e.message}`)}).finally(()=>{this.isLoading=!1})},onLineChange(e){console.log("notify line change",e),this.$emit("line-change",e)},setDefaultAndNotify(){const e=this.treeTemplates.find(e=>"1"===e.isPublic);if(e)this.currentTemplate=e;else{const e=this.treeTemplates.find(e=>"SYSTEM_USER"==e.createUser);e?(e.isPublic="1",this.currentTemplate=e,this.strategy.upsertTemplate(e)):(this.treeTemplates[0].isPublic="1",this.currentTemplate=this.treeTemplates[0],this.strategy.upsertTemplate(this.currentTemplate))}this.$emit("template-change",this.currentTemplate)}},computed:{contextMenuOptions(){return"local"==this.config.type?[{name:"编辑模板",key:"editTemplate"},{name:"恢复默认",key:"restoreSetting"},...this.customMenuList]:[{name:"编辑模板",key:"template"},...this.customMenuList]},paramsNameMap(){const e={};for(const t of this.params)e[t.paramId]={paramName:t.paramName,paramUnit:t.paramUnit};return e},lineCount(){const{lanes:e=[]}=this.currentTemplate||{};return Math.max(...e.map(e=>e.lines?.length||0))},headerStyle(){const e={gap:`${this.itemGap}px`,padding:`${this.headerPadding}px`};if(this.currentTemplate){const{lanes:t=[]}=this.currentTemplate;if(t&&0!=t.length){const t=Math.max(0,this.lineCount-1);return{...e,height:this.lineCount*this.headerItemHeight+2*this.headerPadding+t*this.itemGap+"px","min-height":"60px"}}return{...e,height:"30%","min-height":"60px"}}return{...e,height:"30%","min-height":"60px"}},slotHeaderStyle(){if(this.currentTemplate){const{lanes:e=[]}=this.currentTemplate;if(e&&0!=e.length){const e=Math.max(0,this.lineCount-1);return{height:this.lineCount*this.headerItemHeight+2*this.headerPadding+e*this.itemGap+"px","min-height":"60px"}}return{height:"30%","min-height":"60px"}}return{height:"30%","min-height":"60px"}},darwAreaStyle(){const e=this.headerStyle,t=l(e.height),n=l(e["min-height"]);return{top:`${Math.max(t,n)}px`}}}};S(".kd-lane-chart-container {\n height: 100%;\n width: 100%;\n overflow: hidden;\n position: relative;\n border: 1px solid var(--kd-lane-container-border-color, #333);\n display: flex;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container, .kd-lane-chart-container .kd-lane-chart-lane-container {\n height: 100%;\n min-width: 0;\n overflow: hidden;\n z-index: 1;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-chart-lane-header, .kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-chart-lane-header {\n max-height: 40%;\n border-bottom: 1px solid var(--kd-lane-container-border-color, #333);\n overflow: hidden;\n z-index: 2;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container {\n flex: 1;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container {\n width: auto;\n}\n.kd-lane-chart-container .border-left {\n border-left: 1px solid var(--kd-lane-container-border-color, #333);\n}\n.kd-lane-chart-container .kd-lane-chart-container-draw-area {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n border: none;\n}");const K=q;var F=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{directives:[{name:"loading",rawName:"v-loading",value:e.isLoading,expression:"isLoading"}],staticClass:"kd-lane-chart-container",on:{contextmenu:e.onParentContextMenu}},[e.currentTemplate&&e.currentTemplate.lanes&&e.currentTemplate.lanes.length>0?[e._l(e.currentTemplate.lanes||[],function(t,a){return[e.$scopedSlots["lane"+t.laneId]?n("div",{key:t.laneId,staticClass:"kd-lane-chart-lane-slot-container",class:{"border-left":0!=a}},[n("div",{staticClass:"kd-lane-chart-lane-header",style:e.slotHeaderStyle},[e._t("lane"+t.laneId,null,{lane:t})],2)]):e.$slots["lane"+t.laneId]?n("div",{key:""+t.laneId,staticClass:"kd-lane-chart-lane-slot-container",class:{"border-left":0!=a}},[n("div",{staticClass:"kd-lane-chart-lane-header",style:e.slotHeaderStyle},[e._t("lane"+t.laneId,null,{lane:t})],2)]):[n("div",{key:t.laneId,staticClass:"kd-lane-chart-lane-container",class:{"border-left":0!=a}},[n("div",{staticClass:"kd-lane-chart-lane-header",style:e.headerStyle,on:{contextmenu:function(n){return n.preventDefault(),e.showContextMenu(n,t)}}},e._l(t.lines||[],function(t){return n("HeaderItem",{key:t.lineId,attrs:{itemHeight:e.headerItemHeight,line:t,paramsNameMap:e.paramsNameMap,themeName:e.themeName},on:{updateLine:e.upsertLine},nativeOn:{contextmenu:function(n){return n.preventDefault(),e.showContextMenu(n,t)}}})}),1)])]]})]:[n("div",{staticClass:"kd-lane-chart-lane-container"},[n("div",{staticClass:"kd-lane-chart-lane-header",style:e.headerStyle,on:{contextmenu:function(t){return t.preventDefault(),e.showContextMenu.apply(null,arguments)}}})])],e._v(" "),n("div",{staticClass:"kd-lane-chart-container-draw-area",style:e.darwAreaStyle},[e._t("draw-slot")],2),e._v(" "),n("VueSimpleContextMenu",{ref:"vueSimpleContextMenu",attrs:{"element-id":"kd-lane-chart-context-menu",options:e.contextMenuOptions},on:{"option-clicked":e.optionClicked}}),e._v(" "),n("el-dialog",{attrs:{title:"泳道模板设置",visible:e.curveConfigVisible},on:{"update:visible":function(t){e.curveConfigVisible=t},opened:e.setExpanded}},[n("RealTimeCurveConfig",e._g({ref:"curveConfig",attrs:{inputTempates:e.treeTemplates,caseId:e.strategy.caseId,params:e.params,paramsNameMap:e.paramsNameMap,contextItem:e.contextItem}},e.$listeners))],1)],2)};F._withStripped=!0;const H=y({render:F,staticRenderFns:[]},undefined,K,undefined,false,undefined,!1,void 0,void 0,void 0),z=e=>{e.component(H.name,H)};return"undefined"!=typeof window&&window.Vue&&window.Vue.use(z),{install:z}});
1
+ !function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t(require("vue"),require("v-click-outside")):"function"==typeof define&&define.amd?define(["vue","v-click-outside"],t):(e="undefined"!=typeof globalThis?globalThis:e||self).KdLaneChartContainer=t(e.Vue,e.vClickOutside)}(this,function(e,t){"use strict";function n(e){return e&&"object"==typeof e&&"default"in e?e:{default:e}}var a=n(e),r=n(t);class s{constructor(e){this.strategy=e}getUserTemplates(){return this.strategy.getUserTemplates()}upsertTemplate(e){return this.strategy.upsertTemplate(e)}delTemplate(e){return this.strategy.deleteTemplate(e)}upsertLane(e){return this.strategy.upsertLane(e)}delLane(e){return this.strategy.deleteLane(e)}upsertLine(e){return this.strategy.upsertLine(e)}delLine(e){return this.strategy.delLine(e)}restoreSetting(){return this.strategy.restoreSetting?this.strategy.restoreSetting():Promise.resolve()}}class i{static DB_NAME="KDLaneChartContainerConfigDB";static MAX_UNICODE_CHAR="￿";static DB_VERSION=2;static STORE_NAMES={TEMPLATES:"templates",LANES:"lanes",LINES:"lines",PARAMS:"params",CASE_VERSIONS:"case_versions"};_db=null;_openDB(){return new Promise((e,t)=>{if(this._db)return void e(this._db);const n=indexedDB.open(i.DB_NAME,i.DB_VERSION);n.onupgradeneeded=e=>{const t=e.target.result,{STORE_NAMES:n}=i;t.objectStoreNames.contains(n.CASE_VERSIONS)||t.createObjectStore(n.CASE_VERSIONS,{keyPath:"caseId"}),t.objectStoreNames.contains(n.TEMPLATES)||t.createObjectStore(n.TEMPLATES,{keyPath:["caseId","templateId"]}),t.objectStoreNames.contains(n.LANES)||t.createObjectStore(n.LANES,{keyPath:["caseId","laneId"]}),t.objectStoreNames.contains(n.LINES)||t.createObjectStore(n.LINES,{keyPath:["caseId","lineId"]}),t.objectStoreNames.contains(n.PARAMS)||t.createObjectStore(n.PARAMS,{keyPath:["caseId","paramId"]})},n.onsuccess=t=>{this._db=t.target.result,this._db.onclose=()=>{this._db=null},e(this._db)},n.onerror=e=>{t(new Error(`打开数据库失败:${e.target.error.message}`))},n.onblocked=()=>{t(new Error("数据库操作被阻塞,请关闭其他标签页后重试"))}})}closeDB(){return new Promise(e=>{this._db&&(this._db.close(),this._db=null),e()})}_compareVersion(e,t){const n=e=>String(e).split(".").map(Number),a=n(e),r=n(t),s=Math.max(a.length,r.length);for(let e=0;e<s;e++){const t=a[e]||0,n=r[e]||0;if(t>n)return 1;if(t<n)return-1}return 0}_clearSceneData(e){return this._openDB().then(t=>new Promise((n,a)=>{const r=t.transaction([i.STORE_NAMES.CASE_VERSIONS,i.STORE_NAMES.TEMPLATES,i.STORE_NAMES.LANES,i.STORE_NAMES.LINES,i.STORE_NAMES.PARAMS],"readwrite"),s=r.objectStore(i.STORE_NAMES.TEMPLATES),o=r.objectStore(i.STORE_NAMES.LANES),l=r.objectStore(i.STORE_NAMES.LINES),d=r.objectStore(i.STORE_NAMES.CASE_VERSIONS),c=r.objectStore(i.STORE_NAMES.PARAMS),m=IDBKeyRange.bound([e],[e,i.MAX_UNICODE_CHAR]);s.delete(m),o.delete(m),l.delete(m),c.delete(m),d.delete(e),r.oncomplete=()=>n(),r.onerror=e=>a(new Error(`事务失败:${e.target.error.message}`))}))}_promisifyRequest(e){return new Promise((t,n)=>{e.onsuccess=()=>t(e.result),e.onerror=()=>n(e.error)})}forceInitSceneConfig(e,t,n){return e&&t?this._clearSceneData(e).then(()=>{const a=this.setUpData(e,t,n);return this.batchAddConfig(a)}).catch(e=>{throw new Error(`强制初始化场景配置失败:${e.message}`)}):Promise.reject(new Error("caseId和versionCode为强制初始化的必传参数"))}setUpData(e,t,n){const a=n.templates.map(t=>({...t,caseId:e})),r=n.lanes.map(t=>({...t,caseId:e})),s=n.lines.map(t=>({...t,caseId:e})),i=n.params.map(t=>({...t,caseId:e}));return{caseVersion:{caseId:e,versionCode:t,updateTime:new Date},templates:a,lanes:r,lines:s,params:i}}checkConfigIntegrity(e,t){return this.getCaseVersionByCaseId(e).then(n=>!(!n||n.versionCode!==t)&&this.getTemplatesByCaseId(e).then(t=>{if(0===t.length)return!0;const n=t[0].templateId;return this.getLanesByTemplateId(e,n).then(t=>{if(0===t.length)return!0;const n=t[0].laneId;return this.getLinesByLaneId(e,n).then(e=>0===e.length)})}))}_initSceneConfig(e){const{caseVersion:t}=e,{caseId:n,versionCode:a}=t;return this.getCaseVersionByCaseId(n).then(t=>{if(!t)return this.batchAddConfig(e);const r=this._compareVersion(a,t.versionCode);if(r>0)return this._clearSceneData(n).then(()=>this.batchAddConfig(e));if(0===r)return console.log(`场景${n}已存在版本${a},无需重复创建`),Promise.resolve(t);throw new Error(`场景${n}当前版本${t.versionCode}高于待创建版本${a}。`)})}saveSceneConfig(e,t,n){if(!e||!t)return Promise.reject(new Error("caseId和versionCode为必传参数"));if(!Array.isArray(n.templates)||!Array.isArray(n.lanes)||!Array.isArray(n.lines))return Promise.reject(new Error("templates/lanes/lines必须为数组"));const a=this.setUpData(e,t,n);return this._initSceneConfig(a)}batchAddConfig(e){return this._openDB().then(t=>new Promise((n,a)=>{const r=t.transaction([i.STORE_NAMES.CASE_VERSIONS,i.STORE_NAMES.TEMPLATES,i.STORE_NAMES.LANES,i.STORE_NAMES.LINES,i.STORE_NAMES.PARAMS],"readwrite");r.objectStore(i.STORE_NAMES.CASE_VERSIONS).put(e.caseVersion);const s=r.objectStore(i.STORE_NAMES.TEMPLATES);e.templates.forEach(e=>s.put(e));const o=r.objectStore(i.STORE_NAMES.LANES);e.lanes.forEach(e=>o.put(e));const l=r.objectStore(i.STORE_NAMES.LINES);e.lines.forEach(e=>l.put(e));const d=r.objectStore(i.STORE_NAMES.PARAMS);e.params.forEach(e=>d.put(e)),r.oncomplete=()=>n(e),r.onerror=e=>a(new Error(`批量添加配置失败:${e.target.error.message}`))}))}upsertCaseVersion(e){return this._openDB().then(t=>new Promise((n,a)=>{const r=t.transaction([i.STORE_NAMES.CASE_VERSIONS],"readwrite").objectStore(i.STORE_NAMES.CASE_VERSIONS),s={updateTime:new Date,...e};this._promisifyRequest(r.put(s)).then(()=>n(s)).catch(e=>a(new Error(`更新场景版本失败:${e.message}`)))}))}getCaseVersionByCaseId(e){return this._openDB().then(t=>new Promise((n,a)=>{const r=t.transaction([i.STORE_NAMES.CASE_VERSIONS],"readonly").objectStore(i.STORE_NAMES.CASE_VERSIONS);this._promisifyRequest(r.get(e)).then(e=>n(e||null)).catch(e=>a(new Error(`查询场景版本失败:${e.message}`)))}))}getConfigByCaseId(e){return e?Promise.all([this.getCaseVersionByCaseId(e),this.getTemplatesByCaseId(e),this.getParamsByCaseId(e)]).then(([t,n,a])=>{const r=n.map(t=>this.getLanesByTemplateId(e,t.templateId).then(n=>{const a=n.map(t=>this.getLinesByLaneId(e,t.laneId).then(e=>({...t,lines:e})));return Promise.all(a).then(e=>({...t,lanes:e}))}));return Promise.all(r).then(e=>({caseVersion:t,templates:e,params:a}))}).catch(e=>{throw new Error(`查询场景配置失败:${e.message}`)}):Promise.reject(new Error("caseId为必传参数"))}getConfigByTemplateId(e,t){if(!e||!t)return Promise.reject(new Error("caseId为必传参数"));const n={};return this.getLanesByTemplateId(e,t).then(t=>{const a=t.map(t=>this.getLinesByLaneId(e,t.laneId));return Promise.all(a).then(e=>{e.forEach((e,n)=>{t[n].lines=e}),n.lanes=t})}).then(()=>this.getTemplateById(e,t)).then(e=>(e.lanes=n.lanes,Promise.resolve(e)))}deleteCaseVersion(e){return this._openDB().then(t=>new Promise((n,a)=>{const r=t.transaction([i.STORE_NAMES.CASE_VERSIONS],"readwrite").objectStore(i.STORE_NAMES.CASE_VERSIONS);this._promisifyRequest(r.delete(e)).then(()=>n()).catch(e=>a(new Error(`删除场景版本失败:${e.message}`)))}))}upsertTemplate(e){return this._openDB().then(t=>new Promise((n,a)=>{if(!e.caseId)return void a(new Error("模板数据必须包含caseId"));const r=t.transaction([i.STORE_NAMES.TEMPLATES],"readwrite").objectStore(i.STORE_NAMES.TEMPLATES),s={...e,createDate:e.createDate?new Date(e.createDate):new Date,updateDate:e.updateDate?new Date(e.updateDate):null};return delete s.lanes,this._promisifyRequest(r.put(s)).then(()=>n(s)).catch(e=>a(new Error(`更新模板失败:${e.message}`)))}))}getTemplateById(e,t){return this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.TEMPLATES],"readonly").objectStore(i.STORE_NAMES.TEMPLATES);this._promisifyRequest(s.get([e,t])).then(e=>a(e||null)).catch(e=>r(new Error(`查询模板失败:${e.message}`)))}))}getTemplatesByCaseId(e){return this._openDB().then(t=>new Promise((n,a)=>{const r=t.transaction([i.STORE_NAMES.TEMPLATES],"readonly").objectStore(i.STORE_NAMES.TEMPLATES),s=IDBKeyRange.bound([e],[e,i.MAX_UNICODE_CHAR]);this._promisifyRequest(r.getAll(s)).then(e=>{n(e||[])}).catch(e=>a(new Error(`查询场景下模板失败:${e.message}`)))}))}deleteTemplate(e,t){return this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.TEMPLATES],"readwrite").objectStore(i.STORE_NAMES.TEMPLATES);this._promisifyRequest(s.delete([e,t])).then(()=>a()).catch(e=>r(new Error(`删除模板失败:${e.message}`)))}))}upsertLane(e,t){return this._openDB().then(n=>new Promise((a,r)=>{if(!e||!t.templateId)return void r(new Error("泳道数据必须包含caseId和templateId"));const s=n.transaction([i.STORE_NAMES.LANES],"readwrite").objectStore(i.STORE_NAMES.LANES),o={...t,caseId:e,updateDate:t.updateDate?new Date(t.updateDate):new Date};this._promisifyRequest(s.put(o)).then(()=>a(o)).catch(e=>r(new Error(`更新泳道失败:${e.message}`)))}))}getLaneById(e,t){return this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.LANES],"readonly").objectStore(i.STORE_NAMES.LANES);this._promisifyRequest(s.get([e,t])).then(e=>a(e||null)).catch(e=>r(new Error(`查询泳道失败:${e.message}`)))}))}getLanesByTemplateId(e,t){return this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.LANES],"readonly").objectStore(i.STORE_NAMES.LANES),o=IDBKeyRange.bound([e],[e,i.MAX_UNICODE_CHAR]);this._promisifyRequest(s.getAll(o)).then(e=>e.filter(e=>e.templateId===t)).then(e=>a(e||[])).catch(e=>r(new Error(`查询模板下泳道失败:${e.message}`)))}))}deleteLaneByLaneIds(e,t){return Array.isArray(t)&&0!==t.length?this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.LANES],"readwrite"),o=s.objectStore(i.STORE_NAMES.LANES);t.map(t=>this._promisifyRequest(o.delete([e,t]))),s.oncomplete=()=>a(),s.onerror=e=>r(new Error(`删除泳道失败:${e.target.error.message}`))})):Promise.resolve()}upsertLine(e,t){return this._openDB().then(n=>new Promise((a,r)=>{if(!e||!t.laneId)return void r(new Error("线条数据必须包含caseId和laneId"));const s=n.transaction([i.STORE_NAMES.LINES],"readwrite").objectStore(i.STORE_NAMES.LINES),o={...t,caseId:e,updateDate:t.updateDate?new Date(t.updateDate):new Date};this._promisifyRequest(s.put(o)).then(()=>a(o)).catch(e=>r(new Error(`更新线条失败:${e.message}`)))}))}getLineById(e,t){return this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.LINES],"readonly").objectStore(i.STORE_NAMES.LINES);this._promisifyRequest(s.get([e,t])).then(e=>a(e||null)).catch(e=>r(new Error(`查询线条失败:${e.message}`)))}))}getLinesByLaneId(e,t){return this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.LINES],"readonly").objectStore(i.STORE_NAMES.LINES),o=IDBKeyRange.bound([e],[e,i.MAX_UNICODE_CHAR]);this._promisifyRequest(s.getAll(o)).then(e=>e.filter(e=>e.laneId===t)).then(e=>a(e||[])).catch(e=>r(new Error(`查询泳道下线条失败:${e.message}`)))}))}deleteLineByIds(e,t){return Array.isArray(t)&&0!==t.length?this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.LINES],"readwrite"),o=s.objectStore(i.STORE_NAMES.LINES);t.map(t=>this._promisifyRequest(o.delete([e,t]))),s.oncomplete=()=>a(),s.onerror=e=>r(new Error(`批量删除线条失败:${e.target.error.message}`))})):Promise.resolve()}upsertParam(e){return this._openDB().then(t=>new Promise((n,a)=>{if(!e.caseId)return void a(new Error("参数数据必须包含caseId"));const r=t.transaction([i.STORE_NAMES.PARAMS],"readwrite").objectStore(i.STORE_NAMES.PARAMS),s={...e,updateDate:e.updateDate?new Date(e.updateDate):new Date};this._promisifyRequest(r.put(s)).then(()=>n(s)).catch(e=>a(new Error(`更新参数失败:${e.message}`)))}))}getParamById(e,t){return this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.PARAMS],"readonly").objectStore(i.STORE_NAMES.PARAMS);this._promisifyRequest(s.get([e,t])).then(e=>a(e||null)).catch(e=>r(new Error(`查询参数失败:${e.message}`)))}))}getParamsByCaseId(e){return this._openDB().then(t=>new Promise((n,a)=>{const r=t.transaction([i.STORE_NAMES.PARAMS],"readonly").objectStore(i.STORE_NAMES.PARAMS),s=IDBKeyRange.bound([e],[e,i.MAX_UNICODE_CHAR]);this._promisifyRequest(r.getAll(s)).then(e=>n(e||[])).catch(e=>a(new Error(`查询场景下参数失败:${e.message}`)))}))}deleteParamById(e,t){return this._openDB().then(n=>new Promise((a,r)=>{const s=n.transaction([i.STORE_NAMES.PARAMS],"readwrite").objectStore(i.STORE_NAMES.PARAMS);this._promisifyRequest(s.delete([e,t])).then(()=>a()).catch(e=>r(new Error(`删除参数失败:${e.message}`)))}))}}const o=new i;function l(e){return e&&"string"==typeof e&&parseFloat(e.replace("px",""))||0}function d(e){e&&Array.isArray(e.lines)&&e.lines.sort((e,t)=>(e.lineSort??0)-(t.lineSort??0))}function c(e){Array.isArray(e)&&(e.sort((e,t)=>(e.sort??0)-(t.sort??0)),e.forEach(e=>d(e)))}function m(e){return Array.isArray(e)&&0!==e.length?(e.sort((e,t)=>(e.sort??0)-(t.sort??0)),e.forEach(e=>c(e.lanes)),e):e}function h(e){return e?e.lineId&&e.laneId?"line":e.laneId&&e.templateId&&!e.lineId?"lane":e.templateId?"template":null:null}function p(e=!0){let t="";return t="undefined"!=typeof crypto&&crypto.randomUUID?crypto.randomUUID():"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx".replace(/[xy]/g,function(e){const t=16*Math.random()|0;return("x"===e?t:3&t|8).toString(16)}),e?t.replace(/-/g,""):t}class u{constructor(e,t,n,a=!0){this.caseId=e,this.versionCode=t,this.dataSource=n,this.flatData=a,this.ready=o.saveSceneConfig(e,t,n).catch(a=>(console.warn(`初始化数据库出错,直接重置:${a.message}`),o.forceInitSceneConfig(e,t,n)))}getUserTemplates(){return this.ready.then(()=>o.getConfigByCaseId(this.caseId))}upsertTemplate(e){let t;if(e.templateId)t=o.upsertTemplate(e);else{const n=p();if(e.templateId=n,e.baseTemplate){const a={};t=o.getLanesByTemplateId(this.caseId,e.baseTemplate).then(e=>{a.lanes=e;const t=e.map(e=>o.getLinesByLaneId(this.caseId,e.laneId));return Promise.all(t).then(e=>{const t=[];e.forEach((e,r)=>{const s=p();a.lanes[r].laneId=s,a.lanes[r].templateId=n,a.lanes[r].createUser=void 0,e.forEach(e=>{e.lineId=p(),e.laneId=s,e.createUser=void 0,t.push(e)})}),a.lines=t})}).then(()=>{a.templates=[e]}).then(()=>{a.params=[];const e=o.setUpData(this.caseId,this.versionCode,a);return o.batchAddConfig(e)}).then(()=>o.getTemplateById(this.caseId,n))}else t=o.upsertTemplate(e)}return"1"===e.isPublic?t.then(()=>o.getTemplatesByCaseId(this.caseId).then(t=>t.filter(t=>t.templateId!==e.templateId)).then(e=>{e.forEach(e=>{e.isPublic="0"});const t=e.map(e=>o.upsertTemplate(e));return Promise.all(t)}).then(()=>o.getConfigByTemplateId(this.caseId,e.templateId))):t}deleteTemplate(e){return o.getLanesByTemplateId(this.caseId,e.templateId).then(e=>{const t=e.map(e=>e.laneId);let n=t.map(e=>o.getLinesByLaneId(this.caseId,e));return Promise.all(n).then(e=>{const t=e.reduce((e,t)=>e.concat(t),[]).map(e=>e.lineId);return o.deleteLineByIds(this.caseId,t)}).then(()=>Promise.resolve(t))}).then(e=>o.deleteLaneByLaneIds(this.caseId,e)).then(()=>o.deleteTemplate(this.caseId,e.templateId)).then(()=>Promise.resolve(e))}upsertLane(e){return e.laneId||(e.laneId=p()),e.lines||(e.lines=[]),o.upsertLane(this.caseId,e)}delLane(e){const{lines:t,laneId:n}=e,a=t.map(e=>e.lineId);return o.deleteLineByIds(this.caseId,a).then(()=>o.deleteLaneByLaneIds(this.caseId,[n])).then(()=>Promise.resolve(e))}upsertLine(e){return e.lineId||(e.lineId=p()),e.laneId?o.upsertLine(this.caseId,e):Promise.reject(new Error("更新线条数据的时候,必须laneId不能为空!"))}delLine(e){return e.laneId?o.deleteLineByIds(this.caseId,[e.lineId]):Promise.reject(new Error("更新线条数据的时候,必须laneId不能为空!"))}restoreSetting(){return o.forceInitSceneConfig(this.caseId,this.versionCode,this.dataSource)}getType(){return"local-default"}}class f{static createStrategy(e){if("local"===e.type){let n;if((t=e.dataSource)&&Array.isArray(t.templates)&&Array.isArray(t.lanes)&&Array.isArray(t.lines)&&(0===t.templates.length||!t.templates[0].lanes))n={...e};else{if(!function(e){return Array.isArray(e)?0===e.length||!!e[0]&&Array.isArray(e[0].lanes):!!e&&Array.isArray(e.templates)&&(0===e.templates.length||Array.isArray(e.templates[0].lanes))}(e.dataSource))throw new Error("策略数据源格式不匹配");{const t=function(e){const t=[],n=[],a=[];for(const r of e){const{lanes:e,...s}=r;s.templateId||(s.templateId=p()),t.push(s);for(const t of e||[]){const{lines:e,...r}=t;r.templateId=s.templateId,r.laneId||(r.laneId=p()),n.push(r);for(const t of e||[])t.laneId=r.laneId,t.lineId||(t.lineId=p()),a.push(t)}}return{templates:t,lanes:n,lines:a}}(e.dataSource.templates);n={...e,dataSource:{...t,params:e.dataSource.params}}}}const{caseId:a,versionCode:r,dataSource:s}=n;return new u(a,r,s,!1)}return new s(e);var t}}var g={inject:["upsertTemplate","setTargetData","setExpanded"],props:{currentTemplate:{type:Object},formDisable:{type:Boolean},userTemplate:{type:Array},caseId:{type:String,default:""}},data(){return{formData:Object.assign({sort:void 0},this.currentTemplate),rules:{templateName:[{required:!0,message:"请输入模板名称",trigger:"blur"}]},saving:!1}},methods:{editable(){this.$emit("editable")},submitForm(e){this.$refs[e].validate(e=>{if(!e)return;if("function"!=typeof this.upsertTemplate)return void this.$message({type:"error",message:"没有配置模板管理方法"});this.saving=!0;const t={...this.formData};t.caseId||(t.caseId=this.caseId);const n=this.upsertTemplate(t);n instanceof Promise?n.then(e=>{this.setTargetData(e)}).then(()=>{this.$message({type:"success",message:"保存成功"})}).finally(()=>{this.saving=!1}):this.saving=!1})}},computed:{baseTemplate(){return this.userTemplate?[{name:"空白模板",value:""},...this.userTemplate.map(e=>({name:e.templateName,value:e.templateId}))]:[{name:"空白模板",value:""}]}},watch:{currentTemplate:{deep:!0,handler:function(e){this.formData=Object.assign({},e)}}}};function S(e,t){void 0===t&&(t={});var n=t.insertAt;if(e&&"undefined"!=typeof document){var a=document.head||document.getElementsByTagName("head")[0],r=document.createElement("style");r.type="text/css","top"===n&&a.firstChild?a.insertBefore(r,a.firstChild):a.appendChild(r),r.styleSheet?r.styleSheet.cssText=e:r.appendChild(document.createTextNode(e))}}function y(e,t,n,a,r,s,i,o,l,d){"boolean"!=typeof i&&(l=o,o=i,i=!1);const c="function"==typeof n?n.options:n;let m;if(e&&e.render&&(c.render=e.render,c.staticRenderFns=e.staticRenderFns,c._compiled=!0,r&&(c.functional=!0)),a&&(c._scopeId=a),s?(m=function(e){(e=e||this.$vnode&&this.$vnode.ssrContext||this.parent&&this.parent.$vnode&&this.parent.$vnode.ssrContext)||"undefined"==typeof __VUE_SSR_CONTEXT__||(e=__VUE_SSR_CONTEXT__),t&&t.call(this,l(e)),e&&e._registeredComponents&&e._registeredComponents.add(s)},c._ssrRegister=m):t&&(m=i?function(e){t.call(this,d(e,this.$root.$options.shadowRoot))}:function(e){t.call(this,o(e))}),m)if(c.functional){const e=c.render;c.render=function(t,n){return m.call(n),e(t,n)}}else{const e=c.beforeCreate;c.beforeCreate=e?[].concat(e,m):[m]}return n}S(".kd-lane-template-content {\n display: flex;\n flex-direction: column;\n align-content: center;\n}\n.kd-lane-template-content .template-buttons {\n text-align: center;\n}");const b=g;var v=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"kd-lane-template-content"},[n("el-form",{ref:"template",attrs:{rules:e.rules,model:e.formData,"label-width":"120px"}},[n("el-form-item",{attrs:{label:"模板名称",prop:"templateName"}},[n("el-input",{attrs:{disabled:"SYSTEM_USER"==e.currentTemplate.createUser||e.formDisable},model:{value:e.formData.templateName,callback:function(t){e.$set(e.formData,"templateName",t)},expression:"formData.templateName"}})],1),e._v(" "),n("el-form-item",{attrs:{label:"默认模板",prop:"isPublic"}},[n("el-radio-group",{attrs:{disabled:e.formDisable},model:{value:e.formData.isPublic,callback:function(t){e.$set(e.formData,"isPublic",t)},expression:"formData.isPublic"}},[n("el-radio",{attrs:{label:"1"}},[e._v("是")]),e._v(" "),n("el-radio",{attrs:{label:"0"}},[e._v("否")])],1)],1),e._v(" "),n("el-form-item",{attrs:{label:"曲线高度占比",prop:"col1"}},[n("el-select",{attrs:{disabled:e.formDisable},model:{value:e.formData.col1,callback:function(t){e.$set(e.formData,"col1",t)},expression:"formData.col1"}},[n("el-option",{attrs:{value:"0.5",label:"50%"}}),e._v(" "),n("el-option",{attrs:{value:"0.6",label:"60%"}}),e._v(" "),n("el-option",{attrs:{value:"0.7",label:"70%"}}),e._v(" "),n("el-option",{attrs:{value:"0.8",label:"80%"}}),e._v(" "),n("el-option",{attrs:{value:"0.9",label:"90%"}}),e._v(" "),n("el-option",{attrs:{value:"1",label:"全屏"}})],1)],1),e._v(" "),n("el-form-item",{directives:[{name:"show",rawName:"v-show",value:!e.currentTemplate.templateId,expression:"!currentTemplate.templateId"}],attrs:{label:"选择基础模板",prop:"lineType",disabled:e.formDisable}},[n("el-select",{attrs:{placeholder:"请选择"},model:{value:e.formData.baseTemplate,callback:function(t){e.$set(e.formData,"baseTemplate",t)},expression:"formData.baseTemplate"}},e._l(e.baseTemplate,function(e){return n("el-option",{key:e.value,attrs:{label:e.name,value:e.value}})}),1)],1),e._v(" "),n("el-form-item",{attrs:{label:"顺序",prop:"sort","label-width":"120px"}},[n("el-input",{attrs:{disabled:e.formDisable},model:{value:e.formData.sort,callback:function(t){e.$set(e.formData,"sort",e._n(t))},expression:"formData.sort"}})],1)],1),e._v(" "),n("div",{staticClass:"template-buttons"},[n("el-button",{on:{click:e.editable}},[e._v("编辑")]),e._v(" "),n("el-button",{attrs:{type:"primary",disabled:e.formDisable,loading:e.saving},on:{click:function(t){return e.submitForm("template")}}},[e._v("保存")])],1)],1)};v._withStripped=!0;const E=y({render:v,staticRenderFns:[]},undefined,b,undefined,false,undefined,!1,void 0,void 0,void 0);var I={inject:["upsertLane","setTargetData","setExpanded"],props:{laneInfo:{type:Object},caseId:{type:String,default:""},formDisable:{type:Boolean}},data(){return{formData:Object.assign(this.laneInfo),rules:{sort:[{required:!0,message:"请输入泳道顺序",trigger:"blur"}]},saving:!1}},methods:{editable(){this.$emit("editable")},submitForm(e){this.$refs[e].validate(e=>{if(!e)return;if("function"!=typeof this.upsertLane)return void this.$message({type:"error",message:"没有配置泳道管理方法"});this.saving=!0;const t={...this.formData};t.caseId||(t.caseId=this.caseId);const n=this.upsertLane(t);n instanceof Promise?n.then(e=>{this.setTargetData(e)}).then(()=>{this.$message({type:"success",message:"保存成功"})}).finally(()=>{this.saving=!1}):this.saving=!1})}},computed:{},watch:{laneInfo:{deep:!0,handler:function(e){this.formData=Object.assign({},e)}}}};S(".kd-lane-lane-content {\n display: flex;\n flex-direction: column;\n align-content: center;\n}\n.kd-lane-lane-content .template-buttons {\n text-align: center;\n}");const T=I;var _=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"kd-lane-lane-content"},[n("el-form",{ref:"template",attrs:{rules:e.rules,model:e.formData,"label-width":"120px"}},[n("el-form-item",{attrs:{label:"泳道顺序",prop:"sort"}},[n("el-input",{attrs:{disabled:e.formDisable},model:{value:e.formData.sort,callback:function(t){e.$set(e.formData,"sort",t)},expression:"formData.sort"}})],1)],1),e._v(" "),n("div",{staticClass:"template-buttons"},[n("el-button",{on:{click:e.editable}},[e._v("编辑")]),e._v(" "),n("el-button",{attrs:{type:"primary",disabled:e.formDisable,loading:e.saving},on:{click:function(t){return e.submitForm("template")}}},[e._v("保存")])],1)],1)};_._withStripped=!0;const x=y({render:_,staticRenderFns:[]},undefined,T,undefined,false,undefined,!1,void 0,void 0,void 0);var C={inject:["upsertLine","setTargetData","setExpanded","getThemeName"],props:{template:{type:Object},formDisable:{type:Boolean},params:{type:Array}},mounted(){},data(){const e=(e,t,n)=>{isNaN(t)?n(new Error("请输入数字值")):n()};return{formData:Object.assign({},this.template),lines:[{name:"直线",value:"solid"},{name:"虚线",value:"dashed"},{name:"点线",value:"dotted"},{name:"面积",value:"area"}],lineWidthSliderMarks:{1:"1",2:"2",3:"3",4:"4"},rules:{min:[{required:!0,message:"请输入最小值",trigger:"blur"},{validator:e,trigger:"blur"}],lineSort:[{required:!0,message:"请输入曲线顺序(1-10)",trigger:"blur"},{type:"number",message:"顺序必须为数字值"}],max:[{required:!0,message:"请输入最大值",trigger:"blur"},{validator:e,trigger:"blur"}],lineSize:[{required:!0,message:"请选择曲线粗细",trigger:"blur"}],lineColor:[{required:!0,message:"请选择曲线颜色",trigger:"blur"}],lineType:[{required:!0,message:"请选择线型",trigger:"blur"}],paramId:[{required:!0,message:"请选择参数名称",trigger:"blur"}]}}},methods:{editable(){this.$emit("editable")},submitForm(e){this.$refs[e].validate().then(()=>{if(!(this.upsertLine instanceof Function))return Promise.reject(new Error("未配置线条设置函数"));{const e=this.getThemeName(),t=this.formData.themeConfig;if(e&&t&&t[e]){t[e].lineColor=this.formData.lineColor}this.saving=!0;const n=this.upsertLine(this.formData);n instanceof Promise?n.then(e=>{this.setTargetData(e)}).then(()=>{this.$message({type:"success",message:"保存成功"})}).finally(()=>{this.saving=!1}):this.saving=!1}}).catch(e=>{console.log(e)})}},watch:{template:{immediate:!1,deep:!0,handler(e){const t=this.getThemeName(),n=e.themeConfig;let a;if(t&&n&&n[t]){const e=n[t].lineColor;e&&(a=e)}this.formData=a?Object.assign({},e,{lineColor:a}):Object.assign({},e)}}}};S(".kd-lane-line-content {\n width: 95%;\n display: flex;\n flex-direction: column;\n align-content: center;\n}\n.kd-lane-line-content .template-buttons {\n text-align: center;\n}");const w=C;var A=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"kd-lane-line-content"},[n("el-form",{ref:"template",attrs:{rules:e.rules,model:e.formData,disabled:e.formDisable}},[n("el-form-item",{attrs:{label:"参数名称",prop:"paramId","label-width":"120px"}},[n("el-select",{attrs:{filterable:"",placeholder:"请选择"},model:{value:e.formData.paramId,callback:function(t){e.$set(e.formData,"paramId",t)},expression:"formData.paramId"}},e._l(e.params,function(e){return n("el-option",{key:e.paramId,attrs:{label:e.paramName,value:e.paramId}})}),1)],1),e._v(" "),n("el-form-item",{attrs:{label:"最小值",prop:"min","label-width":"120px"}},[n("el-input",{model:{value:e.formData.min,callback:function(t){e.$set(e.formData,"min",t)},expression:"formData.min"}})],1),e._v(" "),n("el-form-item",{attrs:{label:"最大值",prop:"max","label-width":"120px"}},[n("el-input",{model:{value:e.formData.max,callback:function(t){e.$set(e.formData,"max",t)},expression:"formData.max"}})],1),e._v(" "),n("el-form-item",{attrs:{label:"曲线粗细",prop:"lineSize","label-width":"120px"}},[n("el-input",{attrs:{max:4,min:1,type:"number"},model:{value:e.formData.lineSize,callback:function(t){e.$set(e.formData,"lineSize",t)},expression:"formData.lineSize"}})],1),e._v(" "),n("el-form-item",{attrs:{label:"曲线颜色",prop:"lineColor","label-width":"120px"}},[n("el-color-picker",{attrs:{disabled:e.formData.isGradient},model:{value:e.formData.lineColor,callback:function(t){e.$set(e.formData,"lineColor",t)},expression:"formData.lineColor"}})],1),e._v(" "),n("el-form-item",{attrs:{label:"线型",prop:"lineType","label-width":"120px"}},[n("el-select",{attrs:{placeholder:"请选择",disabled:e.formData.isGradient},model:{value:e.formData.lineType,callback:function(t){e.$set(e.formData,"lineType",t)},expression:"formData.lineType"}},e._l(e.lines,function(e){return n("el-option",{key:e.value,attrs:{label:e.name,value:e.value}})}),1)],1),e._v(" "),n("el-form-item",{attrs:{label:"曲线顺序",prop:"lineSort","label-width":"120px"}},[n("el-input",{model:{value:e.formData.lineSort,callback:function(t){e.$set(e.formData,"lineSort",e._n(t))},expression:"formData.lineSort"}})],1),e._v(" "),e._e()],1),e._v(" "),n("div",{directives:[{name:"show",rawName:"v-show",value:"SYSTEM_USER"!=e.template.createUser,expression:"template.createUser != 'SYSTEM_USER'"}],staticClass:"template-buttons"},[n("el-button",{on:{click:e.editable}},[e._v("编辑")]),e._v(" "),n("el-button",{attrs:{type:"primary",disabled:e.formDisable},on:{click:function(t){return e.submitForm("template")}}},[e._v("保存")])],1)],1)};A._withStripped=!0;const D=y({render:A,staticRenderFns:[]},undefined,w,undefined,false,undefined,!1,void 0,void 0,void 0);a.default.use(r.default);var N={name:"VueSimpleContextMenu",props:{options:{type:Array,required:!0}},data:()=>({item:null,menuWidth:null,menuHeight:null}),methods:{showMenu(e,t){this.item=t;const n=this.$refs.refUl;n&&(this.menuWidth&&this.menuHeight||(n.style.visibility="hidden",n.style.display="block",this.menuWidth=n.offsetWidth,this.menuHeight=n.offsetHeight,n.removeAttribute("style")),this.menuWidth+e.pageX>=window.innerWidth?n.style.left=e.pageX-this.menuWidth+2+"px":n.style.left=e.pageX-2+"px",this.menuHeight+e.pageY>=window.innerHeight?n.style.top=e.pageY-this.menuHeight+2+"px":n.style.top=e.pageY-2+"px",n.classList.add("vue-simple-context-menu--active"))},hideContextMenu(){const e=this.$refs.refUl;e&&(e.classList.remove("vue-simple-context-menu--active"),this.$emit("menu-closed"))},onClickOutside(){this.hideContextMenu()},optionClicked(e){this.hideContextMenu(),this.$emit("option-clicked",{item:this.item,option:e})},onEscKeyRelease(e){27===e.keyCode&&this.hideContextMenu()}},mounted(){document.body.addEventListener("keyup",this.onEscKeyRelease)},beforeDestroy(){document.removeEventListener("keyup",this.onEscKeyRelease)}};S('.vue-simple-context-menu {\n top: 0;\n left: 0;\n margin: 0;\n padding: 0;\n display: none;\n list-style: none;\n position: fixed;\n z-index: 1000000;\n background-color: var(--kd-lane-container-context-background-color, #ecf0f1);\n border-bottom-width: 0px;\n font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;\n box-shadow: 0 3px 6px 0 rgba(var(--kd-lane-container-context-item-color, #333), 0.2);\n border-radius: 4px;\n}\n.vue-simple-context-menu--active {\n display: block;\n}\n.vue-simple-context-menu__item {\n display: flex;\n color: var(--kd-lane-container-context-item-color, #333);\n cursor: pointer;\n padding: 5px 15px;\n align-items: center;\n}\n.vue-simple-context-menu__item:hover {\n background-color: var(--kd-lane-container-context-hover-background-color, #007aff);\n color: var(--kd-lane-container-context-hover-item-color, #fff);\n}\n.vue-simple-context-menu__divider {\n box-sizing: content-box;\n height: 2px;\n background-color: var(--kd-lane-container-context-divider-color, #595a5a);\n padding: 4px 0;\n background-clip: content-box;\n pointer-events: none;\n}\n.vue-simple-context-menu li:first-of-type {\n margin-top: 4px;\n}\n.vue-simple-context-menu li:last-of-type {\n margin-bottom: 4px;\n}');const k=N;var L=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",[n("ul",{directives:[{name:"click-outside",rawName:"v-click-outside",value:e.onClickOutside,expression:"onClickOutside"}],ref:"refUl",staticClass:"vue-simple-context-menu"},e._l(e.options,function(t,a){return n("li",{key:a,staticClass:"vue-simple-context-menu__item",class:[t.class,"divider"===t.type?"vue-simple-context-menu__divider":""],on:{click:function(n){return n.stopPropagation(),e.optionClicked(t)}}},[n("span",{domProps:{innerHTML:e._s(t.name)}})])}),0)])};L._withStripped=!0;const M=y({render:L,staticRenderFns:[]},undefined,k,undefined,false,undefined,!1,void 0,void 0,void 0);var R={inject:["delTemplate","delLane","delLine"],provide(){return{setTargetData:this.setTargetData,setExpanded:this.setExpanded}},components:{LineEdit:D,TemplateEdit:E,LaneEdit:x,VueSimpleContextMenu:M},props:{contextItem:{type:Object,default:()=>{}},expended:{type:Object},caseId:{type:String,default:""},inputTempates:{type:Array,default:()=>[]},params:{type:Array,required:!0,default:()=>[]},paramsNameMap:{type:Object,default:()=>{},required:!0}},data:()=>({templateContentShow:!1,templateDisable:!1,laneContentShow:!1,lineContentShow:!1,templateInfo:{},laneInfo:{},lineInfo:{},dataType:"",curveConfigLoading:!1,expandedKeys:[],currentNodeKey:"",targetData:void 0,treeKey:""}),mounted(){},methods:{getLineDataLabel(e){if(!e)return"";const t=this.paramsNameMap[e.paramId];return t?t.paramName:e.paramId},setTargetData(e){this.targetData=e,this.setExpanded();switch(h(e)){case"template":this.templateContentShow=!0,this.laneContentShow=!1,this.lineContentShow=!1,this.templateDisable=!0,this.templateInfo=e;break;case"lane":this.templateContentShow=!1,this.laneContentShow=!0,this.lineContentShow=!1,this.templateDisable=!0,this.laneInfo=e;break;case"line":this.templateContentShow=!1,this.laneContentShow=!1,this.lineContentShow=!0,this.templateDisable=!0,this.lineInfo=e}},setExpanded(){const e=this.targetData;if(e){switch(h(e)){case"template":this.expandedKeys=[e.templateId],this.currentNodeKey=e.templateId;break;case"lane":this.expandedKeys=[e.laneId],this.currentNodeKey=e.laneId;break;case"line":this.expandedKeys=[e.lineId],this.currentNodeKey=e.lineId;break;default:this.expandedKeys=[],this.currentNodeKey=""}}else this.expandedKeys=[],this.currentNodeKey="";this.$refs.refTree&&this.$refs.refTree.setCurrentKey(this.currentNodeKey),this.treeKey=`treeKey${(new Date).getTime()}`},optionClicked(e){const{option:t={},item:n}=e;switch(t.key){case"delTemplate":this.askForDelTemplate(n);break;case"addLane":this.addLane(n);break;case"delLane":this.askForDelLane(n);break;case"addParam":this.addParam(n);break;case"delParam":this.delParam(n)}},hideContextMenu(){const e=this.$refs.vueSimpleContextMenu;e&&e.hideContextMenu()},showRightWindows(e,t,n){const a=this.judgeDataType(n);this.dataType=a,"SYSTEM_USER"!=t.createUser?this.$refs.vueSimpleContextMenu.showMenu(e,t):this.$message.warning("系统模板不能编辑")},clear(){this.expandedKeys=[],this.templateDisable=!0,this.templateContentShow=!1},editable(){this.templateDisable=!1},handleNodeClick(e){this.setTargetData(e)},judgeDataType(e){const{level:t,data:n={}}=e;return 1==t&&n.templateId?"template":2==t&&n.laneId&&n.templateId?"lane":3==t&&n.lineId?"line":null},addTemplate(){this.templateContentShow=!0,this.laneContentShow=!1,this.lineContentShow=!1,this.templateDisable=!1,this.templateInfo={isPublic:"0",baseTemplate:"",col1:"1"}},addLane(e){this.templateContentShow=!1,this.laneContentShow=!0,this.lineContentShow=!1,this.templateDisable=!1,this.laneInfo={templateId:e.templateId,isUsed:"1",sort:e.lanes.length+1}},addParam(e){this.templateContentShow=!1,this.laneContentShow=!1,this.lineContentShow=!0,this.templateDisable=!1,this.lineInfo={laneId:e.laneId,isUsed:"1",lineSize:2}},askForDelTemplate(e){this.$confirm("此操作将删除该模板, 是否继续?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>(e.bsflag="1",this.curveConfigLoading=!0,this.delTemplate instanceof Function?this.delTemplate(e):Promise.reject(new Error("未配置删除模板函数")))).catch(e=>{this.$message.error(e.message||"删除失败")}).finally(()=>{this.curveConfigLoading=!1})},askForDelLane(e){this.$confirm("此操作将删除该泳道, 是否继续?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>(e.bsflag="1",this.curveConfigLoading=!0,this.delLane instanceof Function?this.delLane(e):Promise.reject(new Error("未配置删除模板函数")))).catch(()=>{this.$message.error("删除失败")}).finally(()=>{this.curveConfigLoading=!1})},delParam(e){this.$confirm("此操作将删除该参数, 是否继续?","提示",{confirmButtonText:"确定",cancelButtonText:"取消",type:"warning"}).then(()=>(e.bsflag="1",this.delLine instanceof Function?this.delLine(e):Promise.reject(new Error("未配置删除线条函数")))).catch(e=>{this.$message.error(e.message||"删除失败")})}},computed:{contextMenuOptions(){switch(this.dataType){case"template":return[{name:"新增泳道",key:"addLane"},{name:"删除模板",key:"delTemplate"}];case"lane":return[{name:"新增参数",key:"addParam"},{name:"删除泳道",key:"delLane"}];case"line":return[{name:"删除参数",key:"delParam"}];default:return[]}},treeData(){if(this.inputTempates){const e=[];return this.inputTempates.forEach(t=>{const n={...t,id:t.templateId,label:t.templateName};n.children=[],t.lanes||(t.lanes=[]),t.lanes.forEach((e,t)=>{const a={...e,id:e.laneId,label:`泳道${t+1}`};n.children.push(a),a.lines||(a.lines=[]),a.children=[],e.lines.forEach(e=>{const t={...e,id:e.lineId,label:e.lineName||e.paramId};t.label=this.getLineDataLabel(e),a.children.push(t)})}),e.push(n)}),e}return[]},userTemplate(){return this.treeData?[...this.treeData]:[]}},watch:{contextItem:{immediate:!0,deep:!0,handler(e){this.setTargetData(Object.assign({},e))}}},beforeDestroy(){}};S(".kd-lane-el-container {\n height: 60vh;\n border: 1px solid var(--kd-lane-container-border-color, #333);\n width: 100%;\n}\n@media screen and (max-width: 1024px) {\n.kd-lane-el-container {\n height: 70vh;\n}\n}\n.kd-lane-el-container .rtd-config-side {\n border-right: 1px solid var(--kd-lane-container-border-color, #333);\n}\n.kd-lane-el-container .rtd-config-side-tree {\n height: 90%;\n overflow: auto;\n}\n.kd-lane-el-container .rtd-config-side-option {\n text-align: center;\n}\n.kd-lane-el-container .rtd-config-main {\n display: flex;\n align-content: center;\n justify-content: center;\n width: 100%;\n}");const P=R;var $=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("el-container",{directives:[{name:"loading",rawName:"v-loading",value:e.curveConfigLoading,expression:"curveConfigLoading"}],staticClass:"kd-lane-el-container"},[n("el-aside",{staticClass:"rtd-config-side",attrs:{width:"20%"}},[n("el-tree",{key:e.treeKey,ref:"refTree",staticClass:"rtd-config-side-tree",attrs:{data:e.treeData,"expand-on-click-node":!1,"current-node-key":e.currentNodeKey,"default-expanded-keys":e.expandedKeys,"node-key":"id","highlight-current":""},on:{"node-click":e.handleNodeClick,"node-expand":e.hideContextMenu,"node-collapse":e.hideContextMenu},scopedSlots:e._u([{key:"default",fn:function(t){var a=t.node,r=t.data;return n("span",{staticClass:"custom-tree-node",on:{contextmenu:function(t){return t.preventDefault(),e.showRightWindows(t,r,a)}}},[n("span",[e._v(e._s(a.label))]),e._v(" "),n("span",{directives:[{name:"show",rawName:"v-show",value:"1"==r.isPublic,expression:"data.isPublic == '1'"}],staticStyle:{"padding-left":"5px"}},[n("i",{staticClass:"el-icon-star-on"})])])}}])}),e._v(" "),n("div",{staticClass:"rtd-config-side-option"},[n("el-button",{on:{click:e.addTemplate}},[e._v("新增模板")])],1)],1),e._v(" "),n("el-main",{staticClass:"rtd-config-main"},[n("TemplateEdit",e._g({directives:[{name:"show",rawName:"v-show",value:e.templateContentShow,expression:"templateContentShow"}],attrs:{currentTemplate:e.templateInfo,"form-disable":e.templateDisable,userTemplate:e.userTemplate,caseId:e.caseId},on:{editable:e.editable}},e.$listeners)),e._v(" "),n("LaneEdit",e._g({directives:[{name:"show",rawName:"v-show",value:e.laneContentShow,expression:"laneContentShow"}],attrs:{laneInfo:e.laneInfo,"form-disable":e.templateDisable},on:{editable:e.editable}},e.$listeners)),e._v(" "),n("LineEdit",e._g({directives:[{name:"show",rawName:"v-show",value:e.lineContentShow,expression:"lineContentShow"}],attrs:{template:e.lineInfo,params:e.params,"form-disable":e.templateDisable},on:{editable:e.editable}},e.$listeners))],1),e._v(" "),n("VueSimpleContextMenu",{ref:"vueSimpleContextMenu",attrs:{options:e.contextMenuOptions},on:{"option-clicked":e.optionClicked}})],1)};$._withStripped=!0;const O=y({render:$,staticRenderFns:[]},undefined,P,undefined,false,undefined,!1,void 0,void 0,void 0);var B={props:{itemHeight:{type:Number,default:20},line:{type:Object,default:()=>{}},paramsNameMap:{type:Object,default:()=>{},required:!0},themeName:{type:String,default:void 0}},methods:{getParamName(e){if(!e)return"";const t=this.paramsNameMap[e.paramId];return t?`${t.paramName}${t.paramUnit}`:""},toggleIsUsed(){const e={...this.line};"1"==e.isUsed||1==e.isUsed?e.isUsed="0":e.isUsed="1",this.$emit("updateLine",e)}},computed:{gradientDisplay(){let e,t;return this.themeName&&this.line.themeConfig&&(e=this.line.themeConfig[this.themeName]?.lineColor),t=this.line.isGradient?{background:`${e||this.line.lineColor}`}:{},t},textColor(){let e;return this.themeName&&this.line.themeConfig&&!this.line.isGradient&&(e=this.line.themeConfig[this.themeName]?.lineColor),{color:e||this.line.lineColor}},headerItemStyle(){let e,t;return this.themeName&&this.line.themeConfig&&(e=this.line.themeConfig[this.themeName]?.lineColor),t="area"==this.line.lineType?this.line.isGradient?{}:{"box-shadow":`inset 0 0 8px 0px ${e||this.line.lineColor}`}:{"border-bottom":`2px ${this.line.lineType} ${e||this.line.lineColor}`},{height:`${this.itemHeight}px`,opacity:"1"==this.line.isUsed?1:.5,...t}}},watch:{}};S('@charset "UTF-8";\n.kd-lane-chart-container-header-item {\n color: var(--kd-lane-container-header-item-color, #333);\n border: unset;\n position: relative;\n cursor: pointer;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container {\n height: 100%;\n width: 100%;\n font-size: 10px;\n font-weight: bold;\n position: relative;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .left {\n position: absolute;\n left: 0;\n bottom: 2px;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .center {\n position: absolute;\n left: 50%;\n bottom: 2px;\n transform: translateX(-50%);\n /* 文字不换行,超出显示省略号 */\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .right {\n position: absolute;\n right: 0;\n bottom: 2px;\n}\n.kd-lane-chart-container-header-item .kd-lane-chart-container-text-container .gradient-display {\n position: absolute;\n height: 2px;\n left: 0;\n bottom: 0;\n right: 0;\n}');const j=B;var U=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{staticClass:"kd-lane-chart-container-header-item",style:e.headerItemStyle,on:{click:e.toggleIsUsed}},[n("div",{staticClass:"kd-lane-chart-container-text-container"},[n("span",{staticClass:"left",style:e.textColor},[e._v(e._s(e.line.min))]),e._v(" "),n("span",{staticClass:"center"},[e._v(e._s(e.getParamName(e.line)))]),e._v(" "),n("span",{staticClass:"right",style:e.textColor},[e._v(e._s(e.line.max))]),e._v(" "),n("div",{staticClass:"gradient-display",style:e.gradientDisplay})])])};U._withStripped=!0;const V=y({render:U,staticRenderFns:[]},undefined,j,undefined,false,undefined,!1,void 0,void 0,void 0);var q={name:"KdLaneContainer",provide(){return{upsertTemplate:this.upsertTemplate,delTemplate:this.delTemplate,upsertLane:this.upsertLane,delLane:this.delLane,upsertLine:this.upsertLine,delLine:this.delLine,getThemeName:()=>this.themeName}},components:{HeaderItem:V,RealTimeCurveConfig:O,VueSimpleContextMenu:M},props:{config:{type:Object,required:!0,validator:function(e){if("object"!=typeof e||null===e)throw new Error("配置必须是一个对象");if(!("type"in e))throw new Error("配置必须包含 type 属性");if(!("caseId"in e)||!("versionCode"in e))throw new Error("配置必须包含 caseId, versionCode 属性");const{type:t}=e;if("local"===t){if(!("dataSource"in e)||null==e.dataSource)throw new Error("local 类型的配置必须包含 dataSource 属性");if(!("params"in e.dataSource))throw new Error("local 类型的配置 dataSource 必须包含 params 属性")}else{if("custom"!==t)throw new Error('type 必须是 "local" 或 "custom"');{const t=["getUserTemplates","upsertTemplate","delTemplate","upsertLane","delLane","upsertLine","delLine"];for(const n of t)if("function"!=typeof e[n])throw new Error(`${n} 必须是一个函数`)}}return!0}},headerPadding:{type:Number,default:4},headerItemHeight:{type:Number,default:20},itemGap:{type:Number,default:2},customMenuList:{type:Array,default:()=>[]},themeName:{type:String,default:void 0}},data:()=>({treeTemplates:null,isLoading:!1,strategy:null,currentTemplate:{},curveConfigVisible:!1,params:[],contextItem:void 0}),created(){this.strategy=f.createStrategy(this.$props.config),this.loadConfig()},mounted(){},methods:{setExpanded(){this.$refs.curveConfig.setExpanded()},delLine(e){return this.strategy.delLine(e).then(()=>{const t=this.currentTemplate.lanes,n=t.findIndex(t=>t.laneId==e.laneId);if(n<0)for(const t of this.treeTemplates){const{lanes:n}=t;for(const t of n)if(t.laneId==e.laneId){const{lines:n}=t,a=n.findIndex(t=>t.lineId==e.lineId);a<0?console.warn("要删除的线条在当前泳道中不存在?"):n.splice(a,1);break}}else{const a=t[n].lines.findIndex(t=>t.lineId==e.lineId);a<0?console.warn("要删除的线条在当前泳道中不存在?"):t[n].lines.splice(a,1),this.onLineChange(e)}})},upsertLine(e){return this.strategy.upsertLine(e).then(e=>{const t=this.currentTemplate.lanes,n=t.findIndex(t=>t.laneId==e.laneId);if(!(n<0)){const a=t[n],r=a.lines,s=r.findIndex(t=>t.lineId==e.lineId);return s<0?r.push(e):this.$set(r,s,e),this.$set(t,n,a),d(a),this.onLineChange(e),e}for(const t of this.treeTemplates){const{lanes:n}=t;for(const t of n)if(t.laneId==e.laneId){const{lines:n}=t,a=n.findIndex(t=>t.lineId==e.lineId);a<0?n.push(e):this.$set(n,a,e),d(t);break}}})},delLane(e){return this.strategy.delLane(e).then(e=>{const{templateId:t}=e,n=this.treeTemplates.findIndex(e=>e.templateId==t);if(n<0)return void console.warn(`template_id not found: '${t}'`);const a=this.treeTemplates[n],r=a.lanes.findIndex(t=>t.laneId==e.laneId);a.lanes.splice(r,1),this.currentTemplate.templateId==t&&this.setDefaultAndNotify()})},upsertLane(e){return this.strategy.upsertLane(e).then(e=>{const t=this.treeTemplates.findIndex(t=>t.templateId==e.templateId);if(t<0)console.warn("template not found");else{const n=this.treeTemplates[t],a=n.lanes||[],r=a.findIndex(t=>t.laneId==e.laneId);r<0?a.push(e):this.$set(a,r,e),c(n.lanes),n.templateId===this.currentTemplate.templateId&&this.setDefaultAndNotify()}return e})},delTemplate(e){return this.strategy.deleteTemplate(e).then(()=>{const t=this.treeTemplates.findIndex(t=>t.templateId===e.templateId);this.treeTemplates.splice(t,1),e.templateId==this.currentTemplate.templateId&&this.setDefaultAndNotify()})},upsertTemplate(e){return this.strategy.upsertTemplate(e).then(e=>{"1"==e.isPublic&&this.treeTemplates.forEach(e=>{e.isPublic="0"});const t=this.treeTemplates.findIndex(t=>t.templateId===e.templateId);if(t>=0){const n=this.treeTemplates[t],a=Object.assign({},n,e);this.$set(this.treeTemplates,t,a)}else this.treeTemplates.push(e);return m(this.treeTemplates),this.setDefaultAndNotify(),e})},onParentContextMenu(e){const t=".kd-lane-chart-lane-header";if(!(e.target&&(e.target.classList.contains(t)||e.target.closest(t)))){e.preventDefault();const t=this.$refs.vueSimpleContextMenu;t&&t.hideContextMenu()}},showContextMenu(e,t){e.stopPropagation(),this.$refs.vueSimpleContextMenu.showMenu(e,t)},optionClicked(e){const{option:t,item:n}=e;this.contextItem=n;const a=this.customMenuList.findIndex(e=>e.key==t.key);if(a<0){if("editTemplate"==t.key)this.curveConfigVisible=!0;else if("restoreSetting"==t.key)return this.restoreSetting()}else this.$emit("onCustomMenuClicked",e)},restoreSetting(){return this.strategy.restoreSetting().then(()=>{this.loadConfig()})},loadConfig(){this.isLoading=!0,this.strategy.getUserTemplates().then(e=>{const{templates:t=[],params:n=[]}=e;this.params=n,m(t),this.treeTemplates=t,this.setDefaultAndNotify()}).catch(e=>{console.error(`加载配置失败: ${this.$props.strategy.caseId},${this.$props.strategy.versionCode},${e.message}`)}).finally(()=>{this.isLoading=!1})},onLineChange(e){console.log("notify line change",e),this.$emit("line-change",e)},setDefaultAndNotify(){const e=this.treeTemplates.find(e=>"1"===e.isPublic);if(e)this.currentTemplate=e;else{const e=this.treeTemplates.find(e=>"SYSTEM_USER"==e.createUser);e?(e.isPublic="1",this.currentTemplate=e,this.strategy.upsertTemplate(e)):(this.treeTemplates[0].isPublic="1",this.currentTemplate=this.treeTemplates[0],this.strategy.upsertTemplate(this.currentTemplate))}this.$emit("template-change",this.currentTemplate)}},computed:{contextMenuOptions(){return"local"==this.config.type?[{name:"编辑模板",key:"editTemplate"},{name:"恢复默认",key:"restoreSetting"},...this.customMenuList]:[{name:"编辑模板",key:"template"},...this.customMenuList]},paramsNameMap(){const e={};for(const t of this.params)e[t.paramId]={paramName:t.paramName,paramUnit:t.paramUnit};return e},lineCount(){const{lanes:e=[]}=this.currentTemplate||{};return Math.max(...e.map(e=>e.lines?.length||0))},headerStyle(){const e={gap:`${this.itemGap}px`,padding:`${this.headerPadding}px`};if(this.currentTemplate){const{lanes:t=[]}=this.currentTemplate;if(t&&0!=t.length){const t=Math.max(0,this.lineCount-1);return{...e,height:this.lineCount*this.headerItemHeight+2*this.headerPadding+t*this.itemGap+"px","min-height":"60px"}}return{...e,height:"30%","min-height":"60px"}}return{...e,height:"30%","min-height":"60px"}},slotHeaderStyle(){if(this.currentTemplate){const{lanes:e=[]}=this.currentTemplate;if(e&&0!=e.length){const e=Math.max(0,this.lineCount-1);return{height:this.lineCount*this.headerItemHeight+2*this.headerPadding+e*this.itemGap+"px","min-height":"60px"}}return{height:"30%","min-height":"60px"}}return{height:"30%","min-height":"60px"}},darwAreaStyle(){const e=this.headerStyle,t=l(e.height),n=l(e["min-height"]);return{top:`${Math.max(t,n)}px`}}}};S(".kd-lane-chart-container {\n height: 100%;\n width: 100%;\n overflow: hidden;\n position: relative;\n border: 1px solid var(--kd-lane-container-border-color, #333);\n display: flex;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container, .kd-lane-chart-container .kd-lane-chart-lane-container {\n height: 100%;\n min-width: 0;\n overflow: hidden;\n z-index: 1;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container .kd-lane-chart-lane-header, .kd-lane-chart-container .kd-lane-chart-lane-container .kd-lane-chart-lane-header {\n max-height: 40%;\n border-bottom: 1px solid var(--kd-lane-container-border-color, #333);\n overflow: hidden;\n z-index: 2;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-container {\n flex: 1;\n}\n.kd-lane-chart-container .kd-lane-chart-lane-slot-container {\n width: auto;\n}\n.kd-lane-chart-container .border-left {\n border-left: 1px solid var(--kd-lane-container-border-color, #333);\n}\n.kd-lane-chart-container .kd-lane-chart-container-draw-area {\n position: absolute;\n left: 0;\n right: 0;\n bottom: 0;\n z-index: 3;\n border: none;\n}");const K=q;var F=function(){var e=this,t=e.$createElement,n=e._self._c||t;return n("div",{directives:[{name:"loading",rawName:"v-loading",value:e.isLoading,expression:"isLoading"}],staticClass:"kd-lane-chart-container",on:{contextmenu:e.onParentContextMenu}},[e.currentTemplate&&e.currentTemplate.lanes&&e.currentTemplate.lanes.length>0?[e._l(e.currentTemplate.lanes||[],function(t,a){return[e.$scopedSlots["lane"+t.laneId]?n("div",{key:t.laneId,staticClass:"kd-lane-chart-lane-slot-container",class:{"border-left":0!=a}},[n("div",{staticClass:"kd-lane-chart-lane-header",style:e.slotHeaderStyle},[e._t("lane"+t.laneId,null,{lane:t})],2)]):e.$slots["lane"+t.laneId]?n("div",{key:""+t.laneId,staticClass:"kd-lane-chart-lane-slot-container",class:{"border-left":0!=a}},[n("div",{staticClass:"kd-lane-chart-lane-header",style:e.slotHeaderStyle},[e._t("lane"+t.laneId,null,{lane:t})],2)]):[n("div",{key:t.laneId,staticClass:"kd-lane-chart-lane-container",class:{"border-left":0!=a}},[n("div",{staticClass:"kd-lane-chart-lane-header",style:e.headerStyle,on:{contextmenu:function(n){return n.preventDefault(),e.showContextMenu(n,t)}}},e._l(t.lines||[],function(t){return n("HeaderItem",{key:t.lineId,attrs:{itemHeight:e.headerItemHeight,line:t,paramsNameMap:e.paramsNameMap,themeName:e.themeName},on:{updateLine:e.upsertLine},nativeOn:{contextmenu:function(n){return n.preventDefault(),e.showContextMenu(n,t)}}})}),1)])]]})]:[n("div",{staticClass:"kd-lane-chart-lane-container"},[n("div",{staticClass:"kd-lane-chart-lane-header",style:e.headerStyle,on:{contextmenu:function(t){return t.preventDefault(),e.showContextMenu.apply(null,arguments)}}})])],e._v(" "),n("div",{staticClass:"kd-lane-chart-container-draw-area",style:e.darwAreaStyle},[e._t("draw-slot")],2),e._v(" "),n("VueSimpleContextMenu",{ref:"vueSimpleContextMenu",attrs:{options:e.contextMenuOptions},on:{"option-clicked":e.optionClicked}}),e._v(" "),n("el-dialog",{attrs:{title:"泳道模板设置",visible:e.curveConfigVisible},on:{"update:visible":function(t){e.curveConfigVisible=t},opened:e.setExpanded}},[n("RealTimeCurveConfig",e._g({ref:"curveConfig",attrs:{inputTempates:e.treeTemplates,caseId:e.strategy.caseId,params:e.params,paramsNameMap:e.paramsNameMap,contextItem:e.contextItem}},e.$listeners))],1)],2)};F._withStripped=!0;const H=y({render:F,staticRenderFns:[]},undefined,K,undefined,false,undefined,!1,void 0,void 0,void 0),z=e=>{e.component(H.name,H)};return"undefined"!=typeof window&&window.Vue&&window.Vue.use(z),{install:z}});
2
2
  //# sourceMappingURL=index.min.js.map
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "kd-lane-container",
3
- "version": "0.0.7",
4
- "description": "kd-lane-chart-container",
3
+ "version": "0.0.9",
4
+ "description": "kd-lane-container",
5
5
  "main": "dist/cjs/index.js",
6
6
  "module": "dist/esm/index.js",
7
7
  "browser": "dist/umd/index.min.js",