@rt-tools/ui-kit-v2 0.34.3 → 0.34.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-action-bar.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-aside.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-aside.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-copy-value.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-counter.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-counter.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +4 -0
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs +4 -0
- package/fesm2022/rt-tools-ui-kit-v2-data-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs +4 -0
- package/fesm2022/rt-tools-ui-kit-v2-date-picker.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-date-range.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-dialog.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-file-card.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-header.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-header.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs +103 -6
- package/fesm2022/rt-tools-ui-kit-v2-icon-button.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-image-upload.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-inline-edit.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-input-number.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs +6 -1
- package/fesm2022/rt-tools-ui-kit-v2-input.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-message.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-message.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-pagination.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-pdf-viewer.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-pdf-viewer.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-photo-viewer.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +10 -0
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +6 -0
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-speed-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs +8 -0
- package/fesm2022/rt-tools-ui-kit-v2-table.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-theme-toggle.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-thread-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-toast.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-workspace-details.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +2 -0
- package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/components/icon-button/CONTEXT.md +32 -16
- package/src/lib/components/icon-button/rt-icon-button.component.scss +17 -9
- package/src/lib/components/input/CONTEXT.md +6 -0
- package/src/styles/_form.scss +14 -1
- package/styles/tokens.css +13 -1
- package/types/rt-tools-ui-kit-v2-icon-button.d.ts +38 -2
- package/types/rt-tools-ui-kit-v2-input.d.ts +2 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rt-tools-ui-kit-v2-select.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/select/rt-select-option.directive.ts","../../../projects/ui-kit-v2/src/lib/components/select/rt-select-trigger.directive.ts","../../../projects/ui-kit-v2/src/lib/components/select/rt-select.component.ts","../../../projects/ui-kit-v2/src/lib/components/select/rt-select.component.html"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { IRtSelect } from './rt-select.model';\n\n/**\n * Маркер своей разметки строки списка — того, что рисуется на месте подписи пункта.\n *\n * Строка остаётся киту: выбор, подсветка, клавиши, стрелка ветки дерева и галочка выбранного. Потребитель\n * даёт только то, что стоит на месте подписи, — например цветную метку перед текстом, — и получает опцию\n * и признак, выбрана ли она. Тем же шаблоном поле рисует выбранное значение — метка из списка не\n * пропадает после выбора.\n *\n * @example\n * ```html\n * <rt-select [options]=\"colors\">\n * <ng-template rtSelectOption let-option let-selected=\"selected\">\n * <span class=\"dot\" [style.background]=\"option.value\"></span>{{ option.label }}\n * </ng-template>\n * </rt-select>\n * ```\n */\n@Directive({\n selector: '[rtSelectOption]',\n})\nexport class RtSelectOptionDirective<TValue = unknown> {\n public readonly templateRef: TemplateRef<IRtSelect.OptionContext<TValue>> =\n inject<TemplateRef<IRtSelect.OptionContext<TValue>>>(TemplateRef);\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { IRtSelect } from './rt-select.model';\n\n/**\n * Маркер своей разметки указателя — того, что человек нажимает, чтобы открыть список.\n *\n * Поведение указателя остаётся киту: открытие панели, её ширина, приметы доступности,\n * отключённость, клавиши и закрытие висят на кнопке. Потребитель даёт только то, что рисуется\n * внутри неё, и получает три значения обстановки: открыт ли список, что выбрано, отключён ли выбор.\n *\n * Один маркер на обе семьи выбора: они отличаются только разметкой внутри кнопки, и два маркера\n * разошлись бы на первой же правке.\n *\n * @example\n * ```html\n * <rt-select [options]=\"options\">\n * <ng-template rtSelectTrigger let-state>\n * <rt-tag [value]=\"state.label\" [icon]=\"state.isOpen ? 'chevron-up' : 'chevron-down'\" />\n * </ng-template>\n * </rt-select>\n * ```\n */\n@Directive({\n selector: '[rtSelectTrigger]',\n})\nexport class RtSelectTriggerDirective<TValue = unknown> {\n public readonly templateRef: TemplateRef<IRtSelect.TriggerContext<TValue>> =\n inject<TemplateRef<IRtSelect.TriggerContext<TValue>>>(TemplateRef);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n computed,\n contentChild,\n forwardRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { rtNotchWidth, RtFormControlBase } from '@rt-tools/ui-kit-v2/form-control';\nimport { IRtInput } from '@rt-tools/ui-kit-v2/core';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtInputComponent } from '@rt-tools/ui-kit-v2/input';\nimport { RtPopoverDirective } from '@rt-tools/ui-kit-v2/popover';\nimport { IRtPopover } from '@rt-tools/ui-kit-v2/popover';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { RtOptionList, TRtOptionListAction } from '@rt-tools/ui-kit-v2/core';\nimport { rtTreeFind, rtTreeIsTree, rtTreeOpenFor, rtTreeRows, rtTreeSideKey, rtTreeToggle } from '@rt-tools/ui-kit-v2/core';\nimport { RtSelectOptionDirective } from './rt-select-option.directive';\nimport { RtSelectTriggerDirective } from './rt-select-trigger.directive';\nimport { IRtSelect } from './rt-select.model';\n\nconst BEM_BLOCK: string = 'rt-select';\n\n/** Клавиши, открывающие закрытый dropdown с фокуса на trigger'е. */\n\ntype TBooleanInput = boolean | string;\n\nlet panelIdSeed: number = 0;\n\nfunction nextPanelId(): number {\n panelIdSeed += 1;\n return panelIdSeed;\n}\n\n/**\n * Single-select dropdown с опциональным filter input.\n *\n * Panel рендерится через CDK Overlay (директива `[rtPopover]` на trigger'е) —\n * не обрезается `overflow: hidden` предками (таблицы, aside, карточки) и\n * авто-flip'ается у края viewport. CVA через общий `RtFormControlBase`. Крестик\n * (`clearable`) слева от шеврона — виден при наличии значения, очищает выбор.\n *\n * Keyboard-nav (activedescendant): фокус на trigger'е, ArrowUp/Down двигают\n * виртуальный highlight (`aria-activedescendant`), Enter выбирает, Escape\n * закрывает. Home/End/typeahead — deferred.\n */\n@Component({\n selector: 'rt-select',\n templateUrl: './rt-select.component.html',\n styleUrls: ['./rt-select.component.scss', './rt-select-floating-label.scss', './rt-select-clear.scss', './rt-select-material.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n FormsModule,\n NgTemplateOutlet,\n\n // standalone components / directives\n RtIconButtonComponent,\n RtIconComponent,\n RtInputComponent,\n RtPopoverDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n providers: [\n // Алиас базового токена — для contentChild(RtFormControlBase) в rt-field.\n { provide: RtFormControlBase, useExisting: forwardRef(() => RtSelectComponent) },\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n '[class.rt-select--open]': 'isOpen()',\n '[class.rt-select--disabled]': 'isDisabled()',\n '[class.rt-select--readonly]': 'isReadonly()',\n '[class.rt-select--invalid]': 'isInvalid()',\n '[class.rt-select--borderless]': '!bordered()',\n '[class.rt-select--appearance--fill]': \"appearance() === 'fill'\",\n '[class.rt-select--size--sm]': \"size() === 'sm'\",\n '[class.rt-select--size--lg]': \"size() === 'lg'\",\n '[class.rt-select--with-icon-left]': '!!iconLeft()',\n '[class.rt-select--floating]': '!!floatingLabel()',\n '[style.--rt-select-notch-width]': \"notchWidth() + 'px'\",\n '[class.rt-select--filled]': 'hasValue()',\n },\n})\nexport class RtSelectComponent<TValue> extends RtFormControlBase<TValue | null> {\n readonly #t_uiSearch: Signal<string> = rtKitLabel('uiSearch');\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly panelId: string = `rt-select-panel-${nextPanelId()}`;\n\n protected readonly filterPlaceholderText: Signal<string> = computed((): string => this.filterPlaceholder() || this.#t_uiSearch());\n\n protected readonly popover: Signal<RtPopoverDirective> = viewChild.required(RtPopoverDirective);\n\n protected readonly triggerEl: Signal<ElementRef<HTMLButtonElement> | undefined> = viewChild<ElementRef<HTMLButtonElement>>('triggerEl');\n\n /** Подпись на рамке: по её ширине материальный набор вырезает разрыв в рамке. `#`-поле `viewChild` не принимает. */\n protected readonly floatingLabelEl: Signal<ElementRef<HTMLElement> | undefined> = viewChild<ElementRef<HTMLElement>>('floatingLabelEl');\n\n /** Ширина подписи на рамке, px. */\n protected readonly notchWidth: Signal<number> = rtNotchWidth(this.floatingLabelEl);\n\n protected readonly filterTerm: WritableSignal<string> = signal<string>('');\n /** Раскрытые ветки дерева. Живут, пока открыта панель: при открытии раскрыты ветки над выбранным. */\n protected readonly openBranches: WritableSignal<ReadonlySet<TValue>> = signal<ReadonlySet<TValue>>(new Set<TValue>());\n\n protected readonly isOpen: Signal<boolean> = computed((): boolean => this.popover().isOpen());\n\n /** Клавиатура списка: подсветка, клавиши открытия, id для `aria-activedescendant`, прокрутка к опции. */\n protected readonly optionList: RtOptionList = new RtOptionList({\n panelId: (): string => this.panelId,\n isOpen: (): boolean => this.isOpen(),\n count: (): number => this.rows().length,\n isDisabled: (index: number): boolean => Boolean(this.rows()[index]?.option.disabled),\n chooseKeys: new Set<string>(['Enter', ' ']),\n sideKeys: true,\n edgeKeys: true,\n });\n\n protected readonly activeIndex: WritableSignal<number> = this.optionList.activeIndex;\n\n /** Идентификатор подсвеченной опции — тот же, что уходит в `aria-activedescendant`. */\n protected readonly activeOptionId: Signal<string | null> = this.optionList.activeOptionId;\n\n /**\n * Своя разметка указателя, если потребитель её объявил. Не объявил — кит рисует свою, и ни один\n * нынешний потребитель не двигается.\n */\n protected readonly triggerTpl: Signal<RtSelectTriggerDirective<TValue> | undefined> = contentChild(RtSelectTriggerDirective);\n\n /** Своя разметка строки списка; не объявлена — строка рисует подпись опции. */\n protected readonly optionTpl: Signal<RtSelectOptionDirective<TValue> | undefined> = contentChild(RtSelectOptionDirective);\n\n protected readonly hasValue: Signal<boolean> = computed((): boolean => this.value() !== null);\n\n /** Id подписи на рамке: на него ссылается `aria-labelledby` указателя. */\n protected readonly floatingLabelId: string = `${this.panelId}-label`;\n\n /** Id текста выбранного значения в указателе: его имя читает скринридер вслед за подписью. */\n protected readonly valueTextId: string = `${this.panelId}-value`;\n\n /**\n * Подпись на рамке называет указатель, только когда явного `ariaLabel` нет. Ссылка заменяет имя\n * из содержимого кнопки, поэтому за подписью идёт и выбранное значение — иначе скринридер\n * назвал бы поле без того, что в нём выбрано.\n */\n protected readonly labelledBy: Signal<string | null> = computed((): string | null =>\n this.floatingLabel() && !this.ariaLabel() ? `${this.floatingLabelId} ${this.valueTextId}` : null\n );\n\n /** Выбранная опция: по ней указатель рисует подпись или ту же разметку строки, что и список. */\n protected readonly selectedOption: Signal<IRtSelect.Option<TValue> | null> = computed((): IRtSelect.Option<TValue> | null => {\n const v: TValue | null = this.value();\n return v === null ? null : (rtTreeFind(this.options(), v) ?? null);\n });\n\n /** Разметка выбранного в указателе — шаблон строки с выбранной опцией; без шаблона или выбора её нет. */\n protected readonly chosenOwn: Signal<IRtSelect.ChosenView<TValue> | null> = computed((): IRtSelect.ChosenView<TValue> | null => {\n const tpl: RtSelectOptionDirective<TValue> | undefined = this.optionTpl();\n const option: IRtSelect.Option<TValue> | null = this.selectedOption();\n return tpl && option ? { templateRef: tpl.templateRef, context: { $implicit: option, selected: true } } : null;\n });\n\n protected readonly selectedLabel: Signal<string> = computed((): string => this.selectedOption()?.label ?? '');\n\n /** Дерево ли список: тогда у строк есть место под стрелку и отступ по уровню. */\n protected readonly isTree: Signal<boolean> = computed((): boolean => rtTreeIsTree(this.options()));\n\n /** Видимые строки: плоский список — как прежде, дерево — по раскрытым веткам и поисковому слову. */\n protected readonly rows: Signal<ReadonlyArray<IRtSelect.Row<TValue>>> = computed((): ReadonlyArray<IRtSelect.Row<TValue>> =>\n rtTreeRows(this.options(), this.openBranches(), this.filterTerm())\n );\n\n /** Три значения, которые кит отдаёт своей разметке указателя, и не больше. */\n protected readonly triggerState: Signal<IRtSelect.TriggerState<TValue>> = computed((): IRtSelect.TriggerState<TValue> => ({\n isOpen: this.isOpen(),\n value: this.value(),\n label: this.selectedLabel(),\n isDisabled: this.isDisabled(),\n }));\n\n /** Вид рамки: `outline` — рамка со всех сторон, `fill` — залитое поле с чертой снизу. */\n public override readonly fieldLabelInside: boolean = true;\n public readonly appearance: InputSignal<IRtInput.Appearance> = input<IRtInput.Appearance>('outline');\n\n public readonly displayText: Signal<string> = computed((): string => this.selectedLabel());\n\n public readonly options: InputSignal<ReadonlyArray<IRtSelect.Option<TValue>>> = input<ReadonlyArray<IRtSelect.Option<TValue>>>([]);\n\n public readonly placeholder: InputSignal<string> = input<string>('');\n\n public readonly iconLeft: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /**\n * Видимая подпись на рамке. Пока ничего не выбрано и список закрыт, лежит на месте подсказки;\n * при выбранном значении или открытом списке поднимается на верхнюю рамку. `null` — подписи нет.\n */\n public readonly floatingLabel: InputSignal<string | null> = input<string | null>(null);\n\n public readonly filter: InputSignalWithTransform<boolean, TBooleanInput> = input<boolean, TBooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly filterPlaceholder: InputSignal<string> = input<string>('');\n\n /**\n * Чем мерится панель. По умолчанию она не уже кнопки и дальше растёт по содержимому:\n * со своим указателем кнопка бывает узкой, и панель по её ширине давила бы содержимое.\n * `trigger` возвращает прежнее — ровно по кнопке, `auto` пускает панель по содержимому\n * целиком. Предел высоты назначается входом `panelMaxHeight`.\n */\n public readonly panelWidth: InputSignal<IRtPopover.Width> = input<IRtPopover.Width>('trigger-min');\n\n /**\n * Предел высоты панели — длина как в стилях, например `20rem`. Пусто — предел кита\n * `--rt-input-panel-max-height`, и длинный список прокручивается внутри панели: без предела\n * он уходил за нижний край экрана, и пункты за краем были недостижимы. `none` снимает предел —\n * для короткого списка, который должен открываться целиком, без прокрутки. Значение ставится\n * на саму панель: она рисуется в наложении, вне поддерева блока.\n */\n public readonly panelMaxHeight: InputSignal<string | null> = input<string | null>(null);\n\n public readonly selectionChange: OutputEmitterRef<TValue | null> = output<TValue | null>();\n\n public override setDisabledState(disabled: boolean): void {\n super.setDisabledState(disabled);\n if (disabled) {\n this.popover().close();\n }\n }\n\n protected getEmptyValue(): TValue | null {\n return null;\n }\n\n protected focusAfterClear(): void {\n this.triggerEl()?.nativeElement.focus();\n }\n\n protected override clear(event?: Event): void {\n if (this.isDisabled()) {\n return;\n }\n super.clear(event);\n this.selectionChange.emit(null);\n }\n\n /**\n * Открытый список встаёт подсветкой на выбранный пункт.\n *\n * Иначе стрелка вниз начинала с первого пункта, и человек с выбранным «20» из «10, 20, 40»\n * получал «10» вместо «40».\n */\n protected onOpened(): void {\n const v: TValue | null = this.value();\n this.openBranches.set(rtTreeOpenFor(this.options(), v === null ? [] : [v]));\n if (v !== null) {\n const chosen: number = this.rows().findIndex((row: IRtSelect.Row<TValue>): boolean => row.option.value === v);\n if (chosen >= 0) {\n this.activeIndex.set(chosen);\n }\n }\n }\n\n protected toggleBranch(event: Event, value: TValue): void {\n event.stopPropagation();\n this.openBranches.update((open: ReadonlySet<TValue>): ReadonlySet<TValue> => rtTreeToggle(open, value));\n }\n\n protected onClosed(): void {\n // Закрытие (outside-click / Escape / выбор) = пользователь увёл фокус.\n this.filterTerm.set('');\n this.activeIndex.set(-1);\n this.markTouched();\n }\n\n protected select(opt: IRtSelect.Option<TValue>): void {\n if (opt.disabled) {\n return;\n }\n this.value.set(opt.value);\n this.emitChange(opt.value);\n this.selectionChange.emit(opt.value);\n this.popover().close();\n }\n\n protected setFilter(term: string): void {\n this.filterTerm.set(term);\n this.activeIndex.set(-1);\n }\n\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) {\n return;\n }\n if (!this.isOpen()) {\n if (this.optionList.opensBy(event.key)) {\n event.preventDefault();\n this.popover().open();\n if (this.activeIndex() < 0) {\n this.optionList.move(1);\n }\n }\n return;\n }\n this.#handleOpenKeydown(event);\n }\n\n #handleOpenKeydown(event: KeyboardEvent): void {\n const action: TRtOptionListAction = this.optionList.actionOf(event.key);\n if (action === 'none') {\n return;\n }\n event.preventDefault();\n switch (action) {\n case 'next':\n this.optionList.move(1);\n break;\n case 'previous':\n this.optionList.move(-1);\n break;\n case 'first':\n this.optionList.first();\n break;\n case 'last':\n this.optionList.last();\n break;\n case 'choose':\n this.#selectActive();\n break;\n case 'close':\n // Escape закрывает один слой: панель. Без остановки событие всплывает до document,\n // и оверлей под панелью — боковая панель, окно — закрывается вместе с ней.\n event.stopPropagation();\n this.popover().close();\n break;\n case 'side':\n this.#sideKey(event.key);\n break;\n }\n }\n\n #sideKey(key: string): void {\n const answer: IRtSelect.SideKeyAnswer<TValue> = rtTreeSideKey(this.rows(), this.activeIndex(), key);\n const toggle: TValue | null = answer.toggle;\n if (toggle !== null) {\n this.openBranches.update((open: ReadonlySet<TValue>): ReadonlySet<TValue> => rtTreeToggle(open, toggle));\n }\n this.activeIndex.set(answer.index);\n }\n\n #selectActive(): void {\n const opts: ReadonlyArray<IRtSelect.Option<TValue>> = this.rows().map(\n (row: IRtSelect.Row<TValue>): IRtSelect.Option<TValue> => row.option\n );\n const index: number = this.activeIndex();\n if (index >= 0 && index < opts.length) {\n this.select(opts[index]);\n }\n }\n}\n","<ng-container rtBlock=\"rt-select\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" [rtMod]=\"{ empty: !displayText() }\">{{ displayText() || '—' }}</span>\n }\n <button\n #triggerEl\n rtElem=\"trigger\"\n qa-dataid=\"select-trigger\"\n type=\"button\"\n [rtPopoverWidth]=\"panelWidth()\"\n [rtMod]=\"{ own: !!triggerTpl() }\"\n [rtPopover]=\"panelTpl\"\n [rtPopoverDisabled]=\"isDisabled()\"\n [attr.id]=\"effectiveControlId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n [disabled]=\"isDisabled()\"\n (keydown)=\"onTriggerKeydown($event)\"\n (rtPopoverOpened)=\"onOpened()\"\n (rtPopoverClosed)=\"onClosed()\">\n <!--\n Разметка указателя: своя, если потребитель её объявил, иначе зашитая китом. Она встаёт\n внутрь кнопки, а не вместо неё: поведение — открытие панели, приметы доступности,\n отключённость, клавиши и закрытие — остаётся на кнопке кита.\n -->\n @if (triggerTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" [ngTemplateOutletContext]=\"{ $implicit: triggerState() }\" />\n } @else {\n @if (iconLeft(); as left) {\n <rt-icon rtElem=\"icon-left\" size=\"sm\" color=\"muted\" [name]=\"left\" />\n }\n <span rtElem=\"label\" [id]=\"valueTextId\" [rtMod]=\"{ placeholder: !selectedLabel() }\">\n <!-- Шаблон строки рисует и выбранное значение: цветная метка из списка не пропадает в поле. -->\n @if (chosenOwn(); as own) {\n <span rtElem=\"option-content\" qa-dataid=\"select-value-content\">\n <ng-container [ngTemplateOutlet]=\"own.templateRef\" [ngTemplateOutletContext]=\"own.context\" />\n </span>\n } @else {\n {{ selectedLabel() || placeholder() }}\n }\n </span>\n @if (showClearButton()) {\n @if (clearTabbable()) {\n <!-- Место крестика в строке: сам крестик в порядке Tab стоит рядом с кнопкой, ниже. -->\n <span rtElem=\"clear-slot\" aria-hidden=\"true\"></span>\n } @else {\n <rt-icon-button\n rtElem=\"clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [ariaLabel]=\"t().uiClear\"\n [tabIndex]=\"-1\"\n (clicked)=\"clear($event)\" />\n }\n }\n <rt-icon rtElem=\"chevron\" name=\"chevron-down\" size=\"sm\" color=\"muted\" />\n }\n </button>\n\n @if (showClearButton() && clearTabbable() && !triggerTpl()) {\n <!--\n Крестик в порядке обхода — соседняя кнопка поверх своего места в строке, а не кнопка в\n кнопке: вложенную кнопку скринридер не объявляет, а её Enter открывал бы список.\n -->\n <rt-icon-button\n rtElem=\"clear\"\n qa-dataid=\"select-clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [rtMod]=\"{ outside: true }\"\n [ariaLabel]=\"t().uiClear\"\n [tabIndex]=\"0\"\n (clicked)=\"clear($event)\" />\n }\n\n @if (floatingLabel(); as label) {\n <!-- Подпись — картинка поверх указателя: клик проходит сквозь неё в кнопку, имя кнопке она даёт по aria-labelledby. -->\n <span #floatingLabelEl rtElem=\"floating-label\" qa-dataid=\"select-floating-label\" aria-hidden=\"true\" [id]=\"floatingLabelId\">\n {{ label }}\n </span>\n }\n\n <ng-template #panelTpl>\n <div rtElem=\"panel\" role=\"listbox\" [style.--rt-select-panel-max-height]=\"panelMaxHeight()\" [attr.aria-label]=\"ariaLabel()\">\n @if (filter()) {\n <div rtElem=\"filter\">\n <rt-input\n iconLeft=\"ico-search\"\n [placeholder]=\"filterPlaceholderText()\"\n [ngModel]=\"filterTerm()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"setFilter($event)\" />\n </div>\n }\n <!--\n Опции listbox'а выбираются мышью через (click); keyboard-nav —\n на trigger'е (activedescendant: ArrowUp/Down/Enter), опции не\n focusable индивидуально, поэтому a11y-правила здесь не применимы.\n -->\n <!-- eslint-disable @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <ul rtElem=\"list\">\n @for (row of rows(); track row.option.value; let i = $index) {\n <li\n rtElem=\"option\"\n qa-dataid=\"select-option\"\n role=\"option\"\n [id]=\"panelId + '-opt-' + i\"\n [attr.data-value]=\"row.option.value\"\n [attr.aria-level]=\"isTree() ? row.level + 1 : null\"\n [style.--rt-select-tree-level]=\"row.level\"\n [rtMod]=\"{\n selected: row.option.value === value(),\n active: i === activeIndex(),\n disabled: !!row.option.disabled,\n }\"\n [attr.aria-selected]=\"row.option.value === value()\"\n [attr.aria-disabled]=\"!!row.option.disabled\"\n (click)=\"select(row.option)\">\n @if (isTree()) {\n @if (row.branch) {\n <button\n rtElem=\"toggle\"\n qa-dataid=\"select-option-toggle\"\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"row.open ? t().uiCollapse : t().uiExpand\"\n [attr.aria-expanded]=\"row.open\"\n (click)=\"toggleBranch($event, row.option.value)\">\n <rt-icon size=\"sm\" color=\"muted\" [name]=\"row.open ? 'chevron-down' : 'chevron-right'\" />\n </button>\n } @else {\n <span rtElem=\"toggle-space\"></span>\n }\n }\n @if (optionTpl(); as tpl) {\n <span rtElem=\"option-content\" qa-dataid=\"select-option-content\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: row.option, selected: row.option.value === value() }\" />\n </span>\n } @else {\n <span rtElem=\"option-label\">{{ row.option.label }}</span>\n }\n @if (row.option.value === value()) {\n <rt-icon rtElem=\"check\" name=\"check\" size=\"sm\" aria-hidden=\"true\" />\n }\n </li>\n } @empty {\n <li rtElem=\"empty\">{{ t().uiNoOptions }}</li>\n }\n </ul>\n </div>\n </ng-template>\n</ng-container>\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"rt-tools-ui-kit-v2-select.mjs","names":[],"sources":["../../../projects/ui-kit-v2/src/lib/components/select/rt-select-option.directive.ts","../../../projects/ui-kit-v2/src/lib/components/select/rt-select-trigger.directive.ts","../../../projects/ui-kit-v2/src/lib/components/select/rt-select.component.ts","../../../projects/ui-kit-v2/src/lib/components/select/rt-select.component.html"],"sourcesContent":["import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { IRtSelect } from './rt-select.model';\n\n/**\n * Маркер своей разметки строки списка — того, что рисуется на месте подписи пункта.\n *\n * Строка остаётся киту: выбор, подсветка, клавиши, стрелка ветки дерева и галочка выбранного. Потребитель\n * даёт только то, что стоит на месте подписи, — например цветную метку перед текстом, — и получает опцию\n * и признак, выбрана ли она. Тем же шаблоном поле рисует выбранное значение — метка из списка не\n * пропадает после выбора.\n *\n * @example\n * ```html\n * <rt-select [options]=\"colors\">\n * <ng-template rtSelectOption let-option let-selected=\"selected\">\n * <span class=\"dot\" [style.background]=\"option.value\"></span>{{ option.label }}\n * </ng-template>\n * </rt-select>\n * ```\n */\n@Directive({\n selector: '[rtSelectOption]',\n})\nexport class RtSelectOptionDirective<TValue = unknown> {\n public readonly templateRef: TemplateRef<IRtSelect.OptionContext<TValue>> =\n inject<TemplateRef<IRtSelect.OptionContext<TValue>>>(TemplateRef);\n}\n","import { Directive, inject, TemplateRef } from '@angular/core';\n\nimport { IRtSelect } from './rt-select.model';\n\n/**\n * Маркер своей разметки указателя — того, что человек нажимает, чтобы открыть список.\n *\n * Поведение указателя остаётся киту: открытие панели, её ширина, приметы доступности,\n * отключённость, клавиши и закрытие висят на кнопке. Потребитель даёт только то, что рисуется\n * внутри неё, и получает три значения обстановки: открыт ли список, что выбрано, отключён ли выбор.\n *\n * Один маркер на обе семьи выбора: они отличаются только разметкой внутри кнопки, и два маркера\n * разошлись бы на первой же правке.\n *\n * @example\n * ```html\n * <rt-select [options]=\"options\">\n * <ng-template rtSelectTrigger let-state>\n * <rt-tag [value]=\"state.label\" [icon]=\"state.isOpen ? 'chevron-up' : 'chevron-down'\" />\n * </ng-template>\n * </rt-select>\n * ```\n */\n@Directive({\n selector: '[rtSelectTrigger]',\n})\nexport class RtSelectTriggerDirective<TValue = unknown> {\n public readonly templateRef: TemplateRef<IRtSelect.TriggerContext<TValue>> =\n inject<TemplateRef<IRtSelect.TriggerContext<TValue>>>(TemplateRef);\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n booleanAttribute,\n computed,\n contentChild,\n forwardRef,\n inject,\n input,\n output,\n signal,\n viewChild,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n InputSignal,\n InputSignalWithTransform,\n OutputEmitterRef,\n Signal,\n ViewEncapsulation,\n WritableSignal,\n} from '@angular/core';\nimport { FormsModule } from '@angular/forms';\n\nimport { BlockDirective, ElemDirective, ModDirective } from '@rt-tools/core';\n\nimport { RT_KIT_LABELS, TRtKitLabelMap, rtKitLabel } from '@rt-tools/ui-kit-v2/core';\nimport { rtNotchWidth, RtFormControlBase } from '@rt-tools/ui-kit-v2/form-control';\nimport { IRtInput } from '@rt-tools/ui-kit-v2/core';\nimport { IRtIcon } from '@rt-tools/ui-kit-v2/core';\nimport { RtIconComponent } from '@rt-tools/ui-kit-v2/icon';\nimport { RtIconButtonComponent } from '@rt-tools/ui-kit-v2/icon-button';\nimport { RtInputComponent } from '@rt-tools/ui-kit-v2/input';\nimport { RtPopoverDirective } from '@rt-tools/ui-kit-v2/popover';\nimport { IRtPopover } from '@rt-tools/ui-kit-v2/popover';\nimport { RtRadiusDirective } from '@rt-tools/ui-kit-v2/radius';\nimport { RtOptionList, TRtOptionListAction } from '@rt-tools/ui-kit-v2/core';\nimport { rtTreeFind, rtTreeIsTree, rtTreeOpenFor, rtTreeRows, rtTreeSideKey, rtTreeToggle } from '@rt-tools/ui-kit-v2/core';\nimport { RtSelectOptionDirective } from './rt-select-option.directive';\nimport { RtSelectTriggerDirective } from './rt-select-trigger.directive';\nimport { IRtSelect } from './rt-select.model';\n\nconst BEM_BLOCK: string = 'rt-select';\n\n/** Клавиши, открывающие закрытый dropdown с фокуса на trigger'е. */\n\ntype TBooleanInput = boolean | string;\n\nlet panelIdSeed: number = 0;\n\nfunction nextPanelId(): number {\n panelIdSeed += 1;\n return panelIdSeed;\n}\n\n/**\n * Single-select dropdown с опциональным filter input.\n *\n * Panel рендерится через CDK Overlay (директива `[rtPopover]` на trigger'е) —\n * не обрезается `overflow: hidden` предками (таблицы, aside, карточки) и\n * авто-flip'ается у края viewport. CVA через общий `RtFormControlBase`. Крестик\n * (`clearable`) слева от шеврона — виден при наличии значения, очищает выбор.\n *\n * Keyboard-nav (activedescendant): фокус на trigger'е, ArrowUp/Down двигают\n * виртуальный highlight (`aria-activedescendant`), Enter выбирает, Escape\n * закрывает. Home/End/typeahead — deferred.\n */\n@Component({\n selector: 'rt-select',\n templateUrl: './rt-select.component.html',\n styleUrls: ['./rt-select.component.scss', './rt-select-floating-label.scss', './rt-select-clear.scss', './rt-select-material.scss'],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n imports: [\n // Angular\n FormsModule,\n NgTemplateOutlet,\n\n // standalone components / directives\n RtIconButtonComponent,\n RtIconComponent,\n RtInputComponent,\n RtPopoverDirective,\n BlockDirective,\n ElemDirective,\n ModDirective,\n ],\n providers: [\n // Алиас базового токена — для contentChild(RtFormControlBase) в rt-field.\n { provide: RtFormControlBase, useExisting: forwardRef(() => RtSelectComponent) },\n ],\n hostDirectives: [{ directive: RtRadiusDirective, inputs: ['radius'] }],\n host: {\n class: BEM_BLOCK,\n '[class.rt-select--open]': 'isOpen()',\n '[class.rt-select--disabled]': 'isDisabled()',\n '[class.rt-select--readonly]': 'isReadonly()',\n '[class.rt-select--invalid]': 'isInvalid()',\n '[class.rt-select--borderless]': '!bordered()',\n '[class.rt-select--appearance--fill]': \"appearance() === 'fill'\",\n '[class.rt-select--size--sm]': \"size() === 'sm'\",\n '[class.rt-select--size--lg]': \"size() === 'lg'\",\n '[class.rt-select--with-icon-left]': '!!iconLeft()',\n '[class.rt-select--floating]': '!!floatingLabel()',\n '[style.--rt-select-notch-width]': \"notchWidth() + 'px'\",\n '[class.rt-select--filled]': 'hasValue()',\n },\n})\nexport class RtSelectComponent<TValue> extends RtFormControlBase<TValue | null> {\n readonly #t_uiSearch: Signal<string> = rtKitLabel('uiSearch');\n\n protected readonly t: Signal<TRtKitLabelMap> = inject(RT_KIT_LABELS);\n\n protected readonly panelId: string = `rt-select-panel-${nextPanelId()}`;\n\n protected readonly filterPlaceholderText: Signal<string> = computed((): string => this.filterPlaceholder() || this.#t_uiSearch());\n\n protected readonly popover: Signal<RtPopoverDirective> = viewChild.required(RtPopoverDirective);\n\n protected readonly triggerEl: Signal<ElementRef<HTMLButtonElement> | undefined> = viewChild<ElementRef<HTMLButtonElement>>('triggerEl');\n\n /** Подпись на рамке: по её ширине материальный набор вырезает разрыв в рамке. `#`-поле `viewChild` не принимает. */\n protected readonly floatingLabelEl: Signal<ElementRef<HTMLElement> | undefined> = viewChild<ElementRef<HTMLElement>>('floatingLabelEl');\n\n /** Ширина подписи на рамке, px. */\n protected readonly notchWidth: Signal<number> = rtNotchWidth(this.floatingLabelEl);\n\n protected readonly filterTerm: WritableSignal<string> = signal<string>('');\n /** Раскрытые ветки дерева. Живут, пока открыта панель: при открытии раскрыты ветки над выбранным. */\n protected readonly openBranches: WritableSignal<ReadonlySet<TValue>> = signal<ReadonlySet<TValue>>(new Set<TValue>());\n\n protected readonly isOpen: Signal<boolean> = computed((): boolean => this.popover().isOpen());\n\n /** Клавиатура списка: подсветка, клавиши открытия, id для `aria-activedescendant`, прокрутка к опции. */\n protected readonly optionList: RtOptionList = new RtOptionList({\n panelId: (): string => this.panelId,\n isOpen: (): boolean => this.isOpen(),\n count: (): number => this.rows().length,\n isDisabled: (index: number): boolean => Boolean(this.rows()[index]?.option.disabled),\n chooseKeys: new Set<string>(['Enter', ' ']),\n sideKeys: true,\n edgeKeys: true,\n });\n\n protected readonly activeIndex: WritableSignal<number> = this.optionList.activeIndex;\n\n /** Идентификатор подсвеченной опции — тот же, что уходит в `aria-activedescendant`. */\n protected readonly activeOptionId: Signal<string | null> = this.optionList.activeOptionId;\n\n /**\n * Своя разметка указателя, если потребитель её объявил. Не объявил — кит рисует свою, и ни один\n * нынешний потребитель не двигается.\n */\n protected readonly triggerTpl: Signal<RtSelectTriggerDirective<TValue> | undefined> = contentChild(RtSelectTriggerDirective);\n\n /** Своя разметка строки списка; не объявлена — строка рисует подпись опции. */\n protected readonly optionTpl: Signal<RtSelectOptionDirective<TValue> | undefined> = contentChild(RtSelectOptionDirective);\n\n protected readonly hasValue: Signal<boolean> = computed((): boolean => this.value() !== null);\n\n /** Id подписи на рамке: на него ссылается `aria-labelledby` указателя. */\n protected readonly floatingLabelId: string = `${this.panelId}-label`;\n\n /** Id текста выбранного значения в указателе: его имя читает скринридер вслед за подписью. */\n protected readonly valueTextId: string = `${this.panelId}-value`;\n\n /**\n * Подпись на рамке называет указатель, только когда явного `ariaLabel` нет. Ссылка заменяет имя\n * из содержимого кнопки, поэтому за подписью идёт и выбранное значение — иначе скринридер\n * назвал бы поле без того, что в нём выбрано.\n */\n protected readonly labelledBy: Signal<string | null> = computed((): string | null =>\n this.floatingLabel() && !this.ariaLabel() ? `${this.floatingLabelId} ${this.valueTextId}` : null\n );\n\n /** Выбранная опция: по ней указатель рисует подпись или ту же разметку строки, что и список. */\n protected readonly selectedOption: Signal<IRtSelect.Option<TValue> | null> = computed((): IRtSelect.Option<TValue> | null => {\n const v: TValue | null = this.value();\n return v === null ? null : (rtTreeFind(this.options(), v) ?? null);\n });\n\n /** Разметка выбранного в указателе — шаблон строки с выбранной опцией; без шаблона или выбора её нет. */\n protected readonly chosenOwn: Signal<IRtSelect.ChosenView<TValue> | null> = computed((): IRtSelect.ChosenView<TValue> | null => {\n const tpl: RtSelectOptionDirective<TValue> | undefined = this.optionTpl();\n const option: IRtSelect.Option<TValue> | null = this.selectedOption();\n return tpl && option ? { templateRef: tpl.templateRef, context: { $implicit: option, selected: true } } : null;\n });\n\n protected readonly selectedLabel: Signal<string> = computed((): string => this.selectedOption()?.label ?? '');\n\n /** Дерево ли список: тогда у строк есть место под стрелку и отступ по уровню. */\n protected readonly isTree: Signal<boolean> = computed((): boolean => rtTreeIsTree(this.options()));\n\n /** Видимые строки: плоский список — как прежде, дерево — по раскрытым веткам и поисковому слову. */\n protected readonly rows: Signal<ReadonlyArray<IRtSelect.Row<TValue>>> = computed((): ReadonlyArray<IRtSelect.Row<TValue>> =>\n rtTreeRows(this.options(), this.openBranches(), this.filterTerm())\n );\n\n /** Три значения, которые кит отдаёт своей разметке указателя, и не больше. */\n protected readonly triggerState: Signal<IRtSelect.TriggerState<TValue>> = computed((): IRtSelect.TriggerState<TValue> => ({\n isOpen: this.isOpen(),\n value: this.value(),\n label: this.selectedLabel(),\n isDisabled: this.isDisabled(),\n }));\n\n /** Вид рамки: `outline` — рамка со всех сторон, `fill` — залитое поле с чертой снизу. */\n public override readonly fieldLabelInside: boolean = true;\n public readonly appearance: InputSignal<IRtInput.Appearance> = input<IRtInput.Appearance>('outline');\n\n public readonly displayText: Signal<string> = computed((): string => this.selectedLabel());\n\n public readonly options: InputSignal<ReadonlyArray<IRtSelect.Option<TValue>>> = input<ReadonlyArray<IRtSelect.Option<TValue>>>([]);\n\n public readonly placeholder: InputSignal<string> = input<string>('');\n\n public readonly iconLeft: InputSignal<IRtIcon.Name | null> = input<IRtIcon.Name | null>(null);\n\n /**\n * Видимая подпись на рамке. Пока ничего не выбрано и список закрыт, лежит на месте подсказки;\n * при выбранном значении или открытом списке поднимается на верхнюю рамку. `null` — подписи нет.\n */\n public readonly floatingLabel: InputSignal<string | null> = input<string | null>(null);\n\n public readonly filter: InputSignalWithTransform<boolean, TBooleanInput> = input<boolean, TBooleanInput>(false, {\n transform: booleanAttribute,\n });\n\n /** Пусто — берётся переведённая подпись по умолчанию */\n public readonly filterPlaceholder: InputSignal<string> = input<string>('');\n\n /**\n * Чем мерится панель. По умолчанию она не уже кнопки и дальше растёт по содержимому:\n * со своим указателем кнопка бывает узкой, и панель по её ширине давила бы содержимое.\n * `trigger` возвращает прежнее — ровно по кнопке, `auto` пускает панель по содержимому\n * целиком. Предел высоты назначается входом `panelMaxHeight`.\n */\n public readonly panelWidth: InputSignal<IRtPopover.Width> = input<IRtPopover.Width>('trigger-min');\n\n /**\n * Предел высоты панели — длина как в стилях, например `20rem`. Пусто — предел кита\n * `--rt-input-panel-max-height`, и длинный список прокручивается внутри панели: без предела\n * он уходил за нижний край экрана, и пункты за краем были недостижимы. `none` снимает предел —\n * для короткого списка, который должен открываться целиком, без прокрутки. Значение ставится\n * на саму панель: она рисуется в наложении, вне поддерева блока.\n */\n public readonly panelMaxHeight: InputSignal<string | null> = input<string | null>(null);\n\n public readonly selectionChange: OutputEmitterRef<TValue | null> = output<TValue | null>();\n\n public override setDisabledState(disabled: boolean): void {\n super.setDisabledState(disabled);\n if (disabled) {\n this.popover().close();\n }\n }\n\n protected getEmptyValue(): TValue | null {\n return null;\n }\n\n protected focusAfterClear(): void {\n this.triggerEl()?.nativeElement.focus();\n }\n\n protected override clear(event?: Event): void {\n if (this.isDisabled()) {\n return;\n }\n super.clear(event);\n this.selectionChange.emit(null);\n }\n\n /**\n * Открытый список встаёт подсветкой на выбранный пункт.\n *\n * Иначе стрелка вниз начинала с первого пункта, и человек с выбранным «20» из «10, 20, 40»\n * получал «10» вместо «40».\n */\n protected onOpened(): void {\n const v: TValue | null = this.value();\n this.openBranches.set(rtTreeOpenFor(this.options(), v === null ? [] : [v]));\n if (v !== null) {\n const chosen: number = this.rows().findIndex((row: IRtSelect.Row<TValue>): boolean => row.option.value === v);\n if (chosen >= 0) {\n this.activeIndex.set(chosen);\n }\n }\n }\n\n protected toggleBranch(event: Event, value: TValue): void {\n event.stopPropagation();\n this.openBranches.update((open: ReadonlySet<TValue>): ReadonlySet<TValue> => rtTreeToggle(open, value));\n }\n\n protected onClosed(): void {\n // Закрытие (outside-click / Escape / выбор) = пользователь увёл фокус.\n this.filterTerm.set('');\n this.activeIndex.set(-1);\n this.markTouched();\n }\n\n protected select(opt: IRtSelect.Option<TValue>): void {\n if (opt.disabled) {\n return;\n }\n this.value.set(opt.value);\n this.emitChange(opt.value);\n this.selectionChange.emit(opt.value);\n this.popover().close();\n }\n\n protected setFilter(term: string): void {\n this.filterTerm.set(term);\n this.activeIndex.set(-1);\n }\n\n protected onTriggerKeydown(event: KeyboardEvent): void {\n if (this.isDisabled()) {\n return;\n }\n if (!this.isOpen()) {\n if (this.optionList.opensBy(event.key)) {\n event.preventDefault();\n this.popover().open();\n if (this.activeIndex() < 0) {\n this.optionList.move(1);\n }\n }\n return;\n }\n this.#handleOpenKeydown(event);\n }\n\n #handleOpenKeydown(event: KeyboardEvent): void {\n const action: TRtOptionListAction = this.optionList.actionOf(event.key);\n if (action === 'none') {\n return;\n }\n event.preventDefault();\n switch (action) {\n case 'next':\n this.optionList.move(1);\n break;\n case 'previous':\n this.optionList.move(-1);\n break;\n case 'first':\n this.optionList.first();\n break;\n case 'last':\n this.optionList.last();\n break;\n case 'choose':\n this.#selectActive();\n break;\n case 'close':\n // Escape закрывает один слой: панель. Без остановки событие всплывает до document,\n // и оверлей под панелью — боковая панель, окно — закрывается вместе с ней.\n event.stopPropagation();\n this.popover().close();\n break;\n case 'side':\n this.#sideKey(event.key);\n break;\n }\n }\n\n #sideKey(key: string): void {\n const answer: IRtSelect.SideKeyAnswer<TValue> = rtTreeSideKey(this.rows(), this.activeIndex(), key);\n const toggle: TValue | null = answer.toggle;\n if (toggle !== null) {\n this.openBranches.update((open: ReadonlySet<TValue>): ReadonlySet<TValue> => rtTreeToggle(open, toggle));\n }\n this.activeIndex.set(answer.index);\n }\n\n #selectActive(): void {\n const opts: ReadonlyArray<IRtSelect.Option<TValue>> = this.rows().map(\n (row: IRtSelect.Row<TValue>): IRtSelect.Option<TValue> => row.option\n );\n const index: number = this.activeIndex();\n if (index >= 0 && index < opts.length) {\n this.select(opts[index]);\n }\n }\n}\n","<ng-container rtBlock=\"rt-select\">\n @if (isReadonly()) {\n <span rtElem=\"readonly\" [rtMod]=\"{ empty: !displayText() }\">{{ displayText() || '—' }}</span>\n }\n <button\n #triggerEl\n rtElem=\"trigger\"\n qa-dataid=\"select-trigger\"\n type=\"button\"\n [rtPopoverWidth]=\"panelWidth()\"\n [rtMod]=\"{ own: !!triggerTpl() }\"\n [rtPopover]=\"panelTpl\"\n [rtPopoverDisabled]=\"isDisabled()\"\n [attr.id]=\"effectiveControlId()\"\n [attr.aria-label]=\"ariaLabel()\"\n [attr.aria-labelledby]=\"labelledBy()\"\n [attr.aria-haspopup]=\"'listbox'\"\n [attr.aria-expanded]=\"isOpen()\"\n [attr.aria-invalid]=\"isInvalid() || null\"\n [attr.aria-controls]=\"panelId\"\n [attr.aria-activedescendant]=\"activeOptionId()\"\n [disabled]=\"isDisabled()\"\n (keydown)=\"onTriggerKeydown($event)\"\n (rtPopoverOpened)=\"onOpened()\"\n (rtPopoverClosed)=\"onClosed()\">\n <!--\n Разметка указателя: своя, если потребитель её объявил, иначе зашитая китом. Она встаёт\n внутрь кнопки, а не вместо неё: поведение — открытие панели, приметы доступности,\n отключённость, клавиши и закрытие — остаётся на кнопке кита.\n -->\n @if (triggerTpl(); as tpl) {\n <ng-container [ngTemplateOutlet]=\"tpl.templateRef\" [ngTemplateOutletContext]=\"{ $implicit: triggerState() }\" />\n } @else {\n @if (iconLeft(); as left) {\n <rt-icon rtElem=\"icon-left\" size=\"sm\" color=\"muted\" [name]=\"left\" />\n }\n <span rtElem=\"label\" [id]=\"valueTextId\" [rtMod]=\"{ placeholder: !selectedLabel() }\">\n <!-- Шаблон строки рисует и выбранное значение: цветная метка из списка не пропадает в поле. -->\n @if (chosenOwn(); as own) {\n <span rtElem=\"option-content\" qa-dataid=\"select-value-content\">\n <ng-container [ngTemplateOutlet]=\"own.templateRef\" [ngTemplateOutletContext]=\"own.context\" />\n </span>\n } @else {\n {{ selectedLabel() || placeholder() }}\n }\n </span>\n @if (showClearButton()) {\n @if (clearTabbable()) {\n <!-- Место крестика в строке: сам крестик в порядке Tab стоит рядом с кнопкой, ниже. -->\n <span rtElem=\"clear-slot\" aria-hidden=\"true\"></span>\n } @else {\n <rt-icon-button\n rtElem=\"clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [ariaLabel]=\"t().uiClear\"\n [tabIndex]=\"-1\"\n (clicked)=\"clear($event)\" />\n }\n }\n <rt-icon rtElem=\"chevron\" name=\"chevron-down\" size=\"sm\" color=\"muted\" />\n }\n </button>\n\n @if (showClearButton() && clearTabbable() && !triggerTpl()) {\n <!--\n Крестик в порядке обхода — соседняя кнопка поверх своего места в строке, а не кнопка в\n кнопке: вложенную кнопку скринридер не объявляет, а её Enter открывал бы список.\n -->\n <rt-icon-button\n rtElem=\"clear\"\n qa-dataid=\"select-clear\"\n icon=\"ico-close\"\n size=\"sm\"\n variant=\"ghost\"\n iconColor=\"muted\"\n [rtMod]=\"{ outside: true }\"\n [ariaLabel]=\"t().uiClear\"\n [tabIndex]=\"0\"\n (clicked)=\"clear($event)\" />\n }\n\n @if (floatingLabel(); as label) {\n <!-- Подпись — картинка поверх указателя: клик проходит сквозь неё в кнопку, имя кнопке она даёт по aria-labelledby. -->\n <span #floatingLabelEl rtElem=\"floating-label\" qa-dataid=\"select-floating-label\" aria-hidden=\"true\" [id]=\"floatingLabelId\">\n {{ label }}\n </span>\n }\n\n <ng-template #panelTpl>\n <div rtElem=\"panel\" role=\"listbox\" [style.--rt-select-panel-max-height]=\"panelMaxHeight()\" [attr.aria-label]=\"ariaLabel()\">\n @if (filter()) {\n <div rtElem=\"filter\">\n <rt-input\n iconLeft=\"ico-search\"\n [placeholder]=\"filterPlaceholderText()\"\n [ngModel]=\"filterTerm()\"\n [ngModelOptions]=\"{ standalone: true }\"\n (ngModelChange)=\"setFilter($event)\" />\n </div>\n }\n <!--\n Опции listbox'а выбираются мышью через (click); keyboard-nav —\n на trigger'е (activedescendant: ArrowUp/Down/Enter), опции не\n focusable индивидуально, поэтому a11y-правила здесь не применимы.\n -->\n <!-- eslint-disable @angular-eslint/template/click-events-have-key-events, @angular-eslint/template/interactive-supports-focus -->\n <ul rtElem=\"list\">\n @for (row of rows(); track row.option.value; let i = $index) {\n <li\n rtElem=\"option\"\n qa-dataid=\"select-option\"\n role=\"option\"\n [id]=\"panelId + '-opt-' + i\"\n [attr.data-value]=\"row.option.value\"\n [attr.aria-level]=\"isTree() ? row.level + 1 : null\"\n [style.--rt-select-tree-level]=\"row.level\"\n [rtMod]=\"{\n selected: row.option.value === value(),\n active: i === activeIndex(),\n disabled: !!row.option.disabled,\n }\"\n [attr.aria-selected]=\"row.option.value === value()\"\n [attr.aria-disabled]=\"!!row.option.disabled\"\n (click)=\"select(row.option)\">\n @if (isTree()) {\n @if (row.branch) {\n <button\n rtElem=\"toggle\"\n qa-dataid=\"select-option-toggle\"\n type=\"button\"\n tabindex=\"-1\"\n [attr.aria-label]=\"row.open ? t().uiCollapse : t().uiExpand\"\n [attr.aria-expanded]=\"row.open\"\n (click)=\"toggleBranch($event, row.option.value)\">\n <rt-icon size=\"sm\" color=\"muted\" [name]=\"row.open ? 'chevron-down' : 'chevron-right'\" />\n </button>\n } @else {\n <span rtElem=\"toggle-space\"></span>\n }\n }\n @if (optionTpl(); as tpl) {\n <span rtElem=\"option-content\" qa-dataid=\"select-option-content\">\n <ng-container\n [ngTemplateOutlet]=\"tpl.templateRef\"\n [ngTemplateOutletContext]=\"{ $implicit: row.option, selected: row.option.value === value() }\" />\n </span>\n } @else {\n <span rtElem=\"option-label\">{{ row.option.label }}</span>\n }\n @if (row.option.value === value()) {\n <rt-icon rtElem=\"check\" name=\"check\" size=\"sm\" aria-hidden=\"true\" />\n }\n </li>\n } @empty {\n <li rtElem=\"empty\">{{ t().uiNoOptions }}</li>\n }\n </ul>\n </div>\n </ng-template>\n</ng-container>\n"],"mappings":"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"}
|
|
@@ -696,6 +696,8 @@ var RtSideMenuSubItemComponent = class RtSideMenuSubItemComponent {
|
|
|
696
696
|
"disabled",
|
|
697
697
|
"active",
|
|
698
698
|
"expanded",
|
|
699
|
+
"ariaHaspopup",
|
|
700
|
+
"link",
|
|
699
701
|
"indicator"
|
|
700
702
|
],
|
|
701
703
|
outputs: ["clicked"]
|
|
@@ -1025,6 +1027,8 @@ var RtSideMenuFavoritesComponent = class RtSideMenuFavoritesComponent {
|
|
|
1025
1027
|
"disabled",
|
|
1026
1028
|
"active",
|
|
1027
1029
|
"expanded",
|
|
1030
|
+
"ariaHaspopup",
|
|
1031
|
+
"link",
|
|
1028
1032
|
"indicator"
|
|
1029
1033
|
],
|
|
1030
1034
|
outputs: ["clicked"]
|
|
@@ -1976,6 +1980,8 @@ var RtSideMenuComponent = class RtSideMenuComponent extends RtSideMenuLookBase {
|
|
|
1976
1980
|
"disabled",
|
|
1977
1981
|
"active",
|
|
1978
1982
|
"expanded",
|
|
1983
|
+
"ariaHaspopup",
|
|
1984
|
+
"link",
|
|
1979
1985
|
"indicator"
|
|
1980
1986
|
],
|
|
1981
1987
|
outputs: ["clicked"]
|