@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.
@@ -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 10px 0 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 columnNumber = e.currentTarget.getAttribute('data-index');
73
- const sortDirection = $(e.currentTarget).parent().attr('aria-sort');
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":"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"}
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":";;;;;;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;EACA,EAAA,IAAA,CAAA,OAAA,GAAA,IAAA,CAAA,KAAA,CAAA,IAAA,CAAA,SAAA;;EAEA,EAAA,IAAA,CAAA,OAAA,GAAA,CAAA;AACA;AACA,MAAA;EACA,EAAA,IAAA,CAAA,SAAA,GAAA,CAAA;AACA;AACA,MAAA;EACA,EAAA,IAAA,CAAA,WAAA,GAAA,CAAA;AACA;AACA;AACA,MAAA;;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,aAAA;EACA,EAAA,IAAA,CAAA,yBAAA;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,MAAA,GAAA,CAAA,CAAA,MAAA,CAAA,OAAA,CAAA,QAAA;EACA,EAAA,MAAA,YAAA,GAAA,MAAA,CAAA,YAAA,CAAA,YAAA;EACA,EAAA,MAAA,aAAA,GAAA,CAAA,CAAA,MAAA,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,EAAA,IAAA,CAAA,yBAAA;EACA;;EAEA,aAAA,CAAA,SAAA,CAAA,aAAA,GAAA,YAAA;EACA,EAAA,MAAA,cAAA,GAAA,IAAA,CAAA,OAAA,CAAA,GAAA,CAAA,CAAA;;EAEA,EAAA,IAAA,CAAA,cAAA,EAAA;EACA,IAAA;EACA;;EAEA,EAAA,IAAA,aAAA,GAAA,cAAA,CAAA,aAAA,CAAA,wBAAA;EACA,EAAA,IAAA,aAAA,EAAA;EACA,IAAA;EACA;;EAEA,EAAA,aAAA,GAAA,QAAA,CAAA,aAAA,CAAA,MAAA;EACA,EAAA,aAAA,CAAA,SAAA,CAAA,GAAA,CAAA,uBAAA;EACA,EAAA,aAAA,CAAA,WAAA,GAAA;;EAEA,EAAA,cAAA,CAAA,WAAA,CAAA,aAAA;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,yBAAA,GAAA,YAAA;EACA,EAAA,MAAA,SAAA,GAAA;EACA,EAAA,IAAA,CAAA,KAAA,CAAA,IAAA,CAAA,IAAA,CAAA,CAAA,IAAA,CAAA,YAAA;EACA,IAAA,MAAA,OAAA,GAAA,CAAA,CAAA,IAAA;EACA,IAAA,MAAA,MAAA,GAAA,OAAA,CAAA,IAAA,CAAA,QAAA;EACA,IAAA,MAAA,SAAA,GAAA,OAAA,CAAA,IAAA,CAAA,WAAA;EACA,IAAA,MAAA,CAAA,IAAA,CAAA,KAAA,CAAA,CAAA,MAAA;EACA,IAAA,QAAA,SAAA;EACA,MAAA,KAAA,WAAA;EACA,QAAA,MAAA,CAAA,MAAA,CAAA,SAAA,CAAA,OAAA;EACA,QAAA;EACA,MAAA,KAAA,YAAA;EACA,QAAA,MAAA,CAAA,MAAA,CAAA,SAAA,CAAA,SAAA;EACA,QAAA;EACA,MAAA,KAAA,MAAA;EACA,QAAA,MAAA,CAAA,MAAA,CAAA,SAAA,CAAA,WAAA;EACA;EACA,GAAA;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;;;;;;;;"}
@@ -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 columnNumber = e.currentTarget.getAttribute('data-index');
67
- const sortDirection = $(e.currentTarget).parent().attr('aria-sort');
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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"}