lw-cdp-ui 1.4.24 → 1.4.26

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.
@@ -16,8 +16,7 @@
16
16
  :is-draggable="designMode"
17
17
  :is-resizable="designMode"
18
18
  :use-css-transforms="false"
19
- vertical-compact
20
- use-css-transforms>
19
+ vertical-compact>
21
20
  <GridItem
22
21
  v-for="(item, index) in chartList"
23
22
  :key="item.i"
@@ -34,14 +33,20 @@
34
33
  :value="value"
35
34
  v-for="(value, key) in item.data?.setting?.optionalDateUnitRanges"
36
35
  :key="key" />
37
- <el-radio-button disabled v-if="Object.keys(item.data?.setting?.optionalDateUnitRanges).length == 0"
38
- >未选择周期列表</el-radio-button
39
- >
36
+ <el-radio-button disabled v-if="Object.keys(item.data?.setting?.optionalDateUnitRanges).length == 0">
37
+ 未选择周期列表 未选择周期列表
38
+ </el-radio-button>
40
39
  </el-radio-group>
41
40
  </div>
42
41
 
43
42
  <div v-if="item?.type == 'Dashboard'" class="grid-item-dashboard">
44
- <lwBiChartPage :chartId="item.id" />
43
+ <lwBiChartPage
44
+ :ref="
45
+ (el) => {
46
+ if (el) chartPageRefs[index] = el
47
+ }
48
+ "
49
+ :chartId="item.id" />
45
50
  </div>
46
51
  <lwBiChartItem
47
52
  :rawData="item.data"
@@ -61,12 +66,14 @@
61
66
 
62
67
  <script>
63
68
  import { GridLayout, GridItem } from 'grid-layout-plus'
69
+ import dayjs from 'dayjs'
64
70
  export default {
65
71
  components: { GridLayout, GridItem },
66
72
  data() {
67
73
  return {
68
74
  id: '',
69
75
  searchOptions: [],
76
+ chartPageRefs: [],
70
77
  chartList: [],
71
78
  globalFilter: { values: {}, ranges: {} },
72
79
  searchParams: {}
@@ -156,20 +163,38 @@ export default {
156
163
  return result
157
164
  },
158
165
  search() {
166
+ let filter = JSON.parse(JSON.stringify(this.globalFilter))
159
167
  let params = this.unflattenObject(this.searchParams)
160
168
  if (params.ranges) {
161
169
  Object.entries(params.ranges).map(([key, value]) => {
162
- this.globalFilter.ranges[key].timeRange = {
170
+ filter.ranges[key].timeRange = {
163
171
  from: value[0],
164
172
  to: value[1]
165
173
  }
174
+ filter.ranges[key].type = 'ABSOLUTE'
175
+ })
176
+ }
177
+ filter.values = params.values
178
+ this.getChartList(filter)
179
+
180
+ // 如果有二级图表
181
+ if (this.chartPageRefs.length > 0) {
182
+ this.chartPageRefs.forEach((item) => {
183
+ item.searchParams = this.searchParams
184
+ item.globalFilter = filter
185
+ item.search()
166
186
  })
167
187
  }
168
- this.globalFilter.values = params.values
169
- this.getChartList(this.globalFilter)
170
188
  },
171
189
  reset() {
172
190
  this.getChartList({ values: {}, ranges: {} })
191
+
192
+ // 如果有二级图表
193
+ if (this.chartPageRefs.length > 0) {
194
+ this.chartPageRefs.forEach((item) => {
195
+ item.getChartList({ values: {}, ranges: {} })
196
+ })
197
+ }
173
198
  },
174
199
  async getChartList(globalFilter = {}) {
175
200
  let params = {
@@ -210,7 +235,10 @@ export default {
210
235
  const getOptions = async (setting) => {
211
236
  const { type, dict, dataInterfaceUri, dimensionTableId } = setting.options
212
237
  if (type === 'DICT') {
213
- return Object.entries(dict).map(([key, value]) => ({ value: key, label: value }))
238
+ return Object.entries(dict).map(([key, value]) => ({
239
+ value: key,
240
+ label: value
241
+ }))
214
242
  } else if (type === 'DATA_INTERFACE') {
215
243
  const res = await this.$http.get(dataInterfaceUri)
216
244
  return res.map((item) => ({ value: item.id, label: item.name }))
@@ -223,7 +251,10 @@ export default {
223
251
  const getTreeOptions = async (setting) => {
224
252
  const { type, dict, dataInterfaceUri, dimensionTableId } = setting.options
225
253
  if (type === 'DICT') {
226
- return Object.entries(dict).map(([key, value]) => ({ value: key, label: value }))
254
+ return Object.entries(dict).map(([key, value]) => ({
255
+ value: key,
256
+ label: value
257
+ }))
227
258
  } else if (type === 'DATA_INTERFACE') {
228
259
  const res = await this.$http.get(dataInterfaceUri)
229
260
  return this.listToTree(res)
@@ -237,11 +268,13 @@ export default {
237
268
  case 'DATA_PICKER': {
238
269
  const setting = control.dataPickerSetting
239
270
  const options = await getOptions(setting)
271
+ this.searchParams[`values.${setting.code}`] = setting?.value || []
240
272
  this.searchOptions.push({
241
273
  label: control.name,
242
274
  prop: `values.${setting.code}`,
243
275
  renderType: 'select',
244
276
  options,
277
+ value: setting?.value || '',
245
278
  valueKey: 'value',
246
279
  labelKey: 'label'
247
280
  })
@@ -251,10 +284,11 @@ export default {
251
284
  case 'DATA_CASCADE': {
252
285
  const setting = control.dataPickerSetting
253
286
  const items = await getTreeOptions(setting)
287
+ this.searchParams[`values.${setting.code}`] = setting?.value || []
254
288
  this.searchOptions.push({
255
289
  label: control.name,
256
290
  name: `values.${setting.code}`,
257
- value: '',
291
+ value: setting?.value || [],
258
292
  component: 'treeSelect',
259
293
  options: {
260
294
  items,
@@ -266,9 +300,11 @@ export default {
266
300
  }
267
301
 
268
302
  case 'DATA_INPUT': {
303
+ this.searchParams[`values.${control.dataInputSetting.code}`] = control.dataInputSetting?.value || ''
269
304
  this.searchOptions.push({
270
305
  label: control.name,
271
306
  prop: `values.${control.dataInputSetting.code}`,
307
+ value: control.dataInputSetting?.value || '',
272
308
  renderType: 'input'
273
309
  })
274
310
  break
@@ -276,10 +312,88 @@ export default {
276
312
 
277
313
  case 'DATE_PICKER': {
278
314
  const setting = control.datePickerSetting
315
+ let value = []
316
+ switch (control.datePickerSetting.type) {
317
+ case 'TODAY':
318
+ value = [dayjs().format('YYYY-MM-DDTHH:mm:ss.SSSZ'), dayjs().format('YYYY-MM-DDTHH:mm:ss.SSSZ')]
319
+ break
320
+ case 'THIS_MONTH':
321
+ value = [
322
+ dayjs().startOf('month').format('YYYY-MM-DDTHH:mm:ss.SSSZ'),
323
+ dayjs().endOf('month').format('YYYY-MM-DDTHH:mm:ss.SSSZ')
324
+ ]
325
+ break
326
+ case 'THIS_YEAR':
327
+ value = [
328
+ dayjs().startOf('year').format('YYYY-MM-DDTHH:mm:ss.SSSZ'),
329
+ dayjs().endOf('year').format('YYYY-MM-DDTHH:mm:ss.SSSZ')
330
+ ]
331
+ break
332
+ case 'LAST_10_DAYS':
333
+ value = [
334
+ dayjs().subtract(10, 'day').format('YYYY-MM-DDTHH:mm:ss.SSSZ'),
335
+ dayjs().format('YYYY-MM-DDTHH:mm:ss.SSSZ')
336
+ ]
337
+ break
338
+ case 'LAST_30_DAYS':
339
+ value = [
340
+ dayjs().subtract(30, 'day').format('YYYY-MM-DDTHH:mm:ss.SSSZ'),
341
+ dayjs().format('YYYY-MM-DDTHH:mm:ss.SSSZ')
342
+ ]
343
+ break
344
+ case 'LAST_12_MONTH':
345
+ value = [
346
+ dayjs().subtract(12, 'month').format('YYYY-MM-DDTHH:mm:ss.SSSZ'),
347
+ dayjs().format('YYYY-MM-DDTHH:mm:ss.SSSZ')
348
+ ]
349
+ break
350
+ case 'LAST_5_YEAR':
351
+ value = [
352
+ dayjs().subtract(5, 'year').format('YYYY-MM-DDTHH:mm:ss.SSSZ'),
353
+ dayjs().format('YYYY-MM-DDTHH:mm:ss.SSSZ')
354
+ ]
355
+ break
356
+ case 'LAST_60_SECONDS':
357
+ value = [dayjs().subtract(60, 'second').toISOString(), dayjs().toISOString()]
358
+ break
359
+ case 'LAST_30_MINUTES':
360
+ value = [dayjs().subtract(30, 'minute').toISOString(), dayjs().toISOString()]
361
+ break
362
+ case 'LAST_24_HOURS':
363
+ value = [dayjs().subtract(24, 'hour').toISOString(), dayjs().toISOString()]
364
+ break
365
+ case 'CURRENT_MONDAY_TO_TODAY':
366
+ value = [
367
+ dayjs().startOf('week').add(1, 'day').format('YYYY-MM-DDTHH:mm:ss.SSSZ'), // 周一
368
+ dayjs().format('YYYY-MM-DDTHH:mm:ss.SSSZ')
369
+ ]
370
+ break
371
+ case 'YESTERDAY':
372
+ value = [
373
+ dayjs().subtract(1, 'day').format('YYYY-MM-DDTHH:mm:ss.SSSZ'),
374
+ dayjs().subtract(1, 'day').format('YYYY-MM-DDTHH:mm:ss.SSSZ')
375
+ ]
376
+ break
377
+ case 'LAST_YEAR':
378
+ value = [
379
+ dayjs().subtract(1, 'year').startOf('year').format('YYYY-MM-DDTHH:mm:ss.SSSZ'),
380
+ dayjs().subtract(1, 'year').endOf('year').format('YYYY-MM-DDTHH:mm:ss.SSSZ')
381
+ ]
382
+ break
383
+ case 'ABSOLUTE':
384
+ value = [control.datePickerSetting.timeRange.from, control.datePickerSetting.timeRange.to] // 用户指定区间,不设置默认值
385
+ break
386
+ default:
387
+ value = []
388
+ break
389
+ }
390
+ this.searchParams[`ranges.${setting.code}`] = value
391
+
279
392
  this.searchOptions.push({
280
393
  label: control.name,
281
394
  prop: `ranges.${setting.code}`,
282
395
  renderType: 'dateRange',
396
+ value,
283
397
  valueFormat: 'YYYY-MM-DDTHH:mm:ss.SSSZ'
284
398
  })
285
399
  this.globalFilter.ranges[setting.code] = {
@@ -1,43 +1,39 @@
1
1
  <template>
2
2
  <!-- 动态组件 -->
3
- <component :is="componentMap[item.component]"
4
- v-model="defaultValue"
5
- @change="handleChange"
6
- :size="size"
7
- :disabled="disabled"
8
- v-bind="getComponentProps(item)">
3
+ <component
4
+ :is="componentMap[item.component]"
5
+ v-model="defaultValue"
6
+ @change="handleChange"
7
+ :size="size"
8
+ :disabled="disabled"
9
+ v-bind="getComponentProps(item)">
9
10
  <!-- 处理组件插槽 -->
10
11
  <template v-if="item.component === 'select'">
11
- <el-option v-for="option in item.options.items"
12
- :key="option.value"
13
- :disabled="option.disabled"
14
- :label="option.label"
15
- :value="option.value" />
12
+ <el-option
13
+ v-for="option in item.options.items"
14
+ :key="option.value"
15
+ :disabled="option.disabled"
16
+ :label="option.label"
17
+ :value="option.value" />
16
18
  </template>
17
19
  <template v-if="item.component === 'checkboxGroup'">
18
- <el-checkbox v-for="_item in item.options.items"
19
- :key="_item.value"
20
- :label="_item.value">{{_item.label}}</el-checkbox>
20
+ <el-checkbox v-for="_item in item.options.items" :key="_item.value" :label="_item.value">{{
21
+ _item.label
22
+ }}</el-checkbox>
21
23
  </template>
22
24
  <template v-if="item.component === 'radio'">
23
- <el-radio v-for="_item in item.options.items"
24
- :key="_item.value"
25
- :label="_item.value">{{_item.label}}</el-radio>
25
+ <el-radio v-for="_item in item.options.items" :key="_item.value" :label="_item.value">{{ _item.label }}</el-radio>
26
26
  </template>
27
- <template v-if="item.component === 'number' && item?.options?.suffix"
28
- #suffix>
27
+ <template v-if="item.component === 'number' && item?.options?.suffix" #suffix>
29
28
  {{ item.options.suffix }}
30
29
  </template>
31
- <template v-if="item.component === 'input' && item?.options?.prepend"
32
- #prepend>
30
+ <template v-if="item.component === 'input' && item?.options?.prepend" #prepend>
33
31
  {{ item.options.prepend }}
34
32
  </template>
35
- <template v-if="item.component === 'input' && item?.options?.append"
36
- #append>
33
+ <template v-if="item.component === 'input' && item?.options?.append" #append>
37
34
  {{ item.options.append }}
38
35
  </template>
39
36
  </component>
40
-
41
37
  </template>
42
38
 
43
39
  <script>
@@ -123,7 +119,7 @@ export default {
123
119
  // 获取组件属性
124
120
  getComponentProps(item) {
125
121
  let propsItem = {}
126
- const {type, startPlaceholder, endPlaceholder, controlsPosition, items, ...options} = item?.options || {}
122
+ const { type, startPlaceholder, endPlaceholder, controlsPosition, items, ...options } = item?.options || {}
127
123
  if (item?.options) {
128
124
  // 通用属性
129
125
  propsItem.placeholder = item.options.placeholder || ''
@@ -173,4 +169,4 @@ export default {
173
169
  }
174
170
  }
175
171
  }
176
- </script>
172
+ </script>
@@ -24,7 +24,10 @@
24
24
  </div>
25
25
  <div class="adminui-side-scroll">
26
26
  <el-scrollbar>
27
- <el-menu :default-active="active" router :collapse="menuIsCollapse"
27
+ <el-menu
28
+ :default-active="active"
29
+ router
30
+ :collapse="menuIsCollapse"
28
31
  :unique-opened="$config.MENU_UNIQUE_OPENED">
29
32
  <NavMenu :navMenus="menu"></NavMenu>
30
33
  </el-menu>
@@ -41,7 +44,7 @@
41
44
  <div class="aminui-body el-container">
42
45
  <div class="aminui-body-menu-top">
43
46
  <div class="top-bar-title">
44
- <span class="title">{{ $t("lwLayout.layout.topbar") }}:</span>
47
+ <span class="title">{{ $t('lwLayout.layout.topbar') }}:</span>
45
48
  <Topbar v-if="!ismobile"></Topbar>
46
49
  </div>
47
50
  <userbar :isShowBu="isShowBu" :isShowTask="isShowTask" :isInitialized="isInitialized">
@@ -81,7 +84,6 @@
81
84
  </div>
82
85
  </section>
83
86
  </template>
84
-
85
87
  </template>
86
88
 
87
89
  <script>
@@ -165,7 +167,7 @@ export default {
165
167
  let { grantedApplications } = JSON.parse(userAuthInfo) || {}
166
168
 
167
169
  if (grantedApplications) {
168
- let item = grantedApplications.find(x => x.code === this.$config.APP_NAME.toLowerCase())
170
+ let item = grantedApplications.find((x) => x.code === this.$config.APP_NAME.toLowerCase())
169
171
  return item?.aliasName ? item : ''
170
172
  } else {
171
173
  return ''
@@ -174,7 +176,7 @@ export default {
174
176
  },
175
177
  beforeCreate() {
176
178
  // 挂载自定义菜单订阅
177
- this.$bus.$on('setMenu', menu => {
179
+ this.$bus.$on('setMenu', (menu) => {
178
180
  this.changeMenu = true
179
181
  this.menu = this.filterUrl(menu)
180
182
  })
@@ -225,14 +227,16 @@ export default {
225
227
  let user = await this.$api.auth.user()
226
228
 
227
229
  // 判断密码是否过期
228
- if (!user?.userAuthInfo && user?.loginPage?.includes("pwdChange")) {
230
+ if (!user?.userAuthInfo && user?.loginPage?.includes('pwdChange')) {
229
231
  this.$message.warning('您的密码已过期,请修改密码!')
230
232
  return false
231
233
  }
232
234
 
233
235
  // 处理应用显示逻辑
234
- let application = [...new Set(user.userAuthInfo.menus.map(permission => permission.split('.')[0].split('_')[0]))]
235
- user.userAuthInfo.grantedApplications = user.userAuthInfo.grantedApplications.filter(x =>
236
+ let application = [
237
+ ...new Set(user.userAuthInfo.menus.map((permission) => permission.split('.')[0].split('_')[0]))
238
+ ]
239
+ user.userAuthInfo.grantedApplications = user.userAuthInfo.grantedApplications.filter((x) =>
236
240
  application.includes(x.code)
237
241
  )
238
242
 
@@ -245,7 +249,10 @@ export default {
245
249
  }
246
250
  this.$tool.data.set('tenantId', user.userAuthInfo.tenantId)
247
251
  this.$tool.data.set('userAuthInfo', userAuthInfo)
248
- this.$store.state.user = userAuthInfo
252
+ this.$store.state.user = {
253
+ ...this.$store.state.user,
254
+ ...userAuthInfo
255
+ }
249
256
 
250
257
  // 动态菜单
251
258
  MENU_LIST['menuDynamic'] = !!user?.menuDynamic
@@ -276,7 +283,7 @@ export default {
276
283
 
277
284
  // 处理子节点
278
285
  if (node.children && node.children.length) {
279
- route.children = node.children.sort((a, b) => a.sort - b.sort).map(child => processNode(child, route))
286
+ route.children = node.children.sort((a, b) => a.sort - b.sort).map((child) => processNode(child, route))
280
287
  }
281
288
 
282
289
  return route
@@ -285,7 +292,7 @@ export default {
285
292
  // 按applications分组
286
293
  const groupedData = {}
287
294
 
288
- originData.forEach(item => {
295
+ originData.forEach((item) => {
289
296
  // 获取应用类型(如ec、cdp等)
290
297
  const appType = item.applications[0]
291
298
 
@@ -299,7 +306,7 @@ export default {
299
306
  })
300
307
 
301
308
  // 对每个应用类型的菜单进行排序
302
- Object.keys(groupedData).forEach(appType => {
309
+ Object.keys(groupedData).forEach((appType) => {
303
310
  groupedData[appType].sort((a, b) => a.sort - b.sort)
304
311
  })
305
312
 
@@ -328,7 +335,7 @@ export default {
328
335
  filterUrl(map) {
329
336
  var newMap = []
330
337
  map &&
331
- map.forEach(item => {
338
+ map.forEach((item) => {
332
339
  item.meta = item.meta ? item.meta : {}
333
340
  //处理隐藏
334
341
  if (item.meta.hidden || item.meta.type == 'button') {
@@ -180,11 +180,10 @@ export default {
180
180
  // 用来兼容旧配置
181
181
  defaultOptions() {
182
182
  return this.options.map((item) => {
183
- const { label, span, prop: name, renderType: component, placeholder = label, ...other } = item || {}
184
- const componentObj = { label, name, component, span }
183
+ const { label, value, span, prop: name, renderType: component, placeholder = label, ...other } = item || {}
184
+ const componentObj = { label, name, value, component, span }
185
185
 
186
186
  const baseOptions = { placeholder, ...other }
187
-
188
187
  switch (component) {
189
188
  case 'dateRange':
190
189
  return {