@rt-tools/ui-kit-v2 0.29.1 → 0.30.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs +23 -29
- package/fesm2022/rt-tools-ui-kit-v2-autocomplete.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-calendar.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs +223 -3
- package/fesm2022/rt-tools-ui-kit-v2-core.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-data-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs +1 -2
- package/fesm2022/rt-tools-ui-kit-v2-draggable-tree.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-list.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs +277 -904
- package/fesm2022/rt-tools-ui-kit-v2-dynamic-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-filter-control.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-hybrid-tree.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs +35 -48
- package/fesm2022/rt-tools-ui-kit-v2-multiselect.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-page-header.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-pdf-viewer.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-pdf-viewer.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs +4 -4
- package/fesm2022/rt-tools-ui-kit-v2-rich-editor.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs +37 -181
- package/fesm2022/rt-tools-ui-kit-v2-select.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs +5 -36
- package/fesm2022/rt-tools-ui-kit-v2-side-menu.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs +2 -3
- package/fesm2022/rt-tools-ui-kit-v2-tag.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-toolbar.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs +8 -13
- package/fesm2022/rt-tools-ui-kit-v2-tree-selector.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-tree.mjs +12 -7
- package/fesm2022/rt-tools-ui-kit-v2-tree.mjs.map +1 -1
- package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs +2 -2
- package/fesm2022/rt-tools-ui-kit-v2-workspace.mjs.map +1 -1
- package/package.json +1 -1
- package/src/lib/components/dynamic-selector/stories/component/test-dynamic-selector-popup-frame.component.scss +6 -0
- package/src/lib/components/page-header/rt-page-header.component.scss +4 -2
- package/src/lib/components/tree/CONTEXT.md +1 -1
- package/src/rich-editor/lib/components/ai-chat/CONTEXT.md +1 -1
- package/src/styles/_breakpoints.scss +37 -4
- package/src/styles/_index.scss +0 -4
- package/styles/tokens.css +0 -8
- package/types/rt-tools-ui-kit-v2-autocomplete.d.ts +4 -3
- package/types/rt-tools-ui-kit-v2-core.d.ts +155 -1
- package/types/rt-tools-ui-kit-v2-dynamic-selector.d.ts +51 -269
- package/types/rt-tools-ui-kit-v2-multiselect.d.ts +4 -3
- package/types/rt-tools-ui-kit-v2-select.d.ts +12 -74
- package/types/rt-tools-ui-kit-v2-side-menu.d.ts +5 -20
- package/types/rt-tools-ui-kit-v2-tag.d.ts +2 -3
- package/types/rt-tools-ui-kit-v2-tree-selector.d.ts +0 -2
- package/types/rt-tools-ui-kit-v2-tree.d.ts +7 -9
- package/src/styles/_place.scss +0 -7
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { BooleanInput } from "@angular/cdk/coercion";
|
|
2
2
|
import * as i0 from "@angular/core";
|
|
3
3
|
import { ElementRef, InputSignal, InputSignalWithTransform, OutputEmitterRef, Signal, TemplateRef, WritableSignal } from "@angular/core";
|
|
4
|
-
import { IRtIcon, TRtKitLabelMap } from "@rt-tools/ui-kit-v2/core";
|
|
4
|
+
import { IRtIcon, RtOptionList, TRtKitLabelMap } from "@rt-tools/ui-kit-v2/core";
|
|
5
5
|
import { RtFormControlBase } from "@rt-tools/ui-kit-v2/form-control";
|
|
6
6
|
import { RtPopoverDirective } from "@rt-tools/ui-kit-v2/popover";
|
|
7
7
|
import * as i1 from "@rt-tools/ui-kit-v2/radius";
|
|
@@ -39,8 +39,10 @@ export declare class RtAutocompleteComponent<TItem> extends RtFormControlBase<TI
|
|
|
39
39
|
protected readonly popover: Signal<RtPopoverDirective>;
|
|
40
40
|
protected readonly fieldEl: Signal<ElementRef<HTMLInputElement> | undefined>;
|
|
41
41
|
protected readonly inputText: WritableSignal<string>;
|
|
42
|
-
protected readonly activeIndex: WritableSignal<number>;
|
|
43
42
|
protected readonly isOpen: Signal<boolean>;
|
|
43
|
+
/** Клавиатура списка: подсветка, клавиши открытия, id для `aria-activedescendant`, прокрутка к опции. */
|
|
44
|
+
protected readonly optionList: RtOptionList;
|
|
45
|
+
protected readonly activeIndex: WritableSignal<number>;
|
|
44
46
|
/** Идентификатор подсвеченной опции — тот же, что уходит в `aria-activedescendant`. */
|
|
45
47
|
protected readonly activeOptionId: Signal<string | null>;
|
|
46
48
|
protected readonly hasValue: Signal<boolean>;
|
|
@@ -57,7 +59,6 @@ export declare class RtAutocompleteComponent<TItem> extends RtFormControlBase<TI
|
|
|
57
59
|
}> | null>;
|
|
58
60
|
readonly complete: OutputEmitterRef<IRtAutocomplete.CompleteEvent>;
|
|
59
61
|
readonly itemSelect: OutputEmitterRef<TItem>;
|
|
60
|
-
constructor();
|
|
61
62
|
writeValue(value: TItem | null): void;
|
|
62
63
|
setDisabledState(disabled: boolean): void;
|
|
63
64
|
protected getEmptyValue(): TItem | null;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
|
-
import { EnvironmentProviders, InjectionToken, InputSignal, InputSignalWithTransform, OnDestroy, OutputEmitterRef, PipeTransform, Signal } from "@angular/core";
|
|
2
|
+
import { EnvironmentProviders, InjectionToken, InputSignal, InputSignalWithTransform, OnDestroy, OutputEmitterRef, PipeTransform, Signal, WritableSignal } from "@angular/core";
|
|
3
3
|
import { FormControl } from "@angular/forms";
|
|
4
4
|
import { IFilterModel, ISortModel, TFilterOperatorType } from "@rt-tools/utils";
|
|
5
5
|
import { MonoTypeOperatorFunction, Observable } from "rxjs";
|
|
@@ -864,6 +864,160 @@ export declare class RtKitLabelPipe implements PipeTransform {
|
|
|
864
864
|
static ɵfac: i0.ɵɵFactoryDeclaration<RtKitLabelPipe, never>;
|
|
865
865
|
static ɵpipe: i0.ɵɵPipeDeclaration<RtKitLabelPipe, "rtKitLabel", true>;
|
|
866
866
|
}
|
|
867
|
+
/**
|
|
868
|
+
* Держит подсвеченную клавишами опцию в видимой части панели.
|
|
869
|
+
*
|
|
870
|
+
* Панель списка ограничена по высоте, и длинный список прокручивается внутри неё. Клавиши двигают
|
|
871
|
+
* подсветку, но фокус остаётся на поле: браузер сам панель не прокручивает, и подсветка уходила
|
|
872
|
+
* за нижний край — человек выбирал Enter'ом то, чего не видел. После каждой отрисовки, в которой
|
|
873
|
+
* сменилась подсвеченная опция, она прокручивается ровно настолько, чтобы встать в панель.
|
|
874
|
+
*
|
|
875
|
+
* Панель рисуется в наложении, вне поддерева семьи, поэтому опция ищется в документе по своему
|
|
876
|
+
* идентификатору — тому же, что стоит в `aria-activedescendant`. На сервере отрисовки нет, и
|
|
877
|
+
* эффект не выполняется; среда без `scrollIntoView` пропускается.
|
|
878
|
+
*
|
|
879
|
+
* Зовётся в контексте внедрения — полем или конструктором семьи.
|
|
880
|
+
*
|
|
881
|
+
* @param activeOptionId идентификатор подсвеченной опции; `null` — подсветки нет или панель закрыта
|
|
882
|
+
*/
|
|
883
|
+
export declare function rtScrollActiveOptionIntoView(activeOptionId: () => string | null): void;
|
|
884
|
+
/** Кусок подписи: текст и то, совпал ли он с запросом. */
|
|
885
|
+
export interface IRtMatchPart {
|
|
886
|
+
text: string;
|
|
887
|
+
matched: boolean;
|
|
888
|
+
}
|
|
889
|
+
/**
|
|
890
|
+
* Подпись, разрезанная по словам запроса тем же правилом, что и отбор: совпавшие куски отмечены.
|
|
891
|
+
*
|
|
892
|
+
* Отмечаются все вхождения каждого слова, а пересёкшиеся совпадения сливаются в один кусок. Куски
|
|
893
|
+
* режутся из оригинала — регистр остаётся тем, каким его написал потребитель. Подпись, длина
|
|
894
|
+
* которой меняется от смены регистра, остаётся одним куском без отметки: места совпадений в ней не
|
|
895
|
+
* совпали бы с местами в оригинале.
|
|
896
|
+
*/
|
|
897
|
+
export declare function rtMatchParts(name: string, query: string): IRtMatchPart[];
|
|
898
|
+
/** Что делать по клавише в открытом списке. `none` — клавиша не списка, её не трогают. */
|
|
899
|
+
export type TRtOptionListAction = 'next' | 'previous' | 'first' | 'last' | 'choose' | 'close' | 'side' | 'none';
|
|
900
|
+
/** Чем поле отличается от соседних: число опций, отключённые, клавиши выбора, боковые стрелки. */
|
|
901
|
+
export interface IRtOptionListConfig {
|
|
902
|
+
/** Идентификатор панели: из него собирается id опции для `aria-activedescendant`. */
|
|
903
|
+
readonly panelId: () => string;
|
|
904
|
+
readonly isOpen: () => boolean;
|
|
905
|
+
readonly count: () => number;
|
|
906
|
+
/** Отключённую опцию стрелки проходят. Без функции отключённых нет. */
|
|
907
|
+
readonly isDisabled?: (index: number) => boolean;
|
|
908
|
+
/** Клавиши выбора подсвеченной опции. Пробел выбирает там, где он не печатает. */
|
|
909
|
+
readonly chooseKeys: ReadonlySet<string>;
|
|
910
|
+
/** Работают ли боковые стрелки: у дерева вариантов да. */
|
|
911
|
+
readonly sideKeys: boolean;
|
|
912
|
+
/** Ведут ли Home и End к краям списка. В текстовом поле они остаются у курсора. */
|
|
913
|
+
readonly edgeKeys: boolean;
|
|
914
|
+
}
|
|
915
|
+
/**
|
|
916
|
+
* Клавиатура списка вариантов — общая для выбора из списка, множественного выбора и
|
|
917
|
+
* автодополнения. Фокус остаётся на поле, клавиши двигают подсветку, а читалка экрана узнаёт её
|
|
918
|
+
* по `aria-activedescendant`.
|
|
919
|
+
*
|
|
920
|
+
* Создаётся в контексте внедрения — полем семьи: прокрутка к подсвеченной опции живёт эффектом
|
|
921
|
+
* отрисовки. Что делать по выбору, закрытию и боковой стрелке, решает семья.
|
|
922
|
+
*/
|
|
923
|
+
export declare class RtOptionList {
|
|
924
|
+
#private;
|
|
925
|
+
/** Подсвеченная опция; `-1` — подсветки нет. */
|
|
926
|
+
readonly activeIndex: WritableSignal<number>;
|
|
927
|
+
/** Идентификатор подсвеченной опции — тот же, что уходит в `aria-activedescendant`. */
|
|
928
|
+
readonly activeOptionId: Signal<string | null>;
|
|
929
|
+
constructor(config: IRtOptionListConfig);
|
|
930
|
+
/** Открывает ли клавиша закрытый список. */
|
|
931
|
+
opensBy(key: string): boolean;
|
|
932
|
+
/** Что делать по клавише в открытом списке. */
|
|
933
|
+
actionOf(key: string): TRtOptionListAction;
|
|
934
|
+
/** Ведёт подсветку на шаг вперёд или назад по кругу, мимо отключённых опций. */
|
|
935
|
+
move(delta: number): void;
|
|
936
|
+
/** Ведёт подсветку на первую опцию, мимо отключённых. */
|
|
937
|
+
first(): void;
|
|
938
|
+
/** Ведёт подсветку на последнюю опцию, мимо отключённых. */
|
|
939
|
+
last(): void;
|
|
940
|
+
/** Снимает подсветку: список закрыт или набор опций сменился. */
|
|
941
|
+
reset(): void;
|
|
942
|
+
}
|
|
943
|
+
/**
|
|
944
|
+
* Дерево вариантов выбора: общий вид опции и видимой строки для всех семей, что раскладывают
|
|
945
|
+
* варианты деревом. Generic-параметр `TValue` повторяет тип значения, который сидит в опциях.
|
|
946
|
+
*/
|
|
947
|
+
export declare namespace IRtOptionTree {
|
|
948
|
+
/** Одна опция. */
|
|
949
|
+
interface Option<TValue> {
|
|
950
|
+
label: string;
|
|
951
|
+
value: TValue;
|
|
952
|
+
disabled?: boolean;
|
|
953
|
+
/** Дети опции того же вида. Хотя бы одна опция с детьми делает список деревом. */
|
|
954
|
+
children?: ReadonlyArray<Option<TValue>>;
|
|
955
|
+
}
|
|
956
|
+
/** Видимая строка дерева: опция, её уровень и то, ветка ли она и раскрыта ли. */
|
|
957
|
+
interface Row<TValue> {
|
|
958
|
+
readonly option: Option<TValue>;
|
|
959
|
+
readonly level: number;
|
|
960
|
+
readonly branch: boolean;
|
|
961
|
+
readonly open: boolean;
|
|
962
|
+
readonly parent: TValue | null;
|
|
963
|
+
}
|
|
964
|
+
/** Сколько включённых листьев ветки выбрано: все, часть или ни одного. */
|
|
965
|
+
type TBranchState = 'all' | 'some' | 'none';
|
|
966
|
+
/** Что делать по боковой стрелке: какую ветку переключить и куда увести подсветку. */
|
|
967
|
+
interface SideKeyAnswer<TValue> {
|
|
968
|
+
readonly toggle: TValue | null;
|
|
969
|
+
readonly index: number;
|
|
970
|
+
}
|
|
971
|
+
}
|
|
972
|
+
/**
|
|
973
|
+
* Дерево вариантов — общее для выбора из списка, множественного выбора и деревьев кита.
|
|
974
|
+
*
|
|
975
|
+
* Все они раскладывают, ищут и считают дерево одинаково, поэтому это чистые функции в одном
|
|
976
|
+
* месте: копии разошлись бы на первой правке. Состояние — какие ветки раскрыты — живёт в семье,
|
|
977
|
+
* здесь только расчёт по нему.
|
|
978
|
+
*/
|
|
979
|
+
type TOption<TValue> = IRtOptionTree.Option<TValue>;
|
|
980
|
+
type TRow<TValue> = IRtOptionTree.Row<TValue>;
|
|
981
|
+
/** Список — дерево, если хоть у одной опции есть дети. Плоский список рисуется как прежде. */
|
|
982
|
+
export declare function rtTreeIsTree<TValue>(options: ReadonlyArray<TOption<TValue>>): boolean;
|
|
983
|
+
/** Опция по значению на любой глубине. */
|
|
984
|
+
export declare function rtTreeFind<TValue>(options: ReadonlyArray<TOption<TValue>>, value: TValue): TOption<TValue> | undefined;
|
|
985
|
+
/**
|
|
986
|
+
* Включённые листья под опцией; у самого листа — он сам. Отключённая ветка не отдаёт никого: её
|
|
987
|
+
* листья выбрать нельзя, как и её саму.
|
|
988
|
+
*/
|
|
989
|
+
export declare function rtTreeLeaves<TValue>(option: TOption<TValue>): ReadonlyArray<TValue>;
|
|
990
|
+
/** Сколько включённых листьев ветки выбрано. Флажок ветки выводится из этого, а не хранится. */
|
|
991
|
+
export declare function rtTreeBranchState<TValue>(option: TOption<TValue>, chosen: ReadonlyArray<TValue>): IRtOptionTree.TBranchState;
|
|
992
|
+
/** Ветки, под которыми лежит выбранное значение: они раскрыты, когда список открывается. */
|
|
993
|
+
export declare function rtTreeOpenFor<TValue>(options: ReadonlyArray<TOption<TValue>>, chosen: ReadonlyArray<TValue>): ReadonlySet<TValue>;
|
|
994
|
+
/**
|
|
995
|
+
* Видимые строки по уровням. Без поискового слова раскрыты ветки из `open`. Со словом строка
|
|
996
|
+
* остаётся, если совпала она сама или кто-то под ней, и путь к совпадению показан раскрытым.
|
|
997
|
+
* Ветка, совпавшая сама, держит детей такими, какими они были.
|
|
998
|
+
*/
|
|
999
|
+
export declare function rtTreeRows<TValue>(options: ReadonlyArray<TOption<TValue>>, open: ReadonlySet<TValue>, rawTerm?: string): ReadonlyArray<TRow<TValue>>;
|
|
1000
|
+
/**
|
|
1001
|
+
* Ответ на боковую стрелку. Вправо: свёрнутая ветка раскрывается, раскрытая уводит подсветку на
|
|
1002
|
+
* первого ребёнка. Влево: раскрытая ветка сворачивается, иначе подсветка уходит на родителя.
|
|
1003
|
+
*/
|
|
1004
|
+
export declare function rtTreeSideKey<TValue>(rows: ReadonlyArray<TRow<TValue>>, index: number, key: string): IRtOptionTree.SideKeyAnswer<TValue>;
|
|
1005
|
+
/** Набор раскрытых веток с переключённой одной. */
|
|
1006
|
+
export declare function rtTreeToggle<TValue>(open: ReadonlySet<TValue>, value: TValue): ReadonlySet<TValue>;
|
|
1007
|
+
/**
|
|
1008
|
+
* Правило совпадения поиска — одно на весь кит: каждое слово запроса должно найтись в тексте, в любом
|
|
1009
|
+
* порядке, без учёта регистра, а «ё» равна «е». По нему отбирают строки боковое меню, обход дерева,
|
|
1010
|
+
* динамический выбор и выбор из дерева, и по нему же подсветка режет подпись.
|
|
1011
|
+
*/
|
|
1012
|
+
/**
|
|
1013
|
+
* Текст в том виде, в каком его сравнивает поиск: нижний регистр и «е» на месте «ё». Замена буквы
|
|
1014
|
+
* длину не меняет, поэтому места совпадений в приведённом тексте — те же места в исходном.
|
|
1015
|
+
*/
|
|
1016
|
+
export declare function rtSearchFold(text: string): string;
|
|
1017
|
+
/** Слова запроса в приведённом виде, без пустых. Запрос из одних пробелов слов не даёт. */
|
|
1018
|
+
export declare function rtSearchWords(query: string): string[];
|
|
1019
|
+
/** Совпадает ли текст с запросом: каждое слово запроса стоит в тексте. Пустой запрос совпадает со всем. */
|
|
1020
|
+
export declare function rtSearchMatches(text: string, query: string): boolean;
|
|
867
1021
|
/** Порог узкого вида — тот же, что у `$rt-bp-lg` в стилях кита. */
|
|
868
1022
|
export declare const RT_NARROW_WIDTH: number;
|
|
869
1023
|
/**
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
2
|
import { ElementRef, InputSignal, InputSignalWithTransform, ModelSignal, OnInit, OutputEmitterRef, Signal, TemplateRef, WritableSignal } from "@angular/core";
|
|
3
3
|
import { RtFormControlBase } from "@rt-tools/ui-kit-v2/form-control";
|
|
4
|
-
import { IButton, IRtIcon, IRtInput, TRtRadius } from "@rt-tools/ui-kit-v2/core";
|
|
4
|
+
import { IButton, IRtIcon, IRtInput, RtOptionList, TRtRadius } from "@rt-tools/ui-kit-v2/core";
|
|
5
5
|
import { CdkDragDrop } from "@angular/cdk/drag-drop";
|
|
6
6
|
import { RtPopoverDirective } from "@rt-tools/ui-kit-v2/popover";
|
|
7
7
|
/**
|
|
@@ -158,6 +158,7 @@ export declare class RtDynamicInputComponent extends RtFormControlBase<string[]>
|
|
|
158
158
|
readonly listReset: OutputEmitterRef<void>;
|
|
159
159
|
readonly listCleared: OutputEmitterRef<void>;
|
|
160
160
|
readonly displayText: Signal<string>;
|
|
161
|
+
constructor();
|
|
161
162
|
/** Записанное формой становится и списком, и значением для сброса; пустой массив список опустошает. */
|
|
162
163
|
writeValue(value: string[] | null): void;
|
|
163
164
|
protected onAdd(): void;
|
|
@@ -292,116 +293,30 @@ export declare class RtDynamicSelectorListComponent<TItem> {
|
|
|
292
293
|
/** Строка, открытая для правки, и текст в её поле. */
|
|
293
294
|
protected readonly editedIndex: WritableSignal<number | null>;
|
|
294
295
|
protected readonly draft: WritableSignal<string>;
|
|
295
|
-
readonly rows:
|
|
296
|
-
readonly draggable:
|
|
297
|
-
readonly editable:
|
|
298
|
-
readonly disabled:
|
|
299
|
-
|
|
300
|
-
readonly
|
|
301
|
-
|
|
302
|
-
readonly
|
|
303
|
-
|
|
304
|
-
readonly
|
|
305
|
-
readonly
|
|
306
|
-
readonly
|
|
307
|
-
|
|
308
|
-
readonly
|
|
309
|
-
/** Значок кнопки «Очистить список»; по умолчанию крестик. */
|
|
310
|
-
readonly clearIcon: InputSignal<IRtIcon.Name>;
|
|
311
|
-
/** Название строки переносится; `false` ведёт его одной строкой с многоточием и подсказкой при обрезке. */
|
|
312
|
-
readonly titleWrap: InputSignalWithTransform<boolean, unknown>;
|
|
313
|
-
readonly titleTpl: InputSignal<TemplateRef<IRtDynamicSelector.RowContext<TItem>> | null>;
|
|
314
|
-
readonly controlsTpl: InputSignal<TemplateRef<IRtDynamicSelector.RowContext<TItem>> | null>;
|
|
315
|
-
readonly removed: OutputEmitterRef<unknown>;
|
|
316
|
-
readonly moved: OutputEmitterRef<IRtDynamicSelector.Move>;
|
|
317
|
-
readonly edited: OutputEmitterRef<IRtDynamicSelector.TextEdit>;
|
|
318
|
-
readonly resetClicked: OutputEmitterRef<void>;
|
|
319
|
-
readonly cleared: OutputEmitterRef<void>;
|
|
296
|
+
protected readonly rows: Signal<ReadonlyArray<IRtDynamicSelector.ListRow<TItem>>>;
|
|
297
|
+
protected readonly draggable: Signal<boolean>;
|
|
298
|
+
protected readonly editable: Signal<boolean>;
|
|
299
|
+
protected readonly disabled: Signal<boolean>;
|
|
300
|
+
protected readonly actionsShown: Signal<boolean>;
|
|
301
|
+
protected readonly resetClearShown: Signal<boolean>;
|
|
302
|
+
protected readonly removeShown: Signal<boolean>;
|
|
303
|
+
protected readonly resetDisabled: Signal<boolean>;
|
|
304
|
+
protected readonly clearDisabled: Signal<boolean>;
|
|
305
|
+
protected readonly buttonRadius: Signal<TRtRadius | null>;
|
|
306
|
+
protected readonly clearIcon: Signal<IRtIcon.Name>;
|
|
307
|
+
protected readonly titleWrap: Signal<boolean>;
|
|
308
|
+
protected readonly titleTpl: Signal<TemplateRef<IRtDynamicSelector.RowContext<TItem>> | null>;
|
|
309
|
+
protected readonly controlsTpl: Signal<TemplateRef<IRtDynamicSelector.RowContext<TItem>> | null>;
|
|
320
310
|
/** Строка, взятая из чужого списка, ничего не меняет; брошенная на своё место — тоже. */
|
|
321
311
|
protected onDrop(event: CdkDragDrop<unknown>): void;
|
|
322
312
|
protected onRemove(row: IRtDynamicSelector.ListRow<TItem>): void;
|
|
323
313
|
protected onEditStart(index: number, row: IRtDynamicSelector.ListRow<TItem>): void;
|
|
324
314
|
protected onEditApply(row: IRtDynamicSelector.ListRow<TItem>): void;
|
|
325
315
|
protected onEditCancel(): void;
|
|
316
|
+
protected onReset(): void;
|
|
317
|
+
protected onClear(): void;
|
|
326
318
|
static ɵfac: i0.ɵɵFactoryDeclaration<RtDynamicSelectorListComponent<any>, never>;
|
|
327
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<RtDynamicSelectorListComponent<any>, "rt-dynamic-selector-list", never, {
|
|
328
|
-
"rows": {
|
|
329
|
-
"alias": "rows";
|
|
330
|
-
"required": false;
|
|
331
|
-
"isSignal": true;
|
|
332
|
-
};
|
|
333
|
-
"draggable": {
|
|
334
|
-
"alias": "draggable";
|
|
335
|
-
"required": false;
|
|
336
|
-
"isSignal": true;
|
|
337
|
-
};
|
|
338
|
-
"editable": {
|
|
339
|
-
"alias": "editable";
|
|
340
|
-
"required": false;
|
|
341
|
-
"isSignal": true;
|
|
342
|
-
};
|
|
343
|
-
"disabled": {
|
|
344
|
-
"alias": "disabled";
|
|
345
|
-
"required": false;
|
|
346
|
-
"isSignal": true;
|
|
347
|
-
};
|
|
348
|
-
"actionsShown": {
|
|
349
|
-
"alias": "actionsShown";
|
|
350
|
-
"required": false;
|
|
351
|
-
"isSignal": true;
|
|
352
|
-
};
|
|
353
|
-
"resetClearShown": {
|
|
354
|
-
"alias": "resetClearShown";
|
|
355
|
-
"required": false;
|
|
356
|
-
"isSignal": true;
|
|
357
|
-
};
|
|
358
|
-
"removeShown": {
|
|
359
|
-
"alias": "removeShown";
|
|
360
|
-
"required": false;
|
|
361
|
-
"isSignal": true;
|
|
362
|
-
};
|
|
363
|
-
"resetDisabled": {
|
|
364
|
-
"alias": "resetDisabled";
|
|
365
|
-
"required": false;
|
|
366
|
-
"isSignal": true;
|
|
367
|
-
};
|
|
368
|
-
"clearDisabled": {
|
|
369
|
-
"alias": "clearDisabled";
|
|
370
|
-
"required": false;
|
|
371
|
-
"isSignal": true;
|
|
372
|
-
};
|
|
373
|
-
"buttonRadius": {
|
|
374
|
-
"alias": "buttonRadius";
|
|
375
|
-
"required": false;
|
|
376
|
-
"isSignal": true;
|
|
377
|
-
};
|
|
378
|
-
"clearIcon": {
|
|
379
|
-
"alias": "clearIcon";
|
|
380
|
-
"required": false;
|
|
381
|
-
"isSignal": true;
|
|
382
|
-
};
|
|
383
|
-
"titleWrap": {
|
|
384
|
-
"alias": "titleWrap";
|
|
385
|
-
"required": false;
|
|
386
|
-
"isSignal": true;
|
|
387
|
-
};
|
|
388
|
-
"titleTpl": {
|
|
389
|
-
"alias": "titleTpl";
|
|
390
|
-
"required": false;
|
|
391
|
-
"isSignal": true;
|
|
392
|
-
};
|
|
393
|
-
"controlsTpl": {
|
|
394
|
-
"alias": "controlsTpl";
|
|
395
|
-
"required": false;
|
|
396
|
-
"isSignal": true;
|
|
397
|
-
};
|
|
398
|
-
}, {
|
|
399
|
-
"removed": "removed";
|
|
400
|
-
"moved": "moved";
|
|
401
|
-
"edited": "edited";
|
|
402
|
-
"resetClicked": "resetClicked";
|
|
403
|
-
"cleared": "cleared";
|
|
404
|
-
}, never, ["*"], true, never>;
|
|
319
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RtDynamicSelectorListComponent<any>, "rt-dynamic-selector-list", never, {}, {}, never, ["*"], true, never>;
|
|
405
320
|
}
|
|
406
321
|
/** Сколько ждёт поиск на сервере после последней нажатой клавиши. */
|
|
407
322
|
export declare const RT_DYNAMIC_SELECTOR_SEARCH_DEBOUNCE: number;
|
|
@@ -412,6 +327,11 @@ export declare const RT_DYNAMIC_SELECTOR_SEARCH_DEBOUNCE: number;
|
|
|
412
327
|
*/
|
|
413
328
|
export declare class RtDynamicSelectorPopupComponent<TEntity extends object> implements OnInit {
|
|
414
329
|
#private;
|
|
330
|
+
/**
|
|
331
|
+
* Клавиши строк. Окно не называет строку через `aria-activedescendant`: строки — флажки и
|
|
332
|
+
* переключатели со своими ролями, и клавиши ведут сам фокус. Enter и пробел они отмечают сами.
|
|
333
|
+
*/
|
|
334
|
+
protected readonly optionList: RtOptionList;
|
|
415
335
|
protected readonly searchLabel: Signal<string>;
|
|
416
336
|
protected readonly searchField: Signal<ElementRef<HTMLElement> | undefined>;
|
|
417
337
|
protected readonly selectAllLabel: Signal<string>;
|
|
@@ -447,48 +367,29 @@ export declare class RtDynamicSelectorPopupComponent<TEntity extends object> imp
|
|
|
447
367
|
protected readonly lastPinnedKey: Signal<unknown>;
|
|
448
368
|
protected readonly isApplyDisabled: Signal<boolean>;
|
|
449
369
|
protected readonly isNavShown: Signal<boolean>;
|
|
450
|
-
|
|
451
|
-
readonly
|
|
452
|
-
readonly
|
|
453
|
-
readonly
|
|
454
|
-
|
|
455
|
-
readonly
|
|
456
|
-
readonly
|
|
457
|
-
readonly
|
|
458
|
-
readonly
|
|
459
|
-
readonly
|
|
460
|
-
readonly
|
|
461
|
-
readonly
|
|
462
|
-
readonly
|
|
463
|
-
readonly
|
|
464
|
-
readonly
|
|
465
|
-
readonly
|
|
466
|
-
|
|
467
|
-
readonly
|
|
468
|
-
|
|
469
|
-
readonly
|
|
470
|
-
|
|
471
|
-
readonly
|
|
472
|
-
|
|
473
|
-
readonly emptyResultsText: InputSignal<string>;
|
|
474
|
-
/** Подпись кнопки применения; пустая строка оставляет подпись кита. */
|
|
475
|
-
readonly applyLabel: InputSignal<string>;
|
|
476
|
-
/** Регистр подписи кнопки применения; `none` оставляет её как есть. */
|
|
477
|
-
readonly applyLabelCase: InputSignal<IRtDynamicSelector.LabelCase>;
|
|
478
|
-
/** Поле поиска получает фокус при открытии окна; по умолчанию фокус остаётся там, где был. */
|
|
479
|
-
readonly autofocusSearch: InputSignalWithTransform<boolean, unknown>;
|
|
480
|
-
/** Подпись пункта переносится; `false` ведёт её одной строкой с многоточием и подсказкой при обрезке. */
|
|
481
|
-
readonly titleWrap: InputSignalWithTransform<boolean, unknown>;
|
|
482
|
-
/** Символы подписи пункта, совпавшие со словами поиска, выделены. */
|
|
483
|
-
readonly highlightSearch: InputSignalWithTransform<boolean, unknown>;
|
|
484
|
-
/** Применённые ключи в порядке отметок. */
|
|
485
|
-
readonly applied: OutputEmitterRef<unknown[]>;
|
|
486
|
-
readonly cancelled: OutputEmitterRef<void>;
|
|
487
|
-
/** Запрос для поиска на сервере: через паузу после последней клавиши, стёртый — пустой строкой. */
|
|
488
|
-
readonly searchChange: OutputEmitterRef<string>;
|
|
489
|
-
readonly loadMore: OutputEmitterRef<void>;
|
|
490
|
-
/** Отмеченные записи: пустой список при открытии и текущие отметки после каждого поиска. */
|
|
491
|
-
readonly temporaryChoiceChange: OutputEmitterRef<TEntity[]>;
|
|
370
|
+
protected readonly entities: Signal<ReadonlyArray<TEntity>>;
|
|
371
|
+
protected readonly keyExp: Signal<keyof TEntity & string>;
|
|
372
|
+
protected readonly displayExp: Signal<keyof TEntity & string>;
|
|
373
|
+
protected readonly displayWith: Signal<((entity: TEntity) => string) | null>;
|
|
374
|
+
protected readonly mode: Signal<IRtDynamicSelector.Mode>;
|
|
375
|
+
protected readonly multiToggleShown: Signal<boolean>;
|
|
376
|
+
protected readonly selectAllShown: Signal<boolean>;
|
|
377
|
+
protected readonly localSearch: Signal<boolean>;
|
|
378
|
+
protected readonly lazyLoad: Signal<boolean>;
|
|
379
|
+
protected readonly loading: Signal<boolean>;
|
|
380
|
+
protected readonly fetching: Signal<boolean>;
|
|
381
|
+
protected readonly pinnedKeys: Signal<ReadonlyArray<unknown>>;
|
|
382
|
+
protected readonly navigateTitle: Signal<string>;
|
|
383
|
+
protected readonly navigateLink: Signal<string>;
|
|
384
|
+
protected readonly searchTerm: Signal<string>;
|
|
385
|
+
protected readonly searchAppearance: Signal<IRtInput.Appearance>;
|
|
386
|
+
protected readonly searchRadius: Signal<TRtRadius | null>;
|
|
387
|
+
protected readonly emptyResultsText: Signal<string>;
|
|
388
|
+
protected readonly applyLabel: Signal<string>;
|
|
389
|
+
protected readonly applyLabelCase: Signal<IRtDynamicSelector.LabelCase>;
|
|
390
|
+
protected readonly autofocusSearch: Signal<boolean>;
|
|
391
|
+
protected readonly titleWrap: Signal<boolean>;
|
|
392
|
+
protected readonly highlightSearch: Signal<boolean>;
|
|
492
393
|
ngOnInit(): void;
|
|
493
394
|
protected onQueryChange(value: string | null): void;
|
|
494
395
|
/** Нажатие строки флажков: при выключенном выборе нескольких без Ctrl или Cmd остаётся одна отметка. */
|
|
@@ -498,130 +399,11 @@ export declare class RtDynamicSelectorPopupComponent<TEntity extends object> imp
|
|
|
498
399
|
protected onMultiToggle(value: boolean): void;
|
|
499
400
|
protected onApply(): void;
|
|
500
401
|
protected onCancel(): void;
|
|
402
|
+
protected onLoadMore(): void;
|
|
403
|
+
/** Стрелки, Home и End ведут фокус по строкам; в поле поиска Home и End остаются у курсора. */
|
|
404
|
+
protected onKeydown(event: KeyboardEvent): void;
|
|
501
405
|
static ɵfac: i0.ɵɵFactoryDeclaration<RtDynamicSelectorPopupComponent<any>, never>;
|
|
502
|
-
static ɵcmp: i0.ɵɵComponentDeclaration<RtDynamicSelectorPopupComponent<any>, "rt-dynamic-selector-popup", never, {
|
|
503
|
-
"entities": {
|
|
504
|
-
"alias": "entities";
|
|
505
|
-
"required": false;
|
|
506
|
-
"isSignal": true;
|
|
507
|
-
};
|
|
508
|
-
"keyExp": {
|
|
509
|
-
"alias": "keyExp";
|
|
510
|
-
"required": true;
|
|
511
|
-
"isSignal": true;
|
|
512
|
-
};
|
|
513
|
-
"displayExp": {
|
|
514
|
-
"alias": "displayExp";
|
|
515
|
-
"required": true;
|
|
516
|
-
"isSignal": true;
|
|
517
|
-
};
|
|
518
|
-
"displayWith": {
|
|
519
|
-
"alias": "displayWith";
|
|
520
|
-
"required": false;
|
|
521
|
-
"isSignal": true;
|
|
522
|
-
};
|
|
523
|
-
"mode": {
|
|
524
|
-
"alias": "mode";
|
|
525
|
-
"required": false;
|
|
526
|
-
"isSignal": true;
|
|
527
|
-
};
|
|
528
|
-
"multiToggleShown": {
|
|
529
|
-
"alias": "multiToggleShown";
|
|
530
|
-
"required": false;
|
|
531
|
-
"isSignal": true;
|
|
532
|
-
};
|
|
533
|
-
"selectAllShown": {
|
|
534
|
-
"alias": "selectAllShown";
|
|
535
|
-
"required": false;
|
|
536
|
-
"isSignal": true;
|
|
537
|
-
};
|
|
538
|
-
"localSearch": {
|
|
539
|
-
"alias": "localSearch";
|
|
540
|
-
"required": false;
|
|
541
|
-
"isSignal": true;
|
|
542
|
-
};
|
|
543
|
-
"lazyLoad": {
|
|
544
|
-
"alias": "lazyLoad";
|
|
545
|
-
"required": false;
|
|
546
|
-
"isSignal": true;
|
|
547
|
-
};
|
|
548
|
-
"loading": {
|
|
549
|
-
"alias": "loading";
|
|
550
|
-
"required": false;
|
|
551
|
-
"isSignal": true;
|
|
552
|
-
};
|
|
553
|
-
"fetching": {
|
|
554
|
-
"alias": "fetching";
|
|
555
|
-
"required": false;
|
|
556
|
-
"isSignal": true;
|
|
557
|
-
};
|
|
558
|
-
"pinnedKeys": {
|
|
559
|
-
"alias": "pinnedKeys";
|
|
560
|
-
"required": false;
|
|
561
|
-
"isSignal": true;
|
|
562
|
-
};
|
|
563
|
-
"navigateTitle": {
|
|
564
|
-
"alias": "navigateTitle";
|
|
565
|
-
"required": false;
|
|
566
|
-
"isSignal": true;
|
|
567
|
-
};
|
|
568
|
-
"navigateLink": {
|
|
569
|
-
"alias": "navigateLink";
|
|
570
|
-
"required": false;
|
|
571
|
-
"isSignal": true;
|
|
572
|
-
};
|
|
573
|
-
"searchTerm": {
|
|
574
|
-
"alias": "searchTerm";
|
|
575
|
-
"required": false;
|
|
576
|
-
"isSignal": true;
|
|
577
|
-
};
|
|
578
|
-
"searchAppearance": {
|
|
579
|
-
"alias": "searchAppearance";
|
|
580
|
-
"required": false;
|
|
581
|
-
"isSignal": true;
|
|
582
|
-
};
|
|
583
|
-
"searchRadius": {
|
|
584
|
-
"alias": "searchRadius";
|
|
585
|
-
"required": false;
|
|
586
|
-
"isSignal": true;
|
|
587
|
-
};
|
|
588
|
-
"emptyResultsText": {
|
|
589
|
-
"alias": "emptyResultsText";
|
|
590
|
-
"required": false;
|
|
591
|
-
"isSignal": true;
|
|
592
|
-
};
|
|
593
|
-
"applyLabel": {
|
|
594
|
-
"alias": "applyLabel";
|
|
595
|
-
"required": false;
|
|
596
|
-
"isSignal": true;
|
|
597
|
-
};
|
|
598
|
-
"applyLabelCase": {
|
|
599
|
-
"alias": "applyLabelCase";
|
|
600
|
-
"required": false;
|
|
601
|
-
"isSignal": true;
|
|
602
|
-
};
|
|
603
|
-
"autofocusSearch": {
|
|
604
|
-
"alias": "autofocusSearch";
|
|
605
|
-
"required": false;
|
|
606
|
-
"isSignal": true;
|
|
607
|
-
};
|
|
608
|
-
"titleWrap": {
|
|
609
|
-
"alias": "titleWrap";
|
|
610
|
-
"required": false;
|
|
611
|
-
"isSignal": true;
|
|
612
|
-
};
|
|
613
|
-
"highlightSearch": {
|
|
614
|
-
"alias": "highlightSearch";
|
|
615
|
-
"required": false;
|
|
616
|
-
"isSignal": true;
|
|
617
|
-
};
|
|
618
|
-
}, {
|
|
619
|
-
"applied": "applied";
|
|
620
|
-
"cancelled": "cancelled";
|
|
621
|
-
"searchChange": "searchChange";
|
|
622
|
-
"loadMore": "loadMore";
|
|
623
|
-
"temporaryChoiceChange": "temporaryChoiceChange";
|
|
624
|
-
}, never, never, true, never>;
|
|
406
|
+
static ɵcmp: i0.ɵɵComponentDeclaration<RtDynamicSelectorPopupComponent<any>, "rt-dynamic-selector-popup", never, {}, {}, never, never, true, never>;
|
|
625
407
|
}
|
|
626
408
|
/**
|
|
627
409
|
* Динамический селектор: поле формы со списком выбранных записей. Значение — массив ключей в
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import * as i0 from "@angular/core";
|
|
2
2
|
import { ElementRef, InputSignal, Signal, WritableSignal } from "@angular/core";
|
|
3
|
-
import { IRtIcon, TRtKitLabelMap } from "@rt-tools/ui-kit-v2/core";
|
|
3
|
+
import { IRtIcon, RtOptionList, TRtKitLabelMap } from "@rt-tools/ui-kit-v2/core";
|
|
4
4
|
import { RtFormControlBase } from "@rt-tools/ui-kit-v2/form-control";
|
|
5
5
|
import { IRtPopover, RtPopoverDirective } from "@rt-tools/ui-kit-v2/popover";
|
|
6
6
|
import { IRtSelect, RtSelectTriggerDirective } from "@rt-tools/ui-kit-v2/select";
|
|
@@ -25,7 +25,6 @@ export declare class RtMultiselectComponent<TValue> extends RtFormControlBase<Re
|
|
|
25
25
|
protected readonly placeholderText: Signal<string>;
|
|
26
26
|
protected readonly popover: Signal<RtPopoverDirective>;
|
|
27
27
|
protected readonly triggerEl: Signal<ElementRef<HTMLButtonElement> | undefined>;
|
|
28
|
-
protected readonly activeIndex: WritableSignal<number>;
|
|
29
28
|
/** Раскрытые ветки дерева. Живут, пока открыта панель: при открытии раскрыты ветки над выбранным. */
|
|
30
29
|
protected readonly openBranches: WritableSignal<ReadonlySet<TValue>>;
|
|
31
30
|
/** Дерево ли список: тогда у строк есть место под стрелку и отступ по уровню. */
|
|
@@ -35,6 +34,9 @@ export declare class RtMultiselectComponent<TValue> extends RtFormControlBase<Re
|
|
|
35
34
|
/** Флажок каждой строки: у листа — выбран ли он, у ветки — выведен из её включённых листьев. */
|
|
36
35
|
protected readonly rowChecks: Signal<ReadonlyArray<IRtSelect.TBranchState>>;
|
|
37
36
|
protected readonly isOpen: Signal<boolean>;
|
|
37
|
+
/** Клавиатура списка: подсветка, клавиши открытия, id для `aria-activedescendant`, прокрутка к опции. */
|
|
38
|
+
protected readonly optionList: RtOptionList;
|
|
39
|
+
protected readonly activeIndex: WritableSignal<number>;
|
|
38
40
|
/** Идентификатор подсвеченной опции — тот же, что уходит в `aria-activedescendant`. */
|
|
39
41
|
protected readonly activeOptionId: Signal<string | null>;
|
|
40
42
|
/**
|
|
@@ -69,7 +71,6 @@ export declare class RtMultiselectComponent<TValue> extends RtFormControlBase<Re
|
|
|
69
71
|
* на саму панель: она рисуется в наложении, вне поддерева блока.
|
|
70
72
|
*/
|
|
71
73
|
readonly panelMaxHeight: InputSignal<string | null>;
|
|
72
|
-
constructor();
|
|
73
74
|
setDisabledState(disabled: boolean): void;
|
|
74
75
|
protected getEmptyValue(): ReadonlyArray<TValue>;
|
|
75
76
|
protected focusAfterClear(): void;
|