@bccampus/ui-components 0.6.1 → 0.7.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/dist/components/ui/composite/SelectionProvider/AbstractSelectionProvider.d.ts +7 -0
- package/dist/components/ui/composite/SelectionProvider/AbstractSelectionProvider.js +4 -0
- package/dist/components/ui/composite/SelectionProvider/MultipleSelectionProvider.js +4 -0
- package/dist/components/ui/composite/SelectionProvider/SingleSelectionProvider.js +5 -0
- package/package.json +1 -1
- package/src/components/ui/composite/SelectionProvider/AbstractSelectionProvider.ts +21 -8
- package/src/components/ui/composite/SelectionProvider/MultipleSelectionProvider.ts +9 -5
- package/src/components/ui/composite/SelectionProvider/SingleSelectionProvider.ts +20 -7
|
@@ -7,10 +7,17 @@ export interface SelectionProvider {
|
|
|
7
7
|
deselect(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
8
8
|
toggleSelect(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
9
9
|
}
|
|
10
|
+
export interface SelectionProviderOptions<T extends object> {
|
|
11
|
+
onSelect?: (item: T) => void;
|
|
12
|
+
onDeselect?: (item: T) => void;
|
|
13
|
+
onChange?: (item: Set<CompositeItemKey>) => void;
|
|
14
|
+
}
|
|
10
15
|
export declare abstract class AbstractSelectionProvider<T extends object> {
|
|
11
16
|
protected data: CompositeData<T>;
|
|
12
17
|
protected dataOptions: CompositeDataOptions<T>;
|
|
13
18
|
selectedKeys: PreinitializedWritableAtom<Set<CompositeItemKey>>;
|
|
19
|
+
options?: SelectionProviderOptions<T>;
|
|
20
|
+
constructor(options?: SelectionProviderOptions<T>);
|
|
14
21
|
init(data: CompositeData<T>, dataOptions: CompositeDataOptions<T>): void;
|
|
15
22
|
abstract select(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
16
23
|
abstract select(item: CompositeDataItem<T>, recursive?: boolean): void;
|
|
@@ -6,13 +6,17 @@ class MultipleSelectionProvider extends AbstractSelectionProvider {
|
|
|
6
6
|
const _item = item instanceof CompositeDataItem ? item : this.data.lookup.get(item);
|
|
7
7
|
if (!_item) return;
|
|
8
8
|
const selectedKeys = _item.select(recursive);
|
|
9
|
+
this.options?.onSelect?.(_item.data.get());
|
|
9
10
|
this.selectedKeys.set(union(this.selectedKeys.get(), selectedKeys));
|
|
11
|
+
this.options?.onChange?.(this.selectedKeys.get());
|
|
10
12
|
}
|
|
11
13
|
deselect(item, recursive = false) {
|
|
12
14
|
const _item = item instanceof CompositeDataItem ? item : this.data.lookup.get(item);
|
|
13
15
|
if (!_item) return;
|
|
14
16
|
const deselectedKeys = _item.deselect(recursive);
|
|
17
|
+
this.options?.onDeselect?.(_item.data.get());
|
|
15
18
|
this.selectedKeys.set(difference(this.selectedKeys.get(), deselectedKeys));
|
|
19
|
+
this.options?.onChange?.(this.selectedKeys.get());
|
|
16
20
|
}
|
|
17
21
|
}
|
|
18
22
|
export {
|
|
@@ -9,15 +9,20 @@ class SingleSelectionProvider extends AbstractSelectionProvider {
|
|
|
9
9
|
const _item2 = this.data.lookup.get(selectedKey);
|
|
10
10
|
if (!_item2) return;
|
|
11
11
|
_item2.deselect(false);
|
|
12
|
+
this.options?.onDeselect?.(_item2.data.get());
|
|
12
13
|
});
|
|
13
14
|
const selectedKeys = _item.select(false);
|
|
15
|
+
this.options?.onSelect?.(_item.data.get());
|
|
14
16
|
this.selectedKeys.set(new Set(selectedKeys));
|
|
17
|
+
this.options?.onChange?.(this.selectedKeys.get());
|
|
15
18
|
}
|
|
16
19
|
deselect(item, _recursive = false) {
|
|
17
20
|
const _item = item ? item instanceof CompositeDataItem ? item : this.data.lookup.get(item) : this.data.focusProvider.focusedItem.get();
|
|
18
21
|
if (!_item) return;
|
|
19
22
|
const deselectedKeys = _item.deselect(false);
|
|
23
|
+
this.options?.onDeselect?.(_item.data.get());
|
|
20
24
|
this.selectedKeys.set(difference(this.selectedKeys.get(), deselectedKeys));
|
|
25
|
+
this.options?.onChange?.(this.selectedKeys.get());
|
|
21
26
|
}
|
|
22
27
|
}
|
|
23
28
|
export {
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import { atom, type PreinitializedWritableAtom } from
|
|
2
|
-
import type { CompositeData } from
|
|
3
|
-
import { CompositeDataItem } from
|
|
4
|
-
import type { CompositeDataOptions, CompositeItemKey } from
|
|
1
|
+
import { atom, type PreinitializedWritableAtom } from "nanostores";
|
|
2
|
+
import type { CompositeData } from "../CompositeData";
|
|
3
|
+
import { CompositeDataItem } from "../CompositeDataItem";
|
|
4
|
+
import type { CompositeDataOptions, CompositeItemKey } from "../types";
|
|
5
5
|
|
|
6
6
|
export interface SelectionProvider {
|
|
7
7
|
select(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
@@ -9,26 +9,35 @@ export interface SelectionProvider {
|
|
|
9
9
|
toggleSelect(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
10
10
|
}
|
|
11
11
|
|
|
12
|
+
export interface SelectionProviderOptions<T extends object> {
|
|
13
|
+
onSelect?: (item: T) => void;
|
|
14
|
+
onDeselect?: (item: T) => void;
|
|
15
|
+
onChange?: (item: Set<CompositeItemKey>) => void;
|
|
16
|
+
}
|
|
17
|
+
|
|
12
18
|
export abstract class AbstractSelectionProvider<T extends object> {
|
|
13
19
|
protected data!: CompositeData<T>;
|
|
14
20
|
protected dataOptions!: CompositeDataOptions<T>;
|
|
15
21
|
|
|
16
22
|
selectedKeys: PreinitializedWritableAtom<Set<CompositeItemKey>> = atom(new Set());
|
|
23
|
+
options?: SelectionProviderOptions<T>;
|
|
24
|
+
|
|
25
|
+
constructor(options?: SelectionProviderOptions<T>) {
|
|
26
|
+
this.options = options;
|
|
27
|
+
}
|
|
17
28
|
|
|
18
29
|
init(data: CompositeData<T>, dataOptions: CompositeDataOptions<T>) {
|
|
19
30
|
this.data = data;
|
|
20
31
|
this.dataOptions = dataOptions;
|
|
21
32
|
|
|
22
33
|
// Set initially selected items : SelectionProvider
|
|
23
|
-
this.dataOptions.selectedKeys.forEach(selectedKey => this.select(selectedKey));
|
|
24
|
-
|
|
34
|
+
this.dataOptions.selectedKeys.forEach((selectedKey) => this.select(selectedKey));
|
|
25
35
|
}
|
|
26
36
|
|
|
27
37
|
abstract select(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
28
38
|
abstract select(item: CompositeDataItem<T>, recursive?: boolean): void;
|
|
29
39
|
abstract select(item?: CompositeDataItem<T> | CompositeItemKey, recursive?: boolean): void;
|
|
30
40
|
|
|
31
|
-
|
|
32
41
|
abstract deselect(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
33
42
|
abstract deselect(item: CompositeDataItem<T>, recursive?: boolean): void;
|
|
34
43
|
abstract deselect(item?: CompositeDataItem<T> | CompositeItemKey, recursive?: boolean): void;
|
|
@@ -36,7 +45,11 @@ export abstract class AbstractSelectionProvider<T extends object> {
|
|
|
36
45
|
toggleSelect(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
37
46
|
toggleSelect(item: CompositeDataItem<T>, recursive?: boolean): void;
|
|
38
47
|
toggleSelect(item?: CompositeDataItem<T> | CompositeItemKey, recursive: boolean = false) {
|
|
39
|
-
const _item = item
|
|
48
|
+
const _item = item
|
|
49
|
+
? item instanceof CompositeDataItem
|
|
50
|
+
? item
|
|
51
|
+
: this.data.lookup.get(item)
|
|
52
|
+
: this.data.focusProvider.focusedItem.get();
|
|
40
53
|
if (!_item) return;
|
|
41
54
|
|
|
42
55
|
if (_item.state.get().selected) this.deselect(_item, recursive);
|
|
@@ -1,11 +1,9 @@
|
|
|
1
|
-
import { CompositeDataItem } from
|
|
2
|
-
import type { CompositeItemKey } from
|
|
3
|
-
import { AbstractSelectionProvider } from
|
|
1
|
+
import { CompositeDataItem } from "../CompositeDataItem";
|
|
2
|
+
import type { CompositeItemKey } from "../types";
|
|
3
|
+
import { AbstractSelectionProvider } from "./AbstractSelectionProvider";
|
|
4
4
|
import { difference, union } from "@/lib/set-operations";
|
|
5
5
|
|
|
6
6
|
export class MultipleSelectionProvider<T extends object> extends AbstractSelectionProvider<T> {
|
|
7
|
-
|
|
8
|
-
|
|
9
7
|
select(itemKey: CompositeItemKey, recursive?: boolean): void;
|
|
10
8
|
select(item: CompositeDataItem<T>, recursive?: boolean): void;
|
|
11
9
|
select(item: CompositeDataItem<T> | CompositeItemKey, recursive: boolean = false) {
|
|
@@ -13,7 +11,10 @@ export class MultipleSelectionProvider<T extends object> extends AbstractSelecti
|
|
|
13
11
|
if (!_item) return;
|
|
14
12
|
|
|
15
13
|
const selectedKeys = _item.select(recursive);
|
|
14
|
+
this.options?.onSelect?.(_item.data.get());
|
|
15
|
+
|
|
16
16
|
this.selectedKeys.set(union(this.selectedKeys.get(), selectedKeys));
|
|
17
|
+
this.options?.onChange?.(this.selectedKeys.get());
|
|
17
18
|
}
|
|
18
19
|
|
|
19
20
|
deselect(itemKey: CompositeItemKey, recursive?: boolean): void;
|
|
@@ -23,6 +24,9 @@ export class MultipleSelectionProvider<T extends object> extends AbstractSelecti
|
|
|
23
24
|
if (!_item) return;
|
|
24
25
|
|
|
25
26
|
const deselectedKeys = _item.deselect(recursive);
|
|
27
|
+
this.options?.onDeselect?.(_item.data.get());
|
|
28
|
+
|
|
26
29
|
this.selectedKeys.set(difference(this.selectedKeys.get(), deselectedKeys));
|
|
30
|
+
this.options?.onChange?.(this.selectedKeys.get());
|
|
27
31
|
}
|
|
28
32
|
}
|
|
@@ -1,37 +1,50 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-unused-vars */
|
|
2
2
|
|
|
3
|
-
import { CompositeDataItem } from
|
|
4
|
-
import type { CompositeItemKey } from
|
|
5
|
-
import { AbstractSelectionProvider } from
|
|
3
|
+
import { CompositeDataItem } from "../CompositeDataItem";
|
|
4
|
+
import type { CompositeItemKey } from "../types";
|
|
5
|
+
import { AbstractSelectionProvider } from "./AbstractSelectionProvider";
|
|
6
6
|
import { difference } from "@/lib/set-operations";
|
|
7
7
|
|
|
8
8
|
export class SingleSelectionProvider<T extends object> extends AbstractSelectionProvider<T> {
|
|
9
|
-
|
|
10
9
|
select(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
11
10
|
select(item: CompositeDataItem<T>, recursive?: boolean): void;
|
|
12
11
|
select(item?: CompositeDataItem<T> | CompositeItemKey, _recursive: boolean = false) {
|
|
13
|
-
const _item = item
|
|
12
|
+
const _item = item
|
|
13
|
+
? item instanceof CompositeDataItem
|
|
14
|
+
? item
|
|
15
|
+
: this.data.lookup.get(item)
|
|
16
|
+
: this.data.focusProvider.focusedItem.get();
|
|
14
17
|
if (!_item) return;
|
|
15
18
|
|
|
16
|
-
this.selectedKeys.get().forEach(selectedKey => {
|
|
19
|
+
this.selectedKeys.get().forEach((selectedKey) => {
|
|
17
20
|
const _item = this.data.lookup.get(selectedKey);
|
|
18
21
|
if (!_item) return;
|
|
19
22
|
|
|
20
23
|
_item.deselect(false);
|
|
24
|
+
this.options?.onDeselect?.(_item.data.get());
|
|
21
25
|
});
|
|
22
26
|
|
|
23
27
|
const selectedKeys = _item.select(false);
|
|
28
|
+
this.options?.onSelect?.(_item.data.get());
|
|
24
29
|
|
|
25
30
|
this.selectedKeys.set(new Set(selectedKeys));
|
|
31
|
+
this.options?.onChange?.(this.selectedKeys.get());
|
|
26
32
|
}
|
|
27
33
|
|
|
28
34
|
deselect(itemKey?: CompositeItemKey, recursive?: boolean): void;
|
|
29
35
|
deselect(item: CompositeDataItem<T>, recursive?: boolean): void;
|
|
30
36
|
deselect(item?: CompositeDataItem<T> | CompositeItemKey, _recursive: boolean = false) {
|
|
31
|
-
const _item = item
|
|
37
|
+
const _item = item
|
|
38
|
+
? item instanceof CompositeDataItem
|
|
39
|
+
? item
|
|
40
|
+
: this.data.lookup.get(item)
|
|
41
|
+
: this.data.focusProvider.focusedItem.get();
|
|
32
42
|
if (!_item) return;
|
|
33
43
|
|
|
34
44
|
const deselectedKeys = _item.deselect(false);
|
|
45
|
+
this.options?.onDeselect?.(_item.data.get());
|
|
46
|
+
|
|
35
47
|
this.selectedKeys.set(difference(this.selectedKeys.get(), deselectedKeys));
|
|
48
|
+
this.options?.onChange?.(this.selectedKeys.get());
|
|
36
49
|
}
|
|
37
50
|
}
|