@govuk-one-login/frontend-ui 1.3.13 → 1.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.
- package/build/cjs/frontend/index.cjs +147 -4
- package/build/cjs/frontend/typescript/spinner.d.ts.map +1 -1
- package/build/cjs/frontend/utils/types.d.ts +62 -5
- package/build/cjs/frontend/utils/types.d.ts.map +1 -1
- package/build/components/bases/ipv-core/ipv-core-base.njk +11 -6
- package/build/components/bases/mobile/mobile-base.njk +4 -3
- package/build/esm/frontend/index.js +147 -4
- package/build/esm/frontend/typescript/spinner.d.ts.map +1 -1
- package/build/esm/frontend/utils/types.d.ts +62 -5
- package/build/esm/frontend/utils/types.d.ts.map +1 -1
- package/package.json +3 -2
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
const WaitInteractions = (() => {
|
|
4
|
+
var _a;
|
|
4
5
|
const content = {
|
|
5
6
|
initial: {
|
|
6
7
|
spinnerState: "pending",
|
|
@@ -8,20 +9,81 @@ const WaitInteractions = (() => {
|
|
|
8
9
|
complete: { spinnerState: "completed" },
|
|
9
10
|
};
|
|
10
11
|
const state = {
|
|
11
|
-
spinnerState: content.initial.spinnerState,
|
|
12
|
+
spinnerState: (_a = content === null || content === void 0 ? void 0 : content.initial) === null || _a === void 0 ? void 0 : _a.spinnerState,
|
|
12
13
|
done: false,
|
|
13
14
|
virtualDom: [],
|
|
15
|
+
abortController: null,
|
|
14
16
|
};
|
|
15
17
|
const timers = {};
|
|
18
|
+
let { container, ariaLiveContainer, domRequirementsMet, initTime, abortController, config, } = {
|
|
19
|
+
};
|
|
20
|
+
const handleAbort = () => {
|
|
21
|
+
abortController === null || abortController === void 0 ? void 0 : abortController.abort();
|
|
22
|
+
};
|
|
23
|
+
const initialiseAbortController = () => {
|
|
24
|
+
abortController = new AbortController();
|
|
25
|
+
window.removeEventListener("beforeunload", handleAbort);
|
|
26
|
+
window.addEventListener("beforeunload", handleAbort);
|
|
27
|
+
};
|
|
28
|
+
const updateAccordingToTimeElapsed = () => {
|
|
29
|
+
const now = Date.now();
|
|
30
|
+
const elapsedMilliseconds = now - initTime;
|
|
31
|
+
if (elapsedMilliseconds >= config.msBeforeAbort) {
|
|
32
|
+
reflectError();
|
|
33
|
+
}
|
|
34
|
+
else if ((elapsedMilliseconds >=
|
|
35
|
+
config.msBeforeInformingOfLongWait)) {
|
|
36
|
+
reflectLongWait();
|
|
37
|
+
}
|
|
38
|
+
};
|
|
16
39
|
const createVirtualDom = () => {
|
|
40
|
+
var _a, _b, _c, _d, _e, _f;
|
|
17
41
|
const initialState = [
|
|
42
|
+
{
|
|
43
|
+
nodeName: "h1",
|
|
44
|
+
text: state.heading,
|
|
45
|
+
classes: ["govuk-heading-l"],
|
|
46
|
+
},
|
|
18
47
|
{
|
|
19
48
|
nodeName: "div",
|
|
20
49
|
id: "spinner",
|
|
21
50
|
classes: ["spinner", "spinner__pending", "centre", state.spinnerState],
|
|
22
51
|
},
|
|
52
|
+
{
|
|
53
|
+
nodeName: "p",
|
|
54
|
+
text: state.spinnerStateText,
|
|
55
|
+
classes: ["centre", "spinner-state-text", "govuk-body"],
|
|
56
|
+
},
|
|
57
|
+
{
|
|
58
|
+
nodeName: "button",
|
|
59
|
+
text: (_a = content === null || content === void 0 ? void 0 : content.continueButton) === null || _a === void 0 ? void 0 : _a.text,
|
|
60
|
+
buttonDisabled: state.buttonDisabled,
|
|
61
|
+
classes: ["govuk-button", "govuk-!-margin-top-4"],
|
|
62
|
+
},
|
|
23
63
|
];
|
|
24
|
-
|
|
64
|
+
const domErrorState = [
|
|
65
|
+
{
|
|
66
|
+
nodeName: "h1",
|
|
67
|
+
text: state.heading,
|
|
68
|
+
classes: ["govuk-heading-l"],
|
|
69
|
+
},
|
|
70
|
+
{
|
|
71
|
+
nodeName: "p",
|
|
72
|
+
text: state.messageText,
|
|
73
|
+
classes: ["govuk-body"],
|
|
74
|
+
},
|
|
75
|
+
{
|
|
76
|
+
nodeName: "h2",
|
|
77
|
+
text: (_b = content === null || content === void 0 ? void 0 : content.error) === null || _b === void 0 ? void 0 : _b.whatYouCanDo.heading,
|
|
78
|
+
classes: ["govuk-heading-m"],
|
|
79
|
+
},
|
|
80
|
+
{
|
|
81
|
+
nodeName: "p",
|
|
82
|
+
innerHTML: `${(_c = content === null || content === void 0 ? void 0 : content.error) === null || _c === void 0 ? void 0 : _c.whatYouCanDo.message.text1}<a href="${(_d = content === null || content === void 0 ? void 0 : content.error) === null || _d === void 0 ? void 0 : _d.whatYouCanDo.message.link.href}">${(_e = content === null || content === void 0 ? void 0 : content.error) === null || _e === void 0 ? void 0 : _e.whatYouCanDo.message.link.text}</a>${(_f = content === null || content === void 0 ? void 0 : content.error) === null || _f === void 0 ? void 0 : _f.whatYouCanDo.message.text2}`,
|
|
83
|
+
classes: ["govuk-body"],
|
|
84
|
+
},
|
|
85
|
+
];
|
|
86
|
+
return state.error ? domErrorState : initialState;
|
|
25
87
|
};
|
|
26
88
|
const vDomHasChanged = (currentVDom, nextVDom) => {
|
|
27
89
|
return JSON.stringify(currentVDom) !== JSON.stringify(nextVDom);
|
|
@@ -31,6 +93,7 @@ const WaitInteractions = (() => {
|
|
|
31
93
|
const vDomChanged = vDomHasChanged(state.virtualDom, createVirtualDom());
|
|
32
94
|
const container = document.getElementById("spinner-container");
|
|
33
95
|
if (vDomChanged) {
|
|
96
|
+
document.title = state.heading;
|
|
34
97
|
state.virtualDom = createVirtualDom();
|
|
35
98
|
const elements = (_a = state === null || state === void 0 ? void 0 : state.virtualDom) === null || _a === void 0 ? void 0 : _a.map(convert);
|
|
36
99
|
container === null || container === void 0 ? void 0 : container.replaceChildren(...elements);
|
|
@@ -41,16 +104,35 @@ const WaitInteractions = (() => {
|
|
|
41
104
|
if (state.done) {
|
|
42
105
|
clearInterval(timers.updateDomTimer);
|
|
43
106
|
}
|
|
107
|
+
if (state.ariaButtonEnabledMessage !== "") {
|
|
108
|
+
updateAriaAlert(config === null || config === void 0 ? void 0 : config.ariaButtonEnabledMessage);
|
|
109
|
+
}
|
|
44
110
|
};
|
|
45
111
|
const reflectCompletion = () => {
|
|
112
|
+
var _a, _b;
|
|
46
113
|
state.spinnerState = "spinner__ready";
|
|
47
|
-
state.spinnerStateText = content.complete.spinnerState;
|
|
114
|
+
state.spinnerStateText = (_a = content === null || content === void 0 ? void 0 : content.complete) === null || _a === void 0 ? void 0 : _a.spinnerState;
|
|
115
|
+
state.buttonDisabled = false;
|
|
116
|
+
state.ariaButtonEnabledMessage =
|
|
117
|
+
(_b = content === null || content === void 0 ? void 0 : content.complete) === null || _b === void 0 ? void 0 : _b.ariaButtonEnabledMessage;
|
|
48
118
|
state.done = true;
|
|
119
|
+
sessionStorage.removeItem("spinnerInitTime");
|
|
49
120
|
};
|
|
50
121
|
const reflectError = () => {
|
|
122
|
+
var _a, _b, _c;
|
|
123
|
+
state.heading = (_a = content === null || content === void 0 ? void 0 : content.error) === null || _a === void 0 ? void 0 : _a.heading;
|
|
124
|
+
state.messageText = (_b = content === null || content === void 0 ? void 0 : content.error) === null || _b === void 0 ? void 0 : _b.messageText;
|
|
51
125
|
state.spinnerState = "spinner__failed";
|
|
52
126
|
state.done = true;
|
|
53
127
|
state.error = true;
|
|
128
|
+
sessionStorage.removeItem("spinnerInitTime");
|
|
129
|
+
(_c = state === null || state === void 0 ? void 0 : state.abortController) === null || _c === void 0 ? void 0 : _c.abort();
|
|
130
|
+
};
|
|
131
|
+
const reflectLongWait = () => {
|
|
132
|
+
var _a;
|
|
133
|
+
if (state.spinnerState !== "ready") {
|
|
134
|
+
state.spinnerStateText = (_a = content === null || content === void 0 ? void 0 : content.longWait) === null || _a === void 0 ? void 0 : _a.spinnerStateText;
|
|
135
|
+
}
|
|
54
136
|
};
|
|
55
137
|
const convert = (node) => {
|
|
56
138
|
const el = document.createElement(node.nodeName);
|
|
@@ -62,20 +144,46 @@ const WaitInteractions = (() => {
|
|
|
62
144
|
el.id = node.id;
|
|
63
145
|
if (node.classes)
|
|
64
146
|
el.classList.add(...node.classes);
|
|
147
|
+
if (node.buttonDisabled)
|
|
148
|
+
el.setAttribute("disabled", node.buttonDisabled);
|
|
65
149
|
return el;
|
|
66
150
|
};
|
|
151
|
+
const updateAriaAlert = (messageText) => {
|
|
152
|
+
while (ariaLiveContainer === null || ariaLiveContainer === void 0 ? void 0 : ariaLiveContainer.firstChild) {
|
|
153
|
+
ariaLiveContainer.removeChild(ariaLiveContainer.firstChild);
|
|
154
|
+
}
|
|
155
|
+
/* Create new message and append it to the live region */
|
|
156
|
+
const messageNode = document.createTextNode(messageText);
|
|
157
|
+
ariaLiveContainer === null || ariaLiveContainer === void 0 ? void 0 : ariaLiveContainer.appendChild(messageNode);
|
|
158
|
+
};
|
|
67
159
|
const notInErrorOrDoneState = () => {
|
|
68
160
|
return !(state.done || state.error);
|
|
69
161
|
};
|
|
70
162
|
const requestIDProcessingStatus = async () => {
|
|
71
163
|
var _a;
|
|
164
|
+
const signal = abortController.signal;
|
|
72
165
|
const apiRoute = (_a = document === null || document === void 0 ? void 0 : document.getElementById("spinner-container")) === null || _a === void 0 ? void 0 : _a.dataset.apiRoute;
|
|
73
166
|
try {
|
|
74
|
-
const response = await fetch(apiRoute);
|
|
167
|
+
const response = await fetch(apiRoute, { signal });
|
|
75
168
|
if (response.status !== 200) {
|
|
76
169
|
throw new Error(`Status code ${response.status} received`);
|
|
77
170
|
}
|
|
78
171
|
const data = await response.json();
|
|
172
|
+
if (data.status === "COMPLETED" ||
|
|
173
|
+
data.status === "INTERVENTION") {
|
|
174
|
+
reflectCompletion();
|
|
175
|
+
}
|
|
176
|
+
else if (data.status === "ERROR") {
|
|
177
|
+
reflectError();
|
|
178
|
+
}
|
|
179
|
+
else if (notInErrorOrDoneState()) {
|
|
180
|
+
setTimeout(async () => {
|
|
181
|
+
if (Date.now() - initTime >= config.msBeforeAbort) {
|
|
182
|
+
return;
|
|
183
|
+
}
|
|
184
|
+
await requestIDProcessingStatus();
|
|
185
|
+
}, config.msBetweenRequests);
|
|
186
|
+
}
|
|
79
187
|
if (data.status === "Clear to proceed") {
|
|
80
188
|
reflectCompletion();
|
|
81
189
|
}
|
|
@@ -88,8 +196,36 @@ const WaitInteractions = (() => {
|
|
|
88
196
|
catch (e) {
|
|
89
197
|
console.log(e);
|
|
90
198
|
reflectError();
|
|
199
|
+
if (e.name !== "AbortError") {
|
|
200
|
+
console.error("Error in requestIdProcessingStatus:", e);
|
|
201
|
+
reflectError();
|
|
202
|
+
}
|
|
91
203
|
}
|
|
92
204
|
};
|
|
205
|
+
const initTimer = () => {
|
|
206
|
+
let spinnerInitTime = sessionStorage.getItem("spinnerInitTime");
|
|
207
|
+
if (spinnerInitTime === null) {
|
|
208
|
+
spinnerInitTime = Date.now();
|
|
209
|
+
sessionStorage.setItem("spinnerInitTime", spinnerInitTime.toString());
|
|
210
|
+
}
|
|
211
|
+
else {
|
|
212
|
+
spinnerInitTime = parseInt(spinnerInitTime, 10);
|
|
213
|
+
}
|
|
214
|
+
initTime = spinnerInitTime;
|
|
215
|
+
updateAccordingToTimeElapsed();
|
|
216
|
+
setInterval(() => {
|
|
217
|
+
updateAccordingToTimeElapsed();
|
|
218
|
+
updateDom();
|
|
219
|
+
}, config === null || config === void 0 ? void 0 : config.msBetweenDomUpdate);
|
|
220
|
+
};
|
|
221
|
+
const initialiseContainers = () => {
|
|
222
|
+
const spinnerContainer = document.createElement("div");
|
|
223
|
+
const ariaLiveContainer = document.createElement("div");
|
|
224
|
+
ariaLiveContainer.setAttribute("aria-live", "assertive");
|
|
225
|
+
ariaLiveContainer.classList.add("govuk-visually-hidden");
|
|
226
|
+
ariaLiveContainer.appendChild(document.createTextNode(""));
|
|
227
|
+
container === null || container === void 0 ? void 0 : container.replaceChildren(spinnerContainer, ariaLiveContainer);
|
|
228
|
+
};
|
|
93
229
|
return {
|
|
94
230
|
state: state,
|
|
95
231
|
init: () => {
|
|
@@ -101,6 +237,13 @@ const WaitInteractions = (() => {
|
|
|
101
237
|
requestIDProcessingStatus().then(() => {
|
|
102
238
|
updateDom();
|
|
103
239
|
});
|
|
240
|
+
if (domRequirementsMet) {
|
|
241
|
+
initTimer();
|
|
242
|
+
initialiseContainers();
|
|
243
|
+
initialiseAbortController();
|
|
244
|
+
updateDom();
|
|
245
|
+
requestIDProcessingStatus();
|
|
246
|
+
}
|
|
104
247
|
},
|
|
105
248
|
};
|
|
106
249
|
})();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../../frontend-src/typescript/spinner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../../frontend-src/typescript/spinner.ts"],"names":[],"mappings":"AAGA,OAAO,EAOL,KAAK,EAEN,MAAM,gBAAgB,CAAC;AAExB,eAAO,MAAM,gBAAgB;;;CA+RzB,CAAC"}
|
|
@@ -2,6 +2,7 @@ export interface virtualDom {
|
|
|
2
2
|
nodeName?: string;
|
|
3
3
|
id?: string;
|
|
4
4
|
classes?: string[];
|
|
5
|
+
text?: string;
|
|
5
6
|
}
|
|
6
7
|
export type error = {
|
|
7
8
|
spinnerState: string;
|
|
@@ -10,21 +11,49 @@ export type error = {
|
|
|
10
11
|
state: {
|
|
11
12
|
error: boolean;
|
|
12
13
|
};
|
|
14
|
+
name: string;
|
|
13
15
|
};
|
|
14
16
|
export type apiRoute = RequestInfo | URL;
|
|
15
17
|
export type content = {
|
|
16
|
-
|
|
18
|
+
longWait?: {
|
|
19
|
+
spinnerStateText: string;
|
|
20
|
+
};
|
|
21
|
+
initial?: {
|
|
17
22
|
spinnerState: string | virtualDom;
|
|
18
23
|
};
|
|
19
|
-
complete
|
|
24
|
+
complete?: {
|
|
20
25
|
spinnerState: string;
|
|
26
|
+
ariaButtonEnabledMessage?: string;
|
|
27
|
+
};
|
|
28
|
+
continueButton?: {
|
|
29
|
+
text: string;
|
|
30
|
+
};
|
|
31
|
+
error?: {
|
|
32
|
+
heading?: string;
|
|
33
|
+
messageText?: string;
|
|
34
|
+
whatYouCanDo: {
|
|
35
|
+
heading: string;
|
|
36
|
+
message: {
|
|
37
|
+
text1: string;
|
|
38
|
+
link: {
|
|
39
|
+
href: string;
|
|
40
|
+
text: string;
|
|
41
|
+
};
|
|
42
|
+
text2: string;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
21
45
|
};
|
|
22
46
|
};
|
|
23
47
|
export type timers = {
|
|
24
48
|
updateDomTimer?: unknown | number;
|
|
25
49
|
abortUnresponsiveRequest?: unknown | number;
|
|
50
|
+
abort?: unknown | never;
|
|
26
51
|
};
|
|
27
52
|
export type state = {
|
|
53
|
+
abortController: null | {
|
|
54
|
+
abort: any;
|
|
55
|
+
};
|
|
56
|
+
abort?: unknown;
|
|
28
57
|
error?: boolean | error;
|
|
29
58
|
spinnerState?: string;
|
|
30
59
|
done?: boolean;
|
|
@@ -33,6 +62,10 @@ export type state = {
|
|
|
33
62
|
timers: timers;
|
|
34
63
|
};
|
|
35
64
|
spinnerStateText?: string;
|
|
65
|
+
buttonDisabled?: boolean;
|
|
66
|
+
heading?: object | string | undefined;
|
|
67
|
+
messageText?: string;
|
|
68
|
+
ariaButtonEnabledMessage?: string;
|
|
36
69
|
};
|
|
37
70
|
export type node = {
|
|
38
71
|
text: object;
|
|
@@ -42,10 +75,34 @@ export type node = {
|
|
|
42
75
|
nodeName: keyof HTMLElementTagNameMap;
|
|
43
76
|
textContent: unknown | HTMLElement | string;
|
|
44
77
|
el: unknown | HTMLElement | string;
|
|
78
|
+
buttonDisabled: boolean | string;
|
|
45
79
|
};
|
|
46
80
|
export type initialState = {
|
|
47
|
-
nodeName
|
|
48
|
-
id
|
|
49
|
-
classes
|
|
81
|
+
nodeName?: string;
|
|
82
|
+
id?: string;
|
|
83
|
+
classes?: (string | undefined)[];
|
|
84
|
+
text?: object | string;
|
|
85
|
+
buttonDisabled?: state;
|
|
50
86
|
}[];
|
|
87
|
+
export type spinnerInitial = {
|
|
88
|
+
container?: HTMLElement;
|
|
89
|
+
apiUrl?: string;
|
|
90
|
+
msBeforeInformingOfLongWait?: number;
|
|
91
|
+
msBeforeAbort?: number;
|
|
92
|
+
msBetweenRequests?: number;
|
|
93
|
+
msBeforeDomUpdate?: number;
|
|
94
|
+
ariaLiveContainer?: HTMLElement;
|
|
95
|
+
domRequirementsMet?: boolean;
|
|
96
|
+
initTime?: number | undefined;
|
|
97
|
+
updateDomTimer?: number | undefined | any;
|
|
98
|
+
abortController?: any | object;
|
|
99
|
+
config?: {
|
|
100
|
+
msBeforeAbort: number;
|
|
101
|
+
msBeforeInformingOfLongWait: number;
|
|
102
|
+
msBetweenRequests: number;
|
|
103
|
+
ariaButtonEnabledMessage: string;
|
|
104
|
+
msBetweenDomUpdate: number;
|
|
105
|
+
};
|
|
106
|
+
msBetweenDomUpdate?: number;
|
|
107
|
+
};
|
|
51
108
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../frontend-src/utils/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../frontend-src/utils/types.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,15 +2,17 @@
|
|
|
2
2
|
{% set govukRebrand = true %}
|
|
3
3
|
{% endif %}
|
|
4
4
|
|
|
5
|
+
{% set isPageDataSensitive = false %}
|
|
6
|
+
|
|
5
7
|
{% extends "govuk/template.njk" %}
|
|
6
8
|
{% from "frontend-ui/build/components/cookie-banner/macro.njk" import frontendUiCookieBanner %}
|
|
7
9
|
{% from "frontend-ui/build/components/phase-banner/macro.njk" import frontendUiPhaseBanner %}
|
|
8
10
|
{% from "frontend-ui/build/components/header/macro.njk" import frontendUiHeader %}
|
|
9
11
|
{% from "frontend-ui/build/components/footer/macro.njk" import frontendUiFooter %}
|
|
10
12
|
{% from "frontend-ui/build/components/language-select/macro.njk" import frontendUiLanguageSelect %}
|
|
13
|
+
{% from "frontend-analytics/components/ga4-opl/macro.njk" import frontendAnalyticsGa4OnPageLoad %}
|
|
11
14
|
{% from "govuk/components/back-link/macro.njk" import govukBackLink %}
|
|
12
15
|
{% from "govuk/components/error-summary/macro.njk" import govukErrorSummary %}
|
|
13
|
-
{% from basePath ~ "/views/shared/ga4/on-page-load-macro.njk" import ga4OnPageLoad %}
|
|
14
16
|
{% from "govuk/components/notification-banner/macro.njk" import govukNotificationBanner %}
|
|
15
17
|
|
|
16
18
|
{# Set language values for govuk/template.njk #}
|
|
@@ -88,7 +90,8 @@
|
|
|
88
90
|
{% if (displayBanner) %}
|
|
89
91
|
{{ govukNotificationBanner({
|
|
90
92
|
html: bannerMessage,
|
|
91
|
-
type: bannerType
|
|
93
|
+
type: bannerType,
|
|
94
|
+
titleText: bannerTitleText
|
|
92
95
|
}) }}
|
|
93
96
|
{% endif %}
|
|
94
97
|
|
|
@@ -141,14 +144,16 @@
|
|
|
141
144
|
ga4ContainerId: "{{ ga4ContainerId }}",
|
|
142
145
|
uaContainerId: "{{ uaContainerId }}"
|
|
143
146
|
}, {
|
|
147
|
+
isDataSensitive: false,
|
|
148
|
+
isPageDataSensitive: {{ isPageDataSensitive }},
|
|
144
149
|
enableGa4Tracking: {{isGa4Enabled}},
|
|
145
150
|
enableUaTracking: {{isUaEnabled}},
|
|
146
151
|
cookieDomain: "{{analyticsCookieDomain}}"
|
|
147
152
|
});
|
|
148
153
|
</script>
|
|
149
|
-
{{
|
|
150
|
-
|
|
151
|
-
|
|
154
|
+
{{ frontendAnalyticsGa4OnPageLoad({
|
|
155
|
+
nonce: cspNonce,
|
|
156
|
+
dynamic: isPageDynamic,
|
|
152
157
|
englishPageTitle: pageTitleKey | translateToEnglish }) }}
|
|
153
158
|
|
|
154
|
-
{% endblock %}
|
|
159
|
+
{% endblock %}
|
|
@@ -84,7 +84,8 @@
|
|
|
84
84
|
{% if (displayBanner) %}
|
|
85
85
|
{{ govukNotificationBanner({
|
|
86
86
|
html: bannerMessage,
|
|
87
|
-
type: bannerType
|
|
87
|
+
type: bannerType,
|
|
88
|
+
titleText: bannerTitleText
|
|
88
89
|
}) }}
|
|
89
90
|
{% endif %}
|
|
90
91
|
{% block content %}{% endblock %}
|
|
@@ -157,7 +158,7 @@
|
|
|
157
158
|
});
|
|
158
159
|
</script>
|
|
159
160
|
<script type="text/javascript" nonce='{{scriptNonce}}'>
|
|
160
|
-
if (document.getElementById('back-button'))
|
|
161
|
+
if (document.getElementById('back-button'))
|
|
161
162
|
document
|
|
162
163
|
.getElementById('back-button')
|
|
163
164
|
.addEventListener('click', (e) => {
|
|
@@ -172,4 +173,4 @@
|
|
|
172
173
|
import {setFingerprintCookie} from "/public/scripts/index.js";
|
|
173
174
|
await setFingerprintCookie("{{analyticsCookieDomain}}");
|
|
174
175
|
</script>
|
|
175
|
-
{% endblock %}
|
|
176
|
+
{% endblock %}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
const WaitInteractions = (() => {
|
|
2
|
+
var _a;
|
|
2
3
|
const content = {
|
|
3
4
|
initial: {
|
|
4
5
|
spinnerState: "pending",
|
|
@@ -6,20 +7,81 @@ const WaitInteractions = (() => {
|
|
|
6
7
|
complete: { spinnerState: "completed" },
|
|
7
8
|
};
|
|
8
9
|
const state = {
|
|
9
|
-
spinnerState: content.initial.spinnerState,
|
|
10
|
+
spinnerState: (_a = content === null || content === void 0 ? void 0 : content.initial) === null || _a === void 0 ? void 0 : _a.spinnerState,
|
|
10
11
|
done: false,
|
|
11
12
|
virtualDom: [],
|
|
13
|
+
abortController: null,
|
|
12
14
|
};
|
|
13
15
|
const timers = {};
|
|
16
|
+
let { container, ariaLiveContainer, domRequirementsMet, initTime, abortController, config, } = {
|
|
17
|
+
};
|
|
18
|
+
const handleAbort = () => {
|
|
19
|
+
abortController === null || abortController === void 0 ? void 0 : abortController.abort();
|
|
20
|
+
};
|
|
21
|
+
const initialiseAbortController = () => {
|
|
22
|
+
abortController = new AbortController();
|
|
23
|
+
window.removeEventListener("beforeunload", handleAbort);
|
|
24
|
+
window.addEventListener("beforeunload", handleAbort);
|
|
25
|
+
};
|
|
26
|
+
const updateAccordingToTimeElapsed = () => {
|
|
27
|
+
const now = Date.now();
|
|
28
|
+
const elapsedMilliseconds = now - initTime;
|
|
29
|
+
if (elapsedMilliseconds >= config.msBeforeAbort) {
|
|
30
|
+
reflectError();
|
|
31
|
+
}
|
|
32
|
+
else if ((elapsedMilliseconds >=
|
|
33
|
+
config.msBeforeInformingOfLongWait)) {
|
|
34
|
+
reflectLongWait();
|
|
35
|
+
}
|
|
36
|
+
};
|
|
14
37
|
const createVirtualDom = () => {
|
|
38
|
+
var _a, _b, _c, _d, _e, _f;
|
|
15
39
|
const initialState = [
|
|
40
|
+
{
|
|
41
|
+
nodeName: "h1",
|
|
42
|
+
text: state.heading,
|
|
43
|
+
classes: ["govuk-heading-l"],
|
|
44
|
+
},
|
|
16
45
|
{
|
|
17
46
|
nodeName: "div",
|
|
18
47
|
id: "spinner",
|
|
19
48
|
classes: ["spinner", "spinner__pending", "centre", state.spinnerState],
|
|
20
49
|
},
|
|
50
|
+
{
|
|
51
|
+
nodeName: "p",
|
|
52
|
+
text: state.spinnerStateText,
|
|
53
|
+
classes: ["centre", "spinner-state-text", "govuk-body"],
|
|
54
|
+
},
|
|
55
|
+
{
|
|
56
|
+
nodeName: "button",
|
|
57
|
+
text: (_a = content === null || content === void 0 ? void 0 : content.continueButton) === null || _a === void 0 ? void 0 : _a.text,
|
|
58
|
+
buttonDisabled: state.buttonDisabled,
|
|
59
|
+
classes: ["govuk-button", "govuk-!-margin-top-4"],
|
|
60
|
+
},
|
|
21
61
|
];
|
|
22
|
-
|
|
62
|
+
const domErrorState = [
|
|
63
|
+
{
|
|
64
|
+
nodeName: "h1",
|
|
65
|
+
text: state.heading,
|
|
66
|
+
classes: ["govuk-heading-l"],
|
|
67
|
+
},
|
|
68
|
+
{
|
|
69
|
+
nodeName: "p",
|
|
70
|
+
text: state.messageText,
|
|
71
|
+
classes: ["govuk-body"],
|
|
72
|
+
},
|
|
73
|
+
{
|
|
74
|
+
nodeName: "h2",
|
|
75
|
+
text: (_b = content === null || content === void 0 ? void 0 : content.error) === null || _b === void 0 ? void 0 : _b.whatYouCanDo.heading,
|
|
76
|
+
classes: ["govuk-heading-m"],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
nodeName: "p",
|
|
80
|
+
innerHTML: `${(_c = content === null || content === void 0 ? void 0 : content.error) === null || _c === void 0 ? void 0 : _c.whatYouCanDo.message.text1}<a href="${(_d = content === null || content === void 0 ? void 0 : content.error) === null || _d === void 0 ? void 0 : _d.whatYouCanDo.message.link.href}">${(_e = content === null || content === void 0 ? void 0 : content.error) === null || _e === void 0 ? void 0 : _e.whatYouCanDo.message.link.text}</a>${(_f = content === null || content === void 0 ? void 0 : content.error) === null || _f === void 0 ? void 0 : _f.whatYouCanDo.message.text2}`,
|
|
81
|
+
classes: ["govuk-body"],
|
|
82
|
+
},
|
|
83
|
+
];
|
|
84
|
+
return state.error ? domErrorState : initialState;
|
|
23
85
|
};
|
|
24
86
|
const vDomHasChanged = (currentVDom, nextVDom) => {
|
|
25
87
|
return JSON.stringify(currentVDom) !== JSON.stringify(nextVDom);
|
|
@@ -29,6 +91,7 @@ const WaitInteractions = (() => {
|
|
|
29
91
|
const vDomChanged = vDomHasChanged(state.virtualDom, createVirtualDom());
|
|
30
92
|
const container = document.getElementById("spinner-container");
|
|
31
93
|
if (vDomChanged) {
|
|
94
|
+
document.title = state.heading;
|
|
32
95
|
state.virtualDom = createVirtualDom();
|
|
33
96
|
const elements = (_a = state === null || state === void 0 ? void 0 : state.virtualDom) === null || _a === void 0 ? void 0 : _a.map(convert);
|
|
34
97
|
container === null || container === void 0 ? void 0 : container.replaceChildren(...elements);
|
|
@@ -39,16 +102,35 @@ const WaitInteractions = (() => {
|
|
|
39
102
|
if (state.done) {
|
|
40
103
|
clearInterval(timers.updateDomTimer);
|
|
41
104
|
}
|
|
105
|
+
if (state.ariaButtonEnabledMessage !== "") {
|
|
106
|
+
updateAriaAlert(config === null || config === void 0 ? void 0 : config.ariaButtonEnabledMessage);
|
|
107
|
+
}
|
|
42
108
|
};
|
|
43
109
|
const reflectCompletion = () => {
|
|
110
|
+
var _a, _b;
|
|
44
111
|
state.spinnerState = "spinner__ready";
|
|
45
|
-
state.spinnerStateText = content.complete.spinnerState;
|
|
112
|
+
state.spinnerStateText = (_a = content === null || content === void 0 ? void 0 : content.complete) === null || _a === void 0 ? void 0 : _a.spinnerState;
|
|
113
|
+
state.buttonDisabled = false;
|
|
114
|
+
state.ariaButtonEnabledMessage =
|
|
115
|
+
(_b = content === null || content === void 0 ? void 0 : content.complete) === null || _b === void 0 ? void 0 : _b.ariaButtonEnabledMessage;
|
|
46
116
|
state.done = true;
|
|
117
|
+
sessionStorage.removeItem("spinnerInitTime");
|
|
47
118
|
};
|
|
48
119
|
const reflectError = () => {
|
|
120
|
+
var _a, _b, _c;
|
|
121
|
+
state.heading = (_a = content === null || content === void 0 ? void 0 : content.error) === null || _a === void 0 ? void 0 : _a.heading;
|
|
122
|
+
state.messageText = (_b = content === null || content === void 0 ? void 0 : content.error) === null || _b === void 0 ? void 0 : _b.messageText;
|
|
49
123
|
state.spinnerState = "spinner__failed";
|
|
50
124
|
state.done = true;
|
|
51
125
|
state.error = true;
|
|
126
|
+
sessionStorage.removeItem("spinnerInitTime");
|
|
127
|
+
(_c = state === null || state === void 0 ? void 0 : state.abortController) === null || _c === void 0 ? void 0 : _c.abort();
|
|
128
|
+
};
|
|
129
|
+
const reflectLongWait = () => {
|
|
130
|
+
var _a;
|
|
131
|
+
if (state.spinnerState !== "ready") {
|
|
132
|
+
state.spinnerStateText = (_a = content === null || content === void 0 ? void 0 : content.longWait) === null || _a === void 0 ? void 0 : _a.spinnerStateText;
|
|
133
|
+
}
|
|
52
134
|
};
|
|
53
135
|
const convert = (node) => {
|
|
54
136
|
const el = document.createElement(node.nodeName);
|
|
@@ -60,20 +142,46 @@ const WaitInteractions = (() => {
|
|
|
60
142
|
el.id = node.id;
|
|
61
143
|
if (node.classes)
|
|
62
144
|
el.classList.add(...node.classes);
|
|
145
|
+
if (node.buttonDisabled)
|
|
146
|
+
el.setAttribute("disabled", node.buttonDisabled);
|
|
63
147
|
return el;
|
|
64
148
|
};
|
|
149
|
+
const updateAriaAlert = (messageText) => {
|
|
150
|
+
while (ariaLiveContainer === null || ariaLiveContainer === void 0 ? void 0 : ariaLiveContainer.firstChild) {
|
|
151
|
+
ariaLiveContainer.removeChild(ariaLiveContainer.firstChild);
|
|
152
|
+
}
|
|
153
|
+
/* Create new message and append it to the live region */
|
|
154
|
+
const messageNode = document.createTextNode(messageText);
|
|
155
|
+
ariaLiveContainer === null || ariaLiveContainer === void 0 ? void 0 : ariaLiveContainer.appendChild(messageNode);
|
|
156
|
+
};
|
|
65
157
|
const notInErrorOrDoneState = () => {
|
|
66
158
|
return !(state.done || state.error);
|
|
67
159
|
};
|
|
68
160
|
const requestIDProcessingStatus = async () => {
|
|
69
161
|
var _a;
|
|
162
|
+
const signal = abortController.signal;
|
|
70
163
|
const apiRoute = (_a = document === null || document === void 0 ? void 0 : document.getElementById("spinner-container")) === null || _a === void 0 ? void 0 : _a.dataset.apiRoute;
|
|
71
164
|
try {
|
|
72
|
-
const response = await fetch(apiRoute);
|
|
165
|
+
const response = await fetch(apiRoute, { signal });
|
|
73
166
|
if (response.status !== 200) {
|
|
74
167
|
throw new Error(`Status code ${response.status} received`);
|
|
75
168
|
}
|
|
76
169
|
const data = await response.json();
|
|
170
|
+
if (data.status === "COMPLETED" ||
|
|
171
|
+
data.status === "INTERVENTION") {
|
|
172
|
+
reflectCompletion();
|
|
173
|
+
}
|
|
174
|
+
else if (data.status === "ERROR") {
|
|
175
|
+
reflectError();
|
|
176
|
+
}
|
|
177
|
+
else if (notInErrorOrDoneState()) {
|
|
178
|
+
setTimeout(async () => {
|
|
179
|
+
if (Date.now() - initTime >= config.msBeforeAbort) {
|
|
180
|
+
return;
|
|
181
|
+
}
|
|
182
|
+
await requestIDProcessingStatus();
|
|
183
|
+
}, config.msBetweenRequests);
|
|
184
|
+
}
|
|
77
185
|
if (data.status === "Clear to proceed") {
|
|
78
186
|
reflectCompletion();
|
|
79
187
|
}
|
|
@@ -86,8 +194,36 @@ const WaitInteractions = (() => {
|
|
|
86
194
|
catch (e) {
|
|
87
195
|
console.log(e);
|
|
88
196
|
reflectError();
|
|
197
|
+
if (e.name !== "AbortError") {
|
|
198
|
+
console.error("Error in requestIdProcessingStatus:", e);
|
|
199
|
+
reflectError();
|
|
200
|
+
}
|
|
89
201
|
}
|
|
90
202
|
};
|
|
203
|
+
const initTimer = () => {
|
|
204
|
+
let spinnerInitTime = sessionStorage.getItem("spinnerInitTime");
|
|
205
|
+
if (spinnerInitTime === null) {
|
|
206
|
+
spinnerInitTime = Date.now();
|
|
207
|
+
sessionStorage.setItem("spinnerInitTime", spinnerInitTime.toString());
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
spinnerInitTime = parseInt(spinnerInitTime, 10);
|
|
211
|
+
}
|
|
212
|
+
initTime = spinnerInitTime;
|
|
213
|
+
updateAccordingToTimeElapsed();
|
|
214
|
+
setInterval(() => {
|
|
215
|
+
updateAccordingToTimeElapsed();
|
|
216
|
+
updateDom();
|
|
217
|
+
}, config === null || config === void 0 ? void 0 : config.msBetweenDomUpdate);
|
|
218
|
+
};
|
|
219
|
+
const initialiseContainers = () => {
|
|
220
|
+
const spinnerContainer = document.createElement("div");
|
|
221
|
+
const ariaLiveContainer = document.createElement("div");
|
|
222
|
+
ariaLiveContainer.setAttribute("aria-live", "assertive");
|
|
223
|
+
ariaLiveContainer.classList.add("govuk-visually-hidden");
|
|
224
|
+
ariaLiveContainer.appendChild(document.createTextNode(""));
|
|
225
|
+
container === null || container === void 0 ? void 0 : container.replaceChildren(spinnerContainer, ariaLiveContainer);
|
|
226
|
+
};
|
|
91
227
|
return {
|
|
92
228
|
state: state,
|
|
93
229
|
init: () => {
|
|
@@ -99,6 +235,13 @@ const WaitInteractions = (() => {
|
|
|
99
235
|
requestIDProcessingStatus().then(() => {
|
|
100
236
|
updateDom();
|
|
101
237
|
});
|
|
238
|
+
if (domRequirementsMet) {
|
|
239
|
+
initTimer();
|
|
240
|
+
initialiseContainers();
|
|
241
|
+
initialiseAbortController();
|
|
242
|
+
updateDom();
|
|
243
|
+
requestIDProcessingStatus();
|
|
244
|
+
}
|
|
102
245
|
},
|
|
103
246
|
};
|
|
104
247
|
})();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../../frontend-src/typescript/spinner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../../../../frontend-src/typescript/spinner.ts"],"names":[],"mappings":"AAGA,OAAO,EAOL,KAAK,EAEN,MAAM,gBAAgB,CAAC;AAExB,eAAO,MAAM,gBAAgB;;;CA+RzB,CAAC"}
|
|
@@ -2,6 +2,7 @@ export interface virtualDom {
|
|
|
2
2
|
nodeName?: string;
|
|
3
3
|
id?: string;
|
|
4
4
|
classes?: string[];
|
|
5
|
+
text?: string;
|
|
5
6
|
}
|
|
6
7
|
export type error = {
|
|
7
8
|
spinnerState: string;
|
|
@@ -10,21 +11,49 @@ export type error = {
|
|
|
10
11
|
state: {
|
|
11
12
|
error: boolean;
|
|
12
13
|
};
|
|
14
|
+
name: string;
|
|
13
15
|
};
|
|
14
16
|
export type apiRoute = RequestInfo | URL;
|
|
15
17
|
export type content = {
|
|
16
|
-
|
|
18
|
+
longWait?: {
|
|
19
|
+
spinnerStateText: string;
|
|
20
|
+
};
|
|
21
|
+
initial?: {
|
|
17
22
|
spinnerState: string | virtualDom;
|
|
18
23
|
};
|
|
19
|
-
complete
|
|
24
|
+
complete?: {
|
|
20
25
|
spinnerState: string;
|
|
26
|
+
ariaButtonEnabledMessage?: string;
|
|
27
|
+
};
|
|
28
|
+
continueButton?: {
|
|
29
|
+
text: string;
|
|
30
|
+
};
|
|
31
|
+
error?: {
|
|
32
|
+
heading?: string;
|
|
33
|
+
messageText?: string;
|
|
34
|
+
whatYouCanDo: {
|
|
35
|
+
heading: string;
|
|
36
|
+
message: {
|
|
37
|
+
text1: string;
|
|
38
|
+
link: {
|
|
39
|
+
href: string;
|
|
40
|
+
text: string;
|
|
41
|
+
};
|
|
42
|
+
text2: string;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
21
45
|
};
|
|
22
46
|
};
|
|
23
47
|
export type timers = {
|
|
24
48
|
updateDomTimer?: unknown | number;
|
|
25
49
|
abortUnresponsiveRequest?: unknown | number;
|
|
50
|
+
abort?: unknown | never;
|
|
26
51
|
};
|
|
27
52
|
export type state = {
|
|
53
|
+
abortController: null | {
|
|
54
|
+
abort: any;
|
|
55
|
+
};
|
|
56
|
+
abort?: unknown;
|
|
28
57
|
error?: boolean | error;
|
|
29
58
|
spinnerState?: string;
|
|
30
59
|
done?: boolean;
|
|
@@ -33,6 +62,10 @@ export type state = {
|
|
|
33
62
|
timers: timers;
|
|
34
63
|
};
|
|
35
64
|
spinnerStateText?: string;
|
|
65
|
+
buttonDisabled?: boolean;
|
|
66
|
+
heading?: object | string | undefined;
|
|
67
|
+
messageText?: string;
|
|
68
|
+
ariaButtonEnabledMessage?: string;
|
|
36
69
|
};
|
|
37
70
|
export type node = {
|
|
38
71
|
text: object;
|
|
@@ -42,10 +75,34 @@ export type node = {
|
|
|
42
75
|
nodeName: keyof HTMLElementTagNameMap;
|
|
43
76
|
textContent: unknown | HTMLElement | string;
|
|
44
77
|
el: unknown | HTMLElement | string;
|
|
78
|
+
buttonDisabled: boolean | string;
|
|
45
79
|
};
|
|
46
80
|
export type initialState = {
|
|
47
|
-
nodeName
|
|
48
|
-
id
|
|
49
|
-
classes
|
|
81
|
+
nodeName?: string;
|
|
82
|
+
id?: string;
|
|
83
|
+
classes?: (string | undefined)[];
|
|
84
|
+
text?: object | string;
|
|
85
|
+
buttonDisabled?: state;
|
|
50
86
|
}[];
|
|
87
|
+
export type spinnerInitial = {
|
|
88
|
+
container?: HTMLElement;
|
|
89
|
+
apiUrl?: string;
|
|
90
|
+
msBeforeInformingOfLongWait?: number;
|
|
91
|
+
msBeforeAbort?: number;
|
|
92
|
+
msBetweenRequests?: number;
|
|
93
|
+
msBeforeDomUpdate?: number;
|
|
94
|
+
ariaLiveContainer?: HTMLElement;
|
|
95
|
+
domRequirementsMet?: boolean;
|
|
96
|
+
initTime?: number | undefined;
|
|
97
|
+
updateDomTimer?: number | undefined | any;
|
|
98
|
+
abortController?: any | object;
|
|
99
|
+
config?: {
|
|
100
|
+
msBeforeAbort: number;
|
|
101
|
+
msBeforeInformingOfLongWait: number;
|
|
102
|
+
msBetweenRequests: number;
|
|
103
|
+
ariaButtonEnabledMessage: string;
|
|
104
|
+
msBetweenDomUpdate: number;
|
|
105
|
+
};
|
|
106
|
+
msBetweenDomUpdate?: number;
|
|
107
|
+
};
|
|
51
108
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../frontend-src/utils/types.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../../frontend-src/utils/types.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@govuk-one-login/frontend-ui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.4.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"main": "build/cjs/backend/index.cjs",
|
|
6
6
|
"module": "build/esm/backend/index.js",
|
|
@@ -56,6 +56,7 @@
|
|
|
56
56
|
},
|
|
57
57
|
"types": "./build/esm/backend/index.d.ts",
|
|
58
58
|
"optionalDependencies": {
|
|
59
|
-
"hmpo-components": "^7.1.0"
|
|
59
|
+
"hmpo-components": "^7.1.0",
|
|
60
|
+
"@govuk-one-login/frontend-analytics": "^4.0.0"
|
|
60
61
|
}
|
|
61
62
|
}
|