From 8448783004bb1d576319ff919aa9470cb9446dfa Mon Sep 17 00:00:00 2001 From: Dennis Kigen Date: Thu, 7 Dec 2023 12:52:06 +0300 Subject: [PATCH] (chore) Remove old docs site --- .github/pull_request_template.md | 13 +- README.md | 6 +- docs/.nojekyll | 0 docs/CNAME | 1 - docs/README.md | 95 ----- docs/_sidebar.md | 36 -- docs/getting_started/contributing.md | 113 ------ docs/getting_started/prerequisites.md | 50 --- .../getting_started/release_and_deployment.md | 23 -- docs/getting_started/setup.md | 130 ------- docs/getting_started/tour.md | 57 --- docs/index.html | 14 - docs/logo.png | Bin 36764 -> 0 bytes docs/logo.xcf | Bin 94039 -> 0 bytes docs/main/application.png | Bin 33178 -> 0 bytes docs/main/breadcrumbs.md | 49 --- docs/main/carbon.md | 72 ---- docs/main/config.md | 343 ------------------ docs/main/creating_a_microfrontend.md | 133 ------- docs/main/data.md | 157 -------- docs/main/dates.md | 34 -- docs/main/deps.md | 25 -- docs/main/distribution.md | 87 ----- docs/main/distro_setup.png | Bin 74393 -> 0 bytes docs/main/extensions.md | 212 ----------- docs/main/faq.md | 115 ------ docs/main/forms.md | 1 - docs/main/map.md | 67 ---- docs/main/state.md | 85 ----- docs/main/translations.md | 27 -- docs/main/upgrade_3_to_4.md | 193 ---------- docs/offline/dynamic_offline_data.md | 190 ---------- docs/offline/dynamic_offline_data_flow.drawio | 1 - docs/offline/dynamic_offline_data_flow.png | Bin 68344 -> 0 bytes docs/offline/offline.md | 129 ------- docs/offline/openmrs-offline-state.drawio | 1 - docs/offline/openmrs-offline-state.png | Bin 100969 -> 0 bytes docs/openmrs.svg | Bin 1538 -> 0 bytes docs/under_the_hood/architecture.md | 32 -- docs/under_the_hood/architecture.png | Bin 36702 -> 0 bytes docs/under_the_hood/extensions.md | 69 ---- docs/under_the_hood/migration_guide.md | 217 ----------- docs/under_the_hood/squad_devops.md | 19 - docs/under_the_hood/tooling.md | 61 ---- docs/under_the_hood/translations.md | 26 -- package.json | 2 - packages/apps/esm-devtools-app/README.md | 5 - .../src/module-config/module-config.ts | 4 +- packages/framework/esm-framework/docs/API.md | 6 +- .../esm-react-utils/src/ExtensionSlot.tsx | 2 +- yarn.lock | 70 ---- 51 files changed, 15 insertions(+), 2957 deletions(-) delete mode 100644 docs/.nojekyll delete mode 100644 docs/CNAME delete mode 100644 docs/README.md delete mode 100644 docs/_sidebar.md delete mode 100644 docs/getting_started/contributing.md delete mode 100644 docs/getting_started/prerequisites.md delete mode 100644 docs/getting_started/release_and_deployment.md delete mode 100644 docs/getting_started/setup.md delete mode 100644 docs/getting_started/tour.md delete mode 100644 docs/index.html delete mode 100644 docs/logo.png delete mode 100644 docs/logo.xcf delete mode 100644 docs/main/application.png delete mode 100644 docs/main/breadcrumbs.md delete mode 100644 docs/main/carbon.md delete mode 100644 docs/main/config.md delete mode 100644 docs/main/creating_a_microfrontend.md delete mode 100644 docs/main/data.md delete mode 100644 docs/main/dates.md delete mode 100644 docs/main/deps.md delete mode 100644 docs/main/distribution.md delete mode 100644 docs/main/distro_setup.png delete mode 100644 docs/main/extensions.md delete mode 100644 docs/main/faq.md delete mode 100644 docs/main/forms.md delete mode 100644 docs/main/map.md delete mode 100644 docs/main/state.md delete mode 100644 docs/main/translations.md delete mode 100644 docs/main/upgrade_3_to_4.md delete mode 100644 docs/offline/dynamic_offline_data.md delete mode 100644 docs/offline/dynamic_offline_data_flow.drawio delete mode 100644 docs/offline/dynamic_offline_data_flow.png delete mode 100644 docs/offline/offline.md delete mode 100644 docs/offline/openmrs-offline-state.drawio delete mode 100644 docs/offline/openmrs-offline-state.png delete mode 100644 docs/openmrs.svg delete mode 100644 docs/under_the_hood/architecture.md delete mode 100644 docs/under_the_hood/architecture.png delete mode 100644 docs/under_the_hood/extensions.md delete mode 100644 docs/under_the_hood/migration_guide.md delete mode 100644 docs/under_the_hood/squad_devops.md delete mode 100644 docs/under_the_hood/tooling.md delete mode 100644 docs/under_the_hood/translations.md diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 68c173baf..400c2d2b0 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,10 +1,13 @@ -## Requirements -- [ ] This PR has a title that briefly describes the work done including the ticket number. If there is a ticket, make sure your PR title includes a [conventional commit](https://o3-dev.docs.openmrs.org/#/getting_started/contributing?id=your-pr-title-should-indicate-the-type-of-change-it-is) label. See existing PR titles for inspiration. +# Requirements -#### For changes to apps -- [ ] My work conforms to the [**OpenMRS 3.0 Styleguide**](https://om.rs/styleguide) and **design documentation**. +- [ ] This PR has a title that briefly describes the work done including the ticket number. Ensure your PR title includes a [conventional commit](https://o3-docs.openmrs.org/docs/frontend-modules/contributing#contributing-guidelines) label (such as `feat`, `fix`, or `chore`, among others). See existing PR titles for inspiration. + +## For changes to apps + +- [ ] My work conforms to the [**O3 Styleguide**](https://om.rs/styleguide) and [**design documentation**](https://om.rs/o3ui). + +## If applicable -#### If applicable - [ ] My work includes tests or is validated by existing tests. - [ ] I have updated the [esm-framework mock](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/mock.tsx) to reflect any API changes I have made. diff --git a/README.md b/README.md index 09539cd0b..1f34a76cd 100644 --- a/README.md +++ b/README.md @@ -158,8 +158,7 @@ yarn link path/to/openmrs-esm-core/packages/framework/esm-api ``` This satisfies the build tooling, but we must do one more step to get the frontend -to load these dependencies at runtime -(see docs on [Runtime Dependencies](https://o3-dev.docs.openmrs.org/#/main/deps)). +to load these dependencies at runtime. Here, there are two options: @@ -175,9 +174,6 @@ Then run your patient chart dev server as usual, with `yarn start`. #### Method 2: Using import map overrides -Read the [dev documentation](https://o3-dev.docs.openmrs.org/#/getting_started/setup?id=import-map-overrides) -about import map overrides if you have not already. - In `esm-core`, start the app shell with `yarn run:shell`. Then, in the patient chart repository, `cd` into whatever packages you are working on and run `yarn serve` from there. Then use the import map override tool in the browser to tell the frontend to load your local patient chart packages. #### Once it's working diff --git a/docs/.nojekyll b/docs/.nojekyll deleted file mode 100644 index e69de29bb..000000000 diff --git a/docs/CNAME b/docs/CNAME deleted file mode 100644 index a47300bba..000000000 --- a/docs/CNAME +++ /dev/null @@ -1 +0,0 @@ -o3-dev.docs.openmrs.org \ No newline at end of file diff --git a/docs/README.md b/docs/README.md deleted file mode 100644 index f113d1aa4..000000000 --- a/docs/README.md +++ /dev/null @@ -1,95 +0,0 @@ -# OpenMRS Frontend 3.0 for Developers - - - -:link: **Link to this guide: [om.rs/dev3docs](https://om.rs/dev3docs)** :link: - -This documentation is intended to enable developers to develop and deploy -custom UI features for OpenMRS. - -Visit the -[Wiki page](https://wiki.openmrs.org/display/projects/OpenMRS+3.0%3A+A+Frontend+Framework+that+enables+collaboration+and+better+User+Experience) -if you haven't already. It provides a high-level -introduction to the project and all of the relevant links. - -You should first read the -[Implementer Documentation](https://wiki.openmrs.org/pages/viewpage.action?pageId=224527013), -which provides some conceptual orientation as well as instructions for deployment -and configuring. - -Once you've read that, click [Prerequisite knowledge](getting_started/prerequisites.md) -here or in the left sidebar to begin, or check out some videos below. - -> Note: This documentation tends to assume that the developer is using React, -but this is not a requirement of OpenMRS Frontend 3.0. Indeed, the entire purpose -of choosing a microfrontends-based architecture was to allow collaboration between -different teams using different technologies. If you are developing -frontend modules in a technology other than React, please tell us so in the -[#openmrs3](https://openmrs.slack.com/archives/CHP5QAE5R) channel on Slack. -We'd love to work with you to make the development experience as smooth as possible, -and take the opportunity to expand OpenMRS Frontend 3.0 support for different -frameworks. - -## Videos 🎥 - -These videos are available to show how you can develop new frontend functionalities using the OpenMRS 3.0 setup. - -### Talks - -These are videos which have been recorded for some talks and conference sessions. - -- [Why Microfrontends?](https://youtu.be/XDIIuM7Ffas) - -### Spotlight Videos - -These are videos below 5 minutes showing small dedicated things. - -- [Tooling](https://youtu.be/KDC8DwPWwjc) -- [Breadcrumbs](https://youtu.be/Rq4QGSF9r2M) -- [Extensions Introduction](https://youtu.be/crdEL91oBGs) -- [Internationalization](https://youtu.be/1pLUi47BIBo) -- [How to see UX & component guidance in Zeplin designs](https://www.youtube.com/watch?v=SjluEGDH4LU&feature=youtu.be&ab_channel=OpenMRS) - -### Tutorials - -These are more extensive videos with focus on showing how to develop new frontend modules. - -- [Part 1: OpenMRS SPA Extensions Tutorial: About our Frontend Module Architecture & How to Use Extensions](https://iu.mediaspace.kaltura.com/media/t/1_e7kvnx9t?st=702) -- [Part 2: OpenMRS SPA Extensions Workshop: Practical Session on our MFE Architecture & How to Use Extensions](https://iu.mediaspace.kaltura.com/media/t/1_iaq63mfd?st=282) - - [OMRS SPA Workshop practice tasks](https://github.com/openmrs/openmrs-esm-testresults/tree/feature/workshop) - - [OMRS SPA Workshop practice solutions](https://github.com/openmrs/openmrs-esm-testresults/tree/feature/workshop-solutions) - - -### Others - -- [Development Overview](https://youtu.be/aIi1t5o7agI) -- [Patient Banner Implementation](https://youtu.be/3AoxdCjXbys) -- [Attachments Demo](https://youtu.be/Vm6sWV55nBQ) -- [Registration Configuration](https://youtu.be/PA9IiNgHAq8) diff --git a/docs/_sidebar.md b/docs/_sidebar.md deleted file mode 100644 index 629bdb954..000000000 --- a/docs/_sidebar.md +++ /dev/null @@ -1,36 +0,0 @@ - - -- Getting started - - [Prerequisite Knowledge](/getting_started/prerequisites.md) - - [Setup](/getting_started/setup.md) - - [Contributing](/getting_started/contributing.md) - - [Release and Deployment](/getting_started/release_and_deployment.md) - - [Tour of a Frontend Module](/getting_started/tour.md) -- Main concepts - - [Map of the Project](/main/map.md) - - [Creating a Frontend Module](/main/creating_a_microfrontend.md) - - [Design Conventions](/main/carbon.md) - - [Dependencies](/main/deps.md) - - [Retrieving and Posting Data](/main/data.md) - - [Dates](/main/dates.md) - - [Extension System](/main/extensions.md) - - [Configuration System](/main/config.md) - - [Sharing State](/main/state.md) - - [Translations](/main/translations.md) - - [Breadcrumbs](/main/breadcrumbs.md) - - [Creating a Distribution](/main/distribution.md) - - [Upgrade 3 to 4](/main/upgrade_3_to_4.md) - - [FAQ](/main/faq.md) - - [Framework API Reference](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md) -- Offline - - [Offline Mode](/offline/offline.md) - - [Dynamic Offline Data](/offline/dynamic_offline_data.md) -- Under the hood - - [Architecture Overview](/under_the_hood/architecture.md) - - [Tooling](/under_the_hood/tooling.md) - - [Translations](/under_the_hood/translations.md) - - [Extensions System](/under_the_hood/extensions.md) - - [Squad DevOps and CI](/under_the_hood/squad_devops.md) - - [Migration Guide](/under_the_hood/migration_guide.md) - diff --git a/docs/getting_started/contributing.md b/docs/getting_started/contributing.md deleted file mode 100644 index 78cc8c03e..000000000 --- a/docs/getting_started/contributing.md +++ /dev/null @@ -1,113 +0,0 @@ -# Contributing - -You can build the UI features that you need for your implementation. -However, it can be more fun and fruitful to collaborate on frontend -modules that can be useful to organizations around the world. - -## Getting Connected - -If you're interested in contributing, you'll need to take the following steps. - -- Get access to [OpenMRS Jira](https://issues.openmrs.org). - If you don't have access, raise a request at the - [Help Desk](https://wiki.openmrs.org/display/~helpdesk). - Wait at least 24 hours for the request to get approved; you will receive an - email upon approval. Once approved, take a look at all the - [frontend module-related issues](https://issues.openmrs.org/projects/MF/issues). - Good first issues are filed under the - [intro](https://issues.openmrs.org/browse/MF-508?jql=project%20%3D%20MF%20AND%20resolution%20%3D%20Unresolved%20AND%20labels%20%3D%22intro%22%20ORDER%20BY%20priority%20DESC%2C%20updated%20DESC) - label. -- Join our [Slack Channel](https://openmrs.slack.com/archives/CHP5QAE5R) and introduce yourself. -You will first need to [create an OpenMRS Slack account](https://slack.openmrs.org/) if you don't have one. - -## Guidelines for Contributing - -#### Pull requests (PRs) are not required to correspond to a ticket. - -If there is a ticket for the PR, it should be clearly named and linked in the PR. - -#### Push additional commits. - -Pull requests are allowed (and encouraged) to contain more than one commit. -Those commits are squashed when merged into master/main. - -#### Do not close a PR and recreate a new one with the same code. - -If you have opened a PR for some work and a reviewer has requested some changes, -do not open a new PR with the updates and close the old one. This makes things -very hard for reviewers. - -#### Read and fill out the PR template. - -That's all. - -#### Work incrementally. - -Smaller PRs are easier to read and validate. Opening multiple PRs for the same ticket -is excellent if those PRs represent different pieces or stages of work relating -to that ticket. - -#### Do not increase the scope of a PR after it has been reviewed. - -If your code has been reviewed, don't push a bunch more code that isn't related to -the review. Fixups are fine, but new features should have their own PRs. -Remember—small PRs are easier to review anyway! - -#### Your first PR to a codebase should be small. - -Get a feel for what the reviewer expects before submitting a PR with a large amount of code in it. - -#### Your PR title should indicate the type of change it is. - -We use PR titles to determine version bumps. PR titles should start with something -in parentheses, or the word `BREAKING`. Examples of good PR titles: - -- "(docs) Add to contributing docs" -- "(fix) Console error when visiting allergies page" -- "(feat) Add search bar to medications widget" -- "(refactor) Tidy the dashboard implementation" -- "BREAKING: New left nav system" - -Common prefixes include the above, and `chore`, `style`, `perf`, and `test`. - -The versioning bump to indicate is based on the -[OpenMRS Frontend 3.0 versioning conventions](https://github.com/openmrs/openmrs-rfc-frontend/blob/master/text/0022-versions.md). -*Don't worry if you aren't sure which one you should use!* Your reviewer should make -sure your PR has an appropriate one. - -## Guidelines for Reviewing - -- Encourage feedback as both an author and reviewer. -- Encourage as many contributors to engage in deep and meaningful contribution. -- Be sensitive to the varying experience levels of OpenMRS contributors. -- Avoid gatekeeping, which includes over-emphasizing to contributors how they're failing to follow the correct process. -- Encourage code ownership, including reviewing changes to the code and projects you've contributed to. -- Provide detailed and helpful feedback to contributors, including using GitHub's - [suggestion feature](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/reviewing-changes-in-pull-requests/incorporating-feedback-in-your-pull-request) - to help the contributor know how to make the needed changes. - ---- - -*The above guidelines were established in [RFC-20](https://github.com/openmrs/openmrs-rfc-frontend/blob/master/text/0020-contributing-guidelines.md).* - - -## Code Conventions - -### Filenames - -Above all, maintain consistency with the repository you are working in. - -Our general conventions are these: - -- The React component `FooBar` should be called `foo-bar.tsx` or `foo-bar.component.tsx`. -- The style file for `FooBar` should be called `foo-bar.[s]css` or `foo-bar.style.[s]css`. -- `FooBar` should not handle API calls itself, rather it should use functions that fetch - and clean the data as needed. Those functions should be in a file called `foo-bar.resource.ts`. -- The tests for `FooBar` should be in a file called `foo-bar.test.tsx`. -- Avoid calling things "utils." It is a meaningless name. Group the functions by what - they are for. If the function is only used in one place, just put it in the file - where it is used. - -### Naming things - -Use the [Naming Cheatsheet](https://github.com/kettanaito/naming-cheatsheet#readme). diff --git a/docs/getting_started/prerequisites.md b/docs/getting_started/prerequisites.md deleted file mode 100644 index 8706f03df..000000000 --- a/docs/getting_started/prerequisites.md +++ /dev/null @@ -1,50 +0,0 @@ -# Prerequisites - -If you haven't already done so: Please first see [the Implementer Documentation](https://wiki.openmrs.org/x/pQJiDQ), which provides some conceptual orientation as well as instructions for deployment and configuring. - -Before developing OpenMRS Frontend 3.0, you should be familiar with the following technologies. - -## Javascript - -Knowing Javascript is prerequisite to everything else. Consider -[Introduction to Javascript](https://www.codecademy.com/learn/introduction-to-javascript) and [The Modern JavaScript Tutorial](https://javascript.info/). - -## JavaScript Tooling - -You'll want to understand the basics of [npm](https://docs.npmjs.com/), -including the command-line interface (run `npm help`), [package.json](https://docs.npmjs.com/cli/v7/configuring-npm/package-json), [`npx`](https://docs.npmjs.com/cli/v7/commands/npx), and know what [node](https://www.w3schools.com/nodejs/) is. - -If the repository you're looking at has a `yarn.lock` file, then it uses `yarn`, -and you'll want to read the [Yarn docs](https://classic.yarnpkg.com/en/docs/getting-started). -Otherwise it uses `npm`. Yarn and npm are exclusive of each other within a repository. - -## React - -You should know everything from [React Main Concepts](https://reactjs.org/docs/hello-world.html), -and sections 1-5 of [React Hooks](https://reactjs.org/docs/hooks-intro.html). - -If you're new to React, use a tutorial or interactive learner's guide. -The [Learn React Docs](https://beta.reactjs.org/learn) is an excellent resource. -You can also try the -[React Tutorial](https://reactjs.org/tutorial/tutorial.html) -or the video-based [React JS Crash Course 2021](https://www.youtube.com/watch?v=w7ejDZ8SWv8). - -Take your time. This is a lot of material. The better you understand it, the more -easily you will be able to develop high-quality frontend modules (and other React applications). - -### React Hooks -As mentioned above, you should definitely review sections 1-5 of [React Hooks](https://reactjs.org/docs/hooks-intro.html). Still looking for more videos? Some of our favorite videos are from when hooks first came out in 2018 - 2019. :clapper:[90% Cleaner React with Hooks](https://www.youtube.com/watch?v=wXLf18DsV-I), and -:clapper:[React Today and Tomorrow](https://youtu.be/dpw9EHDh2bM?t=1047). These do a good job of showing the difference before and after hooks. But before watching, you should have some experience with JavaScript and React in general to appreciate just how cool hooks are. :smile: - -## TypeScript - -You can get started with Typescript pretty quickly. If you're new to it, -please read [TypeScript in 5 Minutes](https://www.typescriptlang.org/docs/handbook/typescript-in-5-minutes.html). - -## Git - -It is imperative that you keep your code in a version control system. OpenMRS uses -[Git](https://git-scm.com/). You should know the basics of using Git and GitHub. -The website [Learn Git Branching](https://learngitbranching.js.org/) and the video -[Git and GitHub for Beginners](https://www.youtube.com/watch?v=RGOj5yH7evk) -are excellent resources. diff --git a/docs/getting_started/release_and_deployment.md b/docs/getting_started/release_and_deployment.md deleted file mode 100644 index 7380fd3e4..000000000 --- a/docs/getting_started/release_and_deployment.md +++ /dev/null @@ -1,23 +0,0 @@ -# Continuous Integration and Releases - - - -Distributions use frontend modules which are published as packages in NPM. -Those distributions can refer to frontend module versions by number (e.g. `3.1.0`) -or by tag (e.g. `latest`). - -GitHub Actions is used to publish frontend modules from the `main` branch -to the `next` tag. -You can see the published versions of each frontend module on npmjs.com. See for example -[@openmrs/esm-login-app](https://www.npmjs.com/package/@openmrs/esm-login-app?activeTab=versions). -The [OpenMRS CI server](https://dev3.openmrs.org/openmrs/spa/login) -always shows the `next` version of all frontend modules (i.e., the latest from the -`main` branch). - -You can version a frontend module by creating a release in GitHub. This will trigger -GitHub Actions to publish a new version of the package with the `latest` tag. -Write release notes that explain what's happened since the last release. See -[an example](https://github.com/openmrs/openmrs-esm-core/releases/tag/v3.1.2). - -## Subscribe to Community Release Announcements -To follow the latest O3 release announcements, join [OpenMRS Slack](https://slack.openmrs.org) and subscribe to the channel [#openmrs3-releaseannouncements](https://openmrs.slack.com/archives/C052500RS0L). diff --git a/docs/getting_started/setup.md b/docs/getting_started/setup.md deleted file mode 100644 index 6fb4dd43a..000000000 --- a/docs/getting_started/setup.md +++ /dev/null @@ -1,130 +0,0 @@ -# Setup - - -## Prerequisities - -:bangbang: This setup guide is for individuals who want to develop on the O3 Framework. **You will need to set up an O3 instance first.** *If you do not already have an O3 Instance set up, please **first** follow the guidance at: https://om.rs/o3setup.* - -You must have git, node, npm, and yarn installed. The versions required are -- The Node [Active LTS version](https://github.com/nodejs/release#release-schedule) -- The latest stable version of NPM -- The latest stable version of Yarn - -See [prerequisites](./prerequisites.md) if any of these technologies -are unfamiliar to you. -Consider using [nvm](https://github.com/nvm-sh/nvm#node-version-manager---) -to manage your node version. - -Note that as a frontend project, we use Node for compiling and bundling frontend code, -not for running the backend or server. - -## Working on a frontend module - -Clone the repository of interest. For this example we'll use -:sparkles:**[openmrs-esm-template-app](https://github.com/openmrs/openmrs-esm-template-app)**:sparkles:. - -> Note that this repository is a good starting point for creating a new -frontend module, and also contains lots of information explaining the -different pieces of frontend modules, along with the -[Tour of a Frontend Module](./tour.md). - -```bash -git clone https://github.com/openmrs/openmrs-esm-template-app.git -``` - -Then change to the cloned repository's directory and install its dependencies. - -```bash -cd openmrs-esm-template-app -yarn -``` - -Then you're ready to start a dev server! The command to run will depend on -the repository you checked out. Read the README for that repository to find -out what command you should run. In the case of `openmrs-esm-template-app`, -use `yarn start` to start the server. - -```bash -yarn start -``` - -This command will run a "script" from the `package.json` -file. Take a look at the `scripts` section of that file to find out what -the command actually does. - -Once the frontend server starts up, you should be able to access the template -app at http://localhost:8080/openmrs/spa/hello. -You might be redirected to the log in page to log in first. - -> :bulb: You run almost any command with `--help` to learn more about it. -> This includes `yarn start --help`. - -### Troubleshooting - -If you're running Linux, you may see the following error the first time you run -a a dev server: `Error: ENOSPC: System limit for number of file watchers reached`. -If that happens, you need to increase the system limit for the number of file -watchers. See -[this StackOverflow answer](https://stackoverflow.com/a/55763478/1464495). - -## Import map overrides - -If you'd like to work on multiple frontend modules that aren't in a monorepo together, -or if you'd like to run a frontend module you are developing locally on a -deployed server somewhere, you can use import map overrides, -which is made available through the OpenMRS DevTools. - -> If you'd like to understand how Import Map Overrides works, check out - the [documentation](https://github.com/joeldenning/import-map-overrides). - If you'd just like to use it, continue reading here. - -To enable the OpenMRS DevTools, open your browser's JavaScript console and execute - -```javascript -localStorage.setItem('openmrs:devtools', true) -``` - -After refreshing the page, a little box should appear in the lower-right hand corner of the page. -Clicking this box opens the OpenMRS DevTools. - -In the frontend module you want to develop, run - -```bash -# if the OpenMRS frontend you're looking at uses HTTP (e.g. a local server) -yarn serve -# if the OpenMRS frontend you're looking at uses HTTPS (e.g. dev3.openmrs.org) -yarn serve --https -``` - -> Substitute `npm run serve` if the project uses NPM, or `narn serve` if you use - [narn](https://github.com/joeldenning/narn). - -The protocol of the application must match the protocol of the locally-served frontend module. - -This command will serve the frontend module and tell you the port where it is serving, -as well as showing you the filenames that are being served. You can then use -the import map overrides panel to override the existing import map -entry, or add your frontend module as a new entry. - -For example, if you run `yarn serve` in -[esm-login-app](https://github.com/openmrs/openmrs-esm-core/tree/main/packages/apps/esm-login-app), -and if it says something like `Project is running at http://localhost:8080/`, -as well as something like `asset openmrs-esm-login-app.js`, then in the import -map overrides you can click on the entry for `openmrs-esm-login-app` and give it the value - -``` -//localhost:8081/openmrs-esm-login-app.js -``` - -You can also simply type `8081` and Import Map Overrides will infer the URL above. - -> **Note**: The name of the entrypoint file (such as `openmrs-esm-login-app.js`) is set - by the `browser` parameter of the `package.json`. - -### Note on using HTTPS - -If you're using import map overrides on a server that uses HTTPS, you must use `serve` with the -`--https` flag. Your browser will probably complain about the certificate. -You will need to convince it -that there is no security risk. In Chrome, enabling the "allow insecure localhost" flag -(chrome://flags/#allow-insecure-localhost) can help. diff --git a/docs/getting_started/tour.md b/docs/getting_started/tour.md deleted file mode 100644 index 1f1a5beda..000000000 --- a/docs/getting_started/tour.md +++ /dev/null @@ -1,57 +0,0 @@ -# Tour of a Frontend Module - -Let's explore the contents of -[openmrs-esm-template-app](https://github.com/openmrs/openmrs-esm-template-app). - -## Tooling 🧰 - -OpenMRS uses [SWC](https://swc.rs/) as it's transpiler. This means that it is responsible for translating the code we write into Javascript the browser understands. E.g., we can use TypeScript, JSC, and ES2020, even though most browsers don't support those features. - -There are a number of configuration files at the project level. These -can generally be treated as boilerplate. The important ones are - -- `.github/workflows`: Configures [GitHub Actions](https://docs.github.com/en/actions). - See the [Actions panel](https://github.com/openmrs/openmrs-esm-template-app/actions). -- `.husky`: Husky runs validations when committing. -- `.eslintrc`: ESLint is a linter for ECMAScript, a.k.a. JavaScript -- `jest.config.js`: Jest is the test runner. In this file you'll see: - - Jest is configured to use SWC (via @swc/jest) to transform code so that Jest, like the - browser, can understand it. The contents of `node_modules` are not transformed, - except the `@openmrs` packages, so that tests can make use of the generic mock - for `@openmrs/esm-framework`. - - The `moduleNameMapper` entry transforms `import` - statements in the code, whether to mock them or make them understandable to Jest. - Default mocks are provided for everything in `@openmrs/esm-framework`. Note that many - of these mocked functions have no implementation or return `undefined`, which may - not work for your tests—you may have to override their implementations. -- `prettier.config.js`: Prettier is an auto-formatter. This ensures that you never have - to worry about correct indentation, optional punctuation, or line breaks. Configuration - is optional. -- `tsconfig.json`: This is the TypeScript configuration. In general, it should not - vary much between projects. -- `webpack.config.js`: Webpack is what builds all the code (using SWC) into - a "bundle" in the `dist/` directory which can be read by the browser. This single - line is usually all you'll need in the config file. If you need to add something, - you can simply override the properties of that default object. - -## The package 📂 - -`package.json`, as you should be [aware](./prerequisites.md), defines dependencies and -metadata for the frontend module (which is a -[package](https://docs.npmjs.com/about-packages-and-modules)). - -Looking inside, we find a bunch of metadata. Most of it can be understood with reference -to the [`package.json` docs](https://docs.npmjs.com/cli/v7/configuring-npm/package-json). -- The `name` of our frontend module ends in `-app` so that it will be recognized as a frontend module - by the app shell and the build tooling. -- The `browser` entry is the entrypoint of the bundle. -- The `main` entry is the entrypoint of the source code. -- We use `dependencies`, `peerDependencies`, and `devDependencies`. For information - about how we use them please see [Build-time and runtime dependencies](../main/deps.md). - -## The application 💻 - -Now open -[`src/index.ts`](https://github.com/openmrs/openmrs-esm-template-app/blob/main/src/index.ts). -The rest of the tour is in the comments in that file and the components -it uses. diff --git a/docs/index.html b/docs/index.html deleted file mode 100644 index a559a50d7..000000000 --- a/docs/index.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - OpenMRS Frontend 3.0 Documentation for Developers - - - - These docs have been moved.. If you are not redirected automatically, follow this link to the updated docs. - - diff --git a/docs/logo.png b/docs/logo.png deleted file mode 100644 index fc5b3b2b649fa15e3ea2bd57824ae95a16bc5f86..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36764 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
  • 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 Mp*41NSoB>Bh3_OlOvo>zPZ0$)qT-+b{| zbsM^FmP(kzOZI|e`}F%J`h@xjl5!tZ!z)$Mk%U5=6!SeQ9hx<3K zp25iLnf)UCN{09rz@P5>!`CZe-16hVXKRr4m5jH{913Pp?7t84?U*;#)c?AnIqgYS zH#Mn&B79C;T`i6m-(;;CTWN-AEq5Q|sedt%rMil4+z8L7Oummd*n&)Jkz&6Mr{vcH z5$5OH&s>C%Yq-ZO8(EGG?hO(~#CLITU*EMvXzYHJg^-cDYR1P-_~fnp+&&RHE;&vC zJByoQ&tdy&_oOS(Rx(fP1^qKYur1DQR*~oC-Aw7h!3aRW*6r;cHFzljbe3CQ!B=b? zURY=<yR&L% zIXdRPK$D!1@3`dtI_IIR80DkP;(0FY=86K=GA>8hi+mxAk8d@whfe!8oFVo-)I@H@ zQ?>d+M4Q?wZ3E`Ps&RF(+oO1NX1tTZuSECNyC>J8z0#@9hUhuNTTs|2WcxEroMbWn z0<1L5AmjkRoIclZ&Z8TkqnWzfy!!3zv>Tn`Z;g7u{y4uXpV3Z2++CZrmw__V(Yh#p zV*B5TU5$2(GPR1Oe!z!W{fd~9C@EY-=$BynuZ7gz*SNwv0kES{mq`Qj5=+|C84pWc z9-g39V@{&Y2|PZze6qzi(L&N`(mtXYFR`?!YnaiSbL>B(`>wV6QH!BV-J=L-t7LsA z@6M!G-dzYH^zBpmC>VDKSNN<3ZQO*h!lk1OGy$ℑMu`kW}m|hUkJmor+->-o9VC zjoiFjL7)ihJLMN%-7sprdn|XJgcEVXK7?(LgrUf-#3{>W64a>#mClKe z{ry?Lh3Yh~IB-7$>xi8(M+2kbz7%d{A$h%A-ncSDbqF2vP!h#9Q|IY-yDmOablO~n z|A+|w1Up=)pej?FFZ7{AMbyo}Za%8~k3vu1DIUVu&59$RoT(;vdA-{>h=(%k#2)do zo0p%j$Stlt^zrQgriW(BL<^xd^|z(n5UUrqAk7j z2w~@XVUHgM#F?)P#GlB5YSLQd zWeRuX4U-15j%^~hal?wU|J|gOj9IH!U>uM2**J;_+}bm^3}}=G=>H-Y@N@!2`H95m zvaP50dLle&^_1Kd79ZxMk6RKW+HaG`gTIJ5@JLNRJ>XY2o$%1F#wBEcvB5^&wMT3ZBV&+%Jjf}8E zuIOud6d|>4mlLcoc|(hUE?VI?SS21F)m?uYurxlEA9itB|H~GTpL)l~3S;zl32i|1 zV}D58Rx)LGx-XyV>vp)L;u(%7NL~;$yV44~Xl2?NS~(?Mc}=>_$t2uL!$5P9)AT>#NB@BuPI-v_QaGx(Z^XOk5~{x7k_Q{d4Dz^) z_+~czi5O~CAxRaSPTEbXb`e_PstEDDb`PYqO4&MczAxR;xsD}<gyA!34-dgVXRGvRucfvao(zgejbXz1y1zQ*qj^D3vqyik z;oIs$c6Wh5Dzm7quI+JK_QNbIeh}#@ySqfMft8(~qM|{naoB4y-cB+kD-h`*Hh|`w zNl@N*?Y#>h6dkbK+G_RK?1(|!^;f>gA*np_Fnm3`I7y3*a5Qs<&sUWHohxtEn2s=@ zGefAAjgL|Fmum}8)6ra2$C+k8^Npd6aSw`=*r@;6DgAr~8XV?OTkKl3-$Ocq0KoU1 zF%_dQXudg`eZbd`Val3(7Dc^;)M=Mcmy>EQF+)Fmt@E|N%VOXF=Ucseq77Idp8wmV zC7Wlrmyj4UA~LmYp!Ey@^0~=mCY?i5U6d#u-)61fj6l+kk=A&Tky>l{n|HW){Zchk z$4cXe*4Mq54Ydw0iRGx#s|x%3y{B2UFFnSmy4Qv54yRWHp5(Yh5rg%Fri41 zGke^w_Zi-vRDnB`woxk#E?R{)=L`2^v}g-w*TsajsbmFz4Q!YN1p4$P)vq8ESywP{ zz#wPesL8V{Kiu-760jN&lM{$&lYER78jm9HV$U8$9UENah3@yz70pU$@=@>6DaTLx zq?eAOZln)0#wy9_`XAivO`2(#M%E<5D>n)o7bZ{6-m$mHlt?O52g0^7hAkb12pn!h)3xX zHTB$Nu>nom$%>ovfTE<$LYd+w(|R5IkAT!_m^UL?oZGd9q(7nE9#y3@iqjz*`p?cK z%kspL4?;n;>d(z>r45sx?y7wQ*L`FGVu5>zG$GOwYj-D^>jsS6c9#w zXbGJLakU!=8mw|WR?`e4XNSZep^}iBA^zu%fQV`VrmBZ=tT!zuvRa1pPEu2sQMBIj zbomS;#m1AgG^>HN?zj`mHyX2{AN8;dLKluw#X#WlNS3Ur>xLTqMHEDYGDWl9aKiZ5 z8(S%3=0*d4`I1jh2|J6OWm%1fw|mXr)6E65B=i79- z^YfDyeh;TW!&tp6ZXA3`weQj$bz(kfxp}lcQ`U?+&$I!9m`VkK(5tceQkaU^cnwm!o32 zWX5NoH!SWJg_zi#^JWP|r6Z;r(c(GRY>05~gCBBI_t#nveIz6^i00Ovm33YbB5ld#MhpzB^k6J-ZJBqp!Sf!xDNa2#?{9t05q#ox;0~WJIxS zUOwolgxGN5;R@z4Ho>9jd9eFm@Tb3%A|J?xxBcVL&^O3HpsA2O_1BQnQDB)dV2p;vEr`a@4~w~wTRsS02Uc&TEs?9@;GluU5;&?( zsce*IgrouUJz$L)xcIg+j2P!8IeItAV)qwafDP@|_=*TD@WuqsNsbMb>aituUihws z_Y!1=czTD_$~Lvv1DmyHYAie%ajp1!H*!jy#mC6spK@mD@~6It_3}@+<>)_bb}cxD zG$n3J<-q}<@a>s|Nr%p}h6%gOU)_|<@_m{*VQr}cB#QDut9|4_AL*adSBwomh*XtW zHo3RQAuyVvMdR{AJX2bo5o2prH+AqXQ2kjE)t$tzs{V8h1h~==) zOkEEk_pG^1J@$KrkP$$qqA3{TYB+auP}Z;-@$$@7F~^FXR5YRcpMaR8_!?;(aQ}wX zs5sMAIKb?CYeNp+zF-3wyW_)8Sfmt8oAoIuL~QtO_6GR*^1-l#*4%Dtyo8i#F}s~d zg)eo^EK+hOkWMLk<*+y8^an63nti!mVqkrxq2DzNqEOwj5)?^yO+E~RotFY*nGRsf zFL7OX-`h!w(!j1C=cd)IzN2@&c0O(+Ow2)5JmDKr4m7?^Ts3*r{$eB)94fAoeV()exf}dR8HfJ#uSex|aG)O7@reki!{(h@Pn+;`rXEPjuUh+#cYmU? zM26nl?cc^$vTLQ;%%(8D-oU~q6I-60X*;!HSE11ZsC8efv>Tf*gGm{YYUeG^=11|a z2j}*(qCWjd7d0D*#c=rKDk}@d| z+w2W7#7^MDiOO64(6|fRG4Vg5p2zv#Sh?Ub_^zn$&U&w0ZFl*akQyw(8PYeb_`l1yiDr;C z@bP<|tr+Dk=t{;R3D6ktF-#cZL-20m_4Pd3y%<{UJCO;O4TxdsP-tD3GNFZ@8$|-i zuQ6`{%715KCGvjG#Z*V{`VHhJxN5FV-I%W5)Y$bq82hl2<}3_N8f+}rQewl!nx^X< zcaWdn2|{w!QA*=c%SP^)PKd(RulFZ-f~FXs65z7s2`w4XHKs6D&sujxxE~oe6OK9v+Mi1|m+s z$-3(*V)|D;bGs67he#7*vAt!=6e>WCJ+mqE-m6YhadNg#l~TkNtKR!j3m+gG~-~hZ)nu$ zxA0O|+lLh^mP~WWq-OX9eWzQy=h;<0P_9#f_68f1z0RQLbIcH6Lp}GhOBo7B9^dU! zzS4uGk4S^6=fg}qO$lqUGPzzS-Ux4LVd3ly4j@8_sz7b9DJl{0bt_cVhr#@&94NbY z=1St_eL8H1oaKz~IebMf4=~b2Fj|%_dZ85rI{^hLz5?ntzypsmPllt7Uu!HjJIHTu zd0)=DACAHf-xL$G=m$rz1x6(kRv~Sb2S}5vbUBo1`lSsCg!-0vIZ|4p81tfD7&U%J z89dFZ)aT@@cBm97ZALGG@ig{38VCgG#o9r{+Tc8vv=1~OytbC+oau$MI@h^Av*X7| zF-cm&y!?DU8-r9(FDBiH)OtLE$W7^SeQiLJJoVnLA434-4nHBth-^GfVLjW!5(gnM zL8ZL3*#p98B|SOeuLnV8XHv@AL$RI|NSoZz_dW;GB~6+=`ml@FU?#~wWD`-(^Zc;_GBeMu0NJ&>RQaT+BKer{$7qHNOf+YVKA@7ATdF}Zka^71ZkRtl( zzN_aqX6!JeXw!y_LTQf7W=7``ZR(M`{>k_@m^8aG zw3cgJJnHf3)u{h_*o1*a02Prx=Z+7-@a|Pk3)kmZ->s2!Ne(vp>(H9(;=+&AiG3q* zgiT3#pp-Ws69HY})~_{dchJSs?3MMc;0T6M(471(1v42x1evU~dBM+8e1@G9l@Q*c zRiXn=!+WA4|70B(xbT5|TMX-|^B|{v3X?AVd&yEPsXz-OcGTHUxf0yr3It@xL7m(G zQAp(naN)MHQ%7zs4D&BEu04O!#-3eaQ~8MM^H3lBiRNpy)#dX9Y4C<{dyd?V2v8vc zU3rgiUq|F)i^b{m|!GZg5 z4%se2>-l(wcv1b`t4C+eJCemvDL%0sT+-}QLX=VWl;gjM4#?BK2#eC;1f+}bSfIc` zQZCzb0dN;i1rWG4i5$`mAE#j+-EtU@w^AX%F-L#hSZZ(||HhR#H#zAB!JgDp>gwz6 zps&AE5xt~iZeR$4{=T&D&Fyto)K^5?Cg!Y5-FuLfDW%54?sh^Be60Xy^FW{kZr{I< zH@s=?_%;dRJI5k9LKA9?^3@VJRHiU_MAu=lRl(hB`6?)Fa3wGQ3$z=Nx-8))u)SNQ|1eIt^OpOO9| zXlz5~F(EZ~e=G$Y>0K@)${kE*Eo%|S=8{q{+f#RjmHd*3r+gcWeflHE?kO9$nY@}wd> zjt8lytvl~|J<@wWvNN@EJu1?o5*8Un?aA_WX$}dqc6kwCv4wS`u z5eyK>lTQE_yS2+B47kmTO7wJC?8=B*1wt`+NpZmGly zeQ&b$zT2swk)L}LiiJsCAJ?Hxog*pFhG2~~WU^1^`*=)Ct{)HQgyy971a1*2va8)o^ z`JlQJIPOh`A{gbI$##}HWm)@qVcLLu{WGsC(m<8b$|g=QbwsIKd+n!`dNxG}jdSg1 zvxWVVssXqyukvgcgt!_!MJv}nC*xmze=DOvk*bV zBI_i5K(NTdl8f>YdO7a7RKz6qv8=t|l}_!LV@}A9t`jtFJqMR`(EoAj_yZd%HWg zfTqS2Ld#WZ?t$t%t++o#r`*Y7U4j&_vj+!H6$fX_^X&%J){yCaZAtHx83wkFhpwP0 z>HVb91fYxJH-CFQavF5%xj@t|?87Y`o~PW{q3f{rth!PQ1?XLcnEBO>*kOyS_xs zGiY|A&#Q?Cb_~BV^$~t!>tL3@xXSnJKMjPXb<<@kXhng^3&fl=qDhLObCJw~bAk(S zX_E{QtE6>88?fDT2T;+wRJi;e1z&z!6VC|{2}$k@hO=$0Aev*Cd=BTEUxHH1zmbHT zQMnnRUa_Db%2j<*5zky03nc=zAFdCU5LpAZr;i^`tDso)AZG3ez1qHxujYRz6aJr*2{&Sx@*(Hy z#>TxOV$Rr%^Fewuvwc%2J$=&KiYX;0bt}Qcbe2&DAwP8+ zFPd=KEia>VuEN6 z18+5j;MNgKDc(B48sjywO-ZUG4mS<)X z5U=fjcYeZm=z05ZEZNJ(g-IEA_5&u4wV6El%E!f$-0gODMC6;*l(@Vu1n1wd|D;6# zhragQd(3>s)F8IAQJcYU^_$uc)kCpH!RrH>ku;d6haa zmGe;)&D>B-=to3MY{m8Gw};@7RNrrGXrI_hSJ1zX9`n#Yr7){Y`uo2r4Gn{2DY!Fy zFzqt9PPvg^i-Jpr23=32(TU$Z2RL!))FiK>JNT37b*4I^bhY`~3-1YHjL!#U@OzwW zLN=HgZ0L^&y8ZocJhezhS*Ao-ln(j7;Mu;qIKO%n(~|NY%<`Ks$-StbKYyl%o^O3x za6e(&AGl>u|9ehF4qrjAg0X@FftSg2qOYk&d!-!>yg(9ehmLh!GpA4HN&Hi|!9}nZ zA-J?ETe<}>IxM3C(GUa{UefrJWbW~#>$v^a61V=!aEVrjtMOn}rj`4HkwO;xIf-O1 zt+R<2M*hrC*ILQ!N@5}+{M)m&Q&!k^pVLsdGVVXQZ-GN7wLD&1cOsIHUkf7&{==1) zE$B0bHOK8Pb6Kj&ySRMO{>wB#MqugTA;UDM(p67|!THBluzF-!!??HX@%aO{JA?LRBIRBpD!m` zP+(v0tR0ksI$x^zk^l$bau(+~OD>ADO~FDg^|&1t_mvy=Bp z@}rWvd{g?j#6I*wdt-l39GL4qx()-P2U`dK%>`X5z;X+2At{z?3DV(TM7Cw+On`^K zzyGQ)jWX{}*olpYhjE}?`s{?{ZEZe55y>ZeK#3kSWG|^~f(>j3o!wFuU-XtvSJHgE zLJog(3tj5zH}z6~G7+8Pqx9DLLa0c3S5>3z@R0?@7bP#oZiqhdgGF$K2#rNHvuw)7 z%c7kU^q&Fzy6tsRUw0L=*zcyXk2w0G))NAX;GUwM#dcjrNLyu`Jcw@7yJqzFkLuOS z$eKNM?&KK(^Y`%DP}ov!Fm&E6J&q^ycQT9Q_FRqdI&WJ|HuG^_DOSjtF!@=Gm^~!{ zmzTH4^InYWPfD4ddh5e!%W&RXd)*G6G;B z+AaI6dOQByQQ@VWE9hgbErK3qOc3w;_*juli*_2zSqXXXP|E&IoU_1i*4-hHaBXaj*V7|9?oI`s_S zi0&C;lcMCJ5RERKs5E8Ipk zO0mOH_uA|+=g|cG$P?>$9-Q>OpA~<>qz72w<`2i_IZNKNgwfHYYg53 zblU2ii+brVx*1=Fo?%LqiQqhe0hczVPs@bAmrV!^tc*3E;0E4sw`K_(f;HMM&TrKo zTB1qn>Kjh@q*&_&wEv2!eelpQwrs{{vhQDBTpa%4n0DvU(%3{*V7*G_3fZb+wA$fs zZkw92o!x}p5mjx+-J$&cXTEe49wJcBH=uHpHJcX2?YNz|CM)B09#6|IXts9F z1~VO%J_3)gmq)V=3r#838k3a23n1&e9q-PSK`|cQH%OW3IG*LyRwY9yq1qG%a z$E>suMt7ma{1~1D8GwxxhF$V3A>Yo!kjgwY5%`cRDegCm`?FQ>ZKeB()LXT|k%laD zvS^K7r^_bza4Khg%f^nWE^UAjIWU9UVy%MeSs=QL2`SJ zm8)>bD0E!VkFR%U>?c9Y>ncKi`z~m=4+jyl;=U$NyeJXmV6%6=WhmdOTV4Sf1YYc0vToS z^uqm!+G>j~$w^X1^k4Ms`T=D;>K~;(jB+lz$kwC*PNy>j5Up*4HZJA;liOI3i zlo(XGf7M_<1a|mdzULCOl#vK|%oUp!W*eD%)oMSVkE9{hMDu(i_qEp?Jj)a@>NNE? z&=j7Xm9VWstPJFT+DoqFuG0TNV|cDRUM9Ahdfw%}YvbZQQ9#K%4VLK3>F3I@p>_r7NQ^Iw&2y5P6Yt8}eG z{h&oKeYSDagG5^?UGlk*u-kz`_z#wr9G)6|FIx=d7Zxlfn+&cSH}VDVl=r8vPfqyY z)xw6Jo&ebu(1Db&;g{Mjz8`PTWbx|>`HxVqqB%7pL#$jYhOJI@zV+?3xZIMAOr2bW zR(XnL{kp8TvJw&!F-Tsx)1J?>&=~}PGLqE4^Ze!f0`9h05CjCB%jbHpfPMsbwW+1K z`>mgh0Og33hVc>O!G0PrhQnd?K6qiG&2lX}cJ-|X9FG)lM$f+6xwT3xA0_xNAxy!O zvQ4D^2=uigCz0{rx&k-)dI1{Gmb!G1n)FF>Y?S}v>^J)Ic$^sx%3OQV84e?l!IL5W^ydFfJ@Hs&+Sj9L7#~c*Bh9R zFYX_1F{02P11i@$^~bzA4mpZM{7%=q{qI)~pWcn~LX5d5M}{LfuKjI)uvLz_x3n5d z_qoP~zI#JF2_5y5cgb1>?XLI}=1mJGWsmv6lemIQNMP&YTL{D&>Co%jS%&i-3QL=f zRVWnMSB1XSr)!#PjP7|S^UYnF(5(OayHDAmx$94`gt6Wow!=^21}-TJrrj5X9=lBL z@K`#{D}!Q9I-u+PHs~OJz5B1z|T_U6gv1MLh$so9FFK7EhZ>e@B4dpY40ez_pWn{X% zj2|tWqse%E53BiuE(&$%opZot(+;POuk*ltOkB^;ZRlOSI&YDN5^X0Go@ksv z<8?Az!4q+}RD4hYM?z@%@I^?3pO=>xceAy!PYIhKT3P(h;4`Syaygexa?oQ_0tz%W z`>^+0LX;qg4eKh9N~PD6|BO1$;-hZ9#fiBYp_l@uGHIrT8++H{%U`)`g|g`O7ECMo zZ2V&!8gzx+*YbK4m}h#I_ap!ek&Ie}veNyg0@W1*)YvQWVPW)LvvLIy+v(tKN8FYcPW~D;!u2IaLPoa?+7Ugdw7AU-w zViKZ?x>*xHv0e8(_{;7~xaf6ykv0(!xGaYBHxT8Yo$=2uNAN09 z^r)zq3tjLk{SMupfZ7xjjf%lP@`obxw0}9!@PA`b{mzaYo=8?@Gub;cH8@6_TwlGX zs$yCxV}5wYP;BS3{DRb`LENFR#_a%^hM@s}QS7d{73cib`79P7-{_)~$It2m(8m+m#2hacnAV%kY`Ih{9PJDt-ZsTBgAWHFYSxEC(ddJ2XouM9&i3EUhgOX1Q+H%q}3`EL-rGx$G!U1v}e*cMJm z!~`jUfPj<$N|0Vex)=c!0ci_t=vkVuuuJGJErAG#6oo8E4MhbtfYL(?0TEW|0-=f0 zODF;9BJi^N=FPkxZ{D3dcjlBkXXc)BzjJ=vxo5g)WvR=fdI_jy{Y(Ap{5Abba;OXQ zyl`81ug83mjp4gz(pq8v826YltKKF47!j#mJhz}SxH^1gE1_?1uN$?f22=LLKvAZJ z@;_x*L;6~KqzCDDcl=yW7KWs=t$ofEvbJi{e6bYSY==bopSo>08GRFjh z@=j?>?=cnkboGdSMsa)ba{EX}@V-%s6{$mp87R6GSy>DzWB9yMOW+4-R6N>Jn+VF@ z-L1M5_UNT4l1Ud}oWV-HYq%Q+SMUwzUtHuZ}Mi=Pm~qBVwxYwUDooJqrTFy6`$Rs8S$EK7OUauX zal6Wk9vQN}ntc4dQ^-}U>rlo)6!%U!{5!K6Iyu2(fj-1%$Vj8M@fH^8#Pmk=n>j>`Tl<%LWA1na;h4cM$HHm=ToSb9X^AE`UsR2U@Ufz95&c7Go4v*`7~1 z{h8GY3xW5pPuBBX86fw^w2jJdon)sZ)YOZC>wzeY*C^Pd?}aqVNG^&9(?&~yr{ zuVb^&98)Qrb!wYL#VWB{0kuK`@^mUwA!Tv|1QZ(U>f`Gx-@r*2nki!&sL&2h=c~E9 zCjN|4wVrW9s-EXTw_!MY^ceHV@lgct;dO()1+C28Y?ErB^vm0tl_ z;v^W{6I{lqV)+-Flbf@_K2Y4S@`dUg)mrZCn&ooK?5CzAU3iNUoj1nTIcw21=c z&RNagy1P3d&)$sD_T*iz(`d%Ew{En$^~3zkT6Y_f}J=z zM{6w7mQQl_;@HaGt|LMmMj#O3E_mY!(&~ojmDw>#Gl3 z_=ubzCW0eTLH92U%x}QSPx~fneeagOJACL~et!%j>NQY~^3E6sCE9%J{J^1WF)OI8 zG9?m7N&PT3=rf74>uag0uh-NS+hYeaZUTHi(!m|!ZAOPjzo@?L-fjk|Hea{B$BIa1 z2@AfYfx<1Q=ot_8(A|hH#M-rUaT2%Sgj0t}ht8*j!Z^&;y{5ke>~HKsnd zW^g6HvGXm;YrMrvR~hblXc#UDopkEQS(Y7#2AOebXXfv3RbHISy_qX9UG`~*UsYLc zCZ@BbB*J8+;Un|BntnoFBj*F2xF3%#;B$6eRds}yf-!04mK(eAX=$3Pw{Hiv`uq6w zc~ze?!=$lIBnBuJo(~*ulC|T1y9MJFrwE0hy7xAfx>m(mPKfSLui#PqiqkMzC7=@AnlJNKRB_2_j>tzRTXGkZz=c0yI zW)!|n_u;a=HN*1!ed#n~PA)DkD?`I~Wje)&z`+cRgMdes<_*_1-FqrHm-Ki@+3WY) z%>?s=pew|Q*HdTNDfk;obS(m6aiQn<&yJ@w3x6L6J{a53eVw zejrimT8^IytA%;{9;BSL0TtR}%3_P25Mqitk(^gGfY}PkiD$2it;FyR6Y!@3G=#a^ z%ig9irg)-#vQ0+5*L|m#AS@`xAD{{YWT#oFYnt15s`7gm1Fs}L)*CAjKS(_=74*LHRjx2x{=;X9Vx(CVYqFWbSk(VufHVIV|Ch#p7!ZYj^#8r<|F3eHr=TOp5*#){ R$`ZgDcW#;+RTyAm{{_<1zS{r* diff --git a/docs/logo.xcf b/docs/logo.xcf deleted file mode 100644 index a62156b25fe750a7d04ef593ca71fe52ec5c088b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94039 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 C%)qt) diff --git a/docs/main/application.png b/docs/main/application.png deleted file mode 100644 index 073239e232bd4d5b44622aea54454a998328b3f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33178 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 /\d/.test(n), "Robots must have numbers in their names") - ] - } -} -``` - -(Note that this piece of schema is not part of our above example. It only supports -a single robot, whereas we need to allow the implementer to provide an array of robots). - -A validator can be created using the `validator` function, as above. - -The first argument is a function that takes the config value as its only argument. -If the function returns something -[truthy](https://developer.mozilla.org/en-US/docs/Glossary/Truthy), validation passes. -If the function -returns something [falsy](https://developer.mozilla.org/en-US/docs/Glossary/Falsy), -an error is thrown with the second argument as an explanation. - -You can even validate nested objects: - -```js -colorPicker: { - options: { _default: ["green", "red", "blue"] } - initial: { _default: "green" }, - _description: "The color picker for lightsabers", - _validators: [ - validator(o => o.options.includes(o.initial), - "Initial must be one of the options") - ] -} -``` - -For convenience, some common validators are provided out of the box. See the -[API / validators](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#validators). - -#### Arrays - -You can accept and validate arrays, and arrays containing objects, in your -configuration schema. This is configured with the `elements` parameter, used -with `_type: Type.Array`. For example, a schema which would accept an array -of strings up to 30 characters long would look like this: - -```js -virtualProvider: { - name: { - given: { - _type: Type.Array, - _default: ["Obi", "Wan"] - _elements: { - _type: Type.String - _validators: [validator(n => n.length < 30, "Must be less than 30 characters")] - } - }, - _description: "The name of the avatar. Does not have to be the name of the actual provider" - }, - _description: "The avatar of the medical practitioner" -} -``` - -Here is an example of a schema that expects an array of objects structured in a particular way. - -```js -robots: { - _type: Type.Array, - _default: [ - { name: "R2-D2", homeworld: "Naboo" }, - { name: "C-3PO", homeworld: "Tatooine" } - ], - _description: "The list of all available robots", - _elements: { - name: { - _type: Type.String, - _description: "What to call the robot", - _validators: [robotNameValidator] - }, - homeworld: { - _type: Type.String, - _description: "Where the robot is from", - _default: null // not required - } - } -} -``` - -This schema will require that any objects in the robots array must only have -the keys `name` and `homeworld`, and that `name` is required. - -Objects within arrays do not -have to have defaults. If an object is supplied to the `robots` array that -does not have a `name`, an error will be thrown. - -### Using config values - -#### The generic way - -The config is fetched asynchronously using `getConfig(moduleName)`. Continuing the -above example, we would have something like - -```js -import { getConfig } from "@openmrs/esm-framework" - -async function doctorGreeting() { - const config = await getConfig("@openmrs/esm-hologram-doctor") - return "Hello, my name is Dr. " + config.virtualProvider.name.family -} -``` - -The content of config will be pulled from the config files, falling back to -the defaults for configuration elements for which no values have been provided. - -#### React support - -A React Hook is provided to hide the asynchronicity of config loading. The -`moduleName`provided to the -[`openmrsComponentDecorator` in esm-react-utils](https://github.com/openmrs/openmrs-esm-core/tree/main/packages/framework/esm-react-utils) -is used to look up the configuration elsewhere in the application. - -```js -export default openmrsRootDecorator({ - featureName: "hologram doctor", - moduleName: "@openmrs/esm-hologram-doctor" -})(Root) -``` - -You can then get the config tree as an object using the `useConfig` React hook. - -```js -import { useConfig } from "@openmrs/esm-framework" - -export default function DoctorGreeting() { - const config = useConfig() - const greeting = "Hello, my name is Dr. " + config.virtualProvider.name.family - return
    {greeting}
    -} -``` - -The content of config will be pulled from the config files, falling back to the -defaults for configuration elements for which no values have been provided. - -#### Support in other frameworks (Angular, Vue, Svelte, etc.) - -This hasn't been implemented yet, but we would like to implement it! See [Contributing](../getting_started/contributing.md). - - -### Typing - -It is nice to be able to have type validation for your use of configuration. To -accomplish this, define an interface alongside your config schema. - -```ts -import { defineConfigSchema, Type } from "@openmrs/esm-framework" - -defineConfigSchema("@openmrs/esm-hologram-doctor", { - hologram: { - color: { - _type: Type.Boolean, - _default: false, - _description: "Whether the hologram supports color display." - } - } -}); - -export interface HologramDoctorConfig { - hologram: { - color: boolean; - } -} -``` - -You can then use this typing information using the `as` keyword. - -```ts -const config = useConfig() as HologramDoctorConfig; -``` - -## Schema Reference - -#### `_default` - -All config elements must have a default (excluding elements within arrays of objects). - -The default does not necessarily need to satisfy the `_type` or the `_validators` of -the element, but this may change in future versions. - -#### `_type` - -One of the values from [the `Type` enum](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/enums/Type.md). Used for validation and to help the -implementer tools work with the element. - -Should always appear alongside `_default`. - -#### `_description` - -Helps implementers understand what the configuration element actually does and -how it is intended to be used. - -Can be used anywhere within the schema structure. - -#### `_validators` - -An array of validator objects. - -Some common validators are -provided: [API / validators](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#config-validation-functions). - -Custom validators should -be created with the [validator](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#validator) function. - -Can be used anywhere within the schema structure. - -#### `_elements` - -Only valid alongside `_type: Type.Array`. A `_default` -must also be provided at this level. Value should be a schema for the values -contained in the array. - -## API Documentation - -See the Config Functions section of the [API docs](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md). - -## The RFC - -This package was established as the result of -[RFC #14](https://github.com/openmrs/openmrs-rfc-frontend/blob/master/text/0014-configuration.md). -This document provides the rationale and guiding principles of the configuration -system. diff --git a/docs/main/creating_a_microfrontend.md b/docs/main/creating_a_microfrontend.md deleted file mode 100644 index 84f9cd12c..000000000 --- a/docs/main/creating_a_microfrontend.md +++ /dev/null @@ -1,133 +0,0 @@ -# Creating a Frontend Module - -**New frontend modules can be created from the -[openmrs-esm-template-app](https://github.com/openmrs/openmrs-esm-template-app)**. :point_left: - -You can fork that repository, or clone-and-copy it. -Follow the instructions in the README to turn it into your own frontend module. - -## Creating a new frontend module in a Lerna monorepo - -The process for creating a new frontend module in a monorepo -is nearly identical to the one for creating one in an independent -repo. - -1. Put the contents into a new directory under `packages/` -2. Remove configuration files that are already present at the - workspace level—things like `.github` and `.eslintrc`. -3. Remove `devDependencies` from the new frontend module's `package.json` - which are already in the `devDependencies` of the `package.json` at - the workspace level. - -That's it! Use the `@openrms/esm-template-app` above along with this guide -to get your frontend module started. - -## The `index.ts` file - -All frontend modules have an `index.ts` as an -[entry point](https://webpack.js.org/concepts/entry-points/). -See the [example](https://github.com/openmrs/openmrs-esm-template-app/blob/main/src/index.ts) -in openmrs-esm-template-app. - -This file is loaded by the app shell and must have a specific structure. -It must have three exports: -`setupOpenMRS`, `backendDependencies`, and `importTranslation`. - -### The `setupOpenMRS` function - -This function is called when the application is first starting up. The -app shell loads the `index.ts` files for all the ESMs and then executes -the `setupOpenMRS` function for each of them. The `setupOpenMRS` function -should only do the following four things: - -- define the [configuration schema](config.md) -- register [breadcrumbs](breadcrumbs.md) -- set up [offline support](../offline/offline.md) -- return an object specifying the frontend module's pages and extensions - -#### The `setupOpenMRS` return object - -This is an object with two top-level keys, both optional: `pages` and `extensions`. -Here is an example which uses all of the possible keys. - -```typescript - const options = - featureName: 'Hello World', - moduleName: '@openmrs/esm-hello-world', - }; - - return { - pages: [ - { - // load (required): tells the app shell how to load the page content - load: getAsyncLifecycle(() => import('./hello'), options), - // route (required): a string, RegEx, function, or array of any of the - // above, which will be used to determine when to load the - // frontend module content. It will be matched against the URL path. - route: 'hello', - // order (optional): a number which specifies the order in which the - // page should be loaded in the application. The default is 1. This - // is generally only needed if you need to specify the DOM position - // of your page; for example, if it is a navbar and needs to be at the - // top, you might use order 0. - order: 2, - // `online`, `offline`, and `resources` are described in the offline - // support documentation. All are optional. - online: { allowSayingHelloBack: true }, - offline: { allowSayingHelloBack: false }, - resources: { greeting: fetchGreetingOffline } - }, - ], - // To understand the `extensions` section, please read the "Extension System" - // page of the documentation. - extensions: [ - { - // name (required): The name of the extension. Must be unique across - // all modules in the application. - name: 'greeting-bot', - // load (required): tells the app shell how to load the extension content - load: getAsyncLifecycle(() => import('./greeting-bot'), options), - // slot (optional): Specifies a slot for the extension to be attached to. - slot: 'bot-slot', - // slots (optional): Alternative to `slot` which allows attaching to - // multiple slots. For example: - // slots: ['bot-slot', 'greeters-slot'] - - // `online`, `offline`, and `resources` are described in the offline - // support documentation. All are optional. - online: true, - offline: true, - resources: { greeting: fetchGreetingOffline } - }, - ] - }; -``` - -### The `backendDependencies` object - -This is an object that tells the frontend application what OpenMRS server modules -the frontend module depends on, and what versions. If these dependencies are not -met, administrators will be alerted. - -### The `importTranslation` function - -This is required for translations to work. It tells the frontend application -how to load translation strings. The boilerplate which you will find in -[openmrs-esm-template-app](https://github.com/openmrs/openmrs-esm-template-app/blob/main/src/index.ts) -is almost certainly what you want. Note that the first argument to -`require.context` is a directory, `../translations`. -That directory must exist at that location relative to the `index.ts` file. - -## Integrating into your application - -Once you've created a frontend module, you'll want to integrate it into your -application. There are two steps for doing so. - -First, publish your frontend module package to NPM. See -[Release and Deployment](../getting_started/release_and_deployment.md) -for more information. At the end, your package should be visible on npm.js, -like [`@openmrs/esm-login-app`](https://www.npmjs.com/package/@openmrs/esm-login-app). - -Then, you'll need to integrate this package into your application. -Information about that can be found in the Implementer Documentation on -[Deployment](https://wiki.openmrs.org/pages/viewpage.action?pageId=224527013). diff --git a/docs/main/data.md b/docs/main/data.md deleted file mode 100644 index 75f5f3065..000000000 --- a/docs/main/data.md +++ /dev/null @@ -1,157 +0,0 @@ -# Retrieving and Posting Data - -Frontend modules interact with the OpenMRS server via the APIs exposed -by its modules. In general, most of the endpoints we use are provided -by the [FHIR Module](https://wiki.openmrs.org/display/projects/FHIR+101%3A+OpenMRS+Strategy%2C+Tools%2C+FHIR+API%2C+and+Help). -Most of the rest are provided by the -[REST Module](https://wiki.openmrs.org/display/docs/REST+Module), which is -documented [here](https://rest.openmrs.org/). - -Endpoints from the FHIR Module should always be preferred, when they are -available. FHIR is an interoperability standard which OpenMRS supports. - -Some data is available using higher-level functions or custom React Hooks provided -by `@openmrs/esm-framework`. These should be used when available. - -All of this functionality (React hooks excepted) is provided by the -[`@openmrs/esm-api`](https://github.com/openmrs/openmrs-esm-core/tree/main/packages/framework/esm-api) -package, which is part of `@openmrs/esm-framework`. -The React hooks are in -[`@openmrs/esm-react-utils`](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-react-utils), -which is also part of `@openmrs/esm-framework`. See the -[API Docs](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md). - -## FHIR - -To use the FHIR API, we recommend using [SWR](https://swr.vercel.app/docs/data-fetching) based hooks and the [`openmrsFetch`](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#openmrsfetch) fetcher function to retrieve data from the server. SWR offers a host of features that help us deliver an improved user experience. - -Here's an example of using SWR to retrieve a patient from the FHIR API. - -```typescript -import useSWR from 'swr'; -import { fhirBaseUrl, openmrsFetch, fhir } from '@openmrs/esm-framework'; - -const { data, error, isLoading, mutate } = useSWR( - `${fhirBaseUrl}/Patient/${patientUuid}`, - openmrsFetch -); -``` - -If you have questions about FHIR support in OpenMRS, you can ask in the -[FHIR Squad Slack channel](https://openmrs.slack.com/archives/CKLPH66BB). - -## Other OpenMRS server APIs - -Some administrative endpoints will likely never have a proper representation in FHIR (e.g., endpoints for managing encounter types). When no suitable FHIR endpoint is available, you will want to use a different OpenMRS server API. The [REST Web Services API](https://rest.openmrs.org/) is used widely across many of our frontend modules. - -Here's an example of a custom SWR hook that retrieves visits data. - -```typescript -import useSWR from 'swr'; -import { openmrsFetch, Visit } from '@openmrs/esm-framework'; - -interface VisitData { - results: Array; -} - -/* Custom data fetching hook */ -export function useVisits() { - const url = `/ws/rest/v1/visit?includeInactive=false`; - - const { data, error, isLoading, mutate } = useSWR<{ data: VisitData }, Error>(url, openmrsFetch); - - return { - visits: data, - isLoading, - error, - mutate, - }; -} -``` - -We can leverage this `useVisits` hook in our `visits` component as follows: - -```typescript -const Visits = () => { - const { visits, isError, isLoading } = useVisits(); - - if (isLoading) { - return - } - if (error) { - // render error state - } - if (visits?.length) { - // render visits - } - return ( - // render empty state - ) -} - -export default Visits; -``` - -The `mutate` function returned by `useSWR` can be used to update the cache and trigger a re-render of the component. This is useful when we want to update the UI after a successful mutation. - -```typescript -const res = await saveVisitNote(payload); - -try { - if (res.status === 201) { - mutate(); - closeWorkspace(); - - // show success toast - } -} catch (error) { - // handle error -} -``` - -## Posting data to the server - -Here's an example that demonstrates posting session data to the server. - -```typescript -import { openmrsFetch } from '@openmrs/esm-framework' - -const abortController = new AbortController(); -abortController.abort(); -openmrsFetch('/ws/rest/v1/session', { - method: 'POST', - body: { - username: 'hi', - password: 'there', - }, - signal: abortController.signal -}); -``` - -It is best practice for POST requests to have an -[AbortController](https://developer.mozilla.org/en-US/docs/Web/API/AbortController/abort). -You should ensure that `AbortController.abort()` is called when the component is unmounted -if the request is not yet completed. - -In a React Component this is usually accomplished by making the request -in a [`useEffect` hook](https://reactjs.org/docs/hooks-effect.html): - -```typescript -useEffect(() => { - const abortController = new AbortController(); - someFetchFunction(abortController) - .then(setResult) - .catch(setError); - return () => abortController.abort(); -}, []); -``` - -## API Objects - -Some API objects are made available via React hooks (or via framework-agnostic subscriptions). -The hooks are in -`@openmrs/esm-react-utils`, -and the subscription-yielding equivalents are in -[`@openmrs/esm-api`](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#api-functions). -See for example [`useVisitTypes`](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#usevisittypes) -and the corresponding [`getVisitTypes`](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#getvisittypes). diff --git a/docs/main/dates.md b/docs/main/dates.md deleted file mode 100644 index 16348dddf..000000000 --- a/docs/main/dates.md +++ /dev/null @@ -1,34 +0,0 @@ -# Working with Dates - -The OpenMRS Frontend Framework provides several utilities for working with -dates. These have been designed with locale-sensitivity as a key concern. -Acceptable date formats vary by language and region, and these functions -are intended to accomodate that variation. - -## Formatting for display - -Date objects can be displayed in a variety of standard formats using the -[formatDate](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#formatdate), -[formatTime](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#formattime), and -[formatDatetime](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#formatdatetime) -functions. These functions format dates in ways that are both adaptable -(using the `mode` parameter) and localized according to the user's locale. - -Date strings produced by these formatting functions should never be -used for comparisons or other kinds of date math. It is recommended -to format dates for display as close to the "view" or "render" as -possible to minimize the risk of this happening. - -## Formatting to send to the server - -Dates sent in the request body via `openmrsFetch` are automatically -formatted into ISO-8601 format. - -## Parsing - -The ISO-8601 date strings sent by the server can be parsed into Javascript -`Date` objects using the -[parseDate](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#parsedate) -function. This uses [dayjs](https://day.js.org/docs/en/parse/string) for -parsing. - diff --git a/docs/main/deps.md b/docs/main/deps.md deleted file mode 100644 index edd987010..000000000 --- a/docs/main/deps.md +++ /dev/null @@ -1,25 +0,0 @@ -# Build-time and Runtime Dependencies - -In a frontend modules architecture, different JavaScript applications -come together on the client in a coordinated way. Each application -reaches the client as one or more *bundles*. A bundle is the built -code, transpiled and compiled into a format the browser can read. - -An application's dependencies can be *built into the bundle*, or -they can be kept as references and *resolved -on the client*. We refer to these as **build-time dependencies** -and **runtime dependencies**, respectively. - -> **For the curious:** The client has to know how to resolve runtime - dependencies. This is the role of SystemJS and the import map. - SystemJS tells the browser how to use the import map to resolve - runtime dependencies. Frontend modules are then compiled into a - format that tell the browser to use SystemJS for runtime - dependency resolution. - -**Build-time dependencies go in `devDependencies`**, alongside -development tooling. - -**Runtime dependencies go in `peerDependencies`**. - - diff --git a/docs/main/distribution.md b/docs/main/distribution.md deleted file mode 100644 index 3e5e5b740..000000000 --- a/docs/main/distribution.md +++ /dev/null @@ -1,87 +0,0 @@ -# Creating a Distribution - -One of the reasons for choosing this kind of modularization in the frontend space is to allow maximum flexibility for creating your own distribution. That way, you can use what you find useful and drop what you don't like to see in your distribution. - -This concept is transported to almost all areas including, but not limited to, the available frontend modules, the delivered app shell, and the method of serving the application. - -In this section we look at some considerations when creating a distribution. Specifically, we investigate what options we provide and how you can leverage these for your use case. - -## Local Build vs CI Setup - -You may be tempted to clone the `openmrs-esm-core` repository for building your distribution. **Don't** do this unless you know exactly *why* you want to work against the repository. The repository is only there for *development* of the OpenMRS Frontend. It is **not** there for building distributions. - -To build your own distribution a simple Node.js tool called `openmrs` was created. This allows: - -- creating an import map with all resources for the contained frontend modules (`openmrs assemble`) -- build a new app shell to host frontend modules (`openmrs build`) -- start a debugging session of the shell and a frontend module (`openmrs debug`) -- start a debugging session of a frontend module in the shell (`openmrs develop`) -- starts the default app shell locally (`openmrs start`) - -For creating a distribution we recommend doing two things: - -1. Build the app shell (`openmrs build`) with the configuration you want to see. -2. Use `openmrs assemble` to get a custom configuration for your import map. - -The import map is used to define what frontend modules are included and where these frontend modules are located. - -## Customizing the Import Map - -By building the app shell you'll already get a rudimentary version of an import map, which can be used for development purposes. Generally, however, you should provide your own. - -An import map can also be specified as an URL. For instance, for the development instance as `dev3.openmrs.org` we have [https://spa-modules.nyc3.digitaloceanspaces.com/import-map.json](https://spa-modules.nyc3.digitaloceanspaces.com/import-map.json). The contents of this import map are updated once an update to any (official) frontend module has been pushed. Thus, while this import map may be great for development purposes, it should be considered unstable. Avoid this for your distribution or any application that should not break unexpectedly. - -A custom import map can be created using the `openmrs assemble` command. If run directly the command will open a command line survey, guiding you through the different options. It will list all OpenMRS frontend modules that can be found on the NPM registry. - -For CI/CD purposes we encourage you to use a configuration file `spa-build-config.json` instead. This file then defines the wanted frontend modules and configures the whole process. - -The file may looks as follows: - -```json -{ - "publicUrl": ".", - "frontendModules": { - "@openmrs/esm-patient-chart-app": "latest", - "@openmrs/esm-patient-registration-app": "3.0.0" - } -} -``` - -The `publicUrl` may be important for later. If the gathered resources are placed (and served) in the same folder as the SPA resources then `.` is good. If they are uploaded to say a CDN, then the (base) URL of the CDN should be defined. - -Example: - -```json -{ - "publicUrl": "https://openmrs-cdn-example.com/mf", - "frontendModules": { - "@openmrs/esm-patient-chart-app": "latest", - "@openmrs/esm-patient-registration-app": "3.0.0" - } -} -``` - -In this case the resulting `import-map.json` could look as follows: - -```json -{ - "imports": { - "@openmrs/esm-patient-chart-app": "https://openmrs-cdn-example.com/mf/openmrs-esm-patient-chart-app-3.2.1/openmrs-esm-patient-chart-app.js", - "@openmrs/esm-patient-registration-app": "https://openmrs-cdn-example.com/mf/openmrs-esm-patient-registration-app-3.0.0/openmrs-esm-patient-registration-app.js" - } -} -``` - -Either way the assemble command makes sure to have all assets made available properly. - -## Canary vs Stable - -Regarding the versioning you'll have three options: - -- Go for the `latest` tag -- Go for the `next` tag -- Go for a specific (i.e., explicit) version - -In general we recommend to stay on non-preview (e.g., `3.2.1`) versions. Preview versions (e.g., `3.2.1-pre.0`) are for development purposes and may not be stable. - -For creating a working distribution ideally you'll stick to explicit versioning of non-preview versions. If you use `latest` then individual frontend modules may work as expected, but incompatibilities (e.g., if a certain frontend module was updated but is now incompatible to another frontend module that you also use) may then exist - making additional testing required. With an explicit version you can be sure that a working system remains as such in rebuild scenarios. diff --git a/docs/main/distro_setup.png b/docs/main/distro_setup.png deleted file mode 100644 index df8e336b79dd5e67703949ff9692ba6bba7a7c8b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 74393 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

    b;eN!s^8~5Tz?HmnvDnJ% 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 I_pDz2AAhiPBme*a diff --git a/docs/main/extensions.md b/docs/main/extensions.md deleted file mode 100644 index fbfad6756..000000000 --- a/docs/main/extensions.md +++ /dev/null @@ -1,212 +0,0 @@ -# Using the Extension System - -The extension system makes it possible for frontend modules to -insert UI elements into each other, and for these interactions -to be configurable by system administrators. - -> Those familiar with the -[OpenMRS RefApp 2.x extension system](https://wiki.openmrs.org/display/docs/Module+Extension+Points) -will be glad to know that the basic concepts here are similar, but simpler. -"Extensions" are roughly the same thing as before, "points" are now -called "slots," and there is no longer anything like "apps," which no one -really understood anyway. - -## Key Concepts - -There are two kinds of things in the extension system: **extensions** and **slots**. - -An **extension** is a component. - -A **slot** is a place. - -Read the above two lines until they resonate in your head like a mantra. - -Extensions get rendered into slots. An extension gets associated with a -slot in one of the following ways: -- The extension names the slot in its definition, under `slot[s]` -- A call to [attach](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#attach) -- A system administrator adds the extension to the slot using the - slot's `add` array - -## When should I use extensions and slots? - -The extension system should be thought of as a system for making -behavior configurable by administrators. It should not be thought of -way to reuse components across modules. - -This is the key question: - -_Am I creating a collection of similar things, such as buttons or -tiles, which an administrator might want to re-order or otherwise -change?_ - -If so, this may be a good place to use extensions. - -### What if I just want to mount something from one framework into something in another framework? - -Just use the Single-SPA -[mountParcel](https://single-spa.js.org/docs/parcels-overview/#mountrootparcel-vs-mountparcel) -function. - -### What if I just want to use a component from one module in a different module, and I can change both? - -Consider exporting the component and using it the normal way. - -## Usage - -Extensions are defined in the `routes.json` file bundled with a module, in an -`extensions` array. Each element of this array defines an extension, with -a name and a load function. It may also specify the names of slots to -attach the extension to by default. It may also specify -[a number of other things](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/interfaces/ExtensionRegistration.md), -some of which will be covered below. - -Slots are components. There is an [ExtensionSlot](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#extensionslot) -React component. If you are working in a different framework and would like to create -an extension slot, please get in touch with the OpenMRS Frontend 3.0 team -on Slack. - -## Principles - -### Naming extensions - -An extension will have a name which identifies it. That name should describe -what the extension does. It should not have anything to do with where the -extension will appear in the application. It has no innate sense of place. - -:heavy_check_mark: Good extension names: -- Vitals table -- User avatar -- Biometrics tile - -:x: Bad extension names: -- _Top_ bar ("top" indicates a place) -- _Home page_ reports link ("home page" indicates a place) -- Steve (names should be descriptive) - -> **Note**: You will likely see a lot of extension and slot names which -> are all lowercase with dashes. This is not necessary; it is better -> to give extensions names that are pleasant to read. -> -> Similarly, you will see many slots suffixed with "slot." This is also -> not necessary. - -### Naming slots - -A slot will also have a name which identifies it. That name should describe -the location in the app that it represents. If it describes the things that -can go in it, it should only use the most general terms imaginable—things -like "button" or "tile" or "widget." - -:heavy_check_mark: Good slot names: -- Primary nav right menu -- Patient header detail box -- Form header buttons - -:x: Bad slot names: -- Patient address (too prescriptive about contents) -- homepage-widgets-slot (should be `Homepage widgets`) -- Extra buttons (too vague) - -### Styling - -An extension should be as agnostic as possible to the context in which it -appears. This means that you should avoid defining the size of an extension. -Extensions should be responsive (within reason), such that the contents -will adapt to a variety of different extension dimensions. - -Slots should be responsible for as much styling as generically applies to -all of their contents. If all of the extensions in a slot should have a -border, the slot should apply the border. The slot should also be responsible -for setting the dimensions into which the extensions will render. - -A slot can apply styles to an extension with the following CSS selector: - -```css -.slot > * > * { - ... -} -``` - -## Extension configurability - -The beautiful thing about configurability in the extension system is -that you don't need to think about it. Extensions and -slots have a standard configuration interface that allows administrators -to add, remove, and re-order extensions, as well as specific -configuration specific to an extension within a particular slot. - -You can use `useConfig` as usual within an extension. - -The schema for an extension can be specified using `defineExtensionConfigSchema`. -If no schema is defined specifically for your extension, the extension will inherit -the configuration of the module that contains it. - -## State - -Sometimes, extensions are not as independent as we might wish they were, -and have to expect some state from the slot in which they are mounted. -Most commonly, extensions that pertain to a specific patient will accept -a `patientUuid` parameter which can be used to fetch relevant patient -information. - -State is provided as a parameter to the `ExtensionSlot` or `Extension` -components, and recieved as a prop by the extension. - -See the [ExtensionSlot API docs](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#extensionslot) -for more. - -## Meta - -Sometimes, extensions might want to pass information to the slot that -receives them. This is used, for example, by patient chart widgets. -Dashboards render these widgets into a grid format. When a dashboard -receives a widget, the widget informs the dashboard (which is a slot) -how many grid columns it would like to take up. This happens using `meta`. - -Meta is provided by extensions in their definition in the `routes.json` -file. - -Slots can access meta through the extension system API, such as by using -[useExtensionSlotMeta](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#useextensionslotmeta). - -## Offline Support - -For information about offline support, please see [Offline Mode](../offline/offline.md). - -## Order - -By default, extensions will render into slots in the order that they are -declared or attached. Extensions which are added by an administrator come -last. - -Extensions can provide an `order` index in their definition to influence -the order in which they are rendered. This works like -[z-index](https://developer.mozilla.org/en-US/docs/Web/CSS/z-index) -in CSS—similarly, it is a way of setting relative order among elements -that don't officially know about each other. - -Administrators can also override the order of extensions within any slot -by modifying the `order` configuration parameter of that slot. - -## Additional Resources - -Short introductory videos: -- [OpenMRS Frontend 3 Extension System 1 - Basics](https://youtu.be/Teq3FwKofSc) -- [OpenMRS Frontend 3 Extension System 2 - State and Meta](https://youtu.be/8514ebpAEWI) - -Introductory presentation: [Quick Guide to Slots](https://docs.google.com/presentation/d/1mQxh7qAYLD-gc9sh0I58t4o_XNndPcu6hAJmTZQZ_fo/edit#slide=id.gbe34f6b087_0_34 ) - -For a terse technical description of the extension system, see the -[Extensions RFC](https://github.com/openmrs/openmrs-rfc-frontend/pull/27/files). - -### Workshop - -A live workshop was hosted on Zoom, providing a comprehensive introduction -to the extension system, as well as practical problems. -Recordings and materials are available below. - -- [Part 1: About our Frontend Module Architecture & How to Use Extensions](https://iu.mediaspace.kaltura.com/media/t/1_e7kvnx9t?st=702) -- [Part 2: Practical Session on our MFE Architecture & How to Use Extensions](https://iu.mediaspace.kaltura.com/media/t/1_iaq63mfd?st=282) - - [Practice tasks](https://github.com/openmrs/openmrs-esm-testresults/tree/feature/workshop) - - [Practice solutions](https://github.com/openmrs/openmrs-esm-testresults/tree/feature/workshop-solutions) diff --git a/docs/main/faq.md b/docs/main/faq.md deleted file mode 100644 index bd67034d2..000000000 --- a/docs/main/faq.md +++ /dev/null @@ -1,115 +0,0 @@ -# Frequently Asked Questions - -## Troubleshooting Local Dev Environment - -It's important to keep your working code base current with the latest fixes, latest features, and library APIs to develop against. When developing a frontend module your code will depend on the app shell and core libraries, and sometimes other frontend modules. If you are having trouble running code locally when it appears to be working on the server ([dev3](https://dev3.openmrs.org/openmrs/spa)), try the following. - - -### How do I keep my local dev server up to date? - -Just pull the repository you want to work on and run `yarn`. -That will install the latest dependencies, which includes `openmrs`, which is -the tool that runs the dev server. - -For help with pulling the latest code see the [community help page](https://wiki.openmrs.org/display/docs/Using+Git) for basic git commands. - -### I'm not seeing the latest `@openmrs/esm-framework`. How do I update the dependency? - -If you notice your app suddenly stop working, it might be because a core library has changed in the app shell on the server you are developing against. The main dependencies shared by all OpenMRS frontend modules are `openmrs` and `@openmrs/esm-framework`. They can be updated like this: - -```sh -# Upgrade core libraries -yarn up openmrs @openmrs/esm-framework - -# Reset version specifiers to `next`. Don't commit actual version numbers. -git checkout package.json - -# Run `yarn` to recreate the lockfile -yarn -``` - -### Using a custom importmap - -By default, when you run `yarn start`, the command will use the importmap from dev3, that is, https://dev3.openmrs.org/openmrs/spa/importmap.json. This is the default importmap for the reference application and generally what you will want to use. However, in some situations, you may want to us a custom importmap, such as a distribution-specific importmap. In this case, you can use the `--importmap` argument to the `yarn start` command to point to any importmap you like: - -```sh -yarn start --importmap "https://dev3.openmrs.org/openmrs/spa/import-map.json" -``` - -### Clearing out the browser cache - -By default the server [tells your browser](https://github.com/openmrs/openmrs-contrib-ansible-docker-compose/blob/c36115ca22b8fb842f8cf0ff745d1d35a4567912/files/emr-3-dev/proxy.conf#L97) to cache JavaScript files for 30 days. You can [bypass your browser's cache](https://en.wikipedia.org/wiki/Wikipedia:Bypass_your_cache) when refreshing the page. If you want to keep the cache disabled while you are developing, open your browser's developer tools, go to the "Network" tab, and check "Disable Cache." The cache will only be disabled while the developer tools are open, and only for the page that they are attached to. - -How to open browser developer tools (chrome) -open-devtools-chrome - -How to disable asset (javascript, css) cache (chrome) -disable-cache-chrome - -### Clear local package cache - -Although yarn is very good at maintaining its dependency list as specified in `yarn.lock` it is possible for the `node_modules` folder containing library packages to get corrupted. You can manually remove the the `node_modules` folder and rebuild it with `yarn` - -```sh -rm -rf node_modules/ -yarn -``` - -This will only delete the root `node_modules` folder. You may also want to delete the `node_modules` of all packages in a monorepo. - -Yarn is smart and will quickly compile the new `node_modules` folder from its internal cache. If you are worried that yarn has cached an invalid version of a package you can clear yarn cache to force it to download the packages again - -```sh -yarn cache clean -``` - - -## Further Info - -### How do I find out where the code I need to work on is? - -There is no simple correlation between packages and pages and content. - -The first thing to check is the [list of repositories](http://o3-dev.docs.openmrs.org/#/main/map?id=repositories-you-should-know-octocat) -and their descriptions. There aren't very many, so it's likely you can -figure out what you're trying to work on just by looking at the list. - -If that doesn't work out, another trick is to clone all of the repositories -and then run `grep` across them to look for something you expect to find— -e.g. a piece of text from the UI. - -If you have done both of the above things and still haven't found the -code you're looking for, feel free to ask in the -[#openmrs-helpme](https://openmrs.slack.com/archives/C02UNMKFH8V) channel -on Slack. - -### How do I develop against a restricted environment? - -In general you can develop against another environment using the `--backend` flag. -If the other environment is guarded, e.g., by an IP or network restriction then -this is something you need to take care of on your local machine. - -In case the guarded environment is restricted via some SSO mechanism using a -cookie you could use the `--add-cookie` flag to achieve this. As an example, -look at the access for a development server from the ICRC: - -```sh -npx openmrs start --backend "https://emr-v2.test.icrc.org/" --add-cookie "MRHSession=1234..." -``` - -The cookie must be obtained by you and strongly depends on the used backend. - - -## Dev hacks - -### Turn on dev tools - -```js -localStorage.setItem('openmrs:devtools', true) -``` - -### Manually set an importmap override - -```js -localStorage.setItem("import-map-override:@openmrs/esm-form-entry-app", "http://localhost:4200/openmrs-esm-form-entry-app.js"); -``` diff --git a/docs/main/forms.md b/docs/main/forms.md deleted file mode 100644 index 190a18037..000000000 --- a/docs/main/forms.md +++ /dev/null @@ -1 +0,0 @@ -123 diff --git a/docs/main/map.md b/docs/main/map.md deleted file mode 100644 index 590aba653..000000000 --- a/docs/main/map.md +++ /dev/null @@ -1,67 +0,0 @@ -# Map of the Project - -## Orientation - -OpenMRS Frontend 3.0 uses a microfrontends architecture. We call our microfrontends "frontend modules." A frontend module is a self-contained piece of application. It has some UI, and some ideas about where in the application it should be rendered. Each frontend module can be configured, and some aspects of how frontend modules interact can be configured, too. - - -There are four important pieces of the OpenMRS Frontend modules system: - -- The **app shell**, which is the "base" of the application and coordinates everything -- The **framework**, which is a library that all frontend modules use -- The **import map**, which is a file that tells the app shell what frontend modules to use and where they are -- The **frontend modules**, from which the interface is composed - -The frontend modules communicate with the **backend**, which is the OpenMRS server, using its APIs. - -### The framework - -The **framework** is an NPM package called `@openmrs/esm-framework`, which is composed of multiple smaller libraries. These are documented in the -[OpenMRS Frontend Core README](https://github.com/openmrs/openmrs-esm-core#openmrs-frontend-core). - -### The frontend modules - -The **frontend modules** are shipped in the ES Module format and usually thus just called `esm`s (same prefix as the libraries). In any case these frontend modules are indeed also libraries, but very special ones that - -- are not directly integrated into the main application, -- are loaded indirectly via a special JSON called an "import map", and they -- export a predefined set of functionality including a function called `setupOpenMRS`. - -These frontend modules bring in domain-specific UI capabilities such as menu entries, page content, or notifications. - -#### Understanding frontend modules :brain: - -All the pieces of a frontend module are explained in -[Tour of a Frontend Module](../getting_started/tour.md). - -Also see the -**[openmrs-esm-template-app](https://github.com/openmrs/openmrs-esm-template-app)**, -which explains lots of things about frontend modules. - -### The backend - -The backend is an OpenMRS server and its APIs. The frontend application and backend server do not have to be colocated. Since the frontend really just a set of static files, it can be served from anywhere. The specific setup is up to you. - -## Structure of the application - -The process of building an application, which is described in the -[Implementer Documentation](https://wiki.openmrs.org/pages/viewpage.action?pageId=224527013), -looks like this: - -![Distro Build Diagram](./distro_setup.png) - - -The built application is then executed on the client like this: - -![Application Diagram](./application.png) - - -## Repositories you should know :octocat: -The 3.x EMR Reference Application is made up of all the frontend modules found in the following repositories: - -- :construction: [openmrs-esm-template-app](https://github.com/openmrs/openmrs-esm-template-app): This repository provides a starting point for creating your own OpenMRS Microfrontend. -- [openmrs-esm-core](https://github.com/openmrs/openmrs-esm-core/tree/master/packages/apps): Frontend modules which are administrative or else integral to the application -- [openmrs-esm-patient-management](https://github.com/openmrs/openmrs-esm-patient-management/tree/main/packages): Frontend modules which deal with creating, searching, and listing patients -- [openmrs-esm-patient-chart](https://github.com/openmrs/openmrs-esm-patient-chart/tree/master/packages): The patient chart frontend module and all its widgets -- [openmrs-esm-home](https://github.com/openmrs/openmrs-esm-home/tree/master/packages): Frontend modules tied to the home page -- [openmrs-rfc-frontend](https://github.com/openmrs/openmrs-rfc-frontend): A git repository that facilitates a democratic process where folks can propose changes to the frontend implementation via RFCs (Request For Comments). See, for example, the [Contributing Guidelines for Frontend Modules](https://github.com/openmrs/openmrs-rfc-frontend/blob/master/text/0020-contributing-guidelines.md), which were established with RFC #20. diff --git a/docs/main/state.md b/docs/main/state.md deleted file mode 100644 index a9cf58d8a..000000000 --- a/docs/main/state.md +++ /dev/null @@ -1,85 +0,0 @@ -# Sharing State between Frontend Modules - -In general, state in React apps should be -[managed using React](https://kentcdodds.com/blog/application-state-management-with-react). -Use the [State Hook](https://reactjs.org/docs/hooks-state.html) (or -[Reducer Hook](https://reactjs.org/docs/hooks-reference.html#usereducer)) -and [Context](https://reactjs.org/docs/context.html) to pass state around within your -frontend module. - -In some cases, you may need to manage state outside React, such as when you -have separate React applications that need to share state. -This can come up, for example, if you your frontend module has multiple extensions -that need to share state with each other. - -In these cases you can use the -[`@openmrs/esm-state`](https://github.com/openmrs/openmrs-esm-core/tree/main/packages/framework/esm-state) -features of `@openmrs/esm-framework`. The framework provides functions for -managing state using [Unistore](https://github.com/developit/unistore#unistore). - -## How do I use it? - -A Unistore store can be created using -[`createGlobalStore`](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#createglobalstore): - -```typescript -import { createGlobalStore } from '@openmrs/esm-framework'; - -export interface BooksStore { - books: Array; -} - -createGlobalStore("books", { - books: [], -}); -``` - -The store can then be accessed using -[`getGlobalStore`](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#getglobalstore) - -```typescript -import { getGlobalStore } from '@openmrs/esm-framework'; - -const bookStore = getGlobalStore("books"); -console.log(bookStore.getState()); -bookStore.subscribe(books => console.log(books)); -bookStore.setState({ books: ["Pathologies of Power"]}); -``` - -### In React: - -```typescript -import React, { useEffect } from 'react'; -import { getGlobalStore, useStore } from '@openmrs/esm-framework'; - -const bookStore = getGlobalStore("books"); - -function BookShelf() { - const { books } = useStore(bookStore); - return <>{books.join(",")}; -} -``` - -There are a few other ways that you can use stores in React, such as by creating -a subscription in a `useEffect` block, or by using `Provider` and `connect`, but -this method is by far the simplest. - -### Other notes - -If your directory structure allows, you can also pass stores around explicitly: - -```typescript -// bookStore.ts -export bookStore = createGlobalStore("books", { - books: [], -}); -``` - -```typescript -import { bookStore } from "./bookStore"; -bookStore.setState({ books: ["A History of Global Health"] }); -``` - -See the [Unistore docs](https://github.com/developit/unistore#unistore) for more -information about stores. - diff --git a/docs/main/translations.md b/docs/main/translations.md deleted file mode 100644 index b88681dff..000000000 --- a/docs/main/translations.md +++ /dev/null @@ -1,27 +0,0 @@ -# Using the Translation System - -We use i18next and react-i18next to internationalize frontend module content. - -Watch a quick tutorial video: - -[![https://www.youtube.com/watch?v=1pLUi47BIBo](https://img.youtube.com/vi/1pLUi47BIBo/0.jpg)](https://www.youtube.com/watch?v=1pLUi47BIBo). - -In order to internationalize your frontend module, it needs to have a line in -its `index.ts` file which tells the app shell where to find translations. -This will generally be exactly: - -```javascript -const importTranslation = require.context("../translations", false, /.json$/, "lazy"); -``` - -The `translations` directory should exist at that path relative to the `index.ts` file -(generally, at the top level of the package). It should contain a file `en.json`, which -is the translation *source file*, and may contain other JSON files corresponding -to languages into which the frontend module is translated. - -You should then be able to use [react-i18next](https://react.i18next.com/) in your -React components. - -> **Practice**: Try changing the language to Spanish (`es`), French (`fr`), or a language - of your choice. Check to see if any English text is still visible. If it is, follow - the example steps in the tutorial video to correct this. \ No newline at end of file diff --git a/docs/main/upgrade_3_to_4.md b/docs/main/upgrade_3_to_4.md deleted file mode 100644 index adebd2575..000000000 --- a/docs/main/upgrade_3_to_4.md +++ /dev/null @@ -1,193 +0,0 @@ -# Upgrading to Framework Version 4 - -Version 4 of the OpenMRS 3 frontend framework includes a number of essential updates, including: - -- Updating React from v16 to 18 -- Updating React Router from v5 to 6 -- Updating Carbon Design System from v10 to 11 -- Major improvement to the system that loads frontend modules into the application. - -> Note: This has nothing to do with any OpenMRS 4, which does not exist yet (in 2022). This is about upgrading some libraries within OpenMRS 3. The packages `openmrs` and `@openmrs/esm-framework` are being upgraded from version 3 to version 4. - -A consequence of this last change is that frontend modules built with the `openmrs` -library at version 3.x will not work in an application running the app shell at -version 4.x. - -There are some breaking changes that require changes to frontend module code. -You will also need to upgrade testing libraries to support the new version of React, which -involve some additional changes: -- Jest from 26 to 28 -- React Testing Library from 10 to 13 -- User Event from 12 to 14 - -## Setting Up to Upgrade - - - -In brief, you're going to run the app shell, upgrade the libraries in your frontend module, and load your frontend module into the app shell using [import map overrides](https://o3-dev.docs.openmrs.org/#/getting_started/setup?id=import-map-overrides). - -### Getting Frontend Framework 4.0 - -Check out the `main` branch of [openmrs-esm-core](https://github.com/openmrs/openmrs-esm-core/tree/main). -Set it up by running - -```sh -yarn -yarn build:apps -``` - -and then run the app shell using `yarn run:shell`. - -### Running your Frontend Module - -In your checked-out frontend module, upgrade the `openmrs` and `@openmrs/esm-framework` -packages to version `4.0.1` or later - -```sh -yarn up openmrs@next @openmrs/esm-framework@next -``` - -In `openmrs-esm-core` run `yarn run:shell`. Then in your frontend module run `yarn serve` your frontend module and load it using the [import map overrides UI](https://o3-dev.docs.openmrs.org/#/getting_started/setup?id=import-map-overrides). - -### Alternate Approach - -Another way to upgrade frontend modules is [used for the core apps](https://o3-dev.docs.openmrs.org/#/under_the_hood/migration_guide?id=procedure). You can use that technique for your frontend module, but it is much more involved than the above. - -## Upgrading - -For a complete look at what needs to be upgraded, please read the relevant documentation for the following: - -- [React 16 to 17](https://reactjs.org/blog/2020/08/10/react-v17-rc.html#other-breaking-changes) -- [React 17 to 18](https://reactjs.org/blog/2022/03/08/react-18-upgrade-guide.html) -- [React Router 5 to 6](https://reactrouter.com/en/main/upgrading/v5) -- [Carbon 10 to 11](https://github.com/carbon-design-system/carbon/blob/main/docs/migration/v11.md) -- [Jest 26 to 27](https://jestjs.io/blog/2021/05/25/jest-27) -- [Jest 27 to 28](https://jestjs.io/blog/2022/04/25/jest-28) -- [User Event 12 to 13](https://github.com/testing-library/user-event/releases/tag/v12.0.0) -- [User Event 13 to 14](https://github.com/testing-library/user-event/releases/tag/v14.0.0) - -In practice, relatively little of that will apply to your frontend module. Here are the -most likely changes you'll need to make: - -### Jest - -- Add the following to your `jest.config.json`. - -```json - "testEnvironment": "jsdom", - "testEnvironmentOptions": { - "url": "http://localhost/" - } -``` - -- Remove the following `moduleNameMapper` references in your `jest.config.json`: - -```json -"moduleNameMapper": { - "lodash-es": "lodash" - "\\.(s?css)$": "identity-obj-proxy", - "@openmrs/esm-framework": "@openmrs/esm-framework/mock", - // Remove the following lines - "^@carbon/icons-react/es/(.*)$": "@carbon/icons-react/lib/$1", - "^@carbon/charts": "identity-obj-proxy", - "^carbon-components-react/es/(.*)$": "carbon-components-react/lib/$1", -}, -``` - -### User Event - -- Invoke `userEvent.setup()` before your component gets rendered in your test spec. Use the methods returned from the invocation rather than calling `userEvent` directly. - -```js -it('trigger some awesome feature when clicking the button', async () => { - const user = userEvent.setup(); - - render(); - - await user.click(screen.getByRole('button', { name: /click me!/i })); - - // ...assertions... -}); -``` - -- Make sure to `await` every `userEvent` function call. - -```js -await user.click(screen.getByRole('button', { name: /click me!/i })); -``` - -### React Router - -This is the most involved of the changes. You really just have to follow the [React Router 5 to 6 upgrade guide](https://reactrouter.com/en/main/upgrading/v5). - -### Carbon -- Change `carbon-components-react` to `@carbon/react` -- Change `carbon-icons` to `@carbon/icons-react` -- Icons now get size from a prop. So change e.g. `` to ``. -- Replace any style rules that use the `bx--` prefix with `cds--`. Often, you can do a global find and replace to achieve this. -- Import Carbon's spacing and type token mixins using `@use '@carbon/styles/scss/spacing` and `@use '@carbon/styles/scss/type` instead of the old `@import "~carbon-components/src/globals/scss/mixins"` import. Also, the signature for referencing mixins changes as follows: - -```scss -// old type mixin -.heading { - @include carbon--type-style("productive-heading-02"); -} - -// new type mixin -.heading { - @include type.type-style("productive-heading-02"); -} - -// old spacing mixin -.formGroup { - margin-bottom: $spacing-02; -} - -// new spacing mixin -.formGroup { - margin-bottom: spacing.$spacing-02; -} -``` - -- Replace deprecated [type tokens](https://github.com/carbon-design-system/carbon/blob/main/docs/migration/v11.md#type-tokens). -- Components no longer use the `light` prop. Wrap your code in a `Layer` component instead. -- Changes to the [Grid](https://github.com/carbon-design-system/carbon/blob/main/docs/migration/v11.md#grid) component might mean your layouts no longer work as they should. Consider using the [FlexGrid](https://github.com/carbon-design-system/carbon/blob/main/docs/migration/v11.md#flexgrid) component instead as well as a [Stack](https://react.carbondesignsystem.com/?path=/story/layout-stack--default) for vertical spacing. - - -If errors or visual inconsistencies remain, reference the [migration docs](https://github.com/carbon-design-system/carbon/blob/main/docs/migration/v11.md). - -### OpenMRS - -Where: - -```typescript -const layout = useLayoutType(); -``` - -Change `layout == "desktop"` to `isDesktop(layout)`. - -### ESLint - -Add following rules to your `.eslintrc`: - -```json -"rules": { - "no-restricted-imports": [ - "error", - { - "patterns": [ - { - "group": ["carbon-components-react"], - "message": "Import from `@carbon/react` directly. e.g. `import { Toggle } from '@carbon/react'`" - }, - { - "group": ["@carbon/icons-react"], - "message": "Import from `@carbon/react/icons`. e.g. `import { ChevronUp } from '@carbon/react/icons'`" - } - ] - } - ] -} -``` - -These patterns will help flag imports that use the older Carbon 10 import notation. diff --git a/docs/offline/dynamic_offline_data.md b/docs/offline/dynamic_offline_data.md deleted file mode 100644 index 2a67986a6..000000000 --- a/docs/offline/dynamic_offline_data.md +++ /dev/null @@ -1,190 +0,0 @@ -# Dynamic Offline Data - -In order to support offline usage of the application, OpenMRS must precache specific resources. -In general, we can differentiate between two offline resource categories: - -1. Static resources -2. Dynamic resources - -An example of *static resources* are compiled artifacts like HTML files, compiled JS files or -images provided by the app shell or arbitrary microfrontend modules. During a user session, -*static resources* don't change - they are always known and can automatically be precached -by the application. - -*Dynamic resources*, on the other hand, depend on choices the user actively makes during a session. -Take, for example, offline patients. Automatically precaching every single patient is not possible -due to the sheer size of data that would have to be stored on a device. To solve this issue, -OpenMRS provides the concept of the *offline patient list* in the offline tools UI. This offline -patient list is a screen that allows a user to actively select and deselect the patients to -be taken offline. Upon selection, each microfrontend module must ensure that it precaches all -patient-related resources that it requires for an offline session. - -The above paragraph only mentioned offline *patient* lists. The concept of an "offline list" exists -for multiple resources though, e.g. for the aforementioned patients, but also offline forms. -In theory, it is possible to maintain dynamic offline lists of any kind of resource. -The OpenMRS `esm-framework` provides a shared API for managing those arbitrary offline lists -and synchronizing the data of the resources tracked on each list. This API is called the -"Dynamic Offline Data API". - -In the following, the concepts and members of the dynamic offline data API are explained. - - -## Dynamic Offline Data Overview - -From a high-level perspective, the dynamic offline data API needs to address two concerns: - -1. Offline list maintenance: Adding/removing/updating items on an offline list of a - specific *resource type*. -2. Offline list synchronization: Enable microfrontend modules to precache the data of a resource on - an offline list. - -These two cornerstones enable the offline data management flow shown in the following diagram, -using the example of making a patient offline-ready: - -![Dynamic Offline Data Flow](./dynamic_offline_data_flow.png) - -As shown in the image above, the raw "lists" are simply stored in a client-side database table. -These table entries only contain the information required for synchronizing a resource, i.e. -its `type` (to distinguish between different resources, e.g. `patient` vs. `form`) and an -`identifier` (which is typically the UUID of the resource). -With this information available, each microfrontend module can register a *synchronization -handler* function which, when invoked, receives the information from the table and can, by using -that information, make any API calls necessary for fetching and precaching the exact data -that this specific microfrontend module needs for working with that patient in offline mode. -One microfrontend module might, for example, need to precache the entire patient resource while -another one might only require a slimmed-down version that only contains the patient's name. - - -## Managing Dynamic Offline Data ("Resource Lists") - -This section describes the API that is provided by `esm-framework` for managing dynamic offline -data lists. This section can only provide an overview. For additional details, see the corresponding -API documentation. - -The following code fragment shows how the API can be used to manage the offline patient list: - -```ts -// In order to manage a list, we require a `type`. -// The type is a convention. Different microfrontend modules must agree on the same type -// in order to access the same lists. -// OpenMRS uses the `patient` type for managing the "Patient" resource. -const patientListType = 'patient'; - -// Adding patients to the list is simple: -// We can call `putDynamicOfflineData` which adds the patient with the given identifier/UUID -// to the offline patient list. -// If a patient already exists on the list, nothing happens (hence the `put`). -const patientUuid = '00000000-0000-0000-0000-000000000001'; -await putDynamicOfflineData(patientListType, patientUuid); - -// In order to synchronize the data of that patient, we can use `syncDynamicOfflineData`. -// This only synchronizes this specific patient. Other patients on the list are *not* synced. -await syncDynamicOfflineData(patientListType, patientUuid); - -// It is also possible to sync *all* entries on a given list at the same time: -await syncAllDynamicOfflineData(patientListType); - -// If we want to remove the patient, we can do so with `removeDynamicOfflineData`. -await removeDynamicOfflineData(patientListType, patientUuid); -``` - -It is also possible to retrieve all entries on a list. This is, for example, required for -displaying the patients who are currently marked as offline patients in a table. - -```ts -// getDynamicOfflineDataEntries can be used to either retrieve all entries or only those of a given type. -const allEntries = await getDynamicOfflineDataEntries(); -const allOfflinePatientEntries = await getDynamicOfflineDataEntries('patient'); - -for (const entry of allEntries) { - console.log( - 'Entry information (not necessarily complete):', - entry.type, - entry.identifier, - entry.users, - entry.syncState, - ); -} -``` - - -## Dynamic Offline Data Synchronization - -The previous section showed how dynamic offline data lists are managed and how synchronization -can be triggered. In this section, the second cornerstone, data synchronization, is shown. - -The core idea of synchronization is that each individual microfrontend module might need to -precache different data for the same resource. At the example of the offline patient, it could -happen that the following microfrontend modules might need to precache the following, different -datasets: - -* **MF 1:** The entire patient resource. -* **MF 2:** A slimmed-down patient resource, only containing the patient's name. -* **MF 3:** Nothing at all. - -Therefore, each module must be allowed to provide its own synchronization logic. -This is centrally enabled by the dynamic offline data API via so-called "synchronization handlers" -(a.k.a. `DynamicOfflineDataHandler`). -A synchronization handler is a simple object providing, at minimum: - -1. A unique ID. -2. Information about which resource `type` it can synchronize. -3. A function `sync` that does the actual precaching/synchronization logic. -4. A function `isSynced` which evaluates whether all required data is precached - *at this very moment*. - -The following code fragment shows how a handler for precaching patient data can be setup: - -```ts -setupDynamicOfflineDataHandler({ - id: 'my-microfrontend-module:patient-handler', - type: 'patient', - - // Optional. - get displayName() { - return i18n('My microfrontend offline patient handler'); - }, - - async isSynced(identifier: string, abortSignal?: AbortSignal) { - return await isUrlInCache(`/ws/rest/v1/patient/${identifier}`, abortSignal); - }, - - async sync(identifier: string, abortSignal?: AbortSignal) { - return await precacheUrl(`/ws/rest/v1/patient/${identifier}`, abortSignal); - }, -}) -``` - -Once registered, the handler is automatically invoked when a `patient` is synchronized via -one of the synchronization functions described in the previous section. - -It is also possible for any microfrontend module to retrieve (and directly use) all currently -registered handlers. This may, for example, be useful for determining which data is currently -synchronized: - -```ts -const allHandlers = getDynamicOfflineDataHandlers(); -const patientHandlers = allHandlers.filter(x => x.type === 'patient'); - -for (const patientHandler of patientHandlers) { - console.log( - 'Is a patient synchronized?', - await patientHandler.isSynced('00000000-0000-0000-0000-000000000001') - ); -} -``` - - -## User-Specific Dynamic Offline Data Entries - -OpenMRS, naturally, supports multiple users. If multiple users use the same device, it is possible -for both users to have different offline lists (for example because they require different patients -in offline mode). -By default, the functions described above automatically use the logged-in user. For example, -`putDynamicOfflineData` automatically stores the UUID of the currently logged-in user in -the entry that is created in the table. - -Despite this, it is also possible to actively declare the user for which an entry should be managed. -By convention, functions which allow specifying a user have the `For` suffix. -`putDynamicOfflineData(type, identifier)` becomes `putDynamicOfflineDataFor(userId, type, identifier)`. -For additional details, see the corresponding API documentation or the codebase itself. diff --git a/docs/offline/dynamic_offline_data_flow.drawio b/docs/offline/dynamic_offline_data_flow.drawio deleted file mode 100644 index 6ee921a2c..000000000 --- a/docs/offline/dynamic_offline_data_flow.drawio +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/docs/offline/dynamic_offline_data_flow.png b/docs/offline/dynamic_offline_data_flow.png deleted file mode 100644 index ccaf3242dc7f565b63d12e2d83ee0023b05563f4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68344 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

    ixBoyZE(1U;ygyMi`aoA!a^`f;FnV~i-6~7 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 f}UTUK{T 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 XJh8$vr;v_B;Gde3wqlXI<@5gndfN#R diff --git a/docs/offline/offline.md b/docs/offline/offline.md deleted file mode 100644 index 366d51d9f..000000000 --- a/docs/offline/offline.md +++ /dev/null @@ -1,129 +0,0 @@ -# Offline Mode - -The OpenMRS 3.0 SPA solution uses [Workbox](https://developers.google.com/web/tools/workbox) to easily create an extensible service worker implementation to support offline capabilities. - -There are three facets that are unique to this approach: - -1. Each component (page / extension) can be marked as offline (or online) capable. By default every component is online capable, but not offline capable. -2. Each frontend module can declare certain (HTTP) calls to be cacheable. -3. Each frontend module can queue items to be processed when the application is back online. - -## Registration - -For instance, the following snippet shows a typical extension registration: - -```js -function setupOpenMRS() { - return { - extensions: [ - { - id: "foo", - load: getAsyncLifecycle(() => import("./foo.component")), - }, - ], - }; -} -``` - -Now regarding the extension's online / offline capabilities this is equivalent to: - -```js -function setupOpenMRS() { - return { - extensions: [ - { - id: "foo", - online: true, - offline: false, - load: getAsyncLifecycle(() => import("./foo.component")), - }, - ], - }; -} -``` - -Which means that the component can be used online, but will not be available when offline. If we would want to provide offline support a simple `true` would be sufficient: - -```js -function setupOpenMRS() { - return { - extensions: [ - { - id: "foo", - offline: true, - load: getAsyncLifecycle(() => import("./foo.component")), - }, - ], - }; -} -``` - -Alternatively, we might want to specify some services to be injected depending on the connectivity mode: - -```js -function setupOpenMRS() { - return { - extensions: [ - { - id: "foo", - online: { - onSave: OnlineSaveService, - }, - offline: { - onSave: OfflineSaveService, - }, - load: getAsyncLifecycle(() => import("./foo.component")), - }, - ], - }; -} -``` - -In this case the extension is available independent of the connectivity. In the offline case the `onSave` prop is defined to the value of a `OfflineSaveService` variable, while in the online case the same prop will be set to `OnlineSaveService`. This way the behavior of the actual component will be adjusted to the environment. - -## Synchronization - -When offline there are two aspects that might be handled with higher priority: - -1. How to deal with items that would need to be sent to the backend right now (e.g., submitting a form) -2. How to deal with items that should have been send to the backend previously (e.g., previously submitted forms) - -For (1) you can just place such items in a queue. Ideally, you'd just recognize the action either via a dedicated offline service or via the service worker (i.e., HTTP request). Either way the `queueSynchronizationItem` function from `@openmrs/esm-framework` (more specifically `@openmrs/esm-offline`) will help you to do that. - -Example: - -```js -queueSynchronizationItem('my-offline-data', { - // content of item to queue -}); -``` - -Once items are in this queue it makes sense to start thinking about (2). For this, you should register a queue processor via the `setupOfflineSync` function: - -```js -function setupOpenMRS() { - setupOfflineSync('my-offline-data', ['other-offline-data'], async item => { - // process the item, e.g., send it to the backend - }); - - // ... -} -``` - -The previous snippet creates a synchronization processor for items of type `my-offline-data`. These items have a (potential) dependency to other items of type `other-offline-data`. Therefore, these items will be processed *before* the `my-offline-data` items. - -## State Machine - -Offline is in general a bit of a difficult topic. Most importantly, there are multiple states associated with it. Not only is the specific behavior dependent on the state of the network (online, offline), but also of the user (wants or does not want to be offline ready) and the application (already offline ready or still trying to be offline ready or updating the files required to go offline). - -The following state diagram shows the different entry points and their possible transitions. - -![Map of OpenMRS offline capability and state transitions](./openmrs-offline-state.png) - -Importantly, the user has 5 possible entry points to the application: - -- Fresh state (did not opt-in) -- Downloading assets state (did opt-in, but never finished) -- Ready state (did opt-in, no changes since last use), followed by a data sync -- Outdated state (did opt-in, changes to assets since last use) -- Offline state (did opt-in, no Internet connectivity) diff --git a/docs/offline/openmrs-offline-state.drawio b/docs/offline/openmrs-offline-state.drawio deleted file mode 100644 index d07bc11af..000000000 --- a/docs/offline/openmrs-offline-state.drawio +++ /dev/null @@ -1 +0,0 @@ -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 \ No newline at end of file diff --git a/docs/offline/openmrs-offline-state.png b/docs/offline/openmrs-offline-state.png deleted file mode 100644 index 6dc3e94503f4f35866d5e7d47b778b4adbe96d7d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 100969 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 z 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 z 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 diff --git a/docs/under_the_hood/architecture.md b/docs/under_the_hood/architecture.md deleted file mode 100644 index 46079c881..000000000 --- a/docs/under_the_hood/architecture.md +++ /dev/null @@ -1,32 +0,0 @@ -# Architecture Overview - -Below you'll find an architecture diagram connecting the parts from the core application with the (frontend) ecosystem. - -![Architecture Diagram](./architecture.png) - -## Startup - -When the application loads it goes through the following steps. - -1. Preloads the importmap and related files -2. Evaluates the stylesheets and scripts -3. Configures the SPA application -4. Installs the service worker for offline capabilities -5. Loads and evaluates the different frontend modules from the importmap -6. Loads and validates the provided configurations -7. Sets up the offline capabilities and synchronization features -8. Renders the UI - -Once the UI is rendered the content is exclusively coming from the different frontend modules. The app shell is solely an orchestration layer. - -## Frontend module anatomy - -Frontend modules use [dynamic imports](https://webpack.js.org/guides/code-splitting/) -to split into a "front bundle" and content bundles. -The front bundle begins at the entry point, which the -[webpack config](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/tooling/openmrs/default-webpack-config.js) -takes from the -[main entry of package.json](https://github.com/openmrs/openmrs-esm-template-app/blob/69b0f7a3ef3e79e9851fc0621e8b6c8311e7e6d7/package.json#L7) -and which is usually `src/index.ts`. This bundle should be small and not contain much -code. The functions `getAsyncLifecycle` and `getLifecycle` use dynamic imports -to import the frontend module content only when it is needed. diff --git a/docs/under_the_hood/architecture.png b/docs/under_the_hood/architecture.png deleted file mode 100644 index 0139e9e65f733b8980da7c4c4f5d65affedd5959..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36702 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 D=RX}E diff --git a/docs/under_the_hood/extensions.md b/docs/under_the_hood/extensions.md deleted file mode 100644 index a117f4bad..000000000 --- a/docs/under_the_hood/extensions.md +++ /dev/null @@ -1,69 +0,0 @@ -# How the Extension System Works - -For the extension system to work four things exist: - -1. A generic component model with a defined lifecycle and loading mechanism -2. A way to define where extensions should be placed (so called "slot") -3. A way to define an extension coupling it to (1) -4. A configuration for assigning available extensions from (3) to slots (2) - -Let's look at these four things. - -## Behind the Scenes - -For (1) the parcel mechanism of single-spa is used. - -For (2) you can use the `registerExtensionSlot` function together with `renderExtension`. For frameworks such as React helper components may exist (e.g., `ExtensionSlot`). - -For (3) you can define an extension in the return value from the `setupOpenMRS` function. An example for this: - -```js -function setupOpenMRS() { - return { - extensions: [ - { - id: "foo", - load: getAsyncLifecycle(() => import("./foo.component")), - }, - ], - }; -} -``` - -As a shorthand for (4) you could already specify a target slot via the `slot` property in the previous code snippet. Without that convenience way you'd still be able to register it programmatically using `attach`: - -```js -// attaches an extension "foo" to a slot "foo-slot" -attach('foo-slot', 'foo'); -``` - -Generally, though this is either done at initialization time as a default, or explicitly via a user-provided configuration. The only exception can be found with "dynamic" (or "special") slots. One example in this area is the workspace of the patient chart frontend module. - -## Extensions and Slots - - An extension can be in any of the following four states with respect to an extension slot: - - _attached_ (set via code using `attach` and `detach`) - - _configured_ (set via configuration using: `add` and `remove`) - - _assigned_ (computed from attached and configured) - - _connected_ (computed from assigned using connectivity and online / offline) - -## Rendering - -Extensions are rendered by following their exported lifecycle functions. The `getAsyncLifecycle` function from `@openmrs/esm-react-utils` is a convenience layer that already exports these lifecycle functions wired together with `single-spa-react`. - -In a nutshell: - -1. When the component should be rendered the `load` function is evaluated - in case of a `Promise` (via the asynchronously loaded `import` function) this first waits for the component to be available -2. The component is placed into its lifecycle functions provided by `single-spa-react` -3. The lifecycle functions `bootstrap`. `mount`. `unmount`, and `update` are exported - -These lifecycle functions are not magic - theoretically you could write them on your own, however, since the single-spa ecosystem already provides convenience wrappers such as `single-spa-react` for many frameworks we don't recommend it. - -To actually render also two more things need to be considered: - -1. Does the extension render in offline or online mode, and which mode is the browser in? -2. What properties should be passed to the component which is rendered? - -The answer to (1) is found in `navigator.onLine`. Only if `offline` was set to `true` or some object the component renders in offline mode. Likewise, if `online: false` was supplied the component will not render in online mode. - -The answer to (2) are the `meta` properties along with the extension's context (e.g., what slot it is rendered to) and its injected services. The injected services are defined via `online` or `offline`. In case of `true` no services are injected. In case of an object the provided key-value pairs are interpreted as services, which should be injected depending on the connectivity case. diff --git a/docs/under_the_hood/migration_guide.md b/docs/under_the_hood/migration_guide.md deleted file mode 100644 index cad18a1fd..000000000 --- a/docs/under_the_hood/migration_guide.md +++ /dev/null @@ -1,217 +0,0 @@ -# Migration Guide for Core Dependencies - -## Motivation - -Presently, the OpenMRS 3 frontend uses core dependencies that are several years out of date. Specifically, we are looking to migrate the following dependencies to the latest available versions to be able to leverage new features, fixes, API improvements, and bundle size savings: - -- React -- React Router -- Carbon Design System -- Jest / React Testing Library / userEvent - -## Preamble - -* React 18 adds in concurrency, automatic render batching, and makes `` a first class citizen leading to **faster loading** of elements due to the decoupling of UI rendering and API fetching. -* This compounds with React Router 6 which can enable a **several times speedup** of widget load times when implemented correctly. -* Updates to Carbon v11 keep the UI modern for designers, the package and API cleanup makes it faster to use for developers, and smaller bundle sizes mean a faster UI for customers. -* Jest now supports test sharding which means our tests can run faster than ever. - -## Dependencies - -### React -We're currently on React 16.14 (released in October 2020) across all our repositories. React 18, released in March 2022, brought out-of-the-box improvements like automatic batching, new APIs like `startTransition`, and streaming server-side rendering with support for `Suspense`. Notably: - - - `Suspense` is now a first-class citizen. This will allow us to unblock component rendering while API calls decide to load. - - Children are no longer implicitly declared as props of type `React.ReactNode`. They have to be declared explicitly. - - Automatic batching is enabled by default which helps reduce the number of renders. - - The new concurrent render means that the UI can immediately respond to user input even if it's in the middle of a large render task -. This should result in a more fluid user experience. - - The concurrent render also adds support for reusable state so that previously rendered sections of the UI can be added back in. - -Important resources: [React 18 release notes](https://reactjs.org/blog/2022/03/29/react-v18.html) and [Migration Guide](https://reactjs.org/blog/2022/03/08/react-18-upgrade-guide.html). - -### React Router -We're currently on React Router v5.3 (released in March 2019). React Router 6 introduces several powerful new features, as well as improved compatibility with the latest versions of React. Notably: - - - All ``s and ``s inside a `` are relative. This leads to leaner and more predictable code in `` and ``. - - Routes are chosen based on the best match instead of being traversed in order. This avoids bugs due to unreachable routes because they were defined later in the `` - - Routes are allowed to be nested instead of being spread out. This allows all routes to be easily seen at once. Meanwhile, nested routes can still be loaded dynamically via `React.lazy`. - - Route children can only be nested routes; rendered elements need to go in `element`. This simplifies reading the routing structure leading to fewer bugs. - - Switches to using React Elements instead of Components. This combined with React 18's native Suspense makes for very quick rendering. - - Discontinued use of regex routes leads to cleaner route syntax and drops `path-to-regexp` dependency reducing bundle size. -`useNavigate` is more suspense friendly than the old `useHistory`. This provides a smoother experience when a user interaction needs to interrupt a pending route transition. - -Important resources: [Migration Guide](https://reactrouter.com/en/main/upgrading/v5). - -### Carbon Design System -We're currently on Carbon v10 (released in December 2020). Carbon 11 shipped with a host of feature improvements, fixes and enhancements to the developer experience. Notably: - - - The [Design Kit](https://carbondesignsystem.com/migrating/guide/design) has: - - Updated concepts for Notifications, Tooltip, Tabs, Sizing, Type tokens, and Color tokens. - - New Popover and Toggletip features. - - The UI shell is now theme-able to support light and dark mode. - - The [React packages](https://carbondesignsystem.com/migrating/guide/develop) have been simplified from 4 packages down to one: `@carbon/react`. - - Sass styles are now accessible directly from `@carbon/react/scss` - - 90% decrease in compilation time of Styles from Carbon. - - `size` is now consistent across all components. - - Uses CSS Grid (2 dimensional) by default instead of flexbox grid (1 dimension). (See [MDN](https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Grid_Layout/Relationship_of_Grid_Layout) for more info.) - - Same IBM Design Language. Does not require any brand-driven product redesigns. - -Important resources: [Carbon v11 release notes](https://v10.carbondesignsystem.com/whats-happening/v11-release/) / [Migration Guide](https://github.com/carbon-design-system/carbon/blob/main/docs/migration/v11.md) / [Carbon v11 announcement blog post](https://medium.com/carbondesign/carbon-v11-72ace7fac01f). - -### Jest / Testing Library React / userEvent - -We're currently on the following versions: - -- Jest v26 -- Testing Library React v10 -- userEvent v12 - -Jest v28 introduced some long-requested features such as: - - - Support for sharding a test run across multiple machines. Upon leveraging this feature, Jest's own test suite on CI went from about 10 minutes to 3 on Ubuntu, and on Windows from 20 minutes to 7. - - In Jest 28, jest-environment-node will now automatically provide node and node-addons conditions, while jest-environment-jsdom will provide the browser condition. - - The ability to customize the behavior of fake timers. - - A new GitHub Actions reporter, which will use annotations to print test errors inline. - Vastly improved type annotations. - -Testing Library React v13 notably adds support for React 18 and drops support for older versions of React. - -userEvent v14 adds various features and fixes. Notably: - - - The new `userEvent.setup` allows you to prepare the document for interacting per user-event APIs right when you set up your test. - - v14 introduces a new `userEvent.pointer` API that enables users to simulate the events for user interaction per touchscreen or stylus. - - APIs in v14 now always return a promise and are therefore asynchronous. As such, they have to be await-ed. - -Important resources: [Jest 28 release notes](https://jestjs.io/blog/2022/04/25/jest-28) / [Testing Library React 13 changelog](https://github.com/testing-library/react-testing-library/releases/tag/v13.0.0) / [userEvent 14 changelog](https://github.com/testing-library/user-event/releases/tag/v14.0.0). - -## Strategy - -Because all versions are pointing to `next` version of `esm-framework`, `openmrs`, and `webpack-config` -we will need to manually point to a 4.0 shell. Because this is not addressable using tag syntax and the 4.0 -branch is not found on the package manager npmjs.com we need to pull the branch locally, build it into -consumable .js files and serve the .js files from the app shell. Once the shell is ready to serve the -backbone of the app we can start to add microfrontends to it one at a time through serving those microfrontends -locally and pointing to the local server via import map. With the core and apps running on the same local -browser, we can start to integrate the modules together using the new libraries. - -## Procedure - -1. Get latest openmrs-esm-core branch ([4.0](https://github.com/openmrs/openmrs-esm-core/tree/main)) - This is the branch where new versions of the core libraries are specified (thanks to a prior effort by Brandon) - -2. Build the App Shell – This compiles the core source files into static webpack JS files which can be served. This will automatically bundle all of the openmrs-esm-core/packages/apps/ into a dist folder. The yarn run:shell at the end serves this app shell on 8080 and will be our main entry into the app. - - - In openmrs-esm-core: `cd packages/tooling/webpack-config` then `yarn build` - - - In openmrs-esm-core: `cd packages/tooling/openmrs` then `yarn build` - - - In openmrs-esm-core: `cd packages/shell/esm-app-shell` then `yarn build` - - - In openmrs-esm-core: `yarn run:shell` - - At this point there should be no errors in the terminal. The web server should start in your terminal and the app shell should load in your browser, although most of the microfrontends will be missing and should tell you this in the browser console. - -3. Create links to all core packages (if you haven't already). This will make them available in the yarn system to do a symlink shorthand inside of node_modules - - * In each openmrs-esm-core/packages/[apps, framework, shell/esm-app-shell/, tooling] repo create a yarn link like: `yarn link` - - -4. Link child package to the up-to-date openmrs-esm-core. This will tell them to use the local version rather than downloading "next" from [npmjs.com](npmjs.com). - - * In openmrs-esm-patient-management `yarn link @openmrs/esm-app-shell` (example of doing one at a time) - - * In openmrs-esm-patient-management `yarn link @openmrs/esm-api @openmrs/esm-config @openmrs/esm-extensions @openmrs/esm-globals @openmrs/esm-react-utils @openmrs/esm-styleguide @openmrs/esm-breadcrumbs @openmrs/esm-error-handling @openmrs/esm-framework @openmrs/esm-offline @openmrs/esm-state @openmrs/esm-utils` (do everything at once to save time) - - * You can check that this is working by using patient-management% `ls –l node_modules@openmrs`. This should show symlinks instead of the usual directories containing the source code. - -5. Copy the contents of openmrs-esm-core webpack-config build files ( in `webpack-config/dist/`) to the the target repo. We need to do it this way because symlinks will not work with webpack config - - * Copy the files over: In esm-patient management `cp -r /path/to/esm-core/packages/tooling/webpack-config/dist/* node_modules/@openmrs/webpack-config/dist/ ` - - * Point the individual mocrofrontend up to the repo's version of webpack config: Change the contents of `openmrs-esm-patient-management/packages/esm-patient-search-app/webpack.config.js` to be: - >`module.exports = require('../../node_modules/@openmrs/webpack-config'); ` - - * Using `ls -l node_modules/@openmrs` in patient-management again we should see all the previous symlinks and now `webpack-config` which is a directory instead - -6. Upgrade React within a repo. We do this now so that the types can resolve properly. - - * [Add React](https://reactjs.org/blog/2022/03/08/react-18-upgrade-guide.html). In openmrs-esm-patient-management: `yarn add -D -W react react-dom` - - * Add types. In openmrs-esm-patient-management: `yarn add -D -W @types/react@latest @types/react-dom@latest @types/react-router-dom@latest` - - * Update microfrontend reference. In patient-search: `yarn add --peer react` - -7. Serve the specific app you want the app shell to find. This will start another local server where this module will be active, referencing by this point hopefully all the correct versions of the core. - - * In openmrs-esm-patient-management `cd packages/esm-patient-search-app` then `yarn serve` - - * This will start a webpack dev server. Your microfrontend will be available at something like `[webpack-dev-server] Loopback: http://localhost:8081/` - -8. Add to import map overrides to the app shell ([See the developer docs](http://o3-dev.docs.openmrs.org/#/getting_started/setup)). In the browser where app shell is running (`http://localhost:8080/openmrs/spa/home`): - - * Enable devtools by setting `localStorage.setItem('openmrs:devtools', true)` in your console browser - - * Open the devtools by clicking grey box in lower right of page. - - * Find 'patient-search' -> click on it to edit entry - - * Type `8081` to set import url to "`//localhost:8081/openmrs-esm-patient-search-app.js`" (Make corrections to this based on what your port was from the previous step) - - * Refresh the page. You should see the app running - -At this point you will have a local version of the core app shell running, and one of the microfrontends served locally on a different server. The app shell is then pointed to the second server thanks to the importmap override done with the help of the devtools. Now you can really start the integration effort in earnest. Let's upgrade the rest of the packages. - -9. Upgrade Carbon to v11 - - * Follow the upgrade guide [here](https://carbondesignsystem.com/migrating/guide/develop). - -10. Upgrade React Router Dom to v6 - - * Follow the upgrade guide [here](https://reactrouter.com/en/main/upgrading/v5) - -11. Upgrade Jest to v28 - -12. Upgrade Testing Library React to v13 - -13. Upgrade userEvent to v13 - -Congratulations! You have upgraded one microfrontend to use the latest libraries. - -Repeat steps 4-8 for all packages you want to serve, upgrade, and re-integrate at the same time. - -## Troubleshooting & Tips - -The following commands can help you figure out what is happening when you run into trouble: - -* `yarn list @types/react` to see conflicting type definitions of react. - -* `yarn why` to see why a particular module is loaded. - -* `ls –l node_modules/@openmrs` to see which packages are symlinks or downloaded files. - -* When in doubt destroy node_modules folder and rebuild by running `yarn`. - -* When in doubt start from the beginning with `git status` to check you are on the right branch and `git pull` to find the latest updates. - -* `yarn upgrade` for this migration is tricky since we technically don't want the latest of the core or framework packages listed on npmjs.com. We are trying to use our own versions. This will help upgrade other packages (to within their current semver specification in package.json) if they need it, but likely you will need to re-link the esm-framework folders - -* Easy to revert all symlinks by destroying node_modules and running `yarn` - -## Releasing a major pre-release version of esm-core - -To prepare other frontend modules it is helpful to have pre-releases of new major versions. -For example, before 4.0.0 is released, 4.0.0-pre.1 is released so that frontend -module maintainers can install that version and fix everything that needs to be -fixed. - -To release a version like `4.0.0-pre.5`: -1. Make sure the release branch is in good shape. `yarn` and `yarn verify`. -2. Build everything. `yarn turbo run build`. -3. Version bump. `yarn lerna version`. Select "Custom Version" and type `4.0.0-pre.5`. -4. Publish - - In the past I have published with `yarn lerna publish from-package`. However, this - tags the published version as `latest`, which is definitely not what you want. I have - corrected this by manually running `npm dist-tag add @openmrs/esm-abc@3.4.0 latest` - for everything published, which is a very annoying thing to have to do. - - You can try doing `yarn lerna publish from-package --dist-tag=4.0`; I think `4.0` is - a reasonable tag for this. There is no way to publish without tagging at all. diff --git a/docs/under_the_hood/squad_devops.md b/docs/under_the_hood/squad_devops.md deleted file mode 100644 index 45cbb38ec..000000000 --- a/docs/under_the_hood/squad_devops.md +++ /dev/null @@ -1,19 +0,0 @@ -# Squad DevOps and CI - -The CI server at dev3.openmrs.org is a community resource, hosted on the OpenMRS infrastructure, though the actual ESMs are stored in a Digital Ocean space kindly provided by AMPATH. Every time a commit is made to -`main` in a community-managed frontend module repository, GitHub Actions -deploys the built package to Digital Ocean and updates the importmap so that the CI server always runs the latest version of all modules. - -Every time a GitHub release is created in a community-managed frontend module repository, GitHub Actions releases a new NPM package for each frontend module (tag: "latest"). The difference to an ordinary commit to `main` is that these only create preview packages (tag: "next"). - -[OpenMRS Bamboo](https://ci.openmrs.org/allPlans.action) is used only for -[openmrs-module-spa](https://github.com/openmrs/openmrs-module-spa/). Its jobs -are [here](https://ci.openmrs.org/browse/SM). - -Its CI and release process is the same as all other OpenMRS modules. - -## Docker Containers -Dockerized containers of the 3.x Reference Application are available here: -* https://hub.docker.com/r/openmrs/openmrs-reference-application-3-frontend -* https://hub.docker.com/r/openmrs/openmrs-reference-application-3-backend -* https://hub.docker.com/r/openmrs/openmrs-reference-application-3-gateway diff --git a/docs/under_the_hood/tooling.md b/docs/under_the_hood/tooling.md deleted file mode 100644 index 36843497b..000000000 --- a/docs/under_the_hood/tooling.md +++ /dev/null @@ -1,61 +0,0 @@ -# How the Developer Tooling Works - -## `openmrs develop` vs `openmrs debug` - -Generally, `openmrs develop` is the one you will want to use. It uses -build artifacts from the -version of `@openmrs/esm-framework` installed in the `openmrs` package -itself. It uses [webpack-dev-server](https://webpack.js.org/configuration/dev-server/) -to serve the application in the directory where it is run. It uses an -Express server to serve a custom import map and index file, and to -proxy the backend. - -`openmrs debug` uses the `@openmrs/esm-app-shell` webpack config. Therefore -it does approximately the same thing as doing `yarn run:shell` from -`openmrs-esm-core`, but that it also works to run the frontend module -in the directory where it is run. It will generally be slower than -`openmrs develop`, but may have some advantages related to debugging. - -## Avoiding Webpack - -If you want to use another bundler or build tool, you can still use the -`openmrs` tooling. You just have to add a special section in the `package.json`. - -Consider the following example from the `@openmrs/esm-form-entry-app` package contained in -the `openmrs-esm-patient-chart` monorepo: - -```json -{ - "scripts": { - "start": "openmrs develop", - "serve": "ng serve --port 4200 --live-reload true" - }, - "openmrs:develop": { - "command": "npm run serve", - "url": "http://localhost:4200/openmrs-esm-form-entry-app.js" - }, - // ... -} -``` - -This one will use `ng serve --port 4200 --live-reload true` when `openmrs develop` is used. -The URL `http://localhost:4200/openmrs-esm-form-entry-app.js` will be added to the import map -used for debugging. - -### Updating the Default Import Map Used by the `openmrs` Tooling - -By default, the `openmrs` tooling uses the `importmap.json` file provided by the -`@openmrs/esm-app-shell` package to serve its default set of frontend modules. -This can lead to issues, because this `importmap.json` file, in most cases, lists -outdated versions. - -To update the `importmap.json` file, you can open the `importmap.json` file in the `esm-core` -repository and replace any outdated reference with a newer one. -At the moment, we are keeping the `importmap.json` file in sync with the import map -used by the CI environment. Updating the file is therefore straightforward: -You can navigate to [https://spa-modules.nyc3.digitaloceanspaces.com/import-map.json](https://spa-modules.nyc3.digitaloceanspaces.com/import-map.json) -(which is the most recent import map used by the CI environment) and copy the JSON data to the -local `importmap.json` file. -Note that the import map from the CI environment often contains values which are not required -(for example, at the time of writing this documentation, it references both `@openmrs/esm-outpatient-app` -**and** `@openmrs/esm-outpatient-app/` - the latter, i.e. the one ending with a `/`, is unnecessary and can be removed). diff --git a/docs/under_the_hood/translations.md b/docs/under_the_hood/translations.md deleted file mode 100644 index 72b32c13d..000000000 --- a/docs/under_the_hood/translations.md +++ /dev/null @@ -1,26 +0,0 @@ -# How Translation Works - -There are three places in frontend code that relate to translation/i18n. They are: - -- The app shell, in [locale.ts](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/shell/esm-app-shell/src/locale.ts). - This sets up i18next and react-i18next. -- The [OpenMRS Component Decorator](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#openmrscomponentdecorator). - This decorator is generally wrapped around root components by - [getLifecycle](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#getasynclifecycle)/[getAsyncLifecycle](https://github.com/openmrs/openmrs-esm-core/blob/main/packages/framework/esm-framework/docs/API.md#getasynclifecycle)— - it is generally not used directly by frontend modules. - This component provides the connection between the i18next "backend" - (still on the client side, despite the name) and the frontend module it wraps. -- The frontend module, which uses the `t` function or `` component from react-i18next - to produce rendered content. Upon each commit, [i18next-parser](https://github.com/i18next/i18next-parser) parses the frontend module code and automatically extracts translation keys and strings into locale-specific translation files found in the `translations` directory of a frontend module. - -## Language Detection - -The identify the currently used language the following steps are performed: - -1. Looking at the site's current query string (`lang`) -2. Looking at the user's language preference placed on the `html` tag, which is synced with the backend -3. Looking at the site's language preference stored in `localStorage` (key `i18nextLng`) -4. Looking at the browser's language preference via `navigator` (trying properties such as `languages`, `userLanguage`, `language`) -5. Falling back to English ("en") - -In any case changing the language on the fly is as simple as changing the `lang` attribute on the site's `documentElement`. diff --git a/package.json b/package.json index 0daa12a49..aa8f40ba7 100644 --- a/package.json +++ b/package.json @@ -9,7 +9,6 @@ "packages/tooling/*" ], "scripts": { - "run:docs": "docsify serve docs", "run:omrs": "openmrs", "run:shell": "turbo run watch --filter=@openmrs/esm-app-shell --parallel --no-cache", "ci:publish-next": "yarn workspaces foreach --all --topological --exclude @openmrs/esm-core npm publish --access public --tag next", @@ -42,7 +41,6 @@ "autoprefixer": "^10.4.2", "classnames": "^2.3.2", "cross-env": "7.0.2", - "docsify": "^4.12.2", "dotenv": "^16.0.3", "eslint": "^7.10.0", "eslint-config-prettier": "^6.11.0", diff --git a/packages/apps/esm-devtools-app/README.md b/packages/apps/esm-devtools-app/README.md index 781fcd726..5cb2308ad 100644 --- a/packages/apps/esm-devtools-app/README.md +++ b/packages/apps/esm-devtools-app/README.md @@ -12,15 +12,10 @@ This is useful for developing features and for debugging problems, because you can tell the browser to load one module from your localhost while keeping all other modules using the default version in the import map. -Usage is documented both below and in the -[Import Map Overrides](http://o3-dev.docs.openmrs.org/#/getting_started/setup?id=import-map-overrides) -section of the developer documentation. - ## Installation / Usage The devtools are registered as a [single-spa application](https://single-spa.js.org/docs/building-applications/) - that creates a gray or red rectangular button near the bottom right of the screen. The rectangular button will only show up if you run the following command in the browser console: diff --git a/packages/framework/esm-config/src/module-config/module-config.ts b/packages/framework/esm-config/src/module-config/module-config.ts index 35f8ab437..da717422a 100644 --- a/packages/framework/esm-config/src/module-config/module-config.ts +++ b/packages/framework/esm-config/src/module-config/module-config.ts @@ -133,7 +133,7 @@ function computeExtensionConfigs( * configuration system how the module can be configured. It specifies * what makes configuration valid or invalid. * - * See [Configuration System](http://o3-dev.docs.openmrs.org/#/main/config) + * See [Configuration System](https://o3-docs.openmrs.org/docs/configuration-system) * for more information about defining a config schema. * * @param moduleName Name of the module the schema is being defined for. Generally @@ -159,7 +159,7 @@ export function defineConfigSchema(moduleName: string, schema: ConfigSchema) { * The schema tells the configuration system how the module can be configured. * It specifies what makes configuration valid or invalid. * - * See [Configuration System](http://o3-dev.docs.openmrs.org/#/main/config) + * See [Configuration System](https://o3-docs.openmrs.org/docs/configuration-system) * for more information about defining a config schema. * * @param extensionName Name of the extension the schema is being defined for. diff --git a/packages/framework/esm-framework/docs/API.md b/packages/framework/esm-framework/docs/API.md index 1f89cbec9..bbbd68a46 100644 --- a/packages/framework/esm-framework/docs/API.md +++ b/packages/framework/esm-framework/docs/API.md @@ -1729,7 +1729,7 @@ This defines a configuration schema for a module. The schema tells the configuration system how the module can be configured. It specifies what makes configuration valid or invalid. -See [Configuration System](http://o3-dev.docs.openmrs.org/#/main/config) +See [Configuration System](https://o3-docs.openmrs.org/docs/configuration-system) for more information about defining a config schema. #### Parameters @@ -1761,7 +1761,7 @@ in which it is defined. The schema tells the configuration system how the module can be configured. It specifies what makes configuration valid or invalid. -See [Configuration System](http://o3-dev.docs.openmrs.org/#/main/config) +See [Configuration System](https://o3-docs.openmrs.org/docs/configuration-system) for more information about defining a config schema. #### Parameters @@ -3899,7 +3899,7 @@ ___ ▸ **ExtensionSlot**(`__namedParameters`): `Element` -An [extension slot](https://o3-dev.docs.openmrs.org/#/main/extensions). +An [extension slot](https://o3-docs.openmrs.org/docs/extension-system). A place with a name. Extensions that get connected to that name will be rendered into this. diff --git a/packages/framework/esm-react-utils/src/ExtensionSlot.tsx b/packages/framework/esm-react-utils/src/ExtensionSlot.tsx index 3fb586171..65c637099 100644 --- a/packages/framework/esm-react-utils/src/ExtensionSlot.tsx +++ b/packages/framework/esm-react-utils/src/ExtensionSlot.tsx @@ -30,7 +30,7 @@ function defaultSelect(extensions: Array) { } /** - * An [extension slot](https://o3-dev.docs.openmrs.org/#/main/extensions). + * An [extension slot](https://o3-docs.openmrs.org/docs/extension-system). * A place with a name. Extensions that get connected to that name * will be rendered into this. * diff --git a/yarn.lock b/yarn.lock index 43039b339..173cd5170 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2682,7 +2682,6 @@ __metadata: autoprefixer: "npm:^10.4.2" classnames: "npm:^2.3.2" cross-env: "npm:7.0.2" - docsify: "npm:^4.12.2" dotenv: "npm:^16.0.3" eslint: "npm:^7.10.0" eslint-config-prettier: "npm:^6.11.0" @@ -7909,22 +7908,6 @@ __metadata: languageName: node linkType: hard -"docsify@npm:^4.12.2": - version: 4.12.2 - resolution: "docsify@npm:4.12.2" - dependencies: - dompurify: "npm:^2.3.1" - marked: "npm:^1.2.9" - medium-zoom: "npm:^1.0.6" - opencollective-postinstall: "npm:^2.0.2" - prismjs: "npm:^1.23.0" - strip-indent: "npm:^3.0.0" - tinydate: "npm:^1.3.0" - tweezer.js: "npm:^1.4.0" - checksum: 2af7a57fb2aa542e2929f42c1ecb6ac2aeb2953944da8efa354cf49fb5c22fb9ffd18211872d332eed8e92d9be3d6b506851c4cf742a19546c5257a09d256666 - languageName: node - linkType: hard - "doctrine@npm:^3.0.0": version: 3.0.0 resolution: "doctrine@npm:3.0.0" @@ -8049,13 +8032,6 @@ __metadata: languageName: node linkType: hard -"dompurify@npm:^2.3.1": - version: 2.4.0 - resolution: "dompurify@npm:2.4.0" - checksum: 24c488b40129c6d1f28fa46fef780b68ef5b7d966b6dfa15c6776bc3aa5ebae588ba44d5b52564721708eeb16de338f22ef4a4d8dff8f2ce7a5b8d2c1ea25083 - languageName: node - linkType: hard - "domutils@npm:^1.7.0": version: 1.7.0 resolution: "domutils@npm:1.7.0" @@ -11920,15 +11896,6 @@ __metadata: languageName: node linkType: hard -"marked@npm:^1.2.9": - version: 1.2.9 - resolution: "marked@npm:1.2.9" - bin: - marked: bin/marked - checksum: ad88455b9e2f0ffc44fa3bb89efc3aed7c0cdcd3af874ebff05d86ce9fef1593ac33bb7a582cbc8925acb802bad80c4480f759e255da39f3b5a99f8759f5ce74 - languageName: node - linkType: hard - "marked@npm:^4.0.16": version: 4.1.1 resolution: "marked@npm:4.1.1" @@ -11969,13 +11936,6 @@ __metadata: languageName: node linkType: hard -"medium-zoom@npm:^1.0.6": - version: 1.0.6 - resolution: "medium-zoom@npm:1.0.6" - checksum: d2eee0dc4089ab1362073e22e22aa3763199b8fcd5bf58adeeafbc7e7d7dfa2adbf4d96623d8c230ba9d7d175c27bd65d0517ad8b3d04dac502e3bfdf91a511a - languageName: node - linkType: hard - "memfs@npm:^3.1.2, memfs@npm:^3.4.1, memfs@npm:^3.4.3": version: 3.4.7 resolution: "memfs@npm:3.4.7" @@ -12787,15 +12747,6 @@ __metadata: languageName: node linkType: hard -"opencollective-postinstall@npm:^2.0.2": - version: 2.0.3 - resolution: "opencollective-postinstall@npm:2.0.3" - bin: - opencollective-postinstall: index.js - checksum: 69d63778087cd10c9d707d9ed360556780cfdd0cd6241ded0e26632f467f1d5a064f4a9aec19a30c187770c17adba034d988f7684b226f3a73e79f44e73fab0e - languageName: node - linkType: hard - "opener@npm:^1.5.2": version: 1.5.2 resolution: "opener@npm:1.5.2" @@ -14090,13 +14041,6 @@ __metadata: languageName: node linkType: hard -"prismjs@npm:^1.23.0": - version: 1.29.0 - resolution: "prismjs@npm:1.29.0" - checksum: 2080db382c2dde0cfc7693769e89b501ef1bfc8ff4f8d25c07fd4c37ca31bc443f6133d5b7c145a73309dc396e829ddb7cc18560026d862a887ae08864ef6b07 - languageName: node - linkType: hard - "proc-log@npm:^2.0.0, proc-log@npm:^2.0.1": version: 2.0.1 resolution: "proc-log@npm:2.0.1" @@ -16149,13 +16093,6 @@ __metadata: languageName: node linkType: hard -"tinydate@npm:^1.3.0": - version: 1.3.0 - resolution: "tinydate@npm:1.3.0" - checksum: 43574835768e19b1b566aae9f018a363c86e40bec5355f331d9dbf18a901ca4b737a9b863ed5e8f95ef07a0cac87d2c2ae68efd19b8b5eb693b78376cb419283 - languageName: node - linkType: hard - "tmp@npm:^0.0.33": version: 0.0.33 resolution: "tmp@npm:0.0.33" @@ -16383,13 +16320,6 @@ __metadata: languageName: node linkType: hard -"tweezer.js@npm:^1.4.0": - version: 1.5.0 - resolution: "tweezer.js@npm:1.5.0" - checksum: 46999b2dd02ccf0e27fc844ee17dbf581f44aa54b9cb57dc3fab700948fee82124d80219d369848a886691416a8be87926678ab1d410ec25bb4252f84d237dec - languageName: node - linkType: hard - "type-check@npm:^0.4.0, type-check@npm:~0.4.0": version: 0.4.0 resolution: "type-check@npm:0.4.0"