@lablup/ui-common 0.2.0-alpha.17 → 0.2.0-alpha.18
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 +1 -0
- package/astryx/components/Board.doc.mjs +122 -0
- package/astryx/components/Board.tsx +3 -0
- package/astryx/docs/ui-common.doc.mjs +1 -1
- package/dist/assets/components/Board/Board.css +2 -0
- package/dist/components/Board/Board.d.ts +102 -0
- package/dist/components/Board/Board.messages.d.ts +62 -0
- package/dist/components/Board/Board.messages.js +68 -0
- package/dist/components/Board/Board.messages.js.map +1 -0
- package/dist/components/Board/Board2.js +607 -0
- package/dist/components/Board/Board2.js.map +1 -0
- package/dist/components/Board/engine.d.ts +60 -0
- package/dist/components/Board/engine.js +397 -0
- package/dist/components/Board/engine.js.map +1 -0
- package/dist/components/Board/index.d.ts +4 -0
- package/dist/components/Board/index.js +3 -0
- package/dist/components/Board/layout.d.ts +81 -0
- package/dist/components/Board/layout.js +67 -0
- package/dist/components/Board/layout.js.map +1 -0
- package/dist/components/Board/scroll.d.ts +38 -0
- package/dist/components/Board/scroll.js +42 -0
- package/dist/components/Board/scroll.js.map +1 -0
- package/dist/components/DataGrid/DataGrid2.js +128 -128
- package/dist/components/DataGrid/DataGrid2.js.map +1 -1
- package/dist/components/Form/FormItem.d.ts +1 -1
- package/dist/components/PageHeader/PageHeader2.js +4 -4
- package/dist/components/PagedSelector/PagedSelector2.js +37 -37
- package/dist/components/PagedSelector/PagedSelector2.js.map +1 -1
- package/dist/components/SelectionLabel/SelectionLabel.js +4 -4
- package/dist/i18n/catalog.js +27 -25
- package/dist/i18n/catalog.js.map +1 -1
- package/dist/i18n/locales/de-DE.js +60 -0
- package/dist/i18n/locales/de-DE.js.map +1 -1
- package/dist/i18n/locales/el-GR.js +60 -0
- package/dist/i18n/locales/el-GR.js.map +1 -1
- package/dist/i18n/locales/es-ES.js +60 -0
- package/dist/i18n/locales/es-ES.js.map +1 -1
- package/dist/i18n/locales/fi-FI.js +60 -0
- package/dist/i18n/locales/fi-FI.js.map +1 -1
- package/dist/i18n/locales/fr-FR.js +60 -0
- package/dist/i18n/locales/fr-FR.js.map +1 -1
- package/dist/i18n/locales/id-ID.js +60 -0
- package/dist/i18n/locales/id-ID.js.map +1 -1
- package/dist/i18n/locales/it-IT.js +60 -0
- package/dist/i18n/locales/it-IT.js.map +1 -1
- package/dist/i18n/locales/ja-JP.js +60 -0
- package/dist/i18n/locales/ja-JP.js.map +1 -1
- package/dist/i18n/locales/ko-KR.js +60 -0
- package/dist/i18n/locales/ko-KR.js.map +1 -1
- package/dist/i18n/locales/mn-MN.js +60 -0
- package/dist/i18n/locales/mn-MN.js.map +1 -1
- package/dist/i18n/locales/ms-MY.js +60 -0
- package/dist/i18n/locales/ms-MY.js.map +1 -1
- package/dist/i18n/locales/pl-PL.js +60 -0
- package/dist/i18n/locales/pl-PL.js.map +1 -1
- package/dist/i18n/locales/pt-BR.js +60 -0
- package/dist/i18n/locales/pt-BR.js.map +1 -1
- package/dist/i18n/locales/pt-PT.js +60 -0
- package/dist/i18n/locales/pt-PT.js.map +1 -1
- package/dist/i18n/locales/ru-RU.js +60 -0
- package/dist/i18n/locales/ru-RU.js.map +1 -1
- package/dist/i18n/locales/th-TH.js +60 -0
- package/dist/i18n/locales/th-TH.js.map +1 -1
- package/dist/i18n/locales/tr-TR.js +60 -0
- package/dist/i18n/locales/tr-TR.js.map +1 -1
- package/dist/i18n/locales/vi-VN.js +60 -0
- package/dist/i18n/locales/vi-VN.js.map +1 -1
- package/dist/i18n/locales/zh-CN.js +60 -0
- package/dist/i18n/locales/zh-CN.js.map +1 -1
- package/dist/i18n/locales/zh-TW.js +60 -0
- package/dist/i18n/locales/zh-TW.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +61 -59
- package/dist/instance.js +1 -1
- package/dist/ui-common-locales/de-DE.json +60 -0
- package/dist/ui-common-locales/el-GR.json +60 -0
- package/dist/ui-common-locales/en.json +60 -0
- package/dist/ui-common-locales/es-ES.json +60 -0
- package/dist/ui-common-locales/fi-FI.json +60 -0
- package/dist/ui-common-locales/fr-FR.json +60 -0
- package/dist/ui-common-locales/id-ID.json +60 -0
- package/dist/ui-common-locales/it-IT.json +60 -0
- package/dist/ui-common-locales/ja-JP.json +60 -0
- package/dist/ui-common-locales/ko-KR.json +60 -0
- package/dist/ui-common-locales/mn-MN.json +60 -0
- package/dist/ui-common-locales/ms-MY.json +60 -0
- package/dist/ui-common-locales/pl-PL.json +60 -0
- package/dist/ui-common-locales/pt-BR.json +60 -0
- package/dist/ui-common-locales/pt-PT.json +60 -0
- package/dist/ui-common-locales/ru-RU.json +60 -0
- package/dist/ui-common-locales/th-TH.json +60 -0
- package/dist/ui-common-locales/tr-TR.json +60 -0
- package/dist/ui-common-locales/vi-VN.json +60 -0
- package/dist/ui-common-locales/zh-CN.json +60 -0
- package/dist/ui-common-locales/zh-TW.json +60 -0
- package/exports.customs.json +1 -0
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PagedSelector2.js","names":[],"sources":["../../../src/components/PagedSelector/PagedSelector.tsx"],"sourcesContent":["/**\n * PagedSelector\n *\n * A searchable selector, single or multiple, over a list that loads a page at\n * a time: scrolling the panel near its end calls `onEndReached`, which is\n * where a consumer loads the next page (a Relay `loadNext`, a cursor fetch).\n * Search is the consumer's too: `onSearchChange` reports every keystroke.\n *\n * Astryx's `Selector` / `MultiSelector` mount every option and have no\n * scroll callback; `Typeahead` replaces its list on each query. This is\n * built on `ComplexSelector` (ui-common's copy), which owns the field,\n * trigger, popover and focus return and hands the panel body back, so the\n * body can own the scroll container. The body is drawn the way `Selector`'s\n * is: Astryx's panel search row, then option rows with the theme's check.\n *\n * - `value` holds option values: a string (or null) alone, a string array\n * with `isMultiple`. `onChange` also gets each chosen value's label, so a\n * consumer can keep labels for values that are not on the loaded page.\n * - A selected value missing from `options` (on another page, or filtered out\n * by the query) is named from `labels`, then from any page it was seen on,\n * then shown as the value itself.\n * - Keyboard: ArrowUp/Down, Home/End move a highlight that skips disabled\n * rows; Enter commits it, and Space too when there is no search box. The\n * panel is `ComplexSelector`'s dialog holding a listbox, not an ARIA\n * combobox.\n * - Options render one DOM row each; paging is what keeps that bounded.\n *\n * @example\n * <PagedSelector\n * label=\"Owner\"\n * value={ownerId}\n * onChange={(id) => setOwnerId(id)}\n * options={users.map((u) => ({ value: u.id, label: u.email }))}\n * onSearchChange={setQuery}\n * onEndReached={() => hasNext && loadNext(10)}\n * isLoadingMore={isLoadingNext}\n * totalCount={count}\n * />\n */\nimport { useId, useLayoutEffect, useRef, useState, type ReactNode } from \"react\";\nimport {\n ComplexSelector,\n type ComplexSelectorProps,\n} from \"../../forks/ComplexSelector\";\nimport { compiledStyles } from \"../../forks/compiled\";\nimport { Divider } from \"@astryxdesign/core/Divider\";\nimport { useIndicator } from \"@astryxdesign/core/Indicator\";\nimport { SelectorOption } from \"@astryxdesign/core/Selector\";\nimport { Spinner } from \"@astryxdesign/core/Spinner\";\nimport { HStack } from \"@astryxdesign/core/Stack\";\nimport { Text } from \"@astryxdesign/core/Text\";\nimport { Token } from \"@astryxdesign/core/Token\";\nimport { VisuallyHidden } from \"@astryxdesign/core/VisuallyHidden\";\nimport { themeProps } from \"@astryxdesign/core/utils\";\n\nimport { useUicTranslator } from \"../../i18n/useUicTranslator\";\nimport { PanelSearchInput } from \"./PanelSearchInput\";\nimport \"./PagedSelector.css\";\n\nexport interface PagedSelectorOption {\n value: string;\n /** The option's name: the trigger text and the row's accessible name. */\n label: string;\n /** Drawn in the row in place of `label`, for a row richer than a string. */\n labelContent?: ReactNode;\n /** Leading visual (avatar, glyph). */\n icon?: ReactNode;\n /** Secondary line under the label. */\n description?: ReactNode;\n /** Trailing content (tokens, meta). */\n endContent?: ReactNode;\n isDisabled?: boolean;\n}\n\n/** A chosen value with its label, as `onChange` reports it. */\nexport interface PagedSelectorSelectedItem {\n value: string;\n label: string;\n}\n\ntype Passthrough = Pick<\n ComplexSelectorProps<string[]>,\n | \"label\"\n | \"isLabelHidden\"\n | \"description\"\n | \"isOptional\"\n | \"isRequired\"\n | \"isDisabled\"\n | \"isLoading\"\n | \"status\"\n | \"statusVariant\"\n | \"labelTooltip\"\n | \"size\"\n | \"variant\"\n | \"startIcon\"\n | \"width\"\n | \"placement\"\n | \"alignment\"\n | \"onOpenChange\"\n | \"xstyle\"\n | \"className\"\n | \"style\"\n | \"data-testid\"\n>;\n\ninterface PagedSelectorBaseProps extends Passthrough {\n /** The loaded options, every page so far, in order. */\n options: readonly PagedSelectorOption[];\n /** Labels for selected values that may not be among `options`. */\n labels?: Readonly<Record<string, string>>;\n /**\n * Placeholder while nothing is selected.\n * @default the catalog's uic.PagedSelector.placeholder (\"Select {label}\")\n */\n placeholder?: string;\n /** Show the search box at the top of the panel. @default true */\n hasSearch?: boolean;\n /** Controlled search text; uncontrolled without it. */\n searchValue?: string;\n /** Called on every keystroke in the search box; debounce it yourself. */\n onSearchChange?: (searchValue: string) => void;\n /** @default the catalog's uic.PagedSelector.searchPlaceholder (\"Search\") */\n searchPlaceholder?: string;\n /** @default the catalog's uic.PagedSelector.searchOptions (\"Search options\") */\n searchLabel?: string;\n /** @default the catalog's uic.PagedSelector.clearSearch (\"Clear search options\") */\n clearSearchLabel?: string;\n /**\n * Called once each time the list is scrolled to within\n * `endReachedThreshold` px of its end. Load the next page here.\n */\n onEndReached?: () => void;\n /** Distance from the end, in px, that counts as reaching it. @default 30 */\n endReachedThreshold?: number;\n /** Called when the list arrives at, or leaves, its end. */\n onAtEndChange?: (isAtEnd: boolean) => void;\n /** A spinner in the foot while the next page loads. */\n isLoadingMore?: boolean;\n /** Options in all pages; shows the \"Total N items\" foot when positive. */\n totalCount?: number;\n /** @default the catalog's uic.PagedSelector.totalItems (\"Total {total} items\") */\n formatTotalCount?: (total: number) => string;\n /**\n * Replaces the empty list's content, the loading row included.\n * @default the catalog's uic.PagedSelector.loading while `isLoading`, else\n * uic.PagedSelector.noResults (\"No results\")\n */\n emptyText?: ReactNode;\n /** Above the option list, under the search box. */\n header?: ReactNode;\n /** Below the option list, in place of the total count. A function gets `close`. */\n footer?: ReactNode | ((close: () => void) => ReactNode);\n /** Height the option list scrolls within, in px. @default 260 */\n listMaxHeight?: number;\n /**\n * How a multiple selection shows in the trigger: `labels` (\"A, B, C, +2\",\n * as `MultiSelector`) or `badges` (tokens). @default \"labels\"\n */\n triggerDisplay?: \"labels\" | \"badges\";\n /** Selected items the trigger names before \"+N\". @default 3 */\n maxTriggerItems?: number;\n /** How a selected row is marked: the theme's check at its end, or a checkbox at its start. @default \"check\" */\n selectionIndicator?: \"check\" | \"checkbox\";\n /** A clear button in the trigger while something is selected. */\n hasClear?: boolean;\n /** Runs on clear. @default onChange(null) alone, onChange([]) with isMultiple */\n onClear?: () => void;\n}\n\nexport interface PagedSelectorSingleProps extends PagedSelectorBaseProps {\n isMultiple?: false;\n value?: string | null;\n onChange?: (value: string | null, item: PagedSelectorSelectedItem | null) => void;\n}\n\nexport interface PagedSelectorMultipleProps extends PagedSelectorBaseProps {\n isMultiple: true;\n value?: readonly string[];\n onChange?: (value: string[], items: PagedSelectorSelectedItem[]) => void;\n}\n\nexport type PagedSelectorProps = PagedSelectorSingleProps | PagedSelectorMultipleProps;\n\n/**\n * `ComplexSelector` insets its panel body by `--spacing-3`; this body brings\n * Selector's own gutters, so the inset goes. Astryx's compiled `padding: 0`\n * class (kmVPX3 is StyleX's key for `padding`), so no StyleX compiler is\n * needed; the test suite fails if astryx.css stops defining it.\n */\nexport const CONTENT_RESET = { padding: \"x1717udv\" } as const;\nconst contentStyles = compiledStyles({\n reset: { kmVPX3: CONTENT_RESET.padding, $$css: true },\n});\n\nexport function PagedSelector(props: PagedSelectorProps) {\n const {\n label,\n options,\n labels,\n placeholder,\n hasSearch = true,\n searchValue,\n onSearchChange,\n searchPlaceholder,\n searchLabel,\n clearSearchLabel,\n onEndReached,\n endReachedThreshold = 30,\n onAtEndChange,\n isLoadingMore,\n totalCount,\n formatTotalCount,\n emptyText,\n header,\n footer,\n listMaxHeight = 260,\n triggerDisplay = \"labels\",\n maxTriggerItems = 3,\n selectionIndicator = \"check\",\n hasClear,\n onClear,\n onOpenChange,\n isLoading,\n size,\n isMultiple,\n value: _value,\n onChange: _onChange,\n ...rest\n } = props;\n const t = useUicTranslator();\n const CheckMark = useIndicator(\"check\");\n const CheckboxMark = useIndicator(\"checkbox\");\n const listboxId = useId();\n const optionIdPrefix = useId();\n\n const selectedValues: string[] = props.isMultiple\n ? [...(props.value ?? [])]\n : props.value != null\n ? [props.value]\n : [];\n\n // Labels of every option seen, so a value picked from a page the list has\n // since dropped (a new query) keeps its name.\n const seenLabels = useRef(new Map<string, string>());\n for (const option of options) seenLabels.current.set(option.value, option.label);\n const labelOf = (value: string) =>\n labels?.[value] ??\n options.find((option) => option.value === value)?.label ??\n seenLabels.current.get(value) ??\n value;\n\n const emit = (values: string[]) => {\n const items = values.map((value) => ({ value, label: labelOf(value) }));\n if (props.isMultiple) props.onChange?.(values, items);\n else props.onChange?.(values[0] ?? null, items[0] ?? null);\n };\n\n // -1: an opened Astryx Selector highlights nothing until the pointer or an\n // arrow key picks a row.\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n const [internalSearch, setInternalSearch] = useState(\"\");\n const search = searchValue ?? internalSearch;\n const isAtEnd = useRef(false);\n\n const optionIdOf = (index: number) => `${optionIdPrefix}-option-${index}`;\n const clampedIndex =\n options.length === 0 || highlightedIndex < 0\n ? -1\n : Math.min(highlightedIndex, options.length - 1);\n // A row that went disabled under a page append does not keep the highlight.\n const activeIndex =\n clampedIndex >= 0 && options[clampedIndex]?.isDisabled ? -1 : clampedIndex;\n\n const nextEnabledIndex = (from: number, step: 1 | -1) => {\n for (let i = from; i >= 0 && i < options.length; i += step) {\n if (!options[i]?.isDisabled) return i;\n }\n return -1;\n };\n\n useLayoutEffect(() => {\n if (activeIndex < 0) return;\n document\n .getElementById(optionIdOf(activeIndex))\n ?.scrollIntoView({ block: \"nearest\" });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeIndex]);\n\n const handleScroll = (event: React.UIEvent<HTMLDivElement>) => {\n if (!onEndReached && !onAtEndChange) return;\n const el = event.currentTarget;\n const isAtEndNow =\n el.scrollHeight - el.scrollTop - el.clientHeight <= endReachedThreshold;\n if (isAtEndNow === isAtEnd.current) return;\n isAtEnd.current = isAtEndNow;\n onAtEndChange?.(isAtEndNow);\n if (isAtEndNow) onEndReached?.();\n };\n\n const isSelected = (value: string) => selectedValues.includes(value);\n\n const commit = (option: PagedSelectorOption, close: () => void) => {\n if (!isMultiple) {\n emit([option.value]);\n close();\n return;\n }\n emit(\n isSelected(option.value)\n ? selectedValues.filter((value) => value !== option.value)\n : [...selectedValues, option.value],\n );\n };\n\n // Shared by the search box and, with no search box, the listbox itself.\n // Space commits only where it is not typing into the search box.\n const handleNavKeyDown = (\n event: React.KeyboardEvent<HTMLElement>,\n close: () => void,\n hasSpaceCommit: boolean,\n ) => {\n if (options.length === 0) return;\n const moveTo = (index: number) => {\n if (index >= 0) setHighlightedIndex(index);\n };\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n moveTo(nextEnabledIndex(activeIndex < 0 ? 0 : activeIndex + 1, 1));\n break;\n case \"ArrowUp\":\n event.preventDefault();\n moveTo(\n activeIndex < 0\n ? nextEnabledIndex(0, 1)\n : nextEnabledIndex(activeIndex - 1, -1),\n );\n break;\n case \"Home\":\n event.preventDefault();\n moveTo(nextEnabledIndex(0, 1));\n break;\n case \"End\":\n event.preventDefault();\n moveTo(nextEnabledIndex(options.length - 1, -1));\n break;\n case \" \":\n case \"Enter\": {\n if (event.key === \" \" && !hasSpaceCommit) break;\n const option = options[activeIndex];\n if (!option || option.isDisabled) break;\n event.preventDefault();\n commit(option, close);\n break;\n }\n default:\n break;\n }\n };\n\n const triggerLabel = (() => {\n if (selectedValues.length === 0) return undefined;\n if (!isMultiple) return labelOf(selectedValues[0]!);\n const shown = selectedValues.slice(0, maxTriggerItems);\n const remaining = selectedValues.length - shown.length;\n if (triggerDisplay === \"badges\") {\n // Display-only: the trigger is ComplexSelector's own <button>, so a\n // removable token would nest a button in a button.\n return (\n <HStack gap={0.5} vAlign=\"center\" wrap=\"wrap\">\n {shown.map((value) => (\n <Token key={value} label={labelOf(value)} size=\"sm\" />\n ))}\n {remaining > 0 ? <Text color=\"secondary\">{`+${remaining}`}</Text> : null}\n </HStack>\n );\n }\n const joined = shown.map(labelOf).join(\", \");\n return remaining > 0 ? `${joined}, +${remaining}` : joined;\n })();\n\n const totalText = (total: number) =>\n formatTotalCount?.(total) ?? t(\"uic.PagedSelector.totalItems\", { total });\n const loadingText = t(\"uic.PagedSelector.loading\");\n\n return (\n <ComplexSelector<string[]>\n {...rest}\n label={label}\n value={selectedValues}\n onChange={emit}\n triggerLabel={triggerLabel}\n placeholder={placeholder ?? t(\"uic.PagedSelector.placeholder\", { label })}\n isLoading={isLoading}\n size={size}\n hasClear={hasClear}\n onClear={onClear ?? (() => emit([]))}\n onOpenChange={(isOpen) => {\n // Astryx drops its highlight when the panel closes, so the next open\n // starts clean.\n if (!isOpen) setHighlightedIndex(-1);\n onOpenChange?.(isOpen);\n }}\n contentXstyle={contentStyles.reset}\n >\n {(_current, _commit, close) => (\n <div>\n {hasSearch ? (\n <>\n <PanelSearchInput\n label={searchLabel ?? t(\"uic.PagedSelector.searchOptions\")}\n clearLabel={clearSearchLabel ?? t(\"uic.PagedSelector.clearSearch\")}\n placeholder={\n searchPlaceholder ?? t(\"uic.PagedSelector.searchPlaceholder\")\n }\n value={search}\n onValueChange={(next) => {\n setInternalSearch(next);\n // Seeds the first selectable row, so type-then-Enter works.\n setHighlightedIndex(nextEnabledIndex(0, 1));\n onSearchChange?.(next);\n }}\n onKeyDown={(event) => handleNavKeyDown(event, close, false)}\n aria-controls={listboxId}\n aria-activedescendant={\n activeIndex >= 0 ? optionIdOf(activeIndex) : undefined\n }\n />\n <Divider />\n </>\n ) : null}\n {header}\n <div\n id={listboxId}\n role=\"listbox\"\n aria-label={label}\n aria-multiselectable={isMultiple || undefined}\n // With no search box nothing else in the panel takes focus, so the\n // popover's autofocus lands here and the arrows work.\n tabIndex={hasSearch ? undefined : 0}\n aria-activedescendant={\n !hasSearch && activeIndex >= 0 ? optionIdOf(activeIndex) : undefined\n }\n onKeyDown={\n hasSearch ? undefined : (event) => handleNavKeyDown(event, close, true)\n }\n onScroll={handleScroll}\n className=\"uic-paged-selector__listbox\"\n style={{ maxHeight: listMaxHeight }}\n >\n {options.length === 0 ? (\n <div className=\"uic-paged-selector__empty\">\n {emptyText !== undefined ? (\n emptyText\n ) : isLoading ? (\n <HStack gap={1} vAlign=\"center\" hAlign=\"center\">\n <Spinner size=\"sm\" />\n <Text color=\"secondary\">{loadingText}</Text>\n </HStack>\n ) : (\n <Text color=\"secondary\">{t(\"uic.PagedSelector.noResults\")}</Text>\n )}\n </div>\n ) : (\n options.map((option, index) => {\n const selected = isSelected(option.value);\n const isDisabled = option.isDisabled ?? false;\n return (\n <div\n key={option.value}\n id={optionIdOf(index)}\n role=\"option\"\n aria-selected={selected}\n aria-disabled={isDisabled || undefined}\n className=\"uic-paged-selector__option\"\n data-size={size === \"sm\" ? \"sm\" : undefined}\n data-selected={selected ? \"true\" : undefined}\n data-highlighted={index === activeIndex ? \"true\" : undefined}\n data-disabled={isDisabled ? \"true\" : undefined}\n onClick={() => {\n if (isDisabled) return;\n setHighlightedIndex(index);\n commit(option, close);\n }}\n onMouseEnter={() => {\n if (!isDisabled) setHighlightedIndex(index);\n }}\n >\n {selectionIndicator === \"checkbox\" && (\n <span className=\"uic-paged-selector__option-mark\">\n <CheckboxMark\n state={selected ? \"checked\" : \"unchecked\"}\n size=\"sm\"\n isDisabled={isDisabled}\n />\n </span>\n )}\n <span className=\"uic-paged-selector__option-content\">\n <SelectorOption\n icon={option.icon}\n label={option.labelContent ?? option.label}\n description={option.description}\n endContent={option.endContent}\n />\n </span>\n {/* Rendered with the state passed down: a theme that swaps\n the check for a radio draws its empty circle too. */}\n {selectionIndicator === \"check\" && (\n <span className=\"uic-paged-selector__option-mark\">\n <CheckMark\n state={selected ? \"checked\" : \"unchecked\"}\n size=\"sm\"\n isDisabled={isDisabled}\n {...themeProps(\"selector-check\")}\n />\n </span>\n )}\n </div>\n );\n })\n )}\n </div>\n {(typeof footer === \"function\" ? footer(close) : footer) ??\n (typeof totalCount === \"number\" && totalCount > 0 ? (\n <HStack\n gap={1}\n vAlign=\"center\"\n hAlign=\"end\"\n className=\"uic-paged-selector__foot\"\n >\n {isLoadingMore ? <Spinner size=\"sm\" /> : null}\n <Text color=\"secondary\" size=\"sm\">\n {totalText(totalCount)}\n </Text>\n </HStack>\n ) : null)}\n <VisuallyHidden as=\"div\" aria-live=\"polite\">\n {options.length === 0 && isLoading\n ? loadingText\n : totalText(options.length)}\n </VisuallyHidden>\n </div>\n )}\n </ComplexSelector>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"PagedSelector2.js","names":[],"sources":["../../../src/components/PagedSelector/PagedSelector.tsx"],"sourcesContent":["/**\n * PagedSelector\n *\n * A searchable selector, single or multiple, over a list that loads a page at\n * a time: scrolling the panel near its end calls `onEndReached`, which is\n * where a consumer loads the next page (a Relay `loadNext`, a cursor fetch).\n * Search is the consumer's too: `onSearchChange` reports every keystroke.\n *\n * Astryx's `Selector` / `MultiSelector` mount every option and have no\n * scroll callback; `Typeahead` replaces its list on each query. This is\n * built on `ComplexSelector` (ui-common's copy), which owns the field,\n * trigger, popover and focus return and hands the panel body back, so the\n * body can own the scroll container. The body is drawn the way `Selector`'s\n * is: Astryx's panel search row, then option rows with the theme's check.\n *\n * - `value` holds option values: a string (or null) alone, a string array\n * with `isMultiple`. `onChange` also gets each chosen value's label, so a\n * consumer can keep labels for values that are not on the loaded page.\n * - A selected value missing from `options` (on another page, or filtered out\n * by the query) is named from `labels`, then from any page it was seen on,\n * then shown as the value itself.\n * - Keyboard: ArrowUp/Down, Home/End move a highlight that skips disabled\n * rows; Enter commits it, and Space too when there is no search box. The\n * panel is `ComplexSelector`'s dialog holding a listbox, not an ARIA\n * combobox.\n * - Options render one DOM row each; paging is what keeps that bounded.\n *\n * @example\n * <PagedSelector\n * label=\"Owner\"\n * value={ownerId}\n * onChange={(id) => setOwnerId(id)}\n * options={users.map((u) => ({ value: u.id, label: u.email }))}\n * onSearchChange={setQuery}\n * onEndReached={() => hasNext && loadNext(10)}\n * isLoadingMore={isLoadingNext}\n * totalCount={count}\n * />\n */\nimport { useId, useLayoutEffect, useRef, useState, type ReactNode } from \"react\";\nimport {\n ComplexSelector,\n type ComplexSelectorProps,\n} from \"../../forks/ComplexSelector\";\nimport { compiledStyles } from \"../../forks/compiled\";\nimport { Divider } from \"@astryxdesign/core/Divider\";\nimport { useIndicator } from \"@astryxdesign/core/Indicator\";\nimport { SelectorOption } from \"@astryxdesign/core/Selector\";\nimport { Spinner } from \"@astryxdesign/core/Spinner\";\nimport { HStack } from \"@astryxdesign/core/Stack\";\nimport { Text } from \"@astryxdesign/core/Text\";\nimport { Token } from \"@astryxdesign/core/Token\";\nimport { VisuallyHidden } from \"@astryxdesign/core/VisuallyHidden\";\nimport { themeProps } from \"@astryxdesign/core/utils\";\n\nimport { useUicTranslator } from \"../../i18n/useUicTranslator\";\nimport { PanelSearchInput } from \"./PanelSearchInput\";\nimport \"./PagedSelector.css\";\n\nexport interface PagedSelectorOption {\n value: string;\n /** The option's name: the trigger text and the row's accessible name. */\n label: string;\n /** Drawn in the row in place of `label`, for a row richer than a string. */\n labelContent?: ReactNode;\n /** Leading visual (avatar, glyph). */\n icon?: ReactNode;\n /** Secondary line under the label. */\n description?: ReactNode;\n /** Trailing content (tokens, meta). */\n endContent?: ReactNode;\n isDisabled?: boolean;\n}\n\n/** A chosen value with its label, as `onChange` reports it. */\nexport interface PagedSelectorSelectedItem {\n value: string;\n label: string;\n}\n\ntype Passthrough = Pick<\n ComplexSelectorProps<string[]>,\n | \"label\"\n | \"isLabelHidden\"\n | \"description\"\n | \"isOptional\"\n | \"isRequired\"\n | \"isDisabled\"\n | \"isLoading\"\n | \"status\"\n | \"statusVariant\"\n | \"labelTooltip\"\n | \"size\"\n | \"variant\"\n | \"startIcon\"\n | \"width\"\n | \"placement\"\n | \"alignment\"\n | \"onOpenChange\"\n | \"xstyle\"\n | \"className\"\n | \"style\"\n | \"data-testid\"\n>;\n\ninterface PagedSelectorBaseProps extends Passthrough {\n /** The loaded options, every page so far, in order. */\n options: readonly PagedSelectorOption[];\n /** Labels for selected values that may not be among `options`. */\n labels?: Readonly<Record<string, string>>;\n /**\n * Placeholder while nothing is selected.\n * @default the catalog's uic.PagedSelector.placeholder (\"Select {label}\")\n */\n placeholder?: string;\n /** Show the search box at the top of the panel. @default true */\n hasSearch?: boolean;\n /** Controlled search text; uncontrolled without it. */\n searchValue?: string;\n /** Called on every keystroke in the search box; debounce it yourself. */\n onSearchChange?: (searchValue: string) => void;\n /** @default the catalog's uic.PagedSelector.searchPlaceholder (\"Search\") */\n searchPlaceholder?: string;\n /** @default the catalog's uic.PagedSelector.searchOptions (\"Search options\") */\n searchLabel?: string;\n /** @default the catalog's uic.PagedSelector.clearSearch (\"Clear search options\") */\n clearSearchLabel?: string;\n /**\n * Called once each time the list is scrolled to within\n * `endReachedThreshold` px of its end. Load the next page here.\n */\n onEndReached?: () => void;\n /** Distance from the end, in px, that counts as reaching it. @default 30 */\n endReachedThreshold?: number;\n /** Called when the list arrives at, or leaves, its end. */\n onAtEndChange?: (isAtEnd: boolean) => void;\n /** A spinner in the foot while the next page loads. */\n isLoadingMore?: boolean;\n /** Options in all pages; shows the \"Total N items\" foot when positive. */\n totalCount?: number;\n /** @default the catalog's uic.PagedSelector.totalItems (\"Total {total} items\") */\n formatTotalCount?: (total: number) => string;\n /**\n * Replaces the empty list's content, the loading row included.\n * @default the catalog's uic.PagedSelector.loading while `isLoading`, else\n * uic.PagedSelector.noResults (\"No results\")\n */\n emptyText?: ReactNode;\n /** Above the option list, under the search box. */\n header?: ReactNode;\n /** Below the option list, in place of the total count. A function gets `close`. */\n footer?: ReactNode | ((close: () => void) => ReactNode);\n /** Height the option list scrolls within, in px. @default 260 */\n listMaxHeight?: number;\n /**\n * How a multiple selection shows in the trigger: `labels` (\"A, B, C, +2\",\n * as `MultiSelector`) or `badges` (tokens). @default \"labels\"\n */\n triggerDisplay?: \"labels\" | \"badges\";\n /** Selected items the trigger names before \"+N\". @default 3 */\n maxTriggerItems?: number;\n /** How a selected row is marked: the theme's check at its end, or a checkbox at its start. @default \"check\" */\n selectionIndicator?: \"check\" | \"checkbox\";\n /** A clear button in the trigger while something is selected. */\n hasClear?: boolean;\n /** Runs on clear. @default onChange(null) alone, onChange([]) with isMultiple */\n onClear?: () => void;\n}\n\nexport interface PagedSelectorSingleProps extends PagedSelectorBaseProps {\n isMultiple?: false;\n value?: string | null;\n onChange?: (value: string | null, item: PagedSelectorSelectedItem | null) => void;\n}\n\nexport interface PagedSelectorMultipleProps extends PagedSelectorBaseProps {\n isMultiple: true;\n value?: readonly string[];\n onChange?: (value: string[], items: PagedSelectorSelectedItem[]) => void;\n}\n\nexport type PagedSelectorProps = PagedSelectorSingleProps | PagedSelectorMultipleProps;\n\n/**\n * `ComplexSelector` insets its panel body by `--spacing-3`; this body brings\n * Selector's own gutters, so the inset goes. Astryx's compiled `padding: 0`\n * class (kmVPX3 is StyleX's key for `padding`), so no StyleX compiler is\n * needed; the test suite fails if astryx.css stops defining it.\n */\nexport const CONTENT_RESET = { padding: \"x1717udv\" } as const;\nconst contentStyles = compiledStyles({\n reset: { kmVPX3: CONTENT_RESET.padding, $$css: true },\n});\n\nexport function PagedSelector(props: PagedSelectorProps) {\n const {\n label,\n options,\n labels,\n placeholder,\n hasSearch = true,\n searchValue,\n onSearchChange,\n searchPlaceholder,\n searchLabel,\n clearSearchLabel,\n onEndReached,\n endReachedThreshold = 30,\n onAtEndChange,\n isLoadingMore,\n totalCount,\n formatTotalCount,\n emptyText,\n header,\n footer,\n listMaxHeight = 260,\n triggerDisplay = \"labels\",\n maxTriggerItems = 3,\n selectionIndicator = \"check\",\n hasClear,\n onClear,\n onOpenChange,\n isLoading,\n size,\n isMultiple,\n value: _value,\n onChange: _onChange,\n ...rest\n } = props;\n const t = useUicTranslator();\n const CheckMark = useIndicator(\"check\");\n const CheckboxMark = useIndicator(\"checkbox\");\n const listboxId = useId();\n const optionIdPrefix = useId();\n\n const selectedValues: string[] = props.isMultiple\n ? [...(props.value ?? [])]\n : props.value != null\n ? [props.value]\n : [];\n\n // Labels of every option seen, so a value picked from a page the list has\n // since dropped (a new query) keeps its name.\n const seenLabels = useRef(new Map<string, string>());\n for (const option of options) seenLabels.current.set(option.value, option.label);\n const labelOf = (value: string) =>\n labels?.[value] ??\n options.find((option) => option.value === value)?.label ??\n seenLabels.current.get(value) ??\n value;\n\n const emit = (values: string[]) => {\n const items = values.map((value) => ({ value, label: labelOf(value) }));\n if (props.isMultiple) props.onChange?.(values, items);\n else props.onChange?.(values[0] ?? null, items[0] ?? null);\n };\n\n // -1: an opened Astryx Selector highlights nothing until the pointer or an\n // arrow key picks a row.\n const [highlightedIndex, setHighlightedIndex] = useState(-1);\n const [internalSearch, setInternalSearch] = useState(\"\");\n const search = searchValue ?? internalSearch;\n const isAtEnd = useRef(false);\n\n const optionIdOf = (index: number) => `${optionIdPrefix}-option-${index}`;\n const clampedIndex =\n options.length === 0 || highlightedIndex < 0\n ? -1\n : Math.min(highlightedIndex, options.length - 1);\n // A row that went disabled under a page append does not keep the highlight.\n const activeIndex =\n clampedIndex >= 0 && options[clampedIndex]?.isDisabled ? -1 : clampedIndex;\n\n const nextEnabledIndex = (from: number, step: 1 | -1) => {\n for (let i = from; i >= 0 && i < options.length; i += step) {\n if (!options[i]?.isDisabled) return i;\n }\n return -1;\n };\n\n useLayoutEffect(() => {\n if (activeIndex < 0) return;\n document\n .getElementById(optionIdOf(activeIndex))\n ?.scrollIntoView({ block: \"nearest\" });\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [activeIndex]);\n\n const handleScroll = (event: React.UIEvent<HTMLDivElement>) => {\n if (!onEndReached && !onAtEndChange) return;\n const el = event.currentTarget;\n const isAtEndNow =\n el.scrollHeight - el.scrollTop - el.clientHeight <= endReachedThreshold;\n if (isAtEndNow === isAtEnd.current) return;\n isAtEnd.current = isAtEndNow;\n onAtEndChange?.(isAtEndNow);\n if (isAtEndNow) onEndReached?.();\n };\n\n const isSelected = (value: string) => selectedValues.includes(value);\n\n const commit = (option: PagedSelectorOption, close: () => void) => {\n if (!isMultiple) {\n emit([option.value]);\n close();\n return;\n }\n emit(\n isSelected(option.value)\n ? selectedValues.filter((value) => value !== option.value)\n : [...selectedValues, option.value],\n );\n };\n\n // Shared by the search box and, with no search box, the listbox itself.\n // Space commits only where it is not typing into the search box.\n const handleNavKeyDown = (\n event: React.KeyboardEvent<HTMLElement>,\n close: () => void,\n hasSpaceCommit: boolean,\n ) => {\n if (options.length === 0) return;\n const moveTo = (index: number) => {\n if (index >= 0) setHighlightedIndex(index);\n };\n switch (event.key) {\n case \"ArrowDown\":\n event.preventDefault();\n moveTo(nextEnabledIndex(activeIndex < 0 ? 0 : activeIndex + 1, 1));\n break;\n case \"ArrowUp\":\n event.preventDefault();\n moveTo(\n activeIndex < 0\n ? nextEnabledIndex(0, 1)\n : nextEnabledIndex(activeIndex - 1, -1),\n );\n break;\n case \"Home\":\n event.preventDefault();\n moveTo(nextEnabledIndex(0, 1));\n break;\n case \"End\":\n event.preventDefault();\n moveTo(nextEnabledIndex(options.length - 1, -1));\n break;\n case \" \":\n case \"Enter\": {\n if (event.key === \" \" && !hasSpaceCommit) break;\n const option = options[activeIndex];\n if (!option || option.isDisabled) break;\n event.preventDefault();\n commit(option, close);\n break;\n }\n default:\n break;\n }\n };\n\n const triggerLabel = (() => {\n if (selectedValues.length === 0) return undefined;\n if (!isMultiple) return labelOf(selectedValues[0]!);\n const shown = selectedValues.slice(0, maxTriggerItems);\n const remaining = selectedValues.length - shown.length;\n if (triggerDisplay === \"badges\") {\n // Display-only: the trigger is ComplexSelector's own <button>, so a\n // removable token would nest a button in a button.\n return (\n <HStack gap={0.5} vAlign=\"center\" wrap=\"wrap\">\n {shown.map((value) => (\n <Token key={value} label={labelOf(value)} size=\"sm\" />\n ))}\n {remaining > 0 ? <Text color=\"secondary\">{`+${remaining}`}</Text> : null}\n </HStack>\n );\n }\n const joined = shown.map(labelOf).join(\", \");\n return remaining > 0 ? `${joined}, +${remaining}` : joined;\n })();\n\n const totalText = (total: number) =>\n formatTotalCount?.(total) ?? t(\"uic.PagedSelector.totalItems\", { total });\n const loadingText = t(\"uic.PagedSelector.loading\");\n\n return (\n <ComplexSelector<string[]>\n {...rest}\n label={label}\n value={selectedValues}\n onChange={emit}\n triggerLabel={triggerLabel}\n placeholder={placeholder ?? t(\"uic.PagedSelector.placeholder\", { label })}\n isLoading={isLoading}\n size={size}\n hasClear={hasClear}\n onClear={onClear ?? (() => emit([]))}\n onOpenChange={(isOpen) => {\n // Astryx drops its highlight when the panel closes, so the next open\n // starts clean.\n if (!isOpen) setHighlightedIndex(-1);\n onOpenChange?.(isOpen);\n }}\n contentXstyle={contentStyles.reset}\n >\n {(_current, _commit, close) => (\n <div>\n {hasSearch ? (\n <>\n <PanelSearchInput\n label={searchLabel ?? t(\"uic.PagedSelector.searchOptions\")}\n clearLabel={clearSearchLabel ?? t(\"uic.PagedSelector.clearSearch\")}\n placeholder={\n searchPlaceholder ?? t(\"uic.PagedSelector.searchPlaceholder\")\n }\n value={search}\n onValueChange={(next) => {\n setInternalSearch(next);\n // Seeds the first selectable row, so type-then-Enter works.\n setHighlightedIndex(nextEnabledIndex(0, 1));\n onSearchChange?.(next);\n }}\n onKeyDown={(event) => handleNavKeyDown(event, close, false)}\n aria-controls={listboxId}\n aria-activedescendant={\n activeIndex >= 0 ? optionIdOf(activeIndex) : undefined\n }\n />\n <Divider />\n </>\n ) : null}\n {header}\n <div\n id={listboxId}\n role=\"listbox\"\n aria-label={label}\n aria-multiselectable={isMultiple || undefined}\n // With no search box nothing else in the panel takes focus, so the\n // popover's autofocus lands here and the arrows work.\n tabIndex={hasSearch ? undefined : 0}\n aria-activedescendant={\n !hasSearch && activeIndex >= 0 ? optionIdOf(activeIndex) : undefined\n }\n onKeyDown={\n hasSearch ? undefined : (event) => handleNavKeyDown(event, close, true)\n }\n onScroll={handleScroll}\n className=\"uic-paged-selector__listbox\"\n style={{ maxHeight: listMaxHeight }}\n >\n {options.length === 0 ? (\n <div className=\"uic-paged-selector__empty\">\n {emptyText !== undefined ? (\n emptyText\n ) : isLoading ? (\n <HStack gap={1} vAlign=\"center\" hAlign=\"center\">\n <Spinner size=\"sm\" />\n <Text color=\"secondary\">{loadingText}</Text>\n </HStack>\n ) : (\n <Text color=\"secondary\">{t(\"uic.PagedSelector.noResults\")}</Text>\n )}\n </div>\n ) : (\n options.map((option, index) => {\n const selected = isSelected(option.value);\n const isDisabled = option.isDisabled ?? false;\n return (\n <div\n key={option.value}\n id={optionIdOf(index)}\n role=\"option\"\n aria-selected={selected}\n aria-disabled={isDisabled || undefined}\n className=\"uic-paged-selector__option\"\n data-size={size === \"sm\" ? \"sm\" : undefined}\n data-selected={selected ? \"true\" : undefined}\n data-highlighted={index === activeIndex ? \"true\" : undefined}\n data-disabled={isDisabled ? \"true\" : undefined}\n onClick={() => {\n if (isDisabled) return;\n setHighlightedIndex(index);\n commit(option, close);\n }}\n onMouseEnter={() => {\n if (!isDisabled) setHighlightedIndex(index);\n }}\n >\n {selectionIndicator === \"checkbox\" && (\n <span className=\"uic-paged-selector__option-mark\">\n <CheckboxMark\n state={selected ? \"checked\" : \"unchecked\"}\n size=\"sm\"\n isDisabled={isDisabled}\n />\n </span>\n )}\n <span className=\"uic-paged-selector__option-content\">\n <SelectorOption\n icon={option.icon}\n label={option.labelContent ?? option.label}\n description={option.description}\n endContent={option.endContent}\n />\n </span>\n {/* Rendered with the state passed down: a theme that swaps\n the check for a radio draws its empty circle too. */}\n {selectionIndicator === \"check\" && (\n <span className=\"uic-paged-selector__option-mark\">\n <CheckMark\n state={selected ? \"checked\" : \"unchecked\"}\n size=\"sm\"\n isDisabled={isDisabled}\n {...themeProps(\"selector-check\")}\n />\n </span>\n )}\n </div>\n );\n })\n )}\n </div>\n {(typeof footer === \"function\" ? footer(close) : footer) ??\n (typeof totalCount === \"number\" && totalCount > 0 ? (\n <HStack\n gap={1}\n vAlign=\"center\"\n hAlign=\"end\"\n className=\"uic-paged-selector__foot\"\n >\n {isLoadingMore ? <Spinner size=\"sm\" /> : null}\n <Text color=\"secondary\" size=\"sm\">\n {totalText(totalCount)}\n </Text>\n </HStack>\n ) : null)}\n <VisuallyHidden as=\"div\" aria-live=\"polite\">\n {options.length === 0 && isLoading\n ? loadingText\n : totalText(options.length)}\n </VisuallyHidden>\n </div>\n )}\n </ComplexSelector>\n );\n}\n"],"mappings":"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"}
|
|
@@ -2,8 +2,8 @@ import { useUicTranslator as e } from "../../i18n/useUicTranslator.js";
|
|
|
2
2
|
import { HStack as t } from "@astryxdesign/core/Stack";
|
|
3
3
|
import { Text as n } from "@astryxdesign/core/Text";
|
|
4
4
|
import { jsx as r, jsxs as i } from "react/jsx-runtime";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
5
|
+
import { IconButton as a } from "@astryxdesign/core/IconButton";
|
|
6
|
+
import { Icon as o } from "@astryxdesign/core/Icon";
|
|
7
7
|
//#region src/components/SelectionLabel/SelectionLabel.tsx
|
|
8
8
|
function s({ count: s, onClear: c, label: l, clearLabel: u, clearIcon: d }) {
|
|
9
9
|
let f = e();
|
|
@@ -12,10 +12,10 @@ function s({ count: s, onClear: c, label: l, clearLabel: u, clearIcon: d }) {
|
|
|
12
12
|
return /* @__PURE__ */ i(t, {
|
|
13
13
|
gap: 1,
|
|
14
14
|
align: "center",
|
|
15
|
-
children: [/* @__PURE__ */ r(n, { children: l ?? f("uic.SelectionLabel.selectedCount", { count: s }) }), c ? /* @__PURE__ */ r(
|
|
15
|
+
children: [/* @__PURE__ */ r(n, { children: l ?? f("uic.SelectionLabel.selectedCount", { count: s }) }), c ? /* @__PURE__ */ r(a, {
|
|
16
16
|
variant: "ghost",
|
|
17
17
|
size: "sm",
|
|
18
|
-
icon: d ?? /* @__PURE__ */ r(
|
|
18
|
+
icon: d ?? /* @__PURE__ */ r(o, { icon: "close" }),
|
|
19
19
|
label: p,
|
|
20
20
|
tooltip: p,
|
|
21
21
|
onClick: c
|
package/dist/i18n/catalog.js
CHANGED
|
@@ -1,27 +1,28 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
1
|
+
import { boardMessages as e } from "../components/Board/Board.messages.js";
|
|
2
|
+
import { booleanTokenMessages as t } from "../components/BooleanToken/BooleanToken.messages.js";
|
|
3
|
+
import { bulkEditFormItemMessages as n } from "../components/BulkEditFormItem/BulkEditFormItem.messages.js";
|
|
4
|
+
import { bulkErrorModalMessages as r } from "../components/BulkErrorModal/BulkErrorModal.messages.js";
|
|
5
|
+
import { colorPickerMessages as i } from "../components/ColorPicker/ColorPicker.messages.js";
|
|
6
|
+
import { dataGridMessages as a } from "../components/DataGrid/DataGrid.messages.js";
|
|
7
|
+
import { deleteConfirmModalMessages as o } from "../components/DeleteConfirmModal/DeleteConfirmModal.messages.js";
|
|
8
|
+
import { formMessages as s } from "../components/Form/Form.messages.js";
|
|
9
|
+
import { notificationStackMessages as c } from "../components/NotificationStack/NotificationStack.messages.js";
|
|
10
|
+
import { pageHeaderMessages as l } from "../components/PageHeader/PageHeader.messages.js";
|
|
11
|
+
import { pagedSelectorMessages as u } from "../components/PagedSelector/PagedSelector.messages.js";
|
|
12
|
+
import { selectionLabelMessages as d } from "../components/SelectionLabel/SelectionLabel.messages.js";
|
|
13
|
+
import { skeletonMessages as f } from "../components/Skeleton/Skeleton.messages.js";
|
|
14
|
+
import { statisticMessages as p } from "../components/Statistic/Statistic.messages.js";
|
|
15
|
+
import { numberStepperMessages as m } from "../components/StepNumberInput/NumberStepper.messages.js";
|
|
16
|
+
import { tokenRowMessages as h } from "../components/TokenRow/TokenRow.messages.js";
|
|
17
|
+
import { uncontrolledInputMessages as g } from "../components/UncontrolledInput/UncontrolledInput.messages.js";
|
|
18
|
+
import { unitGridMessages as _ } from "../components/UnitGrid/UnitGrid.messages.js";
|
|
19
|
+
import { commonMessages as v } from "./common.messages.js";
|
|
19
20
|
//#region src/i18n/catalog.ts
|
|
20
|
-
function
|
|
21
|
+
function y(e) {
|
|
21
22
|
return e;
|
|
22
23
|
}
|
|
23
|
-
var
|
|
24
|
-
...
|
|
24
|
+
var b = {
|
|
25
|
+
...v,
|
|
25
26
|
...e,
|
|
26
27
|
...t,
|
|
27
28
|
...n,
|
|
@@ -30,17 +31,18 @@ var y = {
|
|
|
30
31
|
...a,
|
|
31
32
|
...o,
|
|
32
33
|
...s,
|
|
33
|
-
...p,
|
|
34
34
|
...c,
|
|
35
|
+
...m,
|
|
35
36
|
...l,
|
|
36
37
|
...u,
|
|
37
38
|
...d,
|
|
38
39
|
...f,
|
|
39
|
-
...
|
|
40
|
+
...p,
|
|
40
41
|
...h,
|
|
41
|
-
...g
|
|
42
|
+
...g,
|
|
43
|
+
..._
|
|
42
44
|
};
|
|
43
45
|
//#endregion
|
|
44
|
-
export {
|
|
46
|
+
export { y as defineMessages, b as uiCommonCatalog };
|
|
45
47
|
|
|
46
48
|
//# sourceMappingURL=catalog.js.map
|
package/dist/i18n/catalog.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"catalog.js","names":[],"sources":["../../src/i18n/catalog.ts"],"sourcesContent":["/**\n * ui-common's message catalog: every built-in string a custom component\n * shows, with its English text.\n *\n * English lives in code, as `defaultMessage`. Translations live in\n * `./locales/<locale>.json`, one file per Astryx locale name (`ko-KR.json`,\n * `ja-JP.json`, ...), holding the same keys. The build writes `en.json` from\n * this catalog and ships every file at\n * `@lablup/ui-common/ui-common-locales/<locale>.json`.\n *\n * Adding strings for a component:\n *\n * // src/components/Foo/Foo.messages.ts\n * export const fooMessages = defineMessages({\n * \"uic.Foo.expand\": { defaultMessage: \"Expand\", description: \"...\" },\n * });\n *\n * then spread `fooMessages` into `uiCommonCatalog` below. Generic action\n * words (OK, Cancel, Confirm, Retry, ...) are `uic.common.*` keys in\n * `./common.messages.ts`; use those instead of a key of your own. Keep message\n * files free of React and CSS imports: the build reads this catalog.\n */\nimport type { Catalog, MessageEntry } from \"@astryxdesign/core/i18n\";\n\n// These modules import `defineMessages` back from here. The cycle is safe:\n// it is a function declaration, so it is bound before either module runs.\nimport { booleanTokenMessages } from \"../components/BooleanToken/BooleanToken.messages\";\nimport { bulkEditFormItemMessages } from \"../components/BulkEditFormItem/BulkEditFormItem.messages\";\nimport { bulkErrorModalMessages } from \"../components/BulkErrorModal/BulkErrorModal.messages\";\nimport { colorPickerMessages } from \"../components/ColorPicker/ColorPicker.messages\";\nimport { dataGridMessages } from \"../components/DataGrid/DataGrid.messages\";\nimport { deleteConfirmModalMessages } from \"../components/DeleteConfirmModal/DeleteConfirmModal.messages\";\nimport { formMessages } from \"../components/Form/Form.messages\";\nimport { notificationStackMessages } from \"../components/NotificationStack/NotificationStack.messages\";\nimport { pageHeaderMessages } from \"../components/PageHeader/PageHeader.messages\";\nimport { pagedSelectorMessages } from \"../components/PagedSelector/PagedSelector.messages\";\nimport { selectionLabelMessages } from \"../components/SelectionLabel/SelectionLabel.messages\";\nimport { skeletonMessages } from \"../components/Skeleton/Skeleton.messages\";\nimport { statisticMessages } from \"../components/Statistic/Statistic.messages\";\nimport { numberStepperMessages } from \"../components/StepNumberInput/NumberStepper.messages\";\nimport { tokenRowMessages } from \"../components/TokenRow/TokenRow.messages\";\nimport { uncontrolledInputMessages } from \"../components/UncontrolledInput/UncontrolledInput.messages\";\nimport { unitGridMessages } from \"../components/UnitGrid/UnitGrid.messages\";\nimport { commonMessages } from \"./common.messages\";\n\n/**\n * A catalog key: `uic.<Component>.<key>`, or `uic.common.<key>` for a word\n * every component shares (`./common.messages.ts`).\n */\nexport type UicMessageKey = `uic.${string}.${string}`;\n\n/**\n * Type-checks a component's messages. Keys must be `uic.<Component>.<key>` or\n * `uic.common.<key>`.\n */\nexport function defineMessages<const T extends Record<UicMessageKey, MessageEntry>>(\n messages: T,\n): T {\n return messages;\n}\n\nexport const uiCommonCatalog: Catalog = {\n ...commonMessages,\n ...booleanTokenMessages,\n ...bulkEditFormItemMessages,\n ...bulkErrorModalMessages,\n ...colorPickerMessages,\n ...dataGridMessages,\n ...deleteConfirmModalMessages,\n ...formMessages,\n ...notificationStackMessages,\n ...numberStepperMessages,\n ...pageHeaderMessages,\n ...pagedSelectorMessages,\n ...selectionLabelMessages,\n ...skeletonMessages,\n ...statisticMessages,\n ...tokenRowMessages,\n ...uncontrolledInputMessages,\n ...unitGridMessages,\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"catalog.js","names":[],"sources":["../../src/i18n/catalog.ts"],"sourcesContent":["/**\n * ui-common's message catalog: every built-in string a custom component\n * shows, with its English text.\n *\n * English lives in code, as `defaultMessage`. Translations live in\n * `./locales/<locale>.json`, one file per Astryx locale name (`ko-KR.json`,\n * `ja-JP.json`, ...), holding the same keys. The build writes `en.json` from\n * this catalog and ships every file at\n * `@lablup/ui-common/ui-common-locales/<locale>.json`.\n *\n * Adding strings for a component:\n *\n * // src/components/Foo/Foo.messages.ts\n * export const fooMessages = defineMessages({\n * \"uic.Foo.expand\": { defaultMessage: \"Expand\", description: \"...\" },\n * });\n *\n * then spread `fooMessages` into `uiCommonCatalog` below. Generic action\n * words (OK, Cancel, Confirm, Retry, ...) are `uic.common.*` keys in\n * `./common.messages.ts`; use those instead of a key of your own. Keep message\n * files free of React and CSS imports: the build reads this catalog.\n */\nimport type { Catalog, MessageEntry } from \"@astryxdesign/core/i18n\";\n\n// These modules import `defineMessages` back from here. The cycle is safe:\n// it is a function declaration, so it is bound before either module runs.\nimport { boardMessages } from \"../components/Board/Board.messages\";\nimport { booleanTokenMessages } from \"../components/BooleanToken/BooleanToken.messages\";\nimport { bulkEditFormItemMessages } from \"../components/BulkEditFormItem/BulkEditFormItem.messages\";\nimport { bulkErrorModalMessages } from \"../components/BulkErrorModal/BulkErrorModal.messages\";\nimport { colorPickerMessages } from \"../components/ColorPicker/ColorPicker.messages\";\nimport { dataGridMessages } from \"../components/DataGrid/DataGrid.messages\";\nimport { deleteConfirmModalMessages } from \"../components/DeleteConfirmModal/DeleteConfirmModal.messages\";\nimport { formMessages } from \"../components/Form/Form.messages\";\nimport { notificationStackMessages } from \"../components/NotificationStack/NotificationStack.messages\";\nimport { pageHeaderMessages } from \"../components/PageHeader/PageHeader.messages\";\nimport { pagedSelectorMessages } from \"../components/PagedSelector/PagedSelector.messages\";\nimport { selectionLabelMessages } from \"../components/SelectionLabel/SelectionLabel.messages\";\nimport { skeletonMessages } from \"../components/Skeleton/Skeleton.messages\";\nimport { statisticMessages } from \"../components/Statistic/Statistic.messages\";\nimport { numberStepperMessages } from \"../components/StepNumberInput/NumberStepper.messages\";\nimport { tokenRowMessages } from \"../components/TokenRow/TokenRow.messages\";\nimport { uncontrolledInputMessages } from \"../components/UncontrolledInput/UncontrolledInput.messages\";\nimport { unitGridMessages } from \"../components/UnitGrid/UnitGrid.messages\";\nimport { commonMessages } from \"./common.messages\";\n\n/**\n * A catalog key: `uic.<Component>.<key>`, or `uic.common.<key>` for a word\n * every component shares (`./common.messages.ts`).\n */\nexport type UicMessageKey = `uic.${string}.${string}`;\n\n/**\n * Type-checks a component's messages. Keys must be `uic.<Component>.<key>` or\n * `uic.common.<key>`.\n */\nexport function defineMessages<const T extends Record<UicMessageKey, MessageEntry>>(\n messages: T,\n): T {\n return messages;\n}\n\nexport const uiCommonCatalog: Catalog = {\n ...commonMessages,\n ...boardMessages,\n ...booleanTokenMessages,\n ...bulkEditFormItemMessages,\n ...bulkErrorModalMessages,\n ...colorPickerMessages,\n ...dataGridMessages,\n ...deleteConfirmModalMessages,\n ...formMessages,\n ...notificationStackMessages,\n ...numberStepperMessages,\n ...pageHeaderMessages,\n ...pagedSelectorMessages,\n ...selectionLabelMessages,\n ...skeletonMessages,\n ...statisticMessages,\n ...tokenRowMessages,\n ...uncontrolledInputMessages,\n ...unitGridMessages,\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAwDA,SAAgB,EACd,GACG;CACH,OAAO;AACT;AAEA,IAAa,IAA2B;CACtC,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;CACH,GAAG;AACL"}
|
|
@@ -24,6 +24,50 @@ var e = {
|
|
|
24
24
|
defaultMessage: "Anwenden",
|
|
25
25
|
description: "Generic label of a button that applies the changes made in a dialog"
|
|
26
26
|
},
|
|
27
|
+
"uic.Board.dragHandle": {
|
|
28
|
+
defaultMessage: "Ziehgriff",
|
|
29
|
+
description: "Accessible name of the button at a board item's top-left corner that moves the item"
|
|
30
|
+
},
|
|
31
|
+
"uic.Board.resizeHandle": {
|
|
32
|
+
defaultMessage: "Größengriff",
|
|
33
|
+
description: "Accessible name of the button at a board item's bottom-right corner that resizes the item"
|
|
34
|
+
},
|
|
35
|
+
"uic.Board.moveStarted": {
|
|
36
|
+
defaultMessage: "Wird gezogen.",
|
|
37
|
+
description: "Screen reader announcement when a board item is picked up to be moved"
|
|
38
|
+
},
|
|
39
|
+
"uic.Board.resizeStarted": {
|
|
40
|
+
defaultMessage: "Größe wird geändert.",
|
|
41
|
+
description: "Screen reader announcement when a board item starts being resized"
|
|
42
|
+
},
|
|
43
|
+
"uic.Board.itemMoved": {
|
|
44
|
+
defaultMessage: "Element in Spalte {column}, Zeile {row} verschoben.",
|
|
45
|
+
description: "Screen reader announcement while a board item moves. {column} and {row} are 1-based"
|
|
46
|
+
},
|
|
47
|
+
"uic.Board.itemResized": {
|
|
48
|
+
defaultMessage: "Elementgröße auf {columns} Spalten mal {rows} Zeilen geändert.",
|
|
49
|
+
description: "Screen reader announcement while a board item is resized"
|
|
50
|
+
},
|
|
51
|
+
"uic.Board.moveCommitted": {
|
|
52
|
+
defaultMessage: "Verschieben übernommen.",
|
|
53
|
+
description: "Screen reader announcement when a board item is dropped in its new place"
|
|
54
|
+
},
|
|
55
|
+
"uic.Board.resizeCommitted": {
|
|
56
|
+
defaultMessage: "Größenänderung übernommen.",
|
|
57
|
+
description: "Screen reader announcement when a board item's new size is applied"
|
|
58
|
+
},
|
|
59
|
+
"uic.Board.moveDiscarded": {
|
|
60
|
+
defaultMessage: "Verschieben verworfen.",
|
|
61
|
+
description: "Screen reader announcement when moving a board item is cancelled"
|
|
62
|
+
},
|
|
63
|
+
"uic.Board.resizeDiscarded": {
|
|
64
|
+
defaultMessage: "Größenänderung verworfen.",
|
|
65
|
+
description: "Screen reader announcement when resizing a board item is cancelled"
|
|
66
|
+
},
|
|
67
|
+
"uic.Board.itemRemoved": {
|
|
68
|
+
defaultMessage: "Element entfernt.",
|
|
69
|
+
description: "Screen reader announcement when a board item is removed"
|
|
70
|
+
},
|
|
27
71
|
"uic.ColorPicker.label": {
|
|
28
72
|
defaultMessage: "Farbe auswählen",
|
|
29
73
|
description: "Accessible name of a color picker whose caller gave it no label"
|
|
@@ -323,6 +367,22 @@ var e = {
|
|
|
323
367
|
"uic.PagedSelector.totalItems": {
|
|
324
368
|
defaultMessage: "Total {total} Elemente",
|
|
325
369
|
description: "Foot of a selector's option list; {total} is how many options exist in all pages"
|
|
370
|
+
},
|
|
371
|
+
"uic.Board.directionUp": {
|
|
372
|
+
defaultMessage: "Nach oben",
|
|
373
|
+
description: "Accessible name of the button that moves an activated board item, or shrinks a resized one, one row up"
|
|
374
|
+
},
|
|
375
|
+
"uic.Board.directionDown": {
|
|
376
|
+
defaultMessage: "Nach unten",
|
|
377
|
+
description: "Accessible name of the button that moves an activated board item, or grows a resized one, one row down"
|
|
378
|
+
},
|
|
379
|
+
"uic.Board.directionLeft": {
|
|
380
|
+
defaultMessage: "Nach links",
|
|
381
|
+
description: "Accessible name of the button that moves an activated board item, or shrinks a resized one, one column left"
|
|
382
|
+
},
|
|
383
|
+
"uic.Board.directionRight": {
|
|
384
|
+
defaultMessage: "Nach rechts",
|
|
385
|
+
description: "Accessible name of the button that moves an activated board item, or grows a resized one, one column right"
|
|
326
386
|
}
|
|
327
387
|
};
|
|
328
388
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"de-DE.js","names":[],"sources":["../../../src/i18n/locales/de-DE.json"],"sourcesContent":["{\n \"uic.common.ok\": {\n \"defaultMessage\": \"OK\",\n \"description\": \"Generic label of a primary action button that accepts\"\n },\n \"uic.common.cancel\": {\n \"defaultMessage\": \"Abbrechen\",\n \"description\": \"Generic label of a button that backs out of an action or stops a task\"\n },\n \"uic.common.confirm\": {\n \"defaultMessage\": \"Bestätigen\",\n \"description\": \"Generic label of a button that confirms an action\"\n },\n \"uic.common.delete\": {\n \"defaultMessage\": \"Löschen\",\n \"description\": \"Generic label of a button that deletes something\"\n },\n \"uic.common.retry\": {\n \"defaultMessage\": \"Wiederholen\",\n \"description\": \"Generic label of a button that retries a failed action or load\"\n },\n \"uic.common.apply\": {\n \"defaultMessage\": \"Anwenden\",\n \"description\": \"Generic label of a button that applies the changes made in a dialog\"\n },\n \"uic.ColorPicker.label\": {\n \"defaultMessage\": \"Farbe auswählen\",\n \"description\": \"Accessible name of a color picker whose caller gave it no label\"\n },\n \"uic.ColorPicker.hexValue\": {\n \"defaultMessage\": \"Hex-Wert\",\n \"description\": \"Hidden label of the color picker's text field for a #rrggbb value\"\n },\n \"uic.ColorPicker.clear\": {\n \"defaultMessage\": \"Löschen\",\n \"description\": \"Button in a color picker that removes the chosen color\"\n },\n \"uic.ColorPicker.noColor\": {\n \"defaultMessage\": \"Keine Farbe\",\n \"description\": \"Shown on a color picker's trigger when no color is set\"\n },\n \"uic.DeleteConfirmModal.title\": {\n \"defaultMessage\": \"Löschen\",\n \"description\": \"Title of the dialog that confirms deleting one item\"\n },\n \"uic.DeleteConfirmModal.titleMany\": {\n \"defaultMessage\": \"{count, plural, other {# Elemente löschen}}\",\n \"description\": \"Title of the dialog that confirms deleting several items; {count} is how many\"\n },\n \"uic.DeleteConfirmModal.description\": {\n \"defaultMessage\": \"Sind Sie sicher, dass Sie löschen möchten?\",\n \"description\": \"Question above the list of items about to be deleted\"\n },\n \"uic.DeleteConfirmModal.targetDescription\": {\n \"defaultMessage\": \"Möchten Sie {target} wirklich dauerhaft löschen?\",\n \"description\": \"Question above the list of items about to be deleted; {target} names the kind of item, e.g. Project\"\n },\n \"uic.DeleteConfirmModal.typeToConfirm\": {\n \"defaultMessage\": \"Geben Sie {confirmText} ein, um zu bestätigen.\",\n \"description\": \"Instruction above the confirmation field; {confirmText} is the text to type, shown as a token\"\n },\n \"uic.DeleteConfirmModal.confirmText\": {\n \"defaultMessage\": \"Löschen\",\n \"description\": \"The word the user types to confirm deleting several items at once\"\n },\n \"uic.DeleteConfirmModal.cannotBeUndone\": {\n \"defaultMessage\": \"Diese Aktion kann nicht rückgängig gemacht werden.\",\n \"description\": \"Warning that the deletion is permanent\"\n },\n \"uic.NumberStepper.increase\": {\n \"defaultMessage\": \"Erhöhen\",\n \"description\": \"Accessible name of the button that steps a number field up\"\n },\n \"uic.NumberStepper.decrease\": {\n \"defaultMessage\": \"Verringern\",\n \"description\": \"Accessible name of the button that steps a number field down\"\n },\n \"uic.SelectionLabel.selectedCount\": {\n \"defaultMessage\": \"{count} ausgewählt\",\n \"description\": \"How many items are selected, e.g. rows of a table; {count} is the number\"\n },\n \"uic.SelectionLabel.clear\": {\n \"defaultMessage\": \"Alle abwählen\",\n \"description\": \"Button that clears the whole selection\"\n },\n \"uic.SkeletonCard.loading\": {\n \"defaultMessage\": \"Wird geladen\",\n \"description\": \"Accessible name of a card-shaped loading placeholder\"\n },\n \"uic.SkeletonRow.loading\": {\n \"defaultMessage\": \"Wird geladen\",\n \"description\": \"Accessible name of one list-row loading placeholder\"\n },\n \"uic.SkeletonText.loading\": {\n \"defaultMessage\": \"Wird geladen\",\n \"description\": \"Accessible name of a text-block loading placeholder\"\n },\n \"uic.Statistic.unlimited\": {\n \"defaultMessage\": \"Unbegrenzt\",\n \"description\": \"Shown in place of a metric's value when the value has no limit\"\n },\n \"uic.TokenRow.more\": {\n \"defaultMessage\": \"und {count} weitere\",\n \"description\": \"After a row of tokens cut short, how many were left out; {count} is the number\"\n },\n \"uic.UncontrolledInput.label\": {\n \"defaultMessage\": \"Auswählen\",\n \"description\": \"Hidden accessible name of an input whose caller gave it no label of its own\"\n },\n \"uic.UnitGrid.label\": {\n \"defaultMessage\": \"Ressourcenraster\",\n \"description\": \"Accessible name of a unit grid whose caller gave it no aria-label\"\n },\n \"uic.UnitGrid.changeGroupColor\": {\n \"defaultMessage\": \"Gruppenfarbe ändern\",\n \"description\": \"Button in a unit grid's hover card that opens the palette for the group\"\n },\n \"uic.UnitGrid.useColor\": {\n \"defaultMessage\": \"Farbe {index} verwenden\",\n \"description\": \"Accessible name of one palette swatch in a unit grid; {index} is its 1-based position\"\n },\n \"uic.Form.optional\": {\n \"defaultMessage\": \"(optional)\",\n \"description\": \"Suffix after the label of an optional field when requiredMark=\\\"optional\\\"\"\n },\n \"uic.Form.default\": {\n \"defaultMessage\": \"Feld-Validierungsfehler: {label}\",\n \"description\": \"Validation error when a rule failed without a more specific message\"\n },\n \"uic.Form.required\": {\n \"defaultMessage\": \"Bitte geben Sie {label} an\",\n \"description\": \"Validation error for an empty required field\"\n },\n \"uic.Form.whitespace\": {\n \"defaultMessage\": \"{label} darf kein Leerzeichen sein\",\n \"description\": \"Validation error for a required field that holds only whitespace\"\n },\n \"uic.Form.typeString\": {\n \"defaultMessage\": \"{label} ist nicht gültig. {type} erwartet\",\n \"description\": \"Validation error for a value that is not a string; {type} is the type name\"\n },\n \"uic.Form.typeNumber\": {\n \"defaultMessage\": \"{label} ist nicht gültig. {type} erwartet\",\n \"description\": \"Validation error for a value that is not a number; {type} is the type name\"\n },\n \"uic.Form.typeObject\": {\n \"defaultMessage\": \"{label} ist nicht gültig. {type} erwartet\",\n \"description\": \"Validation error for a value that is not an object; {type} is the type name\"\n },\n \"uic.Form.typeEmail\": {\n \"defaultMessage\": \"{label} ist nicht gültig. {type} erwartet\",\n \"description\": \"Validation error for an invalid email address; {type} is the type name\"\n },\n \"uic.Form.typeUrl\": {\n \"defaultMessage\": \"{label} ist nicht gültig. {type} erwartet\",\n \"description\": \"Validation error for an invalid URL; {type} is the type name\"\n },\n \"uic.Form.stringLen\": {\n \"defaultMessage\": \"{label} muss genau {len} Zeichen lang sein\",\n \"description\": \"Validation error for text of the wrong exact length\"\n },\n \"uic.Form.stringMin\": {\n \"defaultMessage\": \"{label} muss mindestens {min} Zeichen lang sein\",\n \"description\": \"Validation error for text shorter than the minimum\"\n },\n \"uic.Form.stringMax\": {\n \"defaultMessage\": \"{label} darf höchstens {max} Zeichen lang sein\",\n \"description\": \"Validation error for text longer than the maximum\"\n },\n \"uic.Form.stringRange\": {\n \"defaultMessage\": \"{label} muss zwischen {min} und {max} Zeichen lang sein\",\n \"description\": \"Validation error for text outside a length range\"\n },\n \"uic.Form.numberLen\": {\n \"defaultMessage\": \"{label} muss gleich {len} sein\",\n \"description\": \"Validation error for a number that must equal a value\"\n },\n \"uic.Form.numberMin\": {\n \"defaultMessage\": \"{label} muss mindestens {min} sein\",\n \"description\": \"Validation error for a number below the minimum\"\n },\n \"uic.Form.numberMax\": {\n \"defaultMessage\": \"{label} darf maximal {max} sein\",\n \"description\": \"Validation error for a number above the maximum\"\n },\n \"uic.Form.numberRange\": {\n \"defaultMessage\": \"{label} muss zwischen {min} und {max} liegen\",\n \"description\": \"Validation error for a number outside a range\"\n },\n \"uic.Form.arrayLen\": {\n \"defaultMessage\": \"Es müssen {len} {label} sein\",\n \"description\": \"Validation error for a list with the wrong number of items\"\n },\n \"uic.Form.arrayMin\": {\n \"defaultMessage\": \"Es müssen mindestens {min} {label} sein\",\n \"description\": \"Validation error for a list with too few items\"\n },\n \"uic.Form.arrayMax\": {\n \"defaultMessage\": \"Es dürfen maximal {max} {label} sein\",\n \"description\": \"Validation error for a list with too many items\"\n },\n \"uic.Form.arrayRange\": {\n \"defaultMessage\": \"Die Anzahl an {label} muss zwischen {min} und {max} liegen\",\n \"description\": \"Validation error for a list whose item count is outside a range\"\n },\n \"uic.Form.patternMismatch\": {\n \"defaultMessage\": \"{label} entspricht nicht dem {pattern} Muster\",\n \"description\": \"Validation error for text that does not match a pattern\"\n },\n \"uic.BulkEditFormItem.keepAsIs\": {\n \"defaultMessage\": \"Unverändert lassen\",\n \"description\": \"Placeholder of a bulk-edit field that leaves every selected item's current value unchanged\"\n },\n \"uic.BulkEditFormItem.clear\": {\n \"defaultMessage\": \"Löschen\",\n \"description\": \"Link that clears the field on every selected item, and the field's placeholder once cleared\"\n },\n \"uic.BulkEditFormItem.undoChanges\": {\n \"defaultMessage\": \"Änderungen rückgängig machen\",\n \"description\": \"Link that returns a bulk-edit field to keeping the current values\"\n },\n \"uic.BulkErrorModal.title\": {\n \"defaultMessage\": \"Ausführung fehlgeschlagen\",\n \"description\": \"Default title of the dialog that lists the failed items of a bulk operation\"\n },\n \"uic.BulkErrorModal.errorOccurred\": {\n \"defaultMessage\": \"Ein Fehler ist aufgetreten\",\n \"description\": \"Title of the error banner above the failed items, over the caller's guidance\"\n },\n \"uic.DataGrid.noData\": {\n \"defaultMessage\": \"Keine Daten zum Anzeigen\",\n \"description\": \"Shown in place of a data grid's rows when there are none\"\n },\n \"uic.DataGrid.invalidPage\": {\n \"defaultMessage\": \"Ungültige Seitenzahl\",\n \"description\": \"Shown in place of a data grid's rows when the current page lies past the last page\"\n },\n \"uic.DataGrid.goToFirstPage\": {\n \"defaultMessage\": \"Zur ersten Seite\",\n \"description\": \"Button under the invalid page message that returns to page 1\"\n },\n \"uic.DataGrid.expandRow\": {\n \"defaultMessage\": \"Zeile ausklappen\",\n \"description\": \"Accessible name of the button that shows or hides a row's details\"\n },\n \"uic.DataGrid.pagination\": {\n \"defaultMessage\": \"Seitennummerierung\",\n \"description\": \"Accessible name of a data grid's page navigation\"\n },\n \"uic.DataGrid.range\": {\n \"defaultMessage\": \"{start} - {end} von {total} Elementen\",\n \"description\": \"Beside a data grid's page navigation: the rows on screen out of the total. {start} and {end} are 1-based row numbers\"\n },\n \"uic.DataGrid.settings\": {\n \"defaultMessage\": \"Tabelleneinstellungen\",\n \"description\": \"Button under a data grid that opens its column settings, and the title of that dialog\"\n },\n \"uic.DataGrid.exportCsv\": {\n \"defaultMessage\": \"Als CSV exportieren\",\n \"description\": \"Button under a data grid that opens the CSV export dialog, and the title of that dialog\"\n },\n \"uic.DataGrid.selectColumns\": {\n \"defaultMessage\": \"Wählen Sie Spalten aus, um angezeigt zu werden\",\n \"description\": \"Subtitle of a data grid's column settings and CSV export dialogs\"\n },\n \"uic.DataGrid.searchColumns\": {\n \"defaultMessage\": \"Suchtabellenspalten\",\n \"description\": \"Placeholder of the column search field in a data grid's dialogs, also shown when no column matches\"\n },\n \"uic.DataGrid.reorderColumn\": {\n \"defaultMessage\": \"{column} verschieben\",\n \"description\": \"Accessible name of the drag handle beside a column in a data grid's column settings dialog. {column} is the column's label\"\n },\n \"uic.DataGrid.reorderInstructions\": {\n \"defaultMessage\": \"Drücken Sie die Leertaste, um die Spalte aufzunehmen, verschieben Sie sie mit den Pfeiltasten und drücken Sie erneut die Leertaste, um sie abzulegen, oder Escape, um abzubrechen.\",\n \"description\": \"Screen reader instructions for a drag handle in a data grid's column settings dialog\"\n },\n \"uic.DataGrid.reorderPickedUp\": {\n \"defaultMessage\": \"{column} aufgenommen. Position {position} von {total}.\",\n \"description\": \"Screen reader announcement when a column is picked up for reordering in the column settings dialog. {position} is 1-based\"\n },\n \"uic.DataGrid.reorderMoved\": {\n \"defaultMessage\": \"{column} auf Position {position} von {total} verschoben.\",\n \"description\": \"Screen reader announcement while a picked-up column moves in the column settings dialog. {position} is 1-based\"\n },\n \"uic.DataGrid.reorderDropped\": {\n \"defaultMessage\": \"{column} auf Position {position} von {total} abgelegt.\",\n \"description\": \"Screen reader announcement when a column is dropped in the column settings dialog. {position} is 1-based\"\n },\n \"uic.DataGrid.reorderCancelled\": {\n \"defaultMessage\": \"Verschieben abgebrochen. {column} ist wieder auf Position {position} von {total}.\",\n \"description\": \"Screen reader announcement when reordering a column is cancelled in the column settings dialog. {position} is 1-based\"\n },\n \"uic.DataGrid.export\": {\n \"defaultMessage\": \"Exportieren\",\n \"description\": \"Primary button of a data grid's CSV export dialog\"\n },\n \"uic.PagedSelector.placeholder\": {\n \"defaultMessage\": \"{label} auswählen\",\n \"description\": \"Placeholder of a selector with nothing selected; {label} is the field's label\"\n },\n \"uic.PagedSelector.searchOptions\": {\n \"defaultMessage\": \"Optionen durchsuchen\",\n \"description\": \"Accessible name of the search box at the top of a selector's option list\"\n },\n \"uic.PagedSelector.searchPlaceholder\": {\n \"defaultMessage\": \"Suchen\",\n \"description\": \"Placeholder of the search box at the top of a selector's option list\"\n },\n \"uic.PagedSelector.clearSearch\": {\n \"defaultMessage\": \"Optionen durchsuchen löschen\",\n \"description\": \"Accessible name of the button that empties a selector's search box\"\n },\n \"uic.PagedSelector.noResults\": {\n \"defaultMessage\": \"Keine Ergebnisse\",\n \"description\": \"Shown in a selector's option list when no option matches\"\n },\n \"uic.PagedSelector.loading\": {\n \"defaultMessage\": \"Wird geladen...\",\n \"description\": \"Shown in a selector's empty option list while options are being fetched\"\n },\n \"uic.PagedSelector.totalItems\": {\n \"defaultMessage\": \"Total {total} Elemente\",\n \"description\": \"Foot of a selector's option list; {total} is how many options exist in all pages\"\n }\n}\n"],"mappings":""}
|
|
1
|
+
{"version":3,"file":"de-DE.js","names":[],"sources":["../../../src/i18n/locales/de-DE.json"],"sourcesContent":["{\n \"uic.common.ok\": {\n \"defaultMessage\": \"OK\",\n \"description\": \"Generic label of a primary action button that accepts\"\n },\n \"uic.common.cancel\": {\n \"defaultMessage\": \"Abbrechen\",\n \"description\": \"Generic label of a button that backs out of an action or stops a task\"\n },\n \"uic.common.confirm\": {\n \"defaultMessage\": \"Bestätigen\",\n \"description\": \"Generic label of a button that confirms an action\"\n },\n \"uic.common.delete\": {\n \"defaultMessage\": \"Löschen\",\n \"description\": \"Generic label of a button that deletes something\"\n },\n \"uic.common.retry\": {\n \"defaultMessage\": \"Wiederholen\",\n \"description\": \"Generic label of a button that retries a failed action or load\"\n },\n \"uic.common.apply\": {\n \"defaultMessage\": \"Anwenden\",\n \"description\": \"Generic label of a button that applies the changes made in a dialog\"\n },\n \"uic.Board.dragHandle\": {\n \"defaultMessage\": \"Ziehgriff\",\n \"description\": \"Accessible name of the button at a board item's top-left corner that moves the item\"\n },\n \"uic.Board.resizeHandle\": {\n \"defaultMessage\": \"Größengriff\",\n \"description\": \"Accessible name of the button at a board item's bottom-right corner that resizes the item\"\n },\n \"uic.Board.moveStarted\": {\n \"defaultMessage\": \"Wird gezogen.\",\n \"description\": \"Screen reader announcement when a board item is picked up to be moved\"\n },\n \"uic.Board.resizeStarted\": {\n \"defaultMessage\": \"Größe wird geändert.\",\n \"description\": \"Screen reader announcement when a board item starts being resized\"\n },\n \"uic.Board.itemMoved\": {\n \"defaultMessage\": \"Element in Spalte {column}, Zeile {row} verschoben.\",\n \"description\": \"Screen reader announcement while a board item moves. {column} and {row} are 1-based\"\n },\n \"uic.Board.itemResized\": {\n \"defaultMessage\": \"Elementgröße auf {columns} Spalten mal {rows} Zeilen geändert.\",\n \"description\": \"Screen reader announcement while a board item is resized\"\n },\n \"uic.Board.moveCommitted\": {\n \"defaultMessage\": \"Verschieben übernommen.\",\n \"description\": \"Screen reader announcement when a board item is dropped in its new place\"\n },\n \"uic.Board.resizeCommitted\": {\n \"defaultMessage\": \"Größenänderung übernommen.\",\n \"description\": \"Screen reader announcement when a board item's new size is applied\"\n },\n \"uic.Board.moveDiscarded\": {\n \"defaultMessage\": \"Verschieben verworfen.\",\n \"description\": \"Screen reader announcement when moving a board item is cancelled\"\n },\n \"uic.Board.resizeDiscarded\": {\n \"defaultMessage\": \"Größenänderung verworfen.\",\n \"description\": \"Screen reader announcement when resizing a board item is cancelled\"\n },\n \"uic.Board.itemRemoved\": {\n \"defaultMessage\": \"Element entfernt.\",\n \"description\": \"Screen reader announcement when a board item is removed\"\n },\n \"uic.ColorPicker.label\": {\n \"defaultMessage\": \"Farbe auswählen\",\n \"description\": \"Accessible name of a color picker whose caller gave it no label\"\n },\n \"uic.ColorPicker.hexValue\": {\n \"defaultMessage\": \"Hex-Wert\",\n \"description\": \"Hidden label of the color picker's text field for a #rrggbb value\"\n },\n \"uic.ColorPicker.clear\": {\n \"defaultMessage\": \"Löschen\",\n \"description\": \"Button in a color picker that removes the chosen color\"\n },\n \"uic.ColorPicker.noColor\": {\n \"defaultMessage\": \"Keine Farbe\",\n \"description\": \"Shown on a color picker's trigger when no color is set\"\n },\n \"uic.DeleteConfirmModal.title\": {\n \"defaultMessage\": \"Löschen\",\n \"description\": \"Title of the dialog that confirms deleting one item\"\n },\n \"uic.DeleteConfirmModal.titleMany\": {\n \"defaultMessage\": \"{count, plural, other {# Elemente löschen}}\",\n \"description\": \"Title of the dialog that confirms deleting several items; {count} is how many\"\n },\n \"uic.DeleteConfirmModal.description\": {\n \"defaultMessage\": \"Sind Sie sicher, dass Sie löschen möchten?\",\n \"description\": \"Question above the list of items about to be deleted\"\n },\n \"uic.DeleteConfirmModal.targetDescription\": {\n \"defaultMessage\": \"Möchten Sie {target} wirklich dauerhaft löschen?\",\n \"description\": \"Question above the list of items about to be deleted; {target} names the kind of item, e.g. Project\"\n },\n \"uic.DeleteConfirmModal.typeToConfirm\": {\n \"defaultMessage\": \"Geben Sie {confirmText} ein, um zu bestätigen.\",\n \"description\": \"Instruction above the confirmation field; {confirmText} is the text to type, shown as a token\"\n },\n \"uic.DeleteConfirmModal.confirmText\": {\n \"defaultMessage\": \"Löschen\",\n \"description\": \"The word the user types to confirm deleting several items at once\"\n },\n \"uic.DeleteConfirmModal.cannotBeUndone\": {\n \"defaultMessage\": \"Diese Aktion kann nicht rückgängig gemacht werden.\",\n \"description\": \"Warning that the deletion is permanent\"\n },\n \"uic.NumberStepper.increase\": {\n \"defaultMessage\": \"Erhöhen\",\n \"description\": \"Accessible name of the button that steps a number field up\"\n },\n \"uic.NumberStepper.decrease\": {\n \"defaultMessage\": \"Verringern\",\n \"description\": \"Accessible name of the button that steps a number field down\"\n },\n \"uic.SelectionLabel.selectedCount\": {\n \"defaultMessage\": \"{count} ausgewählt\",\n \"description\": \"How many items are selected, e.g. rows of a table; {count} is the number\"\n },\n \"uic.SelectionLabel.clear\": {\n \"defaultMessage\": \"Alle abwählen\",\n \"description\": \"Button that clears the whole selection\"\n },\n \"uic.SkeletonCard.loading\": {\n \"defaultMessage\": \"Wird geladen\",\n \"description\": \"Accessible name of a card-shaped loading placeholder\"\n },\n \"uic.SkeletonRow.loading\": {\n \"defaultMessage\": \"Wird geladen\",\n \"description\": \"Accessible name of one list-row loading placeholder\"\n },\n \"uic.SkeletonText.loading\": {\n \"defaultMessage\": \"Wird geladen\",\n \"description\": \"Accessible name of a text-block loading placeholder\"\n },\n \"uic.Statistic.unlimited\": {\n \"defaultMessage\": \"Unbegrenzt\",\n \"description\": \"Shown in place of a metric's value when the value has no limit\"\n },\n \"uic.TokenRow.more\": {\n \"defaultMessage\": \"und {count} weitere\",\n \"description\": \"After a row of tokens cut short, how many were left out; {count} is the number\"\n },\n \"uic.UncontrolledInput.label\": {\n \"defaultMessage\": \"Auswählen\",\n \"description\": \"Hidden accessible name of an input whose caller gave it no label of its own\"\n },\n \"uic.UnitGrid.label\": {\n \"defaultMessage\": \"Ressourcenraster\",\n \"description\": \"Accessible name of a unit grid whose caller gave it no aria-label\"\n },\n \"uic.UnitGrid.changeGroupColor\": {\n \"defaultMessage\": \"Gruppenfarbe ändern\",\n \"description\": \"Button in a unit grid's hover card that opens the palette for the group\"\n },\n \"uic.UnitGrid.useColor\": {\n \"defaultMessage\": \"Farbe {index} verwenden\",\n \"description\": \"Accessible name of one palette swatch in a unit grid; {index} is its 1-based position\"\n },\n \"uic.Form.optional\": {\n \"defaultMessage\": \"(optional)\",\n \"description\": \"Suffix after the label of an optional field when requiredMark=\\\"optional\\\"\"\n },\n \"uic.Form.default\": {\n \"defaultMessage\": \"Feld-Validierungsfehler: {label}\",\n \"description\": \"Validation error when a rule failed without a more specific message\"\n },\n \"uic.Form.required\": {\n \"defaultMessage\": \"Bitte geben Sie {label} an\",\n \"description\": \"Validation error for an empty required field\"\n },\n \"uic.Form.whitespace\": {\n \"defaultMessage\": \"{label} darf kein Leerzeichen sein\",\n \"description\": \"Validation error for a required field that holds only whitespace\"\n },\n \"uic.Form.typeString\": {\n \"defaultMessage\": \"{label} ist nicht gültig. {type} erwartet\",\n \"description\": \"Validation error for a value that is not a string; {type} is the type name\"\n },\n \"uic.Form.typeNumber\": {\n \"defaultMessage\": \"{label} ist nicht gültig. {type} erwartet\",\n \"description\": \"Validation error for a value that is not a number; {type} is the type name\"\n },\n \"uic.Form.typeObject\": {\n \"defaultMessage\": \"{label} ist nicht gültig. {type} erwartet\",\n \"description\": \"Validation error for a value that is not an object; {type} is the type name\"\n },\n \"uic.Form.typeEmail\": {\n \"defaultMessage\": \"{label} ist nicht gültig. {type} erwartet\",\n \"description\": \"Validation error for an invalid email address; {type} is the type name\"\n },\n \"uic.Form.typeUrl\": {\n \"defaultMessage\": \"{label} ist nicht gültig. {type} erwartet\",\n \"description\": \"Validation error for an invalid URL; {type} is the type name\"\n },\n \"uic.Form.stringLen\": {\n \"defaultMessage\": \"{label} muss genau {len} Zeichen lang sein\",\n \"description\": \"Validation error for text of the wrong exact length\"\n },\n \"uic.Form.stringMin\": {\n \"defaultMessage\": \"{label} muss mindestens {min} Zeichen lang sein\",\n \"description\": \"Validation error for text shorter than the minimum\"\n },\n \"uic.Form.stringMax\": {\n \"defaultMessage\": \"{label} darf höchstens {max} Zeichen lang sein\",\n \"description\": \"Validation error for text longer than the maximum\"\n },\n \"uic.Form.stringRange\": {\n \"defaultMessage\": \"{label} muss zwischen {min} und {max} Zeichen lang sein\",\n \"description\": \"Validation error for text outside a length range\"\n },\n \"uic.Form.numberLen\": {\n \"defaultMessage\": \"{label} muss gleich {len} sein\",\n \"description\": \"Validation error for a number that must equal a value\"\n },\n \"uic.Form.numberMin\": {\n \"defaultMessage\": \"{label} muss mindestens {min} sein\",\n \"description\": \"Validation error for a number below the minimum\"\n },\n \"uic.Form.numberMax\": {\n \"defaultMessage\": \"{label} darf maximal {max} sein\",\n \"description\": \"Validation error for a number above the maximum\"\n },\n \"uic.Form.numberRange\": {\n \"defaultMessage\": \"{label} muss zwischen {min} und {max} liegen\",\n \"description\": \"Validation error for a number outside a range\"\n },\n \"uic.Form.arrayLen\": {\n \"defaultMessage\": \"Es müssen {len} {label} sein\",\n \"description\": \"Validation error for a list with the wrong number of items\"\n },\n \"uic.Form.arrayMin\": {\n \"defaultMessage\": \"Es müssen mindestens {min} {label} sein\",\n \"description\": \"Validation error for a list with too few items\"\n },\n \"uic.Form.arrayMax\": {\n \"defaultMessage\": \"Es dürfen maximal {max} {label} sein\",\n \"description\": \"Validation error for a list with too many items\"\n },\n \"uic.Form.arrayRange\": {\n \"defaultMessage\": \"Die Anzahl an {label} muss zwischen {min} und {max} liegen\",\n \"description\": \"Validation error for a list whose item count is outside a range\"\n },\n \"uic.Form.patternMismatch\": {\n \"defaultMessage\": \"{label} entspricht nicht dem {pattern} Muster\",\n \"description\": \"Validation error for text that does not match a pattern\"\n },\n \"uic.BulkEditFormItem.keepAsIs\": {\n \"defaultMessage\": \"Unverändert lassen\",\n \"description\": \"Placeholder of a bulk-edit field that leaves every selected item's current value unchanged\"\n },\n \"uic.BulkEditFormItem.clear\": {\n \"defaultMessage\": \"Löschen\",\n \"description\": \"Link that clears the field on every selected item, and the field's placeholder once cleared\"\n },\n \"uic.BulkEditFormItem.undoChanges\": {\n \"defaultMessage\": \"Änderungen rückgängig machen\",\n \"description\": \"Link that returns a bulk-edit field to keeping the current values\"\n },\n \"uic.BulkErrorModal.title\": {\n \"defaultMessage\": \"Ausführung fehlgeschlagen\",\n \"description\": \"Default title of the dialog that lists the failed items of a bulk operation\"\n },\n \"uic.BulkErrorModal.errorOccurred\": {\n \"defaultMessage\": \"Ein Fehler ist aufgetreten\",\n \"description\": \"Title of the error banner above the failed items, over the caller's guidance\"\n },\n \"uic.DataGrid.noData\": {\n \"defaultMessage\": \"Keine Daten zum Anzeigen\",\n \"description\": \"Shown in place of a data grid's rows when there are none\"\n },\n \"uic.DataGrid.invalidPage\": {\n \"defaultMessage\": \"Ungültige Seitenzahl\",\n \"description\": \"Shown in place of a data grid's rows when the current page lies past the last page\"\n },\n \"uic.DataGrid.goToFirstPage\": {\n \"defaultMessage\": \"Zur ersten Seite\",\n \"description\": \"Button under the invalid page message that returns to page 1\"\n },\n \"uic.DataGrid.expandRow\": {\n \"defaultMessage\": \"Zeile ausklappen\",\n \"description\": \"Accessible name of the button that shows or hides a row's details\"\n },\n \"uic.DataGrid.pagination\": {\n \"defaultMessage\": \"Seitennummerierung\",\n \"description\": \"Accessible name of a data grid's page navigation\"\n },\n \"uic.DataGrid.range\": {\n \"defaultMessage\": \"{start} - {end} von {total} Elementen\",\n \"description\": \"Beside a data grid's page navigation: the rows on screen out of the total. {start} and {end} are 1-based row numbers\"\n },\n \"uic.DataGrid.settings\": {\n \"defaultMessage\": \"Tabelleneinstellungen\",\n \"description\": \"Button under a data grid that opens its column settings, and the title of that dialog\"\n },\n \"uic.DataGrid.exportCsv\": {\n \"defaultMessage\": \"Als CSV exportieren\",\n \"description\": \"Button under a data grid that opens the CSV export dialog, and the title of that dialog\"\n },\n \"uic.DataGrid.selectColumns\": {\n \"defaultMessage\": \"Wählen Sie Spalten aus, um angezeigt zu werden\",\n \"description\": \"Subtitle of a data grid's column settings and CSV export dialogs\"\n },\n \"uic.DataGrid.searchColumns\": {\n \"defaultMessage\": \"Suchtabellenspalten\",\n \"description\": \"Placeholder of the column search field in a data grid's dialogs, also shown when no column matches\"\n },\n \"uic.DataGrid.reorderColumn\": {\n \"defaultMessage\": \"{column} verschieben\",\n \"description\": \"Accessible name of the drag handle beside a column in a data grid's column settings dialog. {column} is the column's label\"\n },\n \"uic.DataGrid.reorderInstructions\": {\n \"defaultMessage\": \"Drücken Sie die Leertaste, um die Spalte aufzunehmen, verschieben Sie sie mit den Pfeiltasten und drücken Sie erneut die Leertaste, um sie abzulegen, oder Escape, um abzubrechen.\",\n \"description\": \"Screen reader instructions for a drag handle in a data grid's column settings dialog\"\n },\n \"uic.DataGrid.reorderPickedUp\": {\n \"defaultMessage\": \"{column} aufgenommen. Position {position} von {total}.\",\n \"description\": \"Screen reader announcement when a column is picked up for reordering in the column settings dialog. {position} is 1-based\"\n },\n \"uic.DataGrid.reorderMoved\": {\n \"defaultMessage\": \"{column} auf Position {position} von {total} verschoben.\",\n \"description\": \"Screen reader announcement while a picked-up column moves in the column settings dialog. {position} is 1-based\"\n },\n \"uic.DataGrid.reorderDropped\": {\n \"defaultMessage\": \"{column} auf Position {position} von {total} abgelegt.\",\n \"description\": \"Screen reader announcement when a column is dropped in the column settings dialog. {position} is 1-based\"\n },\n \"uic.DataGrid.reorderCancelled\": {\n \"defaultMessage\": \"Verschieben abgebrochen. {column} ist wieder auf Position {position} von {total}.\",\n \"description\": \"Screen reader announcement when reordering a column is cancelled in the column settings dialog. {position} is 1-based\"\n },\n \"uic.DataGrid.export\": {\n \"defaultMessage\": \"Exportieren\",\n \"description\": \"Primary button of a data grid's CSV export dialog\"\n },\n \"uic.PagedSelector.placeholder\": {\n \"defaultMessage\": \"{label} auswählen\",\n \"description\": \"Placeholder of a selector with nothing selected; {label} is the field's label\"\n },\n \"uic.PagedSelector.searchOptions\": {\n \"defaultMessage\": \"Optionen durchsuchen\",\n \"description\": \"Accessible name of the search box at the top of a selector's option list\"\n },\n \"uic.PagedSelector.searchPlaceholder\": {\n \"defaultMessage\": \"Suchen\",\n \"description\": \"Placeholder of the search box at the top of a selector's option list\"\n },\n \"uic.PagedSelector.clearSearch\": {\n \"defaultMessage\": \"Optionen durchsuchen löschen\",\n \"description\": \"Accessible name of the button that empties a selector's search box\"\n },\n \"uic.PagedSelector.noResults\": {\n \"defaultMessage\": \"Keine Ergebnisse\",\n \"description\": \"Shown in a selector's option list when no option matches\"\n },\n \"uic.PagedSelector.loading\": {\n \"defaultMessage\": \"Wird geladen...\",\n \"description\": \"Shown in a selector's empty option list while options are being fetched\"\n },\n \"uic.PagedSelector.totalItems\": {\n \"defaultMessage\": \"Total {total} Elemente\",\n \"description\": \"Foot of a selector's option list; {total} is how many options exist in all pages\"\n },\n \"uic.Board.directionUp\": {\n \"defaultMessage\": \"Nach oben\",\n \"description\": \"Accessible name of the button that moves an activated board item, or shrinks a resized one, one row up\"\n },\n \"uic.Board.directionDown\": {\n \"defaultMessage\": \"Nach unten\",\n \"description\": \"Accessible name of the button that moves an activated board item, or grows a resized one, one row down\"\n },\n \"uic.Board.directionLeft\": {\n \"defaultMessage\": \"Nach links\",\n \"description\": \"Accessible name of the button that moves an activated board item, or shrinks a resized one, one column left\"\n },\n \"uic.Board.directionRight\": {\n \"defaultMessage\": \"Nach rechts\",\n \"description\": \"Accessible name of the button that moves an activated board item, or grows a resized one, one column right\"\n }\n}\n"],"mappings":""}
|
|
@@ -24,6 +24,50 @@ var e = {
|
|
|
24
24
|
defaultMessage: "Εφαρμογή",
|
|
25
25
|
description: "Generic label of a button that applies the changes made in a dialog"
|
|
26
26
|
},
|
|
27
|
+
"uic.Board.dragHandle": {
|
|
28
|
+
defaultMessage: "Λαβή μεταφοράς",
|
|
29
|
+
description: "Accessible name of the button at a board item's top-left corner that moves the item"
|
|
30
|
+
},
|
|
31
|
+
"uic.Board.resizeHandle": {
|
|
32
|
+
defaultMessage: "Λαβή αλλαγής μεγέθους",
|
|
33
|
+
description: "Accessible name of the button at a board item's bottom-right corner that resizes the item"
|
|
34
|
+
},
|
|
35
|
+
"uic.Board.moveStarted": {
|
|
36
|
+
defaultMessage: "Μεταφορά σε εξέλιξη.",
|
|
37
|
+
description: "Screen reader announcement when a board item is picked up to be moved"
|
|
38
|
+
},
|
|
39
|
+
"uic.Board.resizeStarted": {
|
|
40
|
+
defaultMessage: "Αλλαγή μεγέθους σε εξέλιξη.",
|
|
41
|
+
description: "Screen reader announcement when a board item starts being resized"
|
|
42
|
+
},
|
|
43
|
+
"uic.Board.itemMoved": {
|
|
44
|
+
defaultMessage: "Το στοιχείο μετακινήθηκε στη στήλη {column}, γραμμή {row}.",
|
|
45
|
+
description: "Screen reader announcement while a board item moves. {column} and {row} are 1-based"
|
|
46
|
+
},
|
|
47
|
+
"uic.Board.itemResized": {
|
|
48
|
+
defaultMessage: "Το μέγεθος του στοιχείου άλλαξε σε {columns} στήλες επί {rows} γραμμές.",
|
|
49
|
+
description: "Screen reader announcement while a board item is resized"
|
|
50
|
+
},
|
|
51
|
+
"uic.Board.moveCommitted": {
|
|
52
|
+
defaultMessage: "Η μετακίνηση εφαρμόστηκε.",
|
|
53
|
+
description: "Screen reader announcement when a board item is dropped in its new place"
|
|
54
|
+
},
|
|
55
|
+
"uic.Board.resizeCommitted": {
|
|
56
|
+
defaultMessage: "Η αλλαγή μεγέθους εφαρμόστηκε.",
|
|
57
|
+
description: "Screen reader announcement when a board item's new size is applied"
|
|
58
|
+
},
|
|
59
|
+
"uic.Board.moveDiscarded": {
|
|
60
|
+
defaultMessage: "Η μετακίνηση ακυρώθηκε.",
|
|
61
|
+
description: "Screen reader announcement when moving a board item is cancelled"
|
|
62
|
+
},
|
|
63
|
+
"uic.Board.resizeDiscarded": {
|
|
64
|
+
defaultMessage: "Η αλλαγή μεγέθους ακυρώθηκε.",
|
|
65
|
+
description: "Screen reader announcement when resizing a board item is cancelled"
|
|
66
|
+
},
|
|
67
|
+
"uic.Board.itemRemoved": {
|
|
68
|
+
defaultMessage: "Το στοιχείο αφαιρέθηκε.",
|
|
69
|
+
description: "Screen reader announcement when a board item is removed"
|
|
70
|
+
},
|
|
27
71
|
"uic.ColorPicker.label": {
|
|
28
72
|
defaultMessage: "Επιλογή χρώματος",
|
|
29
73
|
description: "Accessible name of a color picker whose caller gave it no label"
|
|
@@ -323,6 +367,22 @@ var e = {
|
|
|
323
367
|
"uic.PagedSelector.totalItems": {
|
|
324
368
|
defaultMessage: "Σύνολο {total} στοιχεία",
|
|
325
369
|
description: "Foot of a selector's option list; {total} is how many options exist in all pages"
|
|
370
|
+
},
|
|
371
|
+
"uic.Board.directionUp": {
|
|
372
|
+
defaultMessage: "Πάνω",
|
|
373
|
+
description: "Accessible name of the button that moves an activated board item, or shrinks a resized one, one row up"
|
|
374
|
+
},
|
|
375
|
+
"uic.Board.directionDown": {
|
|
376
|
+
defaultMessage: "Κάτω",
|
|
377
|
+
description: "Accessible name of the button that moves an activated board item, or grows a resized one, one row down"
|
|
378
|
+
},
|
|
379
|
+
"uic.Board.directionLeft": {
|
|
380
|
+
defaultMessage: "Αριστερά",
|
|
381
|
+
description: "Accessible name of the button that moves an activated board item, or shrinks a resized one, one column left"
|
|
382
|
+
},
|
|
383
|
+
"uic.Board.directionRight": {
|
|
384
|
+
defaultMessage: "Δεξιά",
|
|
385
|
+
description: "Accessible name of the button that moves an activated board item, or grows a resized one, one column right"
|
|
326
386
|
}
|
|
327
387
|
};
|
|
328
388
|
//#endregion
|