@itfin/components 1.3.100 → 1.4.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 (153) hide show
  1. package/package.json +1 -1
  2. package/src/components/button/Button.vue +4 -2
  3. package/src/components/card/BentoCard.vue +70 -19
  4. package/src/components/card/BentoGrid.vue +21 -8
  5. package/src/components/filter/FilterAmountRange.vue +50 -42
  6. package/src/components/filter/FilterBadge.vue +27 -22
  7. package/src/components/filter/FilterFacetsList.vue +21 -17
  8. package/src/components/filter/FilterPanel.vue +143 -45
  9. package/src/components/filter/index.stories.js +0 -2
  10. package/src/components/form/Label.vue +19 -2
  11. package/src/components/icon/Icon.vue +4 -2
  12. package/src/components/icon/components/fi_fingerprint.vue +4 -0
  13. package/src/components/icon/components/nomi-ai.vue +6 -0
  14. package/src/components/icon/components/nomi-arrow-down.vue +4 -0
  15. package/src/components/icon/components/nomi-arrow-right-top.vue +4 -0
  16. package/src/components/icon/components/nomi-arrow-up.vue +4 -0
  17. package/src/components/icon/components/nomi-arrow_down.vue +4 -0
  18. package/src/components/icon/components/nomi-arrow_up.vue +4 -0
  19. package/src/components/icon/components/nomi-arrows.vue +7 -0
  20. package/src/components/icon/components/nomi-calendar-alt.vue +4 -0
  21. package/src/components/icon/components/nomi-calendar-alt2.vue +4 -0
  22. package/src/components/icon/components/nomi-calendar.vue +11 -0
  23. package/src/components/icon/components/nomi-card.vue +4 -0
  24. package/src/components/icon/components/nomi-clear.vue +4 -0
  25. package/src/components/icon/components/nomi-close.vue +5 -0
  26. package/src/components/icon/components/nomi-counterparty.vue +4 -0
  27. package/src/components/icon/components/nomi-dashboard.vue +4 -0
  28. package/src/components/icon/components/nomi-expand.vue +7 -0
  29. package/src/components/icon/components/nomi-export.vue +4 -0
  30. package/src/components/icon/components/nomi-eye-close.vue +4 -0
  31. package/src/components/icon/components/nomi-eye-open.vue +4 -0
  32. package/src/components/icon/components/nomi-eye.vue +4 -0
  33. package/src/components/icon/components/nomi-filter.vue +4 -0
  34. package/src/components/icon/components/nomi-help.vue +5 -0
  35. package/src/components/icon/components/nomi-hide.vue +4 -0
  36. package/src/components/icon/components/nomi-lock.vue +4 -0
  37. package/src/components/icon/components/nomi-logout.vue +5 -0
  38. package/src/components/icon/components/nomi-money.vue +4 -0
  39. package/src/components/icon/components/nomi-move-left.vue +4 -0
  40. package/src/components/icon/components/nomi-move-right.vue +4 -0
  41. package/src/components/icon/components/nomi-pen.vue +5 -0
  42. package/src/components/icon/components/nomi-person.vue +5 -0
  43. package/src/components/icon/components/nomi-pin.vue +7 -0
  44. package/src/components/icon/components/nomi-project.vue +4 -0
  45. package/src/components/icon/components/nomi-recurrence.vue +2 -0
  46. package/src/components/icon/components/nomi-repeat.vue +7 -0
  47. package/src/components/icon/components/nomi-report.vue +4 -0
  48. package/src/components/icon/components/nomi-scissors.vue +4 -0
  49. package/src/components/icon/components/nomi-settings.vue +4 -0
  50. package/src/components/icon/components/nomi-sort-asc.vue +7 -0
  51. package/src/components/icon/components/nomi-sort-desc.vue +7 -0
  52. package/src/components/icon/components/nomi-table-view.vue +4 -0
  53. package/src/components/icon/components/nomi-tag.vue +4 -0
  54. package/src/components/icon/components/nomi-target.vue +4 -0
  55. package/src/components/icon/components/nomi-text.vue +6 -0
  56. package/src/components/icon/components/nomi-transactions.vue +8 -0
  57. package/src/components/icon/components/nomi-trash.vue +4 -0
  58. package/src/components/icon/components/nomi-unpin.vue +7 -0
  59. package/src/components/icon/components/nomi-user.vue +5 -0
  60. package/src/components/icon/convert-icons.js +11 -0
  61. package/src/components/icon/icons.js +332 -286
  62. package/src/components/icon/new-icons/ai.svg +5 -0
  63. package/src/components/icon/new-icons/arrow-down.svg +3 -0
  64. package/src/components/icon/new-icons/arrow-right-top.svg +3 -0
  65. package/src/components/icon/new-icons/arrow-up.svg +3 -0
  66. package/src/components/icon/new-icons/arrow_down.svg +3 -0
  67. package/src/components/icon/new-icons/arrow_up.svg +3 -0
  68. package/src/components/icon/new-icons/arrows.svg +6 -0
  69. package/src/components/icon/new-icons/calendar-alt.svg +3 -0
  70. package/src/components/icon/new-icons/calendar-alt2.svg +3 -0
  71. package/src/components/icon/new-icons/calendar.svg +10 -0
  72. package/src/components/icon/new-icons/card.svg +3 -0
  73. package/src/components/icon/new-icons/clear.svg +3 -0
  74. package/src/components/icon/new-icons/close.svg +4 -0
  75. package/src/components/icon/new-icons/counterparty.svg +3 -0
  76. package/src/components/icon/new-icons/dashboard.svg +3 -0
  77. package/src/components/icon/new-icons/expand.svg +6 -0
  78. package/src/components/icon/new-icons/eye-close.svg +3 -0
  79. package/src/components/icon/new-icons/eye-open.svg +3 -0
  80. package/src/components/icon/new-icons/eye.svg +3 -0
  81. package/src/components/icon/new-icons/filter.svg +3 -0
  82. package/src/components/icon/new-icons/help.svg +4 -0
  83. package/src/components/icon/new-icons/hide.svg +3 -0
  84. package/src/components/icon/new-icons/logout.svg +4 -0
  85. package/src/components/icon/new-icons/money.svg +3 -0
  86. package/src/components/icon/new-icons/move-left.svg +3 -0
  87. package/src/components/icon/new-icons/move-right.svg +3 -0
  88. package/src/components/icon/new-icons/pen.svg +4 -0
  89. package/src/components/icon/new-icons/person.svg +4 -0
  90. package/src/components/icon/new-icons/pin.svg +6 -0
  91. package/src/components/icon/new-icons/project.svg +3 -0
  92. package/src/components/icon/new-icons/recurrence.svg +1 -0
  93. package/src/components/icon/new-icons/repeat.svg +6 -0
  94. package/src/components/icon/new-icons/report.svg +3 -0
  95. package/src/components/icon/new-icons/scissors.svg +3 -0
  96. package/src/components/icon/new-icons/settings.svg +3 -0
  97. package/src/components/icon/new-icons/sort-asc.svg +6 -0
  98. package/src/components/icon/new-icons/sort-desc.svg +6 -0
  99. package/src/components/icon/new-icons/table-view.svg +3 -0
  100. package/src/components/icon/new-icons/tag.svg +3 -0
  101. package/src/components/icon/new-icons/target.svg +3 -0
  102. package/src/components/icon/new-icons/text.svg +5 -0
  103. package/src/components/icon/new-icons/transactions.svg +7 -0
  104. package/src/components/icon/new-icons/trash.svg +3 -0
  105. package/src/components/icon/new-icons/unpin.svg +6 -0
  106. package/src/components/icon/new-icons/user.svg +4 -0
  107. package/src/components/modal/DeleteConfirmModal.vue +0 -2
  108. package/src/components/modal/ItemEditor.vue +1 -5
  109. package/src/components/pagination/Pagination.vue +3 -2
  110. package/src/components/pagination/Pagination2.vue +179 -0
  111. package/src/components/panels/Panel.vue +23 -7
  112. package/src/components/panels/PanelItemEdit.vue +62 -0
  113. package/src/components/panels/PanelLink.vue +26 -6
  114. package/src/components/panels/PanelList.vue +27 -26
  115. package/src/components/panels/helpers.spec.ts +27 -0
  116. package/src/components/panels/helpers.ts +37 -0
  117. package/src/components/popover/NoticePopout.vue +1 -1
  118. package/src/components/select/Select.vue +1 -1
  119. package/src/components/sortable/draggable.js +2 -1
  120. package/src/components/table/Table2.vue +37 -8
  121. package/src/components/table/TableBody.vue +10 -18
  122. package/src/components/table/TableGroup.vue +31 -12
  123. package/src/components/table/TableHeader.vue +118 -64
  124. package/src/components/table/TableRowToggle.vue +51 -0
  125. package/src/components/table/TableRows.vue +20 -29
  126. package/src/components/table/index.stories.js +22 -200
  127. package/src/components/table/table2.scss +237 -68
  128. package/src/components/text-field/MoneyField.vue +23 -21
  129. package/src/components/tree/TreeEditor.vue +615 -0
  130. package/src/components/view/View.vue +265 -0
  131. package/src/components/view/index.stories.js +588 -0
  132. package/src/helpers/formatters.js +14 -1
  133. package/src/helpers/tree/cdbl.js +32 -0
  134. package/src/helpers/tree/cint.js +43 -0
  135. package/src/helpers/tree/domDrag.js +911 -0
  136. package/src/helpers/tree/domFinds.js +20 -0
  137. package/src/helpers/tree/domGetPointFromEvent.js +53 -0
  138. package/src/helpers/tree/domIsClientXYIn.js +65 -0
  139. package/src/helpers/tree/domRemove.js +50 -0
  140. package/src/helpers/tree/evem.js +27 -0
  141. package/src/helpers/tree/genID.js +56 -0
  142. package/src/helpers/tree/isEle.js +28 -0
  143. package/src/helpers/tree/isestr.js +35 -0
  144. package/src/helpers/tree/isint.js +40 -0
  145. package/src/helpers/tree/isnbr.js +24 -0
  146. package/src/helpers/tree/isnum.js +38 -0
  147. package/src/helpers/tree/ispint.js +41 -0
  148. package/src/helpers/tree/isstr.js +27 -0
  149. package/src/helpers/tree.js +30 -0
  150. package/src/helpers/vuetifyColor.js +136 -0
  151. package/src/locales/en.js +17 -0
  152. package/src/locales/uk.js +17 -0
  153. package/src/components/table/TableRow.vue +0 -221
@@ -0,0 +1,265 @@
1
+ <template>
2
+
3
+ <div v-loading="loading || loadingData" class="flex-grow-1 w-100 d-flex flex-column">
4
+ <itf-filter-panel
5
+ :search-placeholder="searchPlaceholder"
6
+ search
7
+ class="py-2 px-3"
8
+ :endpoint="filtersEndpoint"
9
+ :panel="panel"
10
+ v-model="filter"
11
+ @input="onFilterSet"
12
+ @set-table-schema="setTableSchema"
13
+ >
14
+ <template #after-filter-btn>
15
+ <itf-dropdown v-if="$refs.table && tableSchema" shadow append-to-context :button-options="{ default: true, icon: true }" class="h-100" autoclose="outside">
16
+ <template #button>
17
+ <itf-icon new name="table-view" />
18
+ </template>
19
+ <div class="dropdown-header">
20
+ {{ $t('components.table.columns') }}
21
+ </div>
22
+ <a v-for="(property, n) of tableSchema.properties" :key="n" href="" @click.stop.prevent="$refs.table.toggleVisibility(property.property)" class="dropdown-item justify-content-between d-flex gap-3">
23
+ <div class="d-flex align-items-center gap-1">
24
+ <itf-icon v-if="property.icon" :size="24" new :name="property.icon" />
25
+ {{getTitle(property.title)}}
26
+ </div>
27
+
28
+ <itf-icon v-if="$refs.table.getColumnVisibility(property.property)" new :size="24" name="eye-open" />
29
+ <itf-icon v-else new name="eye-close" />
30
+ </a>
31
+ <div class="dropdown-header">
32
+ {{ $t('components.table.actions') }}
33
+ </div>
34
+ <a href="" @click.stop.prevent="$refs.table.resetSettings()" class="dropdown-item justify-content-between d-flex gap-3">
35
+ <div class="d-flex align-items-center gap-1">
36
+ <itf-icon new :size="24" name="download" />
37
+ {{ $t('components.table.resetTableSettings') }}
38
+ </div>
39
+ </a>
40
+ </itf-dropdown>
41
+ </template>
42
+ </itf-filter-panel>
43
+
44
+ <div class="flex-grow-1 px-3 d-flex flex-column">
45
+ <div class="position-relative flex-grow-1">
46
+ <itf-table
47
+ ref="table"
48
+ style="--shadow-area-width: 0px;"
49
+ absolute
50
+ striped
51
+ clickable
52
+ column-sorting
53
+ column-resizing
54
+ indicator-type="checkbox"
55
+ class="permanent-checkboxes"
56
+ :state-name="stateName"
57
+ id-property="id"
58
+ :rows="items"
59
+ :schema="tableSchema"
60
+ :sorting="sorting"
61
+ :active="activeIds"
62
+ :show-actions="showActions"
63
+ v-model="selectedIds"
64
+ @row-click="$emit('open', $event)"
65
+ @update:sorting="updateSorting($event)"
66
+ >
67
+ <template v-for="(_, name) in $slots" #[name]="slotData">
68
+ <slot :name="name" v-bind="slotData || {}"/>
69
+ </template>
70
+ <template v-for="(_, name) in $scopedSlots" #[name]="slotData">
71
+ <slot :name="name" v-bind="slotData || {}"/>
72
+ </template>
73
+ </itf-table>
74
+ </div>
75
+ </div>
76
+
77
+ <itf-pagination
78
+ class="my-2 px-3"
79
+ show-size
80
+ :size="size"
81
+ :items="items"
82
+ :pages="countPages"
83
+ :value="page"
84
+ @input="updatePage($event)"
85
+ @per-page="updateSizePerPage($event)"
86
+ >
87
+ <template #center>
88
+ <slot name="pagination-center" />
89
+ </template>
90
+ </itf-pagination>
91
+ </div>
92
+
93
+ </template>
94
+ <script>
95
+ import { Vue, ModelSync, Component, Prop, Inject } from 'vue-property-decorator';
96
+ import loading from '../../directives/loading';
97
+ import itfTable from '../table/Table2.vue';
98
+ import itfFilterPanel from '../filter/FilterPanel.vue';
99
+ import itfPagination from '../pagination/Pagination2.vue';
100
+ import itfTableBody from "../table/TableBody.vue";
101
+ import itfIcon from "../icon/Icon.vue";
102
+ import itfDropdown from "../dropdown/Dropdown.vue";
103
+
104
+ export default @Component({
105
+ name: 'itfView',
106
+ components: {
107
+ itfDropdown, itfIcon,
108
+ itfPagination,
109
+ itfFilterPanel,
110
+ itfTableBody,
111
+ itfTable
112
+ },
113
+ directives: {
114
+ loading
115
+ }
116
+ })
117
+ class itfView extends Vue {
118
+ @Inject({ default: null }) panelList;
119
+ @ModelSync('value', 'input') selectedIds;
120
+
121
+ @Prop({ type: Boolean }) loading;
122
+ @Prop({ type: Array }) filters;
123
+ // @Prop({ type: Object, required: true }) schema;
124
+ @Prop({ type: Object }) schema;
125
+ // @Prop({ default: 20 }) size;
126
+ // @Prop({ default: 1 }) page;
127
+ @Prop(String) defaultSorting;
128
+ @Prop(String) endpoint;
129
+ @Prop(String) filtersEndpoint;
130
+ @Prop(String) itemsKey;
131
+ @Prop(String) panelKey;
132
+ @Prop(String) stateName;
133
+ @Prop({ type: String, default () { return this.$t('components.table.search'); } }) searchPlaceholder;
134
+ @Prop() panel;
135
+ @Prop(Boolean) showActions;
136
+
137
+ page = 1;
138
+ total = 0;
139
+ size = 20;
140
+ sorting = 'id';
141
+ items = [];
142
+ filter = {};
143
+ loadingData = false;
144
+ activeIds = [];
145
+ tableColumns = [];
146
+
147
+ get tableSchema() {
148
+ console.log(123, this.tableColumns, this.schema)
149
+ // return this.tableColumns || this.schema;
150
+ if (this.tableColumns) {
151
+ return {
152
+ properties: this.tableColumns
153
+ }
154
+ } else if (this.schema) {
155
+ return this.schema
156
+ } else {
157
+ return {}
158
+ }
159
+ }
160
+
161
+ created() {
162
+ // const defaultSize = localStorage.getItem('sizePerPage') ?? 20;
163
+ //
164
+ // const { page, size, sorting } = this.panel.getPayload() ?? {};
165
+ // this.page = page ?? 1;
166
+ // this.size = size ?? defaultSize;
167
+ // this.sorting = sorting ?? this.defaultSorting;
168
+ this.sorting = this.defaultSorting;
169
+ }
170
+
171
+ mounted() {
172
+ if (this.panelList && this.panelList.panelsStack && this.panelList.panelsStack.length && this.panelKey) {
173
+ const updateIds = () => {
174
+ this.activeIds = this.panelList.panelsStack.filter(p => p.type === this.panelKey).map(p => p.payload.id);
175
+ };
176
+ this.panelList.panelsStack[0].on('panels.changed', updateIds);
177
+ updateIds();
178
+ }
179
+ }
180
+
181
+ async loadData() {
182
+ if (!this.endpoint) {
183
+ return;
184
+ }
185
+ this.$emit('load', this.filter);
186
+ this.loadingData = true;
187
+ await this.$try(async () => {
188
+ console.info('filter', this.filter)
189
+ const res = await this.$axios.$get(this.endpoint, {
190
+ params: {
191
+ ...this.filter,
192
+ page: this.page,
193
+ size: this.size,
194
+ sort: this.sorting
195
+ }
196
+ });
197
+ this.items = res[this.itemsKey];
198
+ this.page = res.meta.page;
199
+ this.total = res.meta.total;
200
+ this.size = res.meta.size;
201
+ });
202
+ this.loadingData = false;
203
+ this.$emit('loaded', this.filter);
204
+ }
205
+
206
+ getTitle(title) {
207
+ if (typeof title === 'string') {
208
+ return title;
209
+ }
210
+ return title[this.locale] || title['en_US'];
211
+ }
212
+
213
+ get countPages() {
214
+ return Math.ceil(this.total / this.size) ?? 1;
215
+ }
216
+
217
+ updateSorting (val) {
218
+ this.sorting = val;
219
+ this.setPanelPayload({ sorting: val });
220
+ this.loadData();
221
+ }
222
+
223
+ updatePage (val) {
224
+ this.page = val;
225
+ this.setPanelPayload({ page: val });
226
+ this.loadData();
227
+ }
228
+
229
+ updateSizePerPage (val) {
230
+ this.page = 1;
231
+ this.size = val;
232
+ this.setPanelPayload({ page: 1, size: val });
233
+ this.loadData();
234
+ localStorage.setItem('sizePerPage', val);
235
+ }
236
+
237
+ setPanelPayload(payload) {
238
+ // this.panel.setPayload(assignWithoutUndefined(this.panel.getPayload(), payload));
239
+ //
240
+ // function assignWithoutUndefined(...sources) {
241
+ // const target = {};
242
+ // sources.forEach(source => {
243
+ // if (source && typeof source === 'object') {
244
+ // Object.entries(source).forEach(([key, value]) => {
245
+ // if (value !== undefined) {
246
+ // target[key] = value;
247
+ // }
248
+ // });
249
+ // }
250
+ // });
251
+ // return target;
252
+ // }
253
+ }
254
+
255
+ onFilterSet(filter) {
256
+ this.page = 1;
257
+ // this.setPanelPayload({ ...filter, page: 1 });
258
+ this.loadData();
259
+ }
260
+
261
+ setTableSchema(tableSchema) {
262
+ this.tableColumns = tableSchema;
263
+ }
264
+ }
265
+ </script>