@dosgato/dialog 0.0.57 → 0.0.59

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.
@@ -1,4 +1,4 @@
1
- import { ActiveStore } from '@txstate-mws/svelte-store';
1
+ import { ActiveStore, Store } from '@txstate-mws/svelte-store';
2
2
  import type { IconifyIcon } from '@iconify/svelte';
3
3
  import type { SvelteComponent } from 'svelte';
4
4
  export declare const TREE_STORE_CONTEXT: {};
@@ -18,7 +18,6 @@ export interface ITreeStore<T extends TreeItemFromDB> {
18
18
  loading?: boolean;
19
19
  rootItems?: TypedTreeItem<T>[];
20
20
  itemsById: Record<string, TypedTreeItem<T> | undefined>;
21
- filter?: string;
22
21
  focused?: TypedTreeItem<T>;
23
22
  selected: Map<string, TypedTreeItem<T>>;
24
23
  selectedItems: TypedTreeItem<T>[];
@@ -51,7 +50,7 @@ export declare class TreeStore<T extends TreeItemFromDB> extends ActiveStore<ITr
51
50
  fetchChildren: FetchChildrenFn<T>;
52
51
  treeElement?: HTMLElement;
53
52
  rootItems: import("@txstate-mws/svelte-store").DerivedStore<TypedTreeItem<T>[] | undefined, ITreeStore<T>>;
54
- filterTerm: import("@txstate-mws/svelte-store").DerivedStore<string | undefined, ITreeStore<T>>;
53
+ filterTerm: Store<string>;
55
54
  filteredRootItems: import("svelte/store").Readable<TypedTreeItem<T>[] | undefined>;
56
55
  draggable: import("@txstate-mws/svelte-store").DerivedStore<boolean, ITreeStore<T>>;
57
56
  dragging: import("@txstate-mws/svelte-store").DerivedStore<boolean, ITreeStore<T>>;
@@ -83,13 +82,16 @@ export declare class TreeStore<T extends TreeItemFromDB> extends ActiveStore<ITr
83
82
  trigger(): void;
84
83
  fetch(item?: TypedTreeItem<T>): Promise<TypedTreeItem<T>[]>;
85
84
  refresh(item?: TypedTreeItem<T>, skipNotify?: boolean): Promise<void>;
86
- filter(term: string | undefined, notify?: boolean): void;
85
+ filter(term: string | undefined): void;
87
86
  focus(item: TypedTreeItem<T> | undefined, notify?: boolean): void;
88
87
  select(item: TypedTreeItem<T>, { clear, notify, toggle }: {
89
88
  clear?: boolean | undefined;
90
89
  notify?: boolean | undefined;
91
90
  toggle?: boolean | undefined;
92
91
  }): void;
92
+ setSelected(items: TypedTreeItem<T>[], { notify }: {
93
+ notify?: boolean | undefined;
94
+ }): void;
93
95
  selectById(id: string, { clear, notify, toggle }: {
94
96
  clear?: boolean | undefined;
95
97
  notify?: boolean | undefined;
@@ -1,25 +1,35 @@
1
- import { ActiveStore, derivedStore } from '@txstate-mws/svelte-store';
1
+ import { ActiveStore, derivedStore, Store } from '@txstate-mws/svelte-store';
2
2
  import { derived } from 'svelte/store';
3
- import { hashid, isBlank, keyby, toArray } from 'txstate-utils';
3
+ import { hashid, isBlank, isNotBlank, keyby, toArray } from 'txstate-utils';
4
4
  export const TREE_STORE_CONTEXT = {};
5
5
  export class TreeStore extends ActiveStore {
6
6
  fetchChildren;
7
7
  treeElement;
8
8
  rootItems = derivedStore(this, 'rootItems');
9
- filterTerm = derivedStore(this, 'filter');
9
+ filterTerm = new Store('');
10
10
  filteredRootItems = derived([this.rootItems, this.filterTerm], ([rootItems, filter]) => {
11
11
  if (!this.searchableFn || !rootItems?.length || isBlank(filter))
12
12
  return this.value.rootItems;
13
13
  const ret = [];
14
+ const newselected = [];
15
+ let foundfocus = false;
14
16
  for (const itm of this.value.rootItems ?? []) {
15
17
  let found = false;
16
18
  for (const val of this.searchableFn(itm)) {
17
19
  if (val.toLocaleLowerCase().startsWith(filter))
18
20
  found = true;
19
21
  }
20
- if (found)
22
+ if (found) {
23
+ if (this.value.selected.has(itm.id))
24
+ newselected.push(itm);
25
+ if (this.value.focused?.id === itm.id)
26
+ foundfocus = true;
21
27
  ret.push(itm);
28
+ }
22
29
  }
30
+ if (!foundfocus)
31
+ this.focus(ret[0]);
32
+ this.setSelected(newselected, {});
23
33
  return ret;
24
34
  });
25
35
  draggable = derivedStore(this, v => v.draggable && !v.loading);
@@ -142,10 +152,8 @@ export class TreeStore extends ActiveStore {
142
152
  await this.refreshPromise;
143
153
  this.refreshPromise = undefined;
144
154
  }
145
- filter(term, notify = true) {
146
- this.value.filter = term?.toLocaleLowerCase();
147
- if (notify)
148
- this.trigger();
155
+ filter(term) {
156
+ this.filterTerm.set(term?.toLocaleLowerCase() ?? '');
149
157
  }
150
158
  focus(item, notify = true) {
151
159
  this.value.focused = item;
@@ -169,6 +177,13 @@ export class TreeStore extends ActiveStore {
169
177
  if (notify)
170
178
  this.trigger();
171
179
  }
180
+ setSelected(items, { notify = true }) {
181
+ this.value.selected.clear();
182
+ for (const itm of items)
183
+ this.value.selected.set(itm.id, itm);
184
+ if (notify)
185
+ this.trigger();
186
+ }
172
187
  selectById(id, { clear = false, notify = true, toggle = false }) {
173
188
  const item = this.value.itemsById[id];
174
189
  if (item)
@@ -380,12 +395,11 @@ export const lazyObserver = typeof IntersectionObserver !== 'undefined'
380
395
  }, { rootMargin: '500px' })
381
396
  : undefined;
382
397
  export function transformSearchable(searchable) {
383
- console.log('transformSearchable', searchable);
384
398
  return searchable == null
385
399
  ? undefined
386
400
  : (typeof searchable === 'function'
387
- ? (itm) => toArray(searchable(itm))
401
+ ? (itm) => toArray(searchable(itm)).filter(isNotBlank)
388
402
  : (Array.isArray(searchable)
389
- ? (itm) => searchable.map(k => itm[k])
390
- : (itm) => [itm[searchable]]));
403
+ ? (itm) => searchable.map(k => itm[k]).filter(isNotBlank)
404
+ : (itm) => isNotBlank(itm[searchable]) ? [itm[searchable]] : []));
391
405
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@dosgato/dialog",
3
3
  "description": "A component library for building forms that edit a JSON document.",
4
- "version": "0.0.57",
4
+ "version": "0.0.59",
5
5
  "scripts": {
6
6
  "prepublishOnly": "svelte-package",
7
7
  "dev": "vite dev --force",