lkt-table 1.3.21 → 1.3.23

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/dist/style.css CHANGED
@@ -1 +1 @@
1
- .lkt-table-page{display:flex;width:100%;flex-direction:column;gap:var(--lkt-table-page-gap)}.lkt-table-page-content-wrapper{display:grid;width:100%;flex-direction:column;gap:var(--lkt-table-page-gap)}.lkt-table{width:var(--lkt-table-width);font-family:var(--lkt-table-font-family),serif}.lkt-table .lkt-field{--lkt-field-font-size: var(--lkt-table-font-size-row)}.lkt-table>table{width:100%;max-width:100%;border-collapse:var(--lkt-table-border-collapse);border-radius:var(--lkt-table-border-radius);border-spacing:var(--lkt-table-border-spacing)}.lkt-table th,.lkt-table td{vertical-align:middle;text-align:var(--lkt-table-text-align);padding:var(--lkt-table-padding-row);font-size:var(--lkt-table-font-size-row);color:var(--lkt-table-color-row)}.lkt-table th{font-family:var(--lkt-table-font-family-header),serif;padding:var(--lkt-table-padding-header)}.lkt-table thead tr{background-color:var(--lkt-table-bg-header);position:sticky;top:0;z-index:1}.lkt-table tbody tr{background-color:var(--lkt-table-bg-row)}.lkt-table tbody tr:nth-child(odd){background-color:var(--lkt-table-bg-row-odd)}.lkt-table [data-sort=asc]>div,.lkt-table [data-sort=desc]>div{display:inline-block}.lkt-table [data-sort=asc]>div:after,.lkt-table [data-sort=desc]>div:after{font-family:var(--lkt-table-font-family-sort-icon),serif;display:inline-block;font-size:var(--lkt-table-font-size-sort-icon)}.lkt-table [data-sort=asc]>div:after{content:var(--lkt-table-sort-icon-content-asc)}.lkt-table [data-sort=desc]>div:after{content:var(--lkt-table-sort-icon-content-desc)}.lkt-table td[data-role=drag-indicator],.lkt-table td[data-role=invalid-drag-indicator]{width:var(--lkt-table-width-drag);height:40px;padding:0!important;position:relative;background:#eee;cursor:pointer}.lkt-table td[data-role=drag-indicator]:before,.lkt-table td[data-role=invalid-drag-indicator]:before{content:"";display:block;background:#d4d4d4;border-bottom:1px solid #848484;margin:auto;position:absolute;top:0;left:0;height:100%;width:100%}.lkt-table td[data-role=drag-indicator]:after,.lkt-table td[data-role=invalid-drag-indicator]:after{content:"…";color:#000;display:block;position:absolute;top:50%;left:60%;font-weight:700;width:15px;height:7px;transform:rotate(90deg);transform-origin:center center}[data-lkt=empty-table]{border:1px solid #ddd;border-radius:var(--lkt-table-border-radius);width:100%;padding:10px;background-color:#f8f7e5;font-family:var(--lkt-table-font-family);font-size:13px;color:#444;text-align:var(--lkt-table-text-align)}.sortable-chosen{border:var(--lkt-table-border-sortable-chosen)}.sortable-chosen.ghost{background:var(--lkt-table-bg-sortable-chosen-ghost)}.lkt-table td.lkt-table-nav-cell{padding:0}.lkt-table-nav-container{display:flex;align-items:center;flex-direction:column;justify-content:center}.lkt-table-page-buttons{position:sticky;top:calc(-1 * var(--lkt-table-gap-buttons));display:flex;align-items:center;gap:var(--lkt-table-gap-buttons);transition:all linear .15s;background:transparent;z-index:2}.lkt-table-page-buttons-bottom{justify-content:center}.lkt-table-page-buttons>.switch-edition-mode{margin-left:auto}.lkt-table .lkt-table-col-drop{width:var(--lkt-table-width-col-drop);text-align:var(--lkt-table-text-align-col-drop)}
1
+ .lkt-table-page{display:flex;width:100%;flex-direction:column;gap:var(--lkt-table-page-gap)}.lkt-table-page-content-wrapper{display:grid;width:100%;flex-direction:column;gap:var(--lkt-table-page-gap)}.lkt-table{width:var(--lkt-table-width);font-family:var(--lkt-table-font-family),serif}.lkt-table .lkt-field{--lkt-field-font-size: var(--lkt-table-font-size-row)}.lkt-table>table{width:100%;max-width:100%;border-collapse:var(--lkt-table-border-collapse);border-radius:var(--lkt-table-border-radius);border-spacing:var(--lkt-table-border-spacing)}.lkt-table th,.lkt-table td{vertical-align:middle;text-align:var(--lkt-table-text-align);padding:var(--lkt-table-padding-row);font-size:var(--lkt-table-font-size-row);color:var(--lkt-table-color-row)}.lkt-table th{font-family:var(--lkt-table-font-family-header),serif;padding:var(--lkt-table-padding-header)}.lkt-table thead tr{background-color:var(--lkt-table-bg-header);position:sticky;top:0;z-index:1}.lkt-table tbody tr{background-color:var(--lkt-table-bg-row)}.lkt-table tbody tr:nth-child(odd){background-color:var(--lkt-table-bg-row-odd)}.lkt-table [data-sort=asc]>div,.lkt-table [data-sort=desc]>div{display:inline-block}.lkt-table [data-sort=asc]>div:after,.lkt-table [data-sort=desc]>div:after{font-family:var(--lkt-table-font-family-sort-icon),serif;display:inline-block;font-size:var(--lkt-table-font-size-sort-icon)}.lkt-table [data-sort=asc]>div:after{content:var(--lkt-table-sort-icon-content-asc)}.lkt-table [data-sort=desc]>div:after{content:var(--lkt-table-sort-icon-content-desc)}.lkt-table td[data-role=drag-indicator],.lkt-table td[data-role=invalid-drag-indicator]{width:var(--lkt-table-width-drag);height:40px;padding:0!important;position:relative;background:#eee;cursor:pointer}.lkt-table td[data-role=drag-indicator]:before,.lkt-table td[data-role=invalid-drag-indicator]:before{content:"";display:block;background:#d4d4d4;border-bottom:1px solid #848484;margin:auto;position:absolute;top:0;left:0;height:100%;width:100%}.lkt-table td[data-role=drag-indicator]:after,.lkt-table td[data-role=invalid-drag-indicator]:after{content:"…";color:#000;display:block;position:absolute;top:50%;left:60%;font-weight:700;width:15px;height:7px;transform:rotate(90deg);transform-origin:center center}[data-lkt=empty-table]{border:1px solid #ddd;border-radius:var(--lkt-table-border-radius);width:100%;padding:10px;background-color:#f8f7e5;font-family:var(--lkt-table-font-family);font-size:13px;color:#444;text-align:var(--lkt-table-text-align)}.sortable-chosen{border:var(--lkt-table-border-sortable-chosen)}.sortable-chosen.ghost{background:var(--lkt-table-bg-sortable-chosen-ghost)}.lkt-table td.lkt-table-nav-cell{padding:0}.lkt-table-nav-container{display:flex;align-items:center;flex-direction:column;justify-content:center}.lkt-table-page-buttons{position:sticky;top:calc(-1 * var(--lkt-table-gap-buttons));display:flex;align-items:center;gap:var(--lkt-table-gap-buttons);transition:all linear .15s;background:transparent;z-index:6}.lkt-table-page-buttons-bottom{justify-content:center}.lkt-table-page-buttons>.switch-edition-mode{margin-left:auto}.lkt-table .lkt-table-col-drop{width:var(--lkt-table-width-col-drop);text-align:var(--lkt-table-text-align-col-drop)}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lkt-table",
3
- "version": "1.3.21",
3
+ "version": "1.3.23",
4
4
  "description": "",
5
5
  "keywords": [
6
6
  "lkt",
@@ -40,8 +40,9 @@ const props = withDefaults(defineProps<{
40
40
  editText: string
41
41
  editIcon: string
42
42
  editLink: string
43
- rowDisplayType: RowDisplayType|Function
44
- renderDrag?: boolean
43
+ rowDisplayType: RowDisplayType | Function
44
+ renderDrag?: boolean | Function
45
+ disabledDrag?: boolean | Function
45
46
  }>(), {
46
47
  modelValue: () => ({}),
47
48
  isDraggable: true,
@@ -65,6 +66,7 @@ const props = withDefaults(defineProps<{
65
66
  editLink: '',
66
67
  rowDisplayType: RowDisplayType.Auto,
67
68
  renderDrag: true,
69
+ disabledDrag: true,
68
70
  });
69
71
 
70
72
  const Item = ref(props.modelValue);
@@ -76,15 +78,20 @@ const canCustomItem = [RowDisplayType.Auto, RowDisplayType.PreferCustomItem].inc
76
78
  const canItem = [RowDisplayType.Auto, RowDisplayType.PreferItem].includes(calculatedRowDisplayType);
77
79
 
78
80
  const parsedEditLink = ref(props.editLink);
79
- for (let k in Item.value) parsedEditLink.value = replaceAll(parsedEditLink.value, ':'+k , Item.value[k]);
81
+ for (let k in Item.value) parsedEditLink.value = replaceAll(parsedEditLink.value, ':' + k, Item.value[k]);
80
82
 
81
83
  const onClick = ($event: any) => emit('click', $event),
82
84
  onShow = ($event: any, i: any) => {
83
85
  emit('show', $event, i)
84
86
  },
85
87
  classes = computed(() => {
86
- let r:string[] = [];
87
- if (props.sortable && props.isDraggable) r.push('handle');
88
+ let r: string[] = [];
89
+
90
+ let disabledDrag = false;
91
+ if (typeof props.disabledDrag === 'function') disabledDrag = props.disabledDrag(Item.value);
92
+ else disabledDrag = props.disabledDrag === true;
93
+ if (!disabledDrag && props.sortable && props.isDraggable) r.push('handle');
94
+ else if (disabledDrag) r.push('disabled');
88
95
  return r.join(' ');
89
96
  }),
90
97
  hasNavButtonSlot = computed(() => {
@@ -113,14 +120,19 @@ watch(Item, (v) => {
113
120
  }, {deep: true});
114
121
 
115
122
  const canRenderDragIndicator = computed(() => {
116
- if (typeof props.renderDrag === 'function') return props.renderDrag(Item.value);
117
- return props.renderDrag === true;
118
- })
123
+ if (typeof props.renderDrag === 'function') return props.renderDrag(Item.value);
124
+ return props.renderDrag === true;
125
+ }),
126
+ computedDisabledDrag = computed(() => {
127
+ if (typeof props.disabledDrag === 'function') return props.disabledDrag(Item.value);
128
+ return props.disabledDrag === true;
129
+ })
119
130
  </script>
120
131
 
121
132
  <template>
122
133
  <tr :data-i="i" :data-draggable="isDraggable" :class="{'type-custom-item': canCustomItem, 'type-item': canItem}">
123
- <td v-if="sortable && isDraggable && editModeEnabled && canRenderDragIndicator" data-role="drag-indicator" :class="classes" />
134
+ <td v-if="sortable && isDraggable && editModeEnabled && canRenderDragIndicator"
135
+ data-role="drag-indicator" :class="classes" :data-i="i"/>
124
136
  <td v-else-if="sortable && editModeEnabled && canRenderDragIndicator" data-role="invalid-drag-indicator"/>
125
137
  <td v-if="addNavigation && editModeEnabled" class="lkt-table-nav-cell">
126
138
  <div class="lkt-table-nav-container">
@@ -45,6 +45,7 @@ const props = withDefaults(defineProps<{
45
45
  draggableChecker?: Function
46
46
  checkValidDrag?: Function
47
47
  renderDrag?: boolean|Function
48
+ disabledDrag?: boolean|Function
48
49
  sortable?: boolean
49
50
  hideEmptyColumns?: boolean
50
51
  initialSorting?: boolean
@@ -74,6 +75,8 @@ const props = withDefaults(defineProps<{
74
75
  confirmData?: LktObject
75
76
  saveResource?: string
76
77
  saveResourceData?: LktObject
78
+ saveTooltipEngine?: string
79
+ splitSave?: boolean
77
80
  saveText?: string
78
81
  createText?: string
79
82
  createIcon?: string
@@ -126,6 +129,7 @@ const props = withDefaults(defineProps<{
126
129
  wrapContentTag: 'div',
127
130
  wrapContentClass: '',
128
131
  itemsContainerClass: '',
132
+ saveTooltipEngine: 'absolute',
129
133
  filters: () => [],
130
134
  dataStateConfig: () => ({}),
131
135
  hiddenSave: false,
@@ -136,6 +140,7 @@ const props = withDefaults(defineProps<{
136
140
  confirmData: () => ({}),
137
141
  saveResource: '',
138
142
  saveResourceData: () => ({}),
143
+ splitSave: false,
139
144
  saveText: 'Save',
140
145
  dropText: 'Delete',
141
146
  dropIcon: '',
@@ -370,6 +375,9 @@ const getItemByEvent = (e: any) => {
370
375
  Hidden.value[k] = typeof Hidden.value[k] === 'undefined' ? true : !Hidden.value[k];
371
376
  },
372
377
  validDragChecker = (evt: any) => {
378
+ let targetIndex = parseInt(evt?.originalEvent?.toElement?.closest('tr')?.dataset?.i);
379
+ if (typeof props.disabledDrag === 'function' && props.disabledDrag(Items.value[targetIndex])) return false;
380
+ if (typeof props.disabledDrag === 'boolean' && props.disabledDrag) return false;
373
381
  if (typeof props.checkValidDrag === 'function') return props.checkValidDrag(evt);
374
382
  return true;
375
383
  },
@@ -463,7 +471,7 @@ const getItemByEvent = (e: any) => {
463
471
  let newIndex = evt.newIndex;
464
472
  Items.value.splice(newIndex, 0, Items.value.splice(oldIndex, 1)[0]);
465
473
  updateTimeStamp.value = time();
466
- emit('drag-end');
474
+ emit('drag-end', Items.value[newIndex]);
467
475
  },
468
476
  onMove: function (evt, originalEvent) {
469
477
  return validDragChecker(evt);
@@ -582,6 +590,8 @@ const hasEmptySlot = computed(() => {
582
590
  :confirm-data="confirmData"
583
591
  :resource="saveResource"
584
592
  :resource-data="computedSaveResourceData"
593
+ :split="splitSave"
594
+ :tooltip-engine="saveTooltipEngine"
585
595
  v-on:loading="onButtonLoading"
586
596
  v-on:loaded="onButtonLoaded"
587
597
  v-on:click="onSave">
@@ -591,6 +601,15 @@ const hasEmptySlot = computed(() => {
591
601
  :edit-mode="editMode"
592
602
  :can-update="!saveDisabled"></slot>
593
603
  <span v-else>{{ computedSaveText }}</span>
604
+
605
+ <template v-slot:split="{doClose, doRootClick}">
606
+ <slot name="button-save-split"
607
+ :do-close="doClose"
608
+ :do-root-click="doRootClick"
609
+ :data-state="dataState"
610
+ :on-button-loading="onButtonLoading"
611
+ :on-button-loaded="onButtonLoaded" />
612
+ </template>
594
613
  </lkt-button>
595
614
 
596
615
  <create-button
@@ -685,6 +704,7 @@ const hasEmptySlot = computed(() => {
685
704
  :has-inline-edit-perm="hasInlineEditPerm"
686
705
  :row-display-type="rowDisplayType"
687
706
  :render-drag="renderDrag"
707
+ :disabled-drag="disabledDrag"
688
708
  v-on:click="onClick"
689
709
  v-on:show="show"
690
710
  v-on:item-up="onItemUp"