Skip to content

Commit 550256d

Browse files
committed
feat: template preview
1 parent dd50463 commit 550256d

File tree

23 files changed

+398
-70
lines changed

23 files changed

+398
-70
lines changed

apps/frontend/src/lib/components/blocks/field-control/date-control.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
let open = false
2626
</script>
2727

28-
<Popover.Root bind:open openFocus>
28+
<Popover.Root bind:open openFocus portal="body">
2929
<Popover.Trigger asChild let:builder>
3030
<Button
3131
disabled={readonly || disabled}

apps/frontend/src/lib/components/blocks/grid-view/editable-cell/checkbox-cell.svelte

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
export let field: CheckboxField
1111
export let value: boolean = false
1212
export let recordId: string
13+
export let readonly = false
1314
export let onValueChange: (value: boolean) => void
1415
1516
const updateCell = createMutation({
@@ -23,9 +24,10 @@
2324

2425
<div class={cn($$restProps.class, "flex items-center justify-center")}>
2526
<Checkbox
27+
disabled={readonly}
2628
bind:checked={value}
2729
onCheckedChange={(checked) => {
28-
onValueChange(checked)
30+
onValueChange(!!checked)
2931
$updateCell.mutate({
3032
tableId,
3133
id: recordId,

apps/frontend/src/lib/components/blocks/grid-view/grid-view-data-table.svelte

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
import ShareTableTools from "$lib/components/blocks/table-tools/share-table-tools.svelte"
3737
3838
export let readonly = false
39-
export let viewId: Readable<string>
39+
export let viewId: Readable<string | undefined>
4040
export let currentPage: Writable<number | null>
4141
export let isLoading = false
4242
export let total: number

apps/frontend/src/lib/components/blocks/kanban-view/kanban-option-button.svelte

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
import type { KanbanView } from "@undb/table"
77
88
export let view: KanbanView
9+
export let readonly = false
910
</script>
1011

1112
<Dropdown.Root>
@@ -16,7 +17,13 @@
1617
</Button>
1718
</Dropdown.Trigger>
1819
<Dropdown.Content class="w-[400px] p-2">
19-
<Dropdown.Label>Update kanban view</Dropdown.Label>
20-
<SelectKanbanFieldForm {view} />
20+
<Dropdown.Label>
21+
{#if !readonly}
22+
Update kanban view
23+
{:else}
24+
Kanban view
25+
{/if}
26+
</Dropdown.Label>
27+
<SelectKanbanFieldForm {view} {readonly} />
2128
</Dropdown.Content>
2229
</Dropdown.Root>

apps/frontend/src/lib/components/blocks/kanban-view/kanban-view.svelte

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,37 +1,43 @@
11
<script lang="ts">
22
import { getTable } from "$lib/store/table.store"
33
import type { Readable } from "svelte/store"
4-
import type { KanbanView } from "@undb/table"
4+
import type { KanbanView, RecordDO } from "@undb/table"
55
import SelectKanbanField from "./select-kanban-field.svelte"
66
import SelectKanbanView from "./select-kanban-view.svelte"
77
import TableTools from "../table-tools/table-tools.svelte"
8-
import { FieldIdVo } from "@undb/table"
8+
import { FieldIdVo, Records } from "@undb/table"
99
import SelectKanbanRequiresSingle from "./select-kanban-requires-single.svelte"
1010
import KanbanOptionButton from "./kanban-option-button.svelte"
1111
import { createRecordsStore, setRecordsStore } from "$lib/store/records.store"
1212
1313
const table = getTable()
14-
export let viewId: Readable<string>
14+
export let viewId: Readable<string | undefined>
1515
export let shareId: string | undefined = undefined
16+
export let readonly = false
17+
export let records: RecordDO[] | undefined = undefined
18+
export let disableRecordQuery = false
1619
1720
$: view = $table.views.getViewById($viewId) as KanbanView
1821
$: fieldId = view.type === "kanban" ? view.field.into(undefined) : undefined
1922
$: field = fieldId ? $table.schema.getFieldById(new FieldIdVo(fieldId)).into(undefined) : undefined
2023
2124
const recordsStore = createRecordsStore()
2225
setRecordsStore(recordsStore)
26+
if (records) {
27+
recordsStore.setRecords(new Records(records), Date.now())
28+
}
2329
</script>
2430

2531
{#key $table.id.value}
26-
<TableTools>
32+
<TableTools {readonly}>
2733
{#if !shareId}
28-
<KanbanOptionButton {view} />
34+
<KanbanOptionButton {view} {readonly} />
2935
{/if}
3036
</TableTools>
3137
{#if view.type === "kanban"}
3238
{#if field?.type === "select"}
3339
{#if field.isSingle}
34-
<SelectKanbanView {view} {shareId} {viewId} />
40+
<SelectKanbanView {view} {shareId} {viewId} {disableRecordQuery} {readonly} />
3541
{:else}
3642
<section class="flex h-full w-full items-center justify-center">
3743
<SelectKanbanRequiresSingle {view} {field} {shareId} />

apps/frontend/src/lib/components/blocks/kanban-view/select-kanban-field-form.svelte

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@
1010
import { createMutation } from "@tanstack/svelte-query"
1111
import { toast } from "svelte-sonner"
1212
import { invalidate } from "$app/navigation"
13+
import { hasPermission } from "$lib/store/space-member.store"
14+
15+
export let readonly = false
1316
1417
const table = getTable()
1518
@@ -59,6 +62,7 @@
5962
<div class="grid w-full items-center gap-4">
6063
<div class="flex flex-col space-y-1.5">
6164
<FieldPicker
65+
disabled={readonly}
6266
placeholder="Select a select type field to group kanban lanes"
6367
value={$formData.kanban?.field}
6468
onValueChange={(field) => {
@@ -74,9 +78,13 @@
7478
</div>
7579
</form>
7680

77-
<CreateFieldButton class="w-full" variant="secondary" />
81+
{#if !readonly && $hasPermission("field:update")}
82+
<CreateFieldButton class="w-full" variant="secondary" />
83+
{/if}
7884

79-
<div class="flex w-full justify-end">
80-
<Button type="submit" form="select-kanban-field-form">Confirm</Button>
81-
</div>
85+
{#if !readonly}
86+
<div class="flex w-full justify-end">
87+
<Button type="submit" form="select-kanban-field-form" disabled={readonly}>Confirm</Button>
88+
</div>
89+
{/if}
8290
</div>

apps/frontend/src/lib/components/blocks/kanban-view/select-kanban-lane.svelte

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,20 @@
5050
5151
export let tableId: string
5252
export let view: KanbanView
53-
export let viewId: Readable<string>
53+
export let viewId: Readable<string | undefined>
5454
export let fieldId: string
5555
export let field: SelectField
5656
export let option: IOption | null
5757
export let readonly = false
5858
export let shareId: string | undefined = undefined
59+
export let disableRecordQuery = false
5960
6061
$: color = view.color.into(undefined)
6162
6263
const q = queryParam("q")
6364
6465
let getIsLaneCollapsed = kanbanStore.getIsLaneCollapsed
65-
$: isLaneCollapsed = $getIsLaneCollapsed($viewId, option?.id ?? "") ?? false
66+
$: isLaneCollapsed = $viewId ? ($getIsLaneCollapsed($viewId, option?.id ?? "") ?? false) : false
6667
6768
const query = createInfiniteQuery(
6869
derived([table, viewId, q], ([$table, $viewId, $q]) => {
@@ -109,7 +110,7 @@
109110
}
110111
return pages.length + 1
111112
},
112-
enabled: view?.type === "kanban",
113+
enabled: view?.type === "kanban" && !disableRecordQuery,
113114
filters: {
114115
conjunction: "and",
115116
children: [{ field: fieldId, op: "eq", value: option ? option.id : null }],
@@ -304,6 +305,9 @@
304305
<DropdownMenu.Item
305306
class="text-xs text-gray-700"
306307
on:click={() => {
308+
if (!$viewId) {
309+
return
310+
}
307311
kanbanStore.toggleLane($viewId, option?.id ?? "")
308312
}}
309313
>
@@ -323,7 +327,7 @@
323327
getKanbanBgColor(option?.color ?? "gray"),
324328
)}
325329
>
326-
{#if !readonly && $hasPermission("record:create")}
330+
{#if $hasPermission("record:create")}
327331
{#if $query.isFetchedAfterMount}
328332
{#if recordDos.length > 0}
329333
<Button on:click={onCreateRecord} variant="outline" size="sm" class="w-full">
@@ -339,7 +343,7 @@
339343
<Option option={option ?? { id: "", name: "No Option", color: "gray" }} />
340344
</div>
341345
</div>
342-
{#if !(field.required && !option)}
346+
{#if !readonly && !(field.required && !option)}
343347
<Button on:click={onCreateRecord} variant="outline" size="sm">
344348
<PlusIcon class="text-muted-foreground mr-2 h-4 w-4 font-semibold" />
345349
New Record
@@ -376,7 +380,7 @@
376380
</div>
377381
<div class="mt-2 flex w-full items-center justify-between px-2 py-0.5">
378382
{#if !shareId}
379-
{#if !(field.required && !option)}
383+
{#if !(field.required && !option) && !readonly}
380384
<Button variant="outline" size="xs" on:click={onCreateRecord}>
381385
<PlusIcon class="text-muted-foreground mr-2 h-3 w-3 font-semibold" />
382386
New Record

apps/frontend/src/lib/components/blocks/kanban-view/select-kanban-view.svelte

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,11 @@
2525
2626
const table = getTable()
2727
28-
export let viewId: Readable<string>
28+
export let viewId: Readable<string | undefined>
2929
export let view: KanbanView
3030
export let readonly = false
3131
export let shareId: string | undefined = undefined
32+
export let disableRecordQuery = false
3233
3334
let fieldId = view.field.unwrapUnchecked()!
3435
let field = $table.schema.getFieldById(new FieldIdVo(fieldId)).into(undefined) as SelectField
@@ -99,11 +100,31 @@
99100

100101
<div class="flex-1 overflow-x-auto overflow-y-hidden p-4">
101102
<div bind:this={lanesContainer} class="flex h-full space-x-2 overflow-y-hidden pr-2">
102-
<SelectKanbanLane {field} {readonly} tableId={$table.id.value} {viewId} {fieldId} option={null} {shareId} {view} />
103+
<SelectKanbanLane
104+
{field}
105+
{readonly}
106+
tableId={$table.id.value}
107+
{viewId}
108+
{fieldId}
109+
option={null}
110+
{shareId}
111+
{view}
112+
{disableRecordQuery}
113+
/>
103114
{#each options as option (option.id)}
104-
<SelectKanbanLane {field} {readonly} tableId={$table.id.value} {viewId} {fieldId} {option} {shareId} {view} />
115+
<SelectKanbanLane
116+
{field}
117+
{readonly}
118+
tableId={$table.id.value}
119+
{viewId}
120+
{fieldId}
121+
{option}
122+
{shareId}
123+
{view}
124+
{disableRecordQuery}
125+
/>
105126
{/each}
106-
{#if !shareId}
127+
{#if !shareId && !readonly}
107128
<div class="flex w-[350px] shrink-0 flex-col space-y-2 rounded-sm px-2 pt-2 transition-all">
108129
<Popover.Root>
109130
<Popover.Trigger asChild let:builder>

apps/frontend/src/lib/components/blocks/share/share-grid-view.svelte

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,15 +2,15 @@
22
import { page } from "$app/stores"
33
import GridViewDataTable from "$lib/components/blocks/grid-view/grid-view-data-table.svelte"
44
import { preferences } from "$lib/store/persisted.store"
5-
import { createRecordsStore, setRecordsStore, type RecordsStore } from "$lib/store/records.store"
5+
import { createRecordsStore, setRecordsStore } from "$lib/store/records.store"
66
import { getTable } from "$lib/store/table.store"
77
import { trpc } from "$lib/trpc/client"
88
import { createQuery } from "@tanstack/svelte-query"
99
import { Records, type IRecordsDTO } from "@undb/table"
10-
import { derived, writable, type Readable } from "svelte/store"
10+
import { derived, type Readable } from "svelte/store"
1111
import { queryParam, ssp } from "sveltekit-search-params"
1212
13-
export let viewId: Readable<string>
13+
export let viewId: Readable<string | undefined>
1414
1515
const t = getTable()
1616
const perPage = derived(preferences, ($preferences) => $preferences.gridViewPerPage ?? 50)

apps/frontend/src/lib/components/blocks/table-tools/table-tools.svelte

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -8,22 +8,28 @@
88
import ViewFields from "../view-fields/view-fields.svelte"
99
import ShareViewButton from "../share/share-view-button.svelte"
1010
import BulkUpdateRecordsButton from "../bulk-update-records/bulk-update-records-button.svelte"
11+
12+
export let readonly = false
1113
</script>
1214

1315
<div class="flex items-center justify-between gap-2 border-b px-4 py-2">
1416
<div class="flex items-center gap-2">
15-
<CreateRecordButton />
16-
<ViewFilterEditor />
17-
<ViewColorEditor />
18-
<ViewSort />
19-
<ViewFields />
17+
{#if !readonly}
18+
<CreateRecordButton />
19+
{/if}
20+
<ViewFilterEditor {readonly} />
21+
<ViewColorEditor {readonly} />
22+
<ViewSort {readonly} />
23+
<ViewFields {readonly} />
2024
<slot></slot>
2125
</div>
2226

2327
<div class="flex items-center gap-2">
24-
<BulkUpdateRecordsButton />
25-
<CreateFieldButton />
26-
<ShareViewButton />
28+
{#if !readonly}
29+
<BulkUpdateRecordsButton />
30+
<CreateFieldButton />
31+
<ShareViewButton />
32+
{/if}
2733
<RecordsSearch />
2834
</div>
2935
</div>

0 commit comments

Comments
 (0)