@lapis-notes/bases 0.1.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/CHANGELOG.md +6 -0
- package/LICENSE.md +8 -0
- package/README.md +20 -0
- package/dist/bases-plugin.d.ts +10 -0
- package/dist/bases-plugin.js +118 -0
- package/dist/bases-view/app-database-query-source.d.ts +30 -0
- package/dist/bases-view/app-database-query-source.js +248 -0
- package/dist/bases-view/bases.svelte.d.ts +569 -0
- package/dist/bases-view/bases.svelte.js +910 -0
- package/dist/bases-view/card-view/components/card-placeholder.svelte +68 -0
- package/dist/bases-view/card-view/components/card-placeholder.svelte.d.ts +7 -0
- package/dist/bases-view/card-view/components/card.svelte +289 -0
- package/dist/bases-view/card-view/components/card.svelte.d.ts +7 -0
- package/dist/bases-view/card-view/index.d.ts +11 -0
- package/dist/bases-view/card-view/index.js +55 -0
- package/dist/bases-view/cell-editor-options.d.ts +2 -0
- package/dist/bases-view/cell-editor-options.js +26 -0
- package/dist/bases-view/cell-editor.svelte +206 -0
- package/dist/bases-view/cell-editor.svelte.d.ts +12 -0
- package/dist/bases-view/cell.svelte +132 -0
- package/dist/bases-view/cell.svelte.d.ts +16 -0
- package/dist/bases-view/column-definition.d.ts +22 -0
- package/dist/bases-view/column-definition.js +149 -0
- package/dist/bases-view/columns.d.ts +15 -0
- package/dist/bases-view/columns.js +103 -0
- package/dist/bases-view/components/Tag.svelte +14 -0
- package/dist/bases-view/components/Tag.svelte.d.ts +8 -0
- package/dist/bases-view/components/autocomplete.svelte +45 -0
- package/dist/bases-view/components/autocomplete.svelte.d.ts +17 -0
- package/dist/bases-view/components/card-image.svelte +121 -0
- package/dist/bases-view/components/card-image.svelte.d.ts +11 -0
- package/dist/bases-view/components/column-visibility.svelte +388 -0
- package/dist/bases-view/components/column-visibility.svelte.d.ts +13 -0
- package/dist/bases-view/components/datetime.svelte +35 -0
- package/dist/bases-view/components/datetime.svelte.d.ts +7 -0
- package/dist/bases-view/components/file.svelte +31 -0
- package/dist/bases-view/components/file.svelte.d.ts +8 -0
- package/dist/bases-view/components/filters/filter-editor.svelte +102 -0
- package/dist/bases-view/components/filters/filter-editor.svelte.d.ts +10 -0
- package/dist/bases-view/components/filters/filter-group.svelte +142 -0
- package/dist/bases-view/components/filters/filter-group.svelte.d.ts +11 -0
- package/dist/bases-view/components/filters/filter-properties.svelte +77 -0
- package/dist/bases-view/components/filters/filter-properties.svelte.d.ts +8 -0
- package/dist/bases-view/components/filters/filter-root.svelte +112 -0
- package/dist/bases-view/components/filters/filter-root.svelte.d.ts +12 -0
- package/dist/bases-view/components/filters/filter-row.svelte +351 -0
- package/dist/bases-view/components/filters/filter-row.svelte.d.ts +11 -0
- package/dist/bases-view/components/group/group-root.svelte +120 -0
- package/dist/bases-view/components/group/group-root.svelte.d.ts +8 -0
- package/dist/bases-view/components/limit.svelte +100 -0
- package/dist/bases-view/components/limit.svelte.d.ts +12 -0
- package/dist/bases-view/components/query-editor.svelte +230 -0
- package/dist/bases-view/components/query-editor.svelte.d.ts +15 -0
- package/dist/bases-view/components/sort/sort-direction-labels.d.ts +9 -0
- package/dist/bases-view/components/sort/sort-direction-labels.js +25 -0
- package/dist/bases-view/components/sort/sort-root.svelte +239 -0
- package/dist/bases-view/components/sort/sort-root.svelte.d.ts +11 -0
- package/dist/bases-view/components/sort/sort-row.svelte +190 -0
- package/dist/bases-view/components/sort/sort-row.svelte.d.ts +15 -0
- package/dist/bases-view/components/summary-strip.svelte +56 -0
- package/dist/bases-view/components/summary-strip.svelte.d.ts +8 -0
- package/dist/bases-view/components/tag-chip.svelte +47 -0
- package/dist/bases-view/components/tag-chip.svelte.d.ts +12 -0
- package/dist/bases-view/components/views.svelte +178 -0
- package/dist/bases-view/components/views.svelte.d.ts +12 -0
- package/dist/bases-view/data-table-adapter/data-table.svelte.d.ts +45 -0
- package/dist/bases-view/data-table-adapter/data-table.svelte.js +112 -0
- package/dist/bases-view/data-table-adapter/flex-render.svelte +43 -0
- package/dist/bases-view/data-table-adapter/flex-render.svelte.d.ts +30 -0
- package/dist/bases-view/data-table-adapter/index.d.ts +3 -0
- package/dist/bases-view/data-table-adapter/index.js +3 -0
- package/dist/bases-view/data-table-adapter/render-helpers.d.ts +101 -0
- package/dist/bases-view/data-table-adapter/render-helpers.js +110 -0
- package/dist/bases-view/db.d.ts +31 -0
- package/dist/bases-view/db.js +174 -0
- package/dist/bases-view/document-core.d.ts +2 -0
- package/dist/bases-view/document-core.js +166 -0
- package/dist/bases-view/export-core.d.ts +4 -0
- package/dist/bases-view/export-core.js +31 -0
- package/dist/bases-view/file-fields-core.d.ts +31 -0
- package/dist/bases-view/file-fields-core.js +114 -0
- package/dist/bases-view/filter-parser.d.ts +27 -0
- package/dist/bases-view/filter-parser.js +315 -0
- package/dist/bases-view/functions-core.d.ts +66 -0
- package/dist/bases-view/functions-core.js +265 -0
- package/dist/bases-view/functions.d.ts +5 -0
- package/dist/bases-view/functions.js +107 -0
- package/dist/bases-view/fuzzy-search.d.ts +6 -0
- package/dist/bases-view/fuzzy-search.js +15 -0
- package/dist/bases-view/hooks/useResizeObserver.svelte.d.ts +7 -0
- package/dist/bases-view/hooks/useResizeObserver.svelte.js +26 -0
- package/dist/bases-view/index.d.ts +66 -0
- package/dist/bases-view/index.js +231 -0
- package/dist/bases-view/list-view/index.d.ts +10 -0
- package/dist/bases-view/list-view/index.js +17 -0
- package/dist/bases-view/list-view/list.svelte +156 -0
- package/dist/bases-view/list-view/list.svelte.d.ts +7 -0
- package/dist/bases-view/map-view/index.d.ts +10 -0
- package/dist/bases-view/map-view/index.js +17 -0
- package/dist/bases-view/map-view/view.svelte +28 -0
- package/dist/bases-view/map-view/view.svelte.d.ts +7 -0
- package/dist/bases-view/metadata-invalidation-core.d.ts +34 -0
- package/dist/bases-view/metadata-invalidation-core.js +162 -0
- package/dist/bases-view/metadata-type-info.d.ts +7 -0
- package/dist/bases-view/metadata-type-info.js +10 -0
- package/dist/bases-view/models.d.ts +90 -0
- package/dist/bases-view/models.js +133 -0
- package/dist/bases-view/query-result-core.d.ts +8 -0
- package/dist/bases-view/query-result-core.js +16 -0
- package/dist/bases-view/resource-url.d.ts +2 -0
- package/dist/bases-view/resource-url.js +21 -0
- package/dist/bases-view/search-core.d.ts +9 -0
- package/dist/bases-view/search-core.js +20 -0
- package/dist/bases-view/summary-core.d.ts +7 -0
- package/dist/bases-view/summary-core.js +17 -0
- package/dist/bases-view/table-view/components/div-table.svelte +464 -0
- package/dist/bases-view/table-view/components/div-table.svelte.d.ts +32 -0
- package/dist/bases-view/table-view/components/dnd-style.d.ts +3 -0
- package/dist/bases-view/table-view/components/dnd-style.js +6 -0
- package/dist/bases-view/table-view/components/sort-header.svelte +48 -0
- package/dist/bases-view/table-view/components/sort-header.svelte.d.ts +11 -0
- package/dist/bases-view/table-view/components/table-column-tracks.d.ts +14 -0
- package/dist/bases-view/table-view/components/table-column-tracks.js +27 -0
- package/dist/bases-view/table-view/components/table-header.svelte +146 -0
- package/dist/bases-view/table-view/components/table-header.svelte.d.ts +10 -0
- package/dist/bases-view/table-view/components/table-placeholder.svelte +46 -0
- package/dist/bases-view/table-view/components/table-placeholder.svelte.d.ts +30 -0
- package/dist/bases-view/table-view/components/table-virtualizer-core.d.ts +13 -0
- package/dist/bases-view/table-view/components/table-virtualizer-core.js +12 -0
- package/dist/bases-view/table-view/components/table.svelte +997 -0
- package/dist/bases-view/table-view/components/table.svelte.d.ts +32 -0
- package/dist/bases-view/table-view/index.svelte.d.ts +10 -0
- package/dist/bases-view/table-view/index.svelte.js +30 -0
- package/dist/bases-view/unknown-view/index.d.ts +10 -0
- package/dist/bases-view/unknown-view/index.js +19 -0
- package/dist/bases-view/unknown-view/view.svelte +11 -0
- package/dist/bases-view/unknown-view/view.svelte.d.ts +6 -0
- package/dist/bases-view/view-header.svelte +142 -0
- package/dist/bases-view/view-header.svelte.d.ts +28 -0
- package/dist/bases-view/view-registration-inventory.d.ts +22 -0
- package/dist/bases-view/view-registration-inventory.js +7 -0
- package/dist/bases-view/view-settings.svelte +350 -0
- package/dist/bases-view/view-settings.svelte.d.ts +9 -0
- package/dist/bases-view/view.svelte +192 -0
- package/dist/bases-view/view.svelte.d.ts +15 -0
- package/dist/bases-view-surface.svelte +31 -0
- package/dist/bases-view-surface.svelte.d.ts +14 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.js +8 -0
- package/dist/serialized-write-queue.d.ts +10 -0
- package/dist/serialized-write-queue.js +36 -0
- package/dist/styles.css +2164 -0
- package/manifest.json +33 -0
- package/package.json +90 -0
- package/styles.css +1 -0
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { App, MetadataType } from "@lapis-notes/api";
|
|
2
|
+
type MetadataTypeInfo = {
|
|
3
|
+
type: MetadataType;
|
|
4
|
+
icon: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function getMetadataTypeInfo(key: string, fallbackType?: MetadataType, app?: Pick<App, "metadataTypeManager">): MetadataTypeInfo;
|
|
7
|
+
export {};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export function getMetadataTypeInfo(key, fallbackType = "text", app) {
|
|
2
|
+
const metadataTypeManager = app?.metadataTypeManager;
|
|
3
|
+
const type = metadataTypeManager?.properties?.[key]?.type ?? fallbackType;
|
|
4
|
+
const icon = metadataTypeManager?.registeredTypeWidgets?.[type ?? ""]?.icon ??
|
|
5
|
+
"lucide-file";
|
|
6
|
+
return {
|
|
7
|
+
type,
|
|
8
|
+
icon,
|
|
9
|
+
};
|
|
10
|
+
}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import type { MetadataType } from "@lapis-notes/api";
|
|
2
|
+
import type { BasesPropertyId } from "@lapis-notes/api";
|
|
3
|
+
import type { ColumnDefinition } from "./columns";
|
|
4
|
+
export type SortColumn = {
|
|
5
|
+
property: BasesPropertyId;
|
|
6
|
+
direction: "ASC" | "DESC";
|
|
7
|
+
};
|
|
8
|
+
export type FilterLine = {
|
|
9
|
+
column: string;
|
|
10
|
+
op: string;
|
|
11
|
+
value: string | Array<string>;
|
|
12
|
+
custom?: string | null;
|
|
13
|
+
};
|
|
14
|
+
export type Filters = {
|
|
15
|
+
and: Array<Filters | FilterLine | string>;
|
|
16
|
+
} | {
|
|
17
|
+
or: Array<Filters | FilterLine | string>;
|
|
18
|
+
} | {
|
|
19
|
+
not: Array<Filters | FilterLine | string>;
|
|
20
|
+
};
|
|
21
|
+
export declare function filterGroupType(filter: Filters): "and" | "or" | "not" | "";
|
|
22
|
+
export declare function filterGroupValues(filter: Filters): Array<Filters | FilterLine | string>;
|
|
23
|
+
export declare function filterCount(filter: Filters): number;
|
|
24
|
+
export declare const filterLabels: Partial<Record<MetadataType, Array<{
|
|
25
|
+
label: string;
|
|
26
|
+
value: string;
|
|
27
|
+
type: string;
|
|
28
|
+
}>>>;
|
|
29
|
+
export declare function filterTypeFor(column: ColumnDefinition | null | undefined): Array<{
|
|
30
|
+
label: string;
|
|
31
|
+
value: string;
|
|
32
|
+
type: string;
|
|
33
|
+
}>;
|
|
34
|
+
export declare function filterLineFor(column: ColumnDefinition | null | undefined, value?: string): FilterLine;
|
|
35
|
+
export declare function isFilterGroup(obj: unknown): obj is Filters;
|
|
36
|
+
export declare function isFilterLine(obj: unknown): obj is FilterLine;
|
|
37
|
+
export interface BasesViewBase {
|
|
38
|
+
name: string;
|
|
39
|
+
order: Array<string>;
|
|
40
|
+
sort: Array<SortColumn>;
|
|
41
|
+
groupBy?: SortColumn;
|
|
42
|
+
summaries?: Record<string, string>;
|
|
43
|
+
limit: number | null;
|
|
44
|
+
filter: Filters;
|
|
45
|
+
type: string;
|
|
46
|
+
[key: string]: unknown;
|
|
47
|
+
}
|
|
48
|
+
export interface BasesView<T extends keyof BasesViewMap = keyof BasesViewMap> extends BasesViewBase {
|
|
49
|
+
type: T;
|
|
50
|
+
}
|
|
51
|
+
export interface BasesViewMap {
|
|
52
|
+
table: TableView;
|
|
53
|
+
cards: CardsView;
|
|
54
|
+
list: ListView;
|
|
55
|
+
map: MapView;
|
|
56
|
+
}
|
|
57
|
+
export type BasesViewType = keyof BasesViewMap;
|
|
58
|
+
export interface TableView extends BasesView<"table"> {
|
|
59
|
+
columnSize: Record<string, number>;
|
|
60
|
+
layout: "table" | "cards";
|
|
61
|
+
rowHeight?: "short" | "medium" | "tall" | "extra";
|
|
62
|
+
cardSize?: number;
|
|
63
|
+
image?: string;
|
|
64
|
+
imageFit?: "contain" | "cover";
|
|
65
|
+
imageAspectRatio: number;
|
|
66
|
+
}
|
|
67
|
+
export interface ListView extends BasesView<"list"> {
|
|
68
|
+
}
|
|
69
|
+
export interface CardsView extends BasesView<"cards"> {
|
|
70
|
+
cardSize?: number;
|
|
71
|
+
image?: string;
|
|
72
|
+
imageFit?: "contain" | "cover";
|
|
73
|
+
imageAspectRatio: number;
|
|
74
|
+
}
|
|
75
|
+
export interface MapView extends BasesView<"map"> {
|
|
76
|
+
}
|
|
77
|
+
export interface CustomBasesView extends BasesViewBase {
|
|
78
|
+
type: string;
|
|
79
|
+
}
|
|
80
|
+
export type AnyBasesView = BasesViewMap[keyof BasesViewMap] | CustomBasesView;
|
|
81
|
+
export type BasesDocument = {
|
|
82
|
+
filters: Filters;
|
|
83
|
+
properties?: Record<string, {
|
|
84
|
+
displayName: string;
|
|
85
|
+
}>;
|
|
86
|
+
formulas?: Record<string, string>;
|
|
87
|
+
summaries?: Record<string, string>;
|
|
88
|
+
activeView: string;
|
|
89
|
+
views: Array<AnyBasesView>;
|
|
90
|
+
};
|
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
import { toSQL } from "./filter-parser";
|
|
2
|
+
export function filterGroupType(filter) {
|
|
3
|
+
if (!filter)
|
|
4
|
+
return "";
|
|
5
|
+
if ("or" in filter)
|
|
6
|
+
return "or";
|
|
7
|
+
if ("not" in filter)
|
|
8
|
+
return "not";
|
|
9
|
+
if ("and" in filter)
|
|
10
|
+
return "and";
|
|
11
|
+
return "";
|
|
12
|
+
}
|
|
13
|
+
export function filterGroupValues(filter) {
|
|
14
|
+
if (!filter)
|
|
15
|
+
return [];
|
|
16
|
+
if ("and" in filter)
|
|
17
|
+
return filter.and;
|
|
18
|
+
if ("or" in filter)
|
|
19
|
+
return filter.or;
|
|
20
|
+
if ("not" in filter)
|
|
21
|
+
return filter.not;
|
|
22
|
+
return [];
|
|
23
|
+
}
|
|
24
|
+
export function filterCount(filter) {
|
|
25
|
+
let count = 0;
|
|
26
|
+
for (const predicate of filterGroupValues(filter)) {
|
|
27
|
+
if (typeof predicate === "string" && predicate.length) {
|
|
28
|
+
count += 1;
|
|
29
|
+
}
|
|
30
|
+
else if (isFilterLine(predicate)) {
|
|
31
|
+
count += 1;
|
|
32
|
+
}
|
|
33
|
+
else if (isFilterGroup(predicate)) {
|
|
34
|
+
count += filterCount(predicate);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return count;
|
|
38
|
+
}
|
|
39
|
+
export const filterLabels = {
|
|
40
|
+
datetime: [
|
|
41
|
+
{ label: "on", value: "=", type: "datetime" },
|
|
42
|
+
{ label: "not on", value: "!=", type: "datetime" },
|
|
43
|
+
{ label: "before", value: "<", type: "datetime" },
|
|
44
|
+
{ label: "on or before", value: "<=", type: "datetime" },
|
|
45
|
+
{ label: "after", value: ">", type: "datetime" },
|
|
46
|
+
{ label: "on or after", value: ">=", type: "datetime" },
|
|
47
|
+
{ label: "is empty", value: "isEmpty", type: "none" },
|
|
48
|
+
{ label: "is not empty", value: "!isEmpty", type: "none" },
|
|
49
|
+
],
|
|
50
|
+
checkbox: [
|
|
51
|
+
{ label: "is", value: "=", type: "checkbox" },
|
|
52
|
+
{ label: "is not", value: "!=", type: "checkbox" },
|
|
53
|
+
],
|
|
54
|
+
number: [
|
|
55
|
+
{ label: "=", value: "=", type: "number" },
|
|
56
|
+
{ label: "≠", value: "!=", type: "number" },
|
|
57
|
+
{ label: "<", value: "<", type: "number" },
|
|
58
|
+
{ label: "≤", value: "<=", type: "number" },
|
|
59
|
+
{ label: ">", value: ">", type: "number" },
|
|
60
|
+
{ label: "≥", value: ">=", type: "number" },
|
|
61
|
+
{ label: "is empty", value: "isEmpty", type: "none" },
|
|
62
|
+
{ label: "is not empty", value: "!isEmpty", type: "none" },
|
|
63
|
+
],
|
|
64
|
+
text: [
|
|
65
|
+
{ label: "is", value: "=", type: "text" },
|
|
66
|
+
{ label: "is not", value: "!=", type: "text" },
|
|
67
|
+
{ label: "starts with", value: "startsWith", type: "text" },
|
|
68
|
+
{ label: "ends with", value: "endsWith", type: "text" },
|
|
69
|
+
{ label: "is empty", value: "isEmpty", type: "none" },
|
|
70
|
+
{ label: "contains", value: "contains", type: "text" },
|
|
71
|
+
{ label: "contains any of", value: "containsAnyOf", type: "multitext" },
|
|
72
|
+
{ label: "contains all of", value: "containsAllOf", type: "multitext" },
|
|
73
|
+
{ label: "does not start with", value: "!startsWith", type: "text" },
|
|
74
|
+
{ label: "does not end with", value: "!endsWith", type: "text" },
|
|
75
|
+
{ label: "is not empty", value: "!isEmpty", type: "none" },
|
|
76
|
+
{ label: "does not contain", value: "!contains", type: "text" },
|
|
77
|
+
{
|
|
78
|
+
label: "does not contain any of",
|
|
79
|
+
value: "!containsAnyOf",
|
|
80
|
+
type: "multitext",
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
label: "does not contain all of",
|
|
84
|
+
value: "!containsAllOf",
|
|
85
|
+
type: "multitext",
|
|
86
|
+
},
|
|
87
|
+
],
|
|
88
|
+
file: [
|
|
89
|
+
{ label: "links to", value: "hasLink", type: "file" },
|
|
90
|
+
{ label: "in folder", value: "inFolder", type: "folder" },
|
|
91
|
+
{ label: "has tag", value: "hasTag", type: "tags" },
|
|
92
|
+
{ label: "has property", value: "hasProperty", type: "properties" },
|
|
93
|
+
{ label: "does not link to", value: "!hasLink", type: "file" },
|
|
94
|
+
{ label: "is not in folder", value: "!inFolder", type: "folder" },
|
|
95
|
+
{ label: "does not have tag", value: "!hasTag", type: "tags" },
|
|
96
|
+
{
|
|
97
|
+
label: "does not have property",
|
|
98
|
+
value: "!hasProperty",
|
|
99
|
+
type: "properties",
|
|
100
|
+
},
|
|
101
|
+
],
|
|
102
|
+
unknown: [
|
|
103
|
+
{ label: "is", value: "=", type: "any" },
|
|
104
|
+
{ label: "is not", value: "!=", type: "any" },
|
|
105
|
+
{ label: "is truthy", value: "isTruthy", type: "none" },
|
|
106
|
+
{ label: "is not truthy", value: "!isTruthy", type: "none" },
|
|
107
|
+
{ label: "is empty", value: "isEmpty", type: "none" },
|
|
108
|
+
{ label: "is not empty", value: "!isEmpty", type: "none" },
|
|
109
|
+
],
|
|
110
|
+
};
|
|
111
|
+
export function filterTypeFor(column) {
|
|
112
|
+
const type = column?.type ?? "unknown";
|
|
113
|
+
return filterLabels[type] ?? filterLabels["unknown"] ?? [];
|
|
114
|
+
}
|
|
115
|
+
export function filterLineFor(column, value = "") {
|
|
116
|
+
const filterTypes = filterTypeFor(column);
|
|
117
|
+
return {
|
|
118
|
+
column: column?.id || "",
|
|
119
|
+
op: filterTypes[0].value || "",
|
|
120
|
+
value,
|
|
121
|
+
};
|
|
122
|
+
}
|
|
123
|
+
export function isFilterGroup(obj) {
|
|
124
|
+
if (typeof obj !== "object" || obj === null)
|
|
125
|
+
return false;
|
|
126
|
+
const keys = Object.keys(obj);
|
|
127
|
+
return keys.length === 1 && ["and", "or", "not"].includes(keys[0]);
|
|
128
|
+
}
|
|
129
|
+
export function isFilterLine(obj) {
|
|
130
|
+
if (typeof obj !== "object" || obj === null || obj === undefined)
|
|
131
|
+
return false;
|
|
132
|
+
return "column" in obj && "op" in obj;
|
|
133
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type GroupableEntry<TPropertyId extends string, TValue> = {
|
|
2
|
+
getValue(propertyId: TPropertyId): TValue | null;
|
|
3
|
+
};
|
|
4
|
+
export type GroupedEntries<TEntry, TValue> = {
|
|
5
|
+
entries: TEntry[];
|
|
6
|
+
key: TValue | null;
|
|
7
|
+
};
|
|
8
|
+
export declare function groupEntries<TPropertyId extends string, TValue, TEntry extends GroupableEntry<TPropertyId, TValue>>(entries: TEntry[], groupBy?: TPropertyId | null, equals?: (a: TValue | null, b: TValue | null) => boolean): GroupedEntries<TEntry, TValue>[];
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function groupEntries(entries, groupBy, equals = Object.is) {
|
|
2
|
+
if (!groupBy) {
|
|
3
|
+
return [{ entries, key: null }];
|
|
4
|
+
}
|
|
5
|
+
const groups = [];
|
|
6
|
+
for (const entry of entries) {
|
|
7
|
+
const key = entry.getValue(groupBy) ?? null;
|
|
8
|
+
let group = groups.find((candidate) => equals(candidate.key, key));
|
|
9
|
+
if (!group) {
|
|
10
|
+
group = { entries: [], key };
|
|
11
|
+
groups.push(group);
|
|
12
|
+
}
|
|
13
|
+
group.entries.push(entry);
|
|
14
|
+
}
|
|
15
|
+
return groups;
|
|
16
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
export function loadBasesResourceUrl(app, file, onReady) {
|
|
2
|
+
let disposed = false;
|
|
3
|
+
let currentUrl = "";
|
|
4
|
+
void app.vault
|
|
5
|
+
.getResourceUrl(file)
|
|
6
|
+
.then((url) => {
|
|
7
|
+
if (disposed) {
|
|
8
|
+
app.vault.revokeResourceUrl(url);
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
currentUrl = url;
|
|
12
|
+
onReady(url);
|
|
13
|
+
})
|
|
14
|
+
.catch(() => { });
|
|
15
|
+
return () => {
|
|
16
|
+
disposed = true;
|
|
17
|
+
if (currentUrl) {
|
|
18
|
+
app.vault.revokeResourceUrl(currentUrl);
|
|
19
|
+
}
|
|
20
|
+
};
|
|
21
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
type SearchValue = {
|
|
2
|
+
toString(): string;
|
|
3
|
+
};
|
|
4
|
+
type SearchEntry<TPropertyId extends string = string> = {
|
|
5
|
+
getValue(propertyId: TPropertyId): SearchValue | null;
|
|
6
|
+
};
|
|
7
|
+
export declare function matchesSearch<TPropertyId extends string, TEntry extends SearchEntry<TPropertyId>>(entry: TEntry, properties: TPropertyId[], query: string): boolean;
|
|
8
|
+
export declare function filterEntriesBySearch<TPropertyId extends string, TEntry extends SearchEntry<TPropertyId>>(entries: TEntry[], properties: TPropertyId[], query: string): TEntry[];
|
|
9
|
+
export {};
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
function normalizeQuery(query) {
|
|
2
|
+
return query.trim().toLocaleLowerCase();
|
|
3
|
+
}
|
|
4
|
+
export function matchesSearch(entry, properties, query) {
|
|
5
|
+
const normalizedQuery = normalizeQuery(query);
|
|
6
|
+
if (!normalizedQuery)
|
|
7
|
+
return true;
|
|
8
|
+
return properties.some((propertyId) => {
|
|
9
|
+
const value = entry.getValue(propertyId);
|
|
10
|
+
return value
|
|
11
|
+
? value.toString().toLocaleLowerCase().includes(normalizedQuery)
|
|
12
|
+
: false;
|
|
13
|
+
});
|
|
14
|
+
}
|
|
15
|
+
export function filterEntriesBySearch(entries, properties, query) {
|
|
16
|
+
const normalizedQuery = normalizeQuery(query);
|
|
17
|
+
if (!normalizedQuery)
|
|
18
|
+
return entries;
|
|
19
|
+
return entries.filter((entry) => matchesSearch(entry, properties, normalizedQuery));
|
|
20
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export type SummaryConfig = Record<string, string> | undefined;
|
|
2
|
+
export type ConfiguredSummary = {
|
|
3
|
+
propertyId: string;
|
|
4
|
+
summaryKey: string;
|
|
5
|
+
};
|
|
6
|
+
export declare function resolveConfiguredSummaries(order: string[], baseSummaries?: SummaryConfig, viewSummaries?: SummaryConfig): ConfiguredSummary[];
|
|
7
|
+
export declare function formatSummaryLabel(summaryKey: string): string;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export function resolveConfiguredSummaries(order, baseSummaries, viewSummaries) {
|
|
2
|
+
const merged = {
|
|
3
|
+
...(baseSummaries ?? {}),
|
|
4
|
+
...(viewSummaries ?? {}),
|
|
5
|
+
};
|
|
6
|
+
return order.flatMap((propertyId) => {
|
|
7
|
+
const summaryKey = merged[propertyId];
|
|
8
|
+
return summaryKey ? [{ propertyId, summaryKey }] : [];
|
|
9
|
+
});
|
|
10
|
+
}
|
|
11
|
+
export function formatSummaryLabel(summaryKey) {
|
|
12
|
+
if (!summaryKey)
|
|
13
|
+
return "";
|
|
14
|
+
return summaryKey
|
|
15
|
+
.replaceAll(/[-_]+/g, " ")
|
|
16
|
+
.replace(/\b\w/g, (character) => character.toUpperCase());
|
|
17
|
+
}
|