Skip to content

Commit 6107856

Browse files
feat: add various bookmark events (#78)
1 parent c5926da commit 6107856

File tree

8 files changed

+275
-58
lines changed

8 files changed

+275
-58
lines changed

.changeset/thick-students-laugh.md

+6
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
"@sigmacomputing/react-embed-sdk": minor
3+
"@sigmacomputing/embed-sdk": minor
4+
---
5+
6+
feat: add various bookmark events

packages/embed-sdk/README.md

+40-8
Original file line numberDiff line numberDiff line change
@@ -138,6 +138,30 @@ Listen for a workbook bookmark create event, and execute the given callback when
138138
workbookBookmarkCreateListener(event: MessageEvent, iframe: HTMLIFrameElement, onBookmarkCreate: (event: WorkbookBookmarkOnCreateEvent) => void)
139139
```
140140

141+
#### workbookBookmarkOnChangeListener
142+
143+
Listen for a workbook bookmark change event, and execute the given callback when it occurs.
144+
145+
```typescript
146+
workbookBookmarkOnChangeListener(event: MessageEvent, iframe: HTMLIFrameElement, onBookmarkChange: (event: WorkbookBookmarkOnChangeEvent) => void)
147+
```
148+
149+
#### workbookBookmarkOnUpdateListener
150+
151+
Listen for a workbook bookmark update event, and execute the given callback when it occurs.
152+
153+
```typescript
154+
workbookBookmarkOnUpdateListener(event: MessageEvent, iframe: HTMLIFrameElement, onBookmarkUpdate: (event: WorkbookBookmarkOnUpdateEvent) => void)
155+
```
156+
157+
#### workbookBookmarkOnDeleteListener
158+
159+
Listen for a workbook bookmark delete event, and execute the given callback when it occurs.
160+
161+
```typescript
162+
workbookBookmarkOnDeleteListener(event: MessageEvent, iframe: HTMLIFrameElement, onBookmarkDelete: (event: WorkbookBookmarkOnDeleteEvent) => void)
163+
```
164+
141165
#### workbookDataLoadedListener
142166

143167
Listen for a workbook data loaded event, and execute the given callback when it occurs.
@@ -162,14 +186,6 @@ Listen for a workbook explore key change event, and execute the given callback w
162186
workbookExploreKeyOnChangeListener(event: MessageEvent, iframe: HTMLIFrameElement, onExploreKeyOnChange: (event: WorkbookExploreKeyOnChangeEvent) => void)
163187
```
164188

165-
#### workbookBookmarkOnChangeListener
166-
167-
Listen for a workbook bookmark change event, and execute the given callback when it occurs.
168-
169-
```typescript
170-
workbookBookmarkOnChangeListener(event: MessageEvent, iframe: HTMLIFrameElement, onBookmarkChange: (event: WorkbookBookmarkOnChangeEvent) => void)
171-
```
172-
173189
#### urlOnChangeListener
174190

175191
Listen for a url change event, and execute the given callback when it occurs.
@@ -230,6 +246,22 @@ Send a message to the embed to update the current bookmark.
230246
workbookBookmarkUpdate(iframe: HTMLIFrameElement)
231247
```
232248

249+
#### workbookBookmarkDelete
250+
251+
Send a message to the embed to delete the given bookmark.
252+
253+
```typescript
254+
workbookBookmarkDelete(iframe: HTMLIFrameElement, bookmarkId: string)
255+
```
256+
257+
#### workbookBookmarkSelect
258+
259+
Send a message to the embed to select the given bookmark. If no bookmarkId is provided, the current bookmark will be deselected.
260+
261+
```typescript
262+
workbookBookmarkSelect(iframe: HTMLIFrameElement, bookmarkId?: string)
263+
```
264+
233265
#### workbookFullscreenUpdate
234266

235267
Send a message to the embed to toggle the fullscreen state of the given element.

packages/embed-sdk/src/mutations.ts

+20
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,26 @@ export const workbookBookmarkUpdate = (iframe: HTMLIFrameElement) => {
4848
});
4949
};
5050

51+
export const workbookBookmarkSelect = (
52+
iframe: HTMLIFrameElement,
53+
bookmarkId?: string,
54+
) => {
55+
sendIframeMessage(iframe, {
56+
type: "workbook:bookmark:select",
57+
bookmarkId: bookmarkId,
58+
});
59+
};
60+
61+
export const workbookBookmarkDelete = (
62+
iframe: HTMLIFrameElement,
63+
bookmarkId: string,
64+
) => {
65+
sendIframeMessage(iframe, {
66+
type: "workbook:bookmark:delete",
67+
bookmarkId: bookmarkId,
68+
});
69+
};
70+
5171
export const workbookFullscreenUpdate = (
5272
iframe: HTMLIFrameElement,
5373
nodeId: string | null,

packages/embed-sdk/src/types.ts

+48-16
Original file line numberDiff line numberDiff line change
@@ -66,14 +66,28 @@ export const WorkbookDataLoadedEventName = "workbook:dataloaded" as const;
6666
export const WorkbookChartErrorEventName = "workbook:chart:error" as const;
6767
export const WorkbookExploreKeyOnChangeEventName =
6868
"workbook:exploreKey:onchange" as const;
69-
export const WorkbookBookmarkOnChangeEventName =
70-
"workbook:bookmark:onchange" as const;
69+
7170
export const UrlOnChangeEventName = "url:onchange" as const;
7271
export const WorkbookIdOnChangeEventName = "workbook:id:onchange" as const;
72+
7373
export const WorkbookBookmarkCreateEventName =
7474
"workbook:bookmark:create" as const;
7575
export const WorkbookBookmarkUpdateEventName =
7676
"workbook:bookmark:update" as const;
77+
export const WorkbookBookmarkDeleteEventName =
78+
"workbook:bookmark:delete" as const;
79+
export const WorkbookBookmarkSelectEventName =
80+
"workbook:bookmark:select" as const;
81+
82+
export const WorkbookBookmarkOnChangeEventName =
83+
"workbook:bookmark:onchange" as const;
84+
export const WorkbookBookmarkOnCreateEvent =
85+
"workbook:bookmark:oncreate" as const;
86+
export const WorkbookBookmarkOnDeleteEventName =
87+
"workbook:bookmark:ondelete" as const;
88+
export const WorkbookBookmarkOnUpdateEventName =
89+
"workbook:bookmark:onupdate" as const;
90+
7791
export const WorkbookFullscreenUpdateEventName =
7892
"workbook:fullscreen:update" as const;
7993

@@ -168,14 +182,6 @@ export type WorkbookCurrentVariablesEvent = {
168182
variables: Record<string, string>;
169183
};
170184

171-
export type WorkbookBookmarkOnCreateEvent = {
172-
type: typeof WorkbookBookmarkOnCreateEventName;
173-
bookmarkName: string;
174-
workbookId: string;
175-
versionTagName: string | null;
176-
bookmarkId: string;
177-
};
178-
179185
export type WorkbookDataLoadedEvent = {
180186
type: typeof WorkbookDataLoadedEventName;
181187
};
@@ -192,6 +198,14 @@ export type WorkbookExploreKeyOnChangeEvent = {
192198
exploreKey: string | null;
193199
};
194200

201+
export type WorkbookBookmarkOnCreateEvent = {
202+
type: typeof WorkbookBookmarkOnCreateEventName;
203+
bookmarkName: string;
204+
workbookId: string;
205+
versionTagName: string | null;
206+
bookmarkId: string;
207+
};
208+
195209
export type WorkbookBookmarkOnChangeEvent = {
196210
type: typeof WorkbookBookmarkOnChangeEventName;
197211
bookmarkName: string | null;
@@ -200,14 +214,22 @@ export type WorkbookBookmarkOnChangeEvent = {
200214
bookmarkId: string | null;
201215
};
202216

203-
export type UrlOnChangeEvent = {
204-
type: typeof UrlOnChangeEventName;
205-
url: string;
217+
export type WorkbookBookmarkOnUpdateEvent = {
218+
type: typeof WorkbookBookmarkOnUpdateEventName;
219+
bookmarkName?: string;
220+
workbookId: string;
221+
versionTagName: string | null;
222+
bookmarkId: string;
223+
isDefault?: boolean;
224+
isShared?: boolean;
206225
};
207226

208-
export type WorkbookIdOnChangeEvent = {
209-
type: typeof WorkbookIdOnChangeEventName;
210-
id: string;
227+
export type WorkbookBookmarkOnDeleteEvent = {
228+
type: typeof WorkbookBookmarkOnDeleteEventName;
229+
bookmarkName: string;
230+
workbookId: string;
231+
versionTagName: string | null;
232+
bookmarkId: string;
211233
};
212234

213235
export type WorkbookBookmarkCreateEvent = {
@@ -216,6 +238,16 @@ export type WorkbookBookmarkCreateEvent = {
216238
isShared: boolean;
217239
};
218240

241+
export type UrlOnChangeEvent = {
242+
type: typeof UrlOnChangeEventName;
243+
url: string;
244+
};
245+
246+
export type WorkbookIdOnChangeEvent = {
247+
type: typeof WorkbookIdOnChangeEventName;
248+
id: string;
249+
};
250+
219251
export type ActionOutboundEvent = {
220252
type: typeof ActionOutboundEventName;
221253
name: string;

packages/embed-sdk/src/wrapper.ts

+41-12
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,10 @@ import {
4141
WorkbookVariablesCurrentEventName,
4242
ActionOutboundEvent,
4343
ActionOutboundEventName,
44+
WorkbookBookmarkOnUpdateEvent,
45+
WorkbookBookmarkOnUpdateEventName,
46+
WorkbookBookmarkOnDeleteEvent,
47+
WorkbookBookmarkOnDeleteEventName,
4448
} from "./types";
4549

4650
const checkEventOrigin = (url: string) => {
@@ -217,6 +221,43 @@ export const workbookBookmarkCreateListener = (
217221
}
218222
}
219223
};
224+
225+
export const workbookBookmarkOnChangeListener = (
226+
event: MessageEvent,
227+
iframe: HTMLIFrameElement,
228+
onBookmarkChange: (event: WorkbookBookmarkOnChangeEvent) => void,
229+
) => {
230+
if (event.source === iframe.contentWindow && checkEventOrigin(event.origin)) {
231+
if (event.data.type === WorkbookBookmarkOnChangeEventName) {
232+
onBookmarkChange(event.data);
233+
}
234+
}
235+
};
236+
237+
export const workbookBookmarkOnUpdateListener = (
238+
event: MessageEvent,
239+
iframe: HTMLIFrameElement,
240+
onBookmarkUpdate: (event: WorkbookBookmarkOnUpdateEvent) => void,
241+
) => {
242+
if (event.source === iframe.contentWindow && checkEventOrigin(event.origin)) {
243+
if (event.data.type === WorkbookBookmarkOnUpdateEventName) {
244+
onBookmarkUpdate(event.data);
245+
}
246+
}
247+
};
248+
249+
export const workbookBookmarkOnDeleteListener = (
250+
event: MessageEvent,
251+
iframe: HTMLIFrameElement,
252+
onBookmarkDelete: (event: WorkbookBookmarkOnDeleteEvent) => void,
253+
) => {
254+
if (event.source === iframe.contentWindow && checkEventOrigin(event.origin)) {
255+
if (event.data.type === WorkbookBookmarkOnDeleteEventName) {
256+
onBookmarkDelete(event.data);
257+
}
258+
}
259+
};
260+
220261
export const workbookDataLoadedListener = (
221262
event: MessageEvent,
222263
iframe: HTMLIFrameElement,
@@ -253,18 +294,6 @@ export const workbookExploreKeyOnChangeListener = (
253294
}
254295
};
255296

256-
export const workbookBookmarkOnChangeListener = (
257-
event: MessageEvent,
258-
iframe: HTMLIFrameElement,
259-
onBookmarkChange: (event: WorkbookBookmarkOnChangeEvent) => void,
260-
) => {
261-
if (event.source === iframe.contentWindow && checkEventOrigin(event.origin)) {
262-
if (event.data.type === WorkbookBookmarkOnChangeEventName) {
263-
onBookmarkChange(event.data);
264-
}
265-
}
266-
};
267-
268297
export const urlOnChangeListener = (
269298
event: MessageEvent,
270299
iframe: HTMLIFrameElement,

packages/react-embed-sdk/README.md

+40-8
Original file line numberDiff line numberDiff line change
@@ -226,6 +226,30 @@ Listen for a workbook bookmark create event, and execute the given callback when
226226
useWorkbookBookmarkOnCreate(iframeRef: React.RefObject<HTMLIFrameElement>, onBookmarkCreate: (event: WorkbookBookmarkOnCreateEvent) => void)
227227
```
228228

229+
#### useWorkbookBookmarkOnChange
230+
231+
Listen for a workbook bookmark change event, and execute the given callback when it occurs.
232+
233+
```typescript
234+
useWorkbookBookmarkOnChange(iframeRef: React.RefObject<HTMLIFrameElement>, onBookmarkChange: (event: WorkbookBookmarkOnChangeEvent) => void)
235+
```
236+
237+
#### useWorkbookBookmarkOnUpdate
238+
239+
Listen for a workbook bookmark update event, and execute the given callback when it occurs.
240+
241+
```typescript
242+
useWorkbookBookmarkOnUpdate(iframeRef: React.RefObject<HTMLIFrameElement>, onBookmarkUpdate: (event: WorkbookBookmarkOnUpdateEvent) => void)
243+
```
244+
245+
#### useWorkbookBookmarkOnDelete
246+
247+
Listen for a workbook bookmark delete event, and execute the given callback when it occurs.
248+
249+
```typescript
250+
useWorkbookBookmarkOnDelete(iframeRef: React.RefObject<HTMLIFrameElement>, onBookmarkDelete: (event: WorkbookBookmarkOnDeleteEvent) => void)
251+
```
252+
229253
#### useWorkbookChartError
230254

231255
Listen for a workbook chart error event, and execute the given callback when it occurs.
@@ -242,14 +266,6 @@ Listen for a workbook explore key change event, and execute the given callback w
242266
useWorkbookExploreKeyOnChange(iframeRef: React.RefObject<HTMLIFrameElement>, onExploreKeyOnChange: (event: WorkbookExploreKeyOnChangeEvent) => void)
243267
```
244268

245-
#### useWorkbookBookmarkOnChange
246-
247-
Listen for a workbook bookmark change event, and execute the given callback when it occurs.
248-
249-
```typescript
250-
useWorkbookBookmarkOnChange(iframeRef: React.RefObject<HTMLIFrameElement>, onBookmarkChange: (event: WorkbookBookmarkOnChangeEvent) => void)
251-
```
252-
253269
#### useUrlOnChange
254270

255271
Listen for a url change event, and execute the given callback when it occurs.
@@ -302,6 +318,22 @@ Send a message to the embed to update the current bookmark.
302318
updateWorkbookBookmark(iframeRef: React.RefObject<HTMLIFrameElement>)
303319
```
304320

321+
#### deleteWorkbookBookmark
322+
323+
Send a message to the embed to delete the given bookmark.
324+
325+
```typescript
326+
deleteWorkbookBookmark(iframeRef: React.RefObject<HTMLIFrameElement>, bookmarkId: string)
327+
```
328+
329+
#### selectWorkbookBookmark
330+
331+
Send a message to the embed to select the given bookmark. If no bookmarkId is provided, the current bookmark will be deselected.
332+
333+
```typescript
334+
selectWorkbookBookmark(iframeRef: React.RefObject<HTMLIFrameElement>, bookmarkId?: string)
335+
```
336+
305337
#### updateWorkbookFullscreen
306338

307339
Send a message to the embed to toggle the fullscreen state of the given element.

packages/react-embed-sdk/src/mutations.ts

+22
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import {
77
workbookSelectedNodeIdUpdate,
88
WorkbookBookmarkCreateEvent,
99
workbookSharingLinkUpdate,
10+
workbookBookmarkDelete,
11+
workbookBookmarkSelect,
1012
} from "@sigmacomputing/embed-sdk";
1113

1214
export { DO_NOT_USE_IN_PRODUCTION_overrideMutationUrl } from "@sigmacomputing/embed-sdk";
@@ -49,6 +51,26 @@ export function updateWorkbookBookmark(
4951
workbookBookmarkUpdate(iframeRef.current);
5052
}
5153

54+
export function deleteWorkbookBookmark(
55+
iframeRef: React.RefObject<HTMLIFrameElement>,
56+
bookmarkId: string,
57+
) {
58+
if (!iframeRef.current) {
59+
throw new Error("iframe is not available");
60+
}
61+
workbookBookmarkDelete(iframeRef.current, bookmarkId);
62+
}
63+
64+
export function selectWorkbookBookmark(
65+
iframeRef: React.RefObject<HTMLIFrameElement>,
66+
bookmarkId?: string,
67+
) {
68+
if (!iframeRef.current) {
69+
throw new Error("iframe is not available");
70+
}
71+
workbookBookmarkSelect(iframeRef.current, bookmarkId);
72+
}
73+
5274
export function updateWorkbookFullscreen(
5375
iframeRef: React.RefObject<HTMLIFrameElement>,
5476
nodeId: string | null,

0 commit comments

Comments
 (0)