@massimo-cassandro/minimo 1.18.4 → 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.
- package/README.md +5 -1
- package/design-tokens/{utilities/readme.md → README.md} +26 -16
- package/design-tokens/tokens/src/components/unsplash-page/unsplash-page.minimo.tokens.jsonc +69 -31
- package/design-tokens/{utilities/tokens-config-sample.mjs → tokens-config-sample.mjs} +18 -10
- package/design-tokens/utilities/build-tokens-src/config.mjs +5 -0
- package/design-tokens/utilities/build-tokens-src/formats/css.mjs +18 -2
- package/design-tokens/utilities/build-tokens-src/merge-css.mjs +60 -0
- package/design-tokens/utilities/build-tokens.mjs +12 -0
- package/dev-tools/README.md +8 -0
- package/dev-tools/starter-kit/starter-install.sh +46 -26
- package/package.json +6 -2
- package/snippets/error-pages/error-pages.js +3 -2
- package/src/components/unsplash-page/unsplash-page.minimo.tokens.mjs +78 -39
- package/src/components/unsplash-page/unsplash-page.module.css +25 -6
- package/src/custom-properties.css +8 -1
- package/src/minimo.css +1 -1
- package/src/web-components/s-datatable-component/s-datatable-component.js +4 -1
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/index.js +0 -92
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/hbars.js +0 -356
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/pie.js +0 -245
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/radial-bars.js +0 -177
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/rating-display.js +0 -835
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/costruzione-assi.js +0 -212
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/costruzione-linee.js +0 -101
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/defaults.js +0 -185
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/display-current.js +0 -27
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/grid-areas.js +0 -129
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/parse-opts.js +0 -64
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile-src/paths-setup.js +0 -73
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/settimanale-mensile.js +0 -126
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/charts/signal-bars.js +0 -290
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/src/week-utils.js +0 -122
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/hbars-test.js +0 -52
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/mcn-test.js +0 -74
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/pie-test.js +0 -16
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/radial-bars-test.js +0 -48
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/settimanale-mensile-dati-settimanale.js +0 -426
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/settimanale-mensile-test.js +0 -260
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/browser-test/src/signal-bars-test.js +0 -64
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/node-test.mjs +0 -86
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/hBars-node-test.mjs +0 -40
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/lines-node-test.mjs +0 -73
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/mcn-node-test.mjs +0 -64
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/pie-node-test.mjs +0 -12
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/radialsBar-node-test.mjs +0 -44
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/settimanale-mensile-node-test.mjs +0 -258
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/node-test/src/signalBars-node-test.mjs +0 -36
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/test-readme.md +0 -24
- package/charts/TODO charts/1a-vers DA RIFATTORIZZARE/test/textToPath-test.mjs +0 -14
- package/charts/TODO charts/???/InfoBox.js +0 -456
- package/charts/TODO charts/???/README-upg OLD/342/206/222NEW.md" +0 -53
- package/charts/TODO charts/???/README.md +0 -1
- package/charts/TODO charts/???/TODO.md +0 -39
- package/charts/TODO charts/???/base-cfg.js +0 -66
- package/charts/TODO charts/???/rating-displayOLD.js +0 -837
- package/charts/TODO charts/docs/TODO.md +0 -1
- package/charts/TODO charts/docs/costruzione display rating.md +0 -145
- package/charts/TODO charts/test/node-test.mjs +0 -92
- package/charts/TODO charts/test/test-readme.md +0 -23
- package/charts/TODO charts/test/test-src/rating-display-extra-test.js +0 -132
- package/charts/TODO charts/test/test-src/rating-display-test.js +0 -155
- package/charts/TODO charts/test/textToPath-test.mjs +0 -14
- package/charts/TODO.md +0 -7
- package/charts/src/node-helpers/TODO.md +0 -2
- package/dev-tools/starter-kit/TODO.md +0 -135
- package/src/components/TODO form-multiselect/form-multiselect.css +0 -40
- package/src/components/TODO form-multiselect/form-multiselect.js +0 -83
- package/src/components/TODO vanilla-cookie-consent/cookie-consent.css +0 -20
- package/src/components/TODO vanilla-cookie-consent/cookie-consent.js +0 -76
- package/src/components/TODO vanilla-cookie-consent/render-cookie-list.js +0 -32
- package/src/components/TODO vanilla-cookie-consent/src/cookie-list.js +0 -85
- package/src/components/TODO vanilla-cookie-consent/src/it-translation.js +0 -38
- package/src/components/TODO vanilla-cookie-consent/src/run-analytics.js +0 -54
- package/src/components/TODO vanilla-cookie-consent/src/run-recaptcha.js +0 -71
- package/src/components/autocomplete/TODO.md +0 -4
- package/src/web-components/TODO json-table/README.md +0 -67
- package/src/web-components/TODO json-table/TODO.md +0 -12
- package/src/web-components/TODO json-table/_work/OLD/docs/custom-props-list.md +0 -69
- package/src/web-components/TODO json-table/_work/OLD/script/create-css-custom-props-doc.mjs +0 -113
- package/src/web-components/TODO json-table/_work/OLD/script/src/custom-props-end.md +0 -4
- package/src/web-components/TODO json-table/_work/OLD/script/src/custom-props-start.md +0 -30
- package/src/web-components/TODO json-table/_work/OLD/src/css/icons.module.css +0 -22
- package/src/web-components/TODO json-table/_work/OLD/src/css/info.module.css +0 -42
- package/src/web-components/TODO json-table/_work/OLD/src/css/main-wrapper.module.css +0 -4
- package/src/web-components/TODO json-table/_work/OLD/src/css/table.module.css +0 -154
- package/src/web-components/TODO json-table/_work/OLD/src/css/utility.module.css +0 -9
- package/src/web-components/TODO json-table/_work/OLD/src/icons/false.svg +0 -1
- package/src/web-components/TODO json-table/_work/OLD/src/icons/search-arrows.svg +0 -1
- package/src/web-components/TODO json-table/_work/OLD/src/icons/true.svg +0 -1
- package/src/web-components/TODO json-table/_work/OLD/src/index.js +0 -56
- package/src/web-components/TODO json-table/_work/OLD/src/js/default-columns-data-types.js +0 -172
- package/src/web-components/TODO json-table/_work/OLD/src/js/defaults.js +0 -156
- package/src/web-components/TODO json-table/_work/OLD/src/js/info-section.js +0 -31
- package/src/web-components/TODO json-table/_work/OLD/src/js/listeners.js +0 -17
- package/src/web-components/TODO json-table/_work/OLD/src/js/main-builder.js +0 -26
- package/src/web-components/TODO json-table/_work/OLD/src/js/parse-params.js +0 -121
- package/src/web-components/TODO json-table/_work/OLD/src/js/set-column-classname.js +0 -22
- package/src/web-components/TODO json-table/_work/OLD/src/js/table-builder.js +0 -64
- package/src/web-components/TODO json-table/_work/OLD/src/js/table-foot.js +0 -8
- package/src/web-components/TODO json-table/_work/OLD/src/js/table-head.js +0 -47
- package/src/web-components/TODO json-table/_work/OLD/src/js/table-row.js +0 -83
- package/src/web-components/TODO json-table/_work/OLD/src/js/utilities.js +0 -5
- package/src/web-components/TODO json-table/_work/__json-table-react/index.js +0 -4
- package/src/web-components/TODO json-table/_work/__json-table-react/src/build-page-array.js +0 -73
- package/src/web-components/TODO json-table/_work/__json-table-react/src/columns-data-types.js +0 -73
- package/src/web-components/TODO json-table/_work/__json-table-react/src/defaults.js +0 -50
- package/src/web-components/TODO json-table/_work/__json-table-react/src/download-excel.js +0 -156
- package/src/web-components/TODO json-table/_work/__json-table-react/src/set-className.js +0 -19
- package/src/web-components/TODO json-table/_work/__json-table-react/src/set-download-filename.js +0 -17
- package/src/web-components/TODO json-table/_work/__json-table-react/src/table-to-csv.js +0 -48
- package/src/web-components/TODO json-table/_work/archived/table-to-csv.js +0 -48
- package/src/web-components/TODO json-table/_work/arrow.svg +0 -3
- package/src/web-components/TODO json-table/_work/da decidere/get-cell-data.js +0 -18
- package/src/web-components/TODO json-table/_work/download-button.js +0 -29
- package/src/web-components/TODO json-table/_work/download-excel.js +0 -155
- package/src/web-components/TODO json-table/_work/pagination-array-builder.js +0 -73
- package/src/web-components/TODO json-table/_work/pagination.js +0 -37
- package/src/web-components/TODO json-table/_work/set-download-filename.js +0 -19
- package/src/web-components/TODO json-table/_work/table-info.js +0 -24
- package/src/web-components/TODO json-table/demo/README.md +0 -66
- package/src/web-components/TODO json-table/demo/assets/link-simple.svg +0 -1
- package/src/web-components/TODO json-table/demo/demo-data/json-static-table-demo-data.js +0 -512
- package/src/web-components/TODO json-table/demo/demo.css +0 -32
- package/src/web-components/TODO json-table/demo/demo.js +0 -24
- package/src/web-components/TODO json-table/demo/js/demo-ajax-table.js +0 -165
- package/src/web-components/TODO json-table/demo/js/demo-static-table.js +0 -180
- package/src/web-components/TODO json-table/demo/webpack-modules/css-rules.mjs +0 -122
- package/src/web-components/TODO json-table/demo/webpack-modules/get-jsConfig-aliases.mjs +0 -33
- package/src/web-components/TODO json-table/demo/webpack-modules/svg-rules.mjs +0 -108
- package/src/web-components/TODO json-table/demo/webpack-modules/svgo.config.mjs +0 -26
- package/src/web-components/TODO json-table/demo/webpack.config.mjs +0 -333
- package/src/web-components/TODO json-table/docs/custom-props-list.md +0 -74
- package/src/web-components/TODO json-table/docs-builder/create-css-custom-props-doc.mjs +0 -157
- package/src/web-components/TODO json-table/docs-builder/src/custom-props-end.md +0 -6
- package/src/web-components/TODO json-table/docs-builder/src/custom-props-start.md +0 -29
- package/src/web-components/TODO json-table/src/TODO.md +0 -1
- package/src/web-components/TODO json-table/src/__json-table-react/build-page-array.js +0 -73
- package/src/web-components/TODO json-table/src/__json-table-react/columns-data-types.js +0 -73
- package/src/web-components/TODO json-table/src/__json-table-react/defaults.js +0 -50
- package/src/web-components/TODO json-table/src/__json-table-react/download-excel.js +0 -156
- package/src/web-components/TODO json-table/src/__json-table-react/set-className.js +0 -19
- package/src/web-components/TODO json-table/src/__json-table-react/set-download-filename.js +0 -17
- package/src/web-components/TODO json-table/src/__json-table-react/table-to-csv.js +0 -48
- package/src/web-components/TODO json-table/src/css/custom-media.css +0 -16
- package/src/web-components/TODO json-table/src/css/icons.module.css +0 -22
- package/src/web-components/TODO json-table/src/css/info-section.module.css +0 -78
- package/src/web-components/TODO json-table/src/css/main-builder.module.css +0 -6
- package/src/web-components/TODO json-table/src/css/table.module.css +0 -172
- package/src/web-components/TODO json-table/src/css/utility.module.css +0 -9
- package/src/web-components/TODO json-table/src/icons/arrow-down-bold.svg +0 -1
- package/src/web-components/TODO json-table/src/icons/false.svg +0 -1
- package/src/web-components/TODO json-table/src/icons/true.svg +0 -1
- package/src/web-components/TODO json-table/src/index.js +0 -125
- package/src/web-components/TODO json-table/src/js/default-columns-data-types.js +0 -172
- package/src/web-components/TODO json-table/src/js/defaults.js +0 -510
- package/src/web-components/TODO json-table/src/js/get-ajax-data.js +0 -72
- package/src/web-components/TODO json-table/src/js/info-section.js +0 -39
- package/src/web-components/TODO json-table/src/js/init-ajax-table.js +0 -30
- package/src/web-components/TODO json-table/src/js/init-static-table.js +0 -18
- package/src/web-components/TODO json-table/src/js/main-builder.js +0 -87
- package/src/web-components/TODO json-table/src/js/parse-data-row.js +0 -123
- package/src/web-components/TODO json-table/src/js/parse-params.js +0 -118
- package/src/web-components/TODO json-table/src/js/set-search-listener.js +0 -62
- package/src/web-components/TODO json-table/src/js/set-sort-listeners.js +0 -115
- package/src/web-components/TODO json-table/src/js/static-data-sorting.js +0 -23
- package/src/web-components/TODO json-table/src/js/table-builder.js +0 -45
- package/src/web-components/TODO json-table/src/js/table-row.js +0 -43
- package/src/web-components/TODO json-table/src/js/table-tfoot.js +0 -9
- package/src/web-components/TODO json-table/src/js/table-thead.js +0 -91
- package/src/web-components/TODO json-table/src/js/update-info.js +0 -42
- 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
|
-
}
|