@cloud-ru/ds-fields 2.2.3-preview-a0540d7f.0 → 2.2.3
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/CHANGELOG.md +4 -0
- package/README.md +1 -3
- package/dist/cjs/components/FieldSelect/FieldSelect.js +43 -98
- package/dist/cjs/components/FieldSelect/constants.d.ts +0 -11
- package/dist/cjs/components/FieldSelect/constants.js +1 -20
- package/dist/cjs/components/FieldSelect/types.d.ts +3 -26
- package/dist/cjs/components/FieldSelect/utils.d.ts +19 -0
- package/dist/cjs/components/FieldSelect/utils.js +103 -0
- package/dist/esm/components/FieldSelect/FieldSelect.js +45 -100
- package/dist/esm/components/FieldSelect/constants.d.ts +0 -11
- package/dist/esm/components/FieldSelect/constants.js +0 -19
- package/dist/esm/components/FieldSelect/types.d.ts +3 -26
- package/dist/esm/components/FieldSelect/utils.d.ts +19 -0
- package/dist/esm/components/FieldSelect/utils.js +92 -0
- package/dist/tsconfig.cjs.tsbuildinfo +1 -1
- package/dist/tsconfig.esm.tsbuildinfo +1 -1
- package/package.json +20 -20
- package/src/components/FieldSelect/FieldSelect.tsx +63 -151
- package/src/components/FieldSelect/constants.ts +0 -22
- package/src/components/FieldSelect/types.ts +48 -82
- package/src/components/FieldSelect/utils.ts +132 -0
- package/dist/cjs/components/FieldSelect/hooks.d.ts +0 -33
- package/dist/cjs/components/FieldSelect/hooks.js +0 -95
- package/dist/cjs/components/FieldSelect/utils/customOption.d.ts +0 -21
- package/dist/cjs/components/FieldSelect/utils/customOption.js +0 -55
- package/dist/cjs/components/FieldSelect/utils/extract.d.ts +0 -11
- package/dist/cjs/components/FieldSelect/utils/extract.js +0 -39
- package/dist/cjs/components/FieldSelect/utils/filter.d.ts +0 -3
- package/dist/cjs/components/FieldSelect/utils/filter.js +0 -40
- package/dist/cjs/components/FieldSelect/utils/index.d.ts +0 -6
- package/dist/cjs/components/FieldSelect/utils/index.js +0 -22
- package/dist/cjs/components/FieldSelect/utils/items.d.ts +0 -9
- package/dist/cjs/components/FieldSelect/utils/items.js +0 -47
- package/dist/cjs/components/FieldSelect/utils/selection.d.ts +0 -11
- package/dist/cjs/components/FieldSelect/utils/selection.js +0 -18
- package/dist/cjs/components/FieldSelect/utils/tagSize.d.ts +0 -4
- package/dist/cjs/components/FieldSelect/utils/tagSize.js +0 -5
- package/dist/esm/components/FieldSelect/hooks.d.ts +0 -33
- package/dist/esm/components/FieldSelect/hooks.js +0 -92
- package/dist/esm/components/FieldSelect/utils/customOption.d.ts +0 -21
- package/dist/esm/components/FieldSelect/utils/customOption.js +0 -48
- package/dist/esm/components/FieldSelect/utils/extract.d.ts +0 -11
- package/dist/esm/components/FieldSelect/utils/extract.js +0 -34
- package/dist/esm/components/FieldSelect/utils/filter.d.ts +0 -3
- package/dist/esm/components/FieldSelect/utils/filter.js +0 -36
- package/dist/esm/components/FieldSelect/utils/index.d.ts +0 -6
- package/dist/esm/components/FieldSelect/utils/index.js +0 -6
- package/dist/esm/components/FieldSelect/utils/items.d.ts +0 -9
- package/dist/esm/components/FieldSelect/utils/items.js +0 -41
- package/dist/esm/components/FieldSelect/utils/selection.d.ts +0 -11
- package/dist/esm/components/FieldSelect/utils/selection.js +0 -14
- package/dist/esm/components/FieldSelect/utils/tagSize.d.ts +0 -4
- package/dist/esm/components/FieldSelect/utils/tagSize.js +0 -2
- package/src/components/FieldSelect/hooks.ts +0 -177
- package/src/components/FieldSelect/utils/customOption.ts +0 -77
- package/src/components/FieldSelect/utils/extract.ts +0 -49
- package/src/components/FieldSelect/utils/filter.ts +0 -51
- package/src/components/FieldSelect/utils/index.ts +0 -6
- package/src/components/FieldSelect/utils/items.ts +0 -58
- package/src/components/FieldSelect/utils/selection.ts +0 -25
- package/src/components/FieldSelect/utils/tagSize.ts +0 -5
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import { FieldSelectItem } from '../types';
|
|
2
|
-
import { extractSearchText, WithIdContent } from './extract';
|
|
3
|
-
|
|
4
|
-
// Subsequence-fuzzy: символы запроса должны встречаться в строке в исходном порядке.
|
|
5
|
-
// Пример: query=`lge` matches `Large` (L → r → arg → e).
|
|
6
|
-
export function isFuzzyMatch(haystack: string, needle: string): boolean {
|
|
7
|
-
if (!needle) {
|
|
8
|
-
return true;
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
let i = 0;
|
|
12
|
-
|
|
13
|
-
for (const ch of haystack) {
|
|
14
|
-
if (ch === needle[i]) {
|
|
15
|
-
i += 1;
|
|
16
|
-
|
|
17
|
-
if (i === needle.length) {
|
|
18
|
-
return true;
|
|
19
|
-
}
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
|
|
23
|
-
return false;
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
export function filterItems(items: FieldSelectItem[], query: string, fuzzy: boolean): FieldSelectItem[] {
|
|
27
|
-
if (!query) {
|
|
28
|
-
return items;
|
|
29
|
-
}
|
|
30
|
-
|
|
31
|
-
const q = query.toLowerCase();
|
|
32
|
-
|
|
33
|
-
const matches = (item: FieldSelectItem): boolean => {
|
|
34
|
-
const text = extractSearchText(item as WithIdContent).toLowerCase();
|
|
35
|
-
|
|
36
|
-
return fuzzy ? isFuzzyMatch(text, q) : text.includes(q);
|
|
37
|
-
};
|
|
38
|
-
|
|
39
|
-
const walk = (list: FieldSelectItem[]): FieldSelectItem[] =>
|
|
40
|
-
list.flatMap(item => {
|
|
41
|
-
if ('items' in item && Array.isArray(item.items)) {
|
|
42
|
-
const filteredChildren = walk(item.items as FieldSelectItem[]);
|
|
43
|
-
|
|
44
|
-
return filteredChildren.length > 0 ? [{ ...item, items: filteredChildren } as FieldSelectItem] : [];
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
return matches(item) ? [item] : [];
|
|
48
|
-
});
|
|
49
|
-
|
|
50
|
-
return walk(items);
|
|
51
|
-
}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import { ItemId } from '@cloud-ru/ds-list';
|
|
2
|
-
|
|
3
|
-
import { FieldSelectItem } from '../types';
|
|
4
|
-
import { WithIdContent } from './extract';
|
|
5
|
-
|
|
6
|
-
export function flatten(items: FieldSelectItem[]): WithIdContent[] {
|
|
7
|
-
const out: WithIdContent[] = [];
|
|
8
|
-
|
|
9
|
-
for (const item of items) {
|
|
10
|
-
out.push(item as WithIdContent);
|
|
11
|
-
|
|
12
|
-
if ('items' in item && Array.isArray(item.items)) {
|
|
13
|
-
out.push(...flatten(item.items as FieldSelectItem[]));
|
|
14
|
-
}
|
|
15
|
-
}
|
|
16
|
-
|
|
17
|
-
return out;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
export function findItem(items: FieldSelectItem[], id: ItemId): WithIdContent | undefined {
|
|
21
|
-
for (const item of flatten(items)) {
|
|
22
|
-
if (item.id === id) {
|
|
23
|
-
return item;
|
|
24
|
-
}
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
return undefined;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/** Айтем для выбранного значения, которого нет в `items` (кастомная опция, ленивая подгрузка). */
|
|
31
|
-
export function createPlaceholderItem(id: ItemId): FieldSelectItem {
|
|
32
|
-
return { id, content: { label: String(id) } };
|
|
33
|
-
}
|
|
34
|
-
|
|
35
|
-
/** Выбранные id, которых нет в дереве айтемов — в дроплист их нужно добавить отдельно. */
|
|
36
|
-
export function getMissingSelectedItems(selectedIds: ItemId[], allItems: FieldSelectItem[]): FieldSelectItem[] {
|
|
37
|
-
if (selectedIds.length === 0) {
|
|
38
|
-
return [];
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
const existingIds = new Set<ItemId>();
|
|
42
|
-
|
|
43
|
-
for (const item of flatten(allItems)) {
|
|
44
|
-
if (item.id !== undefined) {
|
|
45
|
-
existingIds.add(item.id);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
const missing: FieldSelectItem[] = [];
|
|
50
|
-
|
|
51
|
-
for (const id of selectedIds) {
|
|
52
|
-
if (id !== '' && !existingIds.has(id)) {
|
|
53
|
-
missing.push(createPlaceholderItem(id));
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
return missing;
|
|
58
|
-
}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
import { ItemId } from '@cloud-ru/ds-list';
|
|
2
|
-
|
|
3
|
-
import { SELECTION_MODE } from '../constants';
|
|
4
|
-
import { FieldSelectMultipleProps, Selection } from '../types';
|
|
5
|
-
|
|
6
|
-
export function isMultiple(props: { selection?: Selection }): props is FieldSelectMultipleProps {
|
|
7
|
-
return props.selection === SELECTION_MODE.Multiple;
|
|
8
|
-
}
|
|
9
|
-
|
|
10
|
-
/** Выбранные id в нормализованном виде: массив и для `single`, и для `multiple`. */
|
|
11
|
-
export function getSelectedIds(params: {
|
|
12
|
-
multiple: boolean;
|
|
13
|
-
multipleValue: ItemId[];
|
|
14
|
-
singleValue: ItemId | undefined;
|
|
15
|
-
}): ItemId[] {
|
|
16
|
-
if (params.multiple) {
|
|
17
|
-
return params.multipleValue;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
if (params.singleValue === undefined) {
|
|
21
|
-
return [];
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
return [params.singleValue];
|
|
25
|
-
}
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
import { Size } from '@cloud-ru/ds-field-decorator';
|
|
2
|
-
import { Size as TagSize } from '@cloud-ru/ds-tag';
|
|
3
|
-
|
|
4
|
-
/** Соответствие размера поля размеру чипа выбранного значения (`selection='multiple'`). */
|
|
5
|
-
export const TAG_SIZE_MAP: Record<Size, TagSize> = { s: 'xs', m: 'xs', l: 's' };
|