From 0a47a95588a5dd4ae76ad088665fcb1720da51d5 Mon Sep 17 00:00:00 2001 From: John Cowen Date: Thu, 19 Mar 2020 10:28:21 +0000 Subject: [PATCH] ui: Add DataSource component (#7448) * ui: Add data-source component and related services (#6486) * ui: Add data-source component and related services: 1. DataSource component 2. Repository manager for retrieving repositories based on URIs 3. Blocking data service for injection to the data-source component to support blocking query types of data sources 4. 'Once' promise based data service for injection for potential fallback to old style promise based data (would need to be injected via an initial runtime variable) 5. Several utility functions taken from elsewhere - maybeCall - a replication of code from elsewhere for condition calling a function based on the result of a promise - restartWhenAvailable - used for restarting blocking queries when a tab is brought to the front - ifNotBlocking - to check if blocking is NOT enabled * Move to a different organization based on protocols * Don't call open twice when eager * Workaround new ember error for reading and writing at the same time * Add first draft of a README.mdx file --- ui-v2/app/components/data-source/README.mdx | 61 +++++++ ui-v2/app/components/data-source/index.hbs | 4 + ui-v2/app/components/data-source/index.js | 150 ++++++++++++++++++ .../services/data-source/protocols/http.js | 34 ++++ .../data-source/protocols/http/blocking.js | 30 ++++ .../data-source/protocols/http/promise.js | 8 + .../data-source/protocols/local-storage.js | 17 ++ ui-v2/app/services/data-source/service.js | 84 ++++++++++ ui-v2/app/services/repository.js | 12 ++ ui-v2/app/services/settings.js | 6 + ui-v2/app/utils/dom/event-source/index.js | 13 ++ ui-v2/app/utils/dom/event-source/storage.js | 38 +++-- ui-v2/app/utils/maybe-call.js | 17 ++ ui-v2/app/utils/storage/local-storage.js | 13 +- ui-v2/package.json | 1 + .../components/data-source-test.js | 121 ++++++++++++++ ui-v2/tests/steps.js | 37 +++-- ui-v2/tests/steps/assertions/dom.js | 9 +- ui-v2/tests/steps/assertions/model.js | 8 +- .../data-source/protocols/http-test.js | 12 ++ .../protocols/local-storage-test.js | 12 ++ ui-v2/tests/unit/utils/maybe-call-test.js | 18 +++ ui-v2/yarn.lock | 25 ++- 23 files changed, 691 insertions(+), 39 deletions(-) create mode 100644 ui-v2/app/components/data-source/README.mdx create mode 100644 ui-v2/app/components/data-source/index.hbs create mode 100644 ui-v2/app/components/data-source/index.js create mode 100644 ui-v2/app/services/data-source/protocols/http.js create mode 100644 ui-v2/app/services/data-source/protocols/http/blocking.js create mode 100644 ui-v2/app/services/data-source/protocols/http/promise.js create mode 100644 ui-v2/app/services/data-source/protocols/local-storage.js create mode 100644 ui-v2/app/services/data-source/service.js create mode 100644 ui-v2/app/utils/maybe-call.js create mode 100644 ui-v2/tests/integration/components/data-source-test.js create mode 100644 ui-v2/tests/unit/services/data-source/protocols/http-test.js create mode 100644 ui-v2/tests/unit/services/data-source/protocols/local-storage-test.js create mode 100644 ui-v2/tests/unit/utils/maybe-call-test.js diff --git a/ui-v2/app/components/data-source/README.mdx b/ui-v2/app/components/data-source/README.mdx new file mode 100644 index 000000000..63c485a3d --- /dev/null +++ b/ui-v2/app/components/data-source/README.mdx @@ -0,0 +1,61 @@ +## DataSource + +```handlebars + +``` + +### Arguments + +| Argument | Type | Default | Description | +| --- | --- | --- | --- | +| `src` | `String` | | The source to subscribe to updates to, this should map to a string based URI | +| `loading` | `String` | eager | Allows the browser to defer loading offscreen DataSources (`eager\|lazy`). Setting to `lazy` only loads the data when the DataSource is visible in the DOM (inc. `display: none\|block;`) | +| `onchange` | `Function` | | The action to fire when the data changes. Emits an Event-like object with a `data` property containing the data. | +| `onerror` | `Function` | | The action to fire when an error occurs. Emits ErrorEvent object with an `error` property containing the Error. | + +The component takes a `src` or an identifier (a uri) for some data and then emits `onchange` events whenever that data changes. If an error occurs whilst listening for data changes, an `onerror` event is emitted. + +Setting `@loading="lazy"` uses `IntersectionObserver` to activate/deactive event emitting until the `` element is displayed in the DOM. This means you can use CSS `display: none|block;` to control the loading and stopping loading of data for usage with CSS based tabs and such-like. + +Consuls HTTP API DataSources use Consul's blocking query support for live updating of data. + +Behind the scenes in the Consul UI we map URIs back to our `ember-data` backed `Repositories` meaning we can essentially redesign the URIs used for our data to more closely fit our needs. For example we currently require that **all** HTTP API URIs begin with `/dc/nspace/` values whether they require them or not. + +`DataSource` is not just restricted to HTTP API data, and can be configured to listen for data changes using a variety of methods and sources. For example we have also configured `DataSource` to listen to `LocalStorage` changes using the `settings://` pseudo-protocol in the URI (See examples below). + + +### Example + +Straightforward usage can use `mut` to easily update data within a template + +```handlebars + {{! listen for HTTP API changes}} + + {{! the value of items will change whenever the data changes}} + {{#each items as |item|}} + {{item.Name}} {{! < Prints the item name }} + {{/each}} + + {{! listen for Settings (local storage) changes}} + + {{! the value of token will change whenever the data changes}} + {{token.AccessorID}} {{! < Prints the token AccessorID }} +``` + +### See + +- [Component Source Code](./index.js) +- [Template Source Code](./index.hbs) + +--- diff --git a/ui-v2/app/components/data-source/index.hbs b/ui-v2/app/components/data-source/index.hbs new file mode 100644 index 000000000..661f27adb --- /dev/null +++ b/ui-v2/app/components/data-source/index.hbs @@ -0,0 +1,4 @@ +{{#if (eq loading "lazy")}} +{{! in order to use intersection observer we need a DOM element on the page}} +