sh-view 2.8.10 → 2.8.12

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.10",
3
+ "version": "2.8.12",
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: '起始日期' },
@@ -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(() => {
@@ -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],
@@ -82,10 +82,6 @@
82
82
  <template #empty>
83
83
  <sh-empty :icon="emptyIcon" :content="emptyText"></sh-empty>
84
84
  </template>
85
- <template v-for="slot in tableSlots" #[slot]="scope">
86
- <!-- 以之前的名字命名插槽,同时把数据原样绑定 -->
87
- <slot :name="slot" v-bind="scope"></slot>
88
- </template>
89
85
  </vxe-grid>
90
86
  <!--导入弹窗-->
91
87
  <importModal v-if="importBindConfig.modalConfig.modelValue" v-bind="importBindConfig" @confirm="setImportData"></importModal>
@@ -103,12 +103,21 @@ export const getFieldRules = (ori, rules) => {
103
103
  }
104
104
  }
105
105
  // 转换生成新表头数据
106
- export const getTransfarFields = (oriArr = [], columnObj, isSearch) => {
106
+ export const getTransfarFields = (oriArr = [], { slots, columnObj, isSearch }) => {
107
107
  let rules = {}
108
108
  let columnsFlatArr = []
109
109
  let formItemsArr = []
110
110
  let columnsArr = $vUtils.mapTree(oriArr, ori => {
111
- let tar = Object.assign({}, columnObj, ori)
111
+ let slotObj = {}
112
+ // 将插槽转换为函数式
113
+ if (slots && ori.slots) {
114
+ Object.keys(ori.slots).forEach(slotKey => {
115
+ if ($vUtils.isString(ori.slots[slotKey])) {
116
+ $vUtils.set(slotObj, `slots.${slotKey}`, slots[ori.slots[slotKey]])
117
+ }
118
+ })
119
+ }
120
+ let tar = Object.assign({}, columnObj, ori, slotObj)
112
121
  if (ori.children && ori.children.length > 0) {
113
122
  tar.sortable = false
114
123
  tar.filter = false
@@ -259,7 +259,7 @@ export default function (props, context, proxy, isGrid) {
259
259
  selectionRows.value = selections
260
260
  }
261
261
  const updateExpended = () => {
262
- if (tableRef.value && tableTreeConfig.value.expandAll) {
262
+ if (tableRef.value && tableTreeConfig.value && tableTreeConfig.value.expandAll) {
263
263
  setTimeout(() => {
264
264
  tableRef.value.setAllTreeExpand(true)
265
265
  })
@@ -404,7 +404,7 @@ export default function (props, context, proxy, isGrid) {
404
404
 
405
405
  // 初始化生成新表头数据
406
406
  const initTableColumns = () => {
407
- let transResult = getTransfarFields(props.columns, tableColumnObjConfig.value, tableGlobalConfig.value.search)
407
+ let transResult = getTransfarFields(props.columns, { slots, columnObj: tableColumnObjConfig.value, isSearch: tableGlobalConfig.value.search })
408
408
  tableColumnsFlat.value = transResult.columnsFlatArr
409
409
  tableFormItems.value = transResult.formItemsArr
410
410
  tableColumnsFixed.value = transResult.columnsArr
@@ -71,10 +71,6 @@
71
71
  <template #empty>
72
72
  <sh-empty :icon="emptyIcon" :content="emptyText"></sh-empty>
73
73
  </template>
74
- <template v-for="slot in tableSlots" #[slot]="scope">
75
- <!-- 以之前的名字命名插槽,同时把数据原样绑定 -->
76
- <slot :name="slot" v-bind="scope"></slot>
77
- </template>
78
74
  </vxe-table>
79
75
  <div v-if="isFootSlot" ref="footSlotRef" v-resize="handleResize" class="sh-table-foot"><slot name="foot"></slot></div>
80
76
  <div v-if="isPagerSlot" ref="pagerSlotRef" v-resize="handleResize" class="sh-table-pager">
@@ -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>