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

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 (191) hide show
  1. package/LICENSE +51 -0
  2. package/README.md +224 -82
  3. package/dist/mozaic-vue.css +1 -1
  4. package/dist/mozaic-vue.d.ts +1202 -0
  5. package/dist/mozaic-vue.js +1220 -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 +81 -50
  11. package/src/components/Contributing.mdx +118 -0
  12. package/src/components/GettingStarted.mdx +50 -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/breadcrumb/MBreadcrumb.spec.ts +105 -0
  19. package/src/components/breadcrumb/MBreadcrumb.stories.ts +57 -0
  20. package/src/components/breadcrumb/MBreadcrumb.vue +52 -55
  21. package/src/components/button/MButton.spec.ts +191 -0
  22. package/src/components/button/MButton.stories.ts +66 -0
  23. package/src/components/button/MButton.vue +98 -154
  24. package/src/components/checkbox/MCheckbox.spec.ts +104 -0
  25. package/src/components/checkbox/MCheckbox.stories.ts +83 -0
  26. package/src/components/checkbox/MCheckbox.vue +60 -101
  27. package/src/components/checkboxgroup/MCheckboxGroup.spec.ts +78 -0
  28. package/src/components/checkboxgroup/MCheckboxGroup.stories.ts +61 -0
  29. package/src/components/checkboxgroup/MCheckboxGroup.vue +97 -0
  30. package/src/components/field/MField.spec.ts +166 -0
  31. package/src/components/field/MField.stories.ts +376 -0
  32. package/src/components/field/MField.vue +78 -61
  33. package/src/components/fieldgroup/MFieldGroup.spec.ts +165 -0
  34. package/src/components/fieldgroup/MFieldGroup.stories.ts +423 -0
  35. package/src/components/fieldgroup/MFieldGroup.vue +79 -0
  36. package/src/components/iconbutton/MIconButton.spec.ts +108 -0
  37. package/src/components/iconbutton/MIconButton.stories.ts +66 -0
  38. package/src/components/iconbutton/MIconButton.vue +73 -0
  39. package/src/components/link/MLink.spec.ts +154 -0
  40. package/src/components/link/MLink.stories.ts +98 -0
  41. package/src/components/link/MLink.vue +86 -109
  42. package/src/components/loader/MLoader.spec.ts +104 -0
  43. package/src/components/loader/MLoader.stories.ts +45 -0
  44. package/src/components/loader/MLoader.vue +65 -55
  45. package/src/components/overlay/MOverlay.spec.ts +51 -0
  46. package/src/components/overlay/MOverlay.stories.ts +40 -0
  47. package/src/components/overlay/MOverlay.vue +27 -19
  48. package/src/components/passwordinput/MPasswordInput.spec.ts +104 -0
  49. package/src/components/passwordinput/MPasswordInput.stories.ts +75 -0
  50. package/src/components/passwordinput/MPasswordInput.vue +129 -76
  51. package/src/components/quantityselector/MQuantitySelector.spec.ts +262 -0
  52. package/src/components/quantityselector/MQuantitySelector.stories.ts +89 -0
  53. package/src/components/quantityselector/MQuantitySelector.vue +160 -136
  54. package/src/components/radio/MRadio.spec.ts +104 -0
  55. package/src/components/radio/MRadio.stories.ts +68 -0
  56. package/src/components/radio/MRadio.vue +56 -39
  57. package/src/components/radiogroup/MRadioGroup.spec.ts +54 -0
  58. package/src/components/radiogroup/MRadioGroup.stories.ts +61 -0
  59. package/src/components/radiogroup/MRadioGroup.vue +79 -0
  60. package/src/components/select/MSelect.spec.ts +114 -0
  61. package/src/components/select/MSelect.stories.ts +101 -0
  62. package/src/components/select/MSelect.vue +77 -119
  63. package/src/components/statusbadge/MStatusBadge.stories.ts +45 -0
  64. package/src/components/statusbadge/MStatusBadge.vue +40 -0
  65. package/src/components/statusbadge/MstatusBadge.spec.ts +16 -0
  66. package/src/components/statusdot/MStatusDot.spec.ts +51 -0
  67. package/src/components/statusdot/MStatusDot.stories.ts +48 -0
  68. package/src/components/statusdot/MStatusDot.vue +36 -0
  69. package/src/components/statusnotification/MStatusNotification.spec.ts +99 -0
  70. package/src/components/statusnotification/MStatusNotification.stories.ts +96 -0
  71. package/src/components/statusnotification/MStatusNotification.vue +106 -0
  72. package/src/components/textarea/MTextArea.spec.ts +112 -0
  73. package/src/components/textarea/MTextArea.stories.ts +67 -0
  74. package/src/components/textarea/MTextArea.vue +81 -42
  75. package/src/components/textinput/MTextInput.spec.ts +121 -0
  76. package/src/components/textinput/MTextInput.stories.ts +114 -0
  77. package/src/components/textinput/MTextInput.vue +127 -47
  78. package/src/components/toggle/MToggle.spec.ts +99 -0
  79. package/src/components/toggle/MToggle.stories.ts +68 -0
  80. package/src/components/toggle/MToggle.vue +63 -103
  81. package/src/components/togglegroup/MToggleGroup.spec.ts +78 -0
  82. package/src/components/togglegroup/MToggleGroup.stories.ts +61 -0
  83. package/src/components/togglegroup/MToggleGroup.vue +97 -0
  84. package/src/components/usingIcons.mdx +43 -0
  85. package/src/components/usingPresets.mdx +125 -0
  86. package/src/main.ts +47 -0
  87. package/dist/demo.html +0 -1
  88. package/dist/mozaic-vue.adeo.css +0 -45
  89. package/dist/mozaic-vue.adeo.umd.js +0 -41775
  90. package/dist/mozaic-vue.common.js +0 -41765
  91. package/dist/mozaic-vue.common.js.map +0 -1
  92. package/dist/mozaic-vue.umd.js +0 -41776
  93. package/dist/mozaic-vue.umd.js.map +0 -1
  94. package/dist/mozaic-vue.umd.min.js +0 -4
  95. package/dist/mozaic-vue.umd.min.js.map +0 -1
  96. package/postinstall.js +0 -3
  97. package/src/components/accordion/MAccordion.vue +0 -128
  98. package/src/components/accordion/index.js +0 -7
  99. package/src/components/autocomplete/MAutocomplete.vue +0 -198
  100. package/src/components/autocomplete/index.js +0 -7
  101. package/src/components/badge/index.js +0 -7
  102. package/src/components/breadcrumb/index.js +0 -7
  103. package/src/components/button/index.js +0 -7
  104. package/src/components/card/MCard.vue +0 -78
  105. package/src/components/card/index.js +0 -7
  106. package/src/components/checkbox/MCheckboxGroup.vue +0 -155
  107. package/src/components/checkbox/index.js +0 -12
  108. package/src/components/container/MContainer.vue +0 -33
  109. package/src/components/container/index.js +0 -7
  110. package/src/components/datatable/MDataTable.vue +0 -651
  111. package/src/components/datatable/MDataTableHeader.vue +0 -55
  112. package/src/components/datatable/MDataTableTop.vue +0 -35
  113. package/src/components/datatable/helpers.js +0 -132
  114. package/src/components/datatable/index.js +0 -12
  115. package/src/components/field/index.js +0 -7
  116. package/src/components/fileuploader/MFileResult.vue +0 -149
  117. package/src/components/fileuploader/MFileUploader.vue +0 -142
  118. package/src/components/fileuploader/index.js +0 -7
  119. package/src/components/flag/MFlag.vue +0 -46
  120. package/src/components/flag/index.js +0 -7
  121. package/src/components/heading/MHeading.vue +0 -75
  122. package/src/components/heading/index.js +0 -7
  123. package/src/components/hero/MHero.vue +0 -93
  124. package/src/components/hero/index.js +0 -7
  125. package/src/components/icon/MIcon.vue +0 -120
  126. package/src/components/icon/index.js +0 -7
  127. package/src/components/index.js +0 -43
  128. package/src/components/layer/MLayer.vue +0 -208
  129. package/src/components/layer/index.js +0 -7
  130. package/src/components/link/index.js +0 -7
  131. package/src/components/listbox/MListBox.vue +0 -106
  132. package/src/components/listbox/index.js +0 -7
  133. package/src/components/loader/index.js +0 -7
  134. package/src/components/modal/MModal.vue +0 -179
  135. package/src/components/modal/index.js +0 -7
  136. package/src/components/notification/MNotification.vue +0 -110
  137. package/src/components/notification/index.js +0 -7
  138. package/src/components/optionbutton/MOptionButton.vue +0 -67
  139. package/src/components/optionbutton/index.js +0 -7
  140. package/src/components/optioncard/MOptionCard.vue +0 -132
  141. package/src/components/optioncard/index.js +0 -7
  142. package/src/components/optiongroup/MOptionGroup.vue +0 -18
  143. package/src/components/optiongroup/index.js +0 -7
  144. package/src/components/overlay/MOverlayLoader.vue +0 -43
  145. package/src/components/overlay/index.js +0 -12
  146. package/src/components/pagination/MPagination.vue +0 -162
  147. package/src/components/pagination/index.js +0 -7
  148. package/src/components/passwordinput/index.js +0 -7
  149. package/src/components/phonenumber/MPhoneNumber.vue +0 -390
  150. package/src/components/phonenumber/index.js +0 -7
  151. package/src/components/progressbar/MProgress.vue +0 -102
  152. package/src/components/progressbar/index.js +0 -7
  153. package/src/components/quantityselector/index.js +0 -7
  154. package/src/components/radio/MRadioGroup.vue +0 -111
  155. package/src/components/radio/index.js +0 -12
  156. package/src/components/ratingstars/MStarsInput.vue +0 -118
  157. package/src/components/ratingstars/MStarsResult.vue +0 -89
  158. package/src/components/ratingstars/index.js +0 -12
  159. package/src/components/select/index.js +0 -7
  160. package/src/components/stepper/MStepper.vue +0 -70
  161. package/src/components/stepper/index.js +0 -7
  162. package/src/components/tabs/MTab.vue +0 -184
  163. package/src/components/tabs/index.js +0 -7
  164. package/src/components/tags/MTag.vue +0 -173
  165. package/src/components/tags/index.js +0 -7
  166. package/src/components/textarea/index.js +0 -7
  167. package/src/components/textinput/MTextInputField.vue +0 -105
  168. package/src/components/textinput/MTextInputIcon.vue +0 -42
  169. package/src/components/textinput/index.js +0 -7
  170. package/src/components/toggle/index.js +0 -7
  171. package/src/components/tooltip/MTooltip.vue +0 -42
  172. package/src/components/tooltip/index.js +0 -7
  173. package/src/index.js +0 -62
  174. package/src/shims-tsx.d.ts +0 -13
  175. package/src/shims.vue.d.ts +0 -4
  176. package/src/tokens/adeo/android/colors.xml +0 -391
  177. package/src/tokens/adeo/android/font_dimens.xml +0 -18
  178. package/src/tokens/adeo/css/_variables.scss +0 -385
  179. package/src/tokens/adeo/css/root.scss +0 -387
  180. package/src/tokens/adeo/ios/StyleDictionaryColor.h +0 -399
  181. package/src/tokens/adeo/ios/StyleDictionaryColor.m +0 -411
  182. package/src/tokens/adeo/ios/StyleDictionaryColor.swift +0 -394
  183. package/src/tokens/adeo/ios/StyleDictionarySize.h +0 -69
  184. package/src/tokens/adeo/ios/StyleDictionarySize.m +0 -70
  185. package/src/tokens/adeo/ios/StyleDictionarySize.swift +0 -71
  186. package/src/tokens/adeo/js/tokens.js +0 -483
  187. package/src/tokens/adeo/js/tokensObject.js +0 -10354
  188. package/src/tokens/adeo/scss/_tokens.scss +0 -1300
  189. package/src/utils/mozaicClasses.js +0 -16
  190. package/src/utils/theme.validator.js +0 -19
  191. package/types/index.d.ts +0 -100
@@ -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>
@@ -1,55 +0,0 @@
1
- <script>
2
- export default {
3
- name: 'MDataTableHeader',
4
-
5
- props: {
6
- caption: {
7
- type: String,
8
- default: null,
9
- },
10
- dataFieldExpr: {
11
- type: String,
12
- default: null,
13
- },
14
- allowSorting: {
15
- type: Boolean,
16
- default: false,
17
- },
18
- sortOrder: {
19
- type: String,
20
- default: null,
21
- validator: function (value) {
22
- return [null, 'asc', 'desc'].indexOf(value) !== -1;
23
- },
24
- },
25
- sortFieldExpr: {
26
- type: String,
27
- default: null,
28
- },
29
- cssClass: {
30
- type: [Object, String],
31
- default: null,
32
- },
33
- },
34
-
35
- data() {
36
- return {
37
- options: {
38
- ...this.$props,
39
- },
40
- };
41
- },
42
-
43
- created() {
44
- this.$parent.headers.push(this.options);
45
- },
46
-
47
- destroyed() {
48
- const index = this.$parent.headers.indexOf(this.options);
49
- this.$parent.headers.splice(index, 1);
50
- },
51
-
52
- // Renderless component
53
- render: () => null,
54
- };
55
- </script>