@nice-digital/global-nav 5.0.940 → 7.0.930
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/README.md +18 -55
- package/lib/Footer/Footer.js +31 -55
- package/lib/Footer/Legal/Legal.js +76 -71
- package/lib/Footer/Legal/index.js +10 -7
- package/lib/Footer/Pages/Pages.js +34 -54
- package/lib/Footer/Pages/Pages.module.scss +1 -1
- package/lib/Footer/Pages/index.js +10 -7
- package/lib/Footer/Pages/links.json +2 -5
- package/lib/Footer/Services/Services.js +65 -86
- package/lib/Footer/Services/Services.module.scss +1 -1
- package/lib/Footer/Services/index.js +10 -7
- package/lib/Footer/Social/Social.js +46 -57
- package/lib/Footer/Social/index.js +10 -7
- package/lib/Footer/index.js +10 -7
- package/lib/Header/Account/Account.js +87 -109
- package/lib/Header/Account/index.js +10 -7
- package/lib/Header/Account/nice-accounts.js +7 -12
- package/lib/Header/Header.js +345 -171
- package/lib/Header/Header.module.scss +2 -2
- package/lib/Header/Nav/Dropdown/Components/AboutUs.js +216 -105
- package/lib/Header/Nav/Dropdown/Components/BNF.js +120 -75
- package/lib/Header/Nav/Dropdown/Components/BNFc.js +115 -73
- package/lib/Header/Nav/Dropdown/Components/Button.js +11 -14
- package/lib/Header/Nav/Dropdown/Components/CKS.js +115 -73
- package/lib/Header/Nav/Dropdown/Components/Grid.js +16 -22
- package/lib/Header/Nav/Dropdown/Components/Guidance.js +244 -128
- package/lib/Header/Nav/Dropdown/Components/LifeSciences.js +169 -108
- package/lib/Header/Nav/Dropdown/Components/StandardsAndIndicators.js +83 -45
- package/lib/Header/Nav/Dropdown/Components/index.js +46 -24
- package/lib/Header/Nav/Dropdown/Dropdown.js +48 -63
- package/lib/Header/Nav/Dropdown/Dropdown.module.scss +1 -1
- package/lib/Header/Nav/Dropdown/index.js +10 -7
- package/lib/Header/Nav/Nav.js +84 -102
- package/lib/Header/Nav/Nav.module.scss +2 -4
- package/lib/Header/Nav/NavLinks/NavLinks.js +118 -137
- package/lib/Header/Nav/NavLinks/NavLinks.module.scss +1 -1
- package/lib/Header/Nav/NavLinks/index.js +10 -7
- package/lib/Header/Nav/SubNav/SubNav.js +54 -90
- package/lib/Header/Nav/SubNav/index.js +10 -7
- package/lib/Header/Nav/__mocks__/services.json +3 -3
- package/lib/Header/Nav/index.js +10 -7
- package/lib/Header/OldIEMessage/OldIEMessage.js +65 -67
- package/lib/Header/OldIEMessage/ie.js +14 -0
- package/lib/Header/OldIEMessage/index.js +10 -7
- package/lib/Header/Search/Autocomplete/Autocomplete.js +169 -194
- package/lib/Header/Search/Autocomplete/Autocomplete.module.scss +9 -1
- package/lib/Header/Search/Autocomplete/index.js +10 -7
- package/lib/Header/Search/Autocomplete/suggester/index.js +21 -28
- package/lib/Header/Search/Autocomplete/suggester/phrase-finder.js +13 -14
- package/lib/Header/Search/Autocomplete/suggester/term-finder.js +18 -21
- package/lib/Header/Search/Autocomplete/suggester/tokenizer.js +12 -17
- package/lib/Header/Search/Search.js +73 -90
- package/lib/Header/Search/index.js +10 -7
- package/lib/Header/SkipLink/SkipLink.js +24 -62
- package/lib/Header/SkipLink/SkipLink.module.scss +5 -1
- package/lib/Header/SkipLink/index.js +10 -7
- package/lib/Header/_header-settings.scss +0 -2
- package/lib/Header/context/HeaderContext.js +28 -54
- package/lib/Header/index.js +10 -7
- package/lib/Main/BackToTop/BackToTop.js +22 -25
- package/lib/Main/BackToTop/BackToTop.module.scss +1 -4
- package/lib/Main/Main.js +22 -26
- package/lib/Main/index.js +10 -7
- package/lib/TrackedLink/TrackedLink.js +48 -74
- package/lib/TrackedLink/index.js +10 -7
- package/lib/hooks/useEscapeKeydown.js +8 -21
- package/lib/hooks/useIsClient.js +20 -0
- package/lib/index.js +22 -12
- package/lib/renderer.js +21 -30
- package/lib/tracker/index.js +8 -25
- package/lib/utils.js +4 -7
- package/package.json +68 -65
- package/types.d.ts +1 -0
- package/lib/Header/Account/AccountOld.js +0 -227
|
@@ -1,30 +1,28 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
exports
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
4
6
|
exports.suggester = void 0;
|
|
5
|
-
|
|
6
7
|
var _tokenizer = require("./tokenizer");
|
|
7
|
-
|
|
8
8
|
var _phraseFinder = require("./phrase-finder");
|
|
9
|
-
|
|
10
9
|
var _termFinder = require("./term-finder");
|
|
11
|
-
|
|
12
10
|
var isValidSuggestion = function isValidSuggestion(suggestion) {
|
|
13
11
|
return suggestion.phraseMatch != null || suggestion.termMatches.length > 0;
|
|
14
12
|
};
|
|
15
|
-
|
|
16
13
|
var tokenizeSuggestion = function tokenizeSuggestion(suggestion) {
|
|
17
14
|
// TODO: Cache tokenized suggestions for performance
|
|
18
15
|
return Object.assign({}, suggestion, {
|
|
19
16
|
tokens: (0, _tokenizer.tokenize)(suggestion.Title)
|
|
20
17
|
});
|
|
21
18
|
};
|
|
22
|
-
|
|
23
19
|
var highlightSuggestion = function highlightSuggestion(suggestion) {
|
|
24
|
-
var titleHtml;
|
|
20
|
+
var titleHtml;
|
|
25
21
|
|
|
22
|
+
// Only highlight phrases, or individual terms, not both
|
|
26
23
|
if (suggestion.phraseMatch) titleHtml = (0, _phraseFinder.highlightPhrase)(suggestion.Title, suggestion.phraseMatch);else titleHtml = suggestion.termMatches.sort(function (a, b) {
|
|
27
|
-
return (
|
|
24
|
+
return (
|
|
25
|
+
// Order by later matches first so we can replace highlight matched terms
|
|
28
26
|
b.suggestionToken.originalIndex - a.suggestionToken.originalIndex
|
|
29
27
|
);
|
|
30
28
|
}).reduce(function (titleHtml, termMatch) {
|
|
@@ -34,55 +32,50 @@ var highlightSuggestion = function highlightSuggestion(suggestion) {
|
|
|
34
32
|
titleHtml: titleHtml
|
|
35
33
|
});
|
|
36
34
|
};
|
|
37
|
-
|
|
38
35
|
var sortSuggestions = function sortSuggestions(a, b) {
|
|
39
36
|
// Show phrases first, and phrases closer to the start of the string first
|
|
40
37
|
if (a.phraseMatch && b.phraseMatch) {
|
|
41
38
|
return a.phraseMatch.suggestionTokens[0].originalIndex - b.phraseMatch.suggestionTokens[0].originalIndex;
|
|
42
|
-
}
|
|
43
|
-
|
|
39
|
+
}
|
|
44
40
|
|
|
41
|
+
// Prefer phrases over term matches
|
|
45
42
|
if (a.phraseMatch && !b.phraseMatch) return -1;
|
|
46
|
-
if (!a.phraseMatch && b.phraseMatch) return 1;
|
|
43
|
+
if (!a.phraseMatch && b.phraseMatch) return 1;
|
|
47
44
|
|
|
45
|
+
// Show term matches towards the start of the string first
|
|
48
46
|
return a.termMatches[0].suggestionToken.originalIndex - b.termMatches[0].suggestionToken.originalIndex;
|
|
49
47
|
};
|
|
48
|
+
|
|
50
49
|
/**
|
|
51
50
|
*
|
|
52
51
|
* @param {Array<{Title, Link}>} suggestions The complete list of sugggestions to filter
|
|
53
52
|
* @param {String} query The search query
|
|
54
53
|
* @param {Number} maxResults The maximum number of results to show
|
|
55
54
|
*/
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
var suggester = function suggester(suggestions, query, maxResults) {
|
|
59
|
-
if (maxResults === void 0) {
|
|
60
|
-
maxResults = 5;
|
|
61
|
-
}
|
|
62
|
-
|
|
55
|
+
var suggester = function suggester(suggestions, query) {
|
|
56
|
+
var maxResults = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 5;
|
|
63
57
|
var queryTokens = (0, _tokenizer.tokenize)(query ? query.trim() : "");
|
|
64
|
-
|
|
65
58
|
var findPhrasesAndTerms = function findPhrasesAndTerms(suggestion) {
|
|
66
59
|
var phraseMatch = (0, _phraseFinder.findPhrase)(queryTokens, suggestion.tokens),
|
|
67
|
-
|
|
68
|
-
|
|
60
|
+
// Only look for individual tokens if there are no phrases
|
|
61
|
+
termMatches = phraseMatch ? [] : (0, _termFinder.findTerms)(queryTokens, suggestion.tokens);
|
|
69
62
|
return Object.assign({}, suggestion, {
|
|
70
63
|
phraseMatch: phraseMatch,
|
|
71
64
|
termMatches: termMatches
|
|
72
65
|
});
|
|
73
66
|
};
|
|
74
|
-
|
|
75
67
|
return suggestions.map(tokenizeSuggestion).map(findPhrasesAndTerms).filter(isValidSuggestion).map(highlightSuggestion).sort(sortSuggestions).slice(0, maxResults).map(function (_ref) {
|
|
76
68
|
var Title = _ref.Title,
|
|
77
|
-
|
|
78
|
-
|
|
69
|
+
Link = _ref.Link,
|
|
70
|
+
TypeAheadType = _ref.TypeAheadType,
|
|
71
|
+
titleHtml = _ref.titleHtml;
|
|
79
72
|
// keep only the properties we care about
|
|
80
73
|
return {
|
|
81
74
|
Title: Title,
|
|
82
75
|
Link: Link,
|
|
83
|
-
TitleHtml: titleHtml
|
|
76
|
+
TitleHtml: titleHtml,
|
|
77
|
+
TypeAheadType: TypeAheadType
|
|
84
78
|
};
|
|
85
79
|
});
|
|
86
80
|
};
|
|
87
|
-
|
|
88
81
|
exports.suggester = suggester;
|
|
@@ -1,10 +1,11 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
exports
|
|
4
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
5
7
|
exports.findPhrase = findPhrase;
|
|
6
8
|
exports.highlightPhrase = highlightPhrase;
|
|
7
|
-
|
|
8
9
|
// Finds a phrase within a suggested term
|
|
9
10
|
function findPhrase(queryTokens, suggestionTokens) {
|
|
10
11
|
// Look for matching query tokens within the suggestion
|
|
@@ -20,21 +21,19 @@ function findPhrase(queryTokens, suggestionTokens) {
|
|
|
20
21
|
queryTokens: queryTokens,
|
|
21
22
|
suggestionTokens: nextSuggestionTokens
|
|
22
23
|
};
|
|
23
|
-
}
|
|
24
|
-
|
|
24
|
+
}
|
|
25
25
|
|
|
26
|
+
// No phrase match
|
|
26
27
|
return null;
|
|
27
28
|
}
|
|
28
|
-
|
|
29
29
|
function highlightPhrase(suggestionTitle, phraseMatch) {
|
|
30
30
|
var suggestionTokens = phraseMatch.suggestionTokens,
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
return suggestionTitle.substr(0, startIndex)
|
|
31
|
+
queryTokens = phraseMatch.queryTokens,
|
|
32
|
+
lastPhraseToken = suggestionTokens[suggestionTokens.length - 1],
|
|
33
|
+
lastqueryToken = queryTokens[queryTokens.length - 1],
|
|
34
|
+
startIndex = suggestionTokens[0].originalIndex,
|
|
35
|
+
phraseLength = lastPhraseToken.originalIndex + lastqueryToken.originalStr.length - suggestionTokens[0].originalIndex;
|
|
36
|
+
return "".concat(suggestionTitle.substr(0, startIndex), "<mark>").concat(suggestionTitle.substr(startIndex, phraseLength), "</mark>").concat(suggestionTitle.substr(startIndex + phraseLength));
|
|
37
37
|
}
|
|
38
|
-
|
|
39
38
|
var _default = findPhrase;
|
|
40
|
-
exports
|
|
39
|
+
exports.default = _default;
|
|
@@ -1,56 +1,53 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
exports
|
|
4
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
5
7
|
exports.findTerms = findTerms;
|
|
6
8
|
exports.highlightTerm = highlightTerm;
|
|
7
|
-
|
|
8
9
|
function findTerms(queryTokens, suggestionTokens) {
|
|
9
10
|
var termMatches = [];
|
|
10
|
-
|
|
11
11
|
for (var index = 0; index < queryTokens.length; index++) {
|
|
12
12
|
var queryToken = queryTokens[index];
|
|
13
13
|
var unusedSuggestionTokens = suggestionTokens.filter(function (suggestionToken) {
|
|
14
14
|
return termMatches.every(function (prevMatch) {
|
|
15
15
|
return prevMatch.suggestionToken !== suggestionToken;
|
|
16
16
|
});
|
|
17
|
-
});
|
|
18
|
-
// And we didn't want to pollute the global scope with a polyfill
|
|
17
|
+
});
|
|
19
18
|
|
|
19
|
+
// We use a for loop here because Array.prototype.find isn't supported in IE9
|
|
20
|
+
// And we didn't want to pollute the global scope with a polyfill
|
|
20
21
|
var firstMatchedSuggestionToken = null;
|
|
21
|
-
|
|
22
22
|
for (var i = 0; i < unusedSuggestionTokens.length; i++) {
|
|
23
23
|
var suggestionToken = unusedSuggestionTokens[i];
|
|
24
|
-
|
|
25
24
|
if (suggestionToken.str.indexOf(queryToken.str) === 0) {
|
|
26
25
|
firstMatchedSuggestionToken = suggestionToken;
|
|
27
26
|
break;
|
|
28
27
|
}
|
|
29
28
|
}
|
|
30
|
-
|
|
31
29
|
termMatches.push({
|
|
32
30
|
suggestionToken: firstMatchedSuggestionToken,
|
|
33
31
|
queryToken: queryToken
|
|
34
32
|
});
|
|
35
33
|
}
|
|
34
|
+
var deDupedTermMatches = termMatches;
|
|
36
35
|
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
// Only consider term matches if we match *every* token in the query
|
|
39
37
|
return deDupedTermMatches.every(function (match) {
|
|
40
38
|
return !!match.suggestionToken;
|
|
41
39
|
}) ? deDupedTermMatches : [];
|
|
42
|
-
}
|
|
43
|
-
|
|
40
|
+
}
|
|
44
41
|
|
|
42
|
+
// Highlights (with a mark tag) a match within a term
|
|
45
43
|
function highlightTerm(suggestionTitle, termMatch) {
|
|
46
44
|
var queryToken = termMatch.queryToken,
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return suggestionTitle.substr(0, index)
|
|
45
|
+
suggestionToken = termMatch.suggestionToken,
|
|
46
|
+
nonAlphanumericPrefixMatch = suggestionToken.originalStr.match("^[^a-zA-Z0-9]+"),
|
|
47
|
+
alphanumericPrefixLength = nonAlphanumericPrefixMatch ? nonAlphanumericPrefixMatch[0].length : 0,
|
|
48
|
+
index = suggestionToken.originalIndex + alphanumericPrefixLength,
|
|
49
|
+
length = queryToken.str.length;
|
|
50
|
+
return "".concat(suggestionTitle.substr(0, index), "<mark>").concat(suggestionTitle.substr(index, length), "</mark>").concat(suggestionTitle.substr(index + length));
|
|
53
51
|
}
|
|
54
|
-
|
|
55
52
|
var _default = findTerms;
|
|
56
|
-
exports
|
|
53
|
+
exports.default = _default;
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
|
-
exports
|
|
4
|
-
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.default = void 0;
|
|
5
7
|
exports.normalizeTokens = normalizeTokens;
|
|
6
8
|
exports.tokenize = tokenize;
|
|
7
9
|
exports.whitespaceTokenizer = whitespaceTokenizer;
|
|
8
|
-
|
|
9
10
|
/**
|
|
10
11
|
* @typedef Token
|
|
11
12
|
* @type {object}
|
|
@@ -22,28 +23,25 @@ exports.whitespaceTokenizer = whitespaceTokenizer;
|
|
|
22
23
|
function whitespaceTokenizer(str) {
|
|
23
24
|
var tokens = [];
|
|
24
25
|
var currentToken = null;
|
|
25
|
-
|
|
26
26
|
for (var index = 0; index < str.length; index++) {
|
|
27
|
-
var
|
|
28
|
-
|
|
29
|
-
if (/[a-zA-Z0-9]/.test(_char)) {
|
|
27
|
+
var char = str[index];
|
|
28
|
+
if (/[a-zA-Z0-9]/.test(char)) {
|
|
30
29
|
if (!currentToken) {
|
|
31
30
|
currentToken = {
|
|
32
31
|
originalIndex: index,
|
|
33
32
|
str: ""
|
|
34
33
|
};
|
|
35
34
|
}
|
|
36
|
-
|
|
37
|
-
currentToken.str += _char;
|
|
35
|
+
currentToken.str += char;
|
|
38
36
|
} else if (currentToken) {
|
|
39
37
|
tokens.push(currentToken);
|
|
40
38
|
currentToken = null;
|
|
41
39
|
}
|
|
42
40
|
}
|
|
43
|
-
|
|
44
41
|
if (currentToken) tokens.push(currentToken);
|
|
45
42
|
return tokens;
|
|
46
43
|
}
|
|
44
|
+
|
|
47
45
|
/**
|
|
48
46
|
* @typedef NormalisedToken
|
|
49
47
|
* @type {object}
|
|
@@ -57,31 +55,28 @@ function whitespaceTokenizer(str) {
|
|
|
57
55
|
* @param {Token[]} tokens The list of tokens to normalise
|
|
58
56
|
* @returns {NormalisedToken[]} The list of normalised tokens
|
|
59
57
|
*/
|
|
60
|
-
|
|
61
|
-
|
|
62
58
|
function normalizeTokens(tokens) {
|
|
63
59
|
return tokens.map(function (token) {
|
|
64
60
|
return {
|
|
65
61
|
originalIndex: token.originalIndex,
|
|
66
62
|
originalStr: token.str,
|
|
67
|
-
str: token.str.toLowerCase()
|
|
63
|
+
str: token.str.toLowerCase()
|
|
64
|
+
// Trim non-alphanumeric characters
|
|
68
65
|
.replace(/^[^a-z\d]*|[^a-z\d]*$/gi, "")
|
|
69
66
|
};
|
|
70
67
|
}).filter(function (token) {
|
|
71
68
|
return !!token.str;
|
|
72
69
|
});
|
|
73
70
|
}
|
|
71
|
+
|
|
74
72
|
/**
|
|
75
73
|
* Splits a string on whitespace into an array of normalised tokens
|
|
76
74
|
*
|
|
77
75
|
* @param {string} str The string to split
|
|
78
76
|
* @returns {NormalisedToken[]} The list of normalised tokens
|
|
79
77
|
*/
|
|
80
|
-
|
|
81
|
-
|
|
82
78
|
function tokenize(str) {
|
|
83
79
|
return normalizeTokens(whitespaceTokenizer(str));
|
|
84
80
|
}
|
|
85
|
-
|
|
86
81
|
var _default = tokenize;
|
|
87
|
-
exports
|
|
82
|
+
exports.default = _default;
|
|
@@ -1,49 +1,45 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
exports
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
var _typeof = require("@babel/runtime/helpers/typeof");
|
|
5
|
+
Object.defineProperty(exports, "__esModule", {
|
|
6
|
+
value: true
|
|
7
|
+
});
|
|
8
|
+
exports.default = void 0;
|
|
10
9
|
var _react = _interopRequireWildcard(require("react"));
|
|
11
|
-
|
|
12
10
|
var _propTypes = _interopRequireDefault(require("prop-types"));
|
|
13
|
-
|
|
14
11
|
var _Search = _interopRequireDefault(require("@nice-digital/icons/lib/Search"));
|
|
15
|
-
|
|
16
12
|
var _Autocomplete = _interopRequireDefault(require("./Autocomplete"));
|
|
17
|
-
|
|
18
13
|
var _SkipLink = _interopRequireDefault(require("../SkipLink"));
|
|
19
|
-
|
|
20
14
|
var _utils = require("../../utils");
|
|
21
|
-
|
|
22
15
|
var _SearchModule = _interopRequireDefault(require("./Search.module.scss"));
|
|
23
|
-
|
|
16
|
+
var _jsxRuntime = require("react/jsx-runtime");
|
|
24
17
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
25
|
-
|
|
26
|
-
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
27
|
-
|
|
18
|
+
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
28
19
|
var searchInputSelector = "header form[role='search'] [name='q']";
|
|
29
|
-
|
|
30
|
-
var
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
20
|
+
var Search = function Search(_ref) {
|
|
21
|
+
var _ref$url = _ref.url,
|
|
22
|
+
url = _ref$url === void 0 ? "/search" : _ref$url,
|
|
23
|
+
autocomplete = _ref.autocomplete,
|
|
24
|
+
skipLinkId = _ref.skipLinkId,
|
|
25
|
+
_ref$placeholder = _ref.placeholder,
|
|
26
|
+
placeholder = _ref$placeholder === void 0 ? "Search NICE…" : _ref$placeholder,
|
|
27
|
+
_ref$query = _ref.query,
|
|
28
|
+
query = _ref$query === void 0 ? "" : _ref$query,
|
|
29
|
+
onSearching = _ref.onSearching,
|
|
30
|
+
onNavigating = _ref.onNavigating;
|
|
35
31
|
var keyDownHandler = function keyDownHandler(e) {
|
|
36
32
|
// Submit the form when we press enter to allow the enter key functionality:
|
|
37
33
|
// The accessible-autocomplete doesn't let you use enter by default
|
|
38
34
|
if (e.key === "Enter" && e.target.id === "autocomplete") {
|
|
39
35
|
var wasSearchActionOverridden = searchSubmitHandler(e);
|
|
40
|
-
|
|
41
36
|
if (!wasSearchActionOverridden) {
|
|
42
37
|
var searchForm = document.getElementById("global-nav-search-form");
|
|
43
38
|
if (searchForm) searchForm.submit();
|
|
44
39
|
}
|
|
45
40
|
}
|
|
46
41
|
};
|
|
42
|
+
|
|
47
43
|
/**
|
|
48
44
|
* Event handler for the form submit action
|
|
49
45
|
*
|
|
@@ -51,47 +47,36 @@ var Search = function Search(props) {
|
|
|
51
47
|
* @returns true if the search action was overridden; otherwise false
|
|
52
48
|
* @memberof Search
|
|
53
49
|
*/
|
|
54
|
-
|
|
55
|
-
|
|
56
50
|
var searchSubmitHandler = function searchSubmitHandler(e) {
|
|
57
51
|
// If we've got an onSearching prop then cancel the default search behaviour
|
|
58
52
|
// and call the onSearcing callback with the query value.
|
|
59
|
-
var onSearching = props.onSearching;
|
|
60
53
|
|
|
61
54
|
if (onSearching) {
|
|
62
55
|
var onSearchingCallback = (0, _utils.getCallbackFunction)(onSearching);
|
|
63
|
-
|
|
64
56
|
if (onSearchingCallback) {
|
|
65
57
|
e.preventDefault();
|
|
66
|
-
var
|
|
58
|
+
var _query = document.getElementById("autocomplete").value;
|
|
67
59
|
onSearchingCallback({
|
|
68
|
-
query:
|
|
60
|
+
query: _query
|
|
69
61
|
});
|
|
70
62
|
return true;
|
|
71
63
|
}
|
|
72
64
|
}
|
|
73
|
-
|
|
74
65
|
return false;
|
|
75
|
-
};
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
// TODO: Remove this hack to fix https://github.com/alphagov/accessible-autocomplete/issues/434
|
|
76
69
|
// We do this to make our axe tests pass
|
|
77
70
|
// Wait for the search box to appear before removing the aria-activedescendant attribute
|
|
78
|
-
|
|
79
|
-
|
|
80
71
|
var searchFormRef = (0, _react.useCallback)(function (node) {
|
|
81
|
-
var _this2 = this;
|
|
82
|
-
|
|
83
|
-
(0, _newArrowCheck2["default"])(this, _this);
|
|
84
72
|
var searchInput;
|
|
85
|
-
|
|
86
73
|
if (node && "MutationObserver" in window) {
|
|
87
74
|
new MutationObserver(function () {
|
|
88
|
-
(0, _newArrowCheck2["default"])(this, _this2);
|
|
89
75
|
searchInput = searchInput || document.querySelector(searchInputSelector);
|
|
90
|
-
|
|
91
76
|
if (searchInput && searchInput.getAttribute("aria-activedescendant") === "false") {
|
|
92
77
|
searchInput.setAttribute("aria-activedescendant", "");
|
|
93
78
|
}
|
|
94
|
-
}
|
|
79
|
+
}).observe(node, {
|
|
95
80
|
attributeFilter: ["aria-activedescendant"],
|
|
96
81
|
attributes: true,
|
|
97
82
|
// See https://stackoverflow.com/a/50593541/486434
|
|
@@ -99,66 +84,64 @@ var Search = function Search(props) {
|
|
|
99
84
|
subtree: true
|
|
100
85
|
});
|
|
101
86
|
}
|
|
102
|
-
}
|
|
87
|
+
}, []);
|
|
103
88
|
return (
|
|
104
89
|
/*#__PURE__*/
|
|
105
90
|
// eslint-disable-next-line jsx-a11y/no-noninteractive-element-interactions
|
|
106
|
-
|
|
91
|
+
(0, _jsxRuntime.jsxs)("form", {
|
|
107
92
|
id: "global-nav-search-form",
|
|
108
93
|
role: "search",
|
|
109
|
-
action:
|
|
110
|
-
className: _SearchModule
|
|
94
|
+
action: url,
|
|
95
|
+
className: _SearchModule.default.search,
|
|
111
96
|
onSubmit: searchSubmitHandler,
|
|
112
97
|
onKeyDown: keyDownHandler,
|
|
113
|
-
ref: searchFormRef
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
98
|
+
ref: searchFormRef,
|
|
99
|
+
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)("label", {
|
|
100
|
+
className: _SearchModule.default.label,
|
|
101
|
+
htmlFor: "autocomplete",
|
|
102
|
+
children: placeholder
|
|
103
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Autocomplete.default, {
|
|
104
|
+
source: (autocomplete === null || autocomplete === void 0 ? void 0 : autocomplete.suggestions) || autocomplete,
|
|
105
|
+
suggestionTemplate: autocomplete === null || autocomplete === void 0 ? void 0 : autocomplete.suggestionTemplate,
|
|
106
|
+
placeholder: placeholder,
|
|
107
|
+
query: query,
|
|
108
|
+
onNavigating: onNavigating
|
|
109
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)("button", {
|
|
110
|
+
className: _SearchModule.default.button,
|
|
111
|
+
type: "submit",
|
|
112
|
+
"aria-label": "Perform search",
|
|
113
|
+
onClick: searchSubmitHandler,
|
|
114
|
+
children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Search.default, {
|
|
115
|
+
className: _SearchModule.default.icon
|
|
116
|
+
})
|
|
117
|
+
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_SkipLink.default, {
|
|
118
|
+
to: "#".concat(skipLinkId),
|
|
119
|
+
children: "Skip to content"
|
|
120
|
+
})]
|
|
121
|
+
})
|
|
133
122
|
);
|
|
134
123
|
};
|
|
135
|
-
|
|
136
124
|
var _default = Search;
|
|
137
|
-
exports
|
|
125
|
+
exports.default = _default;
|
|
138
126
|
Search.propTypes = {
|
|
139
|
-
url: _propTypes
|
|
140
|
-
autocomplete: _propTypes
|
|
141
|
-
suggestions: _propTypes
|
|
142
|
-
Title: _propTypes
|
|
143
|
-
TitleHtml: _propTypes
|
|
144
|
-
TypeAheadType: _propTypes
|
|
145
|
-
Link: _propTypes
|
|
146
|
-
})).isRequired, _propTypes
|
|
147
|
-
suggestionTemplate: _propTypes
|
|
148
|
-
}), _propTypes
|
|
149
|
-
Title: _propTypes
|
|
150
|
-
TitleHtml: _propTypes
|
|
151
|
-
TypeAheadType: _propTypes
|
|
152
|
-
Link: _propTypes
|
|
127
|
+
url: _propTypes.default.string,
|
|
128
|
+
autocomplete: _propTypes.default.oneOfType([_propTypes.default.shape({
|
|
129
|
+
suggestions: _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.shape({
|
|
130
|
+
Title: _propTypes.default.string.isRequired,
|
|
131
|
+
TitleHtml: _propTypes.default.string,
|
|
132
|
+
TypeAheadType: _propTypes.default.string,
|
|
133
|
+
Link: _propTypes.default.string.isRequired
|
|
134
|
+
})).isRequired, _propTypes.default.string]),
|
|
135
|
+
suggestionTemplate: _propTypes.default.func
|
|
136
|
+
}), _propTypes.default.bool, _propTypes.default.string, _propTypes.default.arrayOf(_propTypes.default.shape({
|
|
137
|
+
Title: _propTypes.default.string.isRequired,
|
|
138
|
+
TitleHtml: _propTypes.default.string,
|
|
139
|
+
TypeAheadType: _propTypes.default.string,
|
|
140
|
+
Link: _propTypes.default.string.isRequired
|
|
153
141
|
}))]),
|
|
154
|
-
skipLinkId: _propTypes
|
|
155
|
-
placeholder: _propTypes
|
|
156
|
-
query: _propTypes
|
|
157
|
-
onSearching: _propTypes
|
|
158
|
-
onNavigating: _propTypes
|
|
159
|
-
};
|
|
160
|
-
Search.defaultProps = {
|
|
161
|
-
url: "/search",
|
|
162
|
-
placeholder: "Search NICE…",
|
|
163
|
-
query: ""
|
|
142
|
+
skipLinkId: _propTypes.default.string,
|
|
143
|
+
placeholder: _propTypes.default.string,
|
|
144
|
+
query: _propTypes.default.string,
|
|
145
|
+
onSearching: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func]),
|
|
146
|
+
onNavigating: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.func])
|
|
164
147
|
};
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
|
|
3
3
|
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
Object.defineProperty(exports, "__esModule", {
|
|
5
|
+
value: true
|
|
6
|
+
});
|
|
7
|
+
Object.defineProperty(exports, "default", {
|
|
8
|
+
enumerable: true,
|
|
9
|
+
get: function get() {
|
|
10
|
+
return _Search.default;
|
|
11
|
+
}
|
|
12
|
+
});
|
|
13
|
+
var _Search = _interopRequireDefault(require("./Search"));
|