n20-common-lib 2.5.5-beta.2 → 2.5.5-beta.4

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "n20-common-lib",
3
- "version": "2.5.5-beta.2",
3
+ "version": "2.5.5-beta.4",
4
4
  "private": false,
5
5
  "main": "src/index.js",
6
6
  "scripts": {
@@ -116,4 +116,4 @@
116
116
  "last 2 versions",
117
117
  "not dead"
118
118
  ]
119
- }
119
+ }
@@ -50,7 +50,16 @@
50
50
  :style="{
51
51
  width:
52
52
  form[item.value] && form[item.value].length > 0
53
- ? 156 + 'px'
53
+ ? context.measureText(
54
+ item.options.find(
55
+ (r) =>
56
+ r.value === form[item.value] ||
57
+ (item.props && item.props.valueKey && r[item.props.valueKey] === form[item.value])
58
+ ).label
59
+ ).width *
60
+ 1.4 +
61
+ 48 +
62
+ 'px'
54
63
  : 120 - 18 - context.measureText(item.label).width * 1.4 + 'px'
55
64
  }"
56
65
  v-bind="item.props"
@@ -150,10 +159,6 @@ export default {
150
159
  type: Object,
151
160
  default: undefined
152
161
  },
153
- data: {
154
- type: Array,
155
- default: undefined
156
- },
157
162
  item: {
158
163
  type: Object,
159
164
  default: undefined
@@ -165,16 +170,15 @@ export default {
165
170
  }
166
171
  },
167
172
  created() {
168
- // if (this.item.reqOptions) {
169
- // this.getOptions()
170
- // }
173
+ if (this.item.reqOptions) {
174
+ this.getOptions()
175
+ }
171
176
  },
172
177
  methods: {
173
178
  getOptions() {
174
179
  let reqOptions = this.item.reqOptions
175
180
  let url = reqOptions.url || ''
176
181
  url = url.includes('?') ? `${url}r=${Math.random()}` : `${url}?r=${Math.random()}`
177
-
178
182
  axios({
179
183
  ...reqOptions,
180
184
  url: url,
@@ -1,57 +1,54 @@
1
1
  <template>
2
2
  <div :class="prefixCls">
3
- <div v-if="!visible && $slots.prefix" class="n20-advanced-filter-item" style="margin-bottom: 11px">
3
+ <el-form v-if="visible" :class="prefixCls + '-body'">
4
4
  <slot name="prefix"></slot>
5
- </div>
6
- <div v-if="!visible && $slots.suffix" class="n20-advanced-filter-item" style="border: none; margin-bottom: 11px">
7
- <slot name="suffix"></slot>
8
- </div>
9
- <filterList
10
- v-if="visible"
11
- :width="width"
12
- :form="model"
13
- class="custom-advance-filter"
14
- :prefix-cls="prefixCls"
15
- :filter-id="filterId"
16
- :filter-list="filterList"
17
- @change="$emit('change', model)"
18
- @clear="$emit('clear')"
19
- >
20
- <div
21
- v-if="$slots.prefix"
22
- slot="prefix"
23
- class="el-form-item el-form-item--small n20-advanced-filter-item"
24
- style="margin-bottom: 11px"
25
- >
26
- <slot name="prefix"></slot>
27
- </div>
28
- <template v-for="(item, i) in GroupData">
29
- <template v-if="item && item.slotName" :slot="item.slotName">
30
- <slot :name="item.slotName"></slot>
31
- </template>
32
- </template>
33
- <div
34
- v-if="$slots.suffix"
35
- slot="suffix"
36
- class="el-form-item el-form-item--small n20-advanced-filter-item"
37
- style="border: none; margin-bottom: 11px"
5
+ <el-form-item
6
+ v-for="(item, i) in dataC"
7
+ :key="i"
8
+ :class="[prefixCls + '-item', activeClass(item)]"
9
+ :label="item.label"
38
10
  >
39
- <slot name="suffix"></slot>
40
- </div>
41
- </filterList>
11
+ <div :class="prefixCls + '-content'">
12
+ <slot v-if="item.slotName" :name="item.slotName"></slot>
13
+ <formItemInput v-else :form="model" :item="item" @change="$emit('change')" />
14
+ </div>
15
+ <i :key="i" :class="[prefixCls + '-item-close', 'n20-icon-yichu']" @click="handleClose(item)"></i>
16
+ </el-form-item>
17
+ <slot name="suffix"></slot>
18
+ <el-form-item :class="prefixCls + '-add'">
19
+ <el-button v-popover:advanced_popover onlyicon plain icon="el-icon-plus" />
20
+ <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>
31
+ </el-popover>
32
+ <el-link class="m-l-s f-s-s" :underline="false" icon="n20-icon-qingchu" @click="cleared"> 清除条件</el-link>
33
+ </el-form-item>
34
+ </el-form>
42
35
  <div v-else :width="width"></div>
43
36
  </div>
44
37
  </template>
45
38
 
46
39
  <script>
47
- import filterList from './filterList.vue'
40
+ import formItemInput from './form-item-input.vue'
41
+ import InputSearch from '../InputSearch/index.vue'
42
+ import filterItem from './filterItem.vue'
48
43
 
49
44
  import mixins from './mixins/index.js'
50
45
  const prefixCls = 'n20-advanced-filter'
51
46
  export default {
52
47
  name: 'AdvancedFilter',
53
48
  components: {
54
- filterList
49
+ formItemInput,
50
+ InputSearch,
51
+ filterItem
55
52
  },
56
53
  mixins: [mixins],
57
54
  props: {
@@ -94,17 +91,96 @@ export default {
94
91
  showPop: false,
95
92
  showPopC: false,
96
93
  prefixCls,
94
+ dataC: [],
95
+ filterListC: [],
97
96
  remoteList: [],
98
97
  checkList: []
99
98
  }
100
99
  },
101
-
100
+ watch: {
101
+ GroupData: {
102
+ handler(value) {
103
+ this.dataC = value
104
+ },
105
+ immediate: true
106
+ },
107
+ filterList: {
108
+ handler(value) {
109
+ this.filterListC = value
110
+ },
111
+ deep: true,
112
+ immediate: true
113
+ }
114
+ },
115
+ mounted() {
116
+ this.getFilterList()
117
+ },
102
118
  methods: {
103
119
  setOptions(key, opts) {
104
120
  let item = this.filterList.find((f) => f.value === key)
105
121
  if (item) {
106
122
  item.options = opts || []
107
123
  }
124
+ },
125
+ activeClass(item) {
126
+ console.log(item)
127
+ let flag = ''
128
+ switch (item.type) {
129
+ case 'text':
130
+ case 'search':
131
+ case 'select':
132
+ case 'number':
133
+ case 'date':
134
+ case 'datetime':
135
+ case 'year':
136
+ case 'month':
137
+ case 'week':
138
+ case 'checkbox':
139
+ case 'radio':
140
+ flag = this.model[item.value] ? this.prefixCls + '-active' : ''
141
+ break
142
+ case 'numberrange':
143
+ flag = this.model[item.startValue] && this.model[item.endValue] ? this.prefixCls + '-active' : ''
144
+ break
145
+ case 'daterange':
146
+ case 'datetimerange':
147
+ case ' monthrange':
148
+ flag = this.model[item.startDate] && this.model[item.endDate] ? this.prefixCls + '-active' : ''
149
+ break
150
+ }
151
+ return flag
152
+ },
153
+ handleClose(item) {
154
+ let data = this.GroupData.filter((s) => {
155
+ return s.label !== item.label || s.value !== item.value
156
+ })
157
+ this.saveFilter(data).then(({ code }) => {
158
+ if (code === 200) {
159
+ this.getFilterList()
160
+ }
161
+ })
162
+ },
163
+ searchFn() {
164
+ this.filterListC = this.cloneDeepFList.filter((r) => {
165
+ return r.label.includes(this.search)
166
+ })
167
+ },
168
+ cleared() {
169
+ this.$emit('clear')
170
+ },
171
+ check(keys) {
172
+ this.checkList = keys
173
+ let groupFilter = []
174
+ if (keys.length > 0) {
175
+ keys.forEach((k) => {
176
+ groupFilter.push(this.filterList.find((s) => s.label === k))
177
+ })
178
+ }
179
+ this.saveFilter(groupFilter).then(({ code }) => {
180
+ if (code === 200) {
181
+ this.getFilterList()
182
+ }
183
+ })
108
184
  }
109
185
  }
110
186
  }
@@ -59,6 +59,10 @@ export default {
59
59
  procInstId: {
60
60
  type: String,
61
61
  default: undefined
62
+ },
63
+ buttonMode: {
64
+ type: Boolean,
65
+ default: true
62
66
  }
63
67
  },
64
68
  data() {
@@ -51,6 +51,53 @@ let disabledDate_2 = (t) => {
51
51
  return t > now
52
52
  }
53
53
 
54
+ let shortcuts_1 = [
55
+ {
56
+ text: $lc('最近一月'),
57
+ onClick(picker) {
58
+ const start = new Date()
59
+ const end = new Date()
60
+ start.setMonth(start.getMonth() - 1)
61
+ start.setHours(0, 0, 0)
62
+ end.setHours(23, 59, 59)
63
+ picker.$emit('pick', [start, end])
64
+ }
65
+ },
66
+ {
67
+ text: $lc('最近三月'),
68
+ onClick(picker) {
69
+ const start = new Date()
70
+ const end = new Date()
71
+ start.setMonth(start.getMonth() - 3)
72
+ start.setHours(0, 0, 0)
73
+ end.setHours(23, 59, 59)
74
+ picker.$emit('pick', [start, end])
75
+ }
76
+ },
77
+ {
78
+ text: $lc('最近六月'),
79
+ onClick(picker) {
80
+ const start = new Date()
81
+ const end = new Date()
82
+ start.setMonth(start.getMonth() - 6)
83
+ start.setHours(0, 0, 0)
84
+ end.setHours(23, 59, 59)
85
+ picker.$emit('pick', [start, end])
86
+ }
87
+ },
88
+ {
89
+ text: $lc('最近一年'),
90
+ onClick(picker) {
91
+ const start = new Date()
92
+ const end = new Date()
93
+ start.setFullYear(start.getFullYear() - 1)
94
+ start.setHours(0, 0, 0)
95
+ end.setHours(23, 59, 59)
96
+ picker.$emit('pick', [start, end])
97
+ }
98
+ }
99
+ ]
100
+
54
101
  let shortcuts_2 = [
55
102
  {
56
103
  text: $lc('最近一月'),
@@ -149,6 +196,10 @@ export default {
149
196
  type: Boolean,
150
197
  default: true
151
198
  },
199
+ startStop: {
200
+ type: Boolean,
201
+ default: false
202
+ },
152
203
  clearable: {
153
204
  type: Boolean,
154
205
  default: true
@@ -160,7 +211,8 @@ export default {
160
211
  },
161
212
  data() {
162
213
  let shortcuts = undefined
163
- if (this.shortcuts && ['daterange', 'datetimerange'].includes(this.type)) shortcuts = shortcuts_2
214
+ if (this.shortcuts && ['daterange', 'datetimerange'].includes(this.type))
215
+ shortcuts = this.startStop ? shortcuts_2 : shortcuts_1
164
216
 
165
217
  this.pickerOptionsAs = Object.assign(
166
218
  {
@@ -171,7 +223,11 @@ export default {
171
223
  this.pickerOptions
172
224
  )
173
225
 
174
- this.listeners = Object.assign({}, this.$listeners, { input: () => {}, change: () => {}, blur: this.HandleBlur })
226
+ this.listeners = Object.assign({}, this.$listeners, {
227
+ input: () => {},
228
+ change: () => {},
229
+ blur: this.HandleBlur
230
+ })
175
231
  return {}
176
232
  },
177
233
  computed: {
@@ -156,6 +156,13 @@ export default {
156
156
  this.pageObj[this.pageKey.size] = this.pageObjC[this.pageKey.size]
157
157
  this.pageObjC[this.pageKey.total] = this.pageObj[this.pageKey.total]
158
158
  this.$emit('change', this.pageObjC)
159
+ },
160
+ pageObj: {
161
+ immediate: true,
162
+ deep: true,
163
+ handler(newValue, oldValue) {
164
+ this.pageObjC = this.pageObj
165
+ }
159
166
  }
160
167
  },
161
168
  methods: {
@@ -8,7 +8,6 @@
8
8
  :height="height"
9
9
  :class="{ 'cell-default-set--': cellDefault }"
10
10
  :checkbox-config="{ checkField: 'checked', checkMethod: forbidSelect }"
11
- v-bind="Object.assign({ size: size }, $attrs, sizeBind)"
12
11
  show-overflow
13
12
  show-header-overflow
14
13
  :row-config="{ isHover: true, useKey: true, ...$attrs.rowConfig }"
@@ -23,6 +22,7 @@
23
22
  ...$attrs.sortConfig
24
23
  }"
25
24
  :filter-config="{ remote: true, iconNone: 'n20-icon-xiala-moren', iconMatch: 'n20-icon-xiala-moren' }"
25
+ v-bind="Object.assign({ size: size }, $attrs, sizeBind)"
26
26
  v-on="$listeners"
27
27
  @sort-change="(val) => customSortMethod(val)"
28
28
  @filter-change="filterChange"
@@ -13,7 +13,10 @@
13
13
  <template v-if="!hidePercent">
14
14
  <p v-if="!percentType">{{ '系统处理中,请稍等......' | $lc }}</p>
15
15
  <div v-else>
16
- <div v-if="validateResult" class="m-b"><span class="m-r-m">导入文件</span>{{ validateResult.name }}</div>
16
+ <div v-if="validateResult" class="m-b">
17
+ <span class="m-r-m">{{ '导入文件' | $lc }}</span
18
+ >{{ validateResult.name }}
19
+ </div>
17
20
  <div class="flex-box">
18
21
  <div class="m-r-m">{{ '导入进度' | $lc }}</div>
19
22
  <div class="flex-item">
package/src/i18n.json CHANGED
@@ -194,6 +194,9 @@
194
194
  "取消": {
195
195
  "en": "Cancel"
196
196
  },
197
+ "取消导入": {
198
+ "en": "Cancel import"
199
+ },
197
200
  "省市区级联": {
198
201
  "en": "Provincial, municipal and district cascade"
199
202
  },
@@ -2,45 +2,80 @@ const CHINESE_NUMERALS = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒'
2
2
 
3
3
  /**
4
4
  *
5
- * @param {number|string} num 需转换的金额
5
+ * @param {number|string} amount 需转换的金额
6
6
  */
7
- export const convert = (num) => {
8
- const digits = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
9
- const integerUnits = [
10
- ['', '万', '亿'],
11
- ['', '', '', '']
12
- ]
13
- const negativeSign = num < 0 ? '' : ''
14
- num = Math.abs(num)
15
-
16
- let result = ''
17
-
18
- // 处理小数部分
19
- const decimal = Math.round((num - Math.floor(num)) * 100)
20
- if (decimal > 0) {
21
- result = digits[Math.floor(decimal / 10)] + '' + digits[decimal % 10] + '分'
22
- } else {
23
- result = '整'
7
+ export const convert = (money) => {
8
+ var cnNums = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖'] //汉字的数字
9
+ var cnIntRadice = ['', '拾', '佰', '仟'] //基本单位
10
+ var cnIntUnits = ['', '万', '亿', '兆'] //对应整数部分扩展单位
11
+ var cnDecUnits = ['', '', '', ''] //对应小数部分单位
12
+ var cnInteger = '整' //整数金额时后面跟的字符
13
+ var cnIntLast = '' //整数完以后的单位
14
+ //最大处理的数字
15
+ var maxNum = 999999999999999.9999
16
+ var integerNum //金额整数部分
17
+ var decimalNum //金额小数部分
18
+ //输出的中文金额字符串
19
+ var chineseStr = ''
20
+ var parts //分离金额后用的数组,预定义
21
+ if (money == '') {
22
+ return ''
24
23
  }
25
- num = Math.floor(num)
26
24
 
27
- // 处理整数部分
28
- for (let i = 0; i < integerUnits[0].length && num > 0; i++) {
29
- let temp = ''
30
- for (let j = 0; j < integerUnits[1].length && num > 0; j++) {
31
- temp = digits[num % 10] + integerUnits[1][j] + temp
32
- num = Math.floor(num / 10)
25
+ money = parseFloat(money)
26
+ if (money >= maxNum) {
27
+ //超出最大处理数字
28
+ return '超出最大处理数字'
29
+ }
30
+ if (money == 0) {
31
+ chineseStr = cnNums[0] + cnIntLast + cnInteger
32
+ return chineseStr
33
+ }
34
+ //四舍五入保留两位小数,转换为字符串
35
+ money = Math.round(money * 100).toString()
36
+ integerNum = money.substr(0, money.length - 2)
37
+ decimalNum = money.substr(money.length - 2)
38
+ //获取整型部分转换
39
+ if (parseInt(integerNum, 10) > 0) {
40
+ var zeroCount = 0
41
+ var IntLen = integerNum.length
42
+ for (var i = 0; i < IntLen; i++) {
43
+ var n = integerNum.substr(i, 1)
44
+ var p = IntLen - i - 1
45
+ var q = p / 4
46
+ var m = p % 4
47
+ if (n == '0') {
48
+ zeroCount++
49
+ } else {
50
+ if (zeroCount > 0) {
51
+ chineseStr += cnNums[0]
52
+ }
53
+ //归零
54
+ zeroCount = 0
55
+ chineseStr += cnNums[parseInt(n)] + cnIntRadice[m]
56
+ }
57
+ if (m == 0 && zeroCount < 4) {
58
+ chineseStr += cnIntUnits[q]
59
+ }
33
60
  }
34
- result = temp.replace(/(零.)*零$/, '').replace(/^$/, '零') + integerUnits[0][i] + result
61
+ chineseStr += cnIntLast
62
+ }
63
+ //小数部分
64
+ if (decimalNum != '') {
65
+ var decLen = decimalNum.length
66
+ for (var i = 0; i < decLen; i++) {
67
+ var n = decimalNum.substr(i, 1)
68
+ if (n != '0') {
69
+ chineseStr += cnNums[Number(n)] + cnDecUnits[i]
70
+ }
71
+ }
72
+ }
73
+ if (chineseStr == '') {
74
+ chineseStr += cnNums[0] + cnIntLast + cnInteger
75
+ } else if (decimalNum == '' || /^0*$/.test(decimalNum)) {
76
+ chineseStr += cnInteger
35
77
  }
36
- return (
37
- negativeSign +
38
- result
39
- .replace(/(零.)+/g, '零')
40
- .replace(/零+$/, '')
41
- .replace(/(零元)$/, '元')
42
- .replace(/^整$/, '零元整')
43
- )
78
+ return chineseStr
44
79
  }
45
80
  /**
46
81
  * 单个数字转换
@@ -1,163 +0,0 @@
1
- <template>
2
- <el-form :class="prefixCls + '-body'">
3
- <slot name="prefix"></slot>
4
- <el-form-item
5
- v-for="(item, i) in dataC"
6
- :key="i"
7
- :class="[prefixCls + '-item', activeClass(item)]"
8
- :label="item.label"
9
- >
10
- <div :class="prefixCls + '-content'">
11
- <slot v-if="item.slotName" :name="item.slotName"></slot>
12
- <formItemInput v-else :form="form" :item="item" @change="$emit('change')" />
13
- </div>
14
- <i :key="i" :class="[prefixCls + '-item-close', 'n20-icon-yichu']" @click="handleClose(item)"></i>
15
- </el-form-item>
16
- <slot name="suffix"></slot>
17
- <el-form-item :class="prefixCls + '-add'">
18
- <el-button v-popover:advanced_popover onlyicon plain icon="el-icon-plus" />
19
- <el-popover ref="advanced_popover" placement="bottom-start" trigger="click">
20
- <el-form>
21
- <InputSearch
22
- v-model="search"
23
- clearable
24
- class="input-w m-b-s"
25
- :placeholder="$l('搜索筛选条件')"
26
- @change="searchFn"
27
- />
28
- <filterItem :filter-list="filterListC" :check-array.sync="checkList" @checked="check" />
29
- </el-form>
30
- </el-popover>
31
- <el-link class="m-l-s f-s-s" :underline="false" icon="n20-icon-qingchu" @click="cleared"> 清除条件</el-link>
32
- </el-form-item>
33
- </el-form>
34
- </template>
35
-
36
- <script>
37
- import formItemInput from './form-item-input.vue'
38
- import InputSearch from '../InputSearch/index.vue'
39
- import filterItem from './filterItem.vue'
40
- import mixins from './mixins/index.js'
41
-
42
- export default {
43
- name: 'FilterList',
44
- components: {
45
- filterItem,
46
- InputSearch,
47
- formItemInput
48
- },
49
- mixins: [mixins],
50
- props: {
51
- data: {
52
- type: Array,
53
- default: () => []
54
- },
55
- form: {
56
- type: Object,
57
- default: () => ({})
58
- },
59
- width: {
60
- type: String,
61
- default: '90%'
62
- },
63
- filterList: {
64
- type: Array,
65
- default: () => []
66
- },
67
- filterId: {
68
- type: String,
69
- default: ''
70
- },
71
- prefixCls: {
72
- type: String,
73
- default: ''
74
- }
75
- },
76
- data() {
77
- return {
78
- search: '',
79
- dataC: [],
80
- filterListC: []
81
- }
82
- },
83
- watch: {
84
- GroupData: {
85
- handler(value) {
86
- this.dataC = value
87
- },
88
- immediate: true
89
- },
90
- filterList: {
91
- handler(value) {
92
- this.filterListC = value
93
- },
94
- deep: true,
95
- immediate: true
96
- }
97
- },
98
- mounted() {
99
- this.getFilterList()
100
- },
101
- methods: {
102
- handleClose(item) {
103
- let data = this.GroupData.filter((s) => {
104
- return s.label !== item.label || s.value !== item.value
105
- })
106
- this.saveFilter(data).then(({ code }) => {
107
- if (code === 200) {
108
- this.getFilterList()
109
- }
110
- })
111
- },
112
- searchFn() {
113
- this.filterListC = this.cloneDeepFList.filter((r) => {
114
- return r.label.includes(this.search)
115
- })
116
- },
117
- check(keys) {
118
- this.checkList = keys
119
- let groupFilter = []
120
- if (keys.length > 0) {
121
- keys.forEach((k) => {
122
- groupFilter.push(this.filterList.find((s) => s.label === k))
123
- })
124
- }
125
- this.saveFilter(groupFilter).then(({ code }) => {
126
- if (code === 200) {
127
- this.getFilterList()
128
- }
129
- })
130
- },
131
- activeClass(item) {
132
- let flag = ''
133
- switch (item.type) {
134
- case 'text':
135
- case 'search':
136
- case 'select':
137
- case 'number':
138
- case 'date':
139
- case 'datetime':
140
- case 'year':
141
- case 'month':
142
- case 'week':
143
- case 'checkbox':
144
- case 'radio':
145
- flag = this.form[item.value] && this.form[item.value].length > 0 ? this.prefixCls + '-active' : ''
146
- break
147
- case 'numberrange':
148
- flag = this.form[item.startValue] && this.form[item.endValue] ? this.prefixCls + '-active' : ''
149
- break
150
- case 'daterange':
151
- case 'datetimerange':
152
- case ' monthrange':
153
- flag = this.form[item.startDate] && this.form[item.endDate] ? this.prefixCls + '-active' : ''
154
- break
155
- }
156
- return flag
157
- },
158
- cleared() {
159
- this.$emit('clear')
160
- }
161
- }
162
- }
163
- </script>