Skip to content

Commit 8c0c765

Browse files
authored
Merge pull request #15224 from Budibase/typing/stores-viewv2
Typing viewV2 store
2 parents ba0349e + bd261dc commit 8c0c765

File tree

4 files changed

+129
-104
lines changed

4 files changed

+129
-104
lines changed

packages/builder/src/stores/builder/viewsV2.js

-102
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
import { derived, get, Writable } from "svelte/store"
2+
import { tables } from "./tables"
3+
import { API } from "api"
4+
import { DerivedBudiStore } from "stores/BudiStore"
5+
import { CreateViewRequest, UpdateViewRequest, ViewV2 } from "@budibase/types"
6+
import { helpers } from "@budibase/shared-core"
7+
8+
interface BuilderViewV2Store {
9+
selectedViewId: string | null
10+
}
11+
12+
interface DerivedViewV2Store extends BuilderViewV2Store {
13+
list: ViewV2[]
14+
selected?: ViewV2
15+
}
16+
17+
export class ViewV2Store extends DerivedBudiStore<
18+
BuilderViewV2Store,
19+
DerivedViewV2Store
20+
> {
21+
constructor() {
22+
const makeDerivedStore = (store: Writable<BuilderViewV2Store>) => {
23+
return derived(
24+
[store, tables],
25+
([$store, $tables]): DerivedViewV2Store => {
26+
let list: ViewV2[] = []
27+
$tables.list?.forEach(table => {
28+
const views = Object.values(table?.views || {}).filter(
29+
helpers.views.isV2
30+
)
31+
list = list.concat(views)
32+
})
33+
return {
34+
...$store,
35+
list,
36+
selected: list.find(view => view.id === $store.selectedViewId),
37+
}
38+
}
39+
)
40+
}
41+
42+
super(
43+
{
44+
selectedViewId: null,
45+
},
46+
makeDerivedStore
47+
)
48+
49+
this.select = this.select.bind(this)
50+
}
51+
52+
select(id: string) {
53+
this.store.update(state => ({
54+
...state,
55+
selectedViewId: id,
56+
}))
57+
}
58+
59+
async delete(view: { id: string }) {
60+
await API.viewV2.delete(view.id)
61+
this.replaceView(view.id, null)
62+
}
63+
64+
async create(view: CreateViewRequest) {
65+
const savedViewResponse = await API.viewV2.create(view)
66+
const savedView = savedViewResponse.data
67+
this.replaceView(savedView.id, savedView)
68+
return savedView
69+
}
70+
71+
async save(view: UpdateViewRequest) {
72+
const res = await API.viewV2.update(view)
73+
const savedView = res?.data
74+
this.replaceView(view.id, savedView)
75+
}
76+
77+
// Handles external updates of tables
78+
replaceView(viewId: string, view: ViewV2 | null) {
79+
const existingView = get(this.derivedStore).list.find(
80+
view => view.id === viewId
81+
)
82+
const tableIndex = get(tables).list.findIndex(table => {
83+
return table._id === view?.tableId || table._id === existingView?.tableId
84+
})
85+
if (tableIndex === -1) {
86+
return
87+
}
88+
89+
// Handle deletion
90+
if (!view && existingView) {
91+
tables.update(state => {
92+
delete state.list[tableIndex].views![existingView.name]
93+
return state
94+
})
95+
return
96+
}
97+
98+
// Add new view
99+
else if (!existingView && view) {
100+
tables.update(state => {
101+
state.list[tableIndex].views ??= {}
102+
state.list[tableIndex].views[view.name] = view
103+
return state
104+
})
105+
}
106+
107+
// Update existing view
108+
else if (existingView && view) {
109+
tables.update(state => {
110+
// Remove old view
111+
state.list[tableIndex].views ??= {}
112+
delete state.list[tableIndex].views[existingView.name]
113+
114+
// Add new view
115+
state.list[tableIndex].views[view.name] = view
116+
return state
117+
})
118+
}
119+
}
120+
}
121+
122+
export const viewsV2 = new ViewV2Store()

packages/server/src/sdk/app/views/index.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -324,8 +324,8 @@ export async function update(
324324
return pickApi(tableId).update(tableId, view)
325325
}
326326

327-
export function isV2(view: View | ViewV2): view is ViewV2 {
328-
return (view as ViewV2).version === 2
327+
export function isV2(view: View | ViewV2) {
328+
return helpers.views.isV2(view)
329329
}
330330

331331
export async function remove(viewId: string): Promise<ViewV2> {

packages/shared-core/src/helpers/views.ts

+5
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {
22
BasicViewFieldMetadata,
3+
View,
34
ViewCalculationFieldMetadata,
45
ViewFieldMetadata,
56
ViewV2,
@@ -43,3 +44,7 @@ export function basicFields(view: UnsavedViewV2, opts?: { visible?: boolean }) {
4344
return !isCalculationField(field) && (!visible || isVisible(field))
4445
})
4546
}
47+
48+
export function isV2(view: View | ViewV2): view is ViewV2 {
49+
return (view as ViewV2).version === 2
50+
}

0 commit comments

Comments
 (0)