@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.
@@ -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;
@@ -4,6 +4,10 @@ class AbstractSelectionProvider {
4
4
  data;
5
5
  dataOptions;
6
6
  selectedKeys = atom(/* @__PURE__ */ new Set());
7
+ options;
8
+ constructor(options) {
9
+ this.options = options;
10
+ }
7
11
  init(data, dataOptions) {
8
12
  this.data = data;
9
13
  this.dataOptions = dataOptions;
@@ -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,6 +1,6 @@
1
1
  {
2
2
  "name": "@bccampus/ui-components",
3
- "version": "0.6.1",
3
+ "version": "0.7.0",
4
4
  "type": "module",
5
5
  "packageManager": "yarn@4.10.3",
6
6
  "exports": {
@@ -1,7 +1,7 @@
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';
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 ? item instanceof CompositeDataItem ? item : this.data.lookup.get(item) : this.data.focusProvider.focusedItem.get();
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 '../CompositeDataItem';
2
- import type { CompositeItemKey } from '../types';
3
- import { AbstractSelectionProvider } from './AbstractSelectionProvider';
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 '../CompositeDataItem';
4
- import type { CompositeItemKey } from '../types';
5
- import { AbstractSelectionProvider } from './AbstractSelectionProvider';
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 ? item instanceof CompositeDataItem ? item : this.data.lookup.get(item) : this.data.focusProvider.focusedItem.get();
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 ? item instanceof CompositeDataItem ? item : this.data.lookup.get(item) : this.data.focusProvider.focusedItem.get();
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
  }