@mozaic-ds/vue 1.0.0-beta.3 → 1.0.0-beta.4

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 (179) hide show
  1. package/LICENSE +51 -0
  2. package/README.md +218 -84
  3. package/dist/mozaic-vue.css +1 -1
  4. package/dist/mozaic-vue.d.ts +920 -0
  5. package/dist/mozaic-vue.js +877 -0
  6. package/dist/mozaic-vue.js.map +1 -0
  7. package/dist/mozaic-vue.umd.cjs +2 -0
  8. package/dist/mozaic-vue.umd.cjs.map +1 -0
  9. package/env.d.ts +1 -0
  10. package/package.json +80 -50
  11. package/src/components/Contributing.mdx +118 -0
  12. package/src/components/GettingStarted.mdx +39 -0
  13. package/src/components/Introduction.mdx +54 -0
  14. package/src/components/Support.mdx +18 -0
  15. package/src/components/badge/MBadge.spec.ts +16 -0
  16. package/src/components/badge/MBadge.stories.ts +50 -0
  17. package/src/components/badge/MBadge.vue +36 -34
  18. package/src/components/button/MButton.spec.ts +191 -0
  19. package/src/components/button/MButton.stories.ts +66 -0
  20. package/src/components/button/MButton.vue +98 -154
  21. package/src/components/checkbox/MCheckbox.spec.ts +104 -0
  22. package/src/components/checkbox/MCheckbox.stories.ts +83 -0
  23. package/src/components/checkbox/MCheckbox.vue +60 -101
  24. package/src/components/checkboxgroup/MCheckboxGroup.spec.ts +78 -0
  25. package/src/components/checkboxgroup/MCheckboxGroup.stories.ts +61 -0
  26. package/src/components/checkboxgroup/MCheckboxGroup.vue +97 -0
  27. package/src/components/field/MField.spec.ts +166 -0
  28. package/src/components/field/MField.stories.ts +376 -0
  29. package/src/components/field/MField.vue +78 -61
  30. package/src/components/fieldgroup/MFieldGroup.spec.ts +165 -0
  31. package/src/components/fieldgroup/MFieldGroup.stories.ts +274 -0
  32. package/src/components/fieldgroup/MFieldGroup.vue +79 -0
  33. package/src/components/iconbutton/MIconButton.spec.ts +108 -0
  34. package/src/components/iconbutton/MIconButton.stories.ts +66 -0
  35. package/src/components/iconbutton/MIconButton.vue +73 -0
  36. package/src/components/link/MLink.spec.ts +154 -0
  37. package/src/components/link/MLink.stories.ts +98 -0
  38. package/src/components/link/MLink.vue +86 -109
  39. package/src/components/loader/MLoader.spec.ts +104 -0
  40. package/src/components/loader/MLoader.stories.ts +45 -0
  41. package/src/components/loader/MLoader.vue +65 -55
  42. package/src/components/overlay/MOverlay.spec.ts +51 -0
  43. package/src/components/overlay/MOverlay.stories.ts +40 -0
  44. package/src/components/overlay/MOverlay.vue +27 -19
  45. package/src/components/quantityselector/MQuantitySelector.spec.ts +262 -0
  46. package/src/components/quantityselector/MQuantitySelector.stories.ts +89 -0
  47. package/src/components/quantityselector/MQuantitySelector.vue +160 -136
  48. package/src/components/radio/MRadio.spec.ts +104 -0
  49. package/src/components/radio/MRadio.stories.ts +68 -0
  50. package/src/components/radio/MRadio.vue +56 -39
  51. package/src/components/radiogroup/MRadioGroup.spec.ts +54 -0
  52. package/src/components/radiogroup/MRadioGroup.stories.ts +61 -0
  53. package/src/components/radiogroup/MRadioGroup.vue +79 -0
  54. package/src/components/select/MSelect.spec.ts +114 -0
  55. package/src/components/select/MSelect.stories.ts +101 -0
  56. package/src/components/select/MSelect.vue +77 -119
  57. package/src/components/statusbadge/MStatusBadge.stories.ts +45 -0
  58. package/src/components/statusbadge/MStatusBadge.vue +40 -0
  59. package/src/components/statusbadge/MStatusDot.vue +32 -0
  60. package/src/components/statusbadge/MstatusBadge.spec.ts +16 -0
  61. package/src/components/textarea/MTextArea.spec.ts +112 -0
  62. package/src/components/textarea/MTextArea.stories.ts +67 -0
  63. package/src/components/textarea/MTextArea.vue +81 -42
  64. package/src/components/textinput/MTextInput.spec.ts +121 -0
  65. package/src/components/textinput/MTextInput.stories.ts +114 -0
  66. package/src/components/textinput/MTextInput.vue +127 -47
  67. package/src/components/toggle/MToggle.spec.ts +99 -0
  68. package/src/components/toggle/MToggle.stories.ts +68 -0
  69. package/src/components/toggle/MToggle.vue +63 -103
  70. package/src/components/usingIcons.mdx +43 -0
  71. package/src/components/usingPresets.mdx +125 -0
  72. package/src/main.ts +39 -0
  73. package/dist/demo.html +0 -1
  74. package/dist/mozaic-vue.adeo.css +0 -45
  75. package/dist/mozaic-vue.adeo.umd.js +0 -41775
  76. package/dist/mozaic-vue.common.js +0 -41765
  77. package/dist/mozaic-vue.common.js.map +0 -1
  78. package/dist/mozaic-vue.umd.js +0 -41776
  79. package/dist/mozaic-vue.umd.js.map +0 -1
  80. package/dist/mozaic-vue.umd.min.js +0 -4
  81. package/dist/mozaic-vue.umd.min.js.map +0 -1
  82. package/postinstall.js +0 -3
  83. package/src/components/accordion/MAccordion.vue +0 -128
  84. package/src/components/accordion/index.js +0 -7
  85. package/src/components/autocomplete/MAutocomplete.vue +0 -198
  86. package/src/components/autocomplete/index.js +0 -7
  87. package/src/components/badge/index.js +0 -7
  88. package/src/components/breadcrumb/MBreadcrumb.vue +0 -73
  89. package/src/components/breadcrumb/index.js +0 -7
  90. package/src/components/button/index.js +0 -7
  91. package/src/components/card/MCard.vue +0 -78
  92. package/src/components/card/index.js +0 -7
  93. package/src/components/checkbox/MCheckboxGroup.vue +0 -155
  94. package/src/components/checkbox/index.js +0 -12
  95. package/src/components/container/MContainer.vue +0 -33
  96. package/src/components/container/index.js +0 -7
  97. package/src/components/datatable/MDataTable.vue +0 -651
  98. package/src/components/datatable/MDataTableHeader.vue +0 -55
  99. package/src/components/datatable/MDataTableTop.vue +0 -35
  100. package/src/components/datatable/helpers.js +0 -132
  101. package/src/components/datatable/index.js +0 -12
  102. package/src/components/field/index.js +0 -7
  103. package/src/components/fileuploader/MFileResult.vue +0 -149
  104. package/src/components/fileuploader/MFileUploader.vue +0 -142
  105. package/src/components/fileuploader/index.js +0 -7
  106. package/src/components/flag/MFlag.vue +0 -46
  107. package/src/components/flag/index.js +0 -7
  108. package/src/components/heading/MHeading.vue +0 -75
  109. package/src/components/heading/index.js +0 -7
  110. package/src/components/hero/MHero.vue +0 -93
  111. package/src/components/hero/index.js +0 -7
  112. package/src/components/icon/MIcon.vue +0 -120
  113. package/src/components/icon/index.js +0 -7
  114. package/src/components/index.js +0 -43
  115. package/src/components/layer/MLayer.vue +0 -208
  116. package/src/components/layer/index.js +0 -7
  117. package/src/components/link/index.js +0 -7
  118. package/src/components/listbox/MListBox.vue +0 -106
  119. package/src/components/listbox/index.js +0 -7
  120. package/src/components/loader/index.js +0 -7
  121. package/src/components/modal/MModal.vue +0 -179
  122. package/src/components/modal/index.js +0 -7
  123. package/src/components/notification/MNotification.vue +0 -110
  124. package/src/components/notification/index.js +0 -7
  125. package/src/components/optionbutton/MOptionButton.vue +0 -67
  126. package/src/components/optionbutton/index.js +0 -7
  127. package/src/components/optioncard/MOptionCard.vue +0 -132
  128. package/src/components/optioncard/index.js +0 -7
  129. package/src/components/optiongroup/MOptionGroup.vue +0 -18
  130. package/src/components/optiongroup/index.js +0 -7
  131. package/src/components/overlay/MOverlayLoader.vue +0 -43
  132. package/src/components/overlay/index.js +0 -12
  133. package/src/components/pagination/MPagination.vue +0 -162
  134. package/src/components/pagination/index.js +0 -7
  135. package/src/components/passwordinput/MPasswordInput.vue +0 -96
  136. package/src/components/passwordinput/index.js +0 -7
  137. package/src/components/phonenumber/MPhoneNumber.vue +0 -390
  138. package/src/components/phonenumber/index.js +0 -7
  139. package/src/components/progressbar/MProgress.vue +0 -102
  140. package/src/components/progressbar/index.js +0 -7
  141. package/src/components/quantityselector/index.js +0 -7
  142. package/src/components/radio/MRadioGroup.vue +0 -111
  143. package/src/components/radio/index.js +0 -12
  144. package/src/components/ratingstars/MStarsInput.vue +0 -118
  145. package/src/components/ratingstars/MStarsResult.vue +0 -89
  146. package/src/components/ratingstars/index.js +0 -12
  147. package/src/components/select/index.js +0 -7
  148. package/src/components/stepper/MStepper.vue +0 -70
  149. package/src/components/stepper/index.js +0 -7
  150. package/src/components/tabs/MTab.vue +0 -184
  151. package/src/components/tabs/index.js +0 -7
  152. package/src/components/tags/MTag.vue +0 -173
  153. package/src/components/tags/index.js +0 -7
  154. package/src/components/textarea/index.js +0 -7
  155. package/src/components/textinput/MTextInputField.vue +0 -105
  156. package/src/components/textinput/MTextInputIcon.vue +0 -42
  157. package/src/components/textinput/index.js +0 -7
  158. package/src/components/toggle/index.js +0 -7
  159. package/src/components/tooltip/MTooltip.vue +0 -42
  160. package/src/components/tooltip/index.js +0 -7
  161. package/src/index.js +0 -62
  162. package/src/shims-tsx.d.ts +0 -13
  163. package/src/shims.vue.d.ts +0 -4
  164. package/src/tokens/adeo/android/colors.xml +0 -391
  165. package/src/tokens/adeo/android/font_dimens.xml +0 -18
  166. package/src/tokens/adeo/css/_variables.scss +0 -385
  167. package/src/tokens/adeo/css/root.scss +0 -387
  168. package/src/tokens/adeo/ios/StyleDictionaryColor.h +0 -399
  169. package/src/tokens/adeo/ios/StyleDictionaryColor.m +0 -411
  170. package/src/tokens/adeo/ios/StyleDictionaryColor.swift +0 -394
  171. package/src/tokens/adeo/ios/StyleDictionarySize.h +0 -69
  172. package/src/tokens/adeo/ios/StyleDictionarySize.m +0 -70
  173. package/src/tokens/adeo/ios/StyleDictionarySize.swift +0 -71
  174. package/src/tokens/adeo/js/tokens.js +0 -483
  175. package/src/tokens/adeo/js/tokensObject.js +0 -10354
  176. package/src/tokens/adeo/scss/_tokens.scss +0 -1300
  177. package/src/utils/mozaicClasses.js +0 -16
  178. package/src/utils/theme.validator.js +0 -19
  179. package/types/index.d.ts +0 -100
@@ -1,33 +0,0 @@
1
- <template>
2
- <component
3
- :is="htmlTag"
4
- class="ml-container"
5
- :class="{ 'ml-container--fluid': fluid }"
6
- >
7
- <slot />
8
- </component>
9
- </template>
10
-
11
- <script>
12
- export default {
13
- name: 'MContainer',
14
-
15
- props: {
16
- fluid: {
17
- type: Boolean,
18
- default: false,
19
- },
20
- htmlTag: {
21
- type: String,
22
- default: 'div',
23
- },
24
- },
25
- };
26
- </script>
27
-
28
- <style lang="scss">
29
- @import 'settings-tools/all-settings';
30
- @import 'layouts/l.container';
31
- @import 'utilities/u.margin';
32
- @import 'utilities/u.padding';
33
- </style>
@@ -1,7 +0,0 @@
1
- import MContainer from './MContainer.vue';
2
-
3
- MContainer.install = function (Vue) {
4
- Vue.component(MContainer.name, MContainer);
5
- };
6
-
7
- export { MContainer };
@@ -1,651 +0,0 @@
1
- <template>
2
- <div class="mc-datatable" :class="[getClasses, `mc-datatable--${size}`]">
3
- <MDataTableTop v-if="$slots.edition || $slots.actions || $slots.filters">
4
- <template #edition>
5
- <slot name="edition" />
6
- </template>
7
- <template #actions>
8
- <slot name="actions" />
9
- </template>
10
- <template #filters>
11
- <slot name="filters" />
12
- </template>
13
- </MDataTableTop>
14
-
15
- <slot />
16
-
17
- <div class="mc-datatable__container">
18
- <!-- MAIN -->
19
- <div class="mc-datatable__main" :style="tableStyle">
20
- <table class="mc-datatable__table" :class="getTableClasses">
21
- <thead v-if="!hideHeader">
22
- <tr>
23
- <th
24
- v-for="(header, index) in getHeaders"
25
- :key="`header-${index}`"
26
- :class="header.cssClass"
27
- scope="col"
28
- >
29
- <button
30
- v-if="sorting.mode !== 'none' && header.allowSorting"
31
- type="button"
32
- class="mc-datatable__sort mc-datatable__btn"
33
- :class="header.sortOrder"
34
- @click="!loading && onSortClick({ e: $event, header })"
35
- >
36
- <span class="mc-datatable__sort-label">
37
- <span class="visually-hidden">Trier par</span>
38
- {{ header.caption }}
39
- </span>
40
-
41
- <span class="mc-datatable__sort-arrow"></span>
42
- </button>
43
-
44
- <slot
45
- v-else
46
- :name="`header.${header.dataFieldExpr}`"
47
- :header="header"
48
- >
49
- {{ header.caption }}
50
- </slot>
51
- </th>
52
- </tr>
53
- </thead>
54
- <tbody>
55
- <tr
56
- v-for="(item, rowIndex) in getSource"
57
- :key="item[dataKeyExpr]"
58
- :class="rowClasses(item)"
59
- >
60
- <td
61
- v-for="(header, index) in getHeaders"
62
- :key="`${index}-${getItemValue(item, dataKeyExpr)}-${
63
- header.dataFieldExpr
64
- }`"
65
- :class="header.cssClass"
66
- @click="
67
- allowRowClick && onRowClick({ event: $event, item: item })
68
- "
69
- >
70
- <slot
71
- :name="`item.${header.dataFieldExpr}`"
72
- :item="item"
73
- :index="rowIndex"
74
- >
75
- {{ getItemValue(item, header.dataFieldExpr) }}
76
- </slot>
77
- </td>
78
- </tr>
79
- <!-- NO-DATA -->
80
- <tr v-if="getSource.length === 0">
81
- <td :colspan="getHeaders.length">
82
- <slot name="no-data" />
83
- </td>
84
- </tr>
85
- </tbody>
86
- </table>
87
- </div>
88
-
89
- <!-- FOOTER -->
90
- <div
91
- v-if="pagingOptions.enabled && total != null"
92
- class="mc-datatable__footer"
93
- >
94
- <!-- select -->
95
- <div class="mc-datatable__select">
96
- <label for="itemPerPage" class="mc-datatable__select-label">
97
- Rows per page
98
- </label>
99
- <m-select
100
- :id="'itemPerPage'"
101
- size="s"
102
- :disabled="loading"
103
- :options="getPageSizes"
104
- :value="getPageValue"
105
- @change="onPageSizeChanged"
106
- >
107
- <template #text="{ option }">
108
- <slot name="pager.text" :pager="option">
109
- {{ option.text }}
110
- </slot>
111
- </template>
112
- </m-select>
113
- </div>
114
-
115
- <!-- count -->
116
- <div v-if="pagingOptions.displayTotal" class="mc-datatable__count">
117
- <strong>{{ getTotalStringCurrentCount }}</strong> of
118
- <strong>{{ total }}</strong>
119
- </div>
120
-
121
- <!-- pagination -->
122
- <div class="mc-datatable__pagination">
123
- <m-pagination
124
- :disabled="loading"
125
- :length="getPagingSize"
126
- :page-label="pagingOptions.pageLabel"
127
- :value="pagingOptions.index"
128
- @on-update-page="onUpdatePage"
129
- >
130
- <template #text="{ option }">
131
- <slot name="paging.text" :paging="option">
132
- {{ option.text }}
133
- </slot>
134
- </template>
135
- </m-pagination>
136
- </div>
137
- </div>
138
- </div>
139
- </div>
140
- </template>
141
-
142
- <script>
143
- import MDataTableTop from './MDataTableTop.vue';
144
- import MPagination from '../pagination/MPagination.vue';
145
- import MSelect from '../select/MSelect.vue';
146
-
147
- import {
148
- getObjectValueByPath,
149
- isPromise,
150
- deepEqual,
151
- orderedArraySorted,
152
- parseClasses,
153
- } from './helpers';
154
-
155
- /** Map headers with default values. */
156
- function headersMapped(headers) {
157
- return headers.map((header) => ({
158
- ...Column.defaultOptions,
159
- ...header,
160
- sortFieldExpr: header.sortFieldExpr
161
- ? header.sortFieldExpr
162
- : header.dataFieldExpr,
163
- sortOrder: header.sortOrder ? header.sortOrder : null,
164
- }));
165
- }
166
-
167
- /** Generate headers if there is no headers defined. */
168
- function autoGenerateHeaders(data, headers) {
169
- if (headers.length === 0 && data.length > 0) {
170
- const cols = Object.keys(data[0]).map((key) => ({
171
- caption: key,
172
- dataFieldExpr: key,
173
- }));
174
- headersMapped(cols).forEach((col) => headers.push(col));
175
- }
176
- }
177
-
178
- /** Build options to manage request. */
179
- function buildOptions(
180
- pagingEnabled,
181
- pagerValue,
182
- pagingIndex,
183
- pagingSize,
184
- sortedColmuns
185
- ) {
186
- const columnSorters = sortedColmuns.reduce(
187
- (acc, header) => ({
188
- ...acc,
189
- [header.dataFieldExpr]: header.sortOrder,
190
- }),
191
- {}
192
- );
193
-
194
- const index = pagingIndex < pagingSize ? pagingIndex : pagingSize;
195
-
196
- return {
197
- sort: columnSorters,
198
- skip: pagingEnabled ? pagerValue * (index - 1) : null,
199
- take: pagingEnabled ? pagerValue : null,
200
- };
201
- }
202
-
203
- /** Caution : I have used object but we must speak about it to know if we use it or normalize field directly in MDataTable. */
204
- const Pager = {
205
- defaultOptions: {
206
- sizes: [10, 20, 30],
207
- text: 'Show',
208
- value: 20,
209
- },
210
- };
211
-
212
- const Paging = {
213
- defaultOptions: {
214
- enabled: false,
215
- text: 'sur',
216
- index: 1,
217
- },
218
- };
219
-
220
- const Column = {
221
- defaultOptions: {
222
- caption: null,
223
- dataFieldExpr: null,
224
- sortFieldExpr: null,
225
- allowSorting: false,
226
- sortOrder: null,
227
- },
228
- };
229
-
230
- const Sorting = {
231
- defaultOptions: {
232
- /** Get or set sorting mode. Possible value : ['none', 'single', 'multiple']. */
233
- mode: 'multiple',
234
- },
235
- };
236
-
237
- export default {
238
- name: 'MDataTable',
239
-
240
- components: { MDataTableTop, MSelect, MPagination },
241
-
242
- props: {
243
- /** Get or set the name of identity. */
244
- dataKeyExpr: {
245
- type: String,
246
- require: true,
247
- default: 'id',
248
- },
249
-
250
- /**
251
- * Get or set the headers informations.
252
- * @example {{ caption: string, dataFieldExpr: string, sortFieldExpr: string, allowSorting: boolean, sortOrder: 'asc' | 'desc' | null }[] }
253
- */
254
- headers: {
255
- type: Array,
256
- default: () => [],
257
- },
258
-
259
- /** Get or set the source of the data table.
260
- * The source can be an Array or a Promise or a function.
261
- * If the source is a function or a Promise, it's must be return or resolve an object like :
262
- *
263
- * @example
264
- * {
265
- * data:Array = [...] // The array of item
266
- * total:Number = // Total count of items
267
- * }
268
- */
269
- source: {
270
- type: [Array, Function, Promise],
271
- default: () => [],
272
- },
273
-
274
- /**
275
- * Get or set pager informations.
276
- * @type {{ sizes: number[], text: string, value: number }}
277
- */
278
- pager: {
279
- type: Object,
280
- default: () => ({}),
281
- },
282
-
283
- /**
284
- * Get or set paging informations.
285
- * @type {{ enabled: boolean, text: string, index: number }}
286
- */
287
- paging: {
288
- type: Object,
289
- default: () => ({}),
290
- },
291
-
292
- /** Get or set if row can clickable. */
293
- allowRowClick: {
294
- type: Boolean,
295
- default: false,
296
- },
297
-
298
- /** Get or set if the headers are fixed. */
299
- fixedHeader: {
300
- type: Boolean,
301
- default: false,
302
- },
303
-
304
- /**
305
- * Get or set the sorting informations.
306
- * @type {{ mode:'none' | 'single' | 'multiple'}}
307
- */
308
- sorting: {
309
- type: Object,
310
- default: () => ({}),
311
- },
312
-
313
- /**
314
- * Defines whether headers are hidden
315
- * @values false, true
316
- */
317
- hideHeader: {
318
- type: Boolean,
319
- default: false,
320
- },
321
-
322
- itemClasses: {
323
- type: [String, Function, Object],
324
- default: '',
325
- },
326
-
327
- size: {
328
- type: String,
329
- default: 'm',
330
- validator: (value) => ['s', 'm', 'l'].includes(value),
331
- },
332
-
333
- /**
334
- * Defines custom styles on .mc-datatable__main element
335
- */
336
- tableStyle: {
337
- type: Object,
338
- default: null,
339
- },
340
- },
341
-
342
- data() {
343
- return {
344
- headersMapped: headersMapped(this.headers),
345
- sourceMapped: [],
346
- pagerOptions: null,
347
- pagingOptions: null,
348
- sortingOptions: null,
349
- total: null,
350
- data: null,
351
- loading: false,
352
- created: false,
353
- };
354
- },
355
-
356
- computed: {
357
- getSource() {
358
- return this.sourceMapped;
359
- },
360
-
361
- getHeaders() {
362
- return this.headersMapped;
363
- },
364
-
365
- getSortHeader() {
366
- return this.getHeaders.filter((header) => header.sortOrder != null);
367
- },
368
-
369
- getClasses() {
370
- return {
371
- 'mc-datatable--sticky-header': this.fixedHeader,
372
- };
373
- },
374
-
375
- getTableClasses() {
376
- return {
377
- 'no-data': this.getSource.length === 0,
378
- };
379
- },
380
-
381
- getPageSizes() {
382
- return this.pagerOptions.sizes.map((size) => ({
383
- value: size,
384
- text: `${this.pagerOptions.text} ${size}`,
385
- }));
386
- },
387
-
388
- getPageValue() {
389
- const { sizes, value } = this.pagerOptions;
390
-
391
- if (sizes.includes(value)) {
392
- return value;
393
- } else {
394
- return sizes[0];
395
- }
396
- },
397
-
398
- getPagingSize() {
399
- let size = 1;
400
-
401
- if (this.total) {
402
- size = Math.ceil(this.total / this.pagerOptions.value);
403
- } else {
404
- size = parseInt(this.pagingOptions.index);
405
- }
406
-
407
- return size;
408
- },
409
-
410
- getPagingIndex() {
411
- return this.pagingOptions.index < this.getPagingSize
412
- ? this.pagingOptions.index
413
- : this.getPagingSize;
414
- },
415
-
416
- getTotalStringCurrentCount() {
417
- const { skip, take } = buildOptions(
418
- this.pagingOptions.enabled,
419
- this.getPageValue,
420
- this.getPagingIndex,
421
- this.getPagingSize,
422
- this.getSortHeader
423
- );
424
- const on = skip + take;
425
- return `${skip + 1} - ${on >= this.total ? this.total : on}`;
426
- },
427
- },
428
-
429
- watch: {
430
- source: {
431
- immediate: true,
432
- async handler(newValue, oldValue) {
433
- if (deepEqual(newValue, oldValue)) {
434
- return;
435
- }
436
-
437
- if (this.created) {
438
- await this.load();
439
- }
440
- },
441
- },
442
-
443
- headers: {
444
- deep: true,
445
- async handler(newValue) {
446
- this.headersMapped = headersMapped(newValue);
447
-
448
- this.$emit('headers-changed', newValue);
449
-
450
- if (this.created) {
451
- await this.load();
452
- }
453
- },
454
- },
455
-
456
- pager: {
457
- immediate: true,
458
- handler(newValue, oldValue) {
459
- if (deepEqual(newValue, oldValue)) {
460
- return;
461
- }
462
- this.pagerOptions = {
463
- ...Pager.defaultOptions,
464
- ...this.pager,
465
- };
466
- },
467
- },
468
- paging: {
469
- immediate: true,
470
- async handler(newValue, oldValue) {
471
- if (deepEqual(newValue, oldValue)) {
472
- return;
473
- }
474
-
475
- this.pagingOptions = {
476
- ...Paging.defaultOptions,
477
- ...this.paging,
478
- };
479
-
480
- if (this.created) {
481
- await this.load();
482
- }
483
- },
484
- },
485
- sorting: {
486
- immediate: true,
487
- handler(newValue, oldValue) {
488
- if (deepEqual(newValue, oldValue)) {
489
- return;
490
- }
491
-
492
- this.sortingOptions = {
493
- ...Sorting.defaultOptions,
494
- ...this.sorting,
495
- };
496
-
497
- // Reset
498
- this.headersMapped.forEach((header) => (header.sortOrder = null));
499
- },
500
- },
501
- },
502
-
503
- mounted() {
504
- this.load();
505
- this.created = true;
506
- },
507
-
508
- methods: {
509
- getItemValue(item, key) {
510
- return getObjectValueByPath(item, key);
511
- },
512
-
513
- rowClasses(item) {
514
- const getClasses = parseClasses(this.itemClasses, item);
515
-
516
- return {
517
- 'mc-datatable__row-clickable': this.allowRowClick,
518
- ...getClasses,
519
- };
520
- },
521
-
522
- /** Load data. */
523
- async load() {
524
- this.loading = true;
525
-
526
- if (this.source == null) {
527
- return;
528
- }
529
-
530
- try {
531
- const options = buildOptions(
532
- this.pagingOptions.enabled,
533
- this.getPageValue,
534
- this.getPagingIndex,
535
- this.getPagingSize,
536
- this.getSortHeader
537
- );
538
-
539
- if (Array.isArray(this.source)) {
540
- let data = this.source.slice();
541
-
542
- const sortedKeys = Object.keys(options.sort);
543
-
544
- if (sortedKeys.length > 0) {
545
- data = data.sort(
546
- orderedArraySorted(
547
- sortedKeys.map((key) => ({
548
- fieldExpr: key,
549
- sortOrder: options.sort[key],
550
- }))
551
- )
552
- );
553
- }
554
-
555
- if (options.skip != null && options.take != null) {
556
- data = data.splice(options.skip, options.take);
557
- }
558
-
559
- this.data = data;
560
-
561
- this.total = this.source.length;
562
- } else if (this.source instanceof Function) {
563
- const result = this.source(options);
564
-
565
- const { data, total } = isPromise(result) ? await result : result;
566
-
567
- this.data = data;
568
- this.total = total;
569
- }
570
-
571
- if (this.data) {
572
- autoGenerateHeaders(this.data, this.headersMapped);
573
- this.sourceMapped = this.data;
574
- }
575
-
576
- this.$emit('data-changed', this.sourceMapped);
577
- } finally {
578
- this.loading = false;
579
- }
580
- },
581
-
582
- async onUpdatePage(index) {
583
- this.pagingOptions.index = +index;
584
-
585
- await this.load();
586
-
587
- this.$emit('page-changed', index);
588
- },
589
-
590
- async onSortClick(e) {
591
- if (
592
- this.sortingOptions.mode === 'single' &&
593
- !this.getSortHeader.includes(e.header)
594
- ) {
595
- // Reinitialize sortOrder because there is only one sortable header
596
- this.headersMapped.forEach((header) => {
597
- header.sortOrder = null;
598
- });
599
- }
600
-
601
- switch (e.header.sortOrder) {
602
- case 'asc':
603
- e.header.sortOrder = 'desc';
604
- break;
605
- case 'desc':
606
- e.header.sortOrder = null;
607
- break;
608
- default:
609
- e.header.sortOrder = 'asc';
610
- break;
611
- }
612
-
613
- await this.load();
614
-
615
- this.$emit('sort-order-changed', e.header);
616
- },
617
-
618
- async onPageSizeChanged(value) {
619
- this.pagerOptions.value = +value;
620
-
621
- await this.load();
622
-
623
- this.$emit('page-size-changed', value);
624
- },
625
-
626
- onRowClick(e) {
627
- this.$emit('row-click', e);
628
- },
629
- },
630
- };
631
- </script>
632
-
633
- <style lang="scss">
634
- @import 'settings-tools/all-settings';
635
- @import 'components/c.datatable';
636
- @import 'components/c.datatable-tools';
637
- @import 'components/c.datatable-footer';
638
- // @import 'components/c.datatable-subtable';
639
-
640
- .mc-datatable {
641
- &__main {
642
- overflow-y: auto;
643
- }
644
-
645
- &__row {
646
- &-clickable {
647
- cursor: pointer;
648
- }
649
- }
650
- }
651
- </style>