From a6dc433d4bf5e7e0ca5efb17d235ec5e0c969540 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Thu, 26 Jan 2023 11:38:38 +0100 Subject: [PATCH 1/5] Adds first automated conversion from Jacob's Google Docs --- src/Umbraco.Web.UI.Client/CONTRIBUTING.md | 239 ++++++++++++++++++++++ 1 file changed, 239 insertions(+) create mode 100644 src/Umbraco.Web.UI.Client/CONTRIBUTING.md diff --git a/src/Umbraco.Web.UI.Client/CONTRIBUTING.md b/src/Umbraco.Web.UI.Client/CONTRIBUTING.md new file mode 100644 index 0000000000..7cda48c9b2 --- /dev/null +++ b/src/Umbraco.Web.UI.Client/CONTRIBUTING.md @@ -0,0 +1,239 @@ +# Contribution Guidelines + +## Thoughts, links, and questions + +In the high probability that you are porting something from angular JS then here are a few helpful tips for using Lit: + +Here is the LIT documentation and playground: [https://lit.dev/](https://lit.dev/) + +### How best to find what needs converting from the old backoffice? + +1. Navigate to [https://github.com/umbraco/Umbraco-CMS](https://github.com/umbraco/Umbraco-CMS) +2. Make sure you are on the “v13/dev” branch + +### What is the process of contribution? + +* Umbraco HQ owns the Management API on the backend +* Features can be worked on in the frontend when there is an API, or otherwise, if no API is required +* A contribution should be made in a fork of the backoffice repository +* Once a contribution is ready, a pull request should be made towards the backoffice repository, where HQ will assign a reviewer +* A pull request should always indicate what part of a feature it tries to solve, i.e. which labels can be removed from the issue on the projects board + +### How to work with Github Projects + +TBD + +### Contributing in general terms + +A lot of the UI has already been migrated to the new backoffice. Generally speaking, one would find a feature on the projects board, locate the UI in the old backoffice (v11 is fine), convert it to Lit components using the UI library, put the business logic into a store/service, write tests, and make a pull request. + +We are also very keen to receive contributions towards **documentation, unit testing, package development, accessibility, and just general testing of the UI.** + +### The Management API + +The management API is the colloquial term used to describe the new backoffice API. It is built as a .NET Web API, has a Swagger endpoint (/umbraco/swagger), and outputs an OpenAPI v3 schema, that the frontend consumes. + +The frontend has an API formatter that takes the OpenAPI schema file and converts it into a set of TypeScript classes and interfaces. + +### Caveats + +1. There is currently no way to add translations. All texts in the UI are expected to be written in Umbraco’s default language of English. +2. The backoffice can be run and tested against a real Umbraco instance by cloning down the v13/dev branch, but there are no guarantees about how well it works yet. +3. Authentication has not been built, so the login page is never shown - HQ is working actively on this. + +**Current schema for API:** + +[https://raw.githubusercontent.com/umbraco/Umbraco-CMS/v13/dev/src/Umbraco.Cms.Api.Management/OpenApi.json](https://raw.githubusercontent.com/umbraco/Umbraco-CMS/v13/dev/src/Umbraco.Cms.Api.Management/OpenApi.json) + +**How to convert it:** + +Run “npm run generate:api” + +## A contribution example + +### Example: Published Cache Status Dashboard + +![alt_text](images/image1.png "image_tooltip") + +#### Boilerplate (example using Lit) + +Links for Lit examples and documentation: + +* [https://lit.dev/](https://lit.dev/) +* [https://lit.dev/docs/](https://lit.dev/docs/) +* [https://lit.dev/playground/](https://lit.dev/playground/) + +#### Functionality + +**HTML** + +The simplest approach is to copy over the HTML from the old backoffice into a new Lit element (check existing elements in the repository, e.g. if you are working with a dashboard, then check other dashboards, etc.). Once the HTML is inside the “render” method, it is often enough to simply replace “<umb-***>” elements with “<uui-***>” and replace a few of the attributes. In general, we try to build as much UI with Umbraco UI Library as possible. + +**Controller** + +The old AngularJS controllers will have to be converted into modern TypeScript and will have to use our new services and stores. We try to abstract as much away as possible, and mostly you will have to make API calls and let the rest of the system handle things like error handling and so on. In the case of this dashboard, we only have a few GET and POST requests. Looking at the new Management API, we find the PublishedCacheResource, which is the new API controller to serve data to the dashboard. + +To make the first button work, which simply just requests a new status from the server, we must make a call to PublishedCacheResource.getPublishedCacheStatus(). An additional thing here is to wrap that in a friendly function called “tryExecuteAndNotify”, which is something we make available to developers to automatically handle the responses coming from the server and additionally use the Notifications to notify of any errors: + +```typescript +import { tryExecuteAndNotify } from '@umbraco-cms/resources'; +import { PublishedCacheResource } from '@umbraco-cms/backend-api'; + +private _getStatus() { + const { data: status } = await tryExecuteAndNotify(this, PublishedCacheResource.getPublishedCacheStatus()); + + if (status) { + // we now have the status + console.log(status); + } +} +``` + +#### State (buttons, etc) + +It is a good idea to make buttons indicate a loading state when awaiting an API call. All <uui-button> support the “.state” property, which you can set around API calls: + +```typescript +@state() +private _buttonState: UUIButtonState = undefined; + +private _getStatus() { + this._buttonState = 'waiting'; + + [...await...] + + this._buttonState = 'success'; +} +``` + +### Making the dashboard visible + +#### Add to internal manifests + +All items are declared in a manifests.ts file, which is located in each section directory. + +To declare the Published Cache Status Dashboard as a new manifest, we need to add the section as a new json object that would look like this: + +```typescript +{ + type: 'dashboard', + alias: 'Umb.Dashboard.PublishedStatus', + name: 'Published Status', + elementName: 'umb-dashboard-published-status', + loader: () => import('./backoffice/dashboards/published-status/dashboard-published-status.element'), + meta: { + sections: ['Umb.Section.Settings'], + pathname: 'published-status', + weight: 9, + }, +} +``` + +Let’s go through each of these properties… + +**Type can be one of the following: + +* section - examples include: “Content”, “Media” +* dashboard - a view within a section. Examples include: the welcome dashboard +* propertyEditorUI +* editorView +* propertyAction +* tree +* editor +* treeItemAction + +**Alias is the unique key used to identify this item. + +**Name is the human-readable name for this item. + +ElementName - this is the customElementName declared on the element at the top of the file i.e + +```typescript +@customElement('umb-dashboard-published-status') +``` + +**Loader references a function call to import the file that the element is declared within + +**Meta allows us to reference additional data - in our case we can specify the section that our dashboard will sit within, the pathname that will be displayed in the url and the weight of the section + +### API mock handlers + +Running the app with “npm run dev”, you will quickly notice the API requests turn into 404 errors. In order to hit the API, we need to add a mock handler to define the endpoints which our dashboard will call. In the case of the Published Cache Status section, we have a number of calls to work through. Let’s start by looking at the call to retrieve the current status of the cache: + +![alt_text](images/image2.png "image_tooltip") + +From the existing functionality, we can see that this is a string message that is received as part of a `GET`request from the server. + +So to define this, we must first add a handler for the Published Status called `published-status.handlers.ts` within the mocks/domains folder. In this file we will have code that looks like the following: + +```typescript +import { rest } from 'msw'; +import { umbracoPath } from '@umbraco-cms/utils'; + +export const handlers = [ + rest.get(umbracoPath('/published-cache/status'), (_req, res, ctx) => { + return res( + // Respond with a 200 status code + ctx.status(200), + ctx.json( + 'Database cache is ok. ContentStore contains 1 item and has 1 generation and 0 snapshot. MediaStore contains 5 items and has 1 generation and 0 snapshot.' + ) + ); + }), +]; +``` + +This is defining the `GET`path that we will call through the resource: `/published-cache/status` + +It returns a`200 OK` response and a string value with the current “status” of the published cache for us to use within the element + +An example `POST`is similar. Let’s take the “Refresh status” button as an example: + +![alt_text](images/image3.png "image_tooltip") + +From our existing functionality we can see that this makes a `POST`call to the server to prompt a reload of the published cache. So we would add a new endpoint to the mock handler that would look like: + +```typescript +rest.post(umbracoPath('/published-cache/reload'), async (_req, res, ctx) => { + return res( + // Simulate a 1 second delay for the benefit of the UI + ctx.delay(1000) + // Respond with a 201 status code + ctx.status(201) + ); +}) +``` + +Which is defining a new `POST` endpoint that we can add to the core API fetcher using the path `/published-cache/reload`. + +This call returns a simple `OK` status code and no other object. + +### Storybook stories + +We try to make good Storybook stories for new components, which is a nice way to work with a component in an isolated state. Imagine you are working with a dialog on page 3 and have to navigate back to that every time you make a change - this is now eliminated with Storybook as you can just make a story that displays that step. Storybook can only show one component at a time, so it also helps us to isolate view logic into more and smaller components, which in turn are more testable. + +In depth: [https://storybook.js.org/docs/web-components/get-started/introduction](https://storybook.js.org/docs/web-components/get-started/introduction) + +Reference: [https://ambitious-stone-0033b3603.1.azurestaticapps.net/](https://ambitious-stone-0033b3603.1.azurestaticapps.net/) + +* Locally: npm run storybook + +For Umbraco UI stories, please navigate to [https://uui.umbraco.com/](https://uui.umbraco.com/) + +### Testing + +There are two testing tools on the backoffice: unit testing and end-to-end testing. + +#### Unit testing + +We are using a tool called Web Test Runner which spins up a bunch of browsers using Playwright with the well-known jasmine/chai syntax. It is expected that any new component/element has a test file named “<component>.test.ts”. It will automatically be picked up and there are a set of standard tests we apply to all components, which checks that they are registered correctly and they pass accessibility testing through Axe. + +Working with playwright: [https://playwright.dev/docs/intro](https://playwright.dev/docs/intro) + +#### End-to-end testing + +This test is being performed by Playwright as well but is running in a mode where Playwright clicks through the browser in different scenarios and reports on those. There are no requirements to add these tests to new components yet, but it is encouraged. The tests are located in a separate app called “backoffice-e2e”. + +### Putting it all together + +When we are finished with the dashboard we will hopefully have something akin to this [real-world example of the actual dashboard that was migrated](https://github.com/umbraco/Umbraco.CMS.Backoffice/tree/main/src/backoffice/settings/dashboards/published-status). From 7d29e5a6497be729f1942a30433e6b5ed165c4cb Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Thu, 26 Jan 2023 11:55:17 +0100 Subject: [PATCH 2/5] Tidied up a little before adding in images to support the document --- src/Umbraco.Web.UI.Client/CONTRIBUTING.md | 74 +++++++++++------------ 1 file changed, 36 insertions(+), 38 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/CONTRIBUTING.md b/src/Umbraco.Web.UI.Client/CONTRIBUTING.md index 7cda48c9b2..62ff59ea38 100644 --- a/src/Umbraco.Web.UI.Client/CONTRIBUTING.md +++ b/src/Umbraco.Web.UI.Client/CONTRIBUTING.md @@ -9,7 +9,7 @@ Here is the LIT documentation and playground: [https://lit.dev/](https://lit.dev ### How best to find what needs converting from the old backoffice? 1. Navigate to [https://github.com/umbraco/Umbraco-CMS](https://github.com/umbraco/Umbraco-CMS) -2. Make sure you are on the “v13/dev” branch +2. Make sure you are on the `v13/dev` branch ### What is the process of contribution? @@ -23,13 +23,13 @@ Here is the LIT documentation and playground: [https://lit.dev/](https://lit.dev TBD -### Contributing in general terms +## Contributing in general terms A lot of the UI has already been migrated to the new backoffice. Generally speaking, one would find a feature on the projects board, locate the UI in the old backoffice (v11 is fine), convert it to Lit components using the UI library, put the business logic into a store/service, write tests, and make a pull request. We are also very keen to receive contributions towards **documentation, unit testing, package development, accessibility, and just general testing of the UI.** -### The Management API +## The Management API The management API is the colloquial term used to describe the new backoffice API. It is built as a .NET Web API, has a Swagger endpoint (/umbraco/swagger), and outputs an OpenAPI v3 schema, that the frontend consumes. @@ -38,7 +38,7 @@ The frontend has an API formatter that takes the OpenAPI schema file and convert ### Caveats 1. There is currently no way to add translations. All texts in the UI are expected to be written in Umbraco’s default language of English. -2. The backoffice can be run and tested against a real Umbraco instance by cloning down the v13/dev branch, but there are no guarantees about how well it works yet. +2. The backoffice can be run and tested against a real Umbraco instance by cloning down the `v13/dev` branch, but there are no guarantees about how well it works yet. 3. Authentication has not been built, so the login page is never shown - HQ is working actively on this. **Current schema for API:** @@ -47,7 +47,7 @@ The frontend has an API formatter that takes the OpenAPI schema file and convert **How to convert it:** -Run “npm run generate:api” +* Run `npm run generate:api` ## A contribution example @@ -55,7 +55,7 @@ Run “npm run generate:api” ![alt_text](images/image1.png "image_tooltip") -#### Boilerplate (example using Lit) +### Boilerplate (example using Lit) Links for Lit examples and documentation: @@ -63,7 +63,7 @@ Links for Lit examples and documentation: * [https://lit.dev/docs/](https://lit.dev/docs/) * [https://lit.dev/playground/](https://lit.dev/playground/) -#### Functionality +### Functionality **HTML** @@ -89,7 +89,7 @@ private _getStatus() { } ``` -#### State (buttons, etc) +### State (buttons, etc) It is a good idea to make buttons indicate a loading state when awaiting an API call. All <uui-button> support the “.state” property, which you can set around API calls: @@ -106,9 +106,9 @@ private _getStatus() { } ``` -### Making the dashboard visible +## Making the dashboard visible -#### Add to internal manifests +### Add to internal manifests All items are declared in a manifests.ts file, which is located in each section directory. @@ -131,38 +131,36 @@ To declare the Published Cache Status Dashboard as a new manifest, we need to ad Let’s go through each of these properties… -**Type can be one of the following: +* Type: can be one of the following: + * section - examples include: `Content`, `Media` + * dashboard - a view within a section. Examples include: the welcome dashboard + * propertyEditorUI + * editorView + * propertyAction + * tree + * editor + * treeItemAction -* section - examples include: “Content”, “Media” -* dashboard - a view within a section. Examples include: the welcome dashboard -* propertyEditorUI -* editorView -* propertyAction -* tree -* editor -* treeItemAction +* Alias: is the unique key used to identify this item. +* Name: is the human-readable name for this item. -**Alias is the unique key used to identify this item. - -**Name is the human-readable name for this item. - -ElementName - this is the customElementName declared on the element at the top of the file i.e +* ElementName: this is the customElementName declared on the element at the top of the file i.e ```typescript @customElement('umb-dashboard-published-status') ``` -**Loader references a function call to import the file that the element is declared within +* Loader: references a function call to import the file that the element is declared within -**Meta allows us to reference additional data - in our case we can specify the section that our dashboard will sit within, the pathname that will be displayed in the url and the weight of the section +* Meta: allows us to reference additional data - in our case we can specify the section that our dashboard will sit within, the pathname that will be displayed in the url and the weight of the section -### API mock handlers +## API mock handlers -Running the app with “npm run dev”, you will quickly notice the API requests turn into 404 errors. In order to hit the API, we need to add a mock handler to define the endpoints which our dashboard will call. In the case of the Published Cache Status section, we have a number of calls to work through. Let’s start by looking at the call to retrieve the current status of the cache: +Running the app with `npm run dev`, you will quickly notice the API requests turn into 404 errors. In order to hit the API, we need to add a mock handler to define the endpoints which our dashboard will call. In the case of the Published Cache Status section, we have a number of calls to work through. Let’s start by looking at the call to retrieve the current status of the cache: ![alt_text](images/image2.png "image_tooltip") -From the existing functionality, we can see that this is a string message that is received as part of a `GET`request from the server. +From the existing functionality, we can see that this is a string message that is received as part of a `GET` request from the server. So to define this, we must first add a handler for the Published Status called `published-status.handlers.ts` within the mocks/domains folder. In this file we will have code that looks like the following: @@ -183,11 +181,11 @@ export const handlers = [ ]; ``` -This is defining the `GET`path that we will call through the resource: `/published-cache/status` +This is defining the `GET` path that we will call through the resource: `/published-cache/status` -It returns a`200 OK` response and a string value with the current “status” of the published cache for us to use within the element +It returns a `200 OK` response and a string value with the current “status” of the published cache for us to use within the element -An example `POST`is similar. Let’s take the “Refresh status” button as an example: +An example `POST` is similar. Let’s take the “Refresh status” button as an example: ![alt_text](images/image3.png "image_tooltip") @@ -208,7 +206,7 @@ Which is defining a new `POST` endpoint that we can add to the core API fetcher This call returns a simple `OK` status code and no other object. -### Storybook stories +## Storybook stories We try to make good Storybook stories for new components, which is a nice way to work with a component in an isolated state. Imagine you are working with a dialog on page 3 and have to navigate back to that every time you make a change - this is now eliminated with Storybook as you can just make a story that displays that step. Storybook can only show one component at a time, so it also helps us to isolate view logic into more and smaller components, which in turn are more testable. @@ -216,24 +214,24 @@ In depth: [https://storybook.js.org/docs/web-components/get-started/introduction Reference: [https://ambitious-stone-0033b3603.1.azurestaticapps.net/](https://ambitious-stone-0033b3603.1.azurestaticapps.net/) -* Locally: npm run storybook +* Locally: `npm run storybook` For Umbraco UI stories, please navigate to [https://uui.umbraco.com/](https://uui.umbraco.com/) -### Testing +## Testing There are two testing tools on the backoffice: unit testing and end-to-end testing. -#### Unit testing +### Unit testing We are using a tool called Web Test Runner which spins up a bunch of browsers using Playwright with the well-known jasmine/chai syntax. It is expected that any new component/element has a test file named “<component>.test.ts”. It will automatically be picked up and there are a set of standard tests we apply to all components, which checks that they are registered correctly and they pass accessibility testing through Axe. Working with playwright: [https://playwright.dev/docs/intro](https://playwright.dev/docs/intro) -#### End-to-end testing +### End-to-end testing This test is being performed by Playwright as well but is running in a mode where Playwright clicks through the browser in different scenarios and reports on those. There are no requirements to add these tests to new components yet, but it is encouraged. The tests are located in a separate app called “backoffice-e2e”. -### Putting it all together +## Putting it all together When we are finished with the dashboard we will hopefully have something akin to this [real-world example of the actual dashboard that was migrated](https://github.com/umbraco/Umbraco.CMS.Backoffice/tree/main/src/backoffice/settings/dashboards/published-status). From 8e77a6985f31bd9d3c29d39496c5ce22613dbd28 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Thu, 26 Jan 2023 12:05:20 +0100 Subject: [PATCH 3/5] More syntax highlighting tweaks --- src/Umbraco.Web.UI.Client/CONTRIBUTING.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/CONTRIBUTING.md b/src/Umbraco.Web.UI.Client/CONTRIBUTING.md index 62ff59ea38..f34e43df7f 100644 --- a/src/Umbraco.Web.UI.Client/CONTRIBUTING.md +++ b/src/Umbraco.Web.UI.Client/CONTRIBUTING.md @@ -4,7 +4,7 @@ In the high probability that you are porting something from angular JS then here are a few helpful tips for using Lit: -Here is the LIT documentation and playground: [https://lit.dev/](https://lit.dev/) +Here is the LIT documentation and playground: [https://lit.dev](https://lit.dev) ### How best to find what needs converting from the old backoffice? @@ -59,7 +59,7 @@ The frontend has an API formatter that takes the OpenAPI schema file and convert Links for Lit examples and documentation: -* [https://lit.dev/](https://lit.dev/) +* [https://lit.dev](https://lit.dev) * [https://lit.dev/docs/](https://lit.dev/docs/) * [https://lit.dev/playground/](https://lit.dev/playground/) @@ -67,13 +67,13 @@ Links for Lit examples and documentation: **HTML** -The simplest approach is to copy over the HTML from the old backoffice into a new Lit element (check existing elements in the repository, e.g. if you are working with a dashboard, then check other dashboards, etc.). Once the HTML is inside the “render” method, it is often enough to simply replace “<umb-***>” elements with “<uui-***>” and replace a few of the attributes. In general, we try to build as much UI with Umbraco UI Library as possible. +The simplest approach is to copy over the HTML from the old backoffice into a new Lit element (check existing elements in the repository, e.g. if you are working with a dashboard, then check other dashboards, etc.). Once the HTML is inside the `render` method, it is often enough to simply replace `` elements with `` and replace a few of the attributes. In general, we try to build as much UI with Umbraco UI Library as possible. **Controller** The old AngularJS controllers will have to be converted into modern TypeScript and will have to use our new services and stores. We try to abstract as much away as possible, and mostly you will have to make API calls and let the rest of the system handle things like error handling and so on. In the case of this dashboard, we only have a few GET and POST requests. Looking at the new Management API, we find the PublishedCacheResource, which is the new API controller to serve data to the dashboard. -To make the first button work, which simply just requests a new status from the server, we must make a call to PublishedCacheResource.getPublishedCacheStatus(). An additional thing here is to wrap that in a friendly function called “tryExecuteAndNotify”, which is something we make available to developers to automatically handle the responses coming from the server and additionally use the Notifications to notify of any errors: +To make the first button work, which simply just requests a new status from the server, we must make a call to `PublishedCacheResource.getPublishedCacheStatus()`. An additional thing here is to wrap that in a friendly function called `tryExecuteAndNotify`, which is something we make available to developers to automatically handle the responses coming from the server and additionally use the Notifications to notify of any errors: ```typescript import { tryExecuteAndNotify } from '@umbraco-cms/resources'; @@ -91,7 +91,7 @@ private _getStatus() { ### State (buttons, etc) -It is a good idea to make buttons indicate a loading state when awaiting an API call. All <uui-button> support the “.state” property, which you can set around API calls: +It is a good idea to make buttons indicate a loading state when awaiting an API call. All `` support the `.state` property, which you can set around API calls: ```typescript @state() @@ -110,7 +110,7 @@ private _getStatus() { ### Add to internal manifests -All items are declared in a manifests.ts file, which is located in each section directory. +All items are declared in a `manifests.ts` file, which is located in each section directory. To declare the Published Cache Status Dashboard as a new manifest, we need to add the section as a new json object that would look like this: From 00d345468a95ee2bd6b21c0a321cfcd488bc3d48 Mon Sep 17 00:00:00 2001 From: Warren Buckley Date: Thu, 26 Jan 2023 13:58:42 +0100 Subject: [PATCH 4/5] Adds in images from the google doc to be used in the markdown --- .../published-cache-status-dashboard.png | Bin 0 -> 30057 bytes .../images/contributing/refresh-status.png | Bin 0 -> 12531 bytes .../images/contributing/status-of-cache.png | Bin 0 -> 12491 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 src/Umbraco.Web.UI.Client/.github/images/contributing/published-cache-status-dashboard.png create mode 100644 src/Umbraco.Web.UI.Client/.github/images/contributing/refresh-status.png create mode 100644 src/Umbraco.Web.UI.Client/.github/images/contributing/status-of-cache.png diff --git a/src/Umbraco.Web.UI.Client/.github/images/contributing/published-cache-status-dashboard.png b/src/Umbraco.Web.UI.Client/.github/images/contributing/published-cache-status-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..dfe9d12413e09ffddff3d2067561fa9da9ebd14f GIT binary patch literal 30057 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
kpHv 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 literal 0 HcmV?d00001 diff --git a/src/Umbraco.Web.UI.Client/.github/images/contributing/refresh-status.png b/src/Umbraco.Web.UI.Client/.github/images/contributing/refresh-status.png new file mode 100644 index 0000000000000000000000000000000000000000..4b1664c591294ee7ebb69bae516bf1b6ac55a201 GIT binary patch literal 12531 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 Qtr3uskP|Nx)%X4X02ws+-v9sr literal 0 HcmV?d00001 diff --git a/src/Umbraco.Web.UI.Client/.github/images/contributing/status-of-cache.png b/src/Umbraco.Web.UI.Client/.github/images/contributing/status-of-cache.png new file mode 100644 index 0000000000000000000000000000000000000000..5815dfe9333b9be29d4d2853bb5b8ef6ff5cf0c3 GIT binary patch literal 12491 zcmZviWl&vB@a7MG@r!$KcXzh{AxMI|y9amIV8J0c3GVLh?ydm>0WR*cy#K1L+TGeu zJ#}j4%v8^rr~6F*B9%YOq9PF@0RVt1_fbj}0HEKSfDY(C6E$91{cd1fB;>w=K%li9 zrELHp1LUN{zj|byZn%38FSM|oe=%>wJ1un|u})#avt{Ekbo}c$0yhh4p*I+%P7M+J z2%^%34$=PvA<2wI#wRkdbxfevO4+Z}ch^{}?|@uiz0@Q!!Hl?~^q>iJ4NaL?aSL8$ z^FZo_k-tR3=F&yw|04a?4)b3l7Tx@k7DOI$&KD-3f-UX)a}Wy%Q3gxJEg=ATasl~t z)&lrS07|fdcIRWp);dhU2OtCbeO%`Q4J(v*)ey{AvjLpdJpwdo73>>VejhA+2@sp` z?QgoM43@uN#IU7R=H_Q;0t~-8!g(m^st#jRF-DzSB3|A*^zR>d<~KtJ`FODJI$!i| z8Ps)0R;F=1lrfD}0+7e`FdC<OUzcUlliN$nT`V{>| z+D2J@jL^V*HD~oL{?GP$Gze0Xh*cBcHvCyTj-TbH#4fM+1NQoV;7+u?)@pBUjX+iI zNFAM|^Xj>J>ERM9AXdI^TP*GzqqoTP7tnJ{tIYEfjr(AxnXL$(`JGH6h%&P*`1p}) zyyd%#?`<5ZC5tgmNc?~f(zs57xa8{`y+Lu_T^aA z-+QJ`hZz6?x``A`o3Jxj+n-F#aCh&EX^{d3h5D!lS_ z&qs2lNXvRFAT4iyk{$UdpZtNj)cdGAFlX}T6LKyq^av~f4;cIFy#7Ub^A>F}!UJsm zD(uTe(MD0a6Mz7OjPhNMg{4i{_YEEzQqhM_{K|BHKJ!N3b@{r>Zz1%2NiwzWlA^$E zvk~q;cR!11=&-q5W41vGwM|XN=uN!lcDCBoaB&)!v%L1YJf$?}BG&GsXmhowg9~Wf zq$@NvcFndP4Q3b((WmOQ+f3z=avfX*fq)1PUB>Kt-}=3d-rccOzr#Csq0Wb_rt$wW{=F?35c83}pGQYbke-X#?WW3kbW#PnFIIL8? zS}77fWt9}(eWLVi^)`*8J}Pe0Q$D1562+T6d?`KHO9P_%OFL-nAVA z-<_i8e4#2C*KNGeL$WqH^*nWVR+Su39*}W0DZC$rSJ_ps^77{&vv378EQ5hNmX7Z# z$(?@FbHY}0Q^(qGE02p{QIWcn*1v&q2$U2-0Duud%^8)hq^^%x&tEBW_`71J)%dEE z)}W;Qo|bj%cEhact=)g`@s%A4D}NziX$$gtl;h|Bq_?E+Vs+Z!?|FDBs_Xw!B4EhT ze!n_&u|5zo?67flDtXHuA1iYCOzWz)$X(TL;NOGORcTVt&f%PE<|6b~tMC~C$Z>g1 zcX{2L?RvSJ{e9+Z(LDtv?28taUwpKi2t&DRe@2E&YfKMdo( zH7$b8Qp!XI0J(Gl#E+0Ev^$u5L5uv-{@arFC+diM}gCpm_S25$Lo}V-;bgA^2a&U#KSoM*S&_NX9h&a ze*WiiVL{_W>&aeK)UvLt1Bbg4QEVk>!v(j_2frE&GlRQ9IE~l!C=Uv!OdjE?8BIUG z4JBlzat4CW@>C*=YuMXnTF_(^qez_9Z^=sGIess<3b-kOWWw))Y2C`V3Y)7QEc`F0 z?awSiBlMSL90q&c`r|!hKnzS)A#j+UoXMJHwSFsJMOcgy)aa!sY*`&4XIM&APfW#({&wze~QW z37HNmS>Yn~g3GN>;BaA~g3UUk8`QYdDf(CkgCZHJA$;%pr}zWTi=8<7#_NIL^O zWUYt}m#wN4UxBJTlp*1=%@@;$*udk&lN8jPlcSRrH#SXO^Yz=+(!gd@)xMp|SZ}`< zU3BuBUa_d+Pct5UU2agjE4JalL1u>+goG-fz}NBx+MRcalY ztrpnZ72>HQj}xs3kp|Mr2{IxCQTd>+HIoZwkR;~&V18=nz$Fqhj1HbbO=?#lBg|1T zK?nb;Rt_bLmtGM}ga$awT79@3QK_H|1J&WJpt&^Fau+X*`}=}1g+Wea(m;Qys=A{i z09I@v*HOHC#g@6U*V_?d8qCA>%zRH(mRkk_{MbgCrocuMNPTE zM0`E@V}cj|@O(~y9w`pulnvqfKpQ;swm|g856+uITN&L7+@tLwmrIf@g*Vxwh54{trh3S{Qn}dgB0CxA~-fIt=p7RD87tGo`1Dg z{Fi}nDilrDFSdGl<`O4z-QB1^)z3y`fSz>%$lh{=Y$xf5vzcr5wAkLbHF&i%(6pk8 zf%t!R_SvB(FbI5G*eKKFMt;u*%qHfP1hAlkENfxJLKcqyT=I(C-f?xU&-WQ-(UTz$ zC^F{wo}cM#Srhh)ox_@>gK0~>@~MZ)zF8y4?nwuPhvQ`Z)dd;lxL}(IZPu{k3jcKP zY6~?>?=uURy`HK*-NuR&y6%sL(BQz5OG$a%1nLw3ULAfBGZ?|{`Tn18!}}Hl8)$|Y zQA@aw@jiH`7~zMc=bhT1x8(mALcKrNq4B2d#&7Jrn=ObFskdh?v<{8-QaE%(l~^n zFgH?SqpwT}KTanm0 zZ05k$W^EtNz8MS2<(m8HX)seC+xYh8qPRxPKm=I&hk?sL31?)IrHvJ0f9NOgGOl~& zwOD-%sexT7CNu)Ier|lMkH1#&;cY$tU7Un!Y~F{9zU+7T=gyFkpIF(SZiCckYc#oP z+lu(9ceelbxGy%z&S4^l#-`91sD??blOmpOZG6Bo>aBrPe4n`RIPP2GS$CY$<9)gG zj&KpVn?%S~)-6)~eqwV<{J~_wmJWQ4>fVyCx<0qn*oAJ)GiQe1-Eg`rg1e^)kN&~( zUxT+6&cC}y0xs3w5zqYN87zNh7f|O?ad86G?`Gzp4=soYKQJ%cJqYgnN?$#2P$bOuo&6UtnOQ< z-Xv&$%kVRK1@^maXMXZ8y7Ze7!d+ASi##nDE7_SdCXKWgjD}wQ|76- z<1$NhUK1*Dt}Vme0}~S&&Yz0oTkZy~yjd-1aC))M;w?VTta^&`pvnCv=ALa#jJ&bV z^S2;=B9s)!yH)fSH^;Y6k$2U=mkXNHLeAO3yR0wg(@=1YWpj~PT*OxpgRi$vxDb1o zN_*h_aNuH3O_KHi?1}H`Pf37o=4-3N6pKcZ1smn>Am#~Xr*xd%0;R5Ic6R-9CDu@jm6q-!H@aJIXS#K{RDxL2P z&Rl9bagP~z-MfTja77>sW@fB;l&j6o7*f?c+?_Q8gXmiOU%eH6u+l@36GVpGH8n`h z0i2(DEo`>Dr&B+|fY|%EDmo$cIWI@YIr^OsKNm2A$)y6Kxw%h2T~c8p#q!JE-U?ut ziwUgG*HbbZ(GwubzMKlW7nzl-?rd%_znrms4bh}puJKmVmMND%J%%jL3HKIjd0Whd z9h?=C`H##6m?PX;pCu$@C1&kcb#AQGmeMELsV5pO^;qzpazf*WTvu z*mvb_&1g z#-kZGufl)KSW?jpE3jtyo^tzdEc{bdt*H^C%1&|b^mHd>_=xVXS?yiF|6Nd&Fv>Al zN8cU|uOzt2XL*th1$hpAqh(y1hmwzHvG$+@gPzvs{Ko{s&r{aTYFZE_f(Ebq(@;>J zB^BmXoELS$?9*mS=X7U^tG$xx$_p$0)s=nQ6OLc~{z{`}c3|NwEV&^B*BsXhN*!k+ z{uwcV?ZZm#;$)G;WS$h2$aIb8RbDgoOq1W?_F1aKG47{KgZ9>qP&8Z3O^AX?NMZHZ zz){cipj}6-(xzWMZOl)_DdKZR8`3A_VdmKI!R`K;&;B+D)qg5=Zv$v?Q3~gEw^|R3 z-U@iv)z_3sqNKq=H6Qcq3+3VVj|n*Mo@6kLXJ21=8wClO69n~F=i6?Q8#U4PY*w8u zw_or+)LuPiH@M$O7vi1y7U#BlZCq-Quq=^6yg-DX`t5zJl@r1A9_qIOepKQCC4 zS?@f|_98DU99~+ACJO*Ph6R03=C6%8#yvhU>SeRM^Jeu}@u8w2ej&=%-ujY+<6*1j zJ!_-!Db&tEXm207>A9=T%tq^9Ci=H;5QEMYeba7wts{pOm()a&@97PK>W-$Da|A=}b@aYY*rp#jwF{Bk^`_StdJU%k-_0S$V~ft06Uq-;+nkJR zm)C^;+L*!{I%xbGlrLJ+p=J7BxPKNCC95`Hu8|yccZ0K)nFwwKvpsfCYfEP>>^mqK z5d7NiaiwjRYYxmiNeMVf@i4!iS|JefB`0XWB^PAK|q72i|=|(v0 zIg7}_Kfz2Z!f={r*c{Kn>o_3-^KqjI61=$HFqY%|w64_I+CrClbQP7}fgI$M%A6~A z)78-;Xb4fm`Fi4WR|E5cpy9)zT|7juA_EfmnKx%GZw5ET%qeh>Js4B4U*Ri{GuLLW z=MBlw$Wg;vu+@9b<=uTgGBB9aL1onUU_K%BxI7g`RXcdfHdt#pO>bb9)TTBgQaBiS zVHDxVMh)2=@!;C_IGbpK$*eOO`L=n%5xJJqQA4?84GRB~u4@4?HUCpxzFEB3zbj;_bvaG?s;y=~ zq8OI3>HV!r7VX5pZsNl~$Y~YRl<%KN_r1Ul_pVLt_~F?T;WaF2zef*cev%KPw@S$G^A4zx)R!(ZvE-I8Sks?zyqs# zV)cC>3WY2J63xWts(zZK#pxQu^S2h6P~^jfhYL%#hK6ukUR1=Y^p(X_WlrYjuyBEJ zO_40My6OBuSTKMg;c;OmYUTB$=bjV}CQn=4Dc9p@d;EhudHnCPd;a|UT~*u3x+fSq z222JN&)W(l98kxw^>G;KOzpZ%RaFR<^e_z-jBrkgbhNgzqlaBZjUE#os^Rw=$&uW8 zEAc}_19F*!y;UUjzKheE9;R}0jkAogFR;F>D8xOlw7eFnsC*G^GjdZDKV;czi9SBe z@eJK6t^NEZ(zQaOK&Zt>v z1VBoF8P8FMl8UPE+SB!lh{$}RY9DLH4bnbmp~gK~u7>?yHIYhpS}mz7Ew#2N@su8u zU5EM%dMe7%eS2BbD32<_0p&&YIEf&FKReNL7LbP&qpJV-YbE&SdB;E7Y^!4~Unx2) zBg!_ov-zShtd*a3X~1OD-ax+>lH;;!+(4o0H4=x*n^Z$MXzv0ek~hL!T9w_hUD#5m zl))-jX*o0Ca$K6ql+OMaZ6Vv~vAnc&F!UEJIvFfeS@aVz2HZezR^Ih2oXhc{T55=H zUl;)`@8VY;mb4PE7-;6Nm~Il=;E|#H@31Ho^PjFY1$KIIoJiy%PxaCZb;m04CaBsu zbK<)`QVFF~g5IC)7U-`IE}YMf;5u*C?#60W+e~N5O9{9+T`RklN1mhqSzBcD$0;30 zSzAn67mtUBv#w(4&+1oh3Xlx02P}E7wj2(5dzl+tSFAp+I@ckI z^&6L~mFX4SYRd0opQ^ccoQIQUUv>F=P`S$}zO1*H<1-5!Wo4AEB2O*cdJnI-KU?pd z%o>H0{@VMM{u{3p8(PJ>uxcmYVPTO+{a@m)oW-JsMt0Y?*Y4^v=gB7Xg(+QSz)9U+ zQEg*=P+M4LQpJLbWf)V1GlI%qE!stxl;<=R z5f;FoAD(i-&(lntllTOxQJ?=#VoUlFkELX!A+*_aUesm;PLtwL-@{8%QPGIp%>x02 zCVDBg^S)jncckO*u0qt+cU1vmP+`ZBhn%#X@5{-<)u9GXn%>!@^j2$g?Jp;lqB(*g z3;%!fVd)Lp6?9ktFki}z7OqE=7!Qw}nysQUr)l;nB+N^x>%4t6<2cb)@mIBgUI-;V zCdE}qk66k@od4TPlfDj);+VF=0KE$#(ZOP&Nv$|Cf}M%25E)>8q=o#?Jjd9PpW*Xk z<@Cit_70%ZO&^WN#WgQZb=!2S@3AB2f}6#Himo}vU_OygnpLpSj)H<3ic! zzhhUiSm}aj)+a>b%~(dFWT|y)?tk1eD2PyD(s1Fc0tjd~*WCW+*`3V{8UqZu)eH@u z23x~{lTi8zRB|cQD)Bw#oJyZzzKd7!mZ^mRxx-fCpRO_>zK749!Qt2-ocxaJo~2dp z`I-ik+jWT#slso=Ra?3je)HVbN82D7<*=|Z){M9HF~(K|c-~4+&IG-srB0jNyIe^g zd=$c1EF5XMB0hj?vWF$E(2lE`ut4p*tJlw@ZE5L*xpqLye3|_OG1m9`(dH)%CA*1S zY)=xtE9wf&)nvuS=BB&j-ED7}m&ng;>6+HZaaw`JHDrmSEb^>eN-LZ3tP2q7++xG zXCYZEYvtD_#bAIte2>Hi2-uIlA>9s-GHUb@svyQEIe#_>}eQ4KLh^%m`E9c1)(-@XREZoDkY|FE|$9y+>nKe^}1 zqImzaO2Qw~GG}`B*LeNrD?6I<5+HwE@4qlbka|pr(M9g(lnc|)(+05 ztL-fHbDVo$LFH@VD98K?uko6jVRd6WUGm3KB=D?NC|GfRMwGAJZDRED5uPL=BEOJ2 z{bN3vd@U1lP#U(Y=zB(jIspTgkg>3&OUe*z<#kwXHtq4j6>Dz*0I>UiEI=+D01n&( zB=WY0t7V03coJRJgTqv88cMK#(>ZfY&~wO9@d0FmmqQT$cpd%Uoa7Qo9zm&Q>3fM< z2MlYQ%rG4rg7BE>QuNX7WFxgy7!f>O-yC*MJaJPBRU;E04!JD#V$%TZqT-9BN=4G! z8)92Dg5%m4B!KF}ja1@bmQZi;Kcw=Q!Ez&1_@BfI$Wau(RZD`NW$55*T`IIIKL7bq zTMnD`*NeN`a^IelBkBCF7A{z zTh}UwgQzg%Ffkw<{%VKqtw^DGWI-E0J6;gnjt{u0ux4B;@3pL(g?kx;=tgR>6|P(@ zey(31bxsDi)w|MK1zLMl(-ON?tT%`E481DGe(Azg4NhmxCXm3Uj>V#ZJTYR59^4=$ z2F*WS&QefZ+7Gd*WTL_cFAU$J^Orw(I#s2zYk!xa#Kf%ep!$xYwjZieHJ2J+VP2q* zN?f3CVlO9G$$sMEMR~LyG|MEc08klQFCTDeB0Hl@@0=4b;|BBVP!EO4`f9bndC?gL zrzg*{W9Xp9*qKV1e=m}T!-t~#6+~?K5J8*7Qd!Ja3?>J|IC)Hmp)Ot~W+{`I*8Xue zY6_T#?(x)umjIbN_Cs#r^R>U&OUv1hL!85ZgbpMN3=hDina#sL_he<+#&wWpC|q5S zMr@1`GEwtqI1-u@sr5L%D|Snmt*u*NV8858K7Xj0C$8Q!KPLQO#%_7S4!M?DB^`YX z{Bsx+@)!ryp(7RjVM-DqHwy4^mx5<0ZAM$wQe{P!IBHZ=MH_tKiOTOO&oN3~f%Yp* zH(_>HsLEwNExBTbC?ejN+bb4}Noz1b)R5c8?p9?nNh8sLIx2{O*l|TtPMN(R3yLFv z4F^&Dhx7og?0R->RBN*XRU$>`zL_dl;nbv}>`OVhhFn;{V6hsz)NU9FOEAAe)e@tw zwneS{QT({6m6&n={#c{tf6$eRkM^9hluUCOm; z;+5gkpaSwUr>ShM3NC=&J@pjnuinH|bEZQfp}iR$Dx{MjeSv+IYdUr7%A zRRc=3;Fghq>fknrdR#Xlw{Z$x$i0ZW{k1|&f_Za5j1!%khE|wN{Nn?8A)UMcuDBN` z<)Ez0i?)lKRUq|tEp5bTF=tvm8##Ln_7&`xlyaszEzJ71_NUbc)5erwkgft;L@=`pm--6;SV$B85eqnAj;+o15R8D+4Q53_{B!A#hf> zVvfoe1M>6Y*?9&35bsy#QE51kHcD2sG_wifDw^wjdv&B(vqrps=5OH##6&P0V+NRU ze~cJMz_qOFe&HgXO|QcWoFN<1ys?g6fCjdAF{JILCFnEMzr`53yepNntH9!+GqjzX zrwST5k`x`u4gZiaoEZ)ccUYR0|C<%ZoA*QBWW&$DcN#3j#Lg1mOY*0|5o4a_c5KA# z7Kgu}?G4Dx=~=#vAj+f`$mGu*1rP>*wy7puN$`_Zm%{+_)p67AxIaon21OAv%Spiv zmRdk3gbXBx0v|&LeK17E5{s5f`1MCQh@M6K_5Jj_&Ego#M{+qcKY_vHWL3UYl%%t-yoNsn{b9q4m-woRw~7aF6%rIIvK z)MFY7hNdB+xjKtvR#bPRQI!~;H~(2a)i)vhI%lEtg&Y-;q>*Wk zeXXg&*MNWv8vH8u#FFESQ>7!EAIUDwQQICxW)wNv<0GGM;GjNR#Zt

T3old%agF zOOUOp8f4jB!k$;a19Z8HeSP@Z-SlumeZHxOM~I_gKZiJ#k=sNmEyf{{iDw=KfC)+rMYqF z-cMv`$8m3e$8yAg{8-d}d~pC<`hlb4_C63_QcFG79e*BgSV#&Hq=NmhRpTNaK}Ke9 z)y!AAB1V7A_?`rbY_j_hNTqZQULZmNZ$k%UV&AfFQ6wUm&gMrob;985-}^Je!+Vfgi06?Km@F5>85mmQI>VK1nS61f%n)hKWeeknSzfa$^Tnr~wb` zB?|heM+V=WWM7GDG=K?<41)}lPF&_7@mV(R6#ZT@UgWp<%a7RO4?rKAHFw@!2Hmj@ z40$&`me{Ye`AFz*>IeB-SwZaC0>qILn#oc8Q4d=5)};jDr6Z@}koQH5ztk7IA`ViiMC9|2fR7?_PC zZuF*6jtQvwnu7njSf;lDQRRP8A0ZoVrK|lhhX6Cm^)C(K>3q6tZLn*MC3J2vRuTnc z`buZF6d{{V%vOh49!<0g$5PNd+j5S6LwRU6g7Q$yd3bgL7`$5G+XLL|(JgQ&}W zt)vWMuM`g3PuAai&PIAJ6Fqhnt5H1PRZ#FK0{G2yD!YZE1fBP13nvAbP6jt&Z=Juz zx|3nws1Y7H(W=(0Ae;Lg+(*r0HRo?PhseG>36#Qu?Y9nvZnVGk zy0c;?oR@gs5akGN1}e{Md{V)_mNs}JiKABE>iE}QW--$t>WUJ39Pxny)U6>f5m5-l zbY3FMgQ1HB@}^Yij+cFQHc0_PE`rMTy>AWLSKLFAzMRBQXNk)aNbg84)bLw|vH^N9cDhg{02J2PtA% z;+Mu*rsVAu`IEK#R+Q{e1arwUMSlvF3odV=_Sk0g$HoU7ofs-A<7kFP*m%U6B5WNg zH#8gvZ;>b7TH82qBme~DgLOXD3}EXFpZ{4n_QG>g=*LyDMKq4Kwtwk-{XG!H{MiL) z9k0$&Br3M#a|a#d3_euccpCkXdA#G^R8#Ax`$OUh4zHFq3I)1KGD^~$plZ}RRdm%U z1sxDiCDETnd)qMbpce6w0V{&X-5D(h(`j(AHK};Zd$XvS4H=2)TF}J14Tfm#CVGl1 zM->@L-rkR_)d8IO9VouPYYay)S;5N+z1NopBAfhKp$l4nMGfE|lc$2ecxT?T$x4Yw z7DhtnS9MNsdafwoZL3PbdJ#mtFF=#n8#;gi=hK6%#YTn5o-A&G$f+x;y;|DWP zX_ZcIhSXW#=XTRZ0c2`}jljt)N%+=?A{3jsUR=`Bi8*~fJgJS6A%XKdJR6(&5}x0; z;{s0o^iR+7st)(+uGS_*b$_wxWcQUd(b!t+jt44Vo-^&0*{KhTL#F659(umKtqK&p zi?IyfA}j!Gn^Hhq_LI>-!^23ELlOL8Q-%Yf=Y2>lMwvhf2#G-q2(OMO$3QFun9RlH zp#^YQJ9FiqASUW^P1!x%WxzP+<pzv__yRg$nTm> v1n(VW#OB_Z&g}jV Date: Thu, 26 Jan 2023 14:05:15 +0100 Subject: [PATCH 5/5] Add in images --- src/Umbraco.Web.UI.Client/CONTRIBUTING.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/Umbraco.Web.UI.Client/CONTRIBUTING.md b/src/Umbraco.Web.UI.Client/CONTRIBUTING.md index f34e43df7f..24741b1823 100644 --- a/src/Umbraco.Web.UI.Client/CONTRIBUTING.md +++ b/src/Umbraco.Web.UI.Client/CONTRIBUTING.md @@ -53,7 +53,7 @@ The frontend has an API formatter that takes the OpenAPI schema file and convert ### Example: Published Cache Status Dashboard -![alt_text](images/image1.png "image_tooltip") +![Published Status Dashboard](.github/images/contributing/published-cache-status-dashboard.png) ### Boilerplate (example using Lit) @@ -158,7 +158,7 @@ Let’s go through each of these properties… Running the app with `npm run dev`, you will quickly notice the API requests turn into 404 errors. In order to hit the API, we need to add a mock handler to define the endpoints which our dashboard will call. In the case of the Published Cache Status section, we have a number of calls to work through. Let’s start by looking at the call to retrieve the current status of the cache: -![alt_text](images/image2.png "image_tooltip") +![Published Status Dashboard](.github/images/contributing/status-of-cache.png) From the existing functionality, we can see that this is a string message that is received as part of a `GET` request from the server. @@ -187,7 +187,7 @@ It returns a `200 OK` response and a string value with the current “status” An example `POST` is similar. Let’s take the “Refresh status” button as an example: -![alt_text](images/image3.png "image_tooltip") +![Published Status Dashboard](.github/images/contributing/refresh-status.png) From our existing functionality we can see that this makes a `POST`call to the server to prompt a reload of the published cache. So we would add a new endpoint to the mock handler that would look like: