From 9414d77276189dc522e1ea56db85b35286158e1e Mon Sep 17 00:00:00 2001 From: luvi Date: Sun, 12 Feb 2023 23:47:07 +0000 Subject: [PATCH] [ADD] web: add core components documentation Those components were added during the Owl rewrite of the webclient that happened in 16.0. Unfortunately, there was still no documentation for them. This commits fixes that by adding documentation for the Notebook and the Colorlist components. closes odoo/documentation#3585 X-original-commit: 7a9d807bccb158bd3bea22bdbe66332f32b54ac5 Signed-off-by: Antoine Vandevenne (anv) Signed-off-by: Luca Vitali --- .../reference/frontend/owl_components.rst | 196 ++++++++++++++++++ .../frontend/owl_components/notebook.png | Bin 0 -> 13038 bytes 2 files changed, 196 insertions(+) create mode 100644 content/developer/reference/frontend/owl_components/notebook.png diff --git a/content/developer/reference/frontend/owl_components.rst b/content/developer/reference/frontend/owl_components.rst index ad2f31016..71f7994fe 100644 --- a/content/developer/reference/frontend/owl_components.rst +++ b/content/developer/reference/frontend/owl_components.rst @@ -154,8 +154,12 @@ checkboxes or datepickers. This page explains how to use these generic component - a swiper component to perform actions on touch swipe * - :ref:`CheckBox ` - a simple checkbox component with a label next to it + * - :ref:`ColorList ` + - a list of colors to choose from * - :ref:`Dropdown ` - full-featured dropdown + * - :ref:`Notebook ` + - a component to navigate between pages using tabs * - :ref:`Pager ` - a small component to handle pagination * - :ref:`SelectMenu ` @@ -331,6 +335,85 @@ Props - `boolean` - if true, the checkbox is disabled, otherwise it is enabled +.. _frontend/owl/colorlist: + +ColorList +--------- + +Location +~~~~~~~~ + +`@web/core/colorlist/colorlist` + +Description +~~~~~~~~~~~ + +The ColorList let you choose a color from a predefined list. By default, the component displays the current +selected color, and is not expandable until the `canToggle` props is present. Different props can change its +behavior, to always expand the list, or make it act as a toggler once it is clicked, to display the list of +available colors until a choice is selected. + +Props +~~~~~ + +.. list-table:: + :widths: 20 20 60 + :header-rows: 1 + + * - Name + - Type + - Description + * - `canToggle` + - `boolean` + - optional. Whether the colorlist can expand the list on click + * - `colors` + - `array` + - list of colors to display in the component. Each color has a unique `id` + * - `forceExpanded` + - `boolean` + - optional. If true, the list is always expanded + * - `isExpanded` + - `boolean` + - optional. If true, the list is expanded by default + * - `onColorSelected` + - `function` + - callback executed once a color is selected + * - `selectedColor` + - `number` + - optional. The color `id` that is selected + +Color `id`'s are the following: + +.. list-table:: + :header-rows: 1 + + * - Id + - Color + * - `0` + - `No color` + * - `1` + - `Red` + * - `2` + - `Orange` + * - `3` + - `Yellow` + * - `4` + - `Light blue` + * - `5` + - `Dark purple` + * - `6` + - `Salmon pink` + * - `7` + - `Medium blue` + * - `8` + - `Dark blue` + * - `9` + - `Fuchsia` + * - `12` + - `Green` + * - `11` + - `Purple` + .. _frontend/owl/dropdown: Dropdown @@ -607,6 +690,119 @@ In this example, we recursively call a template to display a tree-like structure +.. _frontend/owl/notebook: + +Notebook +-------- + +Location +~~~~~~~~ + +`@web/core/notebook/notebook` + +Description +~~~~~~~~~~~ + +The Notebook is made to display multiple pages in a tabbed interface. Tabs can be located +at the top of the element to display horizontally, or at the left for a vertical layout. + +There are two ways to define your Notebook pages to instanciate, either by using `slot`'s, +or by passing a dedicated `props`. + +Props +~~~~~ + +.. list-table:: + :widths: 20 20 60 + :header-rows: 1 + + * - Name + - Type + - Description + * - `anchors` + - `object` + - optional. Allow anchors navigation to elements inside tabs that are not visible. + * - `className` + - `string` + - optional. Classname set on the root of the component. + * - `defaultPage` + - `string` + - optional. Page `id` to display by default. + * - `orientation` + - `string` + - optional. Whether tabs direction is `horizontal` or `vertical`. + * - `onPageUpdate` + - `function` + - optional. Callback executed once the page has changed. + * - `pages` + - `array` + - optional. Contain the list of `page`'s to populate from a template. + +.. example:: + + The first approach is to set the pages in the slots of the component. + + .. code-block:: xml + + + +

My First Page

+

It's time to build Owl components. Did you read the documentation?

+
+ +

Wise owl's silent flight. Through the moonlit forest deep, guides my path to code

+
+
+ + The other way to define your pages is by passing the props. This can be useful if some pages share + the same structure. Create first a component for each page template that you may use. + + .. code-block:: javascript + + import { Notebook } from "@web/core/notebook/notebook"; + + class MyTemplateComponent extends owl.Component { + static template = owl.tags.xml` +

+

+ `; + } + + class MyComponent extends owl.Component { + get pages() { + return [ + { + Component: MyTemplateComponent, + title: "Page 1", + props: { + title: "My First Page", + text: "This page is not visible", + }, + }, + { + Component: MyTemplateComponent, + id: "page_2", + title: "Page 2", + props: { + title: "My second page", + text: "You're at the right place!", + }, + }, + ] + } + } + MyComponent.template = owl.tags.xml` + + `; + + Both examples are shown here: + + .. image:: owl_components/notebook.png + :width: 400 px + :alt: Examples with vertical and horizontal layout + :align: center + + .. _frontend/pager: Pager diff --git a/content/developer/reference/frontend/owl_components/notebook.png b/content/developer/reference/frontend/owl_components/notebook.png new file mode 100644 index 0000000000000000000000000000000000000000..6a621a0364fd8c110d21915d71ff7e03bd14bd06 GIT binary patch literal 13038 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 literal 0 HcmV?d00001