@ministryofjustice/frontend 5.0.0 → 5.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.
- package/moj/all.bundle.js +1549 -1062
- package/moj/all.bundle.js.map +1 -1
- package/moj/all.bundle.mjs +1845 -1054
- package/moj/all.bundle.mjs.map +1 -1
- package/moj/all.mjs +7 -90
- package/moj/all.mjs.map +1 -1
- package/moj/all.scss +1 -0
- package/moj/all.scss.map +1 -1
- package/moj/common/index.mjs +57 -0
- package/moj/common/index.mjs.map +1 -0
- package/moj/common/moj-frontend-version.mjs +14 -0
- package/moj/common/moj-frontend-version.mjs.map +1 -0
- package/moj/components/add-another/add-another.bundle.js +105 -76
- package/moj/components/add-another/add-another.bundle.js.map +1 -1
- package/moj/components/add-another/add-another.bundle.mjs +222 -71
- package/moj/components/add-another/add-another.bundle.mjs.map +1 -1
- package/moj/components/add-another/add-another.mjs +103 -72
- package/moj/components/add-another/add-another.mjs.map +1 -1
- package/moj/components/alert/alert.bundle.js +115 -191
- package/moj/components/alert/alert.bundle.js.map +1 -1
- package/moj/components/alert/alert.bundle.mjs +354 -186
- package/moj/components/alert/alert.bundle.mjs.map +1 -1
- package/moj/components/alert/alert.mjs +55 -140
- package/moj/components/alert/alert.mjs.map +1 -1
- package/moj/components/button-menu/README.md +3 -1
- package/moj/components/button-menu/button-menu.bundle.js +91 -120
- package/moj/components/button-menu/button-menu.bundle.js.map +1 -1
- package/moj/components/button-menu/button-menu.bundle.mjs +329 -114
- package/moj/components/button-menu/button-menu.bundle.mjs.map +1 -1
- package/moj/components/button-menu/button-menu.mjs +89 -116
- package/moj/components/button-menu/button-menu.mjs.map +1 -1
- package/moj/components/date-picker/date-picker.bundle.js +174 -154
- package/moj/components/date-picker/date-picker.bundle.js.map +1 -1
- package/moj/components/date-picker/date-picker.bundle.mjs +411 -147
- package/moj/components/date-picker/date-picker.bundle.mjs.map +1 -1
- package/moj/components/date-picker/date-picker.mjs +172 -150
- package/moj/components/date-picker/date-picker.mjs.map +1 -1
- package/moj/components/filter/template.njk +1 -1
- package/moj/components/filter-toggle-button/filter-toggle-button.bundle.js +133 -44
- package/moj/components/filter-toggle-button/filter-toggle-button.bundle.js.map +1 -1
- package/moj/components/filter-toggle-button/filter-toggle-button.bundle.mjs +374 -41
- package/moj/components/filter-toggle-button/filter-toggle-button.bundle.mjs.map +1 -1
- package/moj/components/filter-toggle-button/filter-toggle-button.mjs +131 -40
- package/moj/components/filter-toggle-button/filter-toggle-button.mjs.map +1 -1
- package/moj/components/form-validator/form-validator.bundle.js +159 -69
- package/moj/components/form-validator/form-validator.bundle.js.map +1 -1
- package/moj/components/form-validator/form-validator.bundle.mjs +399 -65
- package/moj/components/form-validator/form-validator.bundle.mjs.map +1 -1
- package/moj/components/form-validator/form-validator.mjs +134 -54
- package/moj/components/form-validator/form-validator.mjs.map +1 -1
- package/moj/components/multi-file-upload/multi-file-upload.bundle.js +291 -117
- package/moj/components/multi-file-upload/multi-file-upload.bundle.js.map +1 -1
- package/moj/components/multi-file-upload/multi-file-upload.bundle.mjs +527 -109
- package/moj/components/multi-file-upload/multi-file-upload.bundle.mjs.map +1 -1
- package/moj/components/multi-file-upload/multi-file-upload.mjs +288 -101
- package/moj/components/multi-file-upload/multi-file-upload.mjs.map +1 -1
- package/moj/components/multi-file-upload/template.njk +1 -1
- package/moj/components/multi-select/multi-select.bundle.js +106 -41
- package/moj/components/multi-select/multi-select.bundle.js.map +1 -1
- package/moj/components/multi-select/multi-select.bundle.mjs +346 -37
- package/moj/components/multi-select/multi-select.bundle.mjs.map +1 -1
- package/moj/components/multi-select/multi-select.mjs +104 -37
- package/moj/components/multi-select/multi-select.mjs.map +1 -1
- package/moj/components/password-reveal/_password-reveal.scss +3 -1
- package/moj/components/password-reveal/_password-reveal.scss.map +1 -1
- package/moj/components/password-reveal/password-reveal.bundle.js +32 -29
- package/moj/components/password-reveal/password-reveal.bundle.js.map +1 -1
- package/moj/components/password-reveal/password-reveal.bundle.mjs +149 -24
- package/moj/components/password-reveal/password-reveal.bundle.mjs.map +1 -1
- package/moj/components/password-reveal/password-reveal.mjs +30 -25
- package/moj/components/password-reveal/password-reveal.mjs.map +1 -1
- package/moj/components/rich-text-editor/README.md +4 -3
- package/moj/components/rich-text-editor/rich-text-editor.bundle.js +127 -62
- package/moj/components/rich-text-editor/rich-text-editor.bundle.js.map +1 -1
- package/moj/components/rich-text-editor/rich-text-editor.bundle.mjs +367 -58
- package/moj/components/rich-text-editor/rich-text-editor.bundle.mjs.map +1 -1
- package/moj/components/rich-text-editor/rich-text-editor.mjs +125 -58
- package/moj/components/rich-text-editor/rich-text-editor.mjs.map +1 -1
- package/moj/components/search-toggle/search-toggle.bundle.js +94 -26
- package/moj/components/search-toggle/search-toggle.bundle.js.map +1 -1
- package/moj/components/search-toggle/search-toggle.bundle.mjs +334 -22
- package/moj/components/search-toggle/search-toggle.bundle.mjs.map +1 -1
- package/moj/components/search-toggle/search-toggle.mjs +92 -22
- package/moj/components/search-toggle/search-toggle.mjs.map +1 -1
- package/moj/components/sortable-table/sortable-table.bundle.js +151 -83
- package/moj/components/sortable-table/sortable-table.bundle.js.map +1 -1
- package/moj/components/sortable-table/sortable-table.bundle.mjs +390 -78
- package/moj/components/sortable-table/sortable-table.bundle.mjs.map +1 -1
- package/moj/components/sortable-table/sortable-table.mjs +149 -79
- package/moj/components/sortable-table/sortable-table.mjs.map +1 -1
- package/moj/core/_all.scss +3 -0
- package/moj/core/_all.scss.map +1 -0
- package/moj/core/_moj-frontend-properties.scss +7 -0
- package/moj/core/_moj-frontend-properties.scss.map +1 -0
- package/moj/filters/prototype-kit-13-filters.js +4 -3
- package/moj/helpers.bundle.js +22 -77
- package/moj/helpers.bundle.js.map +1 -1
- package/moj/helpers.bundle.mjs +23 -74
- package/moj/helpers.bundle.mjs.map +1 -1
- package/moj/helpers.mjs +23 -74
- package/moj/helpers.mjs.map +1 -1
- package/moj/moj-frontend.min.css +1 -1
- package/moj/moj-frontend.min.css.map +1 -1
- package/moj/moj-frontend.min.js +1 -1
- package/moj/moj-frontend.min.js.map +1 -1
- package/package.json +1 -1
- package/moj/version.bundle.js +0 -12
- package/moj/version.bundle.js.map +0 -1
- package/moj/version.bundle.mjs +0 -4
- package/moj/version.bundle.mjs.map +0 -1
- package/moj/version.mjs +0 -4
- package/moj/version.mjs.map +0 -1
|
@@ -1,126 +1,196 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
1
|
+
import { ConfigurableComponent } from 'govuk-frontend';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @augments {ConfigurableComponent<SortableTableConfig>}
|
|
5
|
+
*/
|
|
6
|
+
class SortableTable extends ConfigurableComponent {
|
|
7
|
+
/**
|
|
8
|
+
* @param {Element | null} $root - HTML element to use for sortable table
|
|
9
|
+
* @param {SortableTableConfig} [config] - Sortable table config
|
|
10
|
+
*/
|
|
11
|
+
constructor($root, config = {}) {
|
|
12
|
+
super($root, config);
|
|
13
|
+
const $head = $root == null ? void 0 : $root.querySelector('thead');
|
|
14
|
+
const $body = $root == null ? void 0 : $root.querySelector('tbody');
|
|
15
|
+
if (!$head || !$body) {
|
|
13
16
|
return this;
|
|
14
17
|
}
|
|
15
|
-
this
|
|
16
|
-
this
|
|
17
|
-
this.
|
|
18
|
+
this.$head = $head;
|
|
19
|
+
this.$body = $body;
|
|
20
|
+
this.$headings = this.$head ? Array.from(this.$head.querySelectorAll('th')) : [];
|
|
18
21
|
this.createHeadingButtons();
|
|
19
22
|
this.createStatusBox();
|
|
20
23
|
this.initialiseSortedColumn();
|
|
21
|
-
this
|
|
22
|
-
}
|
|
23
|
-
setupOptions(params) {
|
|
24
|
-
params = params || {};
|
|
25
|
-
this.statusMessage = params.statusMessage || 'Sort by %heading% (%direction%)';
|
|
26
|
-
this.ascendingText = params.ascendingText || 'ascending';
|
|
27
|
-
this.descendingText = params.descendingText || 'descending';
|
|
24
|
+
this.$head.addEventListener('click', this.onSortButtonClick.bind(this));
|
|
28
25
|
}
|
|
29
26
|
createHeadingButtons() {
|
|
30
|
-
for (const heading of this
|
|
31
|
-
if (heading.hasAttribute('aria-sort')) {
|
|
32
|
-
this.createHeadingButton(heading);
|
|
27
|
+
for (const $heading of this.$headings) {
|
|
28
|
+
if ($heading.hasAttribute('aria-sort')) {
|
|
29
|
+
this.createHeadingButton($heading);
|
|
33
30
|
}
|
|
34
31
|
}
|
|
35
32
|
}
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
33
|
+
|
|
34
|
+
/**
|
|
35
|
+
* @param {HTMLTableCellElement} $heading
|
|
36
|
+
*/
|
|
37
|
+
createHeadingButton($heading) {
|
|
38
|
+
const index = this.$headings.indexOf($heading);
|
|
39
|
+
const $button = document.createElement('button');
|
|
40
|
+
$button.setAttribute('type', 'button');
|
|
41
|
+
$button.setAttribute('data-index', `${index}`);
|
|
42
|
+
$button.textContent = $heading.textContent;
|
|
43
|
+
$heading.textContent = '';
|
|
44
|
+
$heading.appendChild($button);
|
|
44
45
|
}
|
|
45
46
|
createStatusBox() {
|
|
46
|
-
this
|
|
47
|
-
this
|
|
48
|
-
this
|
|
49
|
-
this
|
|
50
|
-
this
|
|
51
|
-
this.
|
|
47
|
+
this.$status = document.createElement('div');
|
|
48
|
+
this.$status.setAttribute('aria-atomic', 'true');
|
|
49
|
+
this.$status.setAttribute('aria-live', 'polite');
|
|
50
|
+
this.$status.setAttribute('class', 'govuk-visually-hidden');
|
|
51
|
+
this.$status.setAttribute('role', 'status');
|
|
52
|
+
this.$root.insertAdjacentElement('afterend', this.$status);
|
|
52
53
|
}
|
|
53
54
|
initialiseSortedColumn() {
|
|
54
|
-
var
|
|
55
|
-
const rows = this.getTableRowsArray();
|
|
56
|
-
const heading = this.
|
|
57
|
-
const sortButton = heading == null ? void 0 : heading.querySelector('button');
|
|
58
|
-
const sortDirection = heading == null ? void 0 : heading.getAttribute('aria-sort');
|
|
59
|
-
const columnNumber = Number.parseInt((
|
|
60
|
-
if (
|
|
55
|
+
var _$sortButton$getAttri;
|
|
56
|
+
const $rows = this.getTableRowsArray();
|
|
57
|
+
const $heading = this.$root.querySelector('th[aria-sort]');
|
|
58
|
+
const $sortButton = $heading == null ? void 0 : $heading.querySelector('button');
|
|
59
|
+
const sortDirection = $heading == null ? void 0 : $heading.getAttribute('aria-sort');
|
|
60
|
+
const columnNumber = Number.parseInt((_$sortButton$getAttri = $sortButton == null ? void 0 : $sortButton.getAttribute('data-index')) != null ? _$sortButton$getAttri : '0', 10);
|
|
61
|
+
if (!$heading || !$sortButton || !(sortDirection === 'ascending' || sortDirection === 'descending')) {
|
|
61
62
|
return;
|
|
62
63
|
}
|
|
63
|
-
const sortedRows = this.sort(rows, columnNumber, sortDirection);
|
|
64
|
-
this.addRows(sortedRows);
|
|
64
|
+
const $sortedRows = this.sort($rows, columnNumber, sortDirection);
|
|
65
|
+
this.addRows($sortedRows);
|
|
65
66
|
}
|
|
67
|
+
|
|
68
|
+
/**
|
|
69
|
+
* @param {MouseEvent} event - Click event
|
|
70
|
+
*/
|
|
66
71
|
onSortButtonClick(event) {
|
|
67
|
-
var
|
|
68
|
-
const button = event.target;
|
|
69
|
-
if (
|
|
72
|
+
var _$button$getAttribute;
|
|
73
|
+
const $button = event.target;
|
|
74
|
+
if (!$button || !($button instanceof HTMLButtonElement) || !$button.parentElement) {
|
|
70
75
|
return;
|
|
71
76
|
}
|
|
72
|
-
const heading = button.parentElement;
|
|
73
|
-
const sortDirection = heading.getAttribute('aria-sort');
|
|
74
|
-
const columnNumber = Number.parseInt((
|
|
77
|
+
const $heading = $button.parentElement;
|
|
78
|
+
const sortDirection = $heading.getAttribute('aria-sort');
|
|
79
|
+
const columnNumber = Number.parseInt((_$button$getAttribute = $button == null ? void 0 : $button.getAttribute('data-index')) != null ? _$button$getAttribute : '0', 10);
|
|
75
80
|
const newSortDirection = sortDirection === 'none' || sortDirection === 'descending' ? 'ascending' : 'descending';
|
|
76
|
-
const rows = this.getTableRowsArray();
|
|
77
|
-
const sortedRows = this.sort(rows, columnNumber, newSortDirection);
|
|
78
|
-
this.addRows(sortedRows);
|
|
81
|
+
const $rows = this.getTableRowsArray();
|
|
82
|
+
const $sortedRows = this.sort($rows, columnNumber, newSortDirection);
|
|
83
|
+
this.addRows($sortedRows);
|
|
79
84
|
this.removeButtonStates();
|
|
80
|
-
this.updateButtonState(button, newSortDirection);
|
|
85
|
+
this.updateButtonState($button, newSortDirection);
|
|
81
86
|
}
|
|
82
|
-
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* @param {HTMLButtonElement} $button
|
|
90
|
+
* @param {string} direction
|
|
91
|
+
*/
|
|
92
|
+
updateButtonState($button, direction) {
|
|
83
93
|
if (!(direction === 'ascending' || direction === 'descending')) {
|
|
84
94
|
return;
|
|
85
95
|
}
|
|
86
|
-
button.parentElement.setAttribute('aria-sort', direction);
|
|
87
|
-
let message = this.statusMessage;
|
|
88
|
-
message = message.replace(/%heading%/, button.textContent);
|
|
89
|
-
message = message.replace(/%direction%/, this[`${direction}Text`]);
|
|
90
|
-
this
|
|
96
|
+
$button.parentElement.setAttribute('aria-sort', direction);
|
|
97
|
+
let message = this.config.statusMessage;
|
|
98
|
+
message = message.replace(/%heading%/, $button.textContent);
|
|
99
|
+
message = message.replace(/%direction%/, this.config[`${direction}Text`]);
|
|
100
|
+
this.$status.textContent = message;
|
|
91
101
|
}
|
|
92
102
|
removeButtonStates() {
|
|
93
|
-
for (const heading of this
|
|
94
|
-
heading.setAttribute('aria-sort', 'none');
|
|
103
|
+
for (const $heading of this.$headings) {
|
|
104
|
+
$heading.setAttribute('aria-sort', 'none');
|
|
95
105
|
}
|
|
96
106
|
}
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
107
|
+
|
|
108
|
+
/**
|
|
109
|
+
* @param {HTMLTableRowElement[]} $rows
|
|
110
|
+
*/
|
|
111
|
+
addRows($rows) {
|
|
112
|
+
for (const $row of $rows) {
|
|
113
|
+
this.$body.append($row);
|
|
100
114
|
}
|
|
101
115
|
}
|
|
102
116
|
getTableRowsArray() {
|
|
103
|
-
return Array.from(this
|
|
117
|
+
return Array.from(this.$body.querySelectorAll('tr'));
|
|
104
118
|
}
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* @param {HTMLTableRowElement[]} $rows
|
|
122
|
+
* @param {number} columnNumber
|
|
123
|
+
* @param {string} sortDirection
|
|
124
|
+
*/
|
|
125
|
+
sort($rows, columnNumber, sortDirection) {
|
|
126
|
+
return $rows.sort(($rowA, $rowB) => {
|
|
127
|
+
const $tdA = $rowA.querySelectorAll('td, th')[columnNumber];
|
|
128
|
+
const $tdB = $rowB.querySelectorAll('td, th')[columnNumber];
|
|
129
|
+
if (!$tdA || !$tdB || !($tdA instanceof HTMLElement) || !($tdB instanceof HTMLElement)) {
|
|
110
130
|
return 0;
|
|
111
131
|
}
|
|
112
|
-
const valueA = sortDirection === 'ascending' ? this.getCellValue(tdA) : this.getCellValue(tdB);
|
|
113
|
-
const valueB = sortDirection === 'ascending' ? this.getCellValue(tdB) : this.getCellValue(tdA);
|
|
132
|
+
const valueA = sortDirection === 'ascending' ? this.getCellValue($tdA) : this.getCellValue($tdB);
|
|
133
|
+
const valueB = sortDirection === 'ascending' ? this.getCellValue($tdB) : this.getCellValue($tdA);
|
|
114
134
|
return !(typeof valueA === 'number' && typeof valueB === 'number') ? valueA.toString().localeCompare(valueB.toString()) : valueA - valueB;
|
|
115
135
|
});
|
|
116
136
|
}
|
|
117
|
-
|
|
118
|
-
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* @param {HTMLElement} $cell
|
|
140
|
+
*/
|
|
141
|
+
getCellValue($cell) {
|
|
142
|
+
const val = $cell.getAttribute('data-sort-value') || $cell.innerHTML;
|
|
119
143
|
const valAsNumber = Number(val);
|
|
120
144
|
return Number.isFinite(valAsNumber) ? valAsNumber // Exclude invalid numbers, infinity etc
|
|
121
145
|
: val;
|
|
122
146
|
}
|
|
147
|
+
|
|
148
|
+
/**
|
|
149
|
+
* Name for the component used when initialising using data-module attributes.
|
|
150
|
+
*/
|
|
123
151
|
}
|
|
124
152
|
|
|
153
|
+
/**
|
|
154
|
+
* Sortable table config
|
|
155
|
+
*
|
|
156
|
+
* @typedef {object} SortableTableConfig
|
|
157
|
+
* @property {string} [statusMessage] - Status message
|
|
158
|
+
* @property {string} [ascendingText] - Ascending text
|
|
159
|
+
* @property {string} [descendingText] - Descending text
|
|
160
|
+
*/
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* @import { Schema } from 'govuk-frontend/dist/govuk/common/configuration.mjs'
|
|
164
|
+
*/
|
|
165
|
+
SortableTable.moduleName = 'moj-sortable-table';
|
|
166
|
+
/**
|
|
167
|
+
* Sortable table config
|
|
168
|
+
*
|
|
169
|
+
* @type {SortableTableConfig}
|
|
170
|
+
*/
|
|
171
|
+
SortableTable.defaults = Object.freeze({
|
|
172
|
+
statusMessage: 'Sort by %heading% (%direction%)',
|
|
173
|
+
ascendingText: 'ascending',
|
|
174
|
+
descendingText: 'descending'
|
|
175
|
+
});
|
|
176
|
+
/**
|
|
177
|
+
* Sortable table config schema
|
|
178
|
+
*
|
|
179
|
+
* @satisfies {Schema<SortableTableConfig>}
|
|
180
|
+
*/
|
|
181
|
+
SortableTable.schema = Object.freeze(/** @type {const} */{
|
|
182
|
+
properties: {
|
|
183
|
+
statusMessage: {
|
|
184
|
+
type: 'string'
|
|
185
|
+
},
|
|
186
|
+
ascendingText: {
|
|
187
|
+
type: 'string'
|
|
188
|
+
},
|
|
189
|
+
descendingText: {
|
|
190
|
+
type: 'string'
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
});
|
|
194
|
+
|
|
125
195
|
export { SortableTable };
|
|
126
196
|
//# sourceMappingURL=sortable-table.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sortable-table.mjs","sources":["../../../../src/moj/components/sortable-table/sortable-table.mjs"],"sourcesContent":["export class SortableTable {\n constructor(params) {\n const table = params.table\n const head = table?.querySelector('thead')\n const body = table?.querySelector('tbody')\n\n if (!table || !(table instanceof HTMLElement) || !head || !body) {\n return this\n }\n\n this.table = table\n this.head = head\n this.body = body\n\n if (this.table.hasAttribute('data-moj-sortable-table-init')) {\n return this\n }\n\n this.table.setAttribute('data-moj-sortable-table-init', '')\n\n this.headings = this.head\n ? Array.from(this.head.querySelectorAll('th'))\n : []\n\n this.setupOptions(params)\n this.createHeadingButtons()\n this.createStatusBox()\n this.initialiseSortedColumn()\n\n this.head.addEventListener('click', this.onSortButtonClick.bind(this))\n }\n\n setupOptions(params) {\n params = params || {}\n this.statusMessage =\n params.statusMessage || 'Sort by %heading% (%direction%)'\n this.ascendingText = params.ascendingText || 'ascending'\n this.descendingText = params.descendingText || 'descending'\n }\n\n createHeadingButtons() {\n for (const heading of this.headings) {\n if (heading.hasAttribute('aria-sort')) {\n this.createHeadingButton(heading)\n }\n }\n }\n\n createHeadingButton(heading) {\n const index = this.headings.indexOf(heading)\n const button = document.createElement('button')\n\n button.setAttribute('type', 'button')\n button.setAttribute('data-index', `${index}`)\n button.textContent = heading.textContent\n\n heading.textContent = ''\n heading.appendChild(button)\n }\n\n createStatusBox() {\n this.status = document.createElement('div')\n\n this.status.setAttribute('aria-atomic', 'true')\n this.status.setAttribute('aria-live', 'polite')\n this.status.setAttribute('class', 'govuk-visually-hidden')\n this.status.setAttribute('role', 'status')\n\n this.table.insertAdjacentElement('afterend', this.status)\n }\n\n initialiseSortedColumn() {\n const rows = this.getTableRowsArray()\n\n const heading = this.table.querySelector('th[aria-sort]')\n const sortButton = heading?.querySelector('button')\n const sortDirection = heading?.getAttribute('aria-sort')\n const columnNumber = Number.parseInt(\n sortButton?.getAttribute('data-index') ?? '0',\n 10\n )\n\n if (\n !heading ||\n !sortButton ||\n !(sortDirection === 'ascending' || sortDirection === 'descending')\n ) {\n return\n }\n\n const sortedRows = this.sort(rows, columnNumber, sortDirection)\n this.addRows(sortedRows)\n }\n\n onSortButtonClick(event) {\n const button = event.target\n\n if (\n !button ||\n !(button instanceof HTMLButtonElement) ||\n !button.parentElement\n ) {\n return\n }\n\n const heading = button.parentElement\n const sortDirection = heading.getAttribute('aria-sort')\n const columnNumber = Number.parseInt(\n button?.getAttribute('data-index') ?? '0',\n 10\n )\n\n const newSortDirection =\n sortDirection === 'none' || sortDirection === 'descending'\n ? 'ascending'\n : 'descending'\n\n const rows = this.getTableRowsArray()\n const sortedRows = this.sort(rows, columnNumber, newSortDirection)\n\n this.addRows(sortedRows)\n this.removeButtonStates()\n this.updateButtonState(button, newSortDirection)\n }\n\n updateButtonState(button, direction) {\n if (!(direction === 'ascending' || direction === 'descending')) {\n return\n }\n\n button.parentElement.setAttribute('aria-sort', direction)\n let message = this.statusMessage\n message = message.replace(/%heading%/, button.textContent)\n message = message.replace(/%direction%/, this[`${direction}Text`])\n this.status.textContent = message\n }\n\n removeButtonStates() {\n for (const heading of this.headings) {\n heading.setAttribute('aria-sort', 'none')\n }\n }\n\n addRows(rows) {\n for (const row of rows) {\n this.body.append(row)\n }\n }\n\n getTableRowsArray() {\n return Array.from(this.body.querySelectorAll('tr'))\n }\n\n sort(rows, columnNumber, sortDirection) {\n return rows.sort((rowA, rowB) => {\n const tdA = rowA.querySelectorAll('td, th')[columnNumber]\n const tdB = rowB.querySelectorAll('td, th')[columnNumber]\n\n if (\n !tdA ||\n !tdB ||\n !(tdA instanceof HTMLElement) ||\n !(tdB instanceof HTMLElement)\n ) {\n return 0\n }\n\n const valueA =\n sortDirection === 'ascending'\n ? this.getCellValue(tdA)\n : this.getCellValue(tdB)\n\n const valueB =\n sortDirection === 'ascending'\n ? this.getCellValue(tdB)\n : this.getCellValue(tdA)\n\n return !(typeof valueA === 'number' && typeof valueB === 'number')\n ? valueA.toString().localeCompare(valueB.toString())\n : valueA - valueB\n })\n }\n\n getCellValue(cell) {\n const val = cell.getAttribute('data-sort-value') || cell.innerHTML\n const valAsNumber = Number(val)\n\n return Number.isFinite(valAsNumber)\n ? valAsNumber // Exclude invalid numbers, infinity etc\n : val\n }\n}\n"],"names":["SortableTable","constructor","params","table","head","querySelector","body","HTMLElement","hasAttribute","setAttribute","headings","Array","from","querySelectorAll","setupOptions","createHeadingButtons","createStatusBox","initialiseSortedColumn","addEventListener","onSortButtonClick","bind","statusMessage","ascendingText","descendingText","heading","createHeadingButton","index","indexOf","button","document","createElement","textContent","appendChild","status","insertAdjacentElement","_sortButton$getAttrib","rows","getTableRowsArray","sortButton","sortDirection","getAttribute","columnNumber","Number","parseInt","sortedRows","sort","addRows","event","_button$getAttribute","target","HTMLButtonElement","parentElement","newSortDirection","removeButtonStates","updateButtonState","direction","message","replace","row","append","rowA","rowB","tdA","tdB","valueA","getCellValue","valueB","toString","localeCompare","cell","val","innerHTML","valAsNumber","isFinite"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sortable-table.mjs","sources":["../../../../src/moj/components/sortable-table/sortable-table.mjs"],"sourcesContent":["import { ConfigurableComponent } from 'govuk-frontend'\n\n/**\n * @augments {ConfigurableComponent<SortableTableConfig>}\n */\nexport class SortableTable extends ConfigurableComponent {\n /**\n * @param {Element | null} $root - HTML element to use for sortable table\n * @param {SortableTableConfig} [config] - Sortable table config\n */\n constructor($root, config = {}) {\n super($root, config)\n\n const $head = $root?.querySelector('thead')\n const $body = $root?.querySelector('tbody')\n\n if (!$head || !$body) {\n return this\n }\n\n this.$head = $head\n this.$body = $body\n\n this.$headings = this.$head\n ? Array.from(this.$head.querySelectorAll('th'))\n : []\n\n this.createHeadingButtons()\n this.createStatusBox()\n this.initialiseSortedColumn()\n\n this.$head.addEventListener('click', this.onSortButtonClick.bind(this))\n }\n\n createHeadingButtons() {\n for (const $heading of this.$headings) {\n if ($heading.hasAttribute('aria-sort')) {\n this.createHeadingButton($heading)\n }\n }\n }\n\n /**\n * @param {HTMLTableCellElement} $heading\n */\n createHeadingButton($heading) {\n const index = this.$headings.indexOf($heading)\n const $button = document.createElement('button')\n\n $button.setAttribute('type', 'button')\n $button.setAttribute('data-index', `${index}`)\n $button.textContent = $heading.textContent\n\n $heading.textContent = ''\n $heading.appendChild($button)\n }\n\n createStatusBox() {\n this.$status = document.createElement('div')\n\n this.$status.setAttribute('aria-atomic', 'true')\n this.$status.setAttribute('aria-live', 'polite')\n this.$status.setAttribute('class', 'govuk-visually-hidden')\n this.$status.setAttribute('role', 'status')\n\n this.$root.insertAdjacentElement('afterend', this.$status)\n }\n\n initialiseSortedColumn() {\n const $rows = this.getTableRowsArray()\n\n const $heading = this.$root.querySelector('th[aria-sort]')\n const $sortButton = $heading?.querySelector('button')\n const sortDirection = $heading?.getAttribute('aria-sort')\n\n const columnNumber = Number.parseInt(\n $sortButton?.getAttribute('data-index') ?? '0',\n 10\n )\n\n if (\n !$heading ||\n !$sortButton ||\n !(sortDirection === 'ascending' || sortDirection === 'descending')\n ) {\n return\n }\n\n const $sortedRows = this.sort($rows, columnNumber, sortDirection)\n this.addRows($sortedRows)\n }\n\n /**\n * @param {MouseEvent} event - Click event\n */\n onSortButtonClick(event) {\n const $button = event.target\n\n if (\n !$button ||\n !($button instanceof HTMLButtonElement) ||\n !$button.parentElement\n ) {\n return\n }\n\n const $heading = $button.parentElement\n const sortDirection = $heading.getAttribute('aria-sort')\n\n const columnNumber = Number.parseInt(\n $button?.getAttribute('data-index') ?? '0',\n 10\n )\n\n const newSortDirection =\n sortDirection === 'none' || sortDirection === 'descending'\n ? 'ascending'\n : 'descending'\n\n const $rows = this.getTableRowsArray()\n const $sortedRows = this.sort($rows, columnNumber, newSortDirection)\n\n this.addRows($sortedRows)\n this.removeButtonStates()\n this.updateButtonState($button, newSortDirection)\n }\n\n /**\n * @param {HTMLButtonElement} $button\n * @param {string} direction\n */\n updateButtonState($button, direction) {\n if (!(direction === 'ascending' || direction === 'descending')) {\n return\n }\n\n $button.parentElement.setAttribute('aria-sort', direction)\n let message = this.config.statusMessage\n message = message.replace(/%heading%/, $button.textContent)\n message = message.replace(/%direction%/, this.config[`${direction}Text`])\n this.$status.textContent = message\n }\n\n removeButtonStates() {\n for (const $heading of this.$headings) {\n $heading.setAttribute('aria-sort', 'none')\n }\n }\n\n /**\n * @param {HTMLTableRowElement[]} $rows\n */\n addRows($rows) {\n for (const $row of $rows) {\n this.$body.append($row)\n }\n }\n\n getTableRowsArray() {\n return Array.from(this.$body.querySelectorAll('tr'))\n }\n\n /**\n * @param {HTMLTableRowElement[]} $rows\n * @param {number} columnNumber\n * @param {string} sortDirection\n */\n sort($rows, columnNumber, sortDirection) {\n return $rows.sort(($rowA, $rowB) => {\n const $tdA = $rowA.querySelectorAll('td, th')[columnNumber]\n const $tdB = $rowB.querySelectorAll('td, th')[columnNumber]\n\n if (\n !$tdA ||\n !$tdB ||\n !($tdA instanceof HTMLElement) ||\n !($tdB instanceof HTMLElement)\n ) {\n return 0\n }\n\n const valueA =\n sortDirection === 'ascending'\n ? this.getCellValue($tdA)\n : this.getCellValue($tdB)\n\n const valueB =\n sortDirection === 'ascending'\n ? this.getCellValue($tdB)\n : this.getCellValue($tdA)\n\n return !(typeof valueA === 'number' && typeof valueB === 'number')\n ? valueA.toString().localeCompare(valueB.toString())\n : valueA - valueB\n })\n }\n\n /**\n * @param {HTMLElement} $cell\n */\n getCellValue($cell) {\n const val = $cell.getAttribute('data-sort-value') || $cell.innerHTML\n const valAsNumber = Number(val)\n\n return Number.isFinite(valAsNumber)\n ? valAsNumber // Exclude invalid numbers, infinity etc\n : val\n }\n\n /**\n * Name for the component used when initialising using data-module attributes.\n */\n static moduleName = 'moj-sortable-table'\n\n /**\n * Sortable table config\n *\n * @type {SortableTableConfig}\n */\n static defaults = Object.freeze({\n statusMessage: 'Sort by %heading% (%direction%)',\n ascendingText: 'ascending',\n descendingText: 'descending'\n })\n\n /**\n * Sortable table config schema\n *\n * @satisfies {Schema<SortableTableConfig>}\n */\n static schema = Object.freeze(\n /** @type {const} */ ({\n properties: {\n statusMessage: { type: 'string' },\n ascendingText: { type: 'string' },\n descendingText: { type: 'string' }\n }\n })\n )\n}\n\n/**\n * Sortable table config\n *\n * @typedef {object} SortableTableConfig\n * @property {string} [statusMessage] - Status message\n * @property {string} [ascendingText] - Ascending text\n * @property {string} [descendingText] - Descending text\n */\n\n/**\n * @import { Schema } from 'govuk-frontend/dist/govuk/common/configuration.mjs'\n */\n"],"names":["SortableTable","ConfigurableComponent","constructor","$root","config","$head","querySelector","$body","$headings","Array","from","querySelectorAll","createHeadingButtons","createStatusBox","initialiseSortedColumn","addEventListener","onSortButtonClick","bind","$heading","hasAttribute","createHeadingButton","index","indexOf","$button","document","createElement","setAttribute","textContent","appendChild","$status","insertAdjacentElement","_$sortButton$getAttri","$rows","getTableRowsArray","$sortButton","sortDirection","getAttribute","columnNumber","Number","parseInt","$sortedRows","sort","addRows","event","_$button$getAttribute","target","HTMLButtonElement","parentElement","newSortDirection","removeButtonStates","updateButtonState","direction","message","statusMessage","replace","$row","append","$rowA","$rowB","$tdA","$tdB","HTMLElement","valueA","getCellValue","valueB","toString","localeCompare","$cell","val","innerHTML","valAsNumber","isFinite","moduleName","defaults","Object","freeze","ascendingText","descendingText","schema","properties","type"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/moj/core/_all.scss"],"names":[],"mappings":"AAAA,kCAAkC","file":"_all.scss","sourcesContent":["@forward \"moj-frontend-properties\";\n"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/moj/core/_moj-frontend-properties.scss"],"names":[],"mappings":"AAAA;EACE,wEAAwE;EACxE,yCAAyC;EACzC,+BAAqC;AACvC","file":"_moj-frontend-properties.scss","sourcesContent":[":root {\n // This variable is automatically overwritten during builds and releases.\n // It doesn't need to be updated manually.\n --moj-frontend-version: \"development\";\n}\n"]}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
|
+
// @ts-expect-error - No types available
|
|
1
2
|
const { addFilter } = require('govuk-prototype-kit').views
|
|
2
3
|
|
|
3
4
|
const getAllFilters = require('./all')
|
|
4
5
|
|
|
5
6
|
const allFilters = getAllFilters()
|
|
6
7
|
|
|
7
|
-
Object.
|
|
8
|
-
addFilter(name,
|
|
9
|
-
}
|
|
8
|
+
for (const [name, filter] of Object.entries(allFilters)) {
|
|
9
|
+
addFilter(name, filter)
|
|
10
|
+
}
|
package/moj/helpers.bundle.js
CHANGED
|
@@ -4,43 +4,42 @@
|
|
|
4
4
|
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.MOJFrontend = global.MOJFrontend || {}));
|
|
5
5
|
})(this, (function (exports) { 'use strict';
|
|
6
6
|
|
|
7
|
-
|
|
7
|
+
/**
|
|
8
|
+
* @param {Element} $element - Element to remove attribute value from
|
|
9
|
+
* @param {string} attr - Attribute name
|
|
10
|
+
* @param {string} value - Attribute value
|
|
11
|
+
*/
|
|
12
|
+
function removeAttributeValue($element, attr, value) {
|
|
8
13
|
let re, m;
|
|
9
|
-
if (
|
|
10
|
-
if (
|
|
11
|
-
|
|
14
|
+
if ($element.getAttribute(attr)) {
|
|
15
|
+
if ($element.getAttribute(attr) === value) {
|
|
16
|
+
$element.removeAttribute(attr);
|
|
12
17
|
} else {
|
|
13
18
|
re = new RegExp(`(^|\\s)${value}(\\s|$)`);
|
|
14
|
-
m =
|
|
19
|
+
m = $element.getAttribute(attr).match(re);
|
|
15
20
|
if (m && m.length === 3) {
|
|
16
|
-
|
|
21
|
+
$element.setAttribute(attr, $element.getAttribute(attr).replace(re, m[1] && m[2] ? ' ' : ''));
|
|
17
22
|
}
|
|
18
23
|
}
|
|
19
24
|
}
|
|
20
25
|
}
|
|
21
|
-
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* @param {Element} $element - Element to add attribute value to
|
|
29
|
+
* @param {string} attr - Attribute name
|
|
30
|
+
* @param {string} value - Attribute value
|
|
31
|
+
*/
|
|
32
|
+
function addAttributeValue($element, attr, value) {
|
|
22
33
|
let re;
|
|
23
|
-
if (
|
|
24
|
-
|
|
34
|
+
if (!$element.getAttribute(attr)) {
|
|
35
|
+
$element.setAttribute(attr, value);
|
|
25
36
|
} else {
|
|
26
37
|
re = new RegExp(`(^|\\s)${value}(\\s|$)`);
|
|
27
|
-
if (!re.test(
|
|
28
|
-
|
|
38
|
+
if (!re.test($element.getAttribute(attr))) {
|
|
39
|
+
$element.setAttribute(attr, `${$element.getAttribute(attr)} ${value}`);
|
|
29
40
|
}
|
|
30
41
|
}
|
|
31
42
|
}
|
|
32
|
-
function dragAndDropSupported() {
|
|
33
|
-
const div = document.createElement('div');
|
|
34
|
-
return typeof div.ondrop !== 'undefined';
|
|
35
|
-
}
|
|
36
|
-
function formDataSupported() {
|
|
37
|
-
return typeof FormData === 'function';
|
|
38
|
-
}
|
|
39
|
-
function fileApiSupported() {
|
|
40
|
-
const input = document.createElement('input');
|
|
41
|
-
input.type = 'file';
|
|
42
|
-
return typeof input.files !== 'undefined';
|
|
43
|
-
}
|
|
44
43
|
|
|
45
44
|
/**
|
|
46
45
|
* Find an elements next sibling
|
|
@@ -131,65 +130,11 @@
|
|
|
131
130
|
}
|
|
132
131
|
}
|
|
133
132
|
|
|
134
|
-
/**
|
|
135
|
-
* Move focus to element
|
|
136
|
-
*
|
|
137
|
-
* Sets tabindex to -1 to make the element programmatically focusable,
|
|
138
|
-
* but removes it on blur as the element doesn't need to be focused again.
|
|
139
|
-
*
|
|
140
|
-
* @param {HTMLElement} $element - HTML element
|
|
141
|
-
* @param {object} [options] - Handler options
|
|
142
|
-
* @param {function(this: HTMLElement): void} [options.onBeforeFocus] - Callback before focus
|
|
143
|
-
* @param {function(this: HTMLElement): void} [options.onBlur] - Callback on blur
|
|
144
|
-
*/
|
|
145
|
-
function setFocus($element, options = {}) {
|
|
146
|
-
const isFocusable = $element.getAttribute('tabindex');
|
|
147
|
-
if (!isFocusable) {
|
|
148
|
-
$element.setAttribute('tabindex', '-1');
|
|
149
|
-
}
|
|
150
|
-
|
|
151
|
-
/**
|
|
152
|
-
* Handle element focus
|
|
153
|
-
*/
|
|
154
|
-
function onFocus() {
|
|
155
|
-
$element.addEventListener('blur', onBlur, {
|
|
156
|
-
once: true
|
|
157
|
-
});
|
|
158
|
-
}
|
|
159
|
-
|
|
160
|
-
/**
|
|
161
|
-
* Handle element blur
|
|
162
|
-
*/
|
|
163
|
-
function onBlur() {
|
|
164
|
-
if (options.onBlur) {
|
|
165
|
-
options.onBlur.call($element);
|
|
166
|
-
}
|
|
167
|
-
if (!isFocusable) {
|
|
168
|
-
$element.removeAttribute('tabindex');
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
|
|
172
|
-
// Add listener to reset element on blur, after focus
|
|
173
|
-
$element.addEventListener('focus', onFocus, {
|
|
174
|
-
once: true
|
|
175
|
-
});
|
|
176
|
-
|
|
177
|
-
// Focus element
|
|
178
|
-
if (options.onBeforeFocus) {
|
|
179
|
-
options.onBeforeFocus.call($element);
|
|
180
|
-
}
|
|
181
|
-
$element.focus();
|
|
182
|
-
}
|
|
183
|
-
|
|
184
133
|
exports.addAttributeValue = addAttributeValue;
|
|
185
|
-
exports.dragAndDropSupported = dragAndDropSupported;
|
|
186
|
-
exports.fileApiSupported = fileApiSupported;
|
|
187
134
|
exports.findNearestMatchingElement = findNearestMatchingElement;
|
|
188
|
-
exports.formDataSupported = formDataSupported;
|
|
189
135
|
exports.getNextSibling = getNextSibling;
|
|
190
136
|
exports.getPreviousSibling = getPreviousSibling;
|
|
191
137
|
exports.removeAttributeValue = removeAttributeValue;
|
|
192
|
-
exports.setFocus = setFocus;
|
|
193
138
|
|
|
194
139
|
}));
|
|
195
140
|
//# sourceMappingURL=helpers.bundle.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helpers.bundle.js","sources":["../../src/moj/helpers.mjs"],"sourcesContent":["
|
|
1
|
+
{"version":3,"file":"helpers.bundle.js","sources":["../../src/moj/helpers.mjs"],"sourcesContent":["/**\n * @param {Element} $element - Element to remove attribute value from\n * @param {string} attr - Attribute name\n * @param {string} value - Attribute value\n */\nexport function removeAttributeValue($element, attr, value) {\n let re, m\n if ($element.getAttribute(attr)) {\n if ($element.getAttribute(attr) === value) {\n $element.removeAttribute(attr)\n } else {\n re = new RegExp(`(^|\\\\s)${value}(\\\\s|$)`)\n m = $element.getAttribute(attr).match(re)\n if (m && m.length === 3) {\n $element.setAttribute(\n attr,\n $element.getAttribute(attr).replace(re, m[1] && m[2] ? ' ' : '')\n )\n }\n }\n }\n}\n\n/**\n * @param {Element} $element - Element to add attribute value to\n * @param {string} attr - Attribute name\n * @param {string} value - Attribute value\n */\nexport function addAttributeValue($element, attr, value) {\n let re\n if (!$element.getAttribute(attr)) {\n $element.setAttribute(attr, value)\n } else {\n re = new RegExp(`(^|\\\\s)${value}(\\\\s|$)`)\n if (!re.test($element.getAttribute(attr))) {\n $element.setAttribute(attr, `${$element.getAttribute(attr)} ${value}`)\n }\n }\n}\n\n/**\n * Find an elements next sibling\n *\n * Utility function to find an elements next sibling matching the provided\n * selector.\n *\n * @param {Element | null} $element - Element to find siblings for\n * @param {string} [selector] - selector for required sibling\n */\nexport function getNextSibling($element, selector) {\n if (!$element || !($element instanceof HTMLElement)) {\n return\n }\n\n // Get the next sibling element\n let $sibling = $element.nextElementSibling\n\n // If there's no selector, return the first sibling\n if (!selector) return $sibling\n\n // If the sibling matches our selector, use it\n // If not, jump to the next sibling and continue the loop\n while ($sibling) {\n if ($sibling.matches(selector)) return $sibling\n $sibling = $sibling.nextElementSibling\n }\n}\n\n/**\n * Find an elements preceding sibling\n *\n * Utility function to find an elements previous sibling matching the provided\n * selector.\n *\n * @param {Element | null} $element - Element to find siblings for\n * @param {string} [selector] - selector for required sibling\n */\nexport function getPreviousSibling($element, selector) {\n if (!$element || !($element instanceof HTMLElement)) {\n return\n }\n\n // Get the previous sibling element\n let $sibling = $element.previousElementSibling\n\n // If there's no selector, return the first sibling\n if (!selector) return $sibling\n\n // If the sibling matches our selector, use it\n // If not, jump to the next sibling and continue the loop\n while ($sibling) {\n if ($sibling.matches(selector)) return $sibling\n $sibling = $sibling.previousElementSibling\n }\n}\n\n/**\n * @param {Element | null} $element\n * @param {string} [selector]\n */\nexport function findNearestMatchingElement($element, selector) {\n // If no element or selector is provided, return\n if (!$element || !($element instanceof HTMLElement) || !selector) {\n return\n }\n\n // Start with the current element\n let $currentElement = $element\n\n while ($currentElement) {\n // First check the current element\n if ($currentElement.matches(selector)) {\n return $currentElement\n }\n\n // Check all previous siblings\n let $sibling = $currentElement.previousElementSibling\n while ($sibling) {\n // Check if the sibling itself is a heading\n if ($sibling.matches(selector)) {\n return $sibling\n }\n $sibling = $sibling.previousElementSibling\n }\n\n // If no match found in siblings, move up to parent\n $currentElement = $currentElement.parentElement\n }\n}\n"],"names":["removeAttributeValue","$element","attr","value","re","m","getAttribute","removeAttribute","RegExp","match","length","setAttribute","replace","addAttributeValue","test","getNextSibling","selector","HTMLElement","$sibling","nextElementSibling","matches","getPreviousSibling","previousElementSibling","findNearestMatchingElement","$currentElement","parentElement"],"mappings":"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"}
|