@e280/quay 0.0.0-2 → 0.0.0-9
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/README.md +28 -0
- package/package.json +13 -10
- package/s/demo/main.bundle.ts +2 -3
- package/s/dom/components/breadcrumb/component.ts +6 -5
- package/s/dom/components/browser/component.ts +11 -7
- package/s/dom/components/browser/style.css.ts +1 -1
- package/s/dom/components/dropzone/component.ts +6 -4
- package/s/dom/components/dropzone/style.css.ts +1 -1
- package/s/dom/components/filter/component.ts +11 -6
- package/s/dom/components/outliner/component.ts +8 -5
- package/s/dom/components/searchbar/component.ts +8 -5
- package/s/dom/components/sort/component.ts +10 -6
- package/s/dom/theme.css.ts +2 -1
- package/s/dom/views/tree/component.ts +10 -8
- package/s/dom/views/tree/style.css.ts +1 -1
- package/s/index.html.ts +68 -73
- package/s/index.ts +6 -1
- package/s/logic/aspects/codex/codex.ts +3 -3
- package/s/logic/aspects/codex/example.ts +1 -4
- package/s/logic/aspects/codex/parts/codex-item.ts +4 -4
- package/s/logic/aspects/codex/parts/types.ts +1 -1
- package/s/logic/aspects/dropzone.ts +20 -16
- package/s/logic/aspects/tree-trail.ts +5 -4
- package/s/logic/brain.ts +5 -3
- package/s/logic/group.ts +7 -7
- package/s/logic/presets/media/group.ts +5 -4
- package/s/logic/presets/media/schema.ts +4 -1
- package/s/logic/presets/media/store.test.ts +41 -0
- package/s/logic/presets/media/store.ts +163 -0
- package/s/logic/presets/opfs/schema.ts +1 -1
- package/s/logic/presets/plain/group.ts +2 -2
- package/s/logic/presets/plain/schema.ts +1 -1
- package/s/logic/types.ts +1 -1
- package/s/tests.test.ts +2 -0
- package/x/demo/main.bundle.js +2 -2
- package/x/demo/main.bundle.js.map +1 -1
- package/x/demo/main.bundle.min.js +105 -142
- package/x/demo/main.bundle.min.js.LEGAL.txt +33 -0
- package/x/demo/main.bundle.min.js.map +7 -0
- package/x/dom/components/breadcrumb/component.d.ts +1 -1
- package/x/dom/components/breadcrumb/component.js +6 -5
- package/x/dom/components/breadcrumb/component.js.map +1 -1
- package/x/dom/components/browser/component.d.ts +1 -1
- package/x/dom/components/browser/component.js +10 -7
- package/x/dom/components/browser/component.js.map +1 -1
- package/x/dom/components/browser/style.css.d.ts +1 -1
- package/x/dom/components/browser/style.css.js +1 -1
- package/x/dom/components/browser/style.css.js.map +1 -1
- package/x/dom/components/dropzone/component.d.ts +1 -1
- package/x/dom/components/dropzone/component.js +6 -4
- package/x/dom/components/dropzone/component.js.map +1 -1
- package/x/dom/components/dropzone/style.css.d.ts +1 -1
- package/x/dom/components/dropzone/style.css.js +1 -1
- package/x/dom/components/dropzone/style.css.js.map +1 -1
- package/x/dom/components/filter/component.d.ts +1 -1
- package/x/dom/components/filter/component.js +8 -6
- package/x/dom/components/filter/component.js.map +1 -1
- package/x/dom/components/outliner/component.d.ts +1 -1
- package/x/dom/components/outliner/component.js +7 -5
- package/x/dom/components/outliner/component.js.map +1 -1
- package/x/dom/components/searchbar/component.d.ts +1 -1
- package/x/dom/components/searchbar/component.js +7 -5
- package/x/dom/components/searchbar/component.js.map +1 -1
- package/x/dom/components/sort/component.d.ts +1 -1
- package/x/dom/components/sort/component.js +8 -6
- package/x/dom/components/sort/component.js.map +1 -1
- package/x/dom/components.d.ts +7 -7
- package/x/dom/theme.css.d.ts +1 -1
- package/x/dom/theme.css.js +1 -1
- package/x/dom/theme.css.js.map +1 -1
- package/x/dom/views/tree/component.d.ts +1 -6
- package/x/dom/views/tree/component.js +10 -8
- package/x/dom/views/tree/component.js.map +1 -1
- package/x/dom/views/tree/style.css.d.ts +1 -1
- package/x/dom/views/tree/style.css.js +1 -1
- package/x/dom/views/tree/style.css.js.map +1 -1
- package/x/index.d.ts +6 -1
- package/x/index.html +70 -167
- package/x/index.html.d.ts +1 -2
- package/x/index.html.js +67 -73
- package/x/index.html.js.map +1 -1
- package/x/index.js +6 -1
- package/x/index.js.map +1 -1
- package/x/logic/aspects/codex/codex.js +3 -3
- package/x/logic/aspects/codex/codex.js.map +1 -1
- package/x/logic/aspects/codex/example.d.ts +0 -1
- package/x/logic/aspects/codex/example.js +1 -3
- package/x/logic/aspects/codex/example.js.map +1 -1
- package/x/logic/aspects/codex/parts/codex-item.d.ts +1 -1
- package/x/logic/aspects/codex/parts/codex-item.js +4 -4
- package/x/logic/aspects/codex/parts/codex-item.js.map +1 -1
- package/x/logic/aspects/codex/parts/types.d.ts +1 -1
- package/x/logic/aspects/dropzone.d.ts +1 -1
- package/x/logic/aspects/dropzone.js +19 -15
- package/x/logic/aspects/dropzone.js.map +1 -1
- package/x/logic/aspects/tree-trail.d.ts +1 -1
- package/x/logic/aspects/tree-trail.js +4 -4
- package/x/logic/aspects/tree-trail.js.map +1 -1
- package/x/logic/brain.d.ts +4 -2
- package/x/logic/brain.js.map +1 -1
- package/x/logic/group.d.ts +4 -4
- package/x/logic/group.js +6 -6
- package/x/logic/group.js.map +1 -1
- package/x/logic/presets/media/group.d.ts +1 -1
- package/x/logic/presets/media/group.js +3 -3
- package/x/logic/presets/media/group.js.map +1 -1
- package/x/logic/presets/media/schema.d.ts +4 -1
- package/x/logic/presets/media/store.d.ts +92 -0
- package/x/logic/presets/media/store.js +129 -0
- package/x/logic/presets/media/store.js.map +1 -0
- package/x/logic/presets/media/store.test.d.ts +7 -0
- package/x/logic/presets/media/store.test.js +31 -0
- package/x/logic/presets/media/store.test.js.map +1 -0
- package/x/logic/presets/opfs/schema.d.ts +1 -1
- package/x/logic/presets/plain/group.js +2 -2
- package/x/logic/presets/plain/group.js.map +1 -1
- package/x/logic/presets/plain/schema.d.ts +1 -1
- package/x/logic/types.d.ts +1 -1
- package/x/tests.test.js +2 -0
- package/x/tests.test.js.map +1 -1
- package/x/genius/folio.md +0 -29
- package/x/genius/quay.md +0 -13
- package/x/genius/turbo.md +0 -21
- package/x/importmap.json +0 -47
|
@@ -1,8 +1,9 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { loot } from "@e280/sly/loot";
|
|
2
|
+
import { signal } from "@e280/strata";
|
|
2
3
|
export class Dropzone {
|
|
3
4
|
group;
|
|
4
|
-
#drag_drop = new
|
|
5
|
-
|
|
5
|
+
#drag_drop = new loot.DragAndDrops({
|
|
6
|
+
acceptDrop: (_e, grabbed, hovering) => this.group.move(grabbed, hovering)
|
|
6
7
|
});
|
|
7
8
|
constructor(group) {
|
|
8
9
|
this.group = group;
|
|
@@ -10,31 +11,34 @@ export class Dropzone {
|
|
|
10
11
|
// to make drop file to import ui work
|
|
11
12
|
#hovering = signal(undefined);
|
|
12
13
|
get grabbed() {
|
|
13
|
-
return this.#drag_drop.
|
|
14
|
+
return this.#drag_drop.dragging;
|
|
14
15
|
}
|
|
15
16
|
get hovering() {
|
|
16
|
-
return this.#drag_drop.hovering ?? this.#hovering
|
|
17
|
+
return this.#drag_drop.hovering ?? this.#hovering();
|
|
17
18
|
}
|
|
18
19
|
dragenter = (e, target) => {
|
|
19
20
|
e.preventDefault();
|
|
20
|
-
this.#drag_drop.dropzone.dragenter(
|
|
21
|
-
this.#hovering
|
|
21
|
+
this.#drag_drop.dropzone(() => target).dragenter(e);
|
|
22
|
+
this.#hovering(target);
|
|
22
23
|
};
|
|
23
24
|
dragleave = (e) => {
|
|
24
|
-
this
|
|
25
|
-
|
|
25
|
+
const hovering = this.hovering;
|
|
26
|
+
if (hovering)
|
|
27
|
+
this.#drag_drop.dropzone(() => hovering).dragleave(e);
|
|
28
|
+
this.#hovering(undefined);
|
|
26
29
|
};
|
|
27
30
|
dragstart = (e, n) => {
|
|
28
31
|
e.stopPropagation();
|
|
29
|
-
this.#drag_drop.dragzone
|
|
32
|
+
this.#drag_drop.dragzone(() => n).dragstart(e);
|
|
30
33
|
};
|
|
31
34
|
dragover = (e, n) => {
|
|
32
35
|
e.preventDefault();
|
|
33
|
-
this.#drag_drop.dropzone
|
|
36
|
+
this.#drag_drop.dropzone(() => n).dragover(e);
|
|
34
37
|
};
|
|
35
38
|
dragend = (e) => {
|
|
36
|
-
this.#drag_drop
|
|
37
|
-
this.#
|
|
39
|
+
this.#drag_drop.$draggy(undefined);
|
|
40
|
+
this.#drag_drop.$droppy(undefined);
|
|
41
|
+
this.#hovering(undefined);
|
|
38
42
|
};
|
|
39
43
|
drop = (e, target) => {
|
|
40
44
|
e.preventDefault();
|
|
@@ -46,8 +50,8 @@ export class Dropzone {
|
|
|
46
50
|
const child = this.grabbed?.children.some(c => this.hovering?.id === c.id);
|
|
47
51
|
const parent = this.grabbed?.parent?.id === this.hovering?.id;
|
|
48
52
|
if (!same && !child && !parent)
|
|
49
|
-
this.#drag_drop.dropzone
|
|
50
|
-
this.#hovering
|
|
53
|
+
this.#drag_drop.dropzone(() => target).drop(e);
|
|
54
|
+
this.#hovering(undefined);
|
|
51
55
|
};
|
|
52
56
|
change = (e, targetFolder) => {
|
|
53
57
|
const input = e.currentTarget;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dropzone.js","sourceRoot":"","sources":["../../../s/logic/aspects/dropzone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,
|
|
1
|
+
{"version":3,"file":"dropzone.js","sourceRoot":"","sources":["../../../s/logic/aspects/dropzone.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,gBAAgB,CAAA;AACnC,OAAO,EAAC,MAAM,EAAC,MAAM,cAAc,CAAA;AAKnC,MAAM,OAAO,QAAQ;IAKA;IAJpB,UAAU,GAAG,IAAI,IAAI,CAAC,YAAY,CAAuB;QACxD,UAAU,EAAE,CAAC,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC;KACzE,CAAC,CAAA;IAEF,YAAoB,KAAY;QAAZ,UAAK,GAAL,KAAK,CAAO;IAAG,CAAC;IAEpC,sCAAsC;IACtC,SAAS,GAAG,MAAM,CAAwB,SAAS,CAAC,CAAA;IAEpD,IAAI,OAAO;QACV,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAA;IAChC,CAAC;IAED,IAAI,QAAQ;QACX,OAAO,IAAI,CAAC,UAAU,CAAC,QAAQ,IAAI,IAAI,CAAC,SAAS,EAAE,CAAA;IACpD,CAAC;IAED,SAAS,GAAG,CAAC,CAAY,EAAE,MAAiB,EAAE,EAAE;QAC/C,CAAC,CAAC,cAAc,EAAE,CAAA;QAClB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACnD,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;IACvB,CAAC,CAAA;IAED,SAAS,GAAG,CAAC,CAAY,EAAE,EAAE;QAC5B,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAA;QAC9B,IAAI,QAAQ;YACX,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;QACtD,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IAC1B,CAAC,CAAA;IAED,SAAS,GAAG,CAAC,CAAY,EAAE,CAAY,EAAE,EAAE;QAC1C,CAAC,CAAC,eAAe,EAAE,CAAA;QACnB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAA;IAC/C,CAAC,CAAA;IAED,QAAQ,GAAG,CAAC,CAAY,EAAE,CAAY,EAAE,EAAE;QACzC,CAAC,CAAC,cAAc,EAAE,CAAA;QAClB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;IAC9C,CAAC,CAAA;IAED,OAAO,GAAG,CAAC,CAAY,EAAE,EAAE;QAC1B,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAClC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;QAClC,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IAC1B,CAAC,CAAA;IAED,IAAI,GAAG,CAAC,CAAY,EAAE,MAAiB,EAAE,EAAE;QAC1C,CAAC,CAAC,cAAc,EAAE,CAAA;QAClB,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE,CAAC,CAAA;QAErD,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAA;QACjC,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,EAAE,EAAE,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAA;QACnD,MAAM,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC,CAAA;QAC1E,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAA;QAE7D,IAAG,CAAC,IAAI,IAAI,CAAC,KAAK,IAAI,CAAC,MAAM;YAC5B,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QAE/C,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAA;IAC1B,CAAC,CAAA;IAED,MAAM,GAAG,CAAC,CAAY,EAAE,YAAuB,EAAE,EAAE;QAClD,MAAM,KAAK,GAAG,CAAC,CAAC,aAAiC,CAAA;QACjD,MAAM,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC,CAAA;QAE3C,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YAClB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC,CAAA;QACvC,CAAC;IACF,CAAC,CAAA;CACD"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Schema } from "./codex/parts/types.js";
|
|
2
2
|
import { CodexItem } from "./codex/parts/codex-item.js";
|
|
3
3
|
export declare class TreeTrail<Sc extends Schema> {
|
|
4
|
-
readonly signal: import("@
|
|
4
|
+
readonly signal: import("@e280/strata").Signal<CodexItem<Sc, keyof Sc["specimens"]>[]>;
|
|
5
5
|
constructor(root: CodexItem<Sc>);
|
|
6
6
|
setTrail(e: Event, item: CodexItem<Sc>): void;
|
|
7
7
|
get currentFolder(): CodexItem<Sc, keyof Sc["specimens"]>[];
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { signal } from "@
|
|
1
|
+
import { signal } from "@e280/strata";
|
|
2
2
|
export class TreeTrail {
|
|
3
3
|
signal = signal([]);
|
|
4
4
|
constructor(root) {
|
|
5
|
-
this.signal
|
|
5
|
+
this.signal([root]);
|
|
6
6
|
}
|
|
7
7
|
setTrail(e, item) {
|
|
8
8
|
if (e.target !== e.currentTarget)
|
|
@@ -15,10 +15,10 @@ export class TreeTrail {
|
|
|
15
15
|
trail.unshift(cur);
|
|
16
16
|
cur = cur.parent;
|
|
17
17
|
}
|
|
18
|
-
this.signal
|
|
18
|
+
this.signal(trail);
|
|
19
19
|
}
|
|
20
20
|
get currentFolder() {
|
|
21
|
-
return this.signal.
|
|
21
|
+
return this.signal().at(-1)?.children ?? [];
|
|
22
22
|
}
|
|
23
23
|
}
|
|
24
24
|
//# sourceMappingURL=tree-trail.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tree-trail.js","sourceRoot":"","sources":["../../../s/logic/aspects/tree-trail.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tree-trail.js","sourceRoot":"","sources":["../../../s/logic/aspects/tree-trail.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,MAAM,EAAC,MAAM,cAAc,CAAA;AAInC,MAAM,OAAO,SAAS;IACZ,MAAM,GAAG,MAAM,CAAkB,EAAE,CAAC,CAAA;IAE7C,YAAY,IAAmB;QAC9B,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;IACpB,CAAC;IAED,QAAQ,CAAC,CAAQ,EAAE,IAAmB;QACrC,IAAI,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC,aAAa;YAAE,OAAM;QAExC,MAAM,KAAK,GAAoB,EAAE,CAAA;QAEjC,IAAI,GAAG,GAAG,IAAI,CAAC,IAAI,KAAK,QAAQ;YAC/B,CAAC,CAAC,IAAI;YACN,CAAC,CAAC,IAAI,CAAC,MAAM,CAAA;QAEd,OAAO,GAAG,EAAE,CAAC;YACZ,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAA;YAClB,GAAG,GAAG,GAAG,CAAC,MAAM,CAAA;QACjB,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;IACnB,CAAC;IAED,IAAI,aAAa;QAChB,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,QAAQ,IAAI,EAAE,CAAA;IAC5C,CAAC;CACD"}
|
package/x/logic/brain.d.ts
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { Group } from "./group.js";
|
|
2
|
+
type RegisteredGroup<G> = G extends Group<infer _Schema> ? G : never;
|
|
2
3
|
/**
|
|
3
4
|
* Quay's global state
|
|
4
5
|
* - manages groups
|
|
@@ -6,6 +7,7 @@ import { Group } from "./group.js";
|
|
|
6
7
|
*/
|
|
7
8
|
export declare class Brain {
|
|
8
9
|
#private;
|
|
9
|
-
setGroup<G
|
|
10
|
-
getGroup<G
|
|
10
|
+
setGroup<G>(name: string, group: RegisteredGroup<G>): RegisteredGroup<G>;
|
|
11
|
+
getGroup<G = Group>(name: string): RegisteredGroup<G>;
|
|
11
12
|
}
|
|
13
|
+
export {};
|
package/x/logic/brain.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"brain.js","sourceRoot":"","sources":["../../s/logic/brain.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;
|
|
1
|
+
{"version":3,"file":"brain.js","sourceRoot":"","sources":["../../s/logic/brain.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,WAAW,CAAA;AAK9B;;;;GAIG;AACH,MAAM,OAAO,KAAK;IACjB,OAAO,GAAG,IAAI,IAAI,EAAiB,CAAA;IAEnC,QAAQ,CAAI,IAAY,EAAE,KAAyB;QAClD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAA;QAC7B,OAAO,KAAK,CAAA;IACb,CAAC;IAED,QAAQ,CAAY,IAAY;QAC/B,OAAO,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAuB,CAAA;IACxD,CAAC;CACD"}
|
package/x/logic/group.d.ts
CHANGED
|
@@ -8,9 +8,9 @@ export declare class Group<Sc extends Schema = any> {
|
|
|
8
8
|
config: GroupConfig<Sc>;
|
|
9
9
|
trail: TreeTrail<Sc>;
|
|
10
10
|
dropzone: Dropzone;
|
|
11
|
-
searchText: import("@
|
|
12
|
-
selectedFilter: import("@
|
|
13
|
-
selectedSort: import("@
|
|
11
|
+
searchText: import("@e280/strata").Signal<string>;
|
|
12
|
+
selectedFilter: import("@e280/strata").Signal<string>;
|
|
13
|
+
selectedSort: import("@e280/strata").Signal<string>;
|
|
14
14
|
on: {
|
|
15
15
|
newFolder: import("@e280/stz").Sub<[{
|
|
16
16
|
parent: CodexItem<Sc>;
|
|
@@ -36,7 +36,7 @@ export declare class Group<Sc extends Schema = any> {
|
|
|
36
36
|
refresh: import("@e280/stz").Sub<[{}]>;
|
|
37
37
|
};
|
|
38
38
|
constructor(config: GroupConfig<Sc>);
|
|
39
|
-
get permissions(): (item: CodexItem) => Permission;
|
|
39
|
+
get permissions(): (item: CodexItem<Sc>) => Permission;
|
|
40
40
|
getFilterFn(filterKey: string): SearchFn<Sc>;
|
|
41
41
|
getSearchFn(searchText: string): SearchFn<Sc>;
|
|
42
42
|
getSortFn(sortKey: string): SortFn<Sc>;
|
package/x/logic/group.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { sub } from "@e280/stz";
|
|
2
|
-
import { signal } from "@
|
|
2
|
+
import { signal } from "@e280/strata";
|
|
3
3
|
import { Dropzone } from "./aspects/dropzone.js";
|
|
4
4
|
import { TreeTrail } from "./aspects/tree-trail.js";
|
|
5
5
|
export class Group {
|
|
@@ -20,8 +20,8 @@ export class Group {
|
|
|
20
20
|
};
|
|
21
21
|
constructor(config) {
|
|
22
22
|
this.config = config;
|
|
23
|
-
this.selectedFilter
|
|
24
|
-
this.selectedSort
|
|
23
|
+
this.selectedFilter(config.defaultFilter);
|
|
24
|
+
this.selectedSort(config.defaultSort);
|
|
25
25
|
this.trail = new TreeTrail(config.root);
|
|
26
26
|
}
|
|
27
27
|
get permissions() {
|
|
@@ -38,12 +38,12 @@ export class Group {
|
|
|
38
38
|
return this.config.sorts?.get(sortKey) ?? (() => 0);
|
|
39
39
|
}
|
|
40
40
|
sort(items) {
|
|
41
|
-
const sortFn = this.getSortFn(this.selectedSort
|
|
41
|
+
const sortFn = this.getSortFn(this.selectedSort());
|
|
42
42
|
return [...items].sort(sortFn);
|
|
43
43
|
}
|
|
44
44
|
matches(item) {
|
|
45
|
-
const filterFn = this.getFilterFn(this.selectedFilter
|
|
46
|
-
const searchFn = this.getSearchFn(this.searchText
|
|
45
|
+
const filterFn = this.getFilterFn(this.selectedFilter());
|
|
46
|
+
const searchFn = this.getSearchFn(this.searchText());
|
|
47
47
|
return filterFn(item) && searchFn(item);
|
|
48
48
|
}
|
|
49
49
|
move(item, target) {
|
package/x/logic/group.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group.js","sourceRoot":"","sources":["../../s/logic/group.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,GAAG,EAAC,MAAM,WAAW,CAAA;AAC7B,OAAO,EAAC,MAAM,EAAC,MAAM,cAAc,CAAA;AAGnC,OAAO,EAAC,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC9C,OAAO,EAAC,SAAS,EAAC,MAAM,yBAAyB,CAAA;AAKjD,MAAM,OAAO,KAAK;IAiBE;IAhBnB,KAAK,CAAe;IACpB,QAAQ,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAA;IAC7B,UAAU,GAAG,MAAM,CAAC,EAAE,CAAC,CAAA;IACvB,cAAc,GAAG,MAAM,CAAC,EAAE,CAAC,CAAA;IAC3B,YAAY,GAAG,MAAM,CAAC,EAAE,CAAC,CAAA;IAEzB,EAAE,GAAG;QACJ,SAAS,EAAE,GAAG,EAA6B;QAC3C,IAAI,EAAE,GAAG,EAAkD;QAC3D,MAAM,EAAE,GAAG,EAA2B;QACtC,MAAM,EAAE,GAAG,EAA4C;QACvD,MAAM,EAAE,GAAG,EAA4C;QACvD,MAAM,EAAE,GAAG,EAAuB;QAClC,OAAO,EAAE,GAAG,EAAQ;KACpB,CAAA;IAED,YAAmB,MAAuB;QAAvB,WAAM,GAAN,MAAM,CAAiB;QACzC,IAAI,CAAC,cAAc,CAAC,
|
|
1
|
+
{"version":3,"file":"group.js","sourceRoot":"","sources":["../../s/logic/group.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Group } from "../../group.js";
|
|
2
2
|
import { MediaSchema } from "./schema.js";
|
|
3
3
|
import { GroupConfig } from "../../types.js";
|
|
4
|
-
export declare class MediaGroup extends Group<MediaSchema>
|
|
4
|
+
export declare class MediaGroup extends Group<MediaSchema> {
|
|
5
5
|
static config: () => GroupConfig<MediaSchema>;
|
|
6
6
|
constructor();
|
|
7
7
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
+
import { html } from "lit";
|
|
1
2
|
import { MapG } from "@e280/stz";
|
|
2
|
-
import { html } from "@benev/slate";
|
|
3
|
-
import Quay from "../../../index.js";
|
|
4
3
|
import { Group } from "../../group.js";
|
|
4
|
+
import { Permissions } from "../../permissions.js";
|
|
5
5
|
import { Codex } from "../../aspects/codex/codex.js";
|
|
6
6
|
export class MediaGroup extends Group {
|
|
7
7
|
static config = () => {
|
|
@@ -65,7 +65,7 @@ export class MediaGroup extends Group {
|
|
|
65
65
|
// // TODO icons
|
|
66
66
|
// : html`<sl-icon name=${item.taxon.icon}></sl-icon>`
|
|
67
67
|
},
|
|
68
|
-
permissions: item =>
|
|
68
|
+
permissions: item => Permissions.all,
|
|
69
69
|
};
|
|
70
70
|
};
|
|
71
71
|
constructor() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group.js","sourceRoot":"","sources":["../../../../s/logic/presets/media/group.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,IAAI,EAAC,MAAM,
|
|
1
|
+
{"version":3,"file":"group.js","sourceRoot":"","sources":["../../../../s/logic/presets/media/group.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Content } from "@
|
|
1
|
+
import { Content } from "@e280/sly";
|
|
2
2
|
import { AsSchema } from "../../aspects/codex/parts/types.js";
|
|
3
3
|
export type MediaFormat = "video" | "image" | "audio" | "other";
|
|
4
4
|
export type MediaSchema = AsSchema<{
|
|
@@ -13,6 +13,9 @@ export type MediaSchema = AsSchema<{
|
|
|
13
13
|
label: string;
|
|
14
14
|
format: MediaFormat;
|
|
15
15
|
previewUrl: string | null;
|
|
16
|
+
hash?: string;
|
|
17
|
+
mime?: string;
|
|
18
|
+
size?: number;
|
|
16
19
|
};
|
|
17
20
|
};
|
|
18
21
|
}>;
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { Cellar } from "../../../cellar/cellar.js";
|
|
2
|
+
import { MediaFormat } from "./schema.js";
|
|
3
|
+
import { MediaGroup } from "./group.js";
|
|
4
|
+
export type MediaRecord = {
|
|
5
|
+
hash: string;
|
|
6
|
+
label: string;
|
|
7
|
+
format: MediaFormat;
|
|
8
|
+
mime: string;
|
|
9
|
+
size: number;
|
|
10
|
+
createdAt: number;
|
|
11
|
+
updatedAt: number;
|
|
12
|
+
};
|
|
13
|
+
export declare class MediaStore extends MediaGroup {
|
|
14
|
+
#private;
|
|
15
|
+
static open(scope?: string): Promise<MediaStore>;
|
|
16
|
+
cellar: Cellar;
|
|
17
|
+
constructor();
|
|
18
|
+
records(): AsyncGenerator<MediaRecord, void, unknown>;
|
|
19
|
+
importFiles(files: File[], parent?: import("../../aspects/codex/parts/codex-item.js").CodexItem<{
|
|
20
|
+
taxon: {
|
|
21
|
+
icon: import("@e280/sly").Content;
|
|
22
|
+
};
|
|
23
|
+
specimens: {
|
|
24
|
+
folder: {
|
|
25
|
+
label: string;
|
|
26
|
+
};
|
|
27
|
+
file: {
|
|
28
|
+
label: string;
|
|
29
|
+
format: MediaFormat;
|
|
30
|
+
previewUrl: string | null;
|
|
31
|
+
hash?: string;
|
|
32
|
+
mime?: string;
|
|
33
|
+
size?: number;
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
}, "file" | "folder">): Promise<MediaRecord[]>;
|
|
37
|
+
importFile(file: File, parent?: import("../../aspects/codex/parts/codex-item.js").CodexItem<{
|
|
38
|
+
taxon: {
|
|
39
|
+
icon: import("@e280/sly").Content;
|
|
40
|
+
};
|
|
41
|
+
specimens: {
|
|
42
|
+
folder: {
|
|
43
|
+
label: string;
|
|
44
|
+
};
|
|
45
|
+
file: {
|
|
46
|
+
label: string;
|
|
47
|
+
format: MediaFormat;
|
|
48
|
+
previewUrl: string | null;
|
|
49
|
+
hash?: string;
|
|
50
|
+
mime?: string;
|
|
51
|
+
size?: number;
|
|
52
|
+
};
|
|
53
|
+
};
|
|
54
|
+
}, "file" | "folder">): Promise<MediaRecord>;
|
|
55
|
+
remove(hash: string): Promise<void>;
|
|
56
|
+
findByHash(hash: string): (import("../../aspects/codex/parts/codex-item.js").CodexItem<{
|
|
57
|
+
taxon: {
|
|
58
|
+
icon: import("@e280/sly").Content;
|
|
59
|
+
};
|
|
60
|
+
specimens: {
|
|
61
|
+
folder: {
|
|
62
|
+
label: string;
|
|
63
|
+
};
|
|
64
|
+
file: {
|
|
65
|
+
label: string;
|
|
66
|
+
format: MediaFormat;
|
|
67
|
+
previewUrl: string | null;
|
|
68
|
+
hash?: string;
|
|
69
|
+
mime?: string;
|
|
70
|
+
size?: number;
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
}, "file" | "folder"> & import("../../aspects/codex/parts/codex-item.js").CodexItem<{
|
|
74
|
+
taxon: {
|
|
75
|
+
icon: import("@e280/sly").Content;
|
|
76
|
+
};
|
|
77
|
+
specimens: {
|
|
78
|
+
folder: {
|
|
79
|
+
label: string;
|
|
80
|
+
};
|
|
81
|
+
file: {
|
|
82
|
+
label: string;
|
|
83
|
+
format: MediaFormat;
|
|
84
|
+
previewUrl: string | null;
|
|
85
|
+
hash?: string;
|
|
86
|
+
mime?: string;
|
|
87
|
+
size?: number;
|
|
88
|
+
};
|
|
89
|
+
};
|
|
90
|
+
}, "file">) | undefined;
|
|
91
|
+
dispose(): void;
|
|
92
|
+
}
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
import { Kv, StorageDriver } from "@e280/kv";
|
|
2
|
+
import { Cellar } from "../../../cellar/cellar.js";
|
|
3
|
+
import { MediaGroup } from "./group.js";
|
|
4
|
+
export class MediaStore extends MediaGroup {
|
|
5
|
+
static async open(scope = "default") {
|
|
6
|
+
const group = new this();
|
|
7
|
+
group.cellar = await Cellar.opfs("media");
|
|
8
|
+
group.#index = mediaIndex(scope);
|
|
9
|
+
await group.#load();
|
|
10
|
+
return group;
|
|
11
|
+
}
|
|
12
|
+
#objectUrls = new Map();
|
|
13
|
+
#index;
|
|
14
|
+
cellar = new Cellar();
|
|
15
|
+
constructor() {
|
|
16
|
+
super();
|
|
17
|
+
this.#index = mediaIndex("default");
|
|
18
|
+
this.on.upload.sub(({ files, target }) => {
|
|
19
|
+
void this.importFiles(files, target);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
async *records() {
|
|
23
|
+
for await (const [, record] of this.#index.entries())
|
|
24
|
+
yield record;
|
|
25
|
+
}
|
|
26
|
+
async #load() {
|
|
27
|
+
for await (const record of this.records()) {
|
|
28
|
+
if (record.format === "image" && !this.#objectUrls.has(record.hash))
|
|
29
|
+
await this.#loadPreview(record);
|
|
30
|
+
this.#attachRecord(record, this.config.root);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
async importFiles(files, parent = this.config.root) {
|
|
34
|
+
return Promise.all(files.map(f => this.importFile(f, parent)));
|
|
35
|
+
}
|
|
36
|
+
async importFile(file, parent = this.config.root) {
|
|
37
|
+
const bytes = new Uint8Array(await file.arrayBuffer());
|
|
38
|
+
const cask = await this.cellar.save(bytes);
|
|
39
|
+
const existing = await this.#index.get(cask.hash);
|
|
40
|
+
const now = Date.now();
|
|
41
|
+
const record = {
|
|
42
|
+
hash: cask.hash,
|
|
43
|
+
label: existing?.label ?? file.name,
|
|
44
|
+
format: mediaFormat(file.type),
|
|
45
|
+
mime: file.type,
|
|
46
|
+
size: file.size,
|
|
47
|
+
createdAt: existing?.createdAt ?? now,
|
|
48
|
+
updatedAt: now,
|
|
49
|
+
};
|
|
50
|
+
await this.#index.set(record.hash, record);
|
|
51
|
+
if (record.format === "image")
|
|
52
|
+
this.#setPreview(record.hash, URL.createObjectURL(file));
|
|
53
|
+
this.#attachRecord(record, parent);
|
|
54
|
+
return record;
|
|
55
|
+
}
|
|
56
|
+
async remove(hash) {
|
|
57
|
+
await this.#index.del(hash);
|
|
58
|
+
await this.cellar.delete(hash);
|
|
59
|
+
const item = this.findByHash(hash);
|
|
60
|
+
if (item) {
|
|
61
|
+
item.detach();
|
|
62
|
+
item.destroy();
|
|
63
|
+
}
|
|
64
|
+
this.#revokePreview(hash);
|
|
65
|
+
}
|
|
66
|
+
findByHash(hash) {
|
|
67
|
+
for (const [item] of this.config.root.crawl()) {
|
|
68
|
+
if (item.isKind("file") && item.specimen.hash === hash)
|
|
69
|
+
return item;
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
dispose() {
|
|
73
|
+
for (const url of this.#objectUrls.values())
|
|
74
|
+
URL.revokeObjectURL(url);
|
|
75
|
+
this.#objectUrls.clear();
|
|
76
|
+
}
|
|
77
|
+
#attachRecord(record, parent = this.config.root) {
|
|
78
|
+
const existing = this.findByHash(record.hash);
|
|
79
|
+
if (existing)
|
|
80
|
+
return existing;
|
|
81
|
+
const item = this.config.codex.create("file", {
|
|
82
|
+
hash: record.hash,
|
|
83
|
+
label: record.label,
|
|
84
|
+
format: record.format,
|
|
85
|
+
mime: record.mime,
|
|
86
|
+
size: record.size,
|
|
87
|
+
previewUrl: this.#objectUrls.get(record.hash) ?? null,
|
|
88
|
+
});
|
|
89
|
+
parent.attach(item);
|
|
90
|
+
return item;
|
|
91
|
+
}
|
|
92
|
+
async #loadPreview(record) {
|
|
93
|
+
const cask = await this.cellar.load(record.hash);
|
|
94
|
+
const blob = new Blob([cask.bytes], { type: record.mime || "image/*" });
|
|
95
|
+
return this.#setPreview(record.hash, URL.createObjectURL(blob));
|
|
96
|
+
}
|
|
97
|
+
#setPreview(hash, url) {
|
|
98
|
+
this.#revokePreview(hash);
|
|
99
|
+
this.#objectUrls.set(hash, url);
|
|
100
|
+
return url;
|
|
101
|
+
}
|
|
102
|
+
#revokePreview(hash) {
|
|
103
|
+
const url = this.#objectUrls.get(hash);
|
|
104
|
+
if (url) {
|
|
105
|
+
URL.revokeObjectURL(url);
|
|
106
|
+
this.#objectUrls.delete(hash);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const mediaFormats = new Set(["video", "image", "audio"]);
|
|
111
|
+
const memoryIndexes = new Map();
|
|
112
|
+
function mediaFormat(mime) {
|
|
113
|
+
const [type] = mime.split("/");
|
|
114
|
+
return mediaFormats.has(type) ? type : "other";
|
|
115
|
+
}
|
|
116
|
+
function mediaIndex(scope) {
|
|
117
|
+
const storage = globalThis.localStorage;
|
|
118
|
+
if (storage)
|
|
119
|
+
return new Kv(new StorageDriver(storage))
|
|
120
|
+
.namespace("quay.media")
|
|
121
|
+
.namespace(scope);
|
|
122
|
+
const existing = memoryIndexes.get(scope);
|
|
123
|
+
if (existing)
|
|
124
|
+
return existing;
|
|
125
|
+
const index = new Kv();
|
|
126
|
+
memoryIndexes.set(scope, index);
|
|
127
|
+
return index;
|
|
128
|
+
}
|
|
129
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../../../../s/logic/presets/media/store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { Txt } from "@e280/stz";
|
|
2
|
+
import { expect, Science, test } from "@e280/science";
|
|
3
|
+
import { MediaStore } from "./store.js";
|
|
4
|
+
delete globalThis.localStorage;
|
|
5
|
+
export default Science.suite({
|
|
6
|
+
"imports files into cellar and index": test(async () => {
|
|
7
|
+
const group = new MediaStore();
|
|
8
|
+
const file = new File([Txt.toBytes("hello")], "hello.txt", { type: "text/plain" });
|
|
9
|
+
const [record] = await group.importFiles([file]);
|
|
10
|
+
expect(await group.cellar.has(record.hash)).is(true);
|
|
11
|
+
expect(group.findByHash(record.hash)?.specimen.label).is("hello.txt");
|
|
12
|
+
}),
|
|
13
|
+
"lists media records": test(async () => {
|
|
14
|
+
const store = new MediaStore();
|
|
15
|
+
const file = new File([Txt.toBytes("image")], "image.png", { type: "image/png" });
|
|
16
|
+
const record = await store.importFile(file);
|
|
17
|
+
const records = [];
|
|
18
|
+
for await (const record of store.records())
|
|
19
|
+
records.push(record);
|
|
20
|
+
expect(records.some(r => r.hash === record.hash)).is(true);
|
|
21
|
+
}),
|
|
22
|
+
"removes media records and bytes": test(async () => {
|
|
23
|
+
const store = new MediaStore();
|
|
24
|
+
const file = new File([Txt.toBytes("image")], "image.png", { type: "image/png" });
|
|
25
|
+
const record = await store.importFile(file);
|
|
26
|
+
await store.remove(record.hash);
|
|
27
|
+
expect(await store.cellar.has(record.hash)).is(false);
|
|
28
|
+
expect(store.findByHash(record.hash)).is(undefined);
|
|
29
|
+
}),
|
|
30
|
+
});
|
|
31
|
+
//# sourceMappingURL=store.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.test.js","sourceRoot":"","sources":["../../../../s/logic/presets/media/store.test.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,GAAG,EAAC,MAAM,WAAW,CAAA;AAC7B,OAAO,EAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAC,MAAM,eAAe,CAAA;AAEnD,OAAO,EAAC,UAAU,EAAC,MAAM,YAAY,CAAA;AAErC,OAAQ,UAAkB,CAAC,YAAY,CAAA;AAEvC,eAAe,OAAO,CAAC,KAAK,CAAC;IAC5B,qCAAqC,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE;QACrD,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAA;QAC9B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,EAAE,EAAC,IAAI,EAAE,YAAY,EAAC,CAAC,CAAA;QAEhF,MAAM,CAAC,MAAM,CAAC,GAAG,MAAM,KAAK,CAAC,WAAW,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;QAEhD,MAAM,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;QACpD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,WAAW,CAAC,CAAA;IACtE,CAAC,CAAC;IAEF,qBAAqB,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE;QACrC,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAA;QAC9B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,EAAE,EAAC,IAAI,EAAE,WAAW,EAAC,CAAC,CAAA;QAC/E,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAC3C,MAAM,OAAO,GAAG,EAAE,CAAA;QAClB,IAAI,KAAK,EAAE,MAAM,MAAM,IAAI,KAAK,CAAC,OAAO,EAAE;YACzC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAA;QAErB,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAA;IAC3D,CAAC,CAAC;IAEF,iCAAiC,EAAE,IAAI,CAAC,KAAK,IAAG,EAAE;QACjD,MAAM,KAAK,GAAG,IAAI,UAAU,EAAE,CAAA;QAC9B,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,EAAE,WAAW,EAAE,EAAC,IAAI,EAAE,WAAW,EAAC,CAAC,CAAA;QAC/E,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAA;QAE3C,MAAM,KAAK,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAA;QAE/B,MAAM,CAAC,MAAM,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAA;QACrD,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC,CAAA;IACpD,CAAC,CAAC;CACF,CAAC,CAAA"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import Quay from "../../../index.js";
|
|
2
1
|
import { Group } from "../../group.js";
|
|
2
|
+
import { Permissions } from "../../permissions.js";
|
|
3
3
|
import { Codex } from "../../aspects/codex/codex.js";
|
|
4
4
|
export class PlainGroup extends Group {
|
|
5
5
|
static config = () => {
|
|
@@ -23,7 +23,7 @@ export class PlainGroup extends Group {
|
|
|
23
23
|
renderLabel: item => item.id,
|
|
24
24
|
renderIcon: item => item.taxon.icon,
|
|
25
25
|
renderPreview: () => null,
|
|
26
|
-
permissions: item =>
|
|
26
|
+
permissions: item => Permissions.all,
|
|
27
27
|
};
|
|
28
28
|
};
|
|
29
29
|
constructor() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"group.js","sourceRoot":"","sources":["../../../../s/logic/presets/plain/group.ts"],"names":[],"mappings":"AACA,OAAO,
|
|
1
|
+
{"version":3,"file":"group.js","sourceRoot":"","sources":["../../../../s/logic/presets/plain/group.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,KAAK,EAAC,MAAM,gBAAgB,CAAA;AAEpC,OAAO,EAAC,WAAW,EAAC,MAAM,sBAAsB,CAAA;AAEhD,OAAO,EAAC,KAAK,EAAC,MAAM,8BAA8B,CAAA;AAElD,MAAM,OAAO,UAAW,SAAQ,KAAkB;IACjD,MAAM,CAAC,MAAM,GAAG,GAA6B,EAAE;QAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,KAAK,CAAc;YACtC,IAAI,EAAE,EAAC,IAAI,EAAE,IAAI,EAAC;SAClB,CAAC,CAAA;QAEF,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CACtB,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,EAAC,KAAK,EAAE,MAAM,EAAC,CAAC,CACrC,CAAA;QAED,OAAO;YACN,KAAK;YACL,IAAI;YACJ,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,IAAI,GAAG,EAA+B;iBAC3C,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YAClD,aAAa,EAAE,KAAK;YACpB,OAAO,EAAE,IAAI,GAAG,EAAE;iBAChB,GAAG,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC;YACxB,MAAM,EAAE,CAAC,KAAK,EAAE,IAAI,EAAE,EAAE;gBACvB,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CACzB,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;oBACxB,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CACtB,CAAC,CAAA;YACH,CAAC;YACD,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,EAAE;YAC5B,UAAU,EAAE,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI;YACnC,aAAa,EAAE,GAAG,EAAE,CAAC,IAAI;YACzB,WAAW,EAAE,IAAI,CAAC,EAAE,CAAC,WAAW,CAAC,GAAG;SACpC,CAAA;IACF,CAAC,CAAA;IAED;QACC,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAA;IAC3B,CAAC"}
|
package/x/logic/types.d.ts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
+
import { Content } from "@e280/sly";
|
|
1
2
|
import { Permission } from "./permissions.js";
|
|
2
3
|
import { Codex } from "./aspects/codex/codex.js";
|
|
3
4
|
import { Schema } from "./aspects/codex/parts/types.js";
|
|
4
5
|
import { CodexItem } from "./aspects/codex/parts/codex-item.js";
|
|
5
|
-
import { Content } from "@benev/slate";
|
|
6
6
|
export type SearchFn<Sc extends Schema> = (item: CodexItem<Sc>) => boolean;
|
|
7
7
|
export type SortFn<Sc extends Schema> = (a: CodexItem<Sc>, b: CodexItem<Sc>) => number;
|
|
8
8
|
export interface GroupConfig<Sc extends Schema> {
|
package/x/tests.test.js
CHANGED