@ministryofjustice/frontend 4.0.1 → 4.0.2
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.jquery.min.js +1 -1
- package/moj/all.jquery.min.js.map +1 -1
- package/moj/all.js +58 -3
- package/moj/all.js.map +1 -1
- package/moj/components/sortable-table/_sortable-table.scss +3 -42
- package/moj/components/sortable-table/sortable-table.js +57 -2
- package/moj/components/sortable-table/sortable-table.js.map +1 -1
- package/moj/components/sortable-table/sortable-table.mjs +57 -2
- package/moj/components/sortable-table/sortable-table.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
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
[aria-sort] button,
|
|
4
4
|
[aria-sort] button:hover {
|
|
5
|
+
display: inline-flex;
|
|
5
6
|
position: relative;
|
|
6
7
|
margin: 0;
|
|
7
|
-
padding: 0
|
|
8
|
+
padding: 0;
|
|
8
9
|
border-width: 0;
|
|
9
10
|
color: #005ea5;
|
|
10
11
|
background-color: transparent;
|
|
@@ -17,6 +18,7 @@
|
|
|
17
18
|
font-weight: inherit;
|
|
18
19
|
text-align: inherit;
|
|
19
20
|
cursor: pointer;
|
|
21
|
+
align-items: center;
|
|
20
22
|
}
|
|
21
23
|
|
|
22
24
|
[aria-sort] button:focus {
|
|
@@ -27,44 +29,3 @@
|
|
|
27
29
|
0 -2px $govuk-focus-colour,
|
|
28
30
|
0 4px $govuk-focus-text-colour;
|
|
29
31
|
}
|
|
30
|
-
|
|
31
|
-
[aria-sort]:first-child button {
|
|
32
|
-
right: auto;
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
[aria-sort] button::before {
|
|
36
|
-
content: " \25bc";
|
|
37
|
-
position: absolute;
|
|
38
|
-
top: 9px;
|
|
39
|
-
right: -1px;
|
|
40
|
-
font-size: 0.5em;
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
[aria-sort] button::after {
|
|
44
|
-
content: " \25b2";
|
|
45
|
-
position: absolute;
|
|
46
|
-
top: 1px;
|
|
47
|
-
right: -1px;
|
|
48
|
-
font-size: 0.5em;
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
[aria-sort="ascending"] button::before,
|
|
52
|
-
[aria-sort="descending"] button::before {
|
|
53
|
-
content: none;
|
|
54
|
-
}
|
|
55
|
-
|
|
56
|
-
[aria-sort="ascending"] button::after {
|
|
57
|
-
content: " \25b2";
|
|
58
|
-
position: absolute;
|
|
59
|
-
top: 2px;
|
|
60
|
-
right: -5px;
|
|
61
|
-
font-size: 0.8em;
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
[aria-sort="descending"] button::after {
|
|
65
|
-
content: " \25bc";
|
|
66
|
-
position: absolute;
|
|
67
|
-
top: 2px;
|
|
68
|
-
right: -5px;
|
|
69
|
-
font-size: 0.8em;
|
|
70
|
-
}
|
|
@@ -12,10 +12,24 @@
|
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
this.table.data('moj-search-toggle-initialised', true);
|
|
15
|
+
this.caption = this.table.find('caption');
|
|
16
|
+
|
|
17
|
+
this.upArrow = `<svg width="22" height="22" focusable="false" aria-hidden="true" role="img" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
18
|
+
<path d="M6.5625 15.5L11 6.63125L15.4375 15.5H6.5625Z" fill="currentColor"/>
|
|
19
|
+
</svg>`;
|
|
20
|
+
this.downArrow = `<svg width="22" height="22" focusable="false" aria-hidden="true" role="img" vviewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
21
|
+
<path d="M15.4375 7L11 15.8687L6.5625 7L15.4375 7Z" fill="currentColor"/>
|
|
22
|
+
</svg>`;
|
|
23
|
+
this.upDownArrow = `<svg width="22" height="22" focusable="false" aria-hidden="true" role="img" vviewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
24
|
+
<path d="M8.1875 9.5L10.9609 3.95703L13.7344 9.5H8.1875Z" fill="currentColor"/>
|
|
25
|
+
<path d="M13.7344 12.0781L10.9609 17.6211L8.1875 12.0781H13.7344Z" fill="currentColor"/>
|
|
26
|
+
</svg>`;
|
|
15
27
|
|
|
16
28
|
this.setupOptions(params);
|
|
17
29
|
this.body = this.table.find('tbody');
|
|
18
30
|
this.createHeadingButtons();
|
|
31
|
+
this.updateCaption();
|
|
32
|
+
this.updateDirectionIndicators();
|
|
19
33
|
this.createStatusBox();
|
|
20
34
|
this.initialiseSortedColumn();
|
|
21
35
|
this.table.on('click', 'th button', $.proxy(this, 'onSortButtonClick'));
|
|
@@ -69,8 +83,9 @@
|
|
|
69
83
|
};
|
|
70
84
|
|
|
71
85
|
SortableTable.prototype.onSortButtonClick = function (e) {
|
|
72
|
-
const
|
|
73
|
-
const
|
|
86
|
+
const button = e.target.closest('button');
|
|
87
|
+
const columnNumber = button.getAttribute('data-index');
|
|
88
|
+
const sortDirection = $(button).parent().attr('aria-sort');
|
|
74
89
|
let newSortDirection;
|
|
75
90
|
if (sortDirection === 'none' || sortDirection === 'descending') {
|
|
76
91
|
newSortDirection = 'ascending';
|
|
@@ -82,6 +97,26 @@
|
|
|
82
97
|
this.addRows(sortedRows);
|
|
83
98
|
this.removeButtonStates();
|
|
84
99
|
this.updateButtonState($(e.currentTarget), newSortDirection);
|
|
100
|
+
this.updateDirectionIndicators();
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
SortableTable.prototype.updateCaption = function () {
|
|
104
|
+
const captionElement = this.caption.get(0);
|
|
105
|
+
|
|
106
|
+
if (!captionElement) {
|
|
107
|
+
return
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
let assistiveText = captionElement.querySelector('.govuk-visually-hidden');
|
|
111
|
+
if (assistiveText) {
|
|
112
|
+
return
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
assistiveText = document.createElement('span');
|
|
116
|
+
assistiveText.classList.add('govuk-visually-hidden');
|
|
117
|
+
assistiveText.textContent = ' (column headers with buttons are sortable).';
|
|
118
|
+
|
|
119
|
+
captionElement.appendChild(assistiveText);
|
|
85
120
|
};
|
|
86
121
|
|
|
87
122
|
SortableTable.prototype.updateButtonState = function (button, direction) {
|
|
@@ -92,6 +127,26 @@
|
|
|
92
127
|
this.status.text(message);
|
|
93
128
|
};
|
|
94
129
|
|
|
130
|
+
SortableTable.prototype.updateDirectionIndicators = function () {
|
|
131
|
+
const component = this;
|
|
132
|
+
this.table.find('th').each(function () {
|
|
133
|
+
const heading = $(this);
|
|
134
|
+
const button = heading.find('button');
|
|
135
|
+
const direction = heading.attr('aria-sort');
|
|
136
|
+
button.find('svg').remove();
|
|
137
|
+
switch (direction) {
|
|
138
|
+
case 'ascending':
|
|
139
|
+
button.append(component.upArrow);
|
|
140
|
+
break
|
|
141
|
+
case 'descending':
|
|
142
|
+
button.append(component.downArrow);
|
|
143
|
+
break
|
|
144
|
+
case 'none':
|
|
145
|
+
button.append(component.upDownArrow);
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
};
|
|
149
|
+
|
|
95
150
|
SortableTable.prototype.removeButtonStates = function () {
|
|
96
151
|
this.table.find('thead th').attr('aria-sort', 'none');
|
|
97
152
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sortable-table.js","sources":["../../../../src/moj/components/sortable-table/sortable-table.mjs"],"sourcesContent":["import $ from 'jquery'\n\nexport function SortableTable(params) {\n this.table = $(params.table)\n\n if (this.table.data('moj-search-toggle-initialised')) {\n return\n }\n\n this.table.data('moj-search-toggle-initialised', true)\n\n this.setupOptions(params)\n this.body = this.table.find('tbody')\n this.createHeadingButtons()\n this.createStatusBox()\n this.initialiseSortedColumn()\n this.table.on('click', 'th button', $.proxy(this, 'onSortButtonClick'))\n}\n\nSortableTable.prototype.setupOptions = function (params) {\n params = params || {}\n this.statusMessage = params.statusMessage || 'Sort by %heading% (%direction%)'\n this.ascendingText = params.ascendingText || 'ascending'\n this.descendingText = params.descendingText || 'descending'\n}\n\nSortableTable.prototype.createHeadingButtons = function () {\n const headings = this.table.find('thead th')\n let heading\n for (let i = 0; i < headings.length; i++) {\n heading = $(headings[i])\n if (heading.attr('aria-sort')) {\n this.createHeadingButton(heading, i)\n }\n }\n}\n\nSortableTable.prototype.createHeadingButton = function (heading, i) {\n const text = heading.text()\n const button = $(`<button type=\"button\" data-index=\"${i}\">${text}</button>`)\n heading.text('')\n heading.append(button)\n}\n\nSortableTable.prototype.createStatusBox = function () {\n this.status = $(\n '<div aria-live=\"polite\" role=\"status\" aria-atomic=\"true\" class=\"govuk-visually-hidden\" />'\n )\n this.table.parent().append(this.status)\n}\n\nSortableTable.prototype.initialiseSortedColumn = function () {\n const rows = this.getTableRowsArray()\n\n this.table\n .find('th')\n .filter('[aria-sort=\"ascending\"], [aria-sort=\"descending\"]')\n .first()\n .each((index, el) => {\n const sortDirection = $(el).attr('aria-sort')\n const columnNumber = $(el).find('button').attr('data-index')\n const sortedRows = this.sort(rows, columnNumber, sortDirection)\n this.addRows(sortedRows)\n })\n}\n\nSortableTable.prototype.onSortButtonClick = function (e) {\n const columnNumber = e.currentTarget.getAttribute('data-index')\n const sortDirection = $(e.currentTarget).parent().attr('aria-sort')\n let newSortDirection\n if (sortDirection === 'none' || sortDirection === 'descending') {\n newSortDirection = 'ascending'\n } else {\n newSortDirection = 'descending'\n }\n const rows = this.getTableRowsArray()\n const sortedRows = this.sort(rows, columnNumber, newSortDirection)\n this.addRows(sortedRows)\n this.removeButtonStates()\n this.updateButtonState($(e.currentTarget), newSortDirection)\n}\n\nSortableTable.prototype.updateButtonState = function (button, direction) {\n button.parent().attr('aria-sort', direction)\n let message = this.statusMessage\n message = message.replace(/%heading%/, button.text())\n message = message.replace(/%direction%/, this[`${direction}Text`])\n this.status.text(message)\n}\n\nSortableTable.prototype.removeButtonStates = function () {\n this.table.find('thead th').attr('aria-sort', 'none')\n}\n\nSortableTable.prototype.addRows = function (rows) {\n for (let i = 0; i < rows.length; i++) {\n this.body.append(rows[i])\n }\n}\n\nSortableTable.prototype.getTableRowsArray = function () {\n const rows = []\n const trs = this.body.find('tr')\n for (let i = 0; i < trs.length; i++) {\n rows.push(trs[i])\n }\n return rows\n}\n\nSortableTable.prototype.sort = function (rows, columnNumber, sortDirection) {\n const newRows = rows.sort(\n function (rowA, rowB) {\n const tdA = $(rowA).find('td,th').eq(columnNumber)\n const tdB = $(rowB).find('td,th').eq(columnNumber)\n\n const valueA =\n sortDirection === 'ascending'\n ? this.getCellValue(tdA)\n : this.getCellValue(tdB)\n const valueB =\n sortDirection === 'ascending'\n ? this.getCellValue(tdB)\n : this.getCellValue(tdA)\n\n if (typeof valueA === 'string' || typeof valueB === 'string')\n return valueA.toString().localeCompare(valueB.toString())\n return valueA - valueB\n }.bind(this)\n )\n return newRows\n}\n\nSortableTable.prototype.getCellValue = function (cell) {\n const val = cell.attr('data-sort-value') || cell.html()\n\n const valAsNumber = Number(val)\n return isNaN(valAsNumber) ? val : valAsNumber\n}\n"],"names":[],"mappings":";;;;;;EAEA,SAAA,aAAA,CAAA,MAAA,EAAA;EACA,EAAA,IAAA,CAAA,KAAA,GAAA,CAAA,CAAA,MAAA,CAAA,KAAA;;EAEA,EAAA,IAAA,IAAA,CAAA,KAAA,CAAA,IAAA,CAAA,+BAAA,CAAA,EAAA;EACA,IAAA;EACA;;EAEA,EAAA,IAAA,CAAA,KAAA,CAAA,IAAA,CAAA,+BAAA,EAAA,IAAA;;EAEA,EAAA,IAAA,CAAA,YAAA,CAAA,MAAA;EACA,EAAA,IAAA,CAAA,IAAA,GAAA,IAAA,CAAA,KAAA,CAAA,IAAA,CAAA,OAAA;EACA,EAAA,IAAA,CAAA,oBAAA;EACA,EAAA,IAAA,CAAA,eAAA;EACA,EAAA,IAAA,CAAA,sBAAA;EACA,EAAA,IAAA,CAAA,KAAA,CAAA,EAAA,CAAA,OAAA,EAAA,WAAA,EAAA,CAAA,CAAA,KAAA,CAAA,IAAA,EAAA,mBAAA,CAAA;EACA;;EAEA,aAAA,CAAA,SAAA,CAAA,YAAA,GAAA,UAAA,MAAA,EAAA;EACA,EAAA,MAAA,GAAA,MAAA,IAAA;EACA,EAAA,IAAA,CAAA,aAAA,GAAA,MAAA,CAAA,aAAA,IAAA;EACA,EAAA,IAAA,CAAA,aAAA,GAAA,MAAA,CAAA,aAAA,IAAA;EACA,EAAA,IAAA,CAAA,cAAA,GAAA,MAAA,CAAA,cAAA,IAAA;EACA;;EAEA,aAAA,CAAA,SAAA,CAAA,oBAAA,GAAA,YAAA;EACA,EAAA,MAAA,QAAA,GAAA,IAAA,CAAA,KAAA,CAAA,IAAA,CAAA,UAAA;EACA,EAAA,IAAA;EACA,EAAA,KAAA,IAAA,CAAA,GAAA,CAAA,EAAA,CAAA,GAAA,QAAA,CAAA,MAAA,EAAA,CAAA,EAAA,EAAA;EACA,IAAA,OAAA,GAAA,CAAA,CAAA,QAAA,CAAA,CAAA,CAAA;EACA,IAAA,IAAA,OAAA,CAAA,IAAA,CAAA,WAAA,CAAA,EAAA;EACA,MAAA,IAAA,CAAA,mBAAA,CAAA,OAAA,EAAA,CAAA;EACA;EACA;EACA;;EAEA,aAAA,CAAA,SAAA,CAAA,mBAAA,GAAA,UAAA,OAAA,EAAA,CAAA,EAAA;EACA,EAAA,MAAA,IAAA,GAAA,OAAA,CAAA,IAAA;EACA,EAAA,MAAA,MAAA,GAAA,CAAA,CAAA,CAAA,kCAAA,EAAA,CAAA,CAAA,EAAA,EAAA,IAAA,CAAA,SAAA,CAAA;EACA,EAAA,OAAA,CAAA,IAAA,CAAA,EAAA;EACA,EAAA,OAAA,CAAA,MAAA,CAAA,MAAA;EACA;;EAEA,aAAA,CAAA,SAAA,CAAA,eAAA,GAAA,YAAA;EACA,EAAA,IAAA,CAAA,MAAA,GAAA,CAAA;EACA,IAAA;EACA;EACA,EAAA,IAAA,CAAA,KAAA,CAAA,MAAA,EAAA,CAAA,MAAA,CAAA,IAAA,CAAA,MAAA;EACA;;EAEA,aAAA,CAAA,SAAA,CAAA,sBAAA,GAAA,YAAA;EACA,EAAA,MAAA,IAAA,GAAA,IAAA,CAAA,iBAAA;;EAEA,EAAA,IAAA,CAAA;EACA,KAAA,IAAA,CAAA,IAAA;EACA,KAAA,MAAA,CAAA,mDAAA;EACA,KAAA,KAAA;EACA,KAAA,IAAA,CAAA,CAAA,KAAA,EAAA,EAAA,KAAA;EACA,MAAA,MAAA,aAAA,GAAA,CAAA,CAAA,EAAA,CAAA,CAAA,IAAA,CAAA,WAAA;EACA,MAAA,MAAA,YAAA,GAAA,CAAA,CAAA,EAAA,CAAA,CAAA,IAAA,CAAA,QAAA,CAAA,CAAA,IAAA,CAAA,YAAA;EACA,MAAA,MAAA,UAAA,GAAA,IAAA,CAAA,IAAA,CAAA,IAAA,EAAA,YAAA,EAAA,aAAA;EACA,MAAA,IAAA,CAAA,OAAA,CAAA,UAAA;EACA,KAAA;EACA;;EAEA,aAAA,CAAA,SAAA,CAAA,iBAAA,GAAA,UAAA,CAAA,EAAA;EACA,EAAA,MAAA,YAAA,GAAA,CAAA,CAAA,aAAA,CAAA,YAAA,CAAA,YAAA;EACA,EAAA,MAAA,aAAA,GAAA,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,CAAA,MAAA,EAAA,CAAA,IAAA,CAAA,WAAA;EACA,EAAA,IAAA;EACA,EAAA,IAAA,aAAA,KAAA,MAAA,IAAA,aAAA,KAAA,YAAA,EAAA;EACA,IAAA,gBAAA,GAAA;EACA,GAAA,MAAA;EACA,IAAA,gBAAA,GAAA;EACA;EACA,EAAA,MAAA,IAAA,GAAA,IAAA,CAAA,iBAAA;EACA,EAAA,MAAA,UAAA,GAAA,IAAA,CAAA,IAAA,CAAA,IAAA,EAAA,YAAA,EAAA,gBAAA;EACA,EAAA,IAAA,CAAA,OAAA,CAAA,UAAA;EACA,EAAA,IAAA,CAAA,kBAAA;EACA,EAAA,IAAA,CAAA,iBAAA,CAAA,CAAA,CAAA,CAAA,CAAA,aAAA,CAAA,EAAA,gBAAA;EACA;;EAEA,aAAA,CAAA,SAAA,CAAA,iBAAA,GAAA,UAAA,MAAA,EAAA,SAAA,EAAA;EACA,EAAA,MAAA,CAAA,MAAA,EAAA,CAAA,IAAA,CAAA,WAAA,EAAA,SAAA;EACA,EAAA,IAAA,OAAA,GAAA,IAAA,CAAA;EACA,EAAA,OAAA,GAAA,OAAA,CAAA,OAAA,CAAA,WAAA,EAAA,MAAA,CAAA,IAAA,EAAA;EACA,EAAA,OAAA,GAAA,OAAA,CAAA,OAAA,CAAA,aAAA,EAAA,IAAA,CAAA,CAAA,EAAA,SAAA,CAAA,IAAA,CAAA,CAAA;EACA,EAAA,IAAA,CAAA,MAAA,CAAA,IAAA,CAAA,OAAA;EACA;;EAEA,aAAA,CAAA,SAAA,CAAA,kBAAA,GAAA,YAAA;EACA,EAAA,IAAA,CAAA,KAAA,CAAA,IAAA,CAAA,UAAA,CAAA,CAAA,IAAA,CAAA,WAAA,EAAA,MAAA;EACA;;EAEA,aAAA,CAAA,SAAA,CAAA,OAAA,GAAA,UAAA,IAAA,EAAA;EACA,EAAA,KAAA,IAAA,CAAA,GAAA,CAAA,EAAA,CAAA,GAAA,IAAA,CAAA,MAAA,EAAA,CAAA,EAAA,EAAA;EACA,IAAA,IAAA,CAAA,IAAA,CAAA,MAAA,CAAA,IAAA,CAAA,CAAA,CAAA;EACA;EACA;;EAEA,aAAA,CAAA,SAAA,CAAA,iBAAA,GAAA,YAAA;EACA,EAAA,MAAA,IAAA,GAAA;EACA,EAAA,MAAA,GAAA,GAAA,IAAA,CAAA,IAAA,CAAA,IAAA,CAAA,IAAA;EACA,EAAA,KAAA,IAAA,CAAA,GAAA,CAAA,EAAA,CAAA,GAAA,GAAA,CAAA,MAAA,EAAA,CAAA,EAAA,EAAA;EACA,IAAA,IAAA,CAAA,IAAA,CAAA,GAAA,CAAA,CAAA,CAAA;EACA;EACA,EAAA,OAAA;EACA;;EAEA,aAAA,CAAA,SAAA,CAAA,IAAA,GAAA,UAAA,IAAA,EAAA,YAAA,EAAA,aAAA,EAAA;EACA,EAAA,MAAA,OAAA,GAAA,IAAA,CAAA,IAAA;EACA,IAAA,UAAA,IAAA,EAAA,IAAA,EAAA;EACA,MAAA,MAAA,GAAA,GAAA,CAAA,CAAA,IAAA,CAAA,CAAA,IAAA,CAAA,OAAA,CAAA,CAAA,EAAA,CAAA,YAAA;EACA,MAAA,MAAA,GAAA,GAAA,CAAA,CAAA,IAAA,CAAA,CAAA,IAAA,CAAA,OAAA,CAAA,CAAA,EAAA,CAAA,YAAA;;EAEA,MAAA,MAAA,MAAA;EACA,QAAA,aAAA,KAAA;EACA,YAAA,IAAA,CAAA,YAAA,CAAA,GAAA;EACA,YAAA,IAAA,CAAA,YAAA,CAAA,GAAA;EACA,MAAA,MAAA,MAAA;EACA,QAAA,aAAA,KAAA;EACA,YAAA,IAAA,CAAA,YAAA,CAAA,GAAA;EACA,YAAA,IAAA,CAAA,YAAA,CAAA,GAAA;;EAEA,MAAA,IAAA,OAAA,MAAA,KAAA,QAAA,IAAA,OAAA,MAAA,KAAA,QAAA;EACA,QAAA,OAAA,MAAA,CAAA,QAAA,EAAA,CAAA,aAAA,CAAA,MAAA,CAAA,QAAA,EAAA;EACA,MAAA,OAAA,MAAA,GAAA;EACA,KAAA,CAAA,IAAA,CAAA,IAAA;EACA;EACA,EAAA,OAAA;EACA;;EAEA,aAAA,CAAA,SAAA,CAAA,YAAA,GAAA,UAAA,IAAA,EAAA;EACA,EAAA,MAAA,GAAA,GAAA,IAAA,CAAA,IAAA,CAAA,iBAAA,CAAA,IAAA,IAAA,CAAA,IAAA;;EAEA,EAAA,MAAA,WAAA,GAAA,MAAA,CAAA,GAAA;EACA,EAAA,OAAA,KAAA,CAAA,WAAA,CAAA,GAAA,GAAA,GAAA;EACA;;;;;;;;"}
|
|
1
|
+
{"version":3,"file":"sortable-table.js","sources":["../../../../src/moj/components/sortable-table/sortable-table.mjs"],"sourcesContent":["import $ from 'jquery'\n\nexport function SortableTable(params) {\n this.table = $(params.table)\n\n if (this.table.data('moj-search-toggle-initialised')) {\n return\n }\n\n this.table.data('moj-search-toggle-initialised', true)\n this.caption = this.table.find('caption')\n\n this.upArrow = `<svg width=\"22\" height=\"22\" focusable=\"false\" aria-hidden=\"true\" role=\"img\" viewBox=\"0 0 22 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M6.5625 15.5L11 6.63125L15.4375 15.5H6.5625Z\" fill=\"currentColor\"/>\n</svg>`\n this.downArrow = `<svg width=\"22\" height=\"22\" focusable=\"false\" aria-hidden=\"true\" role=\"img\" vviewBox=\"0 0 22 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M15.4375 7L11 15.8687L6.5625 7L15.4375 7Z\" fill=\"currentColor\"/>\n</svg>`\n this.upDownArrow = `<svg width=\"22\" height=\"22\" focusable=\"false\" aria-hidden=\"true\" role=\"img\" vviewBox=\"0 0 22 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M8.1875 9.5L10.9609 3.95703L13.7344 9.5H8.1875Z\" fill=\"currentColor\"/>\n<path d=\"M13.7344 12.0781L10.9609 17.6211L8.1875 12.0781H13.7344Z\" fill=\"currentColor\"/>\n</svg>`\n\n this.setupOptions(params)\n this.body = this.table.find('tbody')\n this.createHeadingButtons()\n this.updateCaption()\n this.updateDirectionIndicators()\n this.createStatusBox()\n this.initialiseSortedColumn()\n this.table.on('click', 'th button', $.proxy(this, 'onSortButtonClick'))\n}\n\nSortableTable.prototype.setupOptions = function (params) {\n params = params || {}\n this.statusMessage = params.statusMessage || 'Sort by %heading% (%direction%)'\n this.ascendingText = params.ascendingText || 'ascending'\n this.descendingText = params.descendingText || 'descending'\n}\n\nSortableTable.prototype.createHeadingButtons = function () {\n const headings = this.table.find('thead th')\n let heading\n for (let i = 0; i < headings.length; i++) {\n heading = $(headings[i])\n if (heading.attr('aria-sort')) {\n this.createHeadingButton(heading, i)\n }\n }\n}\n\nSortableTable.prototype.createHeadingButton = function (heading, i) {\n const text = heading.text()\n const button = $(`<button type=\"button\" data-index=\"${i}\">${text}</button>`)\n heading.text('')\n heading.append(button)\n}\n\nSortableTable.prototype.createStatusBox = function () {\n this.status = $(\n '<div aria-live=\"polite\" role=\"status\" aria-atomic=\"true\" class=\"govuk-visually-hidden\" />'\n )\n this.table.parent().append(this.status)\n}\n\nSortableTable.prototype.initialiseSortedColumn = function () {\n const rows = this.getTableRowsArray()\n\n this.table\n .find('th')\n .filter('[aria-sort=\"ascending\"], [aria-sort=\"descending\"]')\n .first()\n .each((index, el) => {\n const sortDirection = $(el).attr('aria-sort')\n const columnNumber = $(el).find('button').attr('data-index')\n const sortedRows = this.sort(rows, columnNumber, sortDirection)\n this.addRows(sortedRows)\n })\n}\n\nSortableTable.prototype.onSortButtonClick = function (e) {\n const button = e.target.closest('button')\n const columnNumber = button.getAttribute('data-index')\n const sortDirection = $(button).parent().attr('aria-sort')\n let newSortDirection\n if (sortDirection === 'none' || sortDirection === 'descending') {\n newSortDirection = 'ascending'\n } else {\n newSortDirection = 'descending'\n }\n const rows = this.getTableRowsArray()\n const sortedRows = this.sort(rows, columnNumber, newSortDirection)\n this.addRows(sortedRows)\n this.removeButtonStates()\n this.updateButtonState($(e.currentTarget), newSortDirection)\n this.updateDirectionIndicators()\n}\n\nSortableTable.prototype.updateCaption = function () {\n const captionElement = this.caption.get(0)\n\n if (!captionElement) {\n return\n }\n\n let assistiveText = captionElement.querySelector('.govuk-visually-hidden')\n if (assistiveText) {\n return\n }\n\n assistiveText = document.createElement('span')\n assistiveText.classList.add('govuk-visually-hidden')\n assistiveText.textContent = ' (column headers with buttons are sortable).'\n\n captionElement.appendChild(assistiveText)\n}\n\nSortableTable.prototype.updateButtonState = function (button, direction) {\n button.parent().attr('aria-sort', direction)\n let message = this.statusMessage\n message = message.replace(/%heading%/, button.text())\n message = message.replace(/%direction%/, this[`${direction}Text`])\n this.status.text(message)\n}\n\nSortableTable.prototype.updateDirectionIndicators = function () {\n const component = this\n this.table.find('th').each(function () {\n const heading = $(this)\n const button = heading.find('button')\n const direction = heading.attr('aria-sort')\n button.find('svg').remove()\n switch (direction) {\n case 'ascending':\n button.append(component.upArrow)\n break\n case 'descending':\n button.append(component.downArrow)\n break\n case 'none':\n button.append(component.upDownArrow)\n }\n })\n}\n\nSortableTable.prototype.removeButtonStates = function () {\n this.table.find('thead th').attr('aria-sort', 'none')\n}\n\nSortableTable.prototype.addRows = function (rows) {\n for (let i = 0; i < rows.length; i++) {\n this.body.append(rows[i])\n }\n}\n\nSortableTable.prototype.getTableRowsArray = function () {\n const rows = []\n const trs = this.body.find('tr')\n for (let i = 0; i < trs.length; i++) {\n rows.push(trs[i])\n }\n return rows\n}\n\nSortableTable.prototype.sort = function (rows, columnNumber, sortDirection) {\n const newRows = rows.sort(\n function (rowA, rowB) {\n const tdA = $(rowA).find('td,th').eq(columnNumber)\n const tdB = $(rowB).find('td,th').eq(columnNumber)\n\n const valueA =\n sortDirection === 'ascending'\n ? this.getCellValue(tdA)\n : this.getCellValue(tdB)\n const valueB =\n sortDirection === 'ascending'\n ? this.getCellValue(tdB)\n : this.getCellValue(tdA)\n\n if (typeof valueA === 'string' || typeof valueB === 'string')\n return valueA.toString().localeCompare(valueB.toString())\n return valueA - valueB\n }.bind(this)\n )\n return newRows\n}\n\nSortableTable.prototype.getCellValue = function (cell) {\n const val = cell.attr('data-sort-value') || cell.html()\n\n const valAsNumber = Number(val)\n return isNaN(valAsNumber) ? val : valAsNumber\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -6,10 +6,24 @@ function SortableTable(params) {
|
|
|
6
6
|
}
|
|
7
7
|
|
|
8
8
|
this.table.data('moj-search-toggle-initialised', true);
|
|
9
|
+
this.caption = this.table.find('caption');
|
|
10
|
+
|
|
11
|
+
this.upArrow = `<svg width="22" height="22" focusable="false" aria-hidden="true" role="img" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
12
|
+
<path d="M6.5625 15.5L11 6.63125L15.4375 15.5H6.5625Z" fill="currentColor"/>
|
|
13
|
+
</svg>`;
|
|
14
|
+
this.downArrow = `<svg width="22" height="22" focusable="false" aria-hidden="true" role="img" vviewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
15
|
+
<path d="M15.4375 7L11 15.8687L6.5625 7L15.4375 7Z" fill="currentColor"/>
|
|
16
|
+
</svg>`;
|
|
17
|
+
this.upDownArrow = `<svg width="22" height="22" focusable="false" aria-hidden="true" role="img" vviewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
18
|
+
<path d="M8.1875 9.5L10.9609 3.95703L13.7344 9.5H8.1875Z" fill="currentColor"/>
|
|
19
|
+
<path d="M13.7344 12.0781L10.9609 17.6211L8.1875 12.0781H13.7344Z" fill="currentColor"/>
|
|
20
|
+
</svg>`;
|
|
9
21
|
|
|
10
22
|
this.setupOptions(params);
|
|
11
23
|
this.body = this.table.find('tbody');
|
|
12
24
|
this.createHeadingButtons();
|
|
25
|
+
this.updateCaption();
|
|
26
|
+
this.updateDirectionIndicators();
|
|
13
27
|
this.createStatusBox();
|
|
14
28
|
this.initialiseSortedColumn();
|
|
15
29
|
this.table.on('click', 'th button', $.proxy(this, 'onSortButtonClick'));
|
|
@@ -63,8 +77,9 @@ SortableTable.prototype.initialiseSortedColumn = function () {
|
|
|
63
77
|
};
|
|
64
78
|
|
|
65
79
|
SortableTable.prototype.onSortButtonClick = function (e) {
|
|
66
|
-
const
|
|
67
|
-
const
|
|
80
|
+
const button = e.target.closest('button');
|
|
81
|
+
const columnNumber = button.getAttribute('data-index');
|
|
82
|
+
const sortDirection = $(button).parent().attr('aria-sort');
|
|
68
83
|
let newSortDirection;
|
|
69
84
|
if (sortDirection === 'none' || sortDirection === 'descending') {
|
|
70
85
|
newSortDirection = 'ascending';
|
|
@@ -76,6 +91,26 @@ SortableTable.prototype.onSortButtonClick = function (e) {
|
|
|
76
91
|
this.addRows(sortedRows);
|
|
77
92
|
this.removeButtonStates();
|
|
78
93
|
this.updateButtonState($(e.currentTarget), newSortDirection);
|
|
94
|
+
this.updateDirectionIndicators();
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
SortableTable.prototype.updateCaption = function () {
|
|
98
|
+
const captionElement = this.caption.get(0);
|
|
99
|
+
|
|
100
|
+
if (!captionElement) {
|
|
101
|
+
return
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
let assistiveText = captionElement.querySelector('.govuk-visually-hidden');
|
|
105
|
+
if (assistiveText) {
|
|
106
|
+
return
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
assistiveText = document.createElement('span');
|
|
110
|
+
assistiveText.classList.add('govuk-visually-hidden');
|
|
111
|
+
assistiveText.textContent = ' (column headers with buttons are sortable).';
|
|
112
|
+
|
|
113
|
+
captionElement.appendChild(assistiveText);
|
|
79
114
|
};
|
|
80
115
|
|
|
81
116
|
SortableTable.prototype.updateButtonState = function (button, direction) {
|
|
@@ -86,6 +121,26 @@ SortableTable.prototype.updateButtonState = function (button, direction) {
|
|
|
86
121
|
this.status.text(message);
|
|
87
122
|
};
|
|
88
123
|
|
|
124
|
+
SortableTable.prototype.updateDirectionIndicators = function () {
|
|
125
|
+
const component = this;
|
|
126
|
+
this.table.find('th').each(function () {
|
|
127
|
+
const heading = $(this);
|
|
128
|
+
const button = heading.find('button');
|
|
129
|
+
const direction = heading.attr('aria-sort');
|
|
130
|
+
button.find('svg').remove();
|
|
131
|
+
switch (direction) {
|
|
132
|
+
case 'ascending':
|
|
133
|
+
button.append(component.upArrow);
|
|
134
|
+
break
|
|
135
|
+
case 'descending':
|
|
136
|
+
button.append(component.downArrow);
|
|
137
|
+
break
|
|
138
|
+
case 'none':
|
|
139
|
+
button.append(component.upDownArrow);
|
|
140
|
+
}
|
|
141
|
+
});
|
|
142
|
+
};
|
|
143
|
+
|
|
89
144
|
SortableTable.prototype.removeButtonStates = function () {
|
|
90
145
|
this.table.find('thead th').attr('aria-sort', 'none');
|
|
91
146
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sortable-table.mjs","sources":["../../../../src/moj/components/sortable-table/sortable-table.mjs"],"sourcesContent":["import $ from 'jquery'\n\nexport function SortableTable(params) {\n this.table = $(params.table)\n\n if (this.table.data('moj-search-toggle-initialised')) {\n return\n }\n\n this.table.data('moj-search-toggle-initialised', true)\n\n this.setupOptions(params)\n this.body = this.table.find('tbody')\n this.createHeadingButtons()\n this.createStatusBox()\n this.initialiseSortedColumn()\n this.table.on('click', 'th button', $.proxy(this, 'onSortButtonClick'))\n}\n\nSortableTable.prototype.setupOptions = function (params) {\n params = params || {}\n this.statusMessage = params.statusMessage || 'Sort by %heading% (%direction%)'\n this.ascendingText = params.ascendingText || 'ascending'\n this.descendingText = params.descendingText || 'descending'\n}\n\nSortableTable.prototype.createHeadingButtons = function () {\n const headings = this.table.find('thead th')\n let heading\n for (let i = 0; i < headings.length; i++) {\n heading = $(headings[i])\n if (heading.attr('aria-sort')) {\n this.createHeadingButton(heading, i)\n }\n }\n}\n\nSortableTable.prototype.createHeadingButton = function (heading, i) {\n const text = heading.text()\n const button = $(`<button type=\"button\" data-index=\"${i}\">${text}</button>`)\n heading.text('')\n heading.append(button)\n}\n\nSortableTable.prototype.createStatusBox = function () {\n this.status = $(\n '<div aria-live=\"polite\" role=\"status\" aria-atomic=\"true\" class=\"govuk-visually-hidden\" />'\n )\n this.table.parent().append(this.status)\n}\n\nSortableTable.prototype.initialiseSortedColumn = function () {\n const rows = this.getTableRowsArray()\n\n this.table\n .find('th')\n .filter('[aria-sort=\"ascending\"], [aria-sort=\"descending\"]')\n .first()\n .each((index, el) => {\n const sortDirection = $(el).attr('aria-sort')\n const columnNumber = $(el).find('button').attr('data-index')\n const sortedRows = this.sort(rows, columnNumber, sortDirection)\n this.addRows(sortedRows)\n })\n}\n\nSortableTable.prototype.onSortButtonClick = function (e) {\n const columnNumber = e.currentTarget.getAttribute('data-index')\n const sortDirection = $(e.currentTarget).parent().attr('aria-sort')\n let newSortDirection\n if (sortDirection === 'none' || sortDirection === 'descending') {\n newSortDirection = 'ascending'\n } else {\n newSortDirection = 'descending'\n }\n const rows = this.getTableRowsArray()\n const sortedRows = this.sort(rows, columnNumber, newSortDirection)\n this.addRows(sortedRows)\n this.removeButtonStates()\n this.updateButtonState($(e.currentTarget), newSortDirection)\n}\n\nSortableTable.prototype.updateButtonState = function (button, direction) {\n button.parent().attr('aria-sort', direction)\n let message = this.statusMessage\n message = message.replace(/%heading%/, button.text())\n message = message.replace(/%direction%/, this[`${direction}Text`])\n this.status.text(message)\n}\n\nSortableTable.prototype.removeButtonStates = function () {\n this.table.find('thead th').attr('aria-sort', 'none')\n}\n\nSortableTable.prototype.addRows = function (rows) {\n for (let i = 0; i < rows.length; i++) {\n this.body.append(rows[i])\n }\n}\n\nSortableTable.prototype.getTableRowsArray = function () {\n const rows = []\n const trs = this.body.find('tr')\n for (let i = 0; i < trs.length; i++) {\n rows.push(trs[i])\n }\n return rows\n}\n\nSortableTable.prototype.sort = function (rows, columnNumber, sortDirection) {\n const newRows = rows.sort(\n function (rowA, rowB) {\n const tdA = $(rowA).find('td,th').eq(columnNumber)\n const tdB = $(rowB).find('td,th').eq(columnNumber)\n\n const valueA =\n sortDirection === 'ascending'\n ? this.getCellValue(tdA)\n : this.getCellValue(tdB)\n const valueB =\n sortDirection === 'ascending'\n ? this.getCellValue(tdB)\n : this.getCellValue(tdA)\n\n if (typeof valueA === 'string' || typeof valueB === 'string')\n return valueA.toString().localeCompare(valueB.toString())\n return valueA - valueB\n }.bind(this)\n )\n return newRows\n}\n\nSortableTable.prototype.getCellValue = function (cell) {\n const val = cell.attr('data-sort-value') || cell.html()\n\n const valAsNumber = Number(val)\n return isNaN(valAsNumber) ? val : valAsNumber\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sortable-table.mjs","sources":["../../../../src/moj/components/sortable-table/sortable-table.mjs"],"sourcesContent":["import $ from 'jquery'\n\nexport function SortableTable(params) {\n this.table = $(params.table)\n\n if (this.table.data('moj-search-toggle-initialised')) {\n return\n }\n\n this.table.data('moj-search-toggle-initialised', true)\n this.caption = this.table.find('caption')\n\n this.upArrow = `<svg width=\"22\" height=\"22\" focusable=\"false\" aria-hidden=\"true\" role=\"img\" viewBox=\"0 0 22 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M6.5625 15.5L11 6.63125L15.4375 15.5H6.5625Z\" fill=\"currentColor\"/>\n</svg>`\n this.downArrow = `<svg width=\"22\" height=\"22\" focusable=\"false\" aria-hidden=\"true\" role=\"img\" vviewBox=\"0 0 22 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M15.4375 7L11 15.8687L6.5625 7L15.4375 7Z\" fill=\"currentColor\"/>\n</svg>`\n this.upDownArrow = `<svg width=\"22\" height=\"22\" focusable=\"false\" aria-hidden=\"true\" role=\"img\" vviewBox=\"0 0 22 22\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n<path d=\"M8.1875 9.5L10.9609 3.95703L13.7344 9.5H8.1875Z\" fill=\"currentColor\"/>\n<path d=\"M13.7344 12.0781L10.9609 17.6211L8.1875 12.0781H13.7344Z\" fill=\"currentColor\"/>\n</svg>`\n\n this.setupOptions(params)\n this.body = this.table.find('tbody')\n this.createHeadingButtons()\n this.updateCaption()\n this.updateDirectionIndicators()\n this.createStatusBox()\n this.initialiseSortedColumn()\n this.table.on('click', 'th button', $.proxy(this, 'onSortButtonClick'))\n}\n\nSortableTable.prototype.setupOptions = function (params) {\n params = params || {}\n this.statusMessage = params.statusMessage || 'Sort by %heading% (%direction%)'\n this.ascendingText = params.ascendingText || 'ascending'\n this.descendingText = params.descendingText || 'descending'\n}\n\nSortableTable.prototype.createHeadingButtons = function () {\n const headings = this.table.find('thead th')\n let heading\n for (let i = 0; i < headings.length; i++) {\n heading = $(headings[i])\n if (heading.attr('aria-sort')) {\n this.createHeadingButton(heading, i)\n }\n }\n}\n\nSortableTable.prototype.createHeadingButton = function (heading, i) {\n const text = heading.text()\n const button = $(`<button type=\"button\" data-index=\"${i}\">${text}</button>`)\n heading.text('')\n heading.append(button)\n}\n\nSortableTable.prototype.createStatusBox = function () {\n this.status = $(\n '<div aria-live=\"polite\" role=\"status\" aria-atomic=\"true\" class=\"govuk-visually-hidden\" />'\n )\n this.table.parent().append(this.status)\n}\n\nSortableTable.prototype.initialiseSortedColumn = function () {\n const rows = this.getTableRowsArray()\n\n this.table\n .find('th')\n .filter('[aria-sort=\"ascending\"], [aria-sort=\"descending\"]')\n .first()\n .each((index, el) => {\n const sortDirection = $(el).attr('aria-sort')\n const columnNumber = $(el).find('button').attr('data-index')\n const sortedRows = this.sort(rows, columnNumber, sortDirection)\n this.addRows(sortedRows)\n })\n}\n\nSortableTable.prototype.onSortButtonClick = function (e) {\n const button = e.target.closest('button')\n const columnNumber = button.getAttribute('data-index')\n const sortDirection = $(button).parent().attr('aria-sort')\n let newSortDirection\n if (sortDirection === 'none' || sortDirection === 'descending') {\n newSortDirection = 'ascending'\n } else {\n newSortDirection = 'descending'\n }\n const rows = this.getTableRowsArray()\n const sortedRows = this.sort(rows, columnNumber, newSortDirection)\n this.addRows(sortedRows)\n this.removeButtonStates()\n this.updateButtonState($(e.currentTarget), newSortDirection)\n this.updateDirectionIndicators()\n}\n\nSortableTable.prototype.updateCaption = function () {\n const captionElement = this.caption.get(0)\n\n if (!captionElement) {\n return\n }\n\n let assistiveText = captionElement.querySelector('.govuk-visually-hidden')\n if (assistiveText) {\n return\n }\n\n assistiveText = document.createElement('span')\n assistiveText.classList.add('govuk-visually-hidden')\n assistiveText.textContent = ' (column headers with buttons are sortable).'\n\n captionElement.appendChild(assistiveText)\n}\n\nSortableTable.prototype.updateButtonState = function (button, direction) {\n button.parent().attr('aria-sort', direction)\n let message = this.statusMessage\n message = message.replace(/%heading%/, button.text())\n message = message.replace(/%direction%/, this[`${direction}Text`])\n this.status.text(message)\n}\n\nSortableTable.prototype.updateDirectionIndicators = function () {\n const component = this\n this.table.find('th').each(function () {\n const heading = $(this)\n const button = heading.find('button')\n const direction = heading.attr('aria-sort')\n button.find('svg').remove()\n switch (direction) {\n case 'ascending':\n button.append(component.upArrow)\n break\n case 'descending':\n button.append(component.downArrow)\n break\n case 'none':\n button.append(component.upDownArrow)\n }\n })\n}\n\nSortableTable.prototype.removeButtonStates = function () {\n this.table.find('thead th').attr('aria-sort', 'none')\n}\n\nSortableTable.prototype.addRows = function (rows) {\n for (let i = 0; i < rows.length; i++) {\n this.body.append(rows[i])\n }\n}\n\nSortableTable.prototype.getTableRowsArray = function () {\n const rows = []\n const trs = this.body.find('tr')\n for (let i = 0; i < trs.length; i++) {\n rows.push(trs[i])\n }\n return rows\n}\n\nSortableTable.prototype.sort = function (rows, columnNumber, sortDirection) {\n const newRows = rows.sort(\n function (rowA, rowB) {\n const tdA = $(rowA).find('td,th').eq(columnNumber)\n const tdB = $(rowB).find('td,th').eq(columnNumber)\n\n const valueA =\n sortDirection === 'ascending'\n ? this.getCellValue(tdA)\n : this.getCellValue(tdB)\n const valueB =\n sortDirection === 'ascending'\n ? this.getCellValue(tdB)\n : this.getCellValue(tdA)\n\n if (typeof valueA === 'string' || typeof valueB === 'string')\n return valueA.toString().localeCompare(valueB.toString())\n return valueA - valueB\n }.bind(this)\n )\n return newRows\n}\n\nSortableTable.prototype.getCellValue = function (cell) {\n const val = cell.attr('data-sort-value') || cell.html()\n\n const valAsNumber = Number(val)\n return isNaN(valAsNumber) ? val : valAsNumber\n}\n"],"names":[],"mappings":"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"}
|