n20-common-lib 2.5.5-beta.6 → 2.5.5-beta.8

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.
@@ -1,38 +1,37 @@
1
1
  <template>
2
2
  <div :class="prefixCls">
3
- <el-form v-if="visible" :class="prefixCls + '-body'">
3
+ <el-form v-if="visible" :class="prefixCls + '-body'" @keyup.enter.native="enter">
4
4
  <slot name="prefix"></slot>
5
5
  <el-form-item
6
- v-for="(item, i) in dataC"
6
+ v-for="(item, i) in GroupData"
7
7
  :key="i"
8
8
  :class="[prefixCls + '-item', activeClass(item)]"
9
9
  :label="item.label"
10
+ :disabled="item.props && item.props.disabled"
10
11
  >
11
12
  <div :class="prefixCls + '-content'">
12
13
  <slot v-if="item.slotName" :name="item.slotName"></slot>
13
- <formItemInput v-else :form="model" :item="item" @change="$emit('change')" />
14
+ <formItemInput v-else :form="model" :item="item" @blur="$emit('blur')" @change="$emit('change')" />
14
15
  </div>
15
- <i :key="i" :class="[prefixCls + '-item-close', 'n20-icon-yichu']" @click="handleClose(item)"></i>
16
+ <i
17
+ v-if="!item.isDefault"
18
+ :key="i"
19
+ :class="[prefixCls + '-item-close', 'n20-icon-yichu']"
20
+ @click="handleClose(item)"
21
+ ></i>
16
22
  </el-form-item>
17
23
  <slot name="suffix"></slot>
18
24
  <el-form-item :class="prefixCls + '-add'">
19
25
  <el-button v-popover:advanced_popover onlyicon plain icon="el-icon-plus" />
20
26
  <el-popover ref="advanced_popover" placement="bottom-start" trigger="click">
21
- <el-form>
22
- <InputSearch
23
- v-model="search"
24
- clearable
25
- class="input-w m-b-s"
26
- :placeholder="$l('搜索筛选条件')"
27
- @change="searchFn"
28
- />
29
- <filterItem :filter-list="filterListC" :check-array.sync="checkList" @checked="check" />
30
- </el-form>
27
+ <el-input v-model="keyword" clearable class="input-w m-b-s" :placeholder="$lc('搜索筛选条件')" />
28
+ <filterItem :filter-list="filterListS" :check-array.sync="checkList" @checked="check" />
31
29
  </el-popover>
32
- <el-link class="m-l-s f-s-s" :underline="false" icon="n20-icon-qingchu" @click="cleared"> 清除条件</el-link>
30
+ <el-link class="m-l-s f-s-s" :underline="false" icon="n20-icon-qingchu" @click="cleared">
31
+ {{ '清除条件' | $lc }}</el-link
32
+ >
33
33
  </el-form-item>
34
34
  </el-form>
35
- <div v-else :width="width"></div>
36
35
  </div>
37
36
  </template>
38
37
 
@@ -40,8 +39,9 @@
40
39
  import formItemInput from './form-item-input.vue'
41
40
  import InputSearch from '../InputSearch/index.vue'
42
41
  import filterItem from './filterItem.vue'
43
-
44
- import mixins from './mixins/index.js'
42
+ import axios from '../../utils/axios.js'
43
+ import { $lc } from '../../utils/i18n/index.js'
44
+ import cloneDeep from 'lodash/cloneDeep'
45
45
  const prefixCls = 'n20-advanced-filter'
46
46
  export default {
47
47
  name: 'AdvancedFilter',
@@ -50,12 +50,7 @@ export default {
50
50
  InputSearch,
51
51
  filterItem
52
52
  },
53
- mixins: [mixins],
54
53
  props: {
55
- type: {
56
- type: String,
57
- default: ''
58
- },
59
54
  visible: {
60
55
  type: Boolean,
61
56
  default: false
@@ -64,18 +59,6 @@ export default {
64
59
  type: Array,
65
60
  default: () => []
66
61
  },
67
- defaultShow: {
68
- type: Number,
69
- default: 5
70
- },
71
- labelWidth: {
72
- type: [String, Number],
73
- default: undefined
74
- },
75
- width: {
76
- type: String,
77
- default: '90%'
78
- },
79
62
  model: {
80
63
  type: Object,
81
64
  default: () => ({})
@@ -87,32 +70,46 @@ export default {
87
70
  },
88
71
  data() {
89
72
  return {
90
- search: '',
91
- showPop: false,
92
- showPopC: false,
73
+ keyword: '',
93
74
  prefixCls,
94
- dataC: [],
95
- filterListC: [],
96
75
  remoteList: [],
97
- checkList: []
76
+ GroupData: [],
77
+ checkList: [],
78
+ filterListC: [],
79
+ checkC: [],
80
+ userNo: sessionStorage.getItem('userNo')
98
81
  }
99
82
  },
100
- watch: {
101
- GroupData: {
102
- handler(value) {
103
- this.dataC = value
83
+ computed: {
84
+ filterListS: {
85
+ get() {
86
+ if (!this.keyword) {
87
+ return this.filterList
88
+ } else {
89
+ const keywordLowerCase = this.keyword
90
+ return this.filterList.filter((item) => item.label.includes(keywordLowerCase))
91
+ }
104
92
  },
105
- immediate: true
93
+ set(v) {
94
+ return v
95
+ }
96
+ }
97
+ },
98
+ watch: {
99
+ visible: {
100
+ handler(val) {
101
+ val && this.getFilterList()
102
+ }
106
103
  },
107
- filterList: {
104
+ model: {
108
105
  handler(value) {
109
- this.filterListC = value
106
+ this.$emit('change', value)
110
107
  },
111
- deep: true,
112
- immediate: true
108
+ deep: true
113
109
  }
114
110
  },
115
- mounted() {
111
+ created() {
112
+ this.filterListC = cloneDeep(this.filterList)
116
113
  this.getFilterList()
117
114
  },
118
115
  methods: {
@@ -123,19 +120,28 @@ export default {
123
120
  }
124
121
  },
125
122
  activeClass(item) {
126
- console.log(item)
127
123
  let flag = ''
128
124
  switch (item.type) {
125
+ case 'select':
126
+ if (item.multiple) {
127
+ flag = this.model[item.value] && this.model[item.value].length ? this.prefixCls + '-active' : ''
128
+ } else {
129
+ flag = this.model[item.value] ? this.prefixCls + '-active' : ''
130
+ }
131
+ break
129
132
  case 'text':
130
133
  case 'search':
131
- case 'select':
132
134
  case 'number':
133
135
  case 'date':
134
136
  case 'datetime':
135
137
  case 'year':
136
138
  case 'month':
137
139
  case 'week':
140
+ flag = this.model[item.value] ? this.prefixCls + '-active' : ''
141
+ break
138
142
  case 'checkbox':
143
+ flag = this.model[item.value] && this.model[item.value].length ? this.prefixCls + '-active' : ''
144
+ break
139
145
  case 'radio':
140
146
  flag = this.model[item.value] ? this.prefixCls + '-active' : ''
141
147
  break
@@ -151,7 +157,41 @@ export default {
151
157
  return flag
152
158
  },
153
159
  handleClose(item) {
160
+ switch (item.type) {
161
+ case 'select':
162
+ this.model[item.value] = item.multiple ? [] : null
163
+ break
164
+ case 'text':
165
+ case 'search':
166
+ case 'number':
167
+ case 'date':
168
+ case 'datetime':
169
+ case 'year':
170
+ case 'month':
171
+ case 'radio':
172
+ case 'week':
173
+ this.model[item.value] = null
174
+ break
175
+ case 'checkbox':
176
+ this.model[item.value] = []
177
+
178
+ break
179
+ case 'numberrange':
180
+ this.model[item.startValue] = null
181
+ this.model[item.endValue] = null
182
+ break
183
+ case 'daterange':
184
+ case 'datetimerange':
185
+ case ' monthrange':
186
+ this.model[item.startDate] = null
187
+ this.model[item.endDate] = null
188
+ break
189
+ }
154
190
  let data = this.GroupData.filter((s) => {
191
+ if (s.label !== item.label) {
192
+ s.checked = true
193
+ return s
194
+ }
155
195
  return s.label !== item.label || s.value !== item.value
156
196
  })
157
197
  this.saveFilter(data).then(({ code }) => {
@@ -160,27 +200,96 @@ export default {
160
200
  }
161
201
  })
162
202
  },
163
- searchFn() {
164
- this.filterListC = this.cloneDeepFList.filter((r) => {
165
- return r.label.includes(this.search)
166
- })
167
- },
168
203
  cleared() {
169
204
  this.$emit('clear')
170
205
  },
206
+ enter() {
207
+ this.$emit('enter', this.model)
208
+ },
209
+
171
210
  check(keys) {
211
+ // 保存当前选择的过滤条件
172
212
  this.checkList = keys
173
- let groupFilter = []
213
+ let saveCheckArr = []
214
+ // 如果keys数组不为空
174
215
  if (keys.length > 0) {
216
+ // 遍历keys数组
175
217
  keys.forEach((k) => {
176
- groupFilter.push(this.filterList.find((s) => s.label === k))
218
+ // 遍历filterList数组
219
+ this.filterList.forEach((el) => {
220
+ // 判断当前元素是否在keys数组中
221
+ const found = keys.find((k) => k.label === el.label)
222
+ if (found) {
223
+ // 如果在keys数组中找到了当前元素,将其checked属性设置为true
224
+ el.checked = true
225
+ saveCheckArr.push(el)
226
+ } else {
227
+ // 如果在keys数组中未找到当前元素,将其checked属性设置为false
228
+ el.checked = false
229
+ }
230
+ })
177
231
  })
178
232
  }
179
- this.saveFilter(groupFilter).then(({ code }) => {
233
+ // 保存过滤条件
234
+ this.saveFilter(saveCheckArr).then(({ code }) => {
235
+ // 如果保存成功
180
236
  if (code === 200) {
237
+ // 重新获取过滤条件列表
181
238
  this.getFilterList()
182
239
  }
183
240
  })
241
+ },
242
+ /**
243
+ * 保存筛选条件
244
+ * @param data
245
+ */
246
+ saveFilter(data) {
247
+ return new Promise((resolve) => {
248
+ axios
249
+ .post(
250
+ `/bems/prod_1.0/user/pageHabit?t=${Date.now()}`,
251
+ {
252
+ userNo: this.userNo,
253
+ pageId: this.filterId,
254
+ showStructure: JSON.stringify(data)
255
+ },
256
+ { loading: false, noMsg: true }
257
+ )
258
+ .then((res) => {
259
+ resolve(res)
260
+ })
261
+ })
262
+ },
263
+ /**
264
+ * 获取筛选条件
265
+ */
266
+ getFilterList() {
267
+ axios
268
+ .post(
269
+ `/bems/prod_1.0/user/pageHabit/list?t=${Date.now()}`,
270
+ {
271
+ userNo: this.userNo,
272
+ pageId: this.filterId
273
+ },
274
+ { loading: false, noMsg: true }
275
+ )
276
+ .then(({ data }) => {
277
+ let _data = JSON.parse(data)
278
+ if (_data && _data.length > 0) {
279
+ this.GroupData = this.filterList.filter((item) => {
280
+ return _data.find((i) => i.checked && item.label === i.label)
281
+ })
282
+ } else {
283
+ this.GroupData = this.filterList.filter((item) => {
284
+ if (item.isDefault) {
285
+ item.checked = true
286
+ return item
287
+ }
288
+ })
289
+ }
290
+ this.checkList = this.GroupData
291
+ this.checkC = cloneDeep(this.checkList)
292
+ })
184
293
  }
185
294
  }
186
295
  }
@@ -467,7 +467,6 @@ export default {
467
467
  if (this.getFileMethod) {
468
468
  return this.getFileMethod(row, type)
469
469
  }
470
-
471
470
  let _url = row[this.keys.url]
472
471
  this.seePrefix && (_url = this.seePrefix + _url)
473
472
  if (_url) {
@@ -475,15 +474,15 @@ export default {
475
474
  // 预览
476
475
  return {
477
476
  url: `/api/onlinePreview?beid=${row[this.keys.url]}`,
478
- name: row.name + '.html',
479
- sameOrg: this.seeTypes.test(row.name)
477
+ name: row[this.keys.name] + '.html',
478
+ sameOrg: this.seeTypes.test(row[this.keys.name])
480
479
  }
481
480
  } else {
482
481
  // 下载
483
- let blob = await this.$axios.get(`/api/neams/eamsbaserecord/download/${row[this.keys.url]}`, null, {
482
+ let blob = await this.$axios.get(`/neams/eamsbaserecord/download/${row[this.keys.url]}`, null, {
484
483
  responseType: 'blob'
485
484
  })
486
- let name = row.name || blob.name
485
+ let name = row[this.keys.name] || blob.name
487
486
  return {
488
487
  url: URL.createObjectURL(blob),
489
488
  name: name,
@@ -67,11 +67,11 @@
67
67
  </el-dropdown-menu>
68
68
  </el-dropdown>
69
69
 
70
- <el-tooltip v-if="!hideDowApp" :content="'帮助文档' | $lc">
70
+ <el-tooltip v-if="!hideHelpDoc" :content="'帮助文档' | $lc">
71
71
  <span class="set-user-btn iconfont icon-bangzhuwendang header-color m-l-lg" @click="openHelp"></span>
72
72
  </el-tooltip>
73
73
 
74
- <el-tooltip v-if="!hideHelpDoc" :content="'客户端下载' | $lc">
74
+ <el-tooltip v-if="!hideDowApp" :content="'客户端下载' | $lc">
75
75
  <span class="set-user-btn iconfont icon-kehuduanxiazai header-color m-l-lg" @click="dowApp"></span>
76
76
  </el-tooltip>
77
77
 
@@ -248,9 +248,7 @@ export default {
248
248
  immediate: true
249
249
  }
250
250
  },
251
- mounted() {
252
- console.log(this.showForgetBtn)
253
- },
251
+ mounted() {},
254
252
  methods: {
255
253
  // 忘记密码
256
254
  forgetPw() {
@@ -322,7 +322,7 @@ export default {
322
322
  sltSys: {},
323
323
  loginBg: 'none',
324
324
  inspectionV: false,
325
- isImageCode: false
325
+ isImageCode: undefined
326
326
  }
327
327
  },
328
328
  computed: {
@@ -383,7 +383,7 @@ export default {
383
383
  return form
384
384
  },
385
385
  imgCode() {
386
- return this.showImageCode ?? this.isImageCode
386
+ return this.isImageCode ?? this.showImageCode
387
387
  }
388
388
  },
389
389
  watch: {
@@ -415,9 +415,11 @@ export default {
415
415
  },
416
416
  methods: {
417
417
  getIsImgCode() {
418
- axios.get(`/bems/prod_1.0/uas/api/authorization/isimgcode`).then(({ data }) => {
419
- this.isImageCode = data
420
- })
418
+ axios
419
+ .get(`/bems/prod_1.0/uas/api/authorization/isimgcode`, null, { loading: false, noMsg: true })
420
+ .then(({ data }) => {
421
+ this.isImageCode = data
422
+ })
421
423
  },
422
424
  async loginThenT() {
423
425
  if (this.sltSys?.NO) {
@@ -66,17 +66,24 @@
66
66
  v-bind="item"
67
67
  />
68
68
  </template>
69
+ <template #empty>
70
+ <slot name="empty">
71
+ <empty type="empty" content="暂无数据" :height="200" :width="200" />
72
+ </slot>
73
+ </template>
69
74
  </vxe-table>
70
75
  <tableSetSize v-if="showSetsize" :size="sizeC" v-bind="$attrs" @update:size="sizeUp" @resize="sizeSet" />
71
76
  </div>
72
77
  </template>
73
78
 
74
79
  <script>
80
+ import empty from '../Empty'
75
81
  import tableSetSize from '../TableSetSize/index.vue'
76
82
  export default {
77
83
  name: 'TablePro',
78
84
  components: {
79
- tableSetSize
85
+ tableSetSize,
86
+ empty
80
87
  },
81
88
  props: {
82
89
  data: {
@@ -60,9 +60,9 @@
60
60
  :width="column.width"
61
61
  :align="column.align"
62
62
  :show-overflow-tooltip="column.showOverflowTooltip"
63
+ :formatter="item.formatter | colfF(item.formatterMap)"
63
64
  >
64
65
  <template slot-scope="scope">
65
- <!-- eslint-disable-next-line vue/no-v-html -->
66
66
  <span v-html="scope.row[column.prop]"></span>
67
67
  </template>
68
68
  </el-table-column>
@@ -104,6 +104,7 @@
104
104
 
105
105
  <script>
106
106
  import { $lc } from '../../utils/i18n/index'
107
+ import { colfF } from '../Table/filters.js'
107
108
  export default {
108
109
  name: 'UploadMsg',
109
110
  props: {
@@ -145,6 +146,9 @@ export default {
145
146
  default: false
146
147
  }
147
148
  },
149
+ filters: {
150
+ colfF
151
+ },
148
152
  computed: {
149
153
  progressV: {
150
154
  get() {
@@ -123,22 +123,30 @@ directive.install = (Vue) => {
123
123
  bind(el, binding, node) {
124
124
  let _this = node.child
125
125
 
126
+ // 获取表单验证规则
126
127
  let ruleForm = _this.$attrs['rule-form'] || _this.$attrs['ruleForm']
127
128
  ruleForm && el.classList.add(ruleForm)
128
129
 
130
+ // 获取表单验证错误隐藏
129
131
  let rErr = _this.$attrs['rule-error-hide'] || _this.$attrs['ruleErrorHide']
130
132
  rErr = rErr !== 'true' && rErr !== true
131
133
 
134
+ // 表单验证
132
135
  el[VD] = (val, type) => {
133
136
  let _val = _this[binding.value || 'value']
134
137
  let _rules = getRules(_this.$attrs['rules'], type)
135
138
  if (_rules.length > 0) {
139
+ // 验证表单
136
140
  return Promise.all(_rules.map((rule) => validateRoule(rule, _val)))
137
141
  .then(() => {
142
+ // 验证通过,隐藏错误
138
143
  hideErr(el, rErr)
144
+ return Promise.resolve(true)
139
145
  })
140
146
  .catch((err) => {
147
+ // 验证失败,显示错误
141
148
  showErr(el, err, rErr)
149
+ return Promise.resolve(false)
142
150
  })
143
151
  } else {
144
152
  return Promise.resolve()
@@ -160,6 +168,8 @@ directive.install = (Vue) => {
160
168
  // })
161
169
  }
162
170
  })
171
+ Vue.prototype.$rulesValidateForm = rulesValidateForm
172
+ Vue.prototype.$rulesValidateFormClear = rulesValidateFormClear
163
173
  }
164
174
 
165
175
  function rulesValidateForm(query, fn) {
@@ -170,8 +180,12 @@ function rulesValidateForm(query, fn) {
170
180
  typeof el[VD] === 'function' && validateList.push(el[VD](undefined, 'submit'))
171
181
  })
172
182
  return Promise.all(validateList)
173
- .then(() => {
174
- fn && fn(true)
183
+ .then((res) => {
184
+ if (res.includes(false)) {
185
+ fn && fn(false)
186
+ } else {
187
+ fn && fn(true)
188
+ }
175
189
  })
176
190
  .catch(() => {
177
191
  fn && fn(false)
package/src/i18n.json CHANGED
@@ -21,7 +21,7 @@
21
21
  "en": "Online preview is not supported, please"
22
22
  },
23
23
  "已选合计": {
24
- "en": "Selected total"
24
+ "en": "Total selected"
25
25
  },
26
26
  "天!": {
27
27
  "en": "God!"
@@ -300,7 +300,7 @@
300
300
  "en": "Article."
301
301
  },
302
302
  "笔数": {
303
- "en": "Number of pens"
303
+ "en": "Counts"
304
304
  },
305
305
  "重新上传": {
306
306
  "en": "upload again"
@@ -1,40 +1,61 @@
1
- const CHINESE_NUMERALS = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
2
-
3
1
  /**
4
2
  *
5
3
  * @param {number|string} amount 需转换的金额
6
4
  */
7
- export const convert = (money) => {
8
- var cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'] //汉字的数字
9
- var cnIntRadice = ['', '', '', ''] //基本单位
10
- var cnIntUnits = ['', '万', '亿', '兆'] //对应整数部分扩展单位
11
- var cnDecUnits = ['', '', '', ''] //对应小数部分单位
12
- var cnInteger = '整' //整数金额时后面跟的字符
13
- var cnIntLast = '' //整数完以后的单位
5
+ export function convert(money) {
6
+ //汉字的数字
7
+ var cnNums = new Array('', '', '', '', '肆', '伍', '陆', '柒', '捌', '玖')
8
+ //基本单位
9
+ var cnIntRadice = new Array('', '', '', '')
10
+ //对应整数部分扩展单位
11
+ var cnIntUnits = new Array('', '万', '亿', '兆')
12
+ //对应小数部分单位
13
+ var cnDecUnits = new Array('角', '分', '毫', '厘')
14
+ //整数金额时后面跟的字符
15
+ var cnInteger = '整'
16
+ //整型完以后的单位
17
+ var cnIntLast = '元'
14
18
  //最大处理的数字
15
19
  var maxNum = 999999999999999.9999
16
- var integerNum //金额整数部分
17
- var decimalNum //金额小数部分
20
+ //金额整数部分
21
+ var integerNum
22
+ //金额小数部分
23
+ var decimalNum
18
24
  //输出的中文金额字符串
19
25
  var chineseStr = ''
20
- var parts //分离金额后用的数组,预定义
26
+ var minusStr = '负'
27
+ var minusFlag = false
28
+ //分离金额后用的数组,预定义
29
+ var parts
21
30
  if (money == '') {
22
31
  return ''
23
32
  }
24
-
25
33
  money = parseFloat(money)
26
34
  if (money >= maxNum) {
27
35
  //超出最大处理数字
28
- return '超出最大处理数字'
36
+ return ''
29
37
  }
38
+
30
39
  if (money == 0) {
31
- chineseStr = cnNums[0] + cnIntLast + cnInteger
40
+ chineseStr = cnNums[0] + cnIntLast
32
41
  return chineseStr
33
42
  }
34
- //四舍五入保留两位小数,转换为字符串
35
- money = Math.round(money * 100).toString()
36
- integerNum = money.substr(0, money.length - 2)
37
- decimalNum = money.substr(money.length - 2)
43
+
44
+ //转换为字符串
45
+ money = money.toString()
46
+ if (money.indexOf('-') !== -1) {
47
+ minusFlag = true
48
+ money = Math.abs(money).toString()
49
+ }
50
+ if (money.indexOf('.') == -1) {
51
+ integerNum = money
52
+ decimalNum = ''
53
+ } else {
54
+ parts = money.split('.')
55
+ integerNum = parts[0]
56
+ decimalNum = parts[1].substr(0, 4)
57
+ }
58
+
38
59
  //获取整型部分转换
39
60
  if (parseInt(integerNum, 10) > 0) {
40
61
  var zeroCount = 0
@@ -72,22 +93,12 @@ export const convert = (money) => {
72
93
  }
73
94
  if (chineseStr == '') {
74
95
  chineseStr += cnNums[0] + cnIntLast + cnInteger
75
- } else if (decimalNum == '' || /^0*$/.test(decimalNum)) {
96
+ } else if (decimalNum == '') {
76
97
  chineseStr += cnInteger
77
98
  }
78
- return chineseStr
79
- }
80
- /**
81
- * 单个数字转换
82
- * @param {number | string} number
83
- * @returns {string}
84
- */
85
- export const singleConvert = (number) => {
86
- const res = CHINESE_NUMERALS[number] || number
87
99
 
88
- if (!res) {
89
- console.error('The number is invalid')
100
+ if (minusFlag) {
101
+ chineseStr = minusStr + chineseStr
90
102
  }
91
-
92
- return res
103
+ return chineseStr
93
104
  }