sh-view 2.8.11 → 2.8.13

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": "sh-view",
3
- "version": "2.8.11",
3
+ "version": "2.8.13",
4
4
  "description": "基于vxe-table二次封装,更包含Alert,Badge,Card,CodeEditor,Col,Corner,CountTo,Drawer,Empty,Form,Header,Icon,List,Loading,Modal,Noticebar,Poptip,Progress,PullRefresh,Query,Result,Row,Split,Grid,Table,Tabs,Tag,Toolbar,Tree,Upload,WaterFall,WaterMark等丰富组件库",
5
5
  "main": "packages/index.js",
6
6
  "typings": "types/index.d.ts",
@@ -32,7 +32,7 @@
32
32
  "jszip": "^3.10.1",
33
33
  "lunar-typescript": "^1.6.10",
34
34
  "popper.js": "^1.16.1",
35
- "sh-tools": "^2.2.7",
35
+ "sh-tools": "^2.2.10",
36
36
  "tinymce": "^5.10.5",
37
37
  "vue": "^3.3.4",
38
38
  "vue-masonry": "^0.16.0",
@@ -66,7 +66,7 @@ export default defineComponent({
66
66
  maxDate: [String, Number, Date],
67
67
  startDay: { type: [String, Number] },
68
68
  labelFormat: { type: String },
69
- valueFormat: { type: String },
69
+ format: { type: String },
70
70
  editable: { type: Boolean, default: true },
71
71
  festivalMethod: { type: Function },
72
72
  disabledMethod: { type: Function },
@@ -78,7 +78,6 @@ export default defineComponent({
78
78
  transfer: Boolean,
79
79
  // 个性化参数
80
80
  range: Boolean,
81
- rangeFormat: String,
82
81
  autoBlur: { type: Boolean, default: true },
83
82
  separator: { type: String, default: '至' },
84
83
  startPlaceholder: { type: String, default: '起始日期' },
@@ -110,7 +109,7 @@ export default defineComponent({
110
109
 
111
110
  const pulldownValue = ref(false)
112
111
  const inputValue = ref(props.modelValue)
113
- const rangeValue = ref(props.modelValue || [])
112
+ const rangeValue = ref(Array.isArray(props.modelValue) ? props.modelValue : [])
114
113
 
115
114
  const inputConfig = computed(() => {
116
115
  let defaultProps = {}
@@ -124,10 +123,9 @@ export default defineComponent({
124
123
  return Object.assign({ transfer: true }, props.pulldown)
125
124
  })
126
125
  const calendarFormat = computed(() => {
127
- if (props.rangeFormat) return props.rangeFormat
128
- else if (props.type === 'month') return 'yyyy-MM'
126
+ if (props.type === 'month') return 'yyyy-MM'
129
127
  else if (props.type === 'year') return 'yyyy'
130
- return props.valueFormat
128
+ return props.format || 'yyyy-MM-dd'
131
129
  })
132
130
  const rangeInputConfig = computed(() => ({ type: 'text', readonly: true }))
133
131
  const startInputConfig = computed(() => {
@@ -219,7 +217,7 @@ export default defineComponent({
219
217
  watch(
220
218
  () => props.modelValue,
221
219
  (value, oldValue) => {
222
- if (props.range) {
220
+ if (props.range && Array.isArray(value)) {
223
221
  rangeValue.value = value
224
222
  } else {
225
223
  inputValue.value = value
@@ -53,6 +53,7 @@ export default defineComponent({
53
53
  <style lang="scss">
54
54
  .sh-vxe-form {
55
55
  position: relative;
56
+ width: 100%;
56
57
  &.readonly {
57
58
  .vxe-form {
58
59
  .vxe-input--inner[disabled],
@@ -63,11 +63,11 @@ export default defineComponent({
63
63
  },
64
64
  type: {
65
65
  type: String,
66
- default: 'line' // 'line', 'card'
66
+ default: 'line' // 'line', 'card', 'tab'
67
67
  },
68
68
  size: {
69
69
  type: String,
70
- default: 'default' // 'small', 'default'
70
+ default: 'default' // medium / small / mini
71
71
  },
72
72
  animated: {
73
73
  type: Boolean,
@@ -110,7 +110,9 @@ export default defineComponent({
110
110
  const tabClass = computed(() => {
111
111
  return {
112
112
  'sh-tabs-card': props.type === 'card',
113
+ 'sh-tabs-tab': props.type === 'tab',
113
114
  'sh-tabs-reverse': ['bottom', 'right'].includes(props.placement),
115
+ [`sh-tabs-size-${props.size}`]: true,
114
116
  [isHorizontal.value ? 'sh-tabs-horizontal' : 'sh-tabs-vertical']: true
115
117
  }
116
118
  })
@@ -284,10 +286,25 @@ export default defineComponent({
284
286
  width: 100%;
285
287
  position: relative;
286
288
  display: flex;
289
+ line-height: 2.3em;
290
+ &-size {
291
+ &-default {
292
+ font-size: var(--vxe-font-size);
293
+ }
294
+ &-medium {
295
+ font-size: var(--vxe-font-size-medium);
296
+ }
297
+ &-small {
298
+ font-size: var(--vxe-font-size-small);
299
+ }
300
+ &-mini {
301
+ font-size: var(--vxe-font-size-mini);
302
+ }
303
+ }
287
304
  .sh-tab-close {
288
305
  display: inline-flex;
289
306
  align-items: center;
290
- padding: 0 1px;
307
+ font-size: 1.4em;
291
308
  &:hover {
292
309
  background-color: rgba(0, 0, 0, 0.1);
293
310
  }
@@ -296,12 +313,32 @@ export default defineComponent({
296
313
  width: 100%;
297
314
  flex-wrap: wrap;
298
315
  flex-direction: column;
299
- &.sh-tabs-reverse {
300
- flex-direction: column-reverse;
301
- }
302
316
  .sh-tabs-nav {
303
317
  width: 100%;
304
318
  }
319
+ &.sh-tabs-reverse {
320
+ flex-direction: column-reverse;
321
+ &.sh-tabs-tab {
322
+ .sh-tabs-nav-inner {
323
+ .sh-tab-item {
324
+ border-radius: 0 0 0.7em 0.7em;
325
+ }
326
+ .sh-tab-item-active {
327
+ &:before,
328
+ &:after {
329
+ top: 0;
330
+ bottom: auto;
331
+ }
332
+ &:before {
333
+ background: radial-gradient(circle at 0 100%, transparent 14px, var(--primary-weak-color) 14px);
334
+ }
335
+ &:after {
336
+ background: radial-gradient(circle at 100% 100%, transparent 14px, var(--primary-weak-color) 14px);
337
+ }
338
+ }
339
+ }
340
+ }
341
+ }
305
342
  }
306
343
  &-horizontal {
307
344
  flex-wrap: nowrap;
@@ -317,10 +354,30 @@ export default defineComponent({
317
354
  .sh-tabs-nav-prev,
318
355
  .sh-tabs-nav-next {
319
356
  width: 100%;
320
- height: 26px;
357
+ height: 2em;
358
+ }
359
+ &.sh-tabs-tab {
360
+ .sh-tabs-nav-inner {
361
+ .sh-tab-item {
362
+ border-radius: 0.7em 0 0 0.7em !important;
363
+ }
364
+ .sh-tab-item-active {
365
+ &:before,
366
+ &:after {
367
+ display: none;
368
+ }
369
+ }
370
+ }
321
371
  }
322
372
  &.sh-tabs-reverse {
323
373
  flex-direction: row-reverse;
374
+ &.sh-tabs-tab {
375
+ .sh-tabs-nav-inner {
376
+ .sh-tab-item {
377
+ border-radius: 0 0.7em 0.7em 0 !important;
378
+ }
379
+ }
380
+ }
324
381
  }
325
382
  }
326
383
  &-nav {
@@ -337,7 +394,7 @@ export default defineComponent({
337
394
  }
338
395
  &-prev,
339
396
  &-next {
340
- width: 30px;
397
+ width: 2.5em;
341
398
  height: 100%;
342
399
  display: inline-flex;
343
400
  align-items: center;
@@ -364,15 +421,22 @@ export default defineComponent({
364
421
  display: inline-flex;
365
422
  align-items: stretch;
366
423
  cursor: pointer;
367
- line-height: 20px;
368
424
  box-sizing: border-box;
369
- border-bottom: 2px solid transparent;
425
+ position: relative;
370
426
  &:hover {
371
427
  color: var(--vxe-primary-color);
372
428
  }
373
429
  &.sh-tab-item-active {
374
- border-bottom: 2px solid var(--vxe-primary-darken-color);
375
430
  color: var(--vxe-primary-color) !important;
431
+ &:after {
432
+ position: absolute;
433
+ height: 2px;
434
+ background-color: var(--vxe-primary-darken-color);
435
+ width: 100%;
436
+ bottom: 0;
437
+ content: '';
438
+ display: block;
439
+ }
376
440
  }
377
441
  &.sh-tab-item-disabled {
378
442
  cursor: not-allowed;
@@ -381,11 +445,11 @@ export default defineComponent({
381
445
  .sh-tab-icon {
382
446
  display: inline-flex;
383
447
  align-items: center;
384
- padding: 0 2px 0 5px;
448
+ padding: 0 0.2em 0 0.7em;
385
449
  }
386
450
  .sh-tab-label {
387
451
  flex: 1;
388
- padding: 5px;
452
+ padding: 0 0.5em;
389
453
  }
390
454
  }
391
455
  }
@@ -403,6 +467,40 @@ export default defineComponent({
403
467
  background-color: var(--vxe-primary-color);
404
468
  border-color: var(--vxe-primary-color);
405
469
  color: #fff !important;
470
+ &:after {
471
+ display: none;
472
+ }
473
+ }
474
+ }
475
+ }
476
+ &.sh-tabs-tab {
477
+ .sh-tabs-nav-inner {
478
+ .sh-tab-item {
479
+ position: relative;
480
+ border: none;
481
+ border-radius: 0.7em 0.7em 0 0;
482
+ }
483
+ .sh-tab-item-active {
484
+ background-color: var(--primary-weak-color);
485
+ color: var(--vxe-primary-color) !important;
486
+ &:before,
487
+ &:after {
488
+ position: absolute;
489
+ width: 14px;
490
+ height: 14px;
491
+ background-color: var(--primary-weak-color);
492
+ content: '';
493
+ display: inline-block;
494
+ bottom: 0;
495
+ }
496
+ &:before {
497
+ left: -14px;
498
+ background: radial-gradient(circle at 0 0, transparent 14px, var(--primary-weak-color) 14px);
499
+ }
500
+ &:after {
501
+ right: -14px;
502
+ background: radial-gradient(circle at 100% 0, transparent 14px, var(--primary-weak-color) 14px);
503
+ }
406
504
  }
407
505
  }
408
506
  }
@@ -29,20 +29,10 @@ const tableConfigDefault = {
29
29
  showHeader: false,
30
30
  showFooter: false,
31
31
  showOverflow: true,
32
- resizeConfig: {
33
- refreshDelay: 100
34
- },
35
- columnConfig: {
36
- width: 120
37
- },
38
- scrollX: {
39
- enabled: true,
40
- gt: 20
41
- },
42
- scrollY: {
43
- enabled: true,
44
- gt: 20
45
- }
32
+ resizeConfig: { refreshDelay: 100 },
33
+ columnConfig: { width: 120 },
34
+ scrollX: { enabled: true, gt: 20 },
35
+ scrollY: { enabled: true, gt: 20 }
46
36
  }
47
37
  import mixinProps from '../mixin/treeProps'
48
38
  export default defineComponent({
@@ -5,6 +5,7 @@ import VXETablePluginExportPDF from 'vxe-table-plugin-export-pdf'
5
5
  import { jsPDF } from 'jspdf'
6
6
  import XEClipboard from 'xe-clipboard'
7
7
  import ShValidators from 'sh-tools/packages/utils/validate'
8
+ import { utils } from 'sh-tools'
8
9
  import { publicRenders, extraRenders, filterRenders, publicRendersNames } from './render/globalRenders.jsx'
9
10
 
10
11
  let vxeOptions = {
@@ -28,7 +29,7 @@ let vxeOptions = {
28
29
  keepSource: false,
29
30
  minHeight: 30,
30
31
  rowConfig: {
31
- useKey: false,
32
+ useKey: true,
32
33
  keyField: '_XID',
33
34
  isCurrent: true,
34
35
  isHover: true
@@ -207,9 +208,9 @@ VXETable.renderer.mixin(filterRenders)
207
208
 
208
209
  const index = {
209
210
  install(Vue, { vxeOption = {}, vxePdfOption = {}, vxeXlsxOption }) {
210
- let setupOption = Object.assign(vxeOptions, vxeOption)
211
- let xlsxSetUpOption = Object.assign(vxeXlsxOptions, vxeXlsxOption)
212
- let pdfSetUpOption = Object.assign(vxePdfOptions, vxePdfOption)
211
+ let setupOption = utils.merge(vxeOptions, vxeOption)
212
+ let xlsxSetUpOption = utils.merge(vxeXlsxOptions, vxeXlsxOption)
213
+ let pdfSetUpOption = utils.merge(vxePdfOptions, vxePdfOption)
213
214
  VXETable.setup(setupOption)
214
215
  VXETable.use(VXETablePluginExportXLSX, xlsxSetUpOption)
215
216
  VXETable.use(VXETablePluginExportPDF, pdfSetUpOption)
@@ -1,7 +1,7 @@
1
1
  <template>
2
2
  <span class="vxe-render--inner" :class="{ 'form-render': rform, 'td-render': !rform }">
3
3
  <template v-if="redit || isEditAll">
4
- <sh-date v-model="renderValue" v-bind="rprops" :size="rsize" :disabled-method="vxeDisabledMethod" @change="vxeChangeCallBack"></sh-date>
4
+ <sh-date v-model="renderValue" v-bind="rprops" :size="rsize" :disabled-method="vxeDisabledMethod" @change="vxeChangeCallBack" @clear="vxeBlurCallback"></sh-date>
5
5
  </template>
6
6
  <template v-else>
7
7
  <span v-html="renderText"></span>
@@ -43,7 +43,7 @@ let defaultProps = {
43
43
  $vTextArea: { placeholder: '请输入', rows: 2, transfer: true, resize: 'none', showWordCount: true },
44
44
  $vSelect: { placeholder: '请选择', filterable: true, transfer: true, showType: 'text', tagColor: 'default', split: ',', options: [] },
45
45
  $vTree: { placeholder: '请选择', transfer: true, split: ',', nodeKey: 'id', labelField: 'label' },
46
- $vTime: { type: 'date', placeholder: '请选择时间', transfer: true, editable: false, prefixType: 'text', suffixType: 'text' },
46
+ $vTime: { type: 'date', placeholder: '请选择时间', transfer: true, editable: false, prefixType: 'text', suffixType: 'text', separator: '至' },
47
47
  $vProgress: { strokeWidth: 20, strokeColor: ['#108ee9', '#87d068'], textInside: true, min: 0, max: 100, digits: 2 },
48
48
  $vSwitch: { placeholder: '请选择', openLabel: '是', openValue: '1', closeLabel: '否', closeValue: '0' },
49
49
  $vMoney: { type: 'number', placeholder: '请输入', transfer: true, commafy: true, digits: 2, moneyUnit: 1, min: 0, max: 1000000000000 },
@@ -27,6 +27,7 @@ export default function (props, context, proxy) {
27
27
  // 初始化数据
28
28
  const initData = () => {
29
29
  let keyValue = $vUtils.get(props.rdata, props.rkey)
30
+ if (keyValue && $vUtils.isEqual(keyValue, renderValue.value)) return
30
31
  formatValueFun(keyValue)
31
32
  }
32
33
 
@@ -98,10 +99,18 @@ export default function (props, context, proxy) {
98
99
  renderText.value = footerText
99
100
  return
100
101
  }
101
- let formatObj = $vUtils.formatRender(value, props.rkey, props.rdata, props.rname, props.rprops, proxy, editable)
102
- renderValue.value = ['$vMoney'].includes(props.rname) ? formatObj.rtext : formatObj.rvalue
103
- renderText.value = formatObj.rtext
104
- return formatObj
102
+ const { rvalue, rtext } = $vUtils.formatRender(value, props.rkey, props.rdata, props.rname, props.rprops, proxy, editable)
103
+ if (['$vMoney'].includes(props.rname)) {
104
+ renderValue.value = rtext
105
+ } else {
106
+ renderValue.value = rvalue
107
+ }
108
+ if (props.rname === '$vTime' && props.rprops.range && Array.isArray(rtext) && rtext.length > 0) {
109
+ renderText.value = `${rtext[0] || ''}${props.rprops.separator}${rtext[1] || ''}`
110
+ } else {
111
+ renderText.value = rtext
112
+ }
113
+ return { rvalue, rtext }
105
114
  }
106
115
  const getBillClass = bil => {
107
116
  return { basic: bil.fullText === '元', commafy: ['千', '百万', '十亿', '兆'].includes(bil.fullText) }