@ember-eui/core 16.0.3 → 16.0.4
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/declarations/-private/accents.d.ts +15 -0
- package/declarations/-private/accents.d.ts.map +1 -0
- package/declarations/-private/eui-render-node.d.ts +8 -3
- package/declarations/-private/eui-render-node.d.ts.map +1 -1
- package/declarations/components/eui-accordion.d.ts.map +1 -1
- package/declarations/components/eui-combo-box/option-text.d.ts +7 -1
- package/declarations/components/eui-combo-box/option-text.d.ts.map +1 -1
- package/declarations/components/eui-combo-box.d.ts +2 -1
- package/declarations/components/eui-combo-box.d.ts.map +1 -1
- package/declarations/components/eui-highlight.d.ts +12 -3
- package/declarations/components/eui-highlight.d.ts.map +1 -1
- package/declarations/components/eui-toast.d.ts.map +1 -1
- package/declarations/utils/eui/combo-box.d.ts +0 -4
- package/declarations/utils/eui/combo-box.d.ts.map +1 -1
- package/dist/-private/accents.js +40 -0
- package/dist/-private/accents.js.map +1 -0
- package/dist/-private/eui-render-node.js +6 -4
- package/dist/-private/eui-render-node.js.map +1 -1
- package/dist/components/eui-accordion.js +17 -3
- package/dist/components/eui-accordion.js.map +1 -1
- package/dist/components/eui-combo-box/option-text.js +14 -6
- package/dist/components/eui-combo-box/option-text.js.map +1 -1
- package/dist/components/eui-combo-box.js +1 -1
- package/dist/components/eui-combo-box.js.map +1 -1
- package/dist/components/eui-highlight.js +22 -8
- package/dist/components/eui-highlight.js.map +1 -1
- package/dist/components/eui-toast.js +6 -4
- package/dist/components/eui-toast.js.map +1 -1
- package/dist/utils/eui/combo-box.js +2 -4
- package/dist/utils/eui/combo-box.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { removeAccents, foldAccents } from '../-private/accents.js';
|
|
1
2
|
import EuiMark from './eui-mark.js';
|
|
2
3
|
import { precompileTemplate } from '@ember/template-compilation';
|
|
3
4
|
import { setComponentTemplate } from '@ember/component';
|
|
@@ -6,30 +7,42 @@ import templateOnly from '@ember/component/template-only';
|
|
|
6
7
|
function escapeRegExp(text) {
|
|
7
8
|
return text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
8
9
|
}
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
10
|
+
const isString = value => typeof value === 'string';
|
|
11
|
+
/**
|
|
12
|
+
* `isString` for the template, without the type guard: `@text` is typed a
|
|
13
|
+
* string, so the guard would leave the `else` branch a `never`.
|
|
14
|
+
*/
|
|
15
|
+
const isText = value => isString(value);
|
|
16
|
+
function highlightChunks(text, search, strict = false, highlightAll = false, ignoreAccents = true) {
|
|
17
|
+
if (!isString(text) || !text) return [];
|
|
18
|
+
const terms = (Array.isArray(search) ? search : [search]).filter(isString).map(term => ignoreAccents ? removeAccents(term) : term).filter(term => term.length > 0);
|
|
12
19
|
if (!terms.length) return [{
|
|
13
20
|
text,
|
|
14
21
|
highlight: false
|
|
15
22
|
}];
|
|
16
23
|
if (terms.length > 1 && !highlightAll) throw new Error('Cannot parse multiple search strings without `highlightAll` enabled');
|
|
24
|
+
// without accents, matches in the folded text map back to the original
|
|
25
|
+
const fold = ignoreAccents ? foldAccents(text) : undefined;
|
|
17
26
|
const regex = new RegExp(terms.map(escapeRegExp).join('|'), strict ? 'g' : 'gi');
|
|
18
27
|
const chunks = [];
|
|
19
28
|
let last = 0;
|
|
20
|
-
for (const match of text.matchAll(regex)) {
|
|
21
|
-
const start = match.index;
|
|
29
|
+
for (const match of (fold?.folded ?? text).matchAll(regex)) {
|
|
22
30
|
// an empty match cannot be highlighted
|
|
23
31
|
if (!match[0]) continue;
|
|
32
|
+
// a character can fold to several (Hangul to jamo): matches in one
|
|
33
|
+
// original character must not overlap
|
|
34
|
+
const start = fold ? Math.max(fold.starts[match.index], last) : match.index;
|
|
35
|
+
const end = fold ? fold.ends[match.index + match[0].length - 1] : match.index + match[0].length;
|
|
36
|
+
if (end <= last) continue;
|
|
24
37
|
if (start > last) chunks.push({
|
|
25
38
|
text: text.slice(last, start),
|
|
26
39
|
highlight: false
|
|
27
40
|
});
|
|
28
41
|
chunks.push({
|
|
29
|
-
text:
|
|
42
|
+
text: text.slice(start, end),
|
|
30
43
|
highlight: true
|
|
31
44
|
});
|
|
32
|
-
last =
|
|
45
|
+
last = end;
|
|
33
46
|
if (!highlightAll) break;
|
|
34
47
|
}
|
|
35
48
|
if (last < text.length) chunks.push({
|
|
@@ -38,9 +51,10 @@ function highlightChunks(text, search, strict = false, highlightAll = false) {
|
|
|
38
51
|
});
|
|
39
52
|
return chunks;
|
|
40
53
|
}
|
|
41
|
-
const EuiHighlight = setComponentTemplate(precompileTemplate("<span ...attributes>\n {{~#each (highlightChunks @text @search @strict @highlightAll) as |chunk|~}}\n
|
|
54
|
+
const EuiHighlight = setComponentTemplate(precompileTemplate("<span ...attributes>\n {{~#if (isText @text)~}}\n {{~#each (highlightChunks @text @search @strict @highlightAll @ignoreAccents) as |chunk|~}}\n {{~#if chunk.highlight~}}\n <EuiMark @hasScreenReaderHelpText={{@hasScreenReaderHelpText}}>{{chunk.text}}</EuiMark>\n {{~else~}}\n {{chunk.text}}\n {{~/if~}}\n {{~/each~}}\n {{~else~}}\n {{@text}}\n {{~/if~}}\n</span>", {
|
|
42
55
|
strictMode: true,
|
|
43
56
|
scope: () => ({
|
|
57
|
+
isText,
|
|
44
58
|
highlightChunks,
|
|
45
59
|
EuiMark
|
|
46
60
|
})
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eui-highlight.js","sources":["../../src/components/eui-highlight.gts"],"sourcesContent":["import EuiMark from './eui-mark.gts';\n\nimport type { TemplateOnlyComponent } from '@ember/component/template-only';\n\n/**\n * Renders a string with the parts matching `@search` highlighted, e.g.\n * search results or the options of a filtered list.\n */\nexport interface EuiHighlightSignature {\n Element: HTMLSpanElement;\n Args: {\n
|
|
1
|
+
{"version":3,"file":"eui-highlight.js","sources":["../../src/components/eui-highlight.gts"],"sourcesContent":["import { foldAccents, removeAccents } from '../-private/accents.ts';\nimport EuiMark from './eui-mark.gts';\n\nimport type { TemplateOnlyComponent } from '@ember/component/template-only';\n\n/**\n * Renders a string with the parts matching `@search` highlighted, e.g.\n * search results or the options of a filtered list.\n */\nexport interface EuiHighlightSignature {\n Element: HTMLSpanElement;\n Args: {\n /**\n * The text to show. Anything else (a number, `null`, …) renders as is,\n * with nothing highlighted.\n */\n text: string;\n /**\n * What to highlight in it. Nothing is highlighted when empty. With\n * `@highlightAll`, an array highlights every one of several words or\n * phrases. Anything but strings is ignored.\n */\n search?: string | string[];\n /** Match case exactly (by default \"app\" also matches \"Apple\"). */\n strict?: boolean;\n /** Highlight every match instead of only the first one. */\n highlightAll?: boolean;\n /**\n * Match ignoring accents (\"medico\" marks \"Médico\", and \"médico\" marks\n * \"Medico\"); defaults to `true`. `false` matches them exactly, like\n * upstream. Not upstream.\n */\n ignoreAccents?: boolean;\n /** Passed to each EuiMark; defaults to `true`. */\n hasScreenReaderHelpText?: boolean;\n };\n}\n\ninterface Chunk {\n text: string;\n highlight: boolean;\n}\n\nfunction escapeRegExp(text: string): string {\n return text.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n}\n\nconst isString = (value: unknown): value is string => typeof value === 'string';\n\n/**\n * `isString` for the template, without the type guard: `@text` is typed a\n * string, so the guard would leave the `else` branch a `never`.\n */\nconst isText = (value: unknown): boolean => isString(value);\n\nexport function highlightChunks(\n text: unknown,\n search?: unknown,\n strict = false,\n highlightAll = false,\n ignoreAccents = true\n): Chunk[] {\n if (!isString(text) || !text) return [];\n const terms = (Array.isArray(search) ? search : [search])\n .filter(isString)\n .map((term) => (ignoreAccents ? removeAccents(term) : term))\n .filter((term) => term.length > 0);\n if (!terms.length) return [{ text, highlight: false }];\n if (terms.length > 1 && !highlightAll)\n throw new Error(\n 'Cannot parse multiple search strings without `highlightAll` enabled'\n );\n\n // without accents, matches in the folded text map back to the original\n const fold = ignoreAccents ? foldAccents(text) : undefined;\n const regex = new RegExp(terms.map(escapeRegExp).join('|'), strict ? 'g' : 'gi');\n const chunks: Chunk[] = [];\n let last = 0;\n\n for (const match of (fold?.folded ?? text).matchAll(regex)) {\n // an empty match cannot be highlighted\n if (!match[0]) continue;\n // a character can fold to several (Hangul to jamo): matches in one\n // original character must not overlap\n const start = fold ? Math.max(fold.starts[match.index]!, last) : match.index;\n const end = fold ? fold.ends[match.index + match[0].length - 1]! : match.index + match[0].length;\n if (end <= last) continue;\n\n if (start > last) chunks.push({ text: text.slice(last, start), highlight: false });\n chunks.push({ text: text.slice(start, end), highlight: true });\n last = end;\n\n if (!highlightAll) break;\n }\n\n if (last < text.length) chunks.push({ text: text.slice(last), highlight: false });\n\n return chunks;\n}\n\nconst EuiHighlight: TemplateOnlyComponent<EuiHighlightSignature> = <template>\n <span ...attributes>\n {{~#if (isText @text)~}}\n {{~#each (highlightChunks @text @search @strict @highlightAll @ignoreAccents) as |chunk|~}}\n {{~#if chunk.highlight~}}\n <EuiMark\n @hasScreenReaderHelpText={{@hasScreenReaderHelpText}}\n >{{chunk.text}}</EuiMark>\n {{~else~}}\n {{chunk.text}}\n {{~/if~}}\n {{~/each~}}\n {{~else~}}\n {{@text}}\n {{~/if~}}\n </span>\n</template>;\n\nexport default EuiHighlight;\n"],"names":["escapeRegExp","text","replace","isString","value","isText","highlightChunks","search","strict","highlightAll","ignoreAccents","terms","Array","isArray","filter","map","term","removeAccents","length","highlight","Error","fold","foldAccents","undefined","regex","RegExp","join","chunks","last","match","folded","matchAll","start","Math","max","starts","index","end","ends","push","slice","EuiHighlight","setComponentTemplate","precompileTemplate","strictMode","scope","EuiMark","templateOnly"],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import Component from '@glimmer/component';
|
|
|
2
2
|
import { cached } from '@glimmer/tracking';
|
|
3
3
|
import { on } from '@ember/modifier';
|
|
4
4
|
import { service } from '@ember/service';
|
|
5
|
+
import { isHTMLSafe } from '@ember/template';
|
|
5
6
|
import { getTokenName } from '@elastic/eui-theme-common';
|
|
6
7
|
import { or, and } from 'ember-truth-helpers';
|
|
7
8
|
import EuiRenderNodeView, { isTextNode } from '../-private/eui-render-node.js';
|
|
@@ -41,7 +42,8 @@ const DEFAULT_ICONS = {
|
|
|
41
42
|
color: 'danger'
|
|
42
43
|
}
|
|
43
44
|
};
|
|
44
|
-
|
|
45
|
+
/** Text for markdown; `htmlSafe` text is HTML already. */
|
|
46
|
+
const isMarkdownText = value => isTextNode(value) && !isHTMLSafe(value);
|
|
45
47
|
/** Native Ember toast on the upstream EUI 123 / Borealis factories. */
|
|
46
48
|
class EuiToast extends Component {
|
|
47
49
|
static {
|
|
@@ -166,7 +168,7 @@ class EuiToast extends Component {
|
|
|
166
168
|
}
|
|
167
169
|
/** The body as text, for markdown. */
|
|
168
170
|
get bodyText() {
|
|
169
|
-
return
|
|
171
|
+
return isMarkdownText(this.body) ? String(this.body) : '';
|
|
170
172
|
}
|
|
171
173
|
get dismissLabel() {
|
|
172
174
|
return this.euiI18n.lookupToken('euiToast.dismissToast', 'Dismiss toast');
|
|
@@ -175,7 +177,7 @@ class EuiToast extends Component {
|
|
|
175
177
|
return this.euiI18n.lookupToken('euiToast.newNotification', 'A new notification appears');
|
|
176
178
|
}
|
|
177
179
|
static {
|
|
178
|
-
setComponentTemplate(precompileTemplate("<div class=\"euiToast euiToast--{{this.color}} {{this.classes}}\" ...attributes>\n <div class=\"euiToastDecor {{this.decorClass}}\" role=\"presentation\"></div>\n <p class={{this.srOnlyClass}}>{{this.newNotificationText}}</p>\n <div class={{this.wrapperClass}}>\n <div class={{this.bodyClass}}>\n {{#if @iconType}}\n <EuiIcon @type={{@iconType}} @size=\"l\" @color={{this.typeColor}} @css={{this.iconCss}} aria-hidden=\"true\" />\n {{else if this.defaultIcon}}\n <EuiIcon class=\"euiNotificationIcon\" @type={{this.defaultIcon.type}} @size=\"l\" @color={{this.defaultIcon.color}} @css={{this.iconCss}} aria-hidden=\"true\" />\n {{/if}}\n <div class={{this.contentClass}}>\n {{#if @title}}\n <EuiTitle class=\"euiToastHeader__title\" data-test-subj=\"euiToastHeader__title\" @tagName=\"p\" @size=\"xs\" @css={{this.headerCss}}>{{@title}}</EuiTitle>\n {{/if}}\n {{!-- Upstream DOM order: the dismiss button follows the title, so\n screen reader users know what it dismisses. --}}\n {{#if (and @title @onClose)}}\n <EuiButtonIcon @iconType=\"cross\" @color=\"text\" @size=\"xs\" @css={{this.dismissCss}} aria-label={{this.dismissLabel}} data-test-subj=\"toastCloseButton\" {{on \"click\" this.onDismiss}} />\n {{/if}}\n {{#if (or this.body (has-block))}}\n <div class={{this.textClass}} data-test-subj=\"euiToastBody\">\n {{#if this.body}}\n {{#if (and @useMarkdownFormat (
|
|
180
|
+
setComponentTemplate(precompileTemplate("<div class=\"euiToast euiToast--{{this.color}} {{this.classes}}\" ...attributes>\n <div class=\"euiToastDecor {{this.decorClass}}\" role=\"presentation\"></div>\n <p class={{this.srOnlyClass}}>{{this.newNotificationText}}</p>\n <div class={{this.wrapperClass}}>\n <div class={{this.bodyClass}}>\n {{#if @iconType}}\n <EuiIcon @type={{@iconType}} @size=\"l\" @color={{this.typeColor}} @css={{this.iconCss}} aria-hidden=\"true\" />\n {{else if this.defaultIcon}}\n <EuiIcon class=\"euiNotificationIcon\" @type={{this.defaultIcon.type}} @size=\"l\" @color={{this.defaultIcon.color}} @css={{this.iconCss}} aria-hidden=\"true\" />\n {{/if}}\n <div class={{this.contentClass}}>\n {{#if @title}}\n <EuiTitle class=\"euiToastHeader__title\" data-test-subj=\"euiToastHeader__title\" @tagName=\"p\" @size=\"xs\" @css={{this.headerCss}}>{{@title}}</EuiTitle>\n {{/if}}\n {{!-- Upstream DOM order: the dismiss button follows the title, so\n screen reader users know what it dismisses. --}}\n {{#if (and @title @onClose)}}\n <EuiButtonIcon @iconType=\"cross\" @color=\"text\" @size=\"xs\" @css={{this.dismissCss}} aria-label={{this.dismissLabel}} data-test-subj=\"toastCloseButton\" {{on \"click\" this.onDismiss}} />\n {{/if}}\n {{#if (or this.body (has-block))}}\n <div class={{this.textClass}} data-test-subj=\"euiToastBody\">\n {{#if this.body}}\n {{#if (and @useMarkdownFormat (isMarkdownText this.body))}}\n <div class=\"euiToast__text\" data-test-subj=\"euiToastText\">\n <EuiMarkdownFormat @textSize=\"s\" @value={{this.bodyText}} />\n </div>\n {{else}}\n <EuiText class=\"euiToast__text\" @size=\"s\" @color=\"default\" data-test-subj=\"euiToastText\"><EuiRenderNode @value={{this.body}} /></EuiText>\n {{/if}}\n {{/if}}\n {{#if (has-block)}}\n <EuiText class=\"euiToast__additionalContent\" @size=\"s\" @color=\"default\" data-test-subj=\"euiToastAdditionalContent\">{{yield}}</EuiText>\n {{/if}}\n </div>\n {{/if}}\n {{#if (and @onClose (if @title false true))}}\n <EuiButtonIcon @iconType=\"cross\" @color=\"text\" @size=\"xs\" @css={{this.dismissCss}} aria-label={{this.dismissLabel}} data-test-subj=\"toastCloseButton\" {{on \"click\" this.onDismiss}} />\n {{/if}}\n </div>\n </div>\n {{#if (or @actionProps.primary @actionProps.secondary)}}\n <div class={{this.actionsClass}}>\n {{#if @actionProps.primary}}\n <EuiButton @size=\"s\" @color={{this.actionColor}} @href={{@actionProps.primary.href}} data-test-subj={{@actionProps.primary.data-test-subj}} {{on \"click\" this.onPrimary}}>{{@actionProps.primary.children}}</EuiButton>\n {{/if}}\n {{#if @actionProps.secondary}}\n <EuiButtonEmpty @size=\"s\" @color={{this.actionColor}} @href={{@actionProps.secondary.href}} data-test-subj={{@actionProps.secondary.data-test-subj}} {{on \"click\" this.onSecondary}}>{{@actionProps.secondary.children}}</EuiButtonEmpty>\n {{/if}}\n </div>\n {{/if}}\n </div>\n</div>", {
|
|
179
181
|
strictMode: true,
|
|
180
182
|
scope: () => ({
|
|
181
183
|
EuiIcon,
|
|
@@ -184,7 +186,7 @@ class EuiToast extends Component {
|
|
|
184
186
|
EuiButtonIcon,
|
|
185
187
|
on,
|
|
186
188
|
or,
|
|
187
|
-
|
|
189
|
+
isMarkdownText,
|
|
188
190
|
EuiMarkdownFormat,
|
|
189
191
|
EuiText,
|
|
190
192
|
EuiRenderNode: EuiRenderNodeView,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eui-toast.js","sources":["../../src/components/eui-toast.gts"],"sourcesContent":["import Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { on } from '@ember/modifier';\nimport { service } from '@ember/service';\n\nimport { getTokenName } from '@elastic/eui-theme-common';\nimport { and, or } from 'ember-truth-helpers';\n\nimport EuiRenderNode, { isTextNode } from '../-private/eui-render-node.gts';\nimport { getEuiThemeContext } from '../utils/emotion/consume.ts';\nimport { euiClass, useEuiBorealisStyles } from '../utils/eui/styles.ts';\nimport {\n euiNotificationIconStyles,\n euiToastHeaderStyles,\n euiToastStyles\n} from '../utils/eui/styles.generated.ts';\nimport EuiButton from './eui-button.gts';\nimport EuiButtonEmpty from './eui-button-empty.gts';\nimport EuiButtonIcon from './eui-button-icon.gts';\nimport EuiIcon from './eui-icon.gts';\nimport EuiTitle from './eui-title.gts';\nimport EuiMarkdownFormat from './eui-markdown-format.gts';\nimport { euiScreenReaderOnlyClass } from './eui-screen-reader-only.gts';\nimport EuiText from './eui-text.gts';\n\nimport type { EuiRenderNode as EuiRenderNodeType } from '../-private/eui-render-node.gts';\nimport type EuiI18n from '../services/eui-i18n';\nimport type { EuiCss } from '../utils/eui/styles.ts';\nimport type { EuiIconSignature } from './eui-icon';\n\nexport type EuiToastColor = 'primary' | 'success' | 'warning' | 'danger';\n\n/** One action button of a toast (upstream `actionProps.primary/secondary`). */\nexport interface EuiToastAction {\n /** The button's text. */\n children: string;\n /** Called when the button is clicked. */\n onClick?: (event: MouseEvent) => void;\n /** Makes the button a link. */\n href?: string;\n /** `data-test-subj` of the button. */\n 'data-test-subj'?: string;\n}\n\nexport interface IEuiToast {\n /** The title of the toast. */\n title?: string;\n /**\n * The body of the toast (markdown with `useMarkdownFormat`), also\n * accepted as upstream's `text`. Text, or a component for rich content (a template-only\n * component or `(component Foo arg=…)`), e.g. from the `euiToaster`\n * service, which cannot pass blocks. Markdown needs text.\n */\n body?: string | EuiRenderNodeType;\n /**\n * Same as `body`, under upstream's name; `body` wins when both are set.\n */\n text?: string | EuiRenderNodeType;\n /**\n * `'primary'`, `'success'`, `'warning'` or `'danger'`: the highlight bar\n * and default icon. `'none'` (Ember only) renders a neutral toast without\n * a highlight or default icon. Defaults to `'primary'`.\n */\n color?: EuiToastColor | 'none';\n /**\n * Icon before the content, e.g. `'check'` or `'warning'`, colored like the\n * highlight. Without it, a notification icon matching `@color` is shown.\n */\n iconType?: EuiIconSignature['Args']['type'];\n /** Shows a dismiss (cross) button calling this function. */\n onClose?: () => void;\n /** Renders `body` as markdown (EuiMarkdownFormat). */\n useMarkdownFormat?: boolean;\n /**\n * Action buttons below the content: `primary` renders an `EuiButton`,\n * `secondary` an `EuiButtonEmpty`, both small and in the toast's color.\n */\n actionProps?: { primary?: EuiToastAction; secondary?: EuiToastAction };\n}\n\n/**\n * A notification card. Usually shown through the `euiToaster` service and\n * EuiGlobalToastList rather than rendered directly.\n */\nexport interface EuiToastSignature {\n Element: HTMLDivElement;\n Args: IEuiToast & {\n /**\n * Duration of the highlight bar's countdown animation, in ms (set by\n * EuiGlobalToastList to the toast's lifetime). Runs only when motion is\n * allowed (`prefers-reduced-motion: no-preference`).\n */\n animationMs?: number;\n /**\n * Extra styles composed last into this component's class (like upstream's\n * `css` prop). Prefer this to an extra class when styling it from a parent.\n */\n css?: EuiCss;\n };\n Blocks: {\n /** Extra content below the body text. */\n default: [];\n };\n}\n\n/**\n * Upstream's default notification icons (EuiNotificationIcon) and colors,\n * as in EuiCallOut; `warningStatic` has its own two-tone colors.\n */\nconst DEFAULT_ICONS: Record<EuiToastColor, { type: string; color?: string }> =\n {\n primary: { type: 'infoFill', color: 'primary' },\n success: { type: 'checkCircleFill', color: 'success' },\n warning: { type: 'warningStatic' },\n danger: { type: 'errorFill', color: 'danger' }\n };\n\nconst isText = isTextNode;\n\n/** Native Ember toast on the upstream EUI 123 / Borealis factories. */\nexport default class EuiToast extends Component<EuiToastSignature> {\n @service declare euiI18n: EuiI18n;\n\n @cached\n get context() {\n return getEuiThemeContext(this);\n }\n\n @cached\n get styles() {\n return useEuiBorealisStyles(this.context, euiToastStyles);\n }\n\n get color(): EuiToastColor | 'none' {\n const color = this.args.color;\n if (color === 'none') return 'none';\n return color && Object.prototype.hasOwnProperty.call(DEFAULT_ICONS, color)\n ? color\n : 'primary';\n }\n\n /** Upstream's `borderStrong<Color>` highlight token. */\n @cached\n get typeColor(): string {\n if (this.color === 'none') return 'transparent';\n const colors = this.context.upstream.euiTheme.colors as unknown as Record<\n string,\n string\n >;\n return colors[getTokenName('borderStrong', this.color)]!;\n }\n\n @cached\n get classes(): string {\n const colors = this.context.upstream.euiTheme.colors as unknown as Record<\n string,\n string\n >;\n const color = this.color;\n const animationMs = this.args.animationMs;\n // Upstream sets these as inline custom properties; a class keeps the\n // caller's `style` attribute intact.\n const variables: Record<string, string> = {\n '--euiToastTypeColor': this.typeColor,\n '--euiToastTypeBackgroundColor':\n color === 'none'\n ? 'transparent'\n : colors[getTokenName('backgroundLight', color)]!\n };\n if (animationMs) variables['--euiToastAnimationMs'] = `${animationMs}ms`;\n return euiClass(\n this.context,\n { boxSizing: 'border-box' },\n this.styles.euiToast,\n variables,\n this.args.css\n );\n }\n\n @cached\n get decorClass(): string {\n return euiClass(\n this.context,\n this.styles.decor,\n Boolean(this.args.animationMs) && this.styles.hasAnimation\n );\n }\n\n @cached\n get srOnlyClass(): string {\n return euiScreenReaderOnlyClass(this.context);\n }\n\n @cached\n get wrapperClass(): string {\n return euiClass(this.context, this.styles.wrapper);\n }\n\n @cached\n get bodyClass(): string {\n return euiClass(this.context, this.styles.body);\n }\n\n @cached\n get contentClass(): string {\n return euiClass(this.context, this.styles.content);\n }\n\n @cached\n get textClass(): string {\n return euiClass(this.context, this.styles.text);\n }\n\n @cached\n get actionsClass(): string {\n return euiClass(this.context, this.styles.actions);\n }\n\n /** Upstream renders EuiTitle size `xs` with the header styles as `css`. */\n @cached\n get headerCss(): EuiCss {\n const header = useEuiBorealisStyles(this.context, euiToastHeaderStyles);\n return [header.euiToastHeader, this.args.onClose && header.hasDismissButton];\n }\n\n /** Icon styles composed into EuiIcon's own class (`@css`). */\n @cached\n get iconCss(): EuiCss {\n const icon = useEuiBorealisStyles(this.context, euiNotificationIconStyles);\n return [\n this.styles.icon,\n !this.args.iconType && icon.euiNotificationIcon,\n icon.size.l\n ];\n }\n\n get dismissCss(): EuiCss {\n return this.styles.dismissButton;\n }\n\n get defaultIcon() {\n return this.color === 'none' ? undefined : DEFAULT_ICONS[this.color];\n }\n\n /** Action buttons need a named button color. */\n get actionColor(): string {\n return this.color === 'none' ? 'text' : this.color;\n }\n\n /** `@body`, else upstream's `@text`. */\n get body(): string | EuiRenderNodeType | undefined {\n return this.args.body ?? this.args.text;\n }\n\n /** The body as text, for markdown. */\n get bodyText(): string {\n return isTextNode(this.body) ? String(this.body) : '';\n }\n\n get dismissLabel(): string {\n return this.euiI18n.lookupToken('euiToast.dismissToast', 'Dismiss toast');\n }\n\n get newNotificationText(): string {\n return this.euiI18n.lookupToken(\n 'euiToast.newNotification',\n 'A new notification appears'\n );\n }\n\n <template>\n <div class=\"euiToast euiToast--{{this.color}} {{this.classes}}\" ...attributes>\n <div class=\"euiToastDecor {{this.decorClass}}\" role=\"presentation\"></div>\n <p class={{this.srOnlyClass}}>{{this.newNotificationText}}</p>\n <div class={{this.wrapperClass}}>\n <div class={{this.bodyClass}}>\n {{#if @iconType}}\n <EuiIcon\n @type={{@iconType}}\n @size=\"l\"\n @color={{this.typeColor}}\n @css={{this.iconCss}}\n aria-hidden=\"true\"\n />\n {{else if this.defaultIcon}}\n <EuiIcon\n class=\"euiNotificationIcon\"\n @type={{this.defaultIcon.type}}\n @size=\"l\"\n @color={{this.defaultIcon.color}}\n @css={{this.iconCss}}\n aria-hidden=\"true\"\n />\n {{/if}}\n <div class={{this.contentClass}}>\n {{#if @title}}\n <EuiTitle\n class=\"euiToastHeader__title\"\n data-test-subj=\"euiToastHeader__title\"\n @tagName=\"p\"\n @size=\"xs\"\n @css={{this.headerCss}}\n >{{@title}}</EuiTitle>\n {{/if}}\n {{! Upstream DOM order: the dismiss button follows the title, so\n screen reader users know what it dismisses. }}\n {{#if (and @title @onClose)}}\n <EuiButtonIcon\n @iconType=\"cross\"\n @color=\"text\"\n @size=\"xs\"\n @css={{this.dismissCss}}\n aria-label={{this.dismissLabel}}\n data-test-subj=\"toastCloseButton\"\n {{on \"click\" this.onDismiss}}\n />\n {{/if}}\n {{#if (or this.body (has-block))}}\n <div class={{this.textClass}} data-test-subj=\"euiToastBody\">\n {{#if this.body}}\n {{#if (and @useMarkdownFormat (isText this.body))}}\n <div class=\"euiToast__text\" data-test-subj=\"euiToastText\">\n <EuiMarkdownFormat @textSize=\"s\" @value={{this.bodyText}} />\n </div>\n {{else}}\n <EuiText\n class=\"euiToast__text\"\n @size=\"s\"\n @color=\"default\"\n data-test-subj=\"euiToastText\"\n ><EuiRenderNode @value={{this.body}} /></EuiText>\n {{/if}}\n {{/if}}\n {{#if (has-block)}}\n <EuiText\n class=\"euiToast__additionalContent\"\n @size=\"s\"\n @color=\"default\"\n data-test-subj=\"euiToastAdditionalContent\"\n >{{yield}}</EuiText>\n {{/if}}\n </div>\n {{/if}}\n {{#if (and @onClose (if @title false true))}}\n <EuiButtonIcon\n @iconType=\"cross\"\n @color=\"text\"\n @size=\"xs\"\n @css={{this.dismissCss}}\n aria-label={{this.dismissLabel}}\n data-test-subj=\"toastCloseButton\"\n {{on \"click\" this.onDismiss}}\n />\n {{/if}}\n </div>\n </div>\n {{#if (or @actionProps.primary @actionProps.secondary)}}\n <div class={{this.actionsClass}}>\n {{#if @actionProps.primary}}\n <EuiButton\n @size=\"s\"\n @color={{this.actionColor}}\n @href={{@actionProps.primary.href}}\n data-test-subj={{@actionProps.primary.data-test-subj}}\n {{on \"click\" this.onPrimary}}\n >{{@actionProps.primary.children}}</EuiButton>\n {{/if}}\n {{#if @actionProps.secondary}}\n <EuiButtonEmpty\n @size=\"s\"\n @color={{this.actionColor}}\n @href={{@actionProps.secondary.href}}\n data-test-subj={{@actionProps.secondary.data-test-subj}}\n {{on \"click\" this.onSecondary}}\n >{{@actionProps.secondary.children}}</EuiButtonEmpty>\n {{/if}}\n </div>\n {{/if}}\n </div>\n </div>\n </template>\n\n onDismiss = (): void => {\n this.args.onClose?.();\n };\n\n onPrimary = (event: MouseEvent): void => {\n this.args.actionProps?.primary?.onClick?.(event);\n };\n\n onSecondary = (event: MouseEvent): void => {\n this.args.actionProps?.secondary?.onClick?.(event);\n };\n}\n"],"names":["DEFAULT_ICONS","primary","type","color","success","warning","danger","isText","isTextNode","EuiToast","Component","g","prototype","service","i","context","getEuiThemeContext","n","cached","styles","useEuiBorealisStyles","euiToastStyles","args","Object","hasOwnProperty","call","typeColor","colors","upstream","euiTheme","getTokenName","classes","animationMs","variables","euiClass","boxSizing","euiToast","css","decorClass","decor","Boolean","hasAnimation","srOnlyClass","euiScreenReaderOnlyClass","wrapperClass","wrapper","bodyClass","body","contentClass","content","textClass","text","actionsClass","actions","headerCss","header","euiToastHeaderStyles","euiToastHeader","onClose","hasDismissButton","iconCss","icon","euiNotificationIconStyles","iconType","euiNotificationIcon","size","l","dismissCss","dismissButton","defaultIcon","undefined","actionColor","bodyText","String","dismissLabel","euiI18n","lookupToken","newNotificationText","setComponentTemplate","precompileTemplate","strictMode","scope","EuiIcon","EuiTitle","and","EuiButtonIcon","on","or","EuiMarkdownFormat","EuiText","EuiRenderNode","EuiButton","EuiButtonEmpty","onDismiss","onPrimary","event","actionProps","onClick","onSecondary","secondary"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"eui-toast.js","sources":["../../src/components/eui-toast.gts"],"sourcesContent":["import Component from '@glimmer/component';\nimport { cached } from '@glimmer/tracking';\nimport { on } from '@ember/modifier';\nimport { service } from '@ember/service';\nimport { isHTMLSafe } from '@ember/template';\n\nimport { getTokenName } from '@elastic/eui-theme-common';\nimport { and, or } from 'ember-truth-helpers';\n\nimport EuiRenderNode, { isTextNode } from '../-private/eui-render-node.gts';\nimport { getEuiThemeContext } from '../utils/emotion/consume.ts';\nimport { euiClass, useEuiBorealisStyles } from '../utils/eui/styles.ts';\nimport {\n euiNotificationIconStyles,\n euiToastHeaderStyles,\n euiToastStyles\n} from '../utils/eui/styles.generated.ts';\nimport EuiButton from './eui-button.gts';\nimport EuiButtonEmpty from './eui-button-empty.gts';\nimport EuiButtonIcon from './eui-button-icon.gts';\nimport EuiIcon from './eui-icon.gts';\nimport EuiTitle from './eui-title.gts';\nimport EuiMarkdownFormat from './eui-markdown-format.gts';\nimport { euiScreenReaderOnlyClass } from './eui-screen-reader-only.gts';\nimport EuiText from './eui-text.gts';\n\nimport type { EuiRenderNode as EuiRenderNodeType } from '../-private/eui-render-node.gts';\nimport type EuiI18n from '../services/eui-i18n';\nimport type { EuiCss } from '../utils/eui/styles.ts';\nimport type { EuiIconSignature } from './eui-icon';\n\nexport type EuiToastColor = 'primary' | 'success' | 'warning' | 'danger';\n\n/** One action button of a toast (upstream `actionProps.primary/secondary`). */\nexport interface EuiToastAction {\n /** The button's text. */\n children: string;\n /** Called when the button is clicked. */\n onClick?: (event: MouseEvent) => void;\n /** Makes the button a link. */\n href?: string;\n /** `data-test-subj` of the button. */\n 'data-test-subj'?: string;\n}\n\nexport interface IEuiToast {\n /** The title of the toast. */\n title?: string;\n /**\n * The body of the toast (markdown with `useMarkdownFormat`), also\n * accepted as upstream's `text`. Text, or a component for rich content (a template-only\n * component or `(component Foo arg=…)`), e.g. from the `euiToaster`\n * service, which cannot pass blocks. Markdown needs text.\n */\n body?: string | EuiRenderNodeType;\n /**\n * Same as `body`, under upstream's name; `body` wins when both are set.\n */\n text?: string | EuiRenderNodeType;\n /**\n * `'primary'`, `'success'`, `'warning'` or `'danger'`: the highlight bar\n * and default icon. `'none'` (Ember only) renders a neutral toast without\n * a highlight or default icon. Defaults to `'primary'`.\n */\n color?: EuiToastColor | 'none';\n /**\n * Icon before the content, e.g. `'check'` or `'warning'`, colored like the\n * highlight. Without it, a notification icon matching `@color` is shown.\n */\n iconType?: EuiIconSignature['Args']['type'];\n /** Shows a dismiss (cross) button calling this function. */\n onClose?: () => void;\n /** Renders `body` as markdown (EuiMarkdownFormat). */\n useMarkdownFormat?: boolean;\n /**\n * Action buttons below the content: `primary` renders an `EuiButton`,\n * `secondary` an `EuiButtonEmpty`, both small and in the toast's color.\n */\n actionProps?: { primary?: EuiToastAction; secondary?: EuiToastAction };\n}\n\n/**\n * A notification card. Usually shown through the `euiToaster` service and\n * EuiGlobalToastList rather than rendered directly.\n */\nexport interface EuiToastSignature {\n Element: HTMLDivElement;\n Args: IEuiToast & {\n /**\n * Duration of the highlight bar's countdown animation, in ms (set by\n * EuiGlobalToastList to the toast's lifetime). Runs only when motion is\n * allowed (`prefers-reduced-motion: no-preference`).\n */\n animationMs?: number;\n /**\n * Extra styles composed last into this component's class (like upstream's\n * `css` prop). Prefer this to an extra class when styling it from a parent.\n */\n css?: EuiCss;\n };\n Blocks: {\n /** Extra content below the body text. */\n default: [];\n };\n}\n\n/**\n * Upstream's default notification icons (EuiNotificationIcon) and colors,\n * as in EuiCallOut; `warningStatic` has its own two-tone colors.\n */\nconst DEFAULT_ICONS: Record<EuiToastColor, { type: string; color?: string }> =\n {\n primary: { type: 'infoFill', color: 'primary' },\n success: { type: 'checkCircleFill', color: 'success' },\n warning: { type: 'warningStatic' },\n danger: { type: 'errorFill', color: 'danger' }\n };\n\n/** Text for markdown; `htmlSafe` text is HTML already. */\nconst isMarkdownText = (value: unknown): boolean =>\n isTextNode(value) && !isHTMLSafe(value);\n\n/** Native Ember toast on the upstream EUI 123 / Borealis factories. */\nexport default class EuiToast extends Component<EuiToastSignature> {\n @service declare euiI18n: EuiI18n;\n\n @cached\n get context() {\n return getEuiThemeContext(this);\n }\n\n @cached\n get styles() {\n return useEuiBorealisStyles(this.context, euiToastStyles);\n }\n\n get color(): EuiToastColor | 'none' {\n const color = this.args.color;\n if (color === 'none') return 'none';\n return color && Object.prototype.hasOwnProperty.call(DEFAULT_ICONS, color)\n ? color\n : 'primary';\n }\n\n /** Upstream's `borderStrong<Color>` highlight token. */\n @cached\n get typeColor(): string {\n if (this.color === 'none') return 'transparent';\n const colors = this.context.upstream.euiTheme.colors as unknown as Record<\n string,\n string\n >;\n return colors[getTokenName('borderStrong', this.color)]!;\n }\n\n @cached\n get classes(): string {\n const colors = this.context.upstream.euiTheme.colors as unknown as Record<\n string,\n string\n >;\n const color = this.color;\n const animationMs = this.args.animationMs;\n // Upstream sets these as inline custom properties; a class keeps the\n // caller's `style` attribute intact.\n const variables: Record<string, string> = {\n '--euiToastTypeColor': this.typeColor,\n '--euiToastTypeBackgroundColor':\n color === 'none'\n ? 'transparent'\n : colors[getTokenName('backgroundLight', color)]!\n };\n if (animationMs) variables['--euiToastAnimationMs'] = `${animationMs}ms`;\n return euiClass(\n this.context,\n { boxSizing: 'border-box' },\n this.styles.euiToast,\n variables,\n this.args.css\n );\n }\n\n @cached\n get decorClass(): string {\n return euiClass(\n this.context,\n this.styles.decor,\n Boolean(this.args.animationMs) && this.styles.hasAnimation\n );\n }\n\n @cached\n get srOnlyClass(): string {\n return euiScreenReaderOnlyClass(this.context);\n }\n\n @cached\n get wrapperClass(): string {\n return euiClass(this.context, this.styles.wrapper);\n }\n\n @cached\n get bodyClass(): string {\n return euiClass(this.context, this.styles.body);\n }\n\n @cached\n get contentClass(): string {\n return euiClass(this.context, this.styles.content);\n }\n\n @cached\n get textClass(): string {\n return euiClass(this.context, this.styles.text);\n }\n\n @cached\n get actionsClass(): string {\n return euiClass(this.context, this.styles.actions);\n }\n\n /** Upstream renders EuiTitle size `xs` with the header styles as `css`. */\n @cached\n get headerCss(): EuiCss {\n const header = useEuiBorealisStyles(this.context, euiToastHeaderStyles);\n return [header.euiToastHeader, this.args.onClose && header.hasDismissButton];\n }\n\n /** Icon styles composed into EuiIcon's own class (`@css`). */\n @cached\n get iconCss(): EuiCss {\n const icon = useEuiBorealisStyles(this.context, euiNotificationIconStyles);\n return [\n this.styles.icon,\n !this.args.iconType && icon.euiNotificationIcon,\n icon.size.l\n ];\n }\n\n get dismissCss(): EuiCss {\n return this.styles.dismissButton;\n }\n\n get defaultIcon() {\n return this.color === 'none' ? undefined : DEFAULT_ICONS[this.color];\n }\n\n /** Action buttons need a named button color. */\n get actionColor(): string {\n return this.color === 'none' ? 'text' : this.color;\n }\n\n /** `@body`, else upstream's `@text`. */\n get body(): string | EuiRenderNodeType | undefined {\n return this.args.body ?? this.args.text;\n }\n\n /** The body as text, for markdown. */\n get bodyText(): string {\n return isMarkdownText(this.body) ? String(this.body) : '';\n }\n\n get dismissLabel(): string {\n return this.euiI18n.lookupToken('euiToast.dismissToast', 'Dismiss toast');\n }\n\n get newNotificationText(): string {\n return this.euiI18n.lookupToken(\n 'euiToast.newNotification',\n 'A new notification appears'\n );\n }\n\n <template>\n <div class=\"euiToast euiToast--{{this.color}} {{this.classes}}\" ...attributes>\n <div class=\"euiToastDecor {{this.decorClass}}\" role=\"presentation\"></div>\n <p class={{this.srOnlyClass}}>{{this.newNotificationText}}</p>\n <div class={{this.wrapperClass}}>\n <div class={{this.bodyClass}}>\n {{#if @iconType}}\n <EuiIcon\n @type={{@iconType}}\n @size=\"l\"\n @color={{this.typeColor}}\n @css={{this.iconCss}}\n aria-hidden=\"true\"\n />\n {{else if this.defaultIcon}}\n <EuiIcon\n class=\"euiNotificationIcon\"\n @type={{this.defaultIcon.type}}\n @size=\"l\"\n @color={{this.defaultIcon.color}}\n @css={{this.iconCss}}\n aria-hidden=\"true\"\n />\n {{/if}}\n <div class={{this.contentClass}}>\n {{#if @title}}\n <EuiTitle\n class=\"euiToastHeader__title\"\n data-test-subj=\"euiToastHeader__title\"\n @tagName=\"p\"\n @size=\"xs\"\n @css={{this.headerCss}}\n >{{@title}}</EuiTitle>\n {{/if}}\n {{! Upstream DOM order: the dismiss button follows the title, so\n screen reader users know what it dismisses. }}\n {{#if (and @title @onClose)}}\n <EuiButtonIcon\n @iconType=\"cross\"\n @color=\"text\"\n @size=\"xs\"\n @css={{this.dismissCss}}\n aria-label={{this.dismissLabel}}\n data-test-subj=\"toastCloseButton\"\n {{on \"click\" this.onDismiss}}\n />\n {{/if}}\n {{#if (or this.body (has-block))}}\n <div class={{this.textClass}} data-test-subj=\"euiToastBody\">\n {{#if this.body}}\n {{#if (and @useMarkdownFormat (isMarkdownText this.body))}}\n <div class=\"euiToast__text\" data-test-subj=\"euiToastText\">\n <EuiMarkdownFormat @textSize=\"s\" @value={{this.bodyText}} />\n </div>\n {{else}}\n <EuiText\n class=\"euiToast__text\"\n @size=\"s\"\n @color=\"default\"\n data-test-subj=\"euiToastText\"\n ><EuiRenderNode @value={{this.body}} /></EuiText>\n {{/if}}\n {{/if}}\n {{#if (has-block)}}\n <EuiText\n class=\"euiToast__additionalContent\"\n @size=\"s\"\n @color=\"default\"\n data-test-subj=\"euiToastAdditionalContent\"\n >{{yield}}</EuiText>\n {{/if}}\n </div>\n {{/if}}\n {{#if (and @onClose (if @title false true))}}\n <EuiButtonIcon\n @iconType=\"cross\"\n @color=\"text\"\n @size=\"xs\"\n @css={{this.dismissCss}}\n aria-label={{this.dismissLabel}}\n data-test-subj=\"toastCloseButton\"\n {{on \"click\" this.onDismiss}}\n />\n {{/if}}\n </div>\n </div>\n {{#if (or @actionProps.primary @actionProps.secondary)}}\n <div class={{this.actionsClass}}>\n {{#if @actionProps.primary}}\n <EuiButton\n @size=\"s\"\n @color={{this.actionColor}}\n @href={{@actionProps.primary.href}}\n data-test-subj={{@actionProps.primary.data-test-subj}}\n {{on \"click\" this.onPrimary}}\n >{{@actionProps.primary.children}}</EuiButton>\n {{/if}}\n {{#if @actionProps.secondary}}\n <EuiButtonEmpty\n @size=\"s\"\n @color={{this.actionColor}}\n @href={{@actionProps.secondary.href}}\n data-test-subj={{@actionProps.secondary.data-test-subj}}\n {{on \"click\" this.onSecondary}}\n >{{@actionProps.secondary.children}}</EuiButtonEmpty>\n {{/if}}\n </div>\n {{/if}}\n </div>\n </div>\n </template>\n\n onDismiss = (): void => {\n this.args.onClose?.();\n };\n\n onPrimary = (event: MouseEvent): void => {\n this.args.actionProps?.primary?.onClick?.(event);\n };\n\n onSecondary = (event: MouseEvent): void => {\n this.args.actionProps?.secondary?.onClick?.(event);\n };\n}\n"],"names":["DEFAULT_ICONS","primary","type","color","success","warning","danger","isMarkdownText","value","isTextNode","isHTMLSafe","EuiToast","Component","g","prototype","service","i","context","getEuiThemeContext","n","cached","styles","useEuiBorealisStyles","euiToastStyles","args","Object","hasOwnProperty","call","typeColor","colors","upstream","euiTheme","getTokenName","classes","animationMs","variables","euiClass","boxSizing","euiToast","css","decorClass","decor","Boolean","hasAnimation","srOnlyClass","euiScreenReaderOnlyClass","wrapperClass","wrapper","bodyClass","body","contentClass","content","textClass","text","actionsClass","actions","headerCss","header","euiToastHeaderStyles","euiToastHeader","onClose","hasDismissButton","iconCss","icon","euiNotificationIconStyles","iconType","euiNotificationIcon","size","l","dismissCss","dismissButton","defaultIcon","undefined","actionColor","bodyText","String","dismissLabel","euiI18n","lookupToken","newNotificationText","setComponentTemplate","precompileTemplate","strictMode","scope","EuiIcon","EuiTitle","and","EuiButtonIcon","on","or","EuiMarkdownFormat","EuiText","EuiRenderNode","EuiButton","EuiButtonEmpty","onDismiss","onPrimary","event","actionProps","onClick","onSecondary","secondary"],"mappings":"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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
|
+
import { removeAccents } from '../../-private/accents.js';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* Combo box helpers. The group label style port it needs is shared with
|
|
3
5
|
* EuiSelectableList (`utils/eui/selectable.ts`).
|
|
4
6
|
*/
|
|
5
|
-
|
|
6
7
|
/**
|
|
7
8
|
* Ember has no React global reset: box sizing for the combo box's own
|
|
8
9
|
* elements (upstream `*` reset) and the list's `button`-free rows.
|
|
@@ -78,9 +79,6 @@ function createPartialStringEqualityOptionMatcher(searchField, ignoreAccents = f
|
|
|
78
79
|
return fold(transformForCaseSensitivity(comboBoxOptionLabel(option, searchField).trim(), isCaseSensitive)).includes(fold(normalizedSearchValue));
|
|
79
80
|
};
|
|
80
81
|
}
|
|
81
|
-
|
|
82
|
-
/** "Médico" -> "Medico": accents (any combining mark) off. */
|
|
83
|
-
const removeAccents = text => text.normalize('NFD').replace(/\p{M}/gu, '');
|
|
84
82
|
const keyOf = option => option && typeof option === 'object' ? option.key : undefined;
|
|
85
83
|
|
|
86
84
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"combo-box.js","sources":["../../../src/utils/eui/combo-box.ts"],"sourcesContent":["/**\n * Combo box helpers. The group label style port it needs is shared with\n * EuiSelectableList (`utils/eui/selectable.ts`).\n */\nimport type { CSSObject } from '@emotion/css/create-instance';\n\n/**\n * Ember has no React global reset: box sizing for the combo box's own\n * elements (upstream `*` reset) and the list's `button`-free rows.\n */\nexport const comboBoxBoxReset: CSSObject = {\n boxSizing: 'border-box',\n '& :where(*, *::before, *::after)': { boxSizing: 'border-box' }\n};\n\n/** The text of an option: strings as they are, else `label` (or `@searchField`). */\nexport function comboBoxOptionLabel(option: unknown, searchField?: string): string {\n if (typeof option === 'string') return option;\n if (typeof option === 'number') return String(option);\n if (option && typeof option === 'object') {\n const record = option as Record<string, unknown>;\n const value = record[searchField ?? 'label'] ?? record['label'];\n\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value);\n }\n }\n\n return '';\n}\n\n/*\n * Matching helpers below are ported from @elastic/eui 123.1.0\n * `components/combo_box/matching_options.ts` and `combo_box/utils.tsx`.\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under\n * one or more contributor license agreements. Licensed under the Elastic\n * License 2.0 or the Server Side Public License, v 1; see vendor/eui-latest.\n */\n\n/** Upstream `SortMatchesBy`. */\nexport type EuiComboBoxSortMatchesBy = 'none' | 'startsWith';\n\n/** Upstream `transformForCaseSensitivity`. */\nexport const transformForCaseSensitivity = (\n text: string,\n isCaseSensitive?: boolean\n): string => (isCaseSensitive ? text : text.toLowerCase());\n\n/**\n * A group: upstream's `{ label, options }` or ember-power-select's\n * `{ groupName, options }`.\n */\nexport const isComboBoxGroup = (\n option: unknown\n): option is { options: unknown[]; groupName?: string; label?: string } =>\n Boolean(\n option &&\n typeof option === 'object' &&\n Array.isArray((option as { options?: unknown }).options)\n );\n\n/** The title of a group (`groupName`, else upstream's `label`). */\nexport const comboBoxGroupLabel = (group: {\n groupName?: string;\n label?: string;\n}): string => String(group.groupName ?? group.label ?? '');\n\n/** Upstream `flattenOptionGroups`: the options of groups, in one list. */\nexport function flattenOptionGroups(options: readonly unknown[]): unknown[] {\n return options.reduce<unknown[]>((all, option) => {\n if (isComboBoxGroup(option)) return all.concat(option.options);\n all.push(option);\n\n return all;\n }, []);\n}\n\n/** Upstream `EuiComboBoxOptionMatcherArgs`. */\nexport interface EuiComboBoxOptionMatcherArgs {\n /** The option being matched. */\n option: any;\n /** The search text, as typed. */\n searchValue: string;\n /** The search text trimmed, and lower case unless case-sensitive. */\n normalizedSearchValue: string;\n /** Whether matching is case-sensitive. */\n isCaseSensitive: boolean;\n}\n\n/** Upstream `EuiComboBoxOptionMatcher`: `true` when the option matches. */\nexport type EuiComboBoxOptionMatcher = (\n args: EuiComboBoxOptionMatcherArgs\n) => boolean;\n\n/**\n * Upstream `createPartialStringEqualityOptionMatcher`: options whose label\n * (trimmed) includes the normalized search text.\n */\nexport function createPartialStringEqualityOptionMatcher(\n searchField?: string,\n ignoreAccents = false\n): EuiComboBoxOptionMatcher {\n const fold = ignoreAccents ? removeAccents : (text: string) => text;\n\n return ({ option, isCaseSensitive, normalizedSearchValue }) => {\n if (!normalizedSearchValue) return true;\n\n return fold(\n transformForCaseSensitivity(\n comboBoxOptionLabel(option, searchField).trim(),\n isCaseSensitive\n )\n ).includes(fold(normalizedSearchValue));\n };\n}\n\n/** \"Médico\" -> \"Medico\": accents (any combining mark) off. */\nconst removeAccents = (text: string): string =>\n text.normalize('NFD').replace(/\\p{M}/gu, '');\n\nconst keyOf = (option: unknown): unknown =>\n option && typeof option === 'object'\n ? (option as { key?: unknown }).key\n : undefined;\n\n/**\n * Upstream's \"already selected\" test of `getMatchingOptions`: a selected\n * option has the same label (case per `isCaseSensitive`) and, when the\n * option has a `key`, the same key. The same object always is.\n */\nexport function isComboBoxOptionSelected(\n option: unknown,\n selectedOptions: readonly unknown[],\n searchField?: string,\n isCaseSensitive?: boolean\n): boolean {\n if (!selectedOptions.length) return false;\n if (selectedOptions.includes(option)) return true;\n\n const label = comboBoxOptionLabel(option, searchField);\n\n if (!label) return false;\n\n const normalized = transformForCaseSensitivity(label, isCaseSensitive);\n const key = keyOf(option);\n\n return selectedOptions.some(\n (selected) =>\n transformForCaseSensitivity(\n comboBoxOptionLabel(selected, searchField),\n isCaseSensitive\n ) === normalized &&\n (key === undefined || keyOf(selected) === key)\n );\n}\n\n/**\n * Upstream single selection check mark: the selected option has the same\n * label and key (or is the same object).\n */\nexport function isComboBoxOptionChecked(\n option: unknown,\n selectedOptions: readonly unknown[] | undefined,\n searchField?: string\n): boolean {\n const selected = selectedOptions?.[0];\n\n if (selected === undefined) return false;\n if (selected === option) return true;\n\n const label = comboBoxOptionLabel(option, searchField);\n\n return (\n Boolean(label) &&\n comboBoxOptionLabel(selected, searchField) === label &&\n keyOf(selected) === keyOf(option)\n );\n}\n\ninterface GetMatchingOptions {\n options: readonly unknown[];\n selectedOptions: readonly unknown[];\n searchValue: string;\n optionMatcher: EuiComboBoxOptionMatcher;\n searchField?: string;\n isCaseSensitive?: boolean;\n isPreFiltered?: boolean;\n showPrevSelected?: boolean;\n sortMatchesBy?: EuiComboBoxSortMatchesBy;\n}\n\n/** A group title in the flat list of matches (upstream `isGroupLabelOption`). */\nexport interface ComboBoxGroupLabel {\n isGroupLabelOption: true;\n group: { options: unknown[]; groupName?: string; label?: string };\n}\n\nexport const isComboBoxGroupLabel = (\n entry: unknown\n): entry is ComboBoxGroupLabel =>\n Boolean(\n entry &&\n typeof entry === 'object' &&\n (entry as ComboBoxGroupLabel).isGroupLabelOption === true &&\n 'group' in entry\n );\n\n/**\n * Upstream `getMatchingOptions`, as a flat list with group titles: the\n * options (not yet selected, unless `showPrevSelected`) matching the search\n * text, groups with matches preceded by their title, and with\n * `sortMatchesBy: 'startsWith'` the entries (titles included) whose label\n * starts with the search text first.\n */\nexport function getMatchingEntries({\n options,\n selectedOptions,\n searchValue,\n optionMatcher,\n searchField,\n isCaseSensitive = false,\n isPreFiltered = false,\n showPrevSelected = false,\n sortMatchesBy = 'none'\n}: GetMatchingOptions): unknown[] {\n const normalizedSearchValue = transformForCaseSensitivity(\n searchValue.trim(),\n isCaseSensitive\n );\n let entries: unknown[] = [];\n\n const collect = (accumulator: unknown[], option: unknown) => {\n // only options not selected yet, unless requested\n if (\n !showPrevSelected &&\n isComboBoxOptionSelected(\n option,\n selectedOptions,\n searchField,\n isCaseSensitive\n )\n ) {\n return;\n }\n\n if (\n isPreFiltered ||\n !normalizedSearchValue ||\n optionMatcher({\n option,\n searchValue,\n normalizedSearchValue,\n isCaseSensitive\n })\n ) {\n accumulator.push(option);\n }\n };\n\n options.forEach((option) => {\n if (isComboBoxGroup(option)) {\n const matches: unknown[] = [];\n\n option.options.forEach((child) => collect(matches, child));\n\n if (matches.length > 0) {\n entries.push({ isGroupLabelOption: true, group: option });\n // concat over spreading, for large groups (upstream)\n entries = entries.concat(matches);\n }\n } else {\n collect(entries, option);\n }\n });\n\n if (sortMatchesBy === 'startsWith') {\n const startWith: unknown[] = [];\n const others: unknown[] = [];\n\n entries.forEach((entry) => {\n const label = isComboBoxGroupLabel(entry)\n ? comboBoxGroupLabel(entry.group)\n : comboBoxOptionLabel(entry, searchField);\n\n (transformForCaseSensitivity(label, isCaseSensitive).startsWith(\n normalizedSearchValue\n )\n ? startWith\n : others\n ).push(entry);\n });\n\n return [...startWith, ...others];\n }\n\n return entries;\n}\n\n/**\n * The flat list of matches as ember-power-select options: every option\n * after a group title belongs to that group (as rendered upstream), the\n * others are top level. Groups are copies with the matching options (and a\n * `groupName`), the options themselves are never copied.\n */\nexport function entriesToPowerSelectOptions(entries: readonly unknown[]) {\n const result: unknown[] = [];\n let current: { options: unknown[]; groupName?: string } | undefined;\n\n entries.forEach((entry) => {\n if (isComboBoxGroupLabel(entry)) {\n current = {\n ...entry.group,\n groupName: comboBoxGroupLabel(entry.group),\n options: []\n };\n result.push(current);\n } else if (current) {\n current.options.push(entry);\n } else {\n result.push(entry);\n }\n });\n\n return result;\n}\n\n/**\n * Groups and their options in one list (group objects included), the rows\n * of EuiComboBox's list and upstream's `matchingOptions` order.\n */\nexport function flattenComboBoxRows(options: readonly unknown[]): unknown[] {\n const rows: unknown[] = [];\n\n options.forEach((option) => {\n if (isComboBoxGroup(option) && 'groupName' in option) {\n rows.push(option);\n option.options.forEach((child) => rows.push(child));\n } else {\n rows.push(option);\n }\n });\n\n return rows;\n}\n\n/** An option that can be highlighted or chosen (not a group, not disabled). */\nexport const isSelectableRow = (row: unknown, group?: unknown): boolean =>\n !(isComboBoxGroup(row) && 'groupName' in (row as object)) &&\n !(\n row &&\n typeof row === 'object' &&\n (row as { disabled?: boolean }).disabled === true\n ) &&\n !(\n group &&\n typeof group === 'object' &&\n (group as { disabled?: boolean }).disabled === true\n );\n\n/**\n * Upstream `findNextSelectableOptionIndex`: from `startIndex`, the first\n * selectable row in `direction`, wrapping around; `-1` when none.\n */\nexport function findNextSelectableIndex(\n rows: readonly unknown[],\n selectable: (index: number) => boolean,\n startIndex: number,\n direction: 1 | -1 = 1\n): number {\n if (!rows.length) return -1;\n\n let index = startIndex;\n\n for (let count = 0; count < rows.length; count++) {\n if (selectable(index)) return index;\n\n index = (index + direction + rows.length) % rows.length;\n }\n\n return -1;\n}\n\n/**\n * Upstream `getSelectedOptionForSearchValue`: the selected option whose\n * label equals the text.\n */\nexport function selectedOptionForSearchValue(\n selectedOptions: readonly unknown[],\n searchValue: string,\n searchField: string | undefined,\n isCaseSensitive?: boolean\n): unknown {\n const search = transformForCaseSensitivity(searchValue, isCaseSensitive);\n\n return selectedOptions.find(\n (option) =>\n transformForCaseSensitivity(\n comboBoxOptionLabel(option, searchField),\n isCaseSensitive\n ) === search\n );\n}\n\n/**\n * Upstream `EuiComboBoxOptionAppendPrepend` spacing: margin between an\n * option's `prepend` / `append` and its text, with block icons so they\n * align with the text.\n */\nexport function comboBoxAppendPrependStyles(\n margin: string\n): { prepend: CSSObject; append: CSSObject } {\n const centerIcons = { '.euiIcon': { display: 'block' } };\n\n return {\n prepend: { marginInlineEnd: margin, ...centerIcons },\n append: { marginInlineStart: margin, ...centerIcons }\n };\n}\n\n/**\n * Option `prepend` / `append` and EuiComboBox's `@prepend` / `@append`:\n * text, or a component (rendered with the option as `@option`).\n */\nexport const isTextNode = (value: unknown): boolean =>\n typeof value === 'string' ||\n typeof value === 'number' ||\n // htmlSafe strings render as HTML, like text\n (Boolean(value) &&\n typeof value === 'object' &&\n typeof (value as { toHTML?: unknown }).toHTML === 'function');\n"],"names":["comboBoxBoxReset","boxSizing","comboBoxOptionLabel","option","searchField","String","record","value","transformForCaseSensitivity","text","isCaseSensitive","toLowerCase","isComboBoxGroup","Boolean","Array","isArray","options","comboBoxGroupLabel","group","groupName","label","flattenOptionGroups","reduce","all","concat","push","createPartialStringEqualityOptionMatcher","ignoreAccents","fold","removeAccents","normalizedSearchValue","trim","includes","normalize","replace","keyOf","key","undefined","isComboBoxOptionSelected","selectedOptions","length","normalized","some","selected","isComboBoxOptionChecked","isComboBoxGroupLabel","entry","isGroupLabelOption","getMatchingEntries","searchValue","optionMatcher","isPreFiltered","showPrevSelected","sortMatchesBy","entries","collect","accumulator","forEach","matches","child","startWith","others","startsWith","entriesToPowerSelectOptions","result","current","flattenComboBoxRows","rows","isSelectableRow","row","disabled","findNextSelectableIndex","selectable","startIndex","direction","index","count","selectedOptionForSearchValue","search","find","comboBoxAppendPrependStyles","margin","centerIcons","display","prepend","marginInlineEnd","append","marginInlineStart","isTextNode","toHTML"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"combo-box.js","sources":["../../../src/utils/eui/combo-box.ts"],"sourcesContent":["/**\n * Combo box helpers. The group label style port it needs is shared with\n * EuiSelectableList (`utils/eui/selectable.ts`).\n */\nimport { removeAccents } from '../../-private/accents.ts';\n\nimport type { CSSObject } from '@emotion/css/create-instance';\n\n/**\n * Ember has no React global reset: box sizing for the combo box's own\n * elements (upstream `*` reset) and the list's `button`-free rows.\n */\nexport const comboBoxBoxReset: CSSObject = {\n boxSizing: 'border-box',\n '& :where(*, *::before, *::after)': { boxSizing: 'border-box' }\n};\n\n/** The text of an option: strings as they are, else `label` (or `@searchField`). */\nexport function comboBoxOptionLabel(option: unknown, searchField?: string): string {\n if (typeof option === 'string') return option;\n if (typeof option === 'number') return String(option);\n if (option && typeof option === 'object') {\n const record = option as Record<string, unknown>;\n const value = record[searchField ?? 'label'] ?? record['label'];\n\n if (typeof value === 'string' || typeof value === 'number') {\n return String(value);\n }\n }\n\n return '';\n}\n\n/*\n * Matching helpers below are ported from @elastic/eui 123.1.0\n * `components/combo_box/matching_options.ts` and `combo_box/utils.tsx`.\n * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under\n * one or more contributor license agreements. Licensed under the Elastic\n * License 2.0 or the Server Side Public License, v 1; see vendor/eui-latest.\n */\n\n/** Upstream `SortMatchesBy`. */\nexport type EuiComboBoxSortMatchesBy = 'none' | 'startsWith';\n\n/** Upstream `transformForCaseSensitivity`. */\nexport const transformForCaseSensitivity = (\n text: string,\n isCaseSensitive?: boolean\n): string => (isCaseSensitive ? text : text.toLowerCase());\n\n/**\n * A group: upstream's `{ label, options }` or ember-power-select's\n * `{ groupName, options }`.\n */\nexport const isComboBoxGroup = (\n option: unknown\n): option is { options: unknown[]; groupName?: string; label?: string } =>\n Boolean(\n option &&\n typeof option === 'object' &&\n Array.isArray((option as { options?: unknown }).options)\n );\n\n/** The title of a group (`groupName`, else upstream's `label`). */\nexport const comboBoxGroupLabel = (group: {\n groupName?: string;\n label?: string;\n}): string => String(group.groupName ?? group.label ?? '');\n\n/** Upstream `flattenOptionGroups`: the options of groups, in one list. */\nexport function flattenOptionGroups(options: readonly unknown[]): unknown[] {\n return options.reduce<unknown[]>((all, option) => {\n if (isComboBoxGroup(option)) return all.concat(option.options);\n all.push(option);\n\n return all;\n }, []);\n}\n\n/** Upstream `EuiComboBoxOptionMatcherArgs`. */\nexport interface EuiComboBoxOptionMatcherArgs {\n /** The option being matched. */\n option: any;\n /** The search text, as typed. */\n searchValue: string;\n /** The search text trimmed, and lower case unless case-sensitive. */\n normalizedSearchValue: string;\n /** Whether matching is case-sensitive. */\n isCaseSensitive: boolean;\n}\n\n/** Upstream `EuiComboBoxOptionMatcher`: `true` when the option matches. */\nexport type EuiComboBoxOptionMatcher = (\n args: EuiComboBoxOptionMatcherArgs\n) => boolean;\n\n/**\n * Upstream `createPartialStringEqualityOptionMatcher`: options whose label\n * (trimmed) includes the normalized search text.\n */\nexport function createPartialStringEqualityOptionMatcher(\n searchField?: string,\n ignoreAccents = false\n): EuiComboBoxOptionMatcher {\n const fold = ignoreAccents ? removeAccents : (text: string) => text;\n\n return ({ option, isCaseSensitive, normalizedSearchValue }) => {\n if (!normalizedSearchValue) return true;\n\n return fold(\n transformForCaseSensitivity(\n comboBoxOptionLabel(option, searchField).trim(),\n isCaseSensitive\n )\n ).includes(fold(normalizedSearchValue));\n };\n}\n\nconst keyOf = (option: unknown): unknown =>\n option && typeof option === 'object'\n ? (option as { key?: unknown }).key\n : undefined;\n\n/**\n * Upstream's \"already selected\" test of `getMatchingOptions`: a selected\n * option has the same label (case per `isCaseSensitive`) and, when the\n * option has a `key`, the same key. The same object always is.\n */\nexport function isComboBoxOptionSelected(\n option: unknown,\n selectedOptions: readonly unknown[],\n searchField?: string,\n isCaseSensitive?: boolean\n): boolean {\n if (!selectedOptions.length) return false;\n if (selectedOptions.includes(option)) return true;\n\n const label = comboBoxOptionLabel(option, searchField);\n\n if (!label) return false;\n\n const normalized = transformForCaseSensitivity(label, isCaseSensitive);\n const key = keyOf(option);\n\n return selectedOptions.some(\n (selected) =>\n transformForCaseSensitivity(\n comboBoxOptionLabel(selected, searchField),\n isCaseSensitive\n ) === normalized &&\n (key === undefined || keyOf(selected) === key)\n );\n}\n\n/**\n * Upstream single selection check mark: the selected option has the same\n * label and key (or is the same object).\n */\nexport function isComboBoxOptionChecked(\n option: unknown,\n selectedOptions: readonly unknown[] | undefined,\n searchField?: string\n): boolean {\n const selected = selectedOptions?.[0];\n\n if (selected === undefined) return false;\n if (selected === option) return true;\n\n const label = comboBoxOptionLabel(option, searchField);\n\n return (\n Boolean(label) &&\n comboBoxOptionLabel(selected, searchField) === label &&\n keyOf(selected) === keyOf(option)\n );\n}\n\ninterface GetMatchingOptions {\n options: readonly unknown[];\n selectedOptions: readonly unknown[];\n searchValue: string;\n optionMatcher: EuiComboBoxOptionMatcher;\n searchField?: string;\n isCaseSensitive?: boolean;\n isPreFiltered?: boolean;\n showPrevSelected?: boolean;\n sortMatchesBy?: EuiComboBoxSortMatchesBy;\n}\n\n/** A group title in the flat list of matches (upstream `isGroupLabelOption`). */\nexport interface ComboBoxGroupLabel {\n isGroupLabelOption: true;\n group: { options: unknown[]; groupName?: string; label?: string };\n}\n\nexport const isComboBoxGroupLabel = (\n entry: unknown\n): entry is ComboBoxGroupLabel =>\n Boolean(\n entry &&\n typeof entry === 'object' &&\n (entry as ComboBoxGroupLabel).isGroupLabelOption === true &&\n 'group' in entry\n );\n\n/**\n * Upstream `getMatchingOptions`, as a flat list with group titles: the\n * options (not yet selected, unless `showPrevSelected`) matching the search\n * text, groups with matches preceded by their title, and with\n * `sortMatchesBy: 'startsWith'` the entries (titles included) whose label\n * starts with the search text first.\n */\nexport function getMatchingEntries({\n options,\n selectedOptions,\n searchValue,\n optionMatcher,\n searchField,\n isCaseSensitive = false,\n isPreFiltered = false,\n showPrevSelected = false,\n sortMatchesBy = 'none'\n}: GetMatchingOptions): unknown[] {\n const normalizedSearchValue = transformForCaseSensitivity(\n searchValue.trim(),\n isCaseSensitive\n );\n let entries: unknown[] = [];\n\n const collect = (accumulator: unknown[], option: unknown) => {\n // only options not selected yet, unless requested\n if (\n !showPrevSelected &&\n isComboBoxOptionSelected(\n option,\n selectedOptions,\n searchField,\n isCaseSensitive\n )\n ) {\n return;\n }\n\n if (\n isPreFiltered ||\n !normalizedSearchValue ||\n optionMatcher({\n option,\n searchValue,\n normalizedSearchValue,\n isCaseSensitive\n })\n ) {\n accumulator.push(option);\n }\n };\n\n options.forEach((option) => {\n if (isComboBoxGroup(option)) {\n const matches: unknown[] = [];\n\n option.options.forEach((child) => collect(matches, child));\n\n if (matches.length > 0) {\n entries.push({ isGroupLabelOption: true, group: option });\n // concat over spreading, for large groups (upstream)\n entries = entries.concat(matches);\n }\n } else {\n collect(entries, option);\n }\n });\n\n if (sortMatchesBy === 'startsWith') {\n const startWith: unknown[] = [];\n const others: unknown[] = [];\n\n entries.forEach((entry) => {\n const label = isComboBoxGroupLabel(entry)\n ? comboBoxGroupLabel(entry.group)\n : comboBoxOptionLabel(entry, searchField);\n\n (transformForCaseSensitivity(label, isCaseSensitive).startsWith(\n normalizedSearchValue\n )\n ? startWith\n : others\n ).push(entry);\n });\n\n return [...startWith, ...others];\n }\n\n return entries;\n}\n\n/**\n * The flat list of matches as ember-power-select options: every option\n * after a group title belongs to that group (as rendered upstream), the\n * others are top level. Groups are copies with the matching options (and a\n * `groupName`), the options themselves are never copied.\n */\nexport function entriesToPowerSelectOptions(entries: readonly unknown[]) {\n const result: unknown[] = [];\n let current: { options: unknown[]; groupName?: string } | undefined;\n\n entries.forEach((entry) => {\n if (isComboBoxGroupLabel(entry)) {\n current = {\n ...entry.group,\n groupName: comboBoxGroupLabel(entry.group),\n options: []\n };\n result.push(current);\n } else if (current) {\n current.options.push(entry);\n } else {\n result.push(entry);\n }\n });\n\n return result;\n}\n\n/**\n * Groups and their options in one list (group objects included), the rows\n * of EuiComboBox's list and upstream's `matchingOptions` order.\n */\nexport function flattenComboBoxRows(options: readonly unknown[]): unknown[] {\n const rows: unknown[] = [];\n\n options.forEach((option) => {\n if (isComboBoxGroup(option) && 'groupName' in option) {\n rows.push(option);\n option.options.forEach((child) => rows.push(child));\n } else {\n rows.push(option);\n }\n });\n\n return rows;\n}\n\n/** An option that can be highlighted or chosen (not a group, not disabled). */\nexport const isSelectableRow = (row: unknown, group?: unknown): boolean =>\n !(isComboBoxGroup(row) && 'groupName' in (row as object)) &&\n !(\n row &&\n typeof row === 'object' &&\n (row as { disabled?: boolean }).disabled === true\n ) &&\n !(\n group &&\n typeof group === 'object' &&\n (group as { disabled?: boolean }).disabled === true\n );\n\n/**\n * Upstream `findNextSelectableOptionIndex`: from `startIndex`, the first\n * selectable row in `direction`, wrapping around; `-1` when none.\n */\nexport function findNextSelectableIndex(\n rows: readonly unknown[],\n selectable: (index: number) => boolean,\n startIndex: number,\n direction: 1 | -1 = 1\n): number {\n if (!rows.length) return -1;\n\n let index = startIndex;\n\n for (let count = 0; count < rows.length; count++) {\n if (selectable(index)) return index;\n\n index = (index + direction + rows.length) % rows.length;\n }\n\n return -1;\n}\n\n/**\n * Upstream `getSelectedOptionForSearchValue`: the selected option whose\n * label equals the text.\n */\nexport function selectedOptionForSearchValue(\n selectedOptions: readonly unknown[],\n searchValue: string,\n searchField: string | undefined,\n isCaseSensitive?: boolean\n): unknown {\n const search = transformForCaseSensitivity(searchValue, isCaseSensitive);\n\n return selectedOptions.find(\n (option) =>\n transformForCaseSensitivity(\n comboBoxOptionLabel(option, searchField),\n isCaseSensitive\n ) === search\n );\n}\n\n/**\n * Upstream `EuiComboBoxOptionAppendPrepend` spacing: margin between an\n * option's `prepend` / `append` and its text, with block icons so they\n * align with the text.\n */\nexport function comboBoxAppendPrependStyles(\n margin: string\n): { prepend: CSSObject; append: CSSObject } {\n const centerIcons = { '.euiIcon': { display: 'block' } };\n\n return {\n prepend: { marginInlineEnd: margin, ...centerIcons },\n append: { marginInlineStart: margin, ...centerIcons }\n };\n}\n\n/**\n * Option `prepend` / `append` and EuiComboBox's `@prepend` / `@append`:\n * text, or a component (rendered with the option as `@option`).\n */\nexport const isTextNode = (value: unknown): boolean =>\n typeof value === 'string' ||\n typeof value === 'number' ||\n // htmlSafe strings render as HTML, like text\n (Boolean(value) &&\n typeof value === 'object' &&\n typeof (value as { toHTML?: unknown }).toHTML === 'function');\n"],"names":["comboBoxBoxReset","boxSizing","comboBoxOptionLabel","option","searchField","String","record","value","transformForCaseSensitivity","text","isCaseSensitive","toLowerCase","isComboBoxGroup","Boolean","Array","isArray","options","comboBoxGroupLabel","group","groupName","label","flattenOptionGroups","reduce","all","concat","push","createPartialStringEqualityOptionMatcher","ignoreAccents","fold","removeAccents","normalizedSearchValue","trim","includes","keyOf","key","undefined","isComboBoxOptionSelected","selectedOptions","length","normalized","some","selected","isComboBoxOptionChecked","isComboBoxGroupLabel","entry","isGroupLabelOption","getMatchingEntries","searchValue","optionMatcher","isPreFiltered","showPrevSelected","sortMatchesBy","entries","collect","accumulator","forEach","matches","child","startWith","others","startsWith","entriesToPowerSelectOptions","result","current","flattenComboBoxRows","rows","isSelectableRow","row","disabled","findNextSelectableIndex","selectable","startIndex","direction","index","count","selectedOptionForSearchValue","search","find","comboBoxAppendPrependStyles","margin","centerIcons","display","prepend","marginInlineEnd","append","marginInlineStart","isTextNode","toHTML"],"mappings":"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"}
|