@massimo-cassandro/minimo 1.19.0 → 1.19.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 (165) hide show
  1. package/design-tokens/README.md +195 -0
  2. package/design-tokens/tokens/src/components/unsplash-page/unsplash-page.minimo.tokens.jsonc +69 -31
  3. package/design-tokens/{utilities/tokens-config-sample.mjs → tokens-config-sample.mjs} +10 -10
  4. package/dev-tools/starter-kit/starter-install.sh +1 -1
  5. package/package.json +6 -2
  6. package/snippets/error-pages/error-pages.js +3 -2
  7. package/src/components/unsplash-page/unsplash-page.minimo.tokens.mjs +78 -39
  8. package/src/components/unsplash-page/unsplash-page.module.css +25 -6
  9. package/src/custom-properties.css +8 -1
  10. package/src/minimo.css +1 -1
  11. package/src/web-components/s-datatable-component/s-datatable-component.js +4 -1
  12. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/index.js +0 -92
  13. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/hbars.js +0 -356
  14. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/pie.js +0 -245
  15. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/radial-bars.js +0 -177
  16. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/rating-display.js +0 -835
  17. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/costruzione-assi.js +0 -212
  18. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/costruzione-linee.js +0 -101
  19. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/defaults.js +0 -185
  20. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/display-current.js +0 -27
  21. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/grid-areas.js +0 -129
  22. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/parse-opts.js +0 -64
  23. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/paths-setup.js +0 -73
  24. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile.js +0 -126
  25. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/signal-bars.js +0 -290
  26. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/week-utils.js +0 -122
  27. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/hbars-test.js +0 -52
  28. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/mcn-test.js +0 -74
  29. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/pie-test.js +0 -16
  30. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/radial-bars-test.js +0 -48
  31. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/settimanale-mensile-dati-settimanale.js +0 -426
  32. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/settimanale-mensile-test.js +0 -260
  33. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/signal-bars-test.js +0 -64
  34. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/node-test.mjs +0 -86
  35. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/hBars-node-test.mjs +0 -40
  36. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/lines-node-test.mjs +0 -73
  37. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/mcn-node-test.mjs +0 -64
  38. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/pie-node-test.mjs +0 -12
  39. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/radialsBar-node-test.mjs +0 -44
  40. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/settimanale-mensile-node-test.mjs +0 -258
  41. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/signalBars-node-test.mjs +0 -36
  42. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/test-readme.md +0 -24
  43. package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/textToPath-test.mjs +0 -14
  44. package/charts/TODO charts/???/InfoBox.js +0 -456
  45. package/charts/TODO charts/???/README-upg OLD/342/206/222NEW.md" +0 -53
  46. package/charts/TODO charts/???/README.md +0 -1
  47. package/charts/TODO charts/???/TODO.md +0 -39
  48. package/charts/TODO charts/???/base-cfg.js +0 -66
  49. package/charts/TODO charts/???/rating-displayOLD.js +0 -837
  50. package/charts/TODO charts/docs/TODO.md +0 -1
  51. package/charts/TODO charts/docs/costruzione display rating.md +0 -145
  52. package/charts/TODO charts/test/node-test.mjs +0 -92
  53. package/charts/TODO charts/test/test-readme.md +0 -23
  54. package/charts/TODO charts/test/test-src/rating-display-extra-test.js +0 -132
  55. package/charts/TODO charts/test/test-src/rating-display-test.js +0 -155
  56. package/charts/TODO charts/test/textToPath-test.mjs +0 -14
  57. package/charts/TODO.md +0 -7
  58. package/charts/src/node-helpers/TODO.md +0 -2
  59. package/dev-tools/starter-kit/TODO.md +0 -135
  60. package/src/components/TODO form-multiselect/form-multiselect.css +0 -40
  61. package/src/components/TODO form-multiselect/form-multiselect.js +0 -83
  62. package/src/components/TODO vanilla-cookie-consent/cookie-consent.css +0 -20
  63. package/src/components/TODO vanilla-cookie-consent/cookie-consent.js +0 -76
  64. package/src/components/TODO vanilla-cookie-consent/render-cookie-list.js +0 -32
  65. package/src/components/TODO vanilla-cookie-consent/src/cookie-list.js +0 -85
  66. package/src/components/TODO vanilla-cookie-consent/src/it-translation.js +0 -38
  67. package/src/components/TODO vanilla-cookie-consent/src/run-analytics.js +0 -54
  68. package/src/components/TODO vanilla-cookie-consent/src/run-recaptcha.js +0 -71
  69. package/src/components/autocomplete/TODO.md +0 -4
  70. package/src/web-components/TODO json-table/README.md +0 -67
  71. package/src/web-components/TODO json-table/TODO.md +0 -12
  72. package/src/web-components/TODO json-table/_work/OLD/docs/custom-props-list.md +0 -69
  73. package/src/web-components/TODO json-table/_work/OLD/script/create-css-custom-props-doc.mjs +0 -113
  74. package/src/web-components/TODO json-table/_work/OLD/script/src/custom-props-end.md +0 -4
  75. package/src/web-components/TODO json-table/_work/OLD/script/src/custom-props-start.md +0 -30
  76. package/src/web-components/TODO json-table/_work/OLD/src/css/icons.module.css +0 -22
  77. package/src/web-components/TODO json-table/_work/OLD/src/css/info.module.css +0 -42
  78. package/src/web-components/TODO json-table/_work/OLD/src/css/main-wrapper.module.css +0 -4
  79. package/src/web-components/TODO json-table/_work/OLD/src/css/table.module.css +0 -154
  80. package/src/web-components/TODO json-table/_work/OLD/src/css/utility.module.css +0 -9
  81. package/src/web-components/TODO json-table/_work/OLD/src/icons/false.svg +0 -1
  82. package/src/web-components/TODO json-table/_work/OLD/src/icons/search-arrows.svg +0 -1
  83. package/src/web-components/TODO json-table/_work/OLD/src/icons/true.svg +0 -1
  84. package/src/web-components/TODO json-table/_work/OLD/src/index.js +0 -56
  85. package/src/web-components/TODO json-table/_work/OLD/src/js/default-columns-data-types.js +0 -172
  86. package/src/web-components/TODO json-table/_work/OLD/src/js/defaults.js +0 -156
  87. package/src/web-components/TODO json-table/_work/OLD/src/js/info-section.js +0 -31
  88. package/src/web-components/TODO json-table/_work/OLD/src/js/listeners.js +0 -17
  89. package/src/web-components/TODO json-table/_work/OLD/src/js/main-builder.js +0 -26
  90. package/src/web-components/TODO json-table/_work/OLD/src/js/parse-params.js +0 -121
  91. package/src/web-components/TODO json-table/_work/OLD/src/js/set-column-classname.js +0 -22
  92. package/src/web-components/TODO json-table/_work/OLD/src/js/table-builder.js +0 -64
  93. package/src/web-components/TODO json-table/_work/OLD/src/js/table-foot.js +0 -8
  94. package/src/web-components/TODO json-table/_work/OLD/src/js/table-head.js +0 -47
  95. package/src/web-components/TODO json-table/_work/OLD/src/js/table-row.js +0 -83
  96. package/src/web-components/TODO json-table/_work/OLD/src/js/utilities.js +0 -5
  97. package/src/web-components/TODO json-table/_work/__json-table-react/index.js +0 -4
  98. package/src/web-components/TODO json-table/_work/__json-table-react/src/build-page-array.js +0 -73
  99. package/src/web-components/TODO json-table/_work/__json-table-react/src/columns-data-types.js +0 -73
  100. package/src/web-components/TODO json-table/_work/__json-table-react/src/defaults.js +0 -50
  101. package/src/web-components/TODO json-table/_work/__json-table-react/src/download-excel.js +0 -156
  102. package/src/web-components/TODO json-table/_work/__json-table-react/src/set-className.js +0 -19
  103. package/src/web-components/TODO json-table/_work/__json-table-react/src/set-download-filename.js +0 -17
  104. package/src/web-components/TODO json-table/_work/__json-table-react/src/table-to-csv.js +0 -48
  105. package/src/web-components/TODO json-table/_work/archived/table-to-csv.js +0 -48
  106. package/src/web-components/TODO json-table/_work/arrow.svg +0 -3
  107. package/src/web-components/TODO json-table/_work/da decidere/get-cell-data.js +0 -18
  108. package/src/web-components/TODO json-table/_work/download-button.js +0 -29
  109. package/src/web-components/TODO json-table/_work/download-excel.js +0 -155
  110. package/src/web-components/TODO json-table/_work/pagination-array-builder.js +0 -73
  111. package/src/web-components/TODO json-table/_work/pagination.js +0 -37
  112. package/src/web-components/TODO json-table/_work/set-download-filename.js +0 -19
  113. package/src/web-components/TODO json-table/_work/table-info.js +0 -24
  114. package/src/web-components/TODO json-table/demo/README.md +0 -66
  115. package/src/web-components/TODO json-table/demo/assets/link-simple.svg +0 -1
  116. package/src/web-components/TODO json-table/demo/demo-data/json-static-table-demo-data.js +0 -512
  117. package/src/web-components/TODO json-table/demo/demo.css +0 -32
  118. package/src/web-components/TODO json-table/demo/demo.js +0 -24
  119. package/src/web-components/TODO json-table/demo/js/demo-ajax-table.js +0 -165
  120. package/src/web-components/TODO json-table/demo/js/demo-static-table.js +0 -180
  121. package/src/web-components/TODO json-table/demo/webpack-modules/css-rules.mjs +0 -122
  122. package/src/web-components/TODO json-table/demo/webpack-modules/get-jsConfig-aliases.mjs +0 -33
  123. package/src/web-components/TODO json-table/demo/webpack-modules/svg-rules.mjs +0 -108
  124. package/src/web-components/TODO json-table/demo/webpack-modules/svgo.config.mjs +0 -26
  125. package/src/web-components/TODO json-table/demo/webpack.config.mjs +0 -333
  126. package/src/web-components/TODO json-table/docs/custom-props-list.md +0 -74
  127. package/src/web-components/TODO json-table/docs-builder/create-css-custom-props-doc.mjs +0 -157
  128. package/src/web-components/TODO json-table/docs-builder/src/custom-props-end.md +0 -6
  129. package/src/web-components/TODO json-table/docs-builder/src/custom-props-start.md +0 -29
  130. package/src/web-components/TODO json-table/src/TODO.md +0 -1
  131. package/src/web-components/TODO json-table/src/__json-table-react/build-page-array.js +0 -73
  132. package/src/web-components/TODO json-table/src/__json-table-react/columns-data-types.js +0 -73
  133. package/src/web-components/TODO json-table/src/__json-table-react/defaults.js +0 -50
  134. package/src/web-components/TODO json-table/src/__json-table-react/download-excel.js +0 -156
  135. package/src/web-components/TODO json-table/src/__json-table-react/set-className.js +0 -19
  136. package/src/web-components/TODO json-table/src/__json-table-react/set-download-filename.js +0 -17
  137. package/src/web-components/TODO json-table/src/__json-table-react/table-to-csv.js +0 -48
  138. package/src/web-components/TODO json-table/src/css/custom-media.css +0 -16
  139. package/src/web-components/TODO json-table/src/css/icons.module.css +0 -22
  140. package/src/web-components/TODO json-table/src/css/info-section.module.css +0 -78
  141. package/src/web-components/TODO json-table/src/css/main-builder.module.css +0 -6
  142. package/src/web-components/TODO json-table/src/css/table.module.css +0 -172
  143. package/src/web-components/TODO json-table/src/css/utility.module.css +0 -9
  144. package/src/web-components/TODO json-table/src/icons/arrow-down-bold.svg +0 -1
  145. package/src/web-components/TODO json-table/src/icons/false.svg +0 -1
  146. package/src/web-components/TODO json-table/src/icons/true.svg +0 -1
  147. package/src/web-components/TODO json-table/src/index.js +0 -125
  148. package/src/web-components/TODO json-table/src/js/default-columns-data-types.js +0 -172
  149. package/src/web-components/TODO json-table/src/js/defaults.js +0 -510
  150. package/src/web-components/TODO json-table/src/js/get-ajax-data.js +0 -72
  151. package/src/web-components/TODO json-table/src/js/info-section.js +0 -39
  152. package/src/web-components/TODO json-table/src/js/init-ajax-table.js +0 -30
  153. package/src/web-components/TODO json-table/src/js/init-static-table.js +0 -18
  154. package/src/web-components/TODO json-table/src/js/main-builder.js +0 -87
  155. package/src/web-components/TODO json-table/src/js/parse-data-row.js +0 -123
  156. package/src/web-components/TODO json-table/src/js/parse-params.js +0 -118
  157. package/src/web-components/TODO json-table/src/js/set-search-listener.js +0 -62
  158. package/src/web-components/TODO json-table/src/js/set-sort-listeners.js +0 -115
  159. package/src/web-components/TODO json-table/src/js/static-data-sorting.js +0 -23
  160. package/src/web-components/TODO json-table/src/js/table-builder.js +0 -45
  161. package/src/web-components/TODO json-table/src/js/table-row.js +0 -43
  162. package/src/web-components/TODO json-table/src/js/table-tfoot.js +0 -9
  163. package/src/web-components/TODO json-table/src/js/table-thead.js +0 -91
  164. package/src/web-components/TODO json-table/src/js/update-info.js +0 -42
  165. package/src/web-components/TODO json-table/src/js/utilities.js +0 -5
@@ -1,87 +0,0 @@
1
- import * as styles from '../css/main-builder.module.css';
2
- import { classnames } from '@massimo-cassandro/js-utilities/index.js';
3
- import { domBuilder } from '@massimo-cassandro/dom-builder/index.js';
4
-
5
- export function mainBuilder() {
6
-
7
- /*
8
- <section class="wrapper">
9
- <div class="infoOuterContainer">
10
- <!-- content -->
11
- </div>
12
-
13
- <div class="tableWrapper">
14
- <table>
15
- <caption>Static table demo</caption>
16
- <thead>
17
- <!-- thead rows -->
18
- </thead>
19
- <tbody>
20
- <!-- tbody rows -->
21
- </table>
22
- </table>
23
- </div>
24
-
25
- </section>
26
- */
27
-
28
- domBuilder([
29
- {
30
- tag: 'section',
31
- className: classnames(styles.wrapper, this.params.mainWrapperExtraClassName),
32
- children: [
33
- ...this.infoSection(),
34
- ...this.tableBuilder()
35
- ]
36
- }
37
- ], this.params.container);
38
-
39
- if(!this.params.ajax) {
40
- this.params.elements.tbodyRows = this.params.elements.table.querySelectorAll('tbody tr');
41
- }
42
-
43
- this.updateInfo();
44
- this.setSearchListener();
45
- this.setSortListeners();
46
-
47
-
48
- // TODO pagination => https://www.taniarascia.com/front-end-tables-sort-filter-paginate/
49
-
50
-
51
-
52
- // TODO check custom event
53
- // ready customEvent
54
- const event = new CustomEvent('jt:ready', { detail: { jsonTable: this }, bubbles: true });
55
- // dispatch into the next microtask so any listeners registered immediately after the instance can intercept it
56
- Promise.resolve().then(() => this.params.container.dispatchEvent(event));
57
- }
58
-
59
-
60
- /*
61
- // TODO resize observer per calcolo altezza infoOuterContainer
62
-
63
- // TODO wrapper con altezza definita per abilitare il thead sticky
64
- // stabilire una proprietà css per lo spazio dal bordo inferiore del viewport e definire l'altezza di conseguenza.
65
- // Oppure impostare una variabile per altezza arbitraria.
66
- // Da ricalcolare con resize observer??
67
-
68
-
69
- const infoSection = document.querySelector('.infoOuterContainer');
70
- const tableWrapper = document.querySelector('.tableWrapper');
71
-
72
- if (infoSection && tableWrapper) {
73
- const resizeObserver = new ResizeObserver(entries => {
74
- for (let entry of entries) {
75
- // Prende l'altezza esatta dell'elemento incluse le variazioni responsive
76
- const height = entry.contentRect.height +
77
- parseFloat(getComputedStyle(infoSection).paddingTop) +
78
- parseFloat(getComputedStyle(infoSection).paddingBottom);
79
-
80
- tableWrapper.style.setProperty('--js-thead-sticky-top', `${height}px`);
81
- }
82
- });
83
-
84
- resizeObserver.observe(infoSection);
85
- }
86
-
87
- */
@@ -1,123 +0,0 @@
1
- /**
2
- * Parses a data row and prepares it for rendering, searching, and sorting
3
- *
4
- * @param {Object} dataRow - The data row object to parse
5
- * @param {Object} dataRow.idx - Row unique index, if needed (static tables only)
6
- * @returns {void}
7
- * @description This function processes a single data row by:
8
- * - Adding unique identifiers to rows if needed
9
- * - Extracting and parsing cell content using custom parse functions or dataType parsers
10
- * - Rendering content using custom render functions
11
- * - Storing parsed data (raw, display, searching, and sorting values) for efficiency
12
- * @note Only works on static tables or on AJAX mode with specific dataRow object
13
- */
14
-
15
- import { isFunction } from './utilities.js';
16
- import * as iconStyles from '../css/icons.module.css';
17
- import { classnames } from '@massimo-cassandro/js-utilities/index.js';
18
-
19
- export function parseDataRow({
20
- dataRow = {},
21
- idx = null,
22
- isTbody = true
23
- }){
24
-
25
- try {
26
-
27
- const parsedRow = {};
28
-
29
- // adding unique index (static table only)
30
- if(idx != null) {
31
- parsedRow.jtId = idx;
32
- }
33
-
34
- // exclude any unnecessary data
35
- this.params.columns.forEach(col => {
36
-
37
-
38
- let raw_content, content;
39
-
40
- const datatypeObj = this.params.dataTypes[col.dataType]?? {};
41
-
42
- if(col.parse && isFunction(col.parse)) {
43
- raw_content = col.parse(dataRow);
44
- } else {
45
- raw_content = dataRow[col.key];
46
- }
47
-
48
- // if parent is 'tfoot', columns with `tfoot: false` in their column definitions are not rendered
49
- if(!isTbody && !col.tfoot) {
50
- content = '';
51
-
52
- } else if(raw_content === 0 && this.params.useZeroAltChar) {
53
- content = this.params.zeroAltChar;
54
-
55
- // All `render` functions are invoked with the `raw_content` value and the global params object as arguments
56
- } else if(col.render && isFunction(col.render)) {
57
- content = col.render(raw_content, this.params);
58
-
59
- } else if(col.dataType && isFunction(datatypeObj?.render)) {
60
- content = datatypeObj.render(raw_content, this.params);
61
-
62
- } else if(raw_content == null) {
63
- content = '';
64
-
65
- } else {
66
- content = raw_content;
67
- }
68
-
69
- parsedRow[col.key] = {
70
- raw: raw_content,
71
- type: col.dataType,
72
- // datatypeObj: datatypeObj,
73
- displayValue: content,
74
- };
75
-
76
- parsedRow[col.key].className = classnames(
77
- col.className,
78
-
79
- // any default classes defined by the cell's dataType
80
- col.dataType? this.params.dataTypes[col.dataType]?.className : null,
81
-
82
- // custom bool icons
83
- this.params.boolValuesClassName,
84
- this.params.boolTrueClassName && parsedRow[col.key].raw === true
85
- ? this.params.boolTrueClassName
86
- : null,
87
- this.params.boolFalseClassName && parsedRow[col.key].raw === false
88
- ? this.params.boolFalseClassName
89
- : null,
90
-
91
- // default icon styles
92
- !this.params.boolValuesClassName
93
- ? parsedRow[col.key].raw === true
94
- ? iconStyles.true
95
- : iconStyles.false
96
- : null
97
- );
98
-
99
- if(isTbody && !this.params.ajax) {
100
- parsedRow[col.key].searchingValue = col.searchValueCustomParser != null
101
- ? col.searchValueCustomParser(raw_content, this.params)
102
- : datatypeObj.searchValueParser
103
- ? datatypeObj.searchValueParser(raw_content, this.params)
104
- : String(raw_content);
105
-
106
- parsedRow[col.key].sortingValue = col.sortValueCustomParser != null
107
- ? col.sortValueCustomParser(raw_content, this.params)
108
- : datatypeObj.sortValueParser
109
- ? datatypeObj.sortValueParser(raw_content, this.params)
110
- : raw_content;
111
- }
112
-
113
- }); // end foreach
114
-
115
- return parsedRow;
116
-
117
- } catch(e) {
118
- console.error( e ); // eslint-disable-line
119
- }
120
-
121
-
122
-
123
- }
@@ -1,118 +0,0 @@
1
-
2
- import { defaults_params, columns_default } from './defaults.js';
3
- import { defaultDataTypes } from './default-columns-data-types.js';
4
-
5
- export function parseParams({custom_params = {}, custom_data_types = {}}) {
6
-
7
- try {
8
-
9
-
10
- const params = {
11
- ...defaults_params,
12
- ...(JSON.parse(custom_params?.container?.dataset?.params?? null)?? {}), // params from `data-params` attribute
13
- ...custom_params
14
- };
15
-
16
- if(!params.container || !(params.container instanceof HTMLElement)) {
17
- throw '`container` parameter not present or not a DOM element';
18
- }
19
-
20
- // ENHANCEMENT jqDatatableCompliant
21
- // temporarily force `jqDatatableCompliant` to true
22
- params.jqDatatableCompliant = true;
23
-
24
-
25
-
26
- // ENHANCEMENT download btn
27
- // if(params.ajax === true) {
28
- // params.showDownloadBtn = false;
29
- // }
30
-
31
-
32
- // =>> DATA TYPES
33
- // parse default datatypes
34
- params.dataTypes = defaultDataTypes(params);
35
-
36
- // if custom_data_types are provided, they are merged with the one defined in the `inheritsFrom` key
37
- if(Object.keys(custom_data_types).length) {
38
-
39
- for(const key in custom_data_types) {
40
- if(custom_data_types[key].inheritsFrom) {
41
- custom_data_types[key] = {
42
- ...params.dataTypes[custom_data_types[key].inheritsFrom],
43
- ...custom_data_types[key]
44
- };
45
- }
46
- }
47
- // merge custom data types with the default ones
48
- params.dataTypes = {...params.dataTypes, ...custom_data_types};
49
- }
50
-
51
-
52
- // check if the dataTypes are valid
53
- const dataTypesList = Object.keys(params.dataTypes);
54
- params.columns.forEach(col => {
55
- if(col.dataType && !dataTypesList.includes(col.dataType)) {
56
- throw `JsonTable: Invalid data type for column with key '${col.key}' (${col.dataType})`;
57
- }
58
- });
59
-
60
-
61
- // =>> COLUMNS
62
-
63
- // build columns definition array
64
- params.columns = params.columns.map(col => {
65
-
66
- const inheritedDatatype = params.dataTypes[col.dataType]?.inheritsFrom?? null;
67
-
68
- return {
69
- // default values
70
- ...columns_default,
71
-
72
- // override values for columns with specific dataTypes (from the `colDefaultsOverrides` object in dataTypes)`)
73
- ...(params.dataTypes[col.dataType]?.colDefaultsOverrides?? {}),
74
-
75
- // same, from the inherited dataType, if exists
76
- ...(inheritedDatatype? params.dataTypes[inheritedDatatype].colDefaultsOverrides?? {} : {}),
77
-
78
- // user settings
79
- ...col
80
- };
81
- });
82
-
83
-
84
- // columns key list and check for missing ones
85
- params.fieldKeysList = params.columns.reduce((acc, col, idx) => {
86
- if(!col.key) {
87
- throw `JsonTable: Missing key for column #${idx}`;
88
- }
89
- acc.push(col.key);
90
- return acc;
91
- }, []);
92
-
93
- // default sorting check
94
- params.defaultSorting??= {}; // force null to empty object
95
-
96
- Object.keys(params.defaultSorting).forEach(sort_key => {
97
-
98
- if(!params.fieldKeysList.includes(sort_key)) {
99
- throw `JsonTable: Invalid sort key '${sort_key}'`;
100
- }
101
-
102
- // force sorting direction to lowercase
103
- params.defaultSorting[sort_key] = params.defaultSorting[sort_key].toLowerCase();
104
- if(['asc', 'desc'].indexOf(params.defaultSorting[sort_key]) === -1) {
105
- throw `JsonTable: Invalid sorting direction for column with key '${sort_key}' `+
106
- `(${params.defaultSorting[sort_key]} instead of 'sort' or 'desc')`;
107
- }
108
- });
109
-
110
- return params;
111
-
112
- } catch(e) {
113
- return {err: e};
114
- }
115
-
116
- }
117
-
118
-
@@ -1,62 +0,0 @@
1
-
2
- /**
3
- * Listener for search input
4
- */
5
-
6
- // TODO form ricerca: prevedere salvataggio dati ricerca nel sessionstorage
7
- // TODO form ricerca: datalist
8
-
9
- export function setSearchListener(){
10
- const searchInput = this.params.elements.searchInput;
11
-
12
- if(searchInput && this.params.search) {
13
-
14
- let searchtimer;
15
- searchInput.addEventListener('input', () => {
16
- clearTimeout(searchtimer);
17
- searchtimer = setTimeout(() => {
18
- const toBeSearchedValue = searchInput.value.trim();
19
-
20
- const test_regexp = new RegExp(toBeSearchedValue, 'i');
21
- if(this.ajax) {
22
- // TODO ajax search
23
-
24
- } else {
25
-
26
-
27
-
28
- this.params.elements.tbodyRows.forEach(tr => {
29
- const rowId = +tr.dataset.jtId;
30
-
31
- let result = false;
32
- tr.querySelectorAll('th, td').forEach(cell => {
33
- const cellData = this.parsedData.filter(data => // parsedData is generated into `table-row.js` for static data only
34
- data.rowId === rowId &&
35
- data.key === cell.dataset.key
36
- )?.[0]?? null;
37
-
38
- const found = cellData != null
39
- ? toBeSearchedValue? test_regexp.test(cellData.searchingValue) : true // if toBeSearchedValue is an empty string all rows are returned
40
- : false;
41
-
42
- cell.innerHTML = (toBeSearchedValue && cellData != null)
43
- ? cellData.displayValue.replace(
44
- RegExp('(?![^<]*>)' + toBeSearchedValue, 'ig'), // ignores matches occurring inside html tags
45
- `<mark>${toBeSearchedValue}</mark>`
46
- )
47
- : cellData.displayValue;
48
-
49
- result = result || found;
50
- });
51
-
52
- tr.toggleAttribute('hidden', !result);
53
- });
54
- }
55
-
56
- this.updateInfo();
57
-
58
- }, 400);
59
-
60
- }, false);
61
- }
62
- }
@@ -1,115 +0,0 @@
1
- import * as styles from '../css/table.module.css';
2
- import { domBuilder } from '@massimo-cassandro/dom-builder/index.js';
3
-
4
- // TODO defaultSorting => conversione nel formato datatable se jqDatatableCompliant = true
5
-
6
- export function setSortListeners(){
7
-
8
- this.params.activeSorting = { ...this.params.defaultSorting }; // to preserve the original sorting
9
-
10
- this.params.elements.thead.addEventListener('click', e => {
11
-
12
- const hasShiftKey = e.shiftKey,
13
- sortBtn = e.target.closest(`.${styles.sortArrow}`);
14
-
15
- if( sortBtn ) {
16
- const columnKey = sortBtn.closest('th').dataset.key;
17
-
18
- // each click activate a sort direction in this order: asc, desc or none (null)
19
- const newDirection = this.params.activeSorting[columnKey] == null
20
- ? 'asc'
21
- : this.params.activeSorting[columnKey] === 'asc'
22
- ? 'desc'
23
- : null;
24
-
25
- if(!hasShiftKey) {
26
- this.params.elements.thead.querySelectorAll(`.${styles.sortActive}`).forEach(el => {
27
- el.classList.remove(styles.sortActive);
28
- });
29
- this.params.activeSorting = {};
30
- }
31
-
32
- // TODO aria attrs (vedi sotto)
33
-
34
- sortBtn.classList.toggle(styles.sortActive, newDirection != null);
35
- this.params.activeSorting[columnKey] = newDirection;
36
-
37
-
38
- // TODO wait for shift click ending
39
- if (this.params.ajax) {
40
- // TODO ajax sorting (vedi datatable-like url in _work)
41
-
42
- } else {
43
-
44
- const sorted = this.staticDataSorting();
45
-
46
- domBuilder(
47
- sorted.map( row_data => this.tableRow(row_data)),
48
- this.params.elements.tbody,
49
- {emptyParent: true}
50
- );
51
-
52
- }
53
- }
54
-
55
- }, false);
56
- }
57
-
58
-
59
- /*
60
- Per rendere accessibile un pulsante di ordinamento all'interno di una cella di intestazione (`<th>`), non basta l'aspetto visivo. È necessario comunicare agli screen reader la funzione del pulsante e, soprattutto, lo **stato corrente** dell'ordinamento.
61
-
62
- Ecco gli attributi ARIA e i ruoli fondamentali da utilizzare:
63
-
64
- ---
65
-
66
- ### 1. Attributi ARIA Fondamentali
67
-
68
- Quando un pulsante controlla l'ordinamento, l'attributo più importante risiede sulla cella genitore (`<th>`), mentre il pulsante gestisce l'interazione.
69
-
70
- * **`aria-sort` (sull'elemento `<th>`):**
71
- Indica se la colonna è ordinata e in quale direzione. I valori possibili sono:
72
- * `ascending`: Ordinamento crescente.
73
- * `descending`: Ordinamento decrescente.
74
- * `none`: La colonna è ordinabile ma non è attualmente ordinata.
75
-
76
-
77
- * **`aria-label` o testo descrittivo (sul pulsante):**
78
- Il pulsante deve avere un nome accessibile chiaro. Invece di un generico "Ordina", è meglio usare "Ordina per [Nome Colonna]".
79
- * **`aria-pressed` (opzionale sul pulsante):**
80
- Se vuoi indicare che il pulsante è "attivo", puoi usare questo stato, anche se `aria-sort` sul `th` è solitamente sufficiente per il contesto della tabella.
81
-
82
- ---
83
-
84
- ### 2. Struttura del Codice (Esempio)
85
-
86
- Ecco come implementare correttamente il pattern per una colonna che viene ordinata in modo crescente:
87
-
88
- ```html
89
- <th scope="col" aria-sort="ascending">
90
- <button type="button" aria-label="Ordina per Nome in modo decrescente">
91
- Nome
92
- <span aria-hidden="true">↑</span>
93
- </button>
94
- </th>
95
-
96
- ```
97
-
98
- ### 3. Best Practices per l'Accessibilità
99
-
100
- * **Non usare `role="button"` su tutto:** Se usi il tag HTML `<button>`, il ruolo è implicito. Non serve aggiungerlo manualmente.
101
- * **Gestione del Focus:** Quando l'utente clicca sul pulsante e la tabella si aggiorna, il focus deve rimanere sul pulsante stesso per permettere di cambiare nuovamente l'ordinamento senza dover navigare di nuovo l'intera pagina.
102
- * **Aggiornamento Dinamico:** Quando lo stato cambia da crescente a decrescente, devi aggiornare via JavaScript sia l'attributo `aria-sort` sul `<th>` che l' `aria-label` (o il testo nascosto) sul pulsante.
103
- * **Icone:** Se usi icone (come frecce), nascondile agli screen reader con `aria-hidden="true"`, poiché l'informazione è già fornita dagli attributi ARIA.
104
-
105
- ---
106
-
107
- ### Riepilogo degli Stati
108
-
109
- | Stato della Colonna | Valore `aria-sort` (su `th`) | Suggerimento `aria-label` (su `button`) |
110
- | --- | --- | --- |
111
- | Non ordinata | `none` | "Ordina per [Nome]" |
112
- | Crescente (A-Z) | `ascending` | "Ordina decrescente" |
113
- | Decrescente (Z-A) | `descending` | "Rimuovi ordinamento" o "Ordina crescente" |
114
-
115
- */
@@ -1,23 +0,0 @@
1
-
2
-
3
- export function staticDataSorting(useDefaultSorting = false) {
4
-
5
-
6
- const sortingObj = useDefaultSorting? { ...this.params.defaultSorting?? {} } : { ...this.params.activeSorting?? {} };
7
-
8
- if(Object.keys(sortingObj)) {
9
-
10
- // parsedData is generated into `table-row.js` for static data only
11
- // return this.parsedData.toSorted( (a, b) => {
12
-
13
- // let ts = (a.ts === null) - (b.ts === null) || a.ts - b.ts;
14
- // let rk = b.rk - a.rk;
15
- // return ts || rk;
16
- // });
17
- return this.params.data;
18
-
19
- } else {
20
- return this.params.data;
21
- }
22
-
23
- }
@@ -1,45 +0,0 @@
1
- import { classnames } from '@massimo-cassandro/js-utilities/index.js';
2
-
3
- import * as styles from '../css/table.module.css';
4
-
5
-
6
-
7
- export function tableBuilder() {
8
- return [
9
- {
10
- className: styles.tableWrapper,
11
- children: [
12
- {
13
- tag: 'table',
14
- className: classnames(styles.table, this.params.tableClassName),
15
- id: this.params.tableId,
16
- callback: el => this.params.elements.table = el,
17
- children: [
18
- {
19
- tag: 'caption',
20
- condition: !!this.params.caption,
21
- content: this.params.caption
22
- },
23
- // thead
24
- this.tableThead(),
25
-
26
- // tbody
27
- {
28
- tag: 'tbody',
29
- callback: el => this.params.elements.tbody = el,
30
-
31
- children: this.params.ajax
32
- ? [] // TODO dati da ajax
33
- : this.params.data.map(row_data => this.tableRow(row_data))
34
- },
35
-
36
- // tfoot
37
- // TODO tfoot ajax ???
38
- this.tableTfoot(),
39
-
40
- ]
41
- }
42
- ]
43
- }
44
- ];
45
- }
@@ -1,43 +0,0 @@
1
- import { isFunction } from './utilities.js';
2
-
3
-
4
- export function tableRow(row_data, parent = 'tbody') {
5
-
6
- // parent: tbody or tfoot
7
-
8
- return {
9
- tag: 'tr',
10
- attrs: {
11
- 'data-jt-id': (!this.params.ajax) && parent === 'tbody'? row_data.jtId : null
12
- },
13
- children: this.params.columns.map((col, i) => {
14
-
15
- const parsedData = this.params.ajax
16
- ? this.parseDataRow({
17
- dataRow: row_data,
18
- isTbody: parent === 'tbody'
19
- })
20
- : row_data; // Static data has already been parsed at startup
21
-
22
-
23
- const tag = col.rowHeading && i === 0? 'th' : 'td';
24
-
25
- return {
26
- tag: tag,
27
- className: parsedData[col.key]?.className,
28
- attrs: {
29
- scope: tag === 'th'? 'row' : null,
30
- 'data-key': col.key, // key for cell data
31
- },
32
- content : parsedData[col.key].displayValue
33
- }; // end cell
34
- }), // end columns map
35
-
36
- // tr callback => eseguito al completamento della costruzione della tabella in main-builder
37
- callback: isFunction(this.params.trCallback) && parent === 'tbody'
38
- ? tr => this.params.trCallback(tr, row_data, this.params)
39
- : null
40
-
41
- }; // end tr
42
-
43
- }
@@ -1,9 +0,0 @@
1
-
2
- export function tableTfoot() {
3
-
4
- return {
5
- tag: 'tfoot',
6
- condition: this.params.footerData.length,
7
- children:this.params.footerData.map(row_data => this.tableRow(row_data, 'tfoot'))
8
- };
9
- }