@mozaic-ds/vue 1.0.0-rc.2 → 2.1.0

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 (222) hide show
  1. package/LICENSE +51 -0
  2. package/README.md +76 -77
  3. package/dist/mozaic-vue.css +1 -1
  4. package/dist/mozaic-vue.d.ts +1664 -0
  5. package/dist/mozaic-vue.js +1943 -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 +78 -51
  11. package/src/components/Contributing.mdx +118 -0
  12. package/src/components/GettingStarted.mdx +45 -0
  13. package/src/components/Introduction.mdx +100 -0
  14. package/src/components/Support.mdx +18 -0
  15. package/src/components/breadcrumb/MBreadcrumb.spec.ts +105 -0
  16. package/src/components/breadcrumb/MBreadcrumb.stories.ts +82 -0
  17. package/src/components/breadcrumb/MBreadcrumb.vue +52 -55
  18. package/src/components/button/MButton.spec.ts +191 -0
  19. package/src/components/button/MButton.stories.ts +59 -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/datepicker/MDatepicker.spec.ts +95 -0
  28. package/src/components/datepicker/MDatepicker.stories.ts +75 -0
  29. package/src/components/datepicker/MDatepicker.vue +114 -0
  30. package/src/components/divider/MDivider.spec.ts +57 -0
  31. package/src/components/divider/MDivider.stories.ts +64 -0
  32. package/src/components/divider/MDivider.vue +56 -0
  33. package/src/components/drawer/MDrawer.spec.ts +100 -0
  34. package/src/components/drawer/MDrawer.stories.ts +128 -0
  35. package/src/components/drawer/MDrawer.vue +140 -0
  36. package/src/components/field/MField.spec.ts +166 -0
  37. package/src/components/field/MField.stories.ts +369 -0
  38. package/src/components/field/MField.vue +78 -61
  39. package/src/components/fieldgroup/MFieldGroup.spec.ts +165 -0
  40. package/src/components/fieldgroup/MFieldGroup.stories.ts +416 -0
  41. package/src/components/fieldgroup/MFieldGroup.vue +79 -0
  42. package/src/components/flag/MFlag.spec.ts +46 -0
  43. package/src/components/flag/MFlag.stories.ts +46 -0
  44. package/src/components/flag/MFlag.vue +28 -39
  45. package/src/components/iconbutton/MIconButton.spec.ts +108 -0
  46. package/src/components/iconbutton/MIconButton.stories.ts +74 -0
  47. package/src/components/iconbutton/MIconButton.vue +73 -0
  48. package/src/components/link/MLink.spec.ts +154 -0
  49. package/src/components/link/MLink.stories.ts +89 -0
  50. package/src/components/link/MLink.vue +86 -120
  51. package/src/components/loader/MLoader.spec.ts +104 -0
  52. package/src/components/loader/MLoader.stories.ts +43 -0
  53. package/src/components/loader/MLoader.vue +66 -55
  54. package/src/components/loadingoverlay/MLoadingOverlay.spec.ts +37 -0
  55. package/src/components/loadingoverlay/MLoadingOverlay.stories.ts +40 -0
  56. package/src/components/loadingoverlay/MLoadingOverlay.vue +28 -0
  57. package/src/components/modal/MModal.spec.ts +103 -0
  58. package/src/components/modal/MModal.stories.ts +127 -0
  59. package/src/components/modal/MModal.vue +106 -154
  60. package/src/components/numberbadge/MNumberBadge.spec.ts +56 -0
  61. package/src/components/numberbadge/MNumberBadge.stories.ts +48 -0
  62. package/src/components/numberbadge/MNumberBadge.vue +45 -0
  63. package/src/components/overlay/MOverlay.spec.ts +51 -0
  64. package/src/components/overlay/MOverlay.stories.ts +35 -0
  65. package/src/components/overlay/MOverlay.vue +27 -19
  66. package/src/components/pagination/MPagination.spec.ts +123 -0
  67. package/src/components/pagination/MPagination.stories.ts +83 -0
  68. package/src/components/pagination/MPagination.vue +120 -140
  69. package/src/components/passwordinput/MPasswordInput.spec.ts +104 -0
  70. package/src/components/passwordinput/MPasswordInput.stories.ts +75 -0
  71. package/src/components/passwordinput/MPasswordInput.vue +126 -77
  72. package/src/components/pincode/MPincode.spec.ts +126 -0
  73. package/src/components/pincode/MPincode.stories.ts +68 -0
  74. package/src/components/pincode/MPincode.vue +148 -0
  75. package/src/components/quantityselector/MQuantitySelector.spec.ts +262 -0
  76. package/src/components/quantityselector/MQuantitySelector.stories.ts +89 -0
  77. package/src/components/quantityselector/MQuantitySelector.vue +159 -148
  78. package/src/components/radio/MRadio.spec.ts +104 -0
  79. package/src/components/radio/MRadio.stories.ts +68 -0
  80. package/src/components/radio/MRadio.vue +56 -39
  81. package/src/components/radiogroup/MRadioGroup.spec.ts +54 -0
  82. package/src/components/radiogroup/MRadioGroup.stories.ts +61 -0
  83. package/src/components/radiogroup/MRadioGroup.vue +79 -0
  84. package/src/components/select/MSelect.spec.ts +114 -0
  85. package/src/components/select/MSelect.stories.ts +101 -0
  86. package/src/components/select/MSelect.vue +77 -119
  87. package/src/components/statusbadge/MStatusBadge.stories.ts +45 -0
  88. package/src/components/statusbadge/MStatusBadge.vue +40 -0
  89. package/src/components/statusbadge/MstatusBadge.spec.ts +16 -0
  90. package/src/components/statusdot/MStatusDot.spec.ts +51 -0
  91. package/src/components/statusdot/MStatusDot.stories.ts +48 -0
  92. package/src/components/statusdot/MStatusDot.vue +36 -0
  93. package/src/components/statusnotification/MStatusNotification.spec.ts +103 -0
  94. package/src/components/statusnotification/MStatusNotification.stories.ts +89 -0
  95. package/src/components/statusnotification/MStatusNotification.vue +106 -0
  96. package/src/components/tabs/MTabs.stories.ts +104 -0
  97. package/src/components/tabs/MTabs.vue +113 -0
  98. package/src/components/tabs/Mtabs.spec.ts +149 -0
  99. package/src/components/tag/MTag.spec.ts +107 -0
  100. package/src/components/tag/MTag.stories.ts +75 -0
  101. package/src/components/tag/MTag.vue +151 -0
  102. package/src/components/textarea/MTextArea.spec.ts +112 -0
  103. package/src/components/textarea/MTextArea.stories.ts +67 -0
  104. package/src/components/textarea/MTextArea.vue +81 -43
  105. package/src/components/textinput/MTextInput.spec.ts +121 -0
  106. package/src/components/textinput/MTextInput.stories.ts +107 -0
  107. package/src/components/textinput/MTextInput.vue +127 -47
  108. package/src/components/toggle/MToggle.spec.ts +99 -0
  109. package/src/components/toggle/MToggle.stories.ts +68 -0
  110. package/src/components/toggle/MToggle.vue +63 -103
  111. package/src/components/togglegroup/MToggleGroup.spec.ts +78 -0
  112. package/src/components/togglegroup/MToggleGroup.stories.ts +61 -0
  113. package/src/components/togglegroup/MToggleGroup.vue +97 -0
  114. package/src/components/usingIcons.mdx +35 -0
  115. package/src/components/usingPresets.mdx +128 -0
  116. package/src/main.ts +32 -0
  117. package/dist/demo.html +0 -1
  118. package/dist/mozaic-vue.adeo.css +0 -47
  119. package/dist/mozaic-vue.adeo.umd.js +0 -31109
  120. package/dist/mozaic-vue.common.js +0 -31099
  121. package/dist/mozaic-vue.common.js.map +0 -1
  122. package/dist/mozaic-vue.umd.js +0 -31110
  123. package/dist/mozaic-vue.umd.js.map +0 -1
  124. package/dist/mozaic-vue.umd.min.js +0 -4
  125. package/dist/mozaic-vue.umd.min.js.map +0 -1
  126. package/postinstall.js +0 -3
  127. package/src/components/accordion/MAccordion.vue +0 -128
  128. package/src/components/accordion/index.js +0 -7
  129. package/src/components/autocomplete/MAutocomplete.vue +0 -381
  130. package/src/components/autocomplete/index.js +0 -7
  131. package/src/components/badge/MBadge.vue +0 -43
  132. package/src/components/badge/index.js +0 -7
  133. package/src/components/breadcrumb/index.js +0 -7
  134. package/src/components/button/index.js +0 -7
  135. package/src/components/card/MCard.vue +0 -78
  136. package/src/components/card/index.js +0 -7
  137. package/src/components/checkbox/MCheckboxGroup.vue +0 -163
  138. package/src/components/checkbox/index.js +0 -12
  139. package/src/components/container/MContainer.vue +0 -33
  140. package/src/components/container/index.js +0 -7
  141. package/src/components/datatable/MDataTable.vue +0 -651
  142. package/src/components/datatable/MDataTableHeader.vue +0 -55
  143. package/src/components/datatable/MDataTableTop.vue +0 -35
  144. package/src/components/datatable/helpers.js +0 -132
  145. package/src/components/datatable/index.js +0 -12
  146. package/src/components/dropdown/MDropdown.vue +0 -317
  147. package/src/components/dropdown/index.js +0 -7
  148. package/src/components/field/index.js +0 -7
  149. package/src/components/fileuploader/MFileResult.vue +0 -149
  150. package/src/components/fileuploader/MFileUploader.vue +0 -142
  151. package/src/components/fileuploader/index.js +0 -7
  152. package/src/components/flag/index.js +0 -7
  153. package/src/components/heading/MHeading.vue +0 -75
  154. package/src/components/heading/index.js +0 -7
  155. package/src/components/hero/MHero.vue +0 -93
  156. package/src/components/hero/index.js +0 -7
  157. package/src/components/icon/MIcon.vue +0 -136
  158. package/src/components/icon/index.js +0 -7
  159. package/src/components/index.js +0 -44
  160. package/src/components/layer/MLayer.vue +0 -208
  161. package/src/components/layer/index.js +0 -7
  162. package/src/components/link/index.js +0 -7
  163. package/src/components/listbox/MListBox.vue +0 -146
  164. package/src/components/listbox/MListBoxActions.vue +0 -251
  165. package/src/components/listbox/index.js +0 -12
  166. package/src/components/loader/index.js +0 -7
  167. package/src/components/modal/index.js +0 -7
  168. package/src/components/notification/MNotification.vue +0 -110
  169. package/src/components/notification/index.js +0 -7
  170. package/src/components/optionbutton/MOptionButton.vue +0 -67
  171. package/src/components/optionbutton/index.js +0 -7
  172. package/src/components/optioncard/MOptionCard.vue +0 -132
  173. package/src/components/optioncard/index.js +0 -7
  174. package/src/components/optiongroup/MOptionGroup.vue +0 -18
  175. package/src/components/optiongroup/index.js +0 -7
  176. package/src/components/overlay/MOverlayLoader.vue +0 -43
  177. package/src/components/overlay/index.js +0 -12
  178. package/src/components/pagination/index.js +0 -7
  179. package/src/components/passwordinput/index.js +0 -7
  180. package/src/components/phonenumber/MPhoneNumber.vue +0 -398
  181. package/src/components/phonenumber/index.js +0 -7
  182. package/src/components/progressbar/MProgress.vue +0 -102
  183. package/src/components/progressbar/index.js +0 -7
  184. package/src/components/quantityselector/index.js +0 -7
  185. package/src/components/radio/MRadioGroup.vue +0 -111
  186. package/src/components/radio/index.js +0 -12
  187. package/src/components/ratingstars/MStarsInput.vue +0 -119
  188. package/src/components/ratingstars/MStarsResult.vue +0 -89
  189. package/src/components/ratingstars/index.js +0 -12
  190. package/src/components/select/index.js +0 -7
  191. package/src/components/stepper/MStepper.vue +0 -111
  192. package/src/components/stepper/index.js +0 -7
  193. package/src/components/tabs/MTab.vue +0 -198
  194. package/src/components/tabs/index.js +0 -7
  195. package/src/components/tags/MTag.vue +0 -173
  196. package/src/components/tags/index.js +0 -7
  197. package/src/components/textarea/index.js +0 -7
  198. package/src/components/textinput/MTextInputField.vue +0 -105
  199. package/src/components/textinput/MTextInputIcon.vue +0 -42
  200. package/src/components/textinput/index.js +0 -7
  201. package/src/components/toggle/index.js +0 -7
  202. package/src/components/tooltip/MTooltip.vue +0 -42
  203. package/src/components/tooltip/index.js +0 -7
  204. package/src/index.js +0 -63
  205. package/src/shims-tsx.d.ts +0 -13
  206. package/src/shims.vue.d.ts +0 -4
  207. package/src/tokens/adeo/android/colors.xml +0 -448
  208. package/src/tokens/adeo/android/font_dimens.xml +0 -18
  209. package/src/tokens/adeo/css/_variables.scss +0 -442
  210. package/src/tokens/adeo/css/root.scss +0 -444
  211. package/src/tokens/adeo/ios/StyleDictionaryColor.h +0 -456
  212. package/src/tokens/adeo/ios/StyleDictionaryColor.m +0 -468
  213. package/src/tokens/adeo/ios/StyleDictionaryColor.swift +0 -451
  214. package/src/tokens/adeo/ios/StyleDictionarySize.h +0 -69
  215. package/src/tokens/adeo/ios/StyleDictionarySize.m +0 -70
  216. package/src/tokens/adeo/ios/StyleDictionarySize.swift +0 -71
  217. package/src/tokens/adeo/js/tokens.js +0 -540
  218. package/src/tokens/adeo/js/tokensObject.js +0 -11641
  219. package/src/tokens/adeo/scss/_tokens.scss +0 -1514
  220. package/src/utils/mozaicClasses.js +0 -16
  221. package/src/utils/theme.validator.js +0 -19
  222. package/types/index.d.ts +0 -104
@@ -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>