@dotcms/uve 0.0.1-beta.12 → 0.0.1-beta.14

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/README.md CHANGED
@@ -1,7 +1,324 @@
1
- # sdk-uve
1
+ # DotCMS UVE SDK
2
2
 
3
- This library was generated with [Nx](https://nx.dev).
3
+ A JavaScript library to connect your dotCMS pages with the Universal Visual Editor (UVE) and enable content authors to edit pages in real time.
4
4
 
5
- ## Running unit tests
5
+ > **BETA VERSION NOTICE:** This SDK is currently in beta. APIs, functionality, and documentation may change significantly in the stable release.
6
6
 
7
- Run `nx test sdk-uve` to execute the unit tests via [Jest](https://jestjs.io).
7
+ ## Table of Contents
8
+
9
+ - [Installation](#installation)
10
+ - [Entry Points](#entry-points)
11
+ - [Getting Started](#getting-started)
12
+ - [API Reference](#api-reference)
13
+ - [Editor State](#editor-state)
14
+ - [Event Subscriptions](#event-subscriptions)
15
+ - [Content Editing](#content-editing)
16
+ - [Navigation & UI](#navigation--ui)
17
+ - [Messaging](#messaging)
18
+ - [Types Reference](#types-reference)
19
+ - [Examples](#examples)
20
+ - [Contributing](#contributing)
21
+ - [License](#license)
22
+
23
+ ## Installation
24
+
25
+ The UVE SDK is automatically included in DotCMS installations. For external usage:
26
+
27
+ ```bash
28
+ # Using npm
29
+ npm install @dotcms/uve-sdk
30
+
31
+ # Using yarn
32
+ yarn add @dotcms/uve-sdk
33
+ ```
34
+
35
+ ## Entry Points
36
+
37
+ The library exposes three main entry points:
38
+
39
+ - **`@dotcms/uve`**: Provides everything developers need to communicate with UVE.
40
+
41
+ - **`@dotcms/uve/types`**: Offers TypeScript types, interfaces, and other structures to help users organize their code properly.
42
+
43
+ ## Getting Started
44
+
45
+ To use the UVE SDK in your project, import the necessary functions:
46
+
47
+ ```typescript
48
+ import { getUVEState, createUVESubscription, editContentlet } from '@dotcms/uve';
49
+ import { UVEEventType, UVE_MODE } from '@dotcms/uve/types';
50
+
51
+ // Check if we're in the editor
52
+ const uveState = getUVEState();
53
+ if (uveState?.mode === UVE_MODE.EDIT) {
54
+ console.log('Running in edit mode!');
55
+
56
+ // Subscribe to content changes
57
+ const subscription = createUVESubscription(UVEEventType.CONTENT_CHANGES, (changes) => {
58
+ console.log('Content updated:', changes);
59
+ // Update your UI with the new content
60
+ });
61
+
62
+ // Later, when no longer needed
63
+ subscription.unsubscribe();
64
+ }
65
+ ```
66
+
67
+ ## API Reference
68
+
69
+ ### Editor State
70
+
71
+ #### `getUVEState`
72
+
73
+ Retrieves the current UVE state.
74
+
75
+ **Returns:**
76
+ - A `UVEState` object if running inside the editor, or `undefined` otherwise.
77
+
78
+ The state includes:
79
+ - `mode`: The current editor mode (preview, edit, live).
80
+ - `languageId`: The language ID of the current page set in the UVE.
81
+ - `persona`: The persona of the current page set in the UVE.
82
+ - `variantName`: The name of the current variant.
83
+ - `experimentId`: The ID of the current experiment.
84
+ - `publishDate`: The publish date of the current page set in the UVE.
85
+
86
+ > **Note:** If any of these properties are absent, it means the value is the default one.
87
+
88
+ **Example:**
89
+ ```typescript
90
+ const editorState = getUVEState();
91
+ if (editorState?.mode === 'edit') {
92
+ // Enable editing features
93
+ }
94
+ ```
95
+
96
+ ### Event Subscriptions
97
+
98
+ #### `createUVESubscription`
99
+
100
+ Subscribe to page changes and other UVE events. Receive a callback that will be called with the updated content of the page.
101
+
102
+ **Parameters:**
103
+ - `eventType` - The type of event to subscribe to.
104
+ - `callback` - The callback function that will be called when the event occurs.
105
+
106
+ **Returns:**
107
+ - An event subscription that can be used to unsubscribe.
108
+
109
+ **Example:**
110
+ ```typescript
111
+ // Subscribe to page changes
112
+ const subscription = createUVESubscription(UVEEventType.CONTENT_CHANGES, (changes) => {
113
+ console.log('Content changes:', changes);
114
+ });
115
+
116
+ // Later, unsubscribe when no longer needed
117
+ subscription.unsubscribe();
118
+ ```
119
+
120
+ ### Content Editing
121
+
122
+ #### `editContentlet`
123
+
124
+ Allows you to edit a contentlet in the editor.
125
+
126
+ Calling this function within the editor prompts the UVE to open a dialog to edit the specified contentlet.
127
+
128
+ **Parameters:**
129
+ - `contentlet<T>` - The contentlet to edit.
130
+
131
+ **Example:**
132
+ ```typescript
133
+ // Edit a contentlet
134
+ editContentlet(myContentlet);
135
+ ```
136
+
137
+ #### `initInlineEditing`
138
+
139
+ Initializes inline editing in the editor.
140
+
141
+ **Parameters:**
142
+ - `type` - The type of inline editing ('BLOCK_EDITOR' or 'WYSIWYG').
143
+ - `data` - (Optional) Data for the inline editing session.
144
+
145
+ **Example:**
146
+ ```typescript
147
+ // Initialize block editor
148
+ initInlineEditing('BLOCK_EDITOR', {
149
+ inode: 'abc123',
150
+ language: 1,
151
+ contentType: 'Blog',
152
+ fieldName: 'body',
153
+ content: { /* content data */ }
154
+ });
155
+ ```
156
+
157
+ ### Navigation & UI
158
+
159
+ #### `reorderMenu`
160
+
161
+ Reorders the menu based on the provided configuration.
162
+
163
+ **Parameters:**
164
+ - `config` (optional): Configuration for reordering the menu.
165
+ - `startLevel` (default: `1`): The starting level of the menu to reorder.
166
+ - `depth` (default: `2`): The depth of the menu to reorder.
167
+
168
+ This function constructs a URL for the reorder menu page with the specified `startLevel` and `depth`, then sends a message to the editor to perform the reorder action.
169
+
170
+ **Example:**
171
+ ```typescript
172
+ // Reorder menu starting from level 2 with depth of 3
173
+ reorderMenu({ startLevel: 2, depth: 3 });
174
+ ```
175
+
176
+ ### Messaging
177
+
178
+ #### `sendMessageToUVE`
179
+
180
+ The `sendMessageToUVE` function allows you to send messages to the dotCMS page editor. This is useful for triggering specific actions or updating the editor's state.
181
+
182
+ This function is primarily used within other library functions but can be helpful if you need to trigger specific behavior by sending a message to the UVE.
183
+
184
+ **Example:**
185
+ ```typescript
186
+ sendMessageToUVE({
187
+ action: DotCMSUVEAction.CUSTOM_MESSAGE,
188
+ payload: { key: 'value' }
189
+ });
190
+ ```
191
+
192
+ ### Available Message Types (DotCMSUVEAction)
193
+
194
+ | **Type** | **Description** |
195
+ |--------------------------------------|---------------------------------------------------------------------------------------------------|
196
+ | `NAVIGATION_UPDATE` | Notifies the dotCMS editor that the page has changed. |
197
+ | `SET_BOUNDS` | Sends the position of rows, columns, containers, and contentlets to the editor. |
198
+ | `SET_CONTENTLET` | Sends information about the currently hovered contentlet. |
199
+ | `IFRAME_SCROLL` | Informs the editor that the page is being scrolled. |
200
+ | `IFRAME_SCROLL_END` | Notifies the editor that scrolling has stopped. |
201
+ | `PING_EDITOR` | Pings the editor to check if the page is inside the editor. |
202
+ | `INIT_INLINE_EDITING` | Initializes the inline editing mode in the editor. |
203
+ | `COPY_CONTENTLET_INLINE_EDITING` | Opens the "Copy Contentlet" dialog to duplicate and edit a contentlet inline. |
204
+ | `UPDATE_CONTENTLET_INLINE_EDITING` | Triggers the save action for inline-edited contentlets. |
205
+ | `REORDER_MENU` | Triggers the menu reorder action with a specified configuration. |
206
+ | `GET_PAGE_DATA` | Requests the current page information from the editor. |
207
+ | `CLIENT_READY` | Indicates that the client has completed initialization. |
208
+ | `EDIT_CONTENTLET` | Opens the contentlet editing dialog in the editor. |
209
+
210
+ ## Types Reference
211
+
212
+ The SDK provides TypeScript types to assist in development:
213
+
214
+ ### UVE State and Modes
215
+
216
+ ```typescript
217
+ // UVE State Interface
218
+ interface UVEState {
219
+ mode: UVE_MODE;
220
+ persona: string | null;
221
+ variantName: string | null;
222
+ experimentId: string | null;
223
+ publishDate: string | null;
224
+ languageId: string | null;
225
+ }
226
+
227
+ // UVE Mode Enum
228
+ enum UVE_MODE {
229
+ EDIT = 'EDIT_MODE',
230
+ PREVIEW = 'PREVIEW_MODE',
231
+ LIVE = 'LIVE',
232
+ UNKNOWN = 'UNKNOWN'
233
+ }
234
+ ```
235
+
236
+ ### UVE Events
237
+
238
+ ```typescript
239
+ // Event Types Enum
240
+ enum UVEEventType {
241
+ CONTENT_CHANGES = 'changes',
242
+ PAGE_RELOAD = 'page-reload',
243
+ REQUEST_BOUNDS = 'request-bounds',
244
+ IFRAME_SCROLL = 'iframe-scroll',
245
+ CONTENTLET_HOVERED = 'contentlet-hovered'
246
+ }
247
+
248
+ // Event Subscription Interface
249
+ interface UVEEventSubscription {
250
+ unsubscribe: () => void;
251
+ event: string;
252
+ }
253
+ ```
254
+
255
+ ## Examples
256
+
257
+ ### Basic Usage
258
+
259
+ ```typescript
260
+ import { getUVEState, createUVESubscription } from '@dotcms/uve';
261
+ import { UVEEventType, UVE_MODE } from '@dotcms/uve/types';
262
+
263
+ // Check if we're in the editor
264
+ const uveState = getUVEState();
265
+ if (uveState) {
266
+ console.log(`Running in ${uveState.mode} mode`);
267
+
268
+ // Initialize components based on editor state
269
+ if (uveState.mode === UVE_MODE.EDIT) {
270
+ enableEditFeatures();
271
+ }
272
+ }
273
+ ```
274
+
275
+ ### Content Updates
276
+
277
+ ```typescript
278
+ import { createUVESubscription } from '@dotcms/uve';
279
+ import { UVEEventType } from '@dotcms/uve/types';
280
+
281
+ // Subscribe to content changes
282
+ const subscription = createUVESubscription(UVEEventType.CONTENT_CHANGES, (changes) => {
283
+ // Update your UI with the new content
284
+ updateUI(changes);
285
+ });
286
+
287
+ // Clean up when component unmounts
288
+ function cleanup() {
289
+ subscription.unsubscribe();
290
+ }
291
+ ```
292
+
293
+ ### Inline Editing Integration
294
+
295
+ ```typescript
296
+ import { initInlineEditing } from '@dotcms/uve';
297
+
298
+ // Integrate with a block editor component
299
+ function setupBlockEditor(element, contentData) {
300
+ element.addEventListener('click', () => {
301
+ initInlineEditing('BLOCK_EDITOR', {
302
+ inode: contentData.inode,
303
+ language: contentData.languageId,
304
+ contentType: contentData.contentType,
305
+ fieldName: 'body',
306
+ content: contentData.content
307
+ });
308
+ });
309
+ }
310
+ ```
311
+
312
+ ## Contributing
313
+
314
+ We welcome contributions to the UVE SDK! Please follow these steps:
315
+
316
+ 1. Fork the repository
317
+ 2. Create a feature branch (`git checkout -b feature/amazing-feature`)
318
+ 3. Commit your changes (`git commit -m 'Add some amazing feature'`)
319
+ 4. Push to the branch (`git push origin feature/amazing-feature`)
320
+ 5. Open a Pull Request
321
+
322
+ ## License
323
+
324
+ This project is licensed under the MIT License - see the LICENSE file for details.
package/index.cjs.js CHANGED
@@ -93,7 +93,7 @@ function createUVESubscription(eventType, callback) {
93
93
  * @template T
94
94
  * @param {DotCMSUVEMessage<T>} message
95
95
  */
96
- function sendMessageToEditor(message) {
96
+ function sendMessageToUVE(message) {
97
97
  window.parent.postMessage(message, '*');
98
98
  }
99
99
  /**
@@ -106,7 +106,7 @@ function sendMessageToEditor(message) {
106
106
  * @param {Contentlet<T>} contentlet - The contentlet to edit.
107
107
  */
108
108
  function editContentlet(contentlet) {
109
- sendMessageToEditor({
109
+ sendMessageToUVE({
110
110
  action: types.DotCMSUVEAction.EDIT_CONTENTLET,
111
111
  payload: contentlet
112
112
  });
@@ -126,7 +126,7 @@ function reorderMenu(config) {
126
126
  startLevel = 1,
127
127
  depth = 2
128
128
  } = config || {};
129
- sendMessageToEditor({
129
+ sendMessageToUVE({
130
130
  action: types.DotCMSUVEAction.REORDER_MENU,
131
131
  payload: {
132
132
  startLevel,
@@ -150,7 +150,7 @@ function reorderMenu(config) {
150
150
  * ```
151
151
  */
152
152
  function initInlineEditing(type, data) {
153
- sendMessageToEditor({
153
+ sendMessageToUVE({
154
154
  action: types.DotCMSUVEAction.INIT_INLINE_EDITING,
155
155
  payload: {
156
156
  type,
@@ -164,4 +164,4 @@ exports.editContentlet = editContentlet;
164
164
  exports.getUVEState = getUVEState;
165
165
  exports.initInlineEditing = initInlineEditing;
166
166
  exports.reorderMenu = reorderMenu;
167
- exports.sendMessageToEditor = sendMessageToEditor;
167
+ exports.sendMessageToUVE = sendMessageToUVE;
package/index.esm.js CHANGED
@@ -91,7 +91,7 @@ function createUVESubscription(eventType, callback) {
91
91
  * @template T
92
92
  * @param {DotCMSUVEMessage<T>} message
93
93
  */
94
- function sendMessageToEditor(message) {
94
+ function sendMessageToUVE(message) {
95
95
  window.parent.postMessage(message, '*');
96
96
  }
97
97
  /**
@@ -104,7 +104,7 @@ function sendMessageToEditor(message) {
104
104
  * @param {Contentlet<T>} contentlet - The contentlet to edit.
105
105
  */
106
106
  function editContentlet(contentlet) {
107
- sendMessageToEditor({
107
+ sendMessageToUVE({
108
108
  action: DotCMSUVEAction.EDIT_CONTENTLET,
109
109
  payload: contentlet
110
110
  });
@@ -124,7 +124,7 @@ function reorderMenu(config) {
124
124
  startLevel = 1,
125
125
  depth = 2
126
126
  } = config || {};
127
- sendMessageToEditor({
127
+ sendMessageToUVE({
128
128
  action: DotCMSUVEAction.REORDER_MENU,
129
129
  payload: {
130
130
  startLevel,
@@ -148,7 +148,7 @@ function reorderMenu(config) {
148
148
  * ```
149
149
  */
150
150
  function initInlineEditing(type, data) {
151
- sendMessageToEditor({
151
+ sendMessageToUVE({
152
152
  action: DotCMSUVEAction.INIT_INLINE_EDITING,
153
153
  payload: {
154
154
  type,
@@ -157,4 +157,4 @@ function initInlineEditing(type, data) {
157
157
  });
158
158
  }
159
159
 
160
- export { createUVESubscription, editContentlet, getUVEState, initInlineEditing, reorderMenu, sendMessageToEditor };
160
+ export { createUVESubscription, editContentlet, getUVEState, initInlineEditing, reorderMenu, sendMessageToUVE };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dotcms/uve",
3
- "version": "0.0.1-beta.12",
3
+ "version": "0.0.1-beta.14",
4
4
  "description": "Official JavaScript library for interacting with Universal Visual Editor (UVE)",
5
5
  "repository": {
6
6
  "type": "git",
@@ -8,7 +8,7 @@ import { DotCMSInlineEditingPayload, DotCMSInlineEditingType } from '../types/ev
8
8
  * @template T
9
9
  * @param {DotCMSUVEMessage<T>} message
10
10
  */
11
- export declare function sendMessageToEditor<T = unknown>(message: DotCMSUVEMessage<T>): void;
11
+ export declare function sendMessageToUVE<T = unknown>(message: DotCMSUVEMessage<T>): void;
12
12
  /**
13
13
  * You can use this function to edit a contentlet in the editor.
14
14
  *
@@ -1,4 +1,46 @@
1
+ /**
2
+ * Sets up scroll event handlers for the window to notify the editor about scroll events.
3
+ * Adds listeners for both 'scroll' and 'scrollend' events, sending appropriate messages
4
+ * to the editor when these events occur.
5
+ */
1
6
  export declare function scrollHandler(): void;
7
+ /**
8
+ * Adds 'empty-contentlet' class to contentlet elements that have no height.
9
+ * This helps identify and style empty contentlets in the editor view.
10
+ *
11
+ * @remarks
12
+ * The function queries all elements with data-dot-object="contentlet" attribute
13
+ * and checks their clientHeight. If an element has no height (clientHeight = 0),
14
+ * it adds the 'empty-contentlet' class to that element.
15
+ */
2
16
  export declare function addClassToEmptyContentlets(): void;
17
+ /**
18
+ * Registers event handlers for various UVE (Universal Visual Editor) events.
19
+ *
20
+ * This function sets up subscriptions for:
21
+ * - Page reload events that refresh the window
22
+ * - Bounds request events to update editor boundaries
23
+ * - Iframe scroll events to handle smooth scrolling within bounds
24
+ * - Contentlet hover events to notify the editor
25
+ *
26
+ * @remarks
27
+ * For scroll events, the function includes logic to prevent scrolling beyond
28
+ * the top or bottom boundaries of the iframe, which helps maintain proper
29
+ * scroll event handling.
30
+ */
3
31
  export declare function registerUVEEvents(): void;
32
+ /**
33
+ * Notifies the editor that the UVE client is ready to receive messages.
34
+ *
35
+ * This function sends a message to the editor indicating that the client-side
36
+ * initialization is complete and it's ready to handle editor interactions.
37
+ *
38
+ * @remarks
39
+ * This is typically called after all UVE event handlers and DOM listeners
40
+ * have been set up successfully.
41
+ */
4
42
  export declare function setClientIsReady(): void;
43
+ /**
44
+ * Listen for block editor inline event.
45
+ */
46
+ export declare const listenBlockEditorInlineEvent: () => void;