From 194a5643e881d5fd3ffce8dc3b123b1c4cb8e1d4 Mon Sep 17 00:00:00 2001 From: Juan-Lucas Date: Wed, 7 May 2025 15:00:55 +0200 Subject: [PATCH] chore(use-case): add documentation for the wrex use case CMS-1088 --- .../assets/use-case-wrex-toolbar-item.png | Bin 0 -> 15839 bytes docs/javascript/use-cases.md | 221 ++++++++++++++++++ 2 files changed, 221 insertions(+) create mode 100644 docs/javascript/assets/use-case-wrex-toolbar-item.png diff --git a/docs/javascript/assets/use-case-wrex-toolbar-item.png b/docs/javascript/assets/use-case-wrex-toolbar-item.png new file mode 100644 index 0000000000000000000000000000000000000000..c29a7123fb82b57834df9e2e5b79b8f801ec879f GIT binary patch literal 15839 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 literal 0 HcmV?d00001 diff --git a/docs/javascript/use-cases.md b/docs/javascript/use-cases.md index 5823a3f..b409cfd 100644 --- a/docs/javascript/use-cases.md +++ b/docs/javascript/use-cases.md @@ -191,6 +191,227 @@ window.lumapps.customize(({ targets, components, render, placement, constants }) }); ``` +## Add new button on the rich text editor toolbar (widget RTE, article or event) + +![Use case wrex button](./assets/use-case-wrex-toolbar-item.png "Use case wrex button") + +In this use case, you'll probably want to have a new button on the rich text editor toolbar allowing you to insert specific elements from an external provider. + +```js +window.lumapps.customize( + ({ targets, components, render, placement, constants, state }) => { + const { + DropdownSection, + DropdownItem, + RawHTML, + FlexBox, + Button, + List, + ListItem, + } = components; + const { Orientation, Size, Emphasis, Alignment } = constants; + + /** Fetch the items from your external provider + * You can use our api wrapper(https://lumapps.github.io/customizations-api-doc/javascript/api.html#api-1) + */ + const fetchItems = async () => { + const fetchedItems = new Promise((resolve) => { + setTimeout(() => { + resolve([ + { id: "54", title: "First item", src: "https://lumapps.com" }, + { id: "57", title: "Second item", src: "https://picsum.photos/" }, + ]); + }, 500); + }); + return fetchedItems; + }; + + /** Callback on search button click + * - Fetch external items + * - Render those items on a list + */ + async function onItemsSearch() { + const context = state.get("context"); + const input = document.querySelector("input#items-search-input"); + const searchQuery = input.value; + + // Trigger the loading state of the dialog while we fetch items + context.openWrexConfigurationDialog({ + isLoading: true, + }); + + const items = await fetchItems(); + + const { componentToRender } = setupConfiguration({ items, searchQuery }); + + await context.openWrexConfigurationDialog({ + componentToRender, + isLoading: false, + }); + } + + /** Callback when the user select an item from the list + * - Update the attributes on the element we want to insert + * - Rerender the list to display the selected state on the item + */ + const onItemPickChange = (item, configurationData) => { + const context = state.get("context"); + + context.setWrexIframeAttributes({ + src: item.src, + provider: "my-website", + }); + + const { componentToRender } = setupConfiguration({ + ...configurationData, + selectedItemId: item.id, + }); + + context.openWrexConfigurationDialog({ + componentToRender, + }); + }; + + /** + * Return the components to render on the configuration dialog + * - Display only an input + a search button without fetched items + * - Display the items in a list when available + */ + function setupConfiguration(configurationData = {}) { + const { items, searchQuery, selectedItemId } = configurationData; + const componentsToDisplay = [ + FlexBox({ + children: [ + // Note: this allow to display an input the same way as other place of the product + RawHTML({ + html: ` +
+
+
+ +
+
+
`, + }), + Button({ + children: "Search", + emphasis: Emphasis.low, + onClick: onItemsSearch, + }), + ], + orientation: Orientation.horizontal, + gap: Size.regular, + hAlign: Alignment.center, + }), + ]; + + if (items && items.length > 0) { + const listItems = []; + + for (const item of items) { + listItems.push( + ListItem({ + children: item.title, + size: Size.tiny, + onItemSelected: () => onItemPickChange(item, configurationData), + isSelected: selectedItemId === item.id, + }) + ); + } + + componentsToDisplay.push( + List({ + children: listItems, + }) + ); + } + + const componentToRender = FlexBox({ + children: componentsToDisplay, + orientation: Orientation.vertical, + gap: Size.huge, + }); + + return { componentToRender }; + } + + /** Callback when the user click on our video custom button */ + const onVideoButtonClick = async (context) => { + state.set("context", context); + const { componentToRender } = setupConfiguration(); + + context.openWrexConfigurationDialog({ + componentToRender, + }); + }; + + render({ + placement: placement.UNDER, + target: targets.WREX_TOOLBAR, + toRenderWithContext: (context) => { + return DropdownSection({ + children: [ + DropdownItem({ + title: "My videos", + icon: "video-account", + onClick: () => onVideoButtonClick(context), + }), + ], + }); + }, + }); + } +); +``` +### Use case information + +**openWrexConfigurationDialog** Function + +Open the configuration dialog and allows you to define his content. + +| Parameter | Description | Is required? | Option type | Default Value | +|-----------|------|----------|---------|-------------| +| `configuration` | Configuration options | Yes | object | `{}` | +| `configuration.componentToRender` | The component to render inside the dialog | Yes | Component | `undefined` | +| `configuration.isLoading` | Whether the dialog should be in a loading state | No | boolean | `false` | + +**setWrexIframeAttributes** Function + +Allows you to define the data of the iframe to insert + +*Note: calling this function will not insert an iframe, the insertion is done through the configuration dialog* + +| Parameter | Description | Is required? | Option type | Default Value | +|-----------|------|----------|---------|-------------| +| `attributes` | Configuration options | Yes | object | `{}` | +| `attributes.src` | The url of the page to embed | Yes | string | `undefined` | +| `attributes.srcDoc` | The html content of the iframe | No | string | `undefined` | +| `attributes.title` | The title of the iframe, used for accessibility | No | string | `undefined` | +| `attributes.provider` | The name of the provider of the iframe, used to identify an iframe | No | string | `undefined` | + +**setWrexImageAttributes** Function + +Allows you to define the data of the image to insert + +*Note: calling this function will not insert an image, the insertion is done through the configuration dialog* + +| Parameter | Description | Is required? | Option type | Default Value | +|-----------|------|----------|---------|-------------| +| `attributes` | Configuration options | Yes | object | `{}` | +| `attributes.title` | The caption of the image group | No | string | `undefined` | +| `attributes.images` | The image(s) to display | Yes | Image[] | `[]` | + +**Image** Object + +| Parameter | Description | Is required? | Option type | Default Value | +|-----------|------|----------|---------|-------------| +| `src` | The image url | Yes | string | `''` | +| `alt` | The image alt text, should describe the image for accessibility purpose | No | string | `''` | +| `height` | The image height (in px) | No | integer | `undefined` | +| `width` | The image width (in px) | No | integer | `undefined` | + ## Disabling bookmarks Bookmarks can be disabled in order to avoid them to be displayed by adding the following line of JavaScript to your site.