@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,142 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import * as Select from "@lapismd/design-core/shadcn/select";
|
|
3
|
+
import {
|
|
4
|
+
filterGroupType,
|
|
5
|
+
filterGroupValues,
|
|
6
|
+
isFilterGroup,
|
|
7
|
+
isFilterLine,
|
|
8
|
+
type Filters,
|
|
9
|
+
} from "../..";
|
|
10
|
+
import FilterRow from "./filter-row.svelte";
|
|
11
|
+
import { Button } from "@lapismd/design-core/shadcn/button";
|
|
12
|
+
import PlusIcon from "@lucide/svelte/icons/plus";
|
|
13
|
+
import Self from "./filter-group.svelte";
|
|
14
|
+
import { cn } from "@lapis-notes/api";
|
|
15
|
+
import Trash from "@lucide/svelte/icons/trash-2";
|
|
16
|
+
import type { QueryController } from "../../bases.svelte";
|
|
17
|
+
|
|
18
|
+
let {
|
|
19
|
+
filter = $bindable(),
|
|
20
|
+
controller,
|
|
21
|
+
class: className,
|
|
22
|
+
deleteFilterGroup,
|
|
23
|
+
}: {
|
|
24
|
+
filter: Filters;
|
|
25
|
+
controller: QueryController;
|
|
26
|
+
class?: string;
|
|
27
|
+
deleteFilterGroup?: () => void;
|
|
28
|
+
} = $props();
|
|
29
|
+
const filterTypes = [
|
|
30
|
+
{ label: "All of the following are true", value: "and" },
|
|
31
|
+
{ label: "Any of the following are true", value: "or" },
|
|
32
|
+
{ label: "None of the following are true", value: "not" },
|
|
33
|
+
];
|
|
34
|
+
let filterType = $derived(filterGroupType(filter));
|
|
35
|
+
let filterValues = $derived(filterGroupValues(filter));
|
|
36
|
+
let empty: string = $state("");
|
|
37
|
+
|
|
38
|
+
$effect(() => {
|
|
39
|
+
if (!filterValues.length && empty) {
|
|
40
|
+
filterValues.push(empty);
|
|
41
|
+
empty = "";
|
|
42
|
+
}
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const triggerContent = $derived(
|
|
46
|
+
filterTypes.find((f) => f.value === filterType)?.label ??
|
|
47
|
+
"Select a filter type",
|
|
48
|
+
);
|
|
49
|
+
|
|
50
|
+
function addFilter() {
|
|
51
|
+
if (!filterValues.length) {
|
|
52
|
+
filterValues.push(empty);
|
|
53
|
+
empty = "";
|
|
54
|
+
}
|
|
55
|
+
filterValues.push("");
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function addGroup() {
|
|
59
|
+
filterValues.push({ and: [""] });
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
function deleteFilter(index: number) {
|
|
63
|
+
filterValues.splice(index, 1);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
function getFilterType() {
|
|
67
|
+
return filterType;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
function setFilterType(newValue: string) {
|
|
71
|
+
(filter as any) = { [newValue]: filterValues };
|
|
72
|
+
}
|
|
73
|
+
</script>
|
|
74
|
+
|
|
75
|
+
<div class={cn("filter-group", className)}>
|
|
76
|
+
<div class="filter-group-header bases-style-flex-60fbb7 bases-style-items-center-3960ff bases-style-justify-between-8ef226">
|
|
77
|
+
<Select.Root type="single" bind:value={getFilterType, setFilterType}>
|
|
78
|
+
<Select.Trigger data-bases-filter-control="group-type-trigger">
|
|
79
|
+
{triggerContent}
|
|
80
|
+
</Select.Trigger>
|
|
81
|
+
<Select.Content
|
|
82
|
+
align="start"
|
|
83
|
+
data-bases-filter-control="group-type-content"
|
|
84
|
+
>
|
|
85
|
+
<Select.Group>
|
|
86
|
+
{#each filterTypes as filterType (filterType.value)}
|
|
87
|
+
<Select.Item value={filterType.value} label={filterType.label}
|
|
88
|
+
>{filterType.label}</Select.Item
|
|
89
|
+
>
|
|
90
|
+
{/each}
|
|
91
|
+
</Select.Group>
|
|
92
|
+
</Select.Content>
|
|
93
|
+
</Select.Root>
|
|
94
|
+
{#if deleteFilterGroup}
|
|
95
|
+
<Button
|
|
96
|
+
variant="ghost"
|
|
97
|
+
size="sm"
|
|
98
|
+
class="bases-style-h-8-ed8a5d bases-style-rounded-none-0c5e91 bases-style-rounded-r-md-d4eb07 bases-style-border-none-4a5f0e bases-style-shadow-none-ad47d1 bases-style-outline-none-df37b1"
|
|
99
|
+
onclick={() => deleteFilterGroup?.()}
|
|
100
|
+
>
|
|
101
|
+
<Trash />
|
|
102
|
+
</Button>
|
|
103
|
+
{/if}
|
|
104
|
+
</div>
|
|
105
|
+
<div class="filter-group-statements bases-style-grid-f3c543 bases-style-gap-2-77a2a2 bases-style-pt-1-6b7d6e">
|
|
106
|
+
{#if !filterValues.length}
|
|
107
|
+
<FilterRow
|
|
108
|
+
label="where"
|
|
109
|
+
{controller}
|
|
110
|
+
bind:value={empty}
|
|
111
|
+
deleteFilter={() => {
|
|
112
|
+
empty = "";
|
|
113
|
+
}}
|
|
114
|
+
/>
|
|
115
|
+
{/if}
|
|
116
|
+
{#each filterValues as predicate, i}
|
|
117
|
+
{#if typeof predicate === "string" || isFilterLine(predicate)}
|
|
118
|
+
<FilterRow
|
|
119
|
+
label={i === 0 ? "where" : filterType}
|
|
120
|
+
{controller}
|
|
121
|
+
bind:value={filterValues[i] as any}
|
|
122
|
+
deleteFilter={() => deleteFilter(i)}
|
|
123
|
+
/>
|
|
124
|
+
{:else if isFilterGroup(predicate)}
|
|
125
|
+
<Self
|
|
126
|
+
bind:filter={filterValues[i] as Filters}
|
|
127
|
+
{controller}
|
|
128
|
+
class={cn("bases-style-bg-accent-40-fb8b4c bases-style-m-2-e9a778 bases-style-rounded-sm-36d446 border bases-style-p-2-7660b4")}
|
|
129
|
+
deleteFilterGroup={() => deleteFilter(i)}
|
|
130
|
+
/>
|
|
131
|
+
{/if}
|
|
132
|
+
{/each}
|
|
133
|
+
</div>
|
|
134
|
+
<div class="filter-group-actions bases-style-mt-2-50d0d2">
|
|
135
|
+
<Button size="sm" variant="ghost" onclick={(evt) => addFilter()}>
|
|
136
|
+
<PlusIcon /> Add Filter
|
|
137
|
+
</Button>
|
|
138
|
+
<Button size="sm" variant="ghost" onclick={(evt) => addGroup()}>
|
|
139
|
+
<PlusIcon /> Add Filter Group
|
|
140
|
+
</Button>
|
|
141
|
+
</div>
|
|
142
|
+
</div>
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { type Filters } from "../..";
|
|
2
|
+
import type { QueryController } from "../../bases.svelte";
|
|
3
|
+
type $$ComponentProps = {
|
|
4
|
+
filter: Filters;
|
|
5
|
+
controller: QueryController;
|
|
6
|
+
class?: string;
|
|
7
|
+
deleteFilterGroup?: () => void;
|
|
8
|
+
};
|
|
9
|
+
declare const FilterGroup: import("svelte").Component<$$ComponentProps, {}, "filter">;
|
|
10
|
+
type FilterGroup = ReturnType<typeof FilterGroup>;
|
|
11
|
+
export default FilterGroup;
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import * as Popover from "@lapismd/design-core/shadcn/popover";
|
|
3
|
+
import { Button } from "@lapismd/design-core/shadcn/button";
|
|
4
|
+
import * as Command from "@lapismd/design-core/shadcn/command";
|
|
5
|
+
import { cn } from "@lapis-notes/api";
|
|
6
|
+
import { Icon } from "@lapis-notes/api/icon";
|
|
7
|
+
import ArrowUpDown from "@lucide/svelte/icons/chevrons-up-down";
|
|
8
|
+
import CheckIcon from "@lucide/svelte/icons/check";
|
|
9
|
+
import type { QueryController } from "../../bases.svelte";
|
|
10
|
+
|
|
11
|
+
let {
|
|
12
|
+
controller,
|
|
13
|
+
value = $bindable(),
|
|
14
|
+
}: { value: any; controller: QueryController } = $props();
|
|
15
|
+
|
|
16
|
+
let col = $derived(determineColumn(value));
|
|
17
|
+
let isOpen: boolean = $derived(false);
|
|
18
|
+
|
|
19
|
+
function determineColumn(id: string) {
|
|
20
|
+
const column = controller.getAllColumns().find((it) => it.id === id);
|
|
21
|
+
if (!column) {
|
|
22
|
+
return { name: id, icon: "lucide-info" };
|
|
23
|
+
}
|
|
24
|
+
return {
|
|
25
|
+
name: column.displayName ?? id,
|
|
26
|
+
icon: column.icon ?? "lucide-info",
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
</script>
|
|
30
|
+
|
|
31
|
+
<Popover.Root bind:open={isOpen}>
|
|
32
|
+
<Popover.Trigger class="">
|
|
33
|
+
{#snippet child({ props }: { props: Record<string, any> })}
|
|
34
|
+
<Button
|
|
35
|
+
{...props}
|
|
36
|
+
variant="outline"
|
|
37
|
+
size="sm"
|
|
38
|
+
class="bases-style-flex-60fbb7 bases-style-h-8-ed8a5d grow bases-style-justify-between-8ef226 bases-style-rounded-none-0c5e91 bases-style-rounded-l-md-9b2e91 bases-style-border-none-4a5f0e bases-style-shadow-none-ad47d1 bases-style-outline-none-df37b1"
|
|
39
|
+
>
|
|
40
|
+
<span class="bases-style-flex-60fbb7 bases-style-h-full-668b21 bases-style-w-full-6da6a3 bases-style-items-center-3960ff">
|
|
41
|
+
<Icon name={col.icon} class="bases-style-mr-1-618162" />
|
|
42
|
+
{col.name}
|
|
43
|
+
</span>
|
|
44
|
+
<ArrowUpDown />
|
|
45
|
+
</Button>
|
|
46
|
+
{/snippet}
|
|
47
|
+
</Popover.Trigger>
|
|
48
|
+
<Popover.Content class="bases-style-w-310px-8357f2 bases-style-p-0-8a539c" align="start">
|
|
49
|
+
<Command.Root>
|
|
50
|
+
<Command.Input placeholder="Find or create" />
|
|
51
|
+
<Command.List class="bases-style-p-1-eb6a3c">
|
|
52
|
+
<Command.Empty>No results found.</Command.Empty>
|
|
53
|
+
{#each controller
|
|
54
|
+
.getAllColumns()
|
|
55
|
+
.filter((col) => col.id.startsWith("note.")) as column (column.id)}
|
|
56
|
+
<Command.Item
|
|
57
|
+
onSelect={() => {
|
|
58
|
+
value = column.id;
|
|
59
|
+
isOpen = false;
|
|
60
|
+
}}
|
|
61
|
+
>
|
|
62
|
+
<div
|
|
63
|
+
class={cn(
|
|
64
|
+
"bases-style-mr-2-d2347e bases-style-flex-60fbb7 bases-style-size-4-f7b5fa bases-style-items-center-3960ff bases-style-justify-center-86843c",
|
|
65
|
+
value === column.id ? "" : "bases-style-opacity-50-0b8c50 [&_svg]:invisible",
|
|
66
|
+
)}
|
|
67
|
+
>
|
|
68
|
+
<CheckIcon class="bases-style-size-4-f7b5fa" />
|
|
69
|
+
</div>
|
|
70
|
+
<Icon name={[column.icon ?? "lucide-info"]} />
|
|
71
|
+
<span>{column.displayName}</span>
|
|
72
|
+
</Command.Item>
|
|
73
|
+
{/each}
|
|
74
|
+
</Command.List>
|
|
75
|
+
</Command.Root>
|
|
76
|
+
</Popover.Content>
|
|
77
|
+
</Popover.Root>
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { QueryController } from "../../bases.svelte";
|
|
2
|
+
type $$ComponentProps = {
|
|
3
|
+
value: any;
|
|
4
|
+
controller: QueryController;
|
|
5
|
+
};
|
|
6
|
+
declare const FilterProperties: import("svelte").Component<$$ComponentProps, {}, "value">;
|
|
7
|
+
type FilterProperties = ReturnType<typeof FilterProperties>;
|
|
8
|
+
export default FilterProperties;
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
<script lang="ts">
|
|
2
|
+
import * as Popover from "@lapismd/design-core/shadcn/popover";
|
|
3
|
+
import LucideListFilter from "@lucide/svelte/icons/list-filter";
|
|
4
|
+
import * as Accordion from "@lapismd/design-core/shadcn/accordion";
|
|
5
|
+
import { ScrollArea } from "@lapismd/design-core/shadcn/scroll-area";
|
|
6
|
+
import { Button } from "@lapismd/design-core/shadcn/button";
|
|
7
|
+
import { Badge } from "@lapismd/design-core/shadcn/badge";
|
|
8
|
+
import FilterGroupComponent from "./filter-group.svelte";
|
|
9
|
+
import { filterCount, type Filters } from "../..";
|
|
10
|
+
import { cn } from "@lapis-notes/api";
|
|
11
|
+
import type { QueryController } from "../../bases.svelte";
|
|
12
|
+
|
|
13
|
+
let {
|
|
14
|
+
table,
|
|
15
|
+
controller = table as QueryController,
|
|
16
|
+
currentFilter = $bindable(),
|
|
17
|
+
globalFilter = $bindable(),
|
|
18
|
+
class: className,
|
|
19
|
+
}: {
|
|
20
|
+
controller?: QueryController;
|
|
21
|
+
table?: any;
|
|
22
|
+
globalFilter: Filters;
|
|
23
|
+
currentFilter: Filters;
|
|
24
|
+
class?: string;
|
|
25
|
+
} = $props();
|
|
26
|
+
|
|
27
|
+
let globalCount = $derived(filterCount(globalFilter));
|
|
28
|
+
let currentCount = $derived(filterCount(currentFilter));
|
|
29
|
+
let totalCount = $derived(globalCount + currentCount);
|
|
30
|
+
let defaultOpenSection = $derived(
|
|
31
|
+
currentCount > 0
|
|
32
|
+
? "this-view"
|
|
33
|
+
: globalCount > 0
|
|
34
|
+
? "all-views"
|
|
35
|
+
: "this-view",
|
|
36
|
+
);
|
|
37
|
+
</script>
|
|
38
|
+
|
|
39
|
+
<Popover.Root>
|
|
40
|
+
<Popover.Trigger>
|
|
41
|
+
{#snippet child({ props }: { props: Record<string, any> })}
|
|
42
|
+
<Button
|
|
43
|
+
{...props}
|
|
44
|
+
variant="outline"
|
|
45
|
+
size="sm"
|
|
46
|
+
class={cn("bases-style-h-8-ed8a5d bases-style-border-dashed-a29b7a", {
|
|
47
|
+
"bases-style-text-var-text-accent-69c994 bases-style-hover-bg-color-mix-in-srgb-var-interactive-4e3e8a bases-style-hover-text-var-text-accent-5b2cb5":
|
|
48
|
+
totalCount > 0,
|
|
49
|
+
})}
|
|
50
|
+
>
|
|
51
|
+
<LucideListFilter /> Filter
|
|
52
|
+
</Button>
|
|
53
|
+
{/snippet}
|
|
54
|
+
</Popover.Trigger>
|
|
55
|
+
<Popover.Content
|
|
56
|
+
class={cn(
|
|
57
|
+
"bases-query-popover bases-filter-popover bases-style-mr-2-d2347e",
|
|
58
|
+
className,
|
|
59
|
+
)}
|
|
60
|
+
data-bases-popover="filter"
|
|
61
|
+
align="start"
|
|
62
|
+
>
|
|
63
|
+
<Accordion.Root type="single" value={defaultOpenSection}>
|
|
64
|
+
<Accordion.Item value="all-views">
|
|
65
|
+
<Accordion.Trigger
|
|
66
|
+
indicatorPosition="start"
|
|
67
|
+
indicatorVariant="disclosure"
|
|
68
|
+
class="bases-style-py-1-660d2e bases-style-font-bold-69450e hover:no-underline"
|
|
69
|
+
>
|
|
70
|
+
<span>
|
|
71
|
+
All views
|
|
72
|
+
<Badge
|
|
73
|
+
variant="secondary"
|
|
74
|
+
class={cn({ invisible: globalCount == 0 })}>{globalCount}</Badge
|
|
75
|
+
>
|
|
76
|
+
</span>
|
|
77
|
+
</Accordion.Trigger>
|
|
78
|
+
<Accordion.Content class="">
|
|
79
|
+
<ScrollArea
|
|
80
|
+
orientation="both"
|
|
81
|
+
class="bases-style-h-full-668b21 bases-style-max-w-55svw-8a9ecb bases-style-data-scroll-area-viewport-max-h-55svh-15dd46"
|
|
82
|
+
>
|
|
83
|
+
<FilterGroupComponent {controller} bind:filter={globalFilter} />
|
|
84
|
+
</ScrollArea>
|
|
85
|
+
</Accordion.Content>
|
|
86
|
+
</Accordion.Item>
|
|
87
|
+
<Accordion.Item value="this-view">
|
|
88
|
+
<Accordion.Trigger
|
|
89
|
+
indicatorPosition="start"
|
|
90
|
+
indicatorVariant="disclosure"
|
|
91
|
+
class="bases-style-py-1-660d2e bases-style-font-bold-69450e hover:no-underline"
|
|
92
|
+
>
|
|
93
|
+
<span>
|
|
94
|
+
This view
|
|
95
|
+
<Badge
|
|
96
|
+
variant="secondary"
|
|
97
|
+
class={cn({ invisible: currentCount == 0 })}>{currentCount}</Badge
|
|
98
|
+
>
|
|
99
|
+
</span>
|
|
100
|
+
</Accordion.Trigger>
|
|
101
|
+
<Accordion.Content class="">
|
|
102
|
+
<ScrollArea
|
|
103
|
+
orientation="both"
|
|
104
|
+
class="bases-style-h-full-668b21 bases-style-max-w-55svw-8a9ecb bases-style-data-scroll-area-viewport-max-h-55svh-15dd46"
|
|
105
|
+
>
|
|
106
|
+
<FilterGroupComponent {controller} bind:filter={currentFilter} />
|
|
107
|
+
</ScrollArea>
|
|
108
|
+
</Accordion.Content>
|
|
109
|
+
</Accordion.Item>
|
|
110
|
+
</Accordion.Root>
|
|
111
|
+
</Popover.Content>
|
|
112
|
+
</Popover.Root>
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { type Filters } from "../..";
|
|
2
|
+
import type { QueryController } from "../../bases.svelte";
|
|
3
|
+
type $$ComponentProps = {
|
|
4
|
+
controller?: QueryController;
|
|
5
|
+
table?: any;
|
|
6
|
+
globalFilter: Filters;
|
|
7
|
+
currentFilter: Filters;
|
|
8
|
+
class?: string;
|
|
9
|
+
};
|
|
10
|
+
declare const FilterRoot: import("svelte").Component<$$ComponentProps, {}, "globalFilter" | "currentFilter">;
|
|
11
|
+
type FilterRoot = ReturnType<typeof FilterRoot>;
|
|
12
|
+
export default FilterRoot;
|