From 18ca35adfe142cf1b794382928c1eb4a89838dd5 Mon Sep 17 00:00:00 2001 From: Rene Pot Date: Sun, 1 Dec 2024 23:40:42 -0800 Subject: [PATCH] docs: prepare for docs merge --- .github/workflows/dhis2-deploy-netlify.yml | 10 +- _redirects | 5 + collections/forms/API.md | 6 +- collections/forms/i18n/en.pot | 4 +- collections/ui/API.md | 436 +++++++++--------- components/alert/API.md | 8 +- components/box/API.md | 2 +- components/button/API.md | 10 +- components/calendar/API.md | 6 +- components/card/API.md | 2 +- components/center/API.md | 4 +- components/checkbox/API.md | 8 +- components/chip/API.md | 6 +- components/cover/API.md | 2 +- components/css/API.md | 10 +- components/divider/API.md | 4 +- components/field/API.md | 6 +- components/file-input/API.md | 30 +- components/help/API.md | 2 +- components/input/API.md | 6 +- components/intersection-detector/API.md | 4 +- components/label/API.md | 2 +- components/layer/API.md | 6 +- components/legend/API.md | 2 +- components/loader/API.md | 8 +- components/logo/API.md | 8 +- components/menu/API.md | 14 +- components/modal/API.md | 10 +- components/node/API.md | 2 +- components/notice-box/API.md | 2 +- components/organisation-unit-tree/API.md | 18 +- components/pagination/API.md | 12 +- components/popover/API.md | 10 +- components/popper/API.md | 6 +- components/radio/API.md | 2 +- components/segmented-control/API.md | 2 +- components/select/API.md | 40 +- components/selector-bar/API.md | 4 +- components/sharing-dialog/API.md | 14 +- components/switch/API.md | 16 +- .../switch/src/switch-field/switch-field.js | 8 +- components/switch/types/index.d.ts | 8 +- components/tab/API.md | 4 +- components/table/API.md | 68 +-- components/tag/API.md | 4 +- components/text-area/API.md | 30 +- .../src/text-area-field/text-area-field.js | 8 +- .../text-area/src/text-area/text-area.js | 8 +- components/text-area/types/index.d.ts | 16 +- components/tooltip/API.md | 10 +- components/transfer/API.md | 26 +- components/user-avatar/API.md | 2 +- docs/docs/_sidebar.md | 2 - docs/docs/components-index.md | 57 --- docs/docs/components/alertbar.md | 4 +- docs/docs/components/button.md | 61 ++- docs/docs/components/calendar-input.md | 2 + docs/docs/components/calendar.md | 184 ++++++++ docs/docs/components/inputfield.md | 6 +- docs/docs/components/menu.md | 2 +- docs/docs/components/modal.md | 2 +- docs/docs/components/notice-box.md | 2 +- docs/docs/components/popover.md | 2 +- docs/docs/components/select.md | 2 +- docs/docs/components/transfer.md | 2 +- docs/docs/help/migrating.md | 2 +- docs/docs/principles-index.md | 10 - docs/docs/principles/forms.md | 20 +- docs/docs/principles/icons.md | 10 +- docs/docs/principles/layout.md | 14 +- docs/docs/recipes/assets/ui-table.png | Bin 0 -> 73307 bytes docs/docs/recipes/recipes.md | 9 - ...-infinite-loading-all-options-selected.jsx | 96 ---- ...r-infinite-loading-all-options-selected.md | 9 +- docs/docs/recipes/ui-table.md | 109 +++++ docs/docusaurus.config.js | 2 +- docs/sidebars.js | 5 +- scripts/generate-api-docs.js | 6 +- 78 files changed, 854 insertions(+), 707 deletions(-) create mode 100644 _redirects delete mode 100644 docs/docs/_sidebar.md delete mode 100644 docs/docs/components-index.md create mode 100644 docs/docs/components/calendar.md delete mode 100644 docs/docs/principles-index.md create mode 100644 docs/docs/recipes/assets/ui-table.png delete mode 100644 docs/docs/recipes/recipes.md delete mode 100644 docs/docs/recipes/transfer-infinite-loading-all-options-selected.jsx create mode 100644 docs/docs/recipes/ui-table.md diff --git a/.github/workflows/dhis2-deploy-netlify.yml b/.github/workflows/dhis2-deploy-netlify.yml index 14210c991f..9c6f7676a3 100644 --- a/.github/workflows/dhis2-deploy-netlify.yml +++ b/.github/workflows/dhis2-deploy-netlify.yml @@ -13,6 +13,8 @@ on: push: branches: - master + paths: + - '/_redirects' # only rebuild and deploy when redirects file changes concurrency: group: ${{ github.workflow}}-${{ github.ref }} @@ -28,10 +30,12 @@ jobs: with: node-version: 20.x - - uses: c-hive/gha-yarn-cache@v1 - - run: yarn install --frozen-lockfile + # We use Netlify only for deploy previews, production docs are hosted at developers.dhis2.org + # Don't build anything, just copy the _redirects file into the dist directory - - run: yarn build + - run: | + mkdir dist + cp _redirects dist/_redirects - uses: nwtgck/actions-netlify@v1.1 with: diff --git a/_redirects b/_redirects new file mode 100644 index 0000000000..e24ec0dfb4 --- /dev/null +++ b/_redirects @@ -0,0 +1,5 @@ +# Redirect legacy ui.dhis2.nu netlify site to the developer portal +/demo https://developers.dhis2.org/demo +/components/* https://developers.dhis2.org/docs/ui/components/:splat +/recipes/* https://developers.dhis2.org/docs/ui/recipes/:splat +/* https://developers.dhis2.org/design-system/:splat \ No newline at end of file diff --git a/collections/forms/API.md b/collections/forms/API.md index fe9090915c..7a9bdf029d 100644 --- a/collections/forms/API.md +++ b/collections/forms/API.md @@ -69,7 +69,7 @@ import { FileInputFieldFF } from '@dhis2/ui' |showValidStatus|boolean|||| |valid|boolean|||| |validationText|string|||| -|value|arrayOf(instanceOf(File)) │ ''|||| +|value|`arrayOf(instanceOf(File)) │ ''`|||| ### InputFieldFF @@ -118,7 +118,7 @@ import { MultiSelectFieldFF } from '@dhis2/ui' |meta|custom|||`meta` props provided by Final Form `Field`| |error|boolean|||| |loading|boolean|||| -|options|arrayOf({
"label": "string",
"value": "string"
})|`[]`||| +|options|`arrayOf({
"label": "string",
"value": "string"
})`|``[]``||| |showLoadingStatus|boolean|||| |showValidStatus|boolean|||| |valid|boolean|||| @@ -169,7 +169,7 @@ import { SingleSelectFieldFF } from '@dhis2/ui' |---|---|---|---|---| |input|custom|||`input` props received from Final Form `Field`| |meta|custom|||`meta` props received from Final Form `Field`| -|options|arrayOf({
"label": "string",
"value": "string"
})||*|| +|options|`arrayOf({
"label": "string",
"value": "string"
})`||*|| |error|boolean|||| |loading|boolean|||| |showLoadingStatus|boolean|||| diff --git a/collections/forms/i18n/en.pot b/collections/forms/i18n/en.pot index bffb1bd6f0..b373318fc2 100644 --- a/collections/forms/i18n/en.pot +++ b/collections/forms/i18n/en.pot @@ -5,8 +5,8 @@ msgstr "" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n != 1)\n" -"POT-Creation-Date: 2024-09-26T14:15:11.940Z\n" -"PO-Revision-Date: 2024-09-26T14:15:11.941Z\n" +"POT-Creation-Date: 2024-11-29T06:54:11.622Z\n" +"PO-Revision-Date: 2024-11-29T06:54:11.622Z\n" msgid "Upload file" msgstr "Upload file" diff --git a/collections/ui/API.md b/collections/ui/API.md index a6dc338e07..a3d40ec4de 100644 --- a/collections/ui/API.md +++ b/collections/ui/API.md @@ -18,10 +18,10 @@ import { AlertBar } from '@dhis2/ui' |children|string|||The message string for the alert| |className|string|||| |critical|custom|||Alert bars with `critical` will not autohide| -|dataTest|string|`'dhis2-uicore-alertbar'`||| -|duration|number|`8000`||How long you want the notification to display, in `ms`, when it's not permanent| +|dataTest|string|``'dhis2-uicore-alertbar'``||| +|duration|number|``8000``||How long you want the notification to display, in `ms`, when it's not permanent| |hidden|boolean|||AlertBar will be hidden on creation when this is set to true| -|icon|custom|`true`||A specific icon to override the default icon in the bar.
If `false` is provided, no icon will be shown.| +|icon|custom|``true``||A specific icon to override the default icon in the bar.
If `false` is provided, no icon will be shown.| |permanent|boolean|||When set, AlertBar will not autohide| |success|custom|||| |warning|custom|||Alert bars with `warning` will not autohide| @@ -45,7 +45,7 @@ import { AlertStack } from '@dhis2/ui' |---|---|---|---|---| |children|node|||| |className|string|||| -|dataTest|string|`'dhis2-uicore-alertstack'`||| +|dataTest|string|``'dhis2-uicore-alertstack'``||| ### Box @@ -65,7 +65,7 @@ import { Box } from '@dhis2/ui' |---|---|---|---|---| |children|node|||| |className|string|||| -|dataTest|string|`'dhis2-uicore-box'`||| +|dataTest|string|``'dhis2-uicore-box'``||| |height|string|||| |marginTop|string|||| |maxHeight|string|||| @@ -93,7 +93,7 @@ import { Button } from '@dhis2/ui' |---|---|---|---|---| |children|node|||Component to render inside the button| |className|string|||A className that will be passed to the ` - - - + + + + + + + + ```jsx
@@ -188,12 +201,10 @@ Buttons are available in different sizes. Use the size that matches the usage gu ### Icon - -
- - -
-
+ ```jsx
@@ -210,9 +221,10 @@ Buttons are available in different sizes. Use the size that matches the usage gu ### State: Disabled - - - + ```jsx @@ -225,9 +237,10 @@ Buttons are available in different sizes. Use the size that matches the usage gu ### State: Loading - - - + ```jsx diff --git a/docs/docs/components/calendar-input.md b/docs/docs/components/calendar-input.md index 9fa231668c..eaf65b1c2d 100644 --- a/docs/docs/components/calendar-input.md +++ b/docs/docs/components/calendar-input.md @@ -4,6 +4,8 @@ title: Calendar Input import { Demo } from '@site/src/components/DemoComponent.jsx' import API from '../../../components/calendar/API.md' +import Tabs from '@theme/Tabs' +import TabItem from '@theme/TabItem' ## Calendar Input diff --git a/docs/docs/components/calendar.md b/docs/docs/components/calendar.md new file mode 100644 index 0000000000..5b1937b98b --- /dev/null +++ b/docs/docs/components/calendar.md @@ -0,0 +1,184 @@ +--- +title: Calendar +--- + +import { Demo } from '@site/src/components/DemoComponent.jsx' +import Tabs from '@theme/Tabs' +import TabItem from '@theme/TabItem' + +import API from '../../../components/calendar/API.md' + +# Calendar + +The Calendar is a component to display a calendar to pick a day in multiple calendar systems, such as: Gregorian, Ethiopic, Nepali and many other calendrical systems. + +The component is built on top of [multi-calendar-dates](https://github.com/dhis2/multi-calendar-dates/tree/beta) which is an internal library to abstract date-related operations (i.e. calendars, period selectors, date math etc..). The library itself relies on the [Temporal proposal](https://tc39.es/proposal-temporal/#sec-temporal-intro). The proposal (currently at Stage 3 draft) aims to improve built-in support for dates and times in browsers, addressing challenges such as support for timezones, DST-safe artithemtic, string serialization and interoperability via standardized formats, and full support for non-Gregorian calendars. + +Here are some sample calendars built with this UI component. Check [StoryBook](pathname:///demo/?path=/story/calendar--with-ethiopic) to play with all the options available for building a Calendar. + +## Ethiopic calendar + +Ethiopic calendar with narrow day names, short day names and localised to English. + +### Narrow day names + + + +To display the calendar with short day names, use the codeblock below. For the narrow day names remove the `weekDayFormat` prop. For the English locale, use the `en` locale and the short `weekDayFormat`. + +```jsx + +``` + +## Nepali calendar + +:::note +Nepali is a custom calendar not natively implemented in Temporal and Nepali locale is not natively supported by browsers' Internationalization standard. We are providing a custom implementation for the calendar, as well as the localised values. The only two locales allowed are: `ne-NP` (nepali) and `en-NP` (nepali transliterated in latin characters). +::: + +Nepali calendar with Napali characters. + + + +```jsx +// Napali + +``` + +Nepali calendar transliterated into latin characters. + + +```jsx +// Nepali transliterated in latin characters + +``` + +## Gregorian calendar + +Gregorian calendar localised in English, Arabic (Tunisia), Arabic (Sudan), Arabic (Iraq) and Amharic. + + + + + + + + + + + + + + + + + + + +To display the calendar with a specific locale, use the codeblock below. Adjust the locale to the desired language. + +```jsx + +``` + +## Other calendars + +Some other calendars: Islamic in Arabic, Indian in English and Persian in Farsi + + + + + + + + + + + + + +Each of the calendars above can be displayed with the following code. + +```jsx + +``` + +:::note +Additionally the component supports a number of other calendars that are not currently used in DHIS2, since they're implemented in the [Temporal API](https://tc39.es/proposal-temporal/)). These other calendars are: `hebrew`, `islamic`, `islamic-umalqura`, `islamic-tbla`, `islamic-civil`, `islamic-rgsa`, `persian`, `ethioaa`, `coptic`, `chinese`, `dangi`, `roc`, `indian`, `buddhist`, `japanese`. +::: + +## Usage + +### When to use + +To display a calendar for the user to pick a day in any supported calendar system, localised to any of the 90+ languages supported by [The Unicode Common Locale Data Repository (CLDR)](https://cldr.unicode.org/index) supported natively in all modern browsers. Supported DHIS2 calendars are: `iso8601` (i.e. the Gregorian calendar common in most of the world),`ethiopic`, `nepali` (custom implementation). + +### When not to use + +- This is just a Day Picker (for now). It does not allow picking periods, date ranges, or date with times. + +## API Reference + + + +## Links + +- [Design document](https://docs.google.com/document/d/19zjyB45oBbqC5KeubaU8E7cw9fGhFc3tOXY0GkzZKqc/edit#) +- [ADR for decision to use Temporal API](https://github.com/dhis2/multi-calendar-dates/blob/beta/doc/architecture/decisions/0002-use-temporal-api-as-the-backbone-for-the-engine.md) +- [multi-calendar-dates](https://github.com/dhis2/multi-calendar-dates) is the library that this component is built on top of. +- [Temporal API standard propsal](https://tc39.es/proposal-temporal/): the standard powering the multi-calendar-dates library diff --git a/docs/docs/components/inputfield.md b/docs/docs/components/inputfield.md index 1b21ca1c65..7204814f41 100644 --- a/docs/docs/components/inputfield.md +++ b/docs/docs/components/inputfield.md @@ -132,12 +132,12 @@ Inputs width should reflect the expected content. ``` - Use a `Textarea` if more than a single sentence of content is expected. -- [`Textarea`](https://ui.dhis2.nu/demo/?path=/story/forms-text-area-text-area-field--no-placeholder-no-value) is available as a standalone component. +- [`Textarea`](pathname:///demo/?path=/story/forms-text-area-text-area-field--no-placeholder-no-value) is available as a standalone component. ### Validation - Validating the type of data entered isn't part of the components themselves. -- Read more about [form handling in DHIS2](../utilities/forms/react-final-form.md). +- Read more about [form handling in DHIS2](/design-system/utilities/forms/react-final-form). ### Read-only @@ -174,7 +174,7 @@ Inputs width should reflect the expected content. - Use an error state if there's a problem with the content of the input, or if it's required but empty. - Don't show an error too early, give the user a chance to finish entering data. -- The error text should help the user fix the problem. Refer to the [error writing guidelines](../principles/content-communication.md) for examples. +- The error text should help the user fix the problem. Refer to the [error writing guidelines](/design-system/principles/content-communication) for examples. ### State: Disabled diff --git a/docs/docs/components/menu.md b/docs/docs/components/menu.md index 3e5411e243..1d26e19586 100644 --- a/docs/docs/components/menu.md +++ b/docs/docs/components/menu.md @@ -32,7 +32,7 @@ A menu gives access to menu items, through a panel that opens from a trigger ele - Menu item labels should be short and easy to understand. - One or two words is often enough to explain the action. -- Refer to the [writing guidelines](../patterns/writing.md) and [glossary](../patterns/glossary.md) for more information about writing useful labels. +- Refer to the [writing guidelines](/design-system/patterns/writing) and [glossary](/design-system/patterns/glossary) for more information about writing useful labels. ##### Order and grouping diff --git a/docs/docs/components/modal.md b/docs/docs/components/modal.md index 041ce0d9d7..5c404f8d7e 100755 --- a/docs/docs/components/modal.md +++ b/docs/docs/components/modal.md @@ -2,7 +2,7 @@ title: Modal --- -import { Demo } from '../../src/components/DemoComponent.jsx' +import { Demo } from '@site/src/components/DemoComponent.jsx' import API from '../../../components/modal/API.md' # Modal diff --git a/docs/docs/components/notice-box.md b/docs/docs/components/notice-box.md index 81633b53d1..cda77868bb 100644 --- a/docs/docs/components/notice-box.md +++ b/docs/docs/components/notice-box.md @@ -111,7 +111,7 @@ A notice box shows important information about a situation. - Notice box titles should be a short summary to help the user scan elements the page. - Notice box text should be clear and informative. Explain what the situation is and, if relevant, offer a solution. -- Check the [writing guidelines](../patterns/writing.md) for more information. +- Check the [writing guidelines](/design-system/patterns/writing) for more information. ## Options diff --git a/docs/docs/components/popover.md b/docs/docs/components/popover.md index 7dec45c7fc..3c32e0ba42 100644 --- a/docs/docs/components/popover.md +++ b/docs/docs/components/popover.md @@ -29,7 +29,7 @@ A popover is used to show more information when a user interacts with a trigger ### Format - A popover doesn't offer any default content styling. -- Include padding between the popover frame and the content inside. The amount of padding depends on the content and density of the interface. Use a [spacer constant](../utilities/constants.md) for a consistent visual experience. +- Include padding between the popover frame and the content inside. The amount of padding depends on the content and density of the interface. Use a [spacer constant](/design-system/utilities/constants) for a consistent visual experience. ## API Reference diff --git a/docs/docs/components/select.md b/docs/docs/components/select.md index fed1bd5b92..6b976a5a42 100644 --- a/docs/docs/components/select.md +++ b/docs/docs/components/select.md @@ -221,7 +221,7 @@ Selects are used to choose one or more items from a list of options. - Use an error state if there's a problem with the chosen option, or if it's required but empty. - Don't show an error too early, give the user a chance to make a choice. -- The error text should help the user fix the problem. Refer to the [error writing guidelines](../principles/content-communication.md) for examples. +- The error text should help the user fix the problem. Refer to the [error writing guidelines](/design-system/principles/content-communication) for examples. ### State: Disabled diff --git a/docs/docs/components/transfer.md b/docs/docs/components/transfer.md index d3648bb982..8383f108fe 100644 --- a/docs/docs/components/transfer.md +++ b/docs/docs/components/transfer.md @@ -150,7 +150,7 @@ The footer component is as follows: - Different types of data will need different loading strategies. - Use a [`Loader`](loading.md) to block interaction if using the transfer while loading is taking place can cause problems. -- A common pattern is loading more options as a user scrolls. See the [Transfer: Infinite Loading recipe](../recipes/transfer-infinite-loading-all-options-selected.md) for more information. +- A common pattern is loading more options as a user scrolls. See the [Transfer: Infinite Loading recipe](/docs/ui/recipes/transfer-infinite-loading-all-options-selected) for more information. ## API Reference diff --git a/docs/docs/help/migrating.md b/docs/docs/help/migrating.md index 4a23d2d5aa..086e384aa5 100644 --- a/docs/docs/help/migrating.md +++ b/docs/docs/help/migrating.md @@ -2,7 +2,7 @@ ## Migrating from < v5 -A number of important changes were introduced in UI version 5.0.0. To see more about these changes and how to migrate from older versions, see [this blog post](https://developers.dhis2.org/blog/ui-5-release) at the developer portal. +A number of important changes were introduced in UI version 5.0.0. To see more about these changes and how to migrate from older versions, see [this blog post](/blog/2020/05/ui-5-release/) at the developer portal. ## Migrating from < v6 diff --git a/docs/docs/principles-index.md b/docs/docs/principles-index.md deleted file mode 100644 index 2b65ddbad4..0000000000 --- a/docs/docs/principles-index.md +++ /dev/null @@ -1,10 +0,0 @@ -# Design Principles - - - -- [Content & Communication](design-system/principles/content-communication) -- [Layout, Spacing, Stacking](design-system/principles/layout) -- [Forms](design-system/principles/forms) -- [Color](design-system/principles/color) -- [Typography](design-system/principles/typography) -- [Icons](design-system/principles/icons) diff --git a/docs/docs/principles/forms.md b/docs/docs/principles/forms.md index 072ec23ba8..ddee20e52a 100644 --- a/docs/docs/principles/forms.md +++ b/docs/docs/principles/forms.md @@ -44,19 +44,19 @@ Provide feedback for users where this is needed. Feedback can be in the form of Forms are made up of different types of inputs. There are various inputs available in the DHIS2 Design System. The documentation for each input covers when it should and should not be used in detail. The table below summarizes the correct usage of each input type. -| Input | Usage | Notes | -| ---------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| [Text](../components/inputfield.md) | Enter free text input | There are multiple types of text input that accept different formats. See the input documentation for details. | -| [Single select](../components/select.md) | Select a single option from a list of many | A select should be used when there are more than 5-7 options instead of radio buttons. | -| [Multi select](../components/select.md) | Select multiple options from a list of many | A select should be used when there are more than 5-7 options instead of checkboxes | -| [Checkbox](../components/checkbox.md) | Single: toggle an option between yes/no, true/false, on/off. Multiple: select multiple options from a list of few. | Single checkboxes must never be a required input as there is no neutral state. Do not use a list of checkboxes for many (7+) options, use a multi select instead. | -| [Radio](../components/radio.md) | Select a single option from a list of few | Do not use a list of radio buttons for many (7+) options, use a single select instead. | -| [File input](../components/fileinput.md) | Select a file | Accepted file type and size should be made clear to the user before uploading | -| [Transfer](../components/transfer.md) | Select and order multiple options from a list of many in different categories. | Use for complex selections that require specific ordering and filtering of categories. | +| Input | Usage | Notes | +| ------------------------------------------- | ------------------------------------------------------------------------------------------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| [Text](/docs/ui/components/inputfield) | Enter free text input | There are multiple types of text input that accept different formats. See the input documentation for details. | +| [Single select](/docs/ui/components/select) | Select a single option from a list of many | A select should be used when there are more than 5-7 options instead of radio buttons. | +| [Multi select](/docs/ui/components/select) | Select multiple options from a list of many | A select should be used when there are more than 5-7 options instead of checkboxes | +| [Checkbox](/docs/ui/components/checkbox) | Single: toggle an option between yes/no, true/false, on/off. Multiple: select multiple options from a list of few. | Single checkboxes must never be a required input as there is no neutral state. Do not use a list of checkboxes for many (7+) options, use a multi select instead. | +| [Radio](/docs/ui/components/radio) | Select a single option from a list of few | Do not use a list of radio buttons for many (7+) options, use a single select instead. | +| [File input](/docs/ui/components/fileinput) | Select a file | Accepted file type and size should be made clear to the user before uploading | +| [Transfer](/docs/ui/components/transfer) | Select and order multiple options from a list of many in different categories. | Use for complex selections that require specific ordering and filtering of categories. | ## Form actions -A form should always have a single, clear primary action. Often this action is 'Submit' or 'Save data'. Make sure the user understands what will happen when they submit a form. Additional options, like 'Save and add another', can be offered, but only a single primary action should be included. Make sure the action button label accurately describes the action. See the [content and communication section](../principles/content-communication.md) for more information of writing effective button labels. +A form should always have a single, clear primary action. Often this action is 'Submit' or 'Save data'. Make sure the user understands what will happen when they submit a form. Additional options, like 'Save and add another', can be offered, but only a single primary action should be included. Make sure the action button label accurately describes the action. See the [content and communication section](/design-system/principles/content-communication) for more information of writing effective button labels. ![example of clear form actions](/images/forms/actions.png) diff --git a/docs/docs/principles/icons.md b/docs/docs/principles/icons.md index ee74540c1b..a1a9660fee 100644 --- a/docs/docs/principles/icons.md +++ b/docs/docs/principles/icons.md @@ -3,15 +3,13 @@ title: Icons --- import { Demo } from '@site/src/components/DemoComponent.jsx' -import {Box } from '@dhis2/ui' # Icons - - -

Storybook demo: List of all icons.

-
-
+ Icons are used to help communicate information to users. Icons can provide supporting information and help users to recognize common ideas, concepts and actions. Icons are visual cues and should not be used alone, they are supporting elements. diff --git a/docs/docs/principles/layout.md b/docs/docs/principles/layout.md index 4eaa9596f7..609e05ebe9 100644 --- a/docs/docs/principles/layout.md +++ b/docs/docs/principles/layout.md @@ -128,12 +128,12 @@ The DHIS2 design system defines fives stack layers: ![example of stacking layers](/images/stacking.png) -| Layer | Description | -| ------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -| Base Application Layer (0–1999) | Contains all components, controls and data for the main application. The application can define its own layering from 0 to 1999. | -| Application Top Layer (2000) | Protected components that always layer over the top of the base application layer. This layer is reserved for controls such as dropdowns and popovers that functionally must always display above the application content. | -| Blocking Layer (3000) | Blocks the application and its controls. Only use for actions that are intentionally interrupting. This layer contains a screen cover that blocks the layers beneath. Child elements, such as [modals](../components/modal.md) or loaders, can be added to this layer. | -| Reserved (4000–9998) | Reserved for future development. | -| Alert Layer (9999) | The top layer is reserved for displaying [alert bars](../components/alertbar.md). Alert bars can contain critical information and so must always be displayed above all other content. | +| Layer | Description | +| ------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Base Application Layer (0–1999) | Contains all components, controls and data for the main application. The application can define its own layering from 0 to 1999. | +| Application Top Layer (2000) | Protected components that always layer over the top of the base application layer. This layer is reserved for controls such as dropdowns and popovers that functionally must always display above the application content. | +| Blocking Layer (3000) | Blocks the application and its controls. Only use for actions that are intentionally interrupting. This layer contains a screen cover that blocks the layers beneath. Child elements, such as [modals](/docs/ui/components/modal) or loaders, can be added to this layer. | +| Reserved (4000–9998) | Reserved for future development. | +| Alert Layer (9999) | The top layer is reserved for displaying [alert bars](/docs/ui/components/alertbar). Alert bars can contain critical information and so must always be displayed above all other content. | Note: the stacking system is not a technical implementation of `z-index` values. See the DHIS2 ui library for implementation details. diff --git a/docs/docs/recipes/assets/ui-table.png b/docs/docs/recipes/assets/ui-table.png new file mode 100644 index 0000000000000000000000000000000000000000..aa52f7cd87849e85c13e2df3c08e1f85da7aa29a GIT binary patch literal 73307 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 b1E&Eh?_O2(!p9?TfPc#J8c*Pl&EEbm(8fpf literal 0 HcmV?d00001 diff --git a/docs/docs/recipes/recipes.md b/docs/docs/recipes/recipes.md deleted file mode 100644 index 691cc91381..0000000000 --- a/docs/docs/recipes/recipes.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: Overview ---- - -# Recipes - -Recipes in this section are guides for composing components from the UI library to achieve a desired result that may be too specific to create a dedicated component for it in the UI library. - -- [**Transfer: Infinite loading - All loaded options are already selected**](recipes/transfer-infinite-loading-all-options-selected) diff --git a/docs/docs/recipes/transfer-infinite-loading-all-options-selected.jsx b/docs/docs/recipes/transfer-infinite-loading-all-options-selected.jsx deleted file mode 100644 index b29e1f3084..0000000000 --- a/docs/docs/recipes/transfer-infinite-loading-all-options-selected.jsx +++ /dev/null @@ -1,96 +0,0 @@ -import { Transfer } from '@dhis2/ui' -import React, { useState, useEffect } from 'react' - -const optionsPool = [ - { value: '0', label: 'Option 0' }, - { value: '1', label: 'Option 1' }, - { value: '2', label: 'Option 2' }, - { value: '3', label: 'Option 3' }, - { value: '4', label: 'Option 4' }, - { value: '5', label: 'Option 5' }, - { value: '6', label: 'Option 6' }, - { value: '7', label: 'Option 7' }, - { value: '8', label: 'Option 8' }, - { value: '9', label: 'Option 9' }, - { value: '10', label: 'Option 10' }, - { value: '11', label: 'Option 11' }, - { value: '12', label: 'Option 12' }, -] - -const pageSize = 5 - -/* - * The page size is: 5 - * To keep the code as small as possible, handling selecting items is not - included - */ -export const InfiniteLoading = () => { - // state for whether the next page's options are being loaded - const [loading, setLoading] = useState(false) - // captures the current page - const [page, setPage] = useState(0) - // all options (incl. available AND selected options) - const [options, setOptions] = useState([]) - // selected options - const [selected] = useState( - // second page is already selected - optionsPool.slice(pageSize, pageSize * 2).map(({ value }) => value) - ) - - const onEndReached = () => { - // do nothing when loading already - if (loading) { - return - } - setPage(page + 1) - } - - // fake fetch request - const fetchOptions = (nextPage) => - new Promise((resolve) => - setTimeout(() => { - const nextOptions = optionsPool.slice( - options.length, - nextPage * pageSize - ) - resolve(nextOptions) - }, 2000) - ) - - const loadNextOptions = async () => { - setLoading(true) - - const nextOptions = await fetchOptions(page) - setOptions([...options, ...nextOptions]) - - setLoading(false) - - const allAlreadySelected = - nextOptions.length !== 0 && - nextOptions.every((nextOption) => { - const { value } = nextOption - return selected.includes(value) - }) - - if (allAlreadySelected) { - onEndReached() - } - } - - useEffect(() => { - // prevent initial call - if (page > 0) { - loadNextOptions() - } - }, [page]) - - return ( - null /* noop */} - onEndReached={onEndReached} - /> - ) -} diff --git a/docs/docs/recipes/transfer-infinite-loading-all-options-selected.md b/docs/docs/recipes/transfer-infinite-loading-all-options-selected.md index be1eb654c2..5450ff6342 100644 --- a/docs/docs/recipes/transfer-infinite-loading-all-options-selected.md +++ b/docs/docs/recipes/transfer-infinite-loading-all-options-selected.md @@ -2,7 +2,7 @@ title: Transfer – infinite loading --- -import { InfiniteLoading } from './transfer-infinite-loading-all-options-selected.jsx' +import { Demo } from '@site/src/components/DemoComponent.jsx' # Transfer: Infinite loading - All loaded options are already selected @@ -366,6 +366,11 @@ export const InfiniteLoading = () => { } ``` +### Demo + This is how it looks: - + diff --git a/docs/docs/recipes/ui-table.md b/docs/docs/recipes/ui-table.md new file mode 100644 index 0000000000..88ce75de7f --- /dev/null +++ b/docs/docs/recipes/ui-table.md @@ -0,0 +1,109 @@ +--- +id: ui-table +title: How to add a Table component +--- + +Follow this quick guide to add a `Table` component to your application using the [DHIS2 UI Library](/design-system). + +## Prerequisites + +This guide assumes that you're developing an application using the [DHIS2 Application Platform](/docs/app-platform/getting-started) and its tools. To know more or get started, please follow this tutorial: [Environment Setup](/docs/tutorials/setup-env). + +## 1. Import `Table` + +First, let's import the [Table](pathname:///demo/?path=/docs/table--static-layout) component as well as its child components: + +```js +import { + Table, + TableBody, + TableCell, + TableCellHead, + TableHead, + TableRow, + TableRowHead, +} from '@dhis2/ui' +``` + +## 2. Use components + +In this example, we are using the [DHIS2 App Runtime](/docs/app-runtime/hooks/useDataQuery) to fetch and display the `programs` resource from the DHIS2 Web API (as you can see in the `query` object defined in the `src/App.js` file below). + +See the highlighted lines of code - this is how we can represent the programs data in a `Table` component: + +```jsx {43-60} title="src/App.js" +import { useDataQuery } from '@dhis2/app-runtime' +import React from 'react' +import classes from './App.module.css' +import { + Table, + TableBody, + TableCell, + TableCellHead, + TableHead, + TableRow, + TableRowHead, +} from '@dhis2/ui' + +const query = { + results: { + resource: 'programs', + params: { + pageSize: 5, + fields: ['id', 'created', 'displayName'], + }, + }, +} + +const MyApp = () => { + const { loading, error, data } = useDataQuery(query) + + if (error) { + return ERROR: {error.message} + } + + if (loading) { + return Loading... + } + + return ( +

+
+

Programs Table

+ + + + Name + Created + + + + {data.results.programs.map( + ({ id, created, displayName }) => ( + + {displayName} + {created} + + ) + )} + +
+
+
+ ) +} + +export default MyApp +``` + +## 3. Check your browser + +In your browser, you should be able to see the following `Table` 👇 + +![](./assets/ui-table.png) + +### More examples? + +Please check the [UI Library documentation](pathname:///demo/?path=/docs//table--static-layout) for more examples and a list of demos as well as **code snippets** that let you easily copy and paste into your application! 👌🏽 + +--- diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js index f85bc00232..e6869ff3a2 100644 --- a/docs/docusaurus.config.js +++ b/docs/docusaurus.config.js @@ -11,7 +11,7 @@ const config = { tagline: 'React Components for DHIS2 Web Applications', url: 'https://ui.dhis2.nu', baseUrl: '/', - onBrokenLinks: 'throw', + onBrokenLinks: 'warn', onBrokenMarkdownLinks: 'warn', favicon: 'img/favicon.ico', organizationName: 'dhis2', // Usually your GitHub org/user name. diff --git a/docs/sidebars.js b/docs/sidebars.js index 13f2e954c7..24e799a7bb 100644 --- a/docs/sidebars.js +++ b/docs/sidebars.js @@ -82,10 +82,7 @@ const sidebars = { ], }, { - Recipes: [ - 'recipes/recipes', - 'recipes/transfer-infinite-loading-all-options-selected', - ], + Recipes: ['recipes/transfer-infinite-loading-all-options-selected'], }, { Help: [ diff --git a/scripts/generate-api-docs.js b/scripts/generate-api-docs.js index 7b340caa4c..ad78810712 100755 --- a/scripts/generate-api-docs.js +++ b/scripts/generate-api-docs.js @@ -116,7 +116,11 @@ import { ${toDisplayName} } from '@dhis2/ui' description, type, } of props) { - table += `|${name}|${type}|${defaultValue}|${required}|${description}|\n` + table += `|${name}|${ + type.includes('arrayOf') ? `\`${type}\`` : type + }|${ + defaultValue ? `\`${defaultValue}\`` : '' + }|${required}|${description}|\n` } }