@ministryofjustice/frontend 3.3.0 → 3.4.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.
Files changed (87) hide show
  1. package/README.md +4 -10
  2. package/govuk-prototype-kit.config.json +5 -16
  3. package/moj/all.jquery.min.js +77 -3
  4. package/moj/all.js +2022 -1444
  5. package/moj/all.scss +2 -0
  6. package/moj/all.spec.js +15 -13
  7. package/moj/components/_all.scss +1 -0
  8. package/moj/components/action-bar/_action-bar.scss +4 -6
  9. package/moj/components/add-another/_add-another.scss +9 -7
  10. package/moj/components/add-another/add-another.js +90 -69
  11. package/moj/components/add-another/add-another.spec.js +165 -0
  12. package/moj/components/alert/README.md +0 -0
  13. package/moj/components/alert/_alert.scss +142 -0
  14. package/moj/components/alert/alert.js +247 -0
  15. package/moj/components/alert/alert.spec.helper.js +67 -0
  16. package/moj/components/alert/alert.spec.js +229 -0
  17. package/moj/components/alert/macro.njk +3 -0
  18. package/moj/components/alert/template.njk +83 -0
  19. package/moj/components/badge/_badge.scss +3 -4
  20. package/moj/components/banner/_banner.scss +5 -10
  21. package/moj/components/button-menu/_button-menu.scss +10 -9
  22. package/moj/components/button-menu/button-menu.js +139 -136
  23. package/moj/components/button-menu/button-menu.spec.js +295 -296
  24. package/moj/components/cookie-banner/_cookie-banner.scss +6 -5
  25. package/moj/components/currency-input/_currency-input.scss +4 -4
  26. package/moj/components/date-picker/README.md +14 -17
  27. package/moj/components/date-picker/_date-picker.scss +122 -106
  28. package/moj/components/date-picker/date-picker.js +473 -471
  29. package/moj/components/date-picker/date-picker.spec.js +962 -914
  30. package/moj/components/filter/README.md +1 -1
  31. package/moj/components/filter/_filter.scss +53 -75
  32. package/moj/components/filter-toggle-button/filter-toggle-button.js +71 -67
  33. package/moj/components/filter-toggle-button/filter-toggle-button.spec.js +203 -205
  34. package/moj/components/form-validator/form-validator.js +117 -109
  35. package/moj/components/header/_header.scss +17 -19
  36. package/moj/components/identity-bar/_identity-bar.scss +5 -5
  37. package/moj/components/interruption-card/_interruption-card.scss +9 -2
  38. package/moj/components/messages/_messages.scss +12 -19
  39. package/moj/components/multi-file-upload/README.md +1 -1
  40. package/moj/components/multi-file-upload/_multi-file-upload.scss +34 -30
  41. package/moj/components/multi-file-upload/multi-file-upload.js +188 -152
  42. package/moj/components/multi-file-upload/multi-file-upload.spec.js +510 -0
  43. package/moj/components/multi-select/_multi-select.scss +4 -3
  44. package/moj/components/multi-select/multi-select.js +55 -50
  45. package/moj/components/multi-select/multi-select.spec.js +128 -0
  46. package/moj/components/notification-badge/_notification-badge.scss +12 -12
  47. package/moj/components/organisation-switcher/_organisation-switcher.scss +1 -1
  48. package/moj/components/page-header-actions/_page-header-actions.scss +3 -2
  49. package/moj/components/pagination/_pagination.scss +26 -31
  50. package/moj/components/password-reveal/_password-reveal.scss +1 -2
  51. package/moj/components/password-reveal/password-reveal.js +22 -21
  52. package/moj/components/password-reveal/password-reveal.spec.js +39 -37
  53. package/moj/components/primary-navigation/_primary-navigation.scss +26 -29
  54. package/moj/components/progress-bar/_progress-bar.scss +21 -26
  55. package/moj/components/rich-text-editor/_rich-text-editor.scss +17 -16
  56. package/moj/components/rich-text-editor/rich-text-editor.js +117 -103
  57. package/moj/components/search/_search.scss +6 -4
  58. package/moj/components/search-toggle/search-toggle.js +29 -30
  59. package/moj/components/search-toggle/search-toggle.scss +21 -15
  60. package/moj/components/search-toggle/search-toggle.spec.js +129 -0
  61. package/moj/components/side-navigation/_side-navigation.scss +12 -21
  62. package/moj/components/sortable-table/_sortable-table.scss +25 -23
  63. package/moj/components/sortable-table/sortable-table.js +139 -117
  64. package/moj/components/sortable-table/sortable-table.spec.js +362 -0
  65. package/moj/components/sub-navigation/_sub-navigation.scss +24 -28
  66. package/moj/components/tag/_tag.scss +8 -9
  67. package/moj/components/task-list/_task-list.scss +8 -7
  68. package/moj/components/ticket-panel/_ticket-panel.scss +14 -6
  69. package/moj/components/timeline/_timeline.scss +18 -20
  70. package/moj/filters/all.js +28 -30
  71. package/moj/filters/prototype-kit-13-filters.js +2 -1
  72. package/moj/helpers/_all.scss +1 -0
  73. package/moj/helpers/_hidden.scss +1 -1
  74. package/moj/helpers/_links.scss +20 -0
  75. package/moj/helpers.js +160 -31
  76. package/moj/helpers.spec.js +235 -0
  77. package/moj/init.js +2 -2
  78. package/moj/moj-frontend.min.css +2 -2
  79. package/moj/moj-frontend.min.js +77 -3
  80. package/moj/namespace.js +2 -1
  81. package/moj/objects/_filter-layout.scss +11 -10
  82. package/moj/objects/_scrollable-pane.scss +11 -14
  83. package/moj/settings/_colours.scss +5 -0
  84. package/moj/settings/_measurements.scss +0 -2
  85. package/moj/utilities/_hidden.scss +3 -3
  86. package/moj/utilities/_width-container.scss +1 -1
  87. package/package.json +1 -1
@@ -1 +1 @@
1
- #Filters
1
+ #Filters
@@ -7,48 +7,48 @@
7
7
  box-shadow: inset 0 0 0 1px govuk-colour("mid-grey");
8
8
 
9
9
  &:focus {
10
- box-shadow: 0 -2px $govuk-focus-colour, 0 4px $govuk-focus-text-colour;
10
+ box-shadow:
11
+ 0 -2px $govuk-focus-colour,
12
+ 0 4px $govuk-focus-text-colour;
11
13
  }
12
14
  }
13
15
 
14
-
15
16
  .moj-filter__header {
17
+ padding: govuk-spacing(2) govuk-spacing(4);
16
18
  background-color: govuk-colour("mid-grey");
17
19
  font-size: 0; // Hide whitespace between elements
18
- padding: govuk-spacing(2) govuk-spacing(4);
19
20
  text-align: justify; // Trick to remove the need for floats
20
21
 
21
- &:after {
22
- content: '';
22
+ &::after {
23
+ content: "";
23
24
  display: inline-block;
24
25
  width: 100%;
25
26
  }
26
27
 
27
- [class^=govuk-heading-] {
28
+ [class^="govuk-heading-"] {
28
29
  margin-bottom: 0;
29
30
  }
30
-
31
31
  }
32
32
 
33
-
34
33
  // JavaScript
35
34
  .moj-filter__legend {
36
- overflow: visible; // Override govuk to allow for focus style to be seen
37
35
  width: 100%;
36
+ overflow: visible; // Override govuk to allow for focus style to be seen
38
37
 
39
38
  button {
40
39
  @include govuk-font($size: 24, $weight: bold);
41
- background-color: transparent;
40
+ appearance: none;
42
41
  box-sizing: border-box;
43
- border-radius: 0;
44
- border: 0 none;
45
- cursor: pointer; // Adam would not approve
46
42
  display: block;
43
+ position: relative;
44
+ width: 100%;
47
45
  margin: 0;
48
46
  padding: 0;
49
- position: relative;
47
+ border: 0 none;
48
+ border-radius: 0;
49
+ background-color: transparent;
50
50
  text-align: left;
51
- width: 100%;
51
+ cursor: pointer; // Adam would not approve
52
52
  -webkit-appearance: none;
53
53
 
54
54
  // Fix unwanted button padding in Firefox
@@ -58,31 +58,24 @@
58
58
  }
59
59
 
60
60
  &::after {
61
- background-image: url(#{$moj-images-path}icon-toggle-plus-minus.svg);
62
- background-position: 0 0;
63
61
  content: "";
64
62
  display: block;
63
+ position: absolute;
64
+ top: 50%;
65
+ right: 0;
66
+ width: 16px;
65
67
  height: 16px;
66
68
  margin-top: -8px; // Half the height of the icon
67
- position: absolute; top: 50%; right: 0;
68
- width: 16px;
69
- }
70
-
71
- &[aria-expanded="true"] {
72
- &::after {
73
- background-position: 16px 16px;
74
- }
69
+ background-image: url(#{$moj-images-path}icon-toggle-plus-minus.svg);
70
+ background-position: 0 0;
75
71
  }
76
72
 
77
- &:focus {
78
- // @include govuk-focusable;
73
+ &[aria-expanded="true"]::after {
74
+ background-position: 16px 16px;
79
75
  }
80
-
81
76
  }
82
-
83
77
  }
84
78
 
85
-
86
79
  .moj-filter__header-title,
87
80
  .moj-filter__header-action {
88
81
  display: inline-block;
@@ -90,24 +83,26 @@
90
83
  vertical-align: middle;
91
84
  }
92
85
 
93
-
94
86
  .moj-filter__close {
87
+ @include govuk-font(19);
88
+ margin: 0;
89
+ padding: 0;
90
+ border: none;
91
+ border-radius: 0;
95
92
  // @include govuk-focusable;
96
93
  color: govuk-colour("black");
97
- cursor: pointer; // I know Adam won’t like this
98
94
  background-color: transparent;
99
- border: none;
100
- border-radius: 0;
101
- margin: 0;
102
- padding: 0;
95
+ cursor: pointer; // I know Adam won’t like this
103
96
  -webkit-appearance: none;
104
-
97
+ appearance: none;
105
98
 
106
99
  &:focus {
107
- background-color: $govuk-focus-colour;
108
- color: $govuk-focus-text-colour;
109
- box-shadow: 0 -2px $govuk-focus-colour, 0 4px $govuk-focus-text-colour;
110
100
  outline: none;
101
+ color: $govuk-focus-text-colour;
102
+ background-color: $govuk-focus-colour;
103
+ box-shadow:
104
+ 0 -2px $govuk-focus-colour,
105
+ 0 4px $govuk-focus-text-colour;
111
106
  }
112
107
 
113
108
  // Fix unwanted button padding in Firefox
@@ -117,50 +112,39 @@
117
112
  }
118
113
 
119
114
  &::before {
120
- background-image: url(#{$moj-images-path}icon-close-cross-black.svg);
121
115
  content: "";
122
116
  display: inline-block;
123
- height: 14px;
124
- margin-right: govuk-spacing(1);
125
117
  position: relative;
126
118
  top: -1px; // Alignment tweak
127
- vertical-align: middle;
128
119
  width: 14px;
120
+ height: 14px;
121
+ margin-right: govuk-spacing(1);
122
+ background-image: url(#{$moj-images-path}icon-close-cross-black.svg);
123
+ vertical-align: middle;
129
124
  }
130
-
131
- }
132
-
133
-
134
- .moj-filter__close {
135
- @include govuk-font(19);
136
125
  }
137
126
 
138
-
139
127
  .moj-filter__selected {
128
+ padding: govuk-spacing(4);
140
129
  background-color: govuk-colour("light-grey");
141
130
  box-shadow: inset 0 0 0 1px govuk-colour("mid-grey");
142
- padding: govuk-spacing(4);
143
131
 
144
132
  ul:last-of-type {
145
133
  margin-bottom: 0; // IE9 +
146
134
  }
147
-
148
135
  }
149
136
 
150
-
151
137
  .moj-filter__selected-heading {
152
138
  font-size: 0; // Hide whitespace between elements
153
139
  text-align: justify; // Trick to remove the need for floats
154
140
 
155
- &:after {
156
- content: '';
141
+ &::after {
142
+ content: "";
157
143
  display: inline-block;
158
144
  width: 100%;
159
145
  }
160
-
161
146
  }
162
147
 
163
-
164
148
  .moj-filter__heading-title,
165
149
  .moj-filter__heading-action {
166
150
  @include govuk-font(16);
@@ -169,28 +153,25 @@
169
153
  vertical-align: middle;
170
154
  }
171
155
 
172
-
173
156
  .moj-filter-tags {
174
- font-size: 0;
175
157
  margin-bottom: govuk-spacing(4); // Needs to adjust to 15px on mobile
176
158
  padding-left: 0;
159
+ font-size: 0;
177
160
 
178
161
  li {
179
162
  display: inline-block;
180
163
  margin-right: govuk-spacing(2);
181
164
  }
182
-
183
165
  }
184
166
 
185
-
186
167
  .moj-filter__tag {
187
168
  @include govuk-font(16);
188
- background-color: govuk-colour("white");
189
- border: 1px solid govuk-colour("black");
190
- color: govuk-colour("black");
191
169
  display: inline-block;
192
170
  margin-top: govuk-spacing(1);
193
171
  padding: govuk-spacing(1);
172
+ border: 1px solid govuk-colour("black");
173
+ color: govuk-colour("black");
174
+ background-color: govuk-colour("white");
194
175
  text-decoration: none;
195
176
 
196
177
  &:link,
@@ -204,35 +185,32 @@
204
185
  }
205
186
 
206
187
  &:hover {
207
- background-color: govuk-colour("black");
208
188
  color: govuk-colour("white");
189
+ background-color: govuk-colour("black");
209
190
  }
210
191
 
211
- &:after {
212
- background-image: url(#{$moj-images-path}icon-tag-remove-cross.svg);
192
+ &::after {
213
193
  content: "";
214
194
  display: inline-block;
215
- font-weight: bold;
195
+ width: 10px;
216
196
  height: 10px;
217
197
  margin-left: govuk-spacing(1);
198
+ background-image: url(#{$moj-images-path}icon-tag-remove-cross.svg);
199
+ font-weight: bold;
218
200
  vertical-align: middle;
219
- width: 10px;
220
201
  }
221
202
 
222
- &:hover:after {
203
+ &:hover::after {
223
204
  background-image: url(#{$moj-images-path}icon-tag-remove-cross-white.svg);
224
205
  }
225
-
226
206
  }
227
207
 
228
-
229
208
  .moj-filter__options {
230
- box-shadow: inset 0 0 0 1px govuk-colour("mid-grey");
231
209
  margin-top: -1px;
232
210
  padding: govuk-spacing(4);
211
+ box-shadow: inset 0 0 0 1px govuk-colour("mid-grey");
233
212
 
234
213
  div:last-of-type {
235
214
  margin-bottom: 0; // IE9 +
236
215
  }
237
-
238
216
  }
@@ -1,87 +1,91 @@
1
- MOJFrontend.FilterToggleButton = function(options) {
2
- this.options = options;
3
- this.container = $(this.options.toggleButton.container);
4
- this.filterContainer = $(this.options.filter.container);
1
+ MOJFrontend.FilterToggleButton = function (options) {
2
+ this.options = options
3
+ this.container = $(this.options.toggleButton.container)
4
+ this.filterContainer = $(this.options.filter.container)
5
5
 
6
- this.createToggleButton();
7
- this.setupResponsiveChecks();
8
- this.filterContainer.attr('tabindex', '-1');
9
- if(this.options.startHidden) {
10
- this.hideMenu();
6
+ this.createToggleButton()
7
+ this.setupResponsiveChecks()
8
+ this.filterContainer.attr('tabindex', '-1')
9
+ if (this.options.startHidden) {
10
+ this.hideMenu()
11
11
  }
12
- };
12
+ }
13
13
 
14
- MOJFrontend.FilterToggleButton.prototype.setupResponsiveChecks = function() {
15
- this.mq = window.matchMedia(this.options.bigModeMediaQuery);
16
- this.mq.addListener($.proxy(this, 'checkMode'));
17
- this.checkMode(this.mq);
18
- };
14
+ MOJFrontend.FilterToggleButton.prototype.setupResponsiveChecks = function () {
15
+ this.mq = window.matchMedia(this.options.bigModeMediaQuery)
16
+ this.mq.addListener($.proxy(this, 'checkMode'))
17
+ this.checkMode(this.mq)
18
+ }
19
19
 
20
- MOJFrontend.FilterToggleButton.prototype.createToggleButton = function() {
21
- this.menuButton = $('<button class="govuk-button '+this.options.toggleButton.classes+'" type="button" aria-haspopup="true" aria-expanded="false">'+this.options.toggleButton.showText+'</button>');
22
- this.menuButton.on('click', $.proxy(this, 'onMenuButtonClick'));
23
- this.container.append(this.menuButton);
24
- };
20
+ MOJFrontend.FilterToggleButton.prototype.createToggleButton = function () {
21
+ this.menuButton = $(
22
+ `<button class="govuk-button ${this.options.toggleButton.classes}" type="button" aria-haspopup="true" aria-expanded="false">${this.options.toggleButton.showText}</button>`
23
+ )
24
+ this.menuButton.on('click', $.proxy(this, 'onMenuButtonClick'))
25
+ this.container.append(this.menuButton)
26
+ }
25
27
 
26
- MOJFrontend.FilterToggleButton.prototype.checkMode = function(mq) {
27
- if(mq.matches) {
28
- this.enableBigMode();
28
+ MOJFrontend.FilterToggleButton.prototype.checkMode = function (mq) {
29
+ if (mq.matches) {
30
+ this.enableBigMode()
29
31
  } else {
30
- this.enableSmallMode();
32
+ this.enableSmallMode()
31
33
  }
32
- };
34
+ }
33
35
 
34
- MOJFrontend.FilterToggleButton.prototype.enableBigMode = function() {
35
- this.showMenu();
36
- this.removeCloseButton();
37
- };
36
+ MOJFrontend.FilterToggleButton.prototype.enableBigMode = function () {
37
+ this.showMenu()
38
+ this.removeCloseButton()
39
+ }
38
40
 
39
- MOJFrontend.FilterToggleButton.prototype.enableSmallMode = function() {
40
- this.hideMenu();
41
- this.addCloseButton();
42
- };
41
+ MOJFrontend.FilterToggleButton.prototype.enableSmallMode = function () {
42
+ this.hideMenu()
43
+ this.addCloseButton()
44
+ }
43
45
 
44
- MOJFrontend.FilterToggleButton.prototype.addCloseButton = function() {
45
- if(this.options.closeButton) {
46
- this.closeButton = $('<button class="moj-filter__close" type="button">'+this.options.closeButton.text+'</button>');
47
- this.closeButton.on('click', $.proxy(this, 'onCloseClick'));
48
- $(this.options.closeButton.container).append(this.closeButton);
46
+ MOJFrontend.FilterToggleButton.prototype.addCloseButton = function () {
47
+ if (this.options.closeButton) {
48
+ this.closeButton = $(
49
+ `<button class="moj-filter__close" type="button">${this.options.closeButton.text}</button>`
50
+ )
51
+ this.closeButton.on('click', $.proxy(this, 'onCloseClick'))
52
+ $(this.options.closeButton.container).append(this.closeButton)
49
53
  }
50
- };
54
+ }
51
55
 
52
- MOJFrontend.FilterToggleButton.prototype.onCloseClick = function() {
53
- this.hideMenu();
54
- this.menuButton.focus();
55
- };
56
+ MOJFrontend.FilterToggleButton.prototype.onCloseClick = function () {
57
+ this.hideMenu()
58
+ this.menuButton.focus()
59
+ }
56
60
 
57
- MOJFrontend.FilterToggleButton.prototype.removeCloseButton = function() {
58
- if(this.closeButton) {
59
- this.closeButton.remove();
60
- this.closeButton = null;
61
+ MOJFrontend.FilterToggleButton.prototype.removeCloseButton = function () {
62
+ if (this.closeButton) {
63
+ this.closeButton.remove()
64
+ this.closeButton = null
61
65
  }
62
- };
66
+ }
63
67
 
64
- MOJFrontend.FilterToggleButton.prototype.hideMenu = function() {
65
- this.menuButton.attr('aria-expanded', 'false');
66
- this.filterContainer.addClass('moj-js-hidden');
67
- this.menuButton.text(this.options.toggleButton.showText);
68
- };
68
+ MOJFrontend.FilterToggleButton.prototype.hideMenu = function () {
69
+ this.menuButton.attr('aria-expanded', 'false')
70
+ this.filterContainer.addClass('moj-js-hidden')
71
+ this.menuButton.text(this.options.toggleButton.showText)
72
+ }
69
73
 
70
- MOJFrontend.FilterToggleButton.prototype.showMenu = function() {
71
- this.menuButton.attr('aria-expanded', 'true');
72
- this.filterContainer.removeClass('moj-js-hidden');
73
- this.menuButton.text(this.options.toggleButton.hideText);
74
- };
74
+ MOJFrontend.FilterToggleButton.prototype.showMenu = function () {
75
+ this.menuButton.attr('aria-expanded', 'true')
76
+ this.filterContainer.removeClass('moj-js-hidden')
77
+ this.menuButton.text(this.options.toggleButton.hideText)
78
+ }
75
79
 
76
- MOJFrontend.FilterToggleButton.prototype.onMenuButtonClick = function() {
77
- this.toggle();
78
- };
80
+ MOJFrontend.FilterToggleButton.prototype.onMenuButtonClick = function () {
81
+ this.toggle()
82
+ }
79
83
 
80
- MOJFrontend.FilterToggleButton.prototype.toggle = function() {
81
- if(this.menuButton.attr('aria-expanded') == 'false') {
82
- this.showMenu();
83
- this.filterContainer.get(0).focus();
84
+ MOJFrontend.FilterToggleButton.prototype.toggle = function () {
85
+ if (this.menuButton.attr('aria-expanded') === 'false') {
86
+ this.showMenu()
87
+ this.filterContainer.get(0).focus()
84
88
  } else {
85
- this.hideMenu();
89
+ this.hideMenu()
86
90
  }
87
- };
91
+ }