@itfin/components 1.4.40 → 1.5.1

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.
Files changed (187) hide show
  1. package/package.json +17 -20
  2. package/src/ITFSettings.js +6 -0
  3. package/src/assets/scss/components/_button.scss +118 -0
  4. package/src/assets/scss/components/_text-field.scss +22 -8
  5. package/src/components/alert/AlertBanner.vue +75 -0
  6. package/src/components/app/App.vue +6 -3
  7. package/src/components/button/Button.vue +3 -1
  8. package/src/components/button/NativeButton.js +4 -0
  9. package/src/components/button/index.stories.js +2 -2
  10. package/src/components/checkbox/Checkbox.vue +2 -1
  11. package/src/components/checkbox/RadioBox.vue +13 -7
  12. package/src/components/copyToClipboard/CopyToClipboard.vue +4 -1
  13. package/src/components/customize/PropertiesList.vue +0 -2
  14. package/src/components/customize/PropertiesPopupMenu.vue +1 -1
  15. package/src/components/customize/PropertyItem.vue +6 -24
  16. package/src/components/datepicker/DatePicker.vue +3 -1
  17. package/src/components/datepicker/DatePickerInline.vue +2 -2
  18. package/src/components/datepicker/DateRangePickerInline.vue +6 -1
  19. package/src/components/dropdown/Dropdown.vue +1 -1
  20. package/src/components/dropdown/DropdownMenu.vue +1 -1
  21. package/src/components/editable/EditButton.vue +1 -1
  22. package/src/components/editor/plugins.js +1012 -0
  23. package/src/components/filter/FilterBadge.vue +17 -3
  24. package/src/components/filter/FilterFacetsList.vue +67 -13
  25. package/src/components/filter/FilterPanel.vue +8 -21
  26. package/src/components/filter/NewFilter.vue +305 -0
  27. package/src/components/form/Label.vue +5 -5
  28. package/src/components/icon/components/nomi-ai-alt.vue +5 -0
  29. package/src/components/icon/components/nomi-bell.vue +5 -0
  30. package/src/components/icon/components/nomi-budget.vue +4 -0
  31. package/src/components/icon/components/nomi-calendar-payment.vue +10 -0
  32. package/src/components/icon/components/nomi-card-plus.vue +1 -0
  33. package/src/components/icon/components/nomi-cash-provider.vue +9 -0
  34. package/src/components/icon/components/nomi-category-edit.vue +5 -0
  35. package/src/components/icon/components/nomi-delta.vue +7 -0
  36. package/src/components/icon/components/nomi-exit-right.vue +4 -0
  37. package/src/components/icon/components/nomi-help.vue +2 -3
  38. package/src/components/icon/components/nomi-lock.vue +1 -1
  39. package/src/components/icon/components/nomi-project.vue +2 -2
  40. package/src/components/icon/components/nomi-refresh-off.vue +4 -0
  41. package/src/components/icon/components/nomi-refresh.vue +4 -0
  42. package/src/components/icon/components/nomi-scissors.vue +1 -1
  43. package/src/components/icon/components/nomi-start.vue +28 -0
  44. package/src/components/icon/components/nomi-table-view.vue +1 -4
  45. package/src/components/icon/components/nomi-transactions-delete.vue +5 -0
  46. package/src/components/icon/components/nomi-type-array.vue +6 -0
  47. package/src/components/icon/components/nomi-type-boolean.vue +5 -0
  48. package/src/components/icon/components/nomi-type-date.vue +4 -0
  49. package/src/components/icon/components/nomi-type-null.vue +4 -0
  50. package/src/components/icon/components/nomi-type-number.vue +4 -0
  51. package/src/components/icon/components/nomi-type-object.vue +4 -0
  52. package/src/components/icon/components/nomi-type-string.vue +4 -0
  53. package/src/components/icon/components/nomi-unarchive.vue +17 -0
  54. package/src/components/icon/components/nomi-unlink.vue +10 -0
  55. package/src/components/icon/components/nomi-user.vue +3 -3
  56. package/src/components/icon/components/nomi-warning-triangle.vue +6 -0
  57. package/src/components/icon/components/nomi-warning_triangle_filled.vue +6 -0
  58. package/src/components/icon/convert-icons.js +3 -0
  59. package/src/components/icon/icons.js +390 -312
  60. package/src/components/icon/new-icons/ai-alt.svg +4 -0
  61. package/src/components/icon/new-icons/arrow-right-alt.svg +3 -0
  62. package/src/components/icon/new-icons/arrow-right.svg +3 -0
  63. package/src/components/icon/new-icons/arrow_left.svg +3 -0
  64. package/src/components/icon/new-icons/automation.svg +4 -0
  65. package/src/components/icon/new-icons/balance.svg +3 -0
  66. package/src/components/icon/new-icons/balance_turnover.svg +4 -0
  67. package/src/components/icon/new-icons/bar-horizontal.svg +6 -0
  68. package/src/components/icon/new-icons/bell.svg +4 -0
  69. package/src/components/icon/new-icons/calendar-payment.svg +9 -0
  70. package/src/components/icon/new-icons/card-plus.svg +1 -0
  71. package/src/components/icon/new-icons/cash-provider.svg +8 -0
  72. package/src/components/icon/new-icons/cash-repeat.svg +5 -0
  73. package/src/components/icon/new-icons/cash.svg +3 -0
  74. package/src/components/icon/new-icons/cashflow.svg +3 -0
  75. package/src/components/icon/new-icons/category-edit.svg +4 -0
  76. package/src/components/icon/new-icons/category.svg +4 -0
  77. package/src/components/icon/new-icons/category_alt.svg +3 -0
  78. package/src/components/icon/new-icons/chart-bars.svg +5 -0
  79. package/src/components/icon/new-icons/chart-donut.svg +3 -0
  80. package/src/components/icon/new-icons/chart-funnel.svg +5 -0
  81. package/src/components/icon/new-icons/chart-kpi.svg +7 -0
  82. package/src/components/icon/new-icons/chart-line.svg +4 -0
  83. package/src/components/icon/new-icons/chart-lines.svg +5 -0
  84. package/src/components/icon/new-icons/check-alt.svg +3 -0
  85. package/src/components/icon/new-icons/check.svg +3 -0
  86. package/src/components/icon/new-icons/chevron-down.svg +3 -0
  87. package/src/components/icon/new-icons/chevron-left.svg +3 -0
  88. package/src/components/icon/new-icons/chevron-right.svg +3 -0
  89. package/src/components/icon/new-icons/chevron-up.svg +3 -0
  90. package/src/components/icon/new-icons/collapse.svg +6 -0
  91. package/src/components/icon/new-icons/control-panel.svg +7 -0
  92. package/src/components/icon/new-icons/credit.svg +3 -0
  93. package/src/components/icon/new-icons/currencies.svg +3 -0
  94. package/src/components/icon/new-icons/debt.svg +3 -0
  95. package/src/components/icon/new-icons/delta.svg +6 -0
  96. package/src/components/icon/new-icons/demo.svg +6 -0
  97. package/src/components/icon/new-icons/dev.svg +3 -0
  98. package/src/components/icon/new-icons/dots.svg +5 -0
  99. package/src/components/icon/new-icons/duplicate.svg +4 -0
  100. package/src/components/icon/new-icons/exit-right.svg +3 -0
  101. package/src/components/icon/new-icons/export.svg +3 -0
  102. package/src/components/icon/new-icons/file.svg +3 -0
  103. package/src/components/icon/new-icons/folder.svg +3 -0
  104. package/src/components/icon/new-icons/goods-turnover.svg +3 -0
  105. package/src/components/icon/new-icons/goods.svg +4 -0
  106. package/src/components/icon/new-icons/help-alt.svg +3 -0
  107. package/src/components/icon/new-icons/help.svg +2 -3
  108. package/src/components/icon/new-icons/history.svg +6 -0
  109. package/src/components/icon/new-icons/integration.svg +3 -0
  110. package/src/components/icon/new-icons/link.svg +5 -0
  111. package/src/components/icon/new-icons/lock.svg +1 -1
  112. package/src/components/icon/new-icons/menu.svg +5 -0
  113. package/src/components/icon/new-icons/minus.svg +3 -0
  114. package/src/components/icon/new-icons/payment_calendar.svg +3 -0
  115. package/src/components/icon/new-icons/pc.svg +3 -0
  116. package/src/components/icon/new-icons/pen-alt.svg +3 -0
  117. package/src/components/icon/new-icons/planFact.svg +4 -0
  118. package/src/components/icon/new-icons/pnl.svg +7 -0
  119. package/src/components/icon/new-icons/project.svg +2 -2
  120. package/src/components/icon/new-icons/project_alt.svg +3 -0
  121. package/src/components/icon/new-icons/project_alt2.svg +3 -0
  122. package/src/components/icon/new-icons/promo.svg +3 -0
  123. package/src/components/icon/new-icons/refresh-off.svg +3 -0
  124. package/src/components/icon/new-icons/refresh.svg +3 -0
  125. package/src/components/icon/new-icons/scissors.svg +1 -1
  126. package/src/components/icon/new-icons/segment.svg +3 -0
  127. package/src/components/icon/new-icons/start.svg +27 -0
  128. package/src/components/icon/new-icons/strongbox.svg +3 -0
  129. package/src/components/icon/new-icons/subscription.svg +3 -0
  130. package/src/components/icon/new-icons/table-view.svg +1 -4
  131. package/src/components/icon/new-icons/time.svg +3 -0
  132. package/src/components/icon/new-icons/transactions_alt.svg +6 -0
  133. package/src/components/icon/new-icons/transactions_delete.svg +4 -0
  134. package/src/components/icon/new-icons/type-array.svg +5 -0
  135. package/src/components/icon/new-icons/type-boolean.svg +4 -0
  136. package/src/components/icon/new-icons/type-date.svg +3 -0
  137. package/src/components/icon/new-icons/type-null.svg +3 -0
  138. package/src/components/icon/new-icons/type-number.svg +3 -0
  139. package/src/components/icon/new-icons/type-object.svg +3 -0
  140. package/src/components/icon/new-icons/type-string.svg +3 -0
  141. package/src/components/icon/new-icons/types.svg +6 -0
  142. package/src/components/icon/new-icons/unarchive.svg +16 -0
  143. package/src/components/icon/new-icons/unlink.svg +9 -0
  144. package/src/components/icon/new-icons/user.svg +3 -3
  145. package/src/components/icon/new-icons/user_plus.svg +10 -0
  146. package/src/components/icon/new-icons/warehouse.svg +3 -0
  147. package/src/components/icon/new-icons/warning_triangle.svg +5 -0
  148. package/src/components/icon/new-icons/warning_triangle_filled.svg +5 -0
  149. package/src/components/kanban/BoardCard.vue +1 -1
  150. package/src/components/kanban/BoardCardTimer.vue +1 -1
  151. package/src/components/modal/DeleteConfirmModal.vue +10 -6
  152. package/src/components/modal/ItemEditor.vue +1 -1
  153. package/src/components/modal/Modal.vue +1 -1
  154. package/src/components/overlay/SensitiveOverlay.vue +2 -4
  155. package/src/components/panels/Panel.vue +110 -23
  156. package/src/components/panels/PanelItemEdit.vue +8 -6
  157. package/src/components/panels/PanelList.vue +164 -40
  158. package/src/components/panels/helpers.ts +41 -13
  159. package/src/components/popover/Popover.vue +105 -22
  160. package/src/components/segmented-control/SegmentedControl.vue +9 -3
  161. package/src/components/sortable/draggable.js +1 -1
  162. package/src/components/table/Table2.vue +68 -67
  163. package/src/components/table/TableBody.vue +17 -22
  164. package/src/components/table/TableGroup.vue +40 -24
  165. package/src/components/table/TableHeader.vue +86 -81
  166. package/src/components/table/TableRowToggle.vue +1 -9
  167. package/src/components/table/TableRows.vue +49 -55
  168. package/src/components/table/mobile.js +4 -0
  169. package/src/components/table/table2.scss +34 -15
  170. package/src/components/text-field/MoneyField.vue +10 -4
  171. package/src/components/text-field/TextField.vue +17 -8
  172. package/src/components/tree/TreeEditor.vue +3 -2
  173. package/src/components/view/View.vue +80 -207
  174. package/src/directives/appendToBody.js +1 -0
  175. package/src/helpers/validators.js +9 -35
  176. package/src/helpers/validators.spec.js +11 -48
  177. package/src/locales/en.js +4 -6
  178. package/src/locales/pl.js +158 -0
  179. package/src/locales/uk.js +6 -7
  180. package/src/components/icon/components/nomi-calendar-view.vue +0 -4
  181. package/src/components/icon/components/nomi-kanban-view.vue +0 -6
  182. package/src/components/icon/components/nomi-list-view.vue +0 -7
  183. package/src/components/icon/components/nomi-table-config.vue +0 -9
  184. package/src/components/icon/new-icons/calendar-view.svg +0 -3
  185. package/src/components/icon/new-icons/kanban-view.svg +0 -5
  186. package/src/components/icon/new-icons/list-view.svg +0 -6
  187. package/src/components/icon/new-icons/table-config.svg +0 -8
@@ -24,20 +24,26 @@ export default @Component({
24
24
  class itfPopover extends Vue {
25
25
  @PropSync('visible') value;
26
26
 
27
- @Prop({ type: String, default: 'bottom', validator: (value) => ['bottom', 'left', 'right', 'top'].includes(value) }) placement;
27
+ @Prop({ type: String, default: 'bottom', validator: (value) => ['bottom', 'left', 'right', 'top', 'auto'].includes(value) }) placement;
28
28
 
29
29
  @Prop({ type: String, default: 'click', validator: (value) => ['click', 'focus', 'hover', 'manual'].includes(value) }) trigger;
30
30
 
31
31
  @Prop({ type: String, default: '' }) customClass;
32
+ @Prop({ type: Boolean }) appendToBody;
33
+ @Prop({ type: Boolean }) appendToContext;
34
+ @Prop({ type: String }) locator;
35
+ @Prop({ type: Boolean, default: false }) isActivatorHighlighted;
32
36
 
33
37
  modalId = '';
34
-
35
38
  modalEl = null;
39
+ targetEl = null;
36
40
 
37
41
  ignoreUpdate = false; // потрібно щоб не оновлювалось visible декілька разів, бо буде баг коли вікно відкривається і одразу закривається
38
42
 
43
+ initTimeout = null;
44
+
39
45
  beforeDestroy() {
40
- this.hide();
46
+ this.destroy();
41
47
  }
42
48
 
43
49
  @Watch('value')
@@ -46,9 +52,26 @@ class itfPopover extends Vue {
46
52
  return;
47
53
  }
48
54
  if (newValue) {
49
- this.modalEl.show();
55
+ this.modalEl?.show();
56
+ } else {
57
+ this.modalEl?.hide();
58
+ }
59
+ }
60
+
61
+ @Watch('locator')
62
+ onLocatorChanged(newValue, oldValue) {
63
+ if (newValue !== oldValue && newValue && this.modalEl) {
64
+ this.initPopover();
65
+ }
66
+ }
67
+
68
+ @Watch('isActivatorHighlighted')
69
+ onIsActivatorHighlightedChanged(newValue, oldValue) {
70
+ if (!this.targetEl) return;
71
+ if (newValue) {
72
+ this.targetEl.classList.add('pulsing');
50
73
  } else {
51
- this.modalEl.hide();
74
+ this.targetEl.classList.remove('pulsing');
52
75
  }
53
76
  }
54
77
 
@@ -58,14 +81,62 @@ class itfPopover extends Vue {
58
81
  }
59
82
 
60
83
  async mounted() {
84
+ this.refresh(100);
85
+ }
86
+
87
+ destroy() {
88
+ if (this.initTimeout) {
89
+ clearTimeout(this.initTimeout);
90
+ this.initTimeout = null;
91
+ }
92
+ if (this.modalEl) {
93
+ this.modalEl.dispose();
94
+ this.modalEl = null;
95
+ }
96
+ if (this.targetEl) this.resetTargetEl();
97
+ }
98
+
99
+ refresh(delay = 300) {
100
+ this.destroy();
101
+
102
+ if (this.initTimeout) clearTimeout(this.initTimeout);
103
+ this.initTimeout = setTimeout(() => this.initPopover(), delay);
104
+ }
105
+
106
+ async initPopover() {
61
107
  if (typeof window === 'undefined') {
62
108
  return;
63
109
  }
64
- const el = this.$refs.popover;
110
+
111
+ // Remove listeners from the previous target element before finding the new one
112
+ if (this.modalEl) this.destroy();
113
+
114
+ // Determine target
115
+ if (this.locator) {
116
+ this.targetEl = document.querySelector(this.locator);
117
+ if (!this.targetEl) return;
118
+ } else {
119
+ this.targetEl = this.$el;
120
+ }
121
+
122
+ if (this.isActivatorHighlighted) this.targetEl.classList.add('pulsing');
123
+
124
+ const el = this.$refs.popover || "";
65
125
  const { default: Popover } = await import('bootstrap/js/src/popover');
66
126
 
67
- const context = this.$el.closest('.itf-append-context') || document.body;
68
- this.modalEl = new Popover(this.$el, {
127
+ if (this._isDestroyed) return;
128
+
129
+ let context = document.body;
130
+ if (this.appendToContext && this.targetEl instanceof Node && this.targetEl.parentNode) {
131
+ context = this.targetEl.closest('.itf-append-context') || document.body;
132
+ this.targetEl.parentNode.removeChild(this.targetEl);
133
+ context.appendChild(this.targetEl); // should append only to body
134
+ } else if (this.appendToBody && this.targetEl instanceof Node && this.targetEl.parentNode) {
135
+ this.targetEl.parentNode.removeChild(this.targetEl);
136
+ context.appendChild(this.targetEl); // should append only to body
137
+ }
138
+
139
+ this.modalEl = new Popover(this.targetEl, {
69
140
  content: el,
70
141
  container: context,
71
142
  sanitize: false,
@@ -74,26 +145,38 @@ class itfPopover extends Vue {
74
145
  placement: this.placement,
75
146
  trigger: this.trigger,
76
147
  });
148
+
77
149
  this.onVisibleChanged(this.value);
78
- this.$el.addEventListener('shown.bs.popover', () => {
79
- this.ignoreUpdate = true;
80
- this.value = true;
81
- document.body.addEventListener('click', this.clickOutside);
82
- this.$nextTick(() => this.ignoreUpdate = false);
83
- });
84
- this.$el.addEventListener('hidden.bs.popover', () => {
85
- this.ignoreUpdate = true;
86
- this.value = false;
87
- document.body.removeEventListener('click', this.clickOutside);
88
- this.$nextTick(() => this.ignoreUpdate = false);
89
- });
150
+ this.targetEl.addEventListener('shown.bs.popover', this.handleShown);
151
+ this.targetEl.addEventListener('hidden.bs.popover', this.handleHidden);
152
+ }
153
+
154
+ resetTargetEl() {
155
+ this.targetEl.removeEventListener('shown.bs.popover', this.handleShown);
156
+ this.targetEl.removeEventListener('hidden.bs.popover', this.handleHidden);
157
+ this.targetEl.classList.remove('pulsing');
158
+ this.targetEl = null;
159
+ }
160
+
161
+ handleShown() {
162
+ this.ignoreUpdate = true;
163
+ this.value = true;
164
+ document.body.addEventListener('click', this.clickOutside);
165
+ this.$nextTick(() => this.ignoreUpdate = false);
166
+ }
167
+
168
+ handleHidden() {
169
+ this.ignoreUpdate = true;
170
+ this.value = false;
171
+ document.body.removeEventListener('click', this.clickOutside);
172
+ this.$nextTick(() => this.ignoreUpdate = false);
90
173
  }
91
174
 
92
175
  clickOutside(e) {
93
176
  if (this.trigger !== 'click' || !e.target) {
94
177
  return;
95
178
  }
96
- if (this.$el !== e.target && e.target.closest('.itf-popover') !== this.$refs.popover) {
179
+ if (this.targetEl !== e.target && e.target.closest('.itf-popover') !== this.$refs.popover) {
97
180
  this.hide();
98
181
  }
99
182
  }
@@ -107,7 +190,7 @@ class itfPopover extends Vue {
107
190
  hide() {
108
191
  if (this.modalEl) {
109
192
  // треба затримка щоб попав не показався знову через отримання фокусу
110
- setTimeout(() => this.modalEl.hide(), 10);
193
+ setTimeout(() => this.modalEl?.hide(), 10);
111
194
  }
112
195
  }
113
196
  }
@@ -1,17 +1,17 @@
1
1
  <template>
2
2
  <div>
3
- <div class="itf-segmeneted-control d-none d-lg-grid">
3
+ <div class="itf-segmeneted-control d-none d-lg-grid" :class="{'small': small}">
4
4
  <span v-if="!isUndefined" ref="slider" class="selection" :class="{'elevation-1': !disabled}"></span>
5
5
 
6
6
  <div class="option" v-for="(item, n) in itemsWithNames" :key="n">
7
- <label>
7
+ <label v-tooltip="tooltipCallback(item)" :key="n" :class="{'disabled': disabled || item[itemDisabled]}">
8
8
  <slot name="itemMarkup" :item="item" />
9
9
  <input
10
10
  ref="input"
11
11
  type="radio"
12
12
  :name="name"
13
13
  :value="n"
14
- v-tooltip="tooltipCallback(item)"
14
+ :disabled="disabled || item[itemDisabled]"
15
15
  :checked="isChecked(item)"
16
16
  @change="onItemChanged(item)" />
17
17
  <span>
@@ -24,6 +24,7 @@
24
24
  <itf-select
25
25
  :value="value"
26
26
  @input="$emit('input', $event)"
27
+ :disabled="disabled"
27
28
  :options="itemsWithNames"
28
29
  :reduce="(item) => item[itemKey]"
29
30
  :get-option-label="(item) => item[itemText]"
@@ -50,8 +51,10 @@ class itfSegmentedControl extends Vue {
50
51
  @Prop({ type: Array, required: true }) items;
51
52
  @Prop({ type: String, default: 'Id' }) itemKey;
52
53
  @Prop({ type: String, default: 'Name' }) itemText;
54
+ @Prop({ type: String, default: 'Disabled' }) itemDisabled;
53
55
  @Prop({ type: Boolean, default: false }) returnObject;
54
56
  @Prop({ type: Boolean, default: false }) disabled;
57
+ @Prop({ type: Boolean, default: false }) small;
55
58
  @Prop({ type: Function, default: () => null }) tooltipCallback;
56
59
 
57
60
  timers = [];
@@ -127,6 +130,9 @@ class itfSegmentedControl extends Vue {
127
130
  }
128
131
 
129
132
  onItemChanged (item) {
133
+ if (this.disabled) {
134
+ return;
135
+ }
130
136
  this.$emit('input', this.returnObject ? item : item[this.itemKey]);
131
137
  }
132
138
  }
@@ -7,7 +7,7 @@ const SORTABLE_ATTRIBUTES = ['drag-ignore-handle', 'scrollable'];
7
7
 
8
8
  const DEFAULT_OPTIONS = {
9
9
  draggableClass: DRAGGABLE_CLASS,
10
- dragHandleClass: DRAG_HANDLE_CLASS,
10
+ // dragHandleClass: DRAG_HANDLE_CLASS,
11
11
  delay: 200,
12
12
  tresholdDistance: 2,
13
13
  draggable: `.${DRAGGABLE_CLASS}`,
@@ -7,9 +7,11 @@
7
7
  'permanent-checkboxes': selectedIds.length
8
8
  }" :style="{ '--indicator-area-width': `${indicatorType === 'none' ? 1 : indicatorWidth}px`, '--shadow-area-width': `${shadowWidth}px` }">
9
9
  <itf-notice-popout :visible="showGroupOperations" class="rounded-3 bg-black text-white">
10
- <div class="d-flex gap-2 ps-3 align-items-center small itf-table2_mass-operations">
11
- <div>{{$tc('components.table.selectedItems', selectedIds.length, { n: selectedIds.length })}}</div>
12
- <div class="opacity-50">•</div>
10
+ <div class="d-flex gap-2 ps-2 align-items-center small itf-table2_mass-operations">
11
+ <slot name="group-operations-count">
12
+ <div>{{$tc('components.table.selectedItems', selectedIds.length, { n: selectedIds.length })}}</div>
13
+ <div class="opacity-50">•</div>
14
+ </slot>
13
15
  <a href="" class="me-3 opacity-50 text-white text-decoration-none" @click.stop.prevent="selectedIds = []">{{$t('components.table.cancelSelected')}}</a>
14
16
  <div>
15
17
  <slot name="group-operations"></slot>
@@ -17,64 +19,64 @@
17
19
  </div>
18
20
  </itf-notice-popout>
19
21
  <div class="scrollable scrollable-x">
20
- <itf-checkbox-group v-model="selectedIds">
21
- <template v-for="(group, index) in groups">
22
- <div class="table-view-body">
23
- <itf-table-group
24
- :key="index"
25
- @update="$emit('update', { ...$event, group, groupIndex: index })"
26
- @row-click="$emit('row-click', $event)"
27
- :id-property="idProperty"
28
- :columns="columns"
29
- @update:columns="onColumnsUpdate"
30
- :rows="group.rows"
31
- :title="group.name"
32
- :selected-ids.sync="selectedIds"
33
- :add-new-rows="addNewRows"
34
- :shadow-width="shadowWidth"
35
- :column-sorting="columnSorting"
36
- :column-resizing="columnResizing"
37
- :show-grouping="showGrouping"
38
- :show-summary="showSummary"
39
- :show-add-column="showAddColumn"
40
- :show-actions="showActions"
41
- :show-header="!noHeader"
42
- :schema="schema"
43
- :editable="editable"
44
- :no-column-menu="noColumnMenu"
45
- :no-select-all="noSelectAll"
46
- :currencies="currencies"
47
- :currency="currency"
48
- :subrows-property="subrowsProperty"
49
- :async-subrows-property="asyncSubrowsProperty"
50
- :divider-property="dividerProperty"
51
- :indicator-type="indicatorType"
52
- :expanded-all="expandedAll"
53
- :indicatorWidth="indicatorWidth"
54
- :striped="striped"
55
- :expanded-ids="expandedIds"
56
- :css-property="cssProperty"
57
- :sticky-header="stickyHeader"
58
- :editable-property="editableProperty"
59
- :sorting.sync="_sorting"
60
- :sort-as-string="sortAsString"
61
- :active="active"
62
- @loadChildren="$emit('loadChildren', $event)"
63
- @update:expanded-ids="$emit('update:expanded-ids', $event)"
64
- @new="$emit('new', $event)"
65
- @filter="$emit('filter', $event)"
66
- @add-column="$emit('add-column', $event)"
67
- >
68
- <template v-for="(_, name) in $slots" #[name]="slotData">
69
- <slot :name="name" v-bind="slotData || {}" />
70
- </template>
71
- <template v-for="(_, name) in $scopedSlots" #[name]="slotData">
72
- <slot :name="name" v-bind="slotData || {}" />
73
- </template>
74
- </itf-table-group>
75
- </div>
76
- </template>
77
- </itf-checkbox-group>
22
+ <itf-checkbox-group v-model="selectedIds" class="d-flex flex-column" style="min-width: 100%; width: max-content">
23
+ <template v-for="(group, index) in groups">
24
+ <div class="table-view-body">
25
+ <itf-table-group
26
+ :key="index"
27
+ @update="$emit('update', { ...$event, group, groupIndex: index })"
28
+ @row-click="$emit('row-click', $event)"
29
+ :id-property="idProperty"
30
+ :columns="columns"
31
+ @update:columns="onColumnsUpdate"
32
+ :rows="group.rows"
33
+ :title="group.name"
34
+ :selected-ids.sync="selectedIds"
35
+ :add-new-rows="addNewRows"
36
+ :shadow-width="shadowWidth"
37
+ :column-sorting="columnSorting"
38
+ :column-resizing="columnResizing"
39
+ :show-grouping="showGrouping"
40
+ :show-summary="showSummary"
41
+ :show-add-column="showAddColumn"
42
+ :show-actions="showActions"
43
+ :show-header="!noHeader"
44
+ :schema="schema"
45
+ :editable="editable"
46
+ :no-column-menu="noColumnMenu"
47
+ :no-select-all="noSelectAll"
48
+ :currencies="currencies"
49
+ :currency="currency"
50
+ :subrows-property="subrowsProperty"
51
+ :divider-property="dividerProperty"
52
+ :indicator-type="indicatorType"
53
+ :expanded-all="expandedAll"
54
+ :indicatorWidth="indicatorWidth"
55
+ :striped="striped"
56
+ :expanded-ids="expandedIds"
57
+ :css-property="cssProperty"
58
+ :sticky-header="stickyHeader"
59
+ :editable-property="editableProperty"
60
+ :sorting.sync="_sorting"
61
+ :active="active"
62
+ :new-label="newLabel"
63
+ :collapsed-group-ids="collapsedGroupIds"
64
+ @update:expanded-ids="$emit('update:expanded-ids', $event)"
65
+ @update:collapsed-group-ids="$emit('update:collapsed-group-ids', $event)"
66
+ @new="$emit('new', $event)"
67
+ @filter="$emit('filter', $event)"
68
+ @add-column="$emit('add-column', $event)"
69
+ >
70
+ <template v-for="(_, name) in $slots" #[name]="slotData">
71
+ <slot :name="name" v-bind="slotData || {}" />
72
+ </template>
73
+ <template v-for="(_, name) in $scopedSlots" #[name]="slotData">
74
+ <slot :name="name" v-bind="slotData || {}" />
75
+ </template>
76
+ </itf-table-group>
77
+ </div>
78
+ </template>
79
+ </itf-checkbox-group>
78
80
  </div>
79
81
  </div>
80
82
 
@@ -105,13 +107,11 @@ export default @Component({
105
107
  })
106
108
  class itfTable2 extends Vue {
107
109
  // @Prop({ required: true, type: Array }) columns;
108
- @Prop(Boolean) sortAsString;
109
110
  @Prop({ required: true, type: Array }) rows;
110
111
  @Prop({ type: String, default: null }) groupBy;
111
112
  @Prop({ type: String, default: null }) idProperty;
112
113
  @Prop({ type: String, default: null }) cssProperty;
113
114
  @Prop({ type: String, default: null }) subrowsProperty;
114
- @Prop({ type: String, default: null }) asyncSubrowsProperty;
115
115
  @Prop({ type: String, default: null }) dividerProperty;
116
116
  @Prop({ type: String, default: null }) editableProperty;
117
117
  @Prop({ default: null }) active;
@@ -123,6 +123,7 @@ class itfTable2 extends Vue {
123
123
  @ModelSync('value', 'input', { type: Array, default: () => ([]) }) selectedIds;
124
124
  @PropSync('sorting') _sorting;
125
125
  @Prop({ type: Array, default: () => [] }) expandedIds;
126
+ @Prop({ type: Array }) collapsedGroupIds;
126
127
  @Prop() currency;
127
128
  @Prop() currencies;
128
129
  @Prop(Boolean) stickyHeader;
@@ -141,6 +142,7 @@ class itfTable2 extends Vue {
141
142
  @Prop(Boolean) striped;
142
143
  @Prop(Boolean) absolute;
143
144
  @Prop(Boolean) clickable;
145
+ @Prop({type: String, default: function() { return this.$t('components.table.new'); } }) newLabel;
144
146
 
145
147
  state = {
146
148
  selectedIds: [],
@@ -189,7 +191,7 @@ class itfTable2 extends Vue {
189
191
  if (stateColumnIndex === -1) {
190
192
  state.columns.push(column);
191
193
  } else {
192
- state.columns[stateColumnIndex] = { ...column, width: state.columns[stateColumnIndex].width };
194
+ state.columns[stateColumnIndex] = { ...column, width: state.columns[stateColumnIndex].width, visible: state.columns[stateColumnIndex].visible };
193
195
  }
194
196
  }
195
197
  for (const column of state.columns) {
@@ -209,7 +211,7 @@ class itfTable2 extends Vue {
209
211
  if (!this.stateName) {
210
212
  return;
211
213
  }
212
- const columns = this.state.columns.map((s) => ({ property: s.property, width: s.width, index: s.index }));
214
+ const columns = this.state.columns.map((s) => ({ property: s.property, width: s.width, index: s.index, visible: s.visible }));
213
215
  localStorage.setItem(this.stateKey, JSON.stringify({ columns }));
214
216
  }
215
217
 
@@ -247,8 +249,7 @@ class itfTable2 extends Vue {
247
249
  @Watch('selectedIds')
248
250
  onSelectedIdsUpdate(selectedIds) {
249
251
  this.state.selectedIds = selectedIds;
250
- // метод saveTableState не зберігає selectedIds в localStorage, не впевнений що він тут треба
251
- // this.saveTableState();
252
+ this.saveTableState();
252
253
  }
253
254
 
254
255
  onColumnsUpdate(columns) {
@@ -1,13 +1,28 @@
1
1
  <template>
2
2
  <div>
3
+ <div v-if="!rows.length" data-test="table-no-results" class="scroller">
4
+ <div class="table-view-item">
5
+ <div class="table-row-template">
6
+ <div accept-group="items" class="table-view-body-space"></div>
7
+ <div class="shadow-area"></div>
8
+ <div class="indicator sticky"></div>
9
+ <div class="table-item-inner">
10
+ <div class="table-view-item-value w-100 align-items-center p-3 no-results">
11
+ {{$t('components.table.noResults')}}
12
+ </div>
13
+ <div class="boundary right"></div>
14
+ </div>
15
+ </div>
16
+ </div>
17
+ </div>
3
18
  <itf-table-rows
19
+ v-else
4
20
  class="scroller"
5
21
  :rows="rows"
6
22
  :selected-ids="selectedIds"
7
23
  :columns="columns"
8
24
  :id-property="idProperty"
9
25
  :subrows-property="subrowsProperty"
10
- :async-subrows-property="asyncSubrowsProperty"
11
26
  :divider-property="dividerProperty"
12
27
  :show-add-column="showAddColumn"
13
28
  :show-actions="showActions"
@@ -34,21 +49,6 @@
34
49
  <slot :name="name" v-bind="slotData || {}"/>
35
50
  </template>
36
51
  </itf-table-rows>
37
- <div v-if="!rows.length" data-test="table-no-results" class="scroller">
38
- <div class="table-view-item">
39
- <div class="table-row-template">
40
- <div accept-group="items" class="table-view-body-space"></div>
41
- <div class="shadow-area"></div>
42
- <div class="indicator sticky"></div>
43
- <div class="table-item-inner">
44
- <div class="table-view-item-value w-100 align-items-center p-3 no-results">
45
- {{$t('components.table.noResults')}}
46
- </div>
47
- <div class="boundary right"></div>
48
- </div>
49
- </div>
50
- </div>
51
- </div>
52
52
  </div>
53
53
  </template>
54
54
  <style lang="scss">
@@ -93,7 +93,7 @@
93
93
  display: flex;
94
94
  align-items: center;
95
95
  justify-content: center;
96
- min-width: 1rem;//var(--itf-table-min-width);
96
+ min-width: 1rem; // важливо для скруглення //var(--itf-table-min-width);
97
97
  }
98
98
 
99
99
  .table-row-template, .table-view-header-value {
@@ -145,7 +145,6 @@ class itfTableBody extends Vue {
145
145
  @Prop() rows;
146
146
  @Prop() idProperty;
147
147
  @Prop() subrowsProperty;
148
- @Prop() asyncSubrowsProperty;
149
148
  @Prop() dividerProperty;
150
149
  @Prop() active;
151
150
  @Prop(Boolean) showAddColumn;
@@ -166,10 +165,6 @@ class itfTableBody extends Vue {
166
165
  this.$emit('update:expanded-ids', this.expandedIds.includes(item[this.idProperty])
167
166
  ? this.expandedIds.filter((id) => id !== item[this.idProperty])
168
167
  : [...this.expandedIds, item[this.idProperty]]);
169
-
170
- if (this.asyncSubrowsProperty && item[this.asyncSubrowsProperty] && item[this.asyncSubrowsProperty]) {
171
- this.$emit('loadChildren', item);
172
- }
173
168
  }
174
169
  }
175
170
  </script>