From f3fb95253dda8081486a04278b03a2c0a7db206c Mon Sep 17 00:00:00 2001 From: David Taylor Date: Mon, 21 Jan 2019 12:57:28 -0500 Subject: [PATCH 01/45] Added 'creates a service instance and binding' test to dev catalog e2e test suite --- .../tests/developer-catalog.scenario.ts | 41 ++++++++++++++++++- .../integration-tests/views/catalog.view.ts | 5 ++- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/frontend/integration-tests/tests/developer-catalog.scenario.ts b/frontend/integration-tests/tests/developer-catalog.scenario.ts index eeba3103180..dd77bd20754 100644 --- a/frontend/integration-tests/tests/developer-catalog.scenario.ts +++ b/frontend/integration-tests/tests/developer-catalog.scenario.ts @@ -1,13 +1,15 @@ /* eslint-disable no-undef, no-unused-vars */ -import { browser, $ } from 'protractor'; +import { browser, $, $$, ExpectedConditions as until } from 'protractor'; +import { execSync } from 'child_process'; import { appHost, checkLogs, checkErrors, testName } from '../protractor.conf'; import * as crudView from '../views/crud.view'; import * as catalogView from '../views/catalog.view'; import * as catalogPageView from '../views/catalog-page.view'; +import * as srvCatalogView from '../views/service-catalog.view'; -describe('Catalog', () => { +describe('Developer Catalog', () => { beforeEach(async() => { await browser.get(`${appHost}/catalog/ns/${testName}`); await crudView.isLoaded(); @@ -92,4 +94,39 @@ describe('Catalog', () => { const numCatalogTiles = await catalogView.pageHeadingNumberOfItems(); expect(srvClassFilterCount).toEqual(numCatalogTiles); }); + + it('creates a service instance and binding', async() => { + expect(catalogPageView.catalogTiles.isPresent()).toBe(true); + + await catalogPageView.clickFilterCheckbox('Service Class'); + await catalogPageView.filterByKeyword('MongoDB'); + expect(catalogPageView.catalogTileFor('MongoDB').isDisplayed()).toBe(true); + + await catalogPageView.catalogTileFor('MongoDB').click(); + await catalogView.catalogDetailsLoaded(); + + expect(catalogView.createServiceInstanceButton.isDisplayed()).toBe(true); + await catalogView.createServiceInstanceButton.click(); + await browser.wait(until.and(crudView.untilNoLoadersPresent, until.presenceOf(catalogView.createServiceInstanceForm))); + + await $('#dropdown-selectbox').click(); + await $$('.dropdown-menu').first().$(`#${testName}-Project-link`).click(); + await srvCatalogView.createButton.click(); + await crudView.isLoaded(); + + expect(crudView.resourceTitle.getText()).toEqual('mongodb-persistent'); + + await catalogView.createServiceBindingButton.click(); + await browser.wait(crudView.untilNoLoadersPresent); + expect($('#resource-title').getText()).toBe('Create Service Binding'); + + await srvCatalogView.createButton.click(); + await crudView.isLoaded(); + + expect($('#resource-title').getText()).toBe('mongodb-persistent'); + expect($$('.co-section-heading').first().getText()).toBe('Service Binding Overview'); + + execSync(`kubectl delete -n ${testName} servicebinding mongodb-persistent`); + execSync(`kubectl delete -n ${testName} serviceinstance mongodb-persistent`); + }); }); diff --git a/frontend/integration-tests/views/catalog.view.ts b/frontend/integration-tests/views/catalog.view.ts index ba7d77760f6..aeed9948ce8 100644 --- a/frontend/integration-tests/views/catalog.view.ts +++ b/frontend/integration-tests/views/catalog.view.ts @@ -1,4 +1,4 @@ -import { $, $$, browser, ExpectedConditions as until } from 'protractor'; +import { $, $$, browser, by, ExpectedConditions as until } from 'protractor'; export const categoryTabs = $$('.vertical-tabs-pf-tab > a'); export const pageHeading = $('.co-catalog-page__heading'); @@ -6,3 +6,6 @@ export const pageNumberItemsHeading = $('.co-catalog-page__num-items'); export const pageHeadingNumberOfItems = () => pageNumberItemsHeading.getText() .then(text => parseInt(text.substring(0, text.indexOf(' items')), 10)); export const catalogDetailsLoaded = () => browser.wait(until.presenceOf($('.modal-content')), 10000).then(() => browser.sleep(1000)); +export const createServiceInstanceButton = $('.co-catalog-page__overlay-create'); +export const createServiceInstanceForm = $('.co-create-service-instance'); +export const createServiceBindingButton = $('.co-well').element(by.buttonText('Create Service Binding')); From 05f655b698acfcd6e534534e6270285e590fed1c Mon Sep 17 00:00:00 2001 From: christianvogt Date: Mon, 11 Feb 2019 16:19:29 -0500 Subject: [PATCH 02/45] devconsole: setup sub-dir with OWNERS file --- frontend/public/extend/devconsole/OWNERS | 14 ++++++++++++++ frontend/public/extend/devconsole/README.md | 2 ++ 2 files changed, 16 insertions(+) create mode 100644 frontend/public/extend/devconsole/OWNERS create mode 100644 frontend/public/extend/devconsole/README.md diff --git a/frontend/public/extend/devconsole/OWNERS b/frontend/public/extend/devconsole/OWNERS new file mode 100644 index 00000000000..19633ac8046 --- /dev/null +++ b/frontend/public/extend/devconsole/OWNERS @@ -0,0 +1,14 @@ +reviewers: + - abhinandan13jan + - Bumbilo + - debsmita1 + - divyanshiGupta + - christianvogt + - joshuawilson + - karthikjeeyar + - rohitkrai03 + - sahil143 + - vikram-raj +approvers: + - christianvogt + - joshuawilson diff --git a/frontend/public/extend/devconsole/README.md b/frontend/public/extend/devconsole/README.md new file mode 100644 index 00000000000..eb4d8f973b5 --- /dev/null +++ b/frontend/public/extend/devconsole/README.md @@ -0,0 +1,2 @@ +OpenShift Developer-Focused Web Console +========================= From 0bf25a4658db4d4ee9a4447440d67f93588ad7da Mon Sep 17 00:00:00 2001 From: Jon Jackson Date: Thu, 14 Feb 2019 09:07:39 -0500 Subject: [PATCH 03/45] Fix runtime error on machine deployment details page --- frontend/public/components/utils/horizontal-nav.tsx | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/frontend/public/components/utils/horizontal-nav.tsx b/frontend/public/components/utils/horizontal-nav.tsx index 84aff27b509..d0b8cb0cd44 100644 --- a/frontend/public/components/utils/horizontal-nav.tsx +++ b/frontend/public/components/utils/horizontal-nav.tsx @@ -101,6 +101,11 @@ export const navFactory: NavFactory = { name: 'Machine Configs', component, }), + machines: component => ({ + href: 'machines', + name: 'Machines', + component, + }), }; export const NavBar: React.SFC = ({pages, basePath, hideDivider}) => { From 890ef1285d5b1154f5bd27b40a186fc90adcd0ef Mon Sep 17 00:00:00 2001 From: zherman0 Date: Tue, 26 Feb 2019 10:57:38 -0700 Subject: [PATCH 04/45] Change dropdown units for consistency --- frontend/public/components/storage/create-pvc.tsx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/public/components/storage/create-pvc.tsx b/frontend/public/components/storage/create-pvc.tsx index e81fa034b0d..95bd1d23821 100644 --- a/frontend/public/components/storage/create-pvc.tsx +++ b/frontend/public/components/storage/create-pvc.tsx @@ -47,9 +47,9 @@ export class CreatePVCForm extends React.Component Date: Wed, 27 Feb 2019 15:13:31 +0100 Subject: [PATCH 05/45] Align line-height for copy-to-clipboard to match height of copy button --- frontend/public/components/utils/_copy-to-clipboard.scss | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/public/components/utils/_copy-to-clipboard.scss b/frontend/public/components/utils/_copy-to-clipboard.scss index 1fcc6adfe94..da34b85378f 100644 --- a/frontend/public/components/utils/_copy-to-clipboard.scss +++ b/frontend/public/components/utils/_copy-to-clipboard.scss @@ -12,6 +12,7 @@ } .co-copy-to-clipboard__text { + line-height: 1.4; padding-right: 50px; } From a74aa1edb638a91cac7fab745ad92e67c88c6cae Mon Sep 17 00:00:00 2001 From: sg00dwin Date: Thu, 21 Feb 2019 16:56:20 -0500 Subject: [PATCH 06/45] Apply table--layout-fixed to images table on nodes page to prevent long string issues Add .co-break-all to name td --- frontend/public/components/node.tsx | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/frontend/public/components/node.tsx b/frontend/public/components/node.tsx index 522ea0ab09c..d48e2f6a05b 100644 --- a/frontend/public/components/node.tsx +++ b/frontend/public/components/node.tsx @@ -234,7 +234,11 @@ const Details = ({obj: node}) => {
- +
+ + + + @@ -243,7 +247,7 @@ const Details = ({obj: node}) => { {_.map(images, (image, i) => - + )} From 72bab4be07a9d9b869b74c7bde34e4a3e37ad166 Mon Sep 17 00:00:00 2001 From: Robb Hamilton Date: Tue, 26 Feb 2019 16:13:43 -0500 Subject: [PATCH 07/45] Add Azure Red Hat OpenShift branding option --- cmd/bridge/main.go | 5 +- frontend/public/branding.ts | 2 + frontend/public/components/masthead.jsx | 7 ++ .../imgs/azure-red-hat-openshift-logo.svg | 101 ++++++++++++++++++ frontend/public/index.html | 4 + frontend/public/tokener.html | 4 + 6 files changed, 121 insertions(+), 2 deletions(-) create mode 100644 frontend/public/imgs/azure-red-hat-openshift-logo.svg diff --git a/cmd/bridge/main.go b/cmd/bridge/main.go index 1369af121fe..bf6c422beaf 100644 --- a/cmd/bridge/main.go +++ b/cmd/bridge/main.go @@ -85,7 +85,7 @@ func main() { fK8sPublicEndpoint := fs.String("k8s-public-endpoint", "", "Endpoint to use when rendering kubeconfigs for clients. Useful for when bridge uses an internal endpoint clients can't access for communicating with the API server.") fDexAPIHost := fs.String("dex-api-host", "", "Target host and port of the Dex API service.") - fBranding := fs.String("branding", "okd", "Console branding for the masthead logo and title. One of okd, openshift, ocp, online, or dedicated. Defaults to okd.") + fBranding := fs.String("branding", "okd", "Console branding for the masthead logo and title. One of okd, openshift, ocp, online, dedicated, or azure. Defaults to okd.") fDocumentationBaseURL := fs.String("documentation-base-url", "", "The base URL for documentation links.") fGoogleTagManagerID := fs.String("google-tag-manager-id", "", "Google Tag Manager ID. External analytics are disabled if this is not set.") @@ -149,8 +149,9 @@ func main() { case "ocp": case "online": case "dedicated": + case "azure": default: - flagFatalf("branding", "value must be one of okd, openshift, ocp, or online") + flagFatalf("branding", "value must be one of okd, openshift, ocp, online, dedicated, or azure") } srv := &server.Server{ diff --git a/frontend/public/branding.ts b/frontend/public/branding.ts index 77bc6ae0c87..1e31d4303ae 100644 --- a/frontend/public/branding.ts +++ b/frontend/public/branding.ts @@ -8,6 +8,8 @@ const getProductName = () => { return 'OpenShift Online'; case 'dedicated': return 'OpenShift Dedicated'; + case 'azure': + return 'Azure Red Hat OpenShift'; default: return 'OKD'; } diff --git a/frontend/public/components/masthead.jsx b/frontend/public/components/masthead.jsx index 7fe9286efa3..338f9cc2260 100644 --- a/frontend/public/components/masthead.jsx +++ b/frontend/public/components/masthead.jsx @@ -9,6 +9,7 @@ import openshiftLogoImg from '../imgs/openshift-logo.svg'; import ocpLogoImg from '../imgs/openshift-platform-logo.svg'; import onlineLogoImg from '../imgs/openshift-online-logo.svg'; import dedicatedLogoImg from '../imgs/openshift-dedicated-logo.svg'; +import azureLogoImg from '../imgs/azure-red-hat-openshift-logo.svg'; import * as pfBg992 from '../../public/imgs/pfbg_992.jpg'; export const getBrandingDetails = () => { @@ -39,6 +40,12 @@ export const getBrandingDetails = () => { logoAlt = 'OpenShift Dedicated'; productTitle = 'Red Hat OpenShift Dedicated'; break; + case 'azure': + backgroundImg = pfBg992; + logoImg = azureLogoImg; + logoAlt = 'Azure Red Hat OpenShift'; + productTitle = 'Azure Red Hat OpenShift'; + break; default: backgroundImg = pfBg992; logoImg = okdLogoImg; diff --git a/frontend/public/imgs/azure-red-hat-openshift-logo.svg b/frontend/public/imgs/azure-red-hat-openshift-logo.svg new file mode 100644 index 00000000000..b1fc3637cc1 --- /dev/null +++ b/frontend/public/imgs/azure-red-hat-openshift-logo.svg @@ -0,0 +1,101 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/frontend/public/index.html b/frontend/public/index.html index 84b1ff5dc8e..aa1d9592e39 100644 --- a/frontend/public/index.html +++ b/frontend/public/index.html @@ -25,6 +25,10 @@ OpenShift Dedicated [[ end ]] + [[ if eq .Branding "azure" ]] + Azure Red Hat OpenShift + + [[ end ]] [[ if eq .Branding "okd" ]] diff --git a/frontend/public/tokener.html b/frontend/public/tokener.html index 6c245df208b..f3ee72870b5 100644 --- a/frontend/public/tokener.html +++ b/frontend/public/tokener.html @@ -21,6 +21,10 @@ OpenShift Dedicated [[ end ]] + [[ if eq .Branding "azure" ]] + Azure Red Hat OpenShift + + [[ end ]] [[ if eq .Branding "okd" ]] From cb7ca1098afaf0db37606e6e5ae87fdd1f94decc Mon Sep 17 00:00:00 2001 From: Samuel Padgett Date: Mon, 25 Feb 2019 10:41:40 -0500 Subject: [PATCH 08/45] Update README for OpenShift 4.0 and CI changes --- CONTRIBUTING.md | 63 ++++++++++++++-------- README.md | 120 ++++++++++++++++++++++------------------- examples/run-bridge.sh | 6 ++- 3 files changed, 109 insertions(+), 80 deletions(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 16dd8264dae..b426934548f 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,14 +1,6 @@ # How to Contribute -This document outlines some of the conventions on -development workflow, commit message formatting, contact points and other -resources to make it easier to get your contribution accepted. - -# Email and Chat - -The project currently uses the general Tectonic Team email list and Slack channel: -- Email: team-tectonic@coreos.com -- Slack: #team-tectonic +This document outlines some of the conventions on development workflow. ## Getting Started @@ -35,25 +27,52 @@ questions: what changed and why. The subject line should feature the what and the body of the commit should describe the why. ``` -scripts: add the test-cluster command +Add the test-cluster command -this uses tmux to setup a test cluster that you can easily kill and +This uses tmux to setup a test cluster that you can easily kill and start for debugging. +``` + +Commits that fix a Bugzilla bug should add the bug number like `Bug 12345: ` to +the first line of the commit and to the pull request title. To help others +quickly go to the bug, also add a link to the bug in the body of the commit +message. This allows automated tooling to generate links to bugs in release +notes and will eventually allow us to automatically transition bugs to `ON_QA` +when the fix is available in a nightly build. Here's an example commit message +for a change that fixes a Bugzilla bug: + +``` +Bug 1679272: Validate console can talk to OAuth token URL + +Make sure we can successfully talk to the OAuth token URL after +discovering metadata before marking the console pod as ready. -Fixes #38 +Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1679272 +``` + +Pull requests that close GitHub issues should add text to the pull request +description in the format `Closes #123`. GitHub will automatically link each +issue to its pull request and close the issue when the pull request merges. + +While we don't have automated tooling for JIRA issues, you should still include +a link to the issue in the commit description to make it easy to get to the issue. + +### Pull Requests Against Other Branches + +Pull requests opened against branches other than master should start the pull +request title with the branch name in brackets like `[release-3.11]` to make it +obvious. Include the bug as well when appropriate. For instance, + +``` +[release-3.11] Bug 1643948: Fix crashlooping pods query ``` -The format can be described more formally as follows: +If you use the `/cherrypick` command, the bot will automatically append the +branch to the pull request title. For instance, adding a comment to a PR like ``` -: - - - -
+/cherrypick release-3.11 ``` -The first line is the subject and should be no longer than 70 characters, the -second line is always blank, and other lines should be wrapped at 80 characters. -This allows the message to be easier to read on GitHub as well as in various -git tools. +will create a new pull request against the release-3.11 branch when the current +pull request merges as long as there are no merge conflicts. diff --git a/README.md b/README.md index 4086fbc73fe..d212dfd18dd 100644 --- a/README.md +++ b/README.md @@ -3,8 +3,6 @@ OpenShift Console Codename: "Bridge" -[![Build Status](https://jenkins-tectonic.prod.coreos.systems/buildStatus/icon?job=console-build)](https://jenkins-tectonic.prod.coreos.systems/job/console-build/) - [quay.io/openshift/origin-console](https://quay.io/repository/openshift/origin-console?tab=tags) The console is a more friendly `kubectl` in the form of a single page webapp. It also integrates with other services like monitoring, chargeback, and OLM. Some things that go on behind the scenes include: @@ -35,22 +33,53 @@ Backend binaries are output to `/bin`. ### Configure the application -#### OpenShift +The following instructions assume you have an existing cluster you can connect +to. OpenShift 4.0 clusters can be installed using the +[OpenShift Installer](https://github.com/openshift/installer). +You can also use [CodeReady Containers](https://github.com/code-ready/osp4) +for local installs. More information about installing OpenShift can be found at +. + + +#### OpenShift (no authentication) -Registering an OpenShift OAuth client requires administrative privileges for the entire cluster, not just a local project. Run the following command to log in as cluster admin: +For local development, you can disable OAuth and run bridge with an OpenShift +user's access token. If you've installed OpenShift 4.0, run the following +commands to login as the kubeadmin user and start a local console for +development. Make sure to replace `/path/to/install-dir` with the directory you +used to install OpenShift. ``` -oc login -u system:admin +oc login -u kubeadmin -p $(cat /path/to/install-dir/auth/kubeadmin-password) +source ./contrib/oc-environment.sh +./bin/bridge ``` -To run bridge locally connected to an OpenShift cluster, create an `OAuthClient` resource with a generated secret and read that secret: +The console will be running at [localhost:9000](http://localhost:9000). + +If you don't have `kubeadmin` access, you can use any user's API token, +although you will be limited to that user's access and might not be able to run +the full integration test suite. + +#### OpenShift (with authentication) + +If you need to work on the backend code for authentication or you need to test +different users, you can set up authentication in your development environment. +Registering an OpenShift OAuth client requires administrative privileges for +the entire cluster, not just a local project. You must be logged in as a +cluster admin such as `system:admin` or `kubeadmin`. + +To run bridge locally connected to an OpenShift cluster, create an +`OAuthClient` resource with a generated secret and read that secret: ``` oc process -f examples/console-oauth-client.yaml | oc apply -f - oc get oauthclient console-oauth-client -o jsonpath='{.secret}' > examples/console-client-secret ``` -If the CA bundle of the OpenShift API server is unavailable, fetch the CA certificates from a service account secret. Otherwise copy the CA bundle to `examples/ca.crt`: +If the CA bundle of the OpenShift API server is unavailable, fetch the CA +certificates from a service account secret. Otherwise copy the CA bundle to +`examples/ca.crt`: ``` oc get secrets -n default --field-selector type=kubernetes.io/service-account-token -o json | \ @@ -58,32 +87,12 @@ oc get secrets -n default --field-selector type=kubernetes.io/service-account-to # Note: use "openssl base64" because the "base64" tool is different between mac and linux ``` -Set the `OPENSHIFT_API` environment variable to tell the script the API endpoint: - -``` -export OPENSHIFT_API="https://127.0.0.1:8443" -``` - Finally run the console and visit [localhost:9000](http://localhost:9000): ``` ./examples/run-bridge.sh ``` -#### OpenShift (without OAuth) - -For local development, you can also disable OAuth and run bridge with an -OpenShift user's access token. Run the following commands to create an admin -user and start bridge for a cluster up environment: - -``` -oc login -u system:admin -oc adm policy add-cluster-role-to-user cluster-admin admin -oc login -u admin -source ./contrib/oc-environment.sh -./bin/bridge -``` - #### Native Kubernetes If you have a working `kubectl` on your path, you can run the application with: @@ -110,32 +119,10 @@ kubectl describe secrets/ Use this token value to set the `BRIDGE_K8S_BEARER_TOKEN` environment variable when running Bridge. -## Images +## Operator -The `builder-run.sh` script will run any command from a docker container to ensure a consistent build environment. -For example to build with docker run: -``` -./builder-run.sh ./build.sh -``` - -The docker image used by builder-run is itself built and pushed by the -script `push-builder`, which uses the file `Dockerfile-builder` to -define an image. To update the builder-run build environment, first make -your changes to `Dockerfile-builder`, then run `push-builder`, and -then update the BUILDER_VERSION variable in `builder-run` to point to -your new image. Our practice is to manually tag images builder images in the form -`Builder-v$SEMVER` once we're happy with the state of the push. - -### Compile, Build, & Push Image - -(Almost no reason to ever do this manually, Jenkins handles this automation) - -Build an image, tag it with the current git sha, and pushes it to the `quay.io/coreos/tectonic-console` repo. - -Must set env vars `DOCKER_USER` and `DOCKER_PASSWORD` or have a valid `.dockercfg` file. -``` -./build-docker-push.sh -``` +In OpenShift 4.x, the console is installed and managed by the +[console operator](https://github.com/openshift/console-operator/). ## Hacking @@ -206,12 +193,34 @@ Run integration tests on an OpenShift cluster: yarn run test-gui-openshift ``` This will include the normal k8s CRUD tests and CRUD tests for OpenShift -resources. It doesn't include ALM tests since it assumes ALM is not -set up on an OpenShift cluster. +resources. + +#### How the Integration Tests Run in CI + +The end-to-end tests run against pull requests using [ci-operator](https://github.com/openshift/ci-operator/). +The tests are defined in [this manifest](https://github.com/openshift/release/blob/master/ci-operator/jobs/openshift/console/openshift-console-master-presubmits.yaml) +in the [openshift/release](https://github.com/openshift/release) repo and were generated with [ci-operator-prowgen](https://github.com/openshift/ci-operator-prowgen). + +CI runs the [test-prow-e2e.sh](test-prow-e2e.sh) script, which uses the `e2e` suite defined in [protractor.conf.ts](frontend/integration-tests/protractor.conf.ts). + +You can simulate an e2e run against an existing 4.0 cluster with the following commands (replace `/path/to/install-dir` with your OpenShift 4.0 install directory): + +``` +$ export BRIDGE_AUTH_USERNAME=kubeadmin +$ export BRIDGE_BASE_ADDRESS="https://$(oc get route console -n openshift-console -o jsonpath='{.spec.host}')" +$ export BRIDGE_AUTH_PASSWORD=$(cat "/path/to/install-dir/auth/kubeadmin-password") +$ ./test-gui.sh e2e +``` + +If you don't want to run the entire e2e tests, you can use a different suite from [protractor.conf.ts](frontend/integration-tests/protractor.conf.ts). For instance, + +``` +$ ./test-gui.sh olm +``` #### Hacking Integration Tests -Remove the `--headless` flag to Chrome (chromeOptions) in `frontend/integration-tests/protractor.conf.ts` to see what the tests are actually doing. +Remove the `--headless` flag to Chrome (chromeOptions) in [protractor.conf.ts](frontend/integration-tests/protractor.conf.ts) to see what the tests are actually doing. ### Dependency Management @@ -245,7 +254,6 @@ Update existing frontend dependencies: yarn upgrade ``` - #### Supported Browsers We support the latest versions of the following browsers: diff --git a/examples/run-bridge.sh b/examples/run-bridge.sh index f3dafbd4d8d..4bd0dad2161 100755 --- a/examples/run-bridge.sh +++ b/examples/run-bridge.sh @@ -1,11 +1,13 @@ -#!/bin/bash -e +#!/usr/bin/env bash + +set -exuo pipefail ./bin/bridge \ --base-address=http://localhost:9000 \ --ca-file=examples/ca.crt \ --k8s-auth=openshift \ --k8s-mode=off-cluster \ - --k8s-mode-off-cluster-endpoint=$OPENSHIFT_API \ + --k8s-mode-off-cluster-endpoint=$(oc whoami --show-server) \ --k8s-mode-off-cluster-skip-verify-tls=true \ --listen=http://127.0.0.1:9000 \ --public-dir=./frontend/public/dist \ From fd387a504237008bf6e2d28f590ee54c5d50933a Mon Sep 17 00:00:00 2001 From: Jeffrey Phillips Date: Mon, 4 Feb 2019 11:09:57 -0500 Subject: [PATCH 09/45] Show community operators, warn on details --- frontend/__mocks__/operatorHubItemsMocks.ts | 1 + .../operator-hub/operator-hub.scenario.ts | 27 ++-- .../views/operator-hub.view.ts | 15 +- .../public/components/catalog/_catalog.scss | 2 + .../operator-hub-community-provider-modal.tsx | 7 +- .../operator-hub/operator-hub-items.tsx | 135 ++++-------------- 6 files changed, 62 insertions(+), 125 deletions(-) diff --git a/frontend/__mocks__/operatorHubItemsMocks.ts b/frontend/__mocks__/operatorHubItemsMocks.ts index 17169da21ce..83188626d41 100644 --- a/frontend/__mocks__/operatorHubItemsMocks.ts +++ b/frontend/__mocks__/operatorHubItemsMocks.ts @@ -65,6 +65,7 @@ const etcdPackageManifest = { 'catalog-namespace': 'openshift-operator-lifecycle-manager', provider: 'CoreOS, Inc', 'provider-url': '', + 'opsrc-provider': 'community', }, }, spec: {}, diff --git a/frontend/integration-tests/tests/operator-hub/operator-hub.scenario.ts b/frontend/integration-tests/tests/operator-hub/operator-hub.scenario.ts index bcd0b7bdb4b..436e931ace3 100644 --- a/frontend/integration-tests/tests/operator-hub/operator-hub.scenario.ts +++ b/frontend/integration-tests/tests/operator-hub/operator-hub.scenario.ts @@ -89,15 +89,24 @@ describe('Subscribing to an Operator from Operator Hub', () => { }); }); - it('hides community Operators when "Show Community Operators" is not accepted', async() => { - expect(catalogPageView.catalogTileCount('etcd')).toBe(0); + it('shows the warning dialog when a community operator is clicked', async() => { + await(catalogPageView.catalogTileFor('etcd').click()); + await operatorHubView.operatorCommunityWarningIsLoaded(); + await operatorHubView.closeCommunityWarningModal(); + await operatorHubView.operatorCommunityWarningIsClosed(); }); - it('shows community operators when "Show Community Operators" is accepted', async() => { - await operatorHubView.showCommunityOperators(); - await catalogPageView.clickFilterCheckbox('Community'); + it('shows the community operator when "Show Community Operators" is accepted', async() => { + await(catalogPageView.catalogTileFor('etcd').click()); + await operatorHubView.operatorCommunityWarningIsLoaded(); + await operatorHubView.acceptCommunityWarningModal(); + await operatorHubView.operatorCommunityWarningIsClosed(); - expect(catalogPageView.catalogTileCount('etcd')).toBe(1); + expect(operatorHubView.operatorModal.isDisplayed()).toBe(true); + expect(operatorHubView.operatorModalTitle.getText()).toEqual('etcd'); + + await operatorHubView.closeOperatorModal(); + await operatorHubView.operatorModalIsClosed(); }); it('filters Operator Hub tiles by Category', async() => { @@ -107,6 +116,8 @@ describe('Subscribing to an Operator from Operator Hub', () => { it('displays subscription creation form for selected Operator', async() => { await catalogPageView.catalogTileFor('etcd').click(); + await operatorHubView.operatorCommunityWarningIsLoaded(); + await operatorHubView.acceptCommunityWarningModal(); await operatorHubView.operatorModalIsLoaded(); await operatorHubView.operatorModalInstallBtn.click(); @@ -123,7 +134,6 @@ describe('Subscribing to an Operator from Operator Hub', () => { it('displays Operator as subscribed in Operator Hub', async() => { await operatorHubView.createSubscriptionFormBtn.click(); await crudView.isLoaded(); - await operatorHubView.showCommunityOperators(); expect(catalogPageView.catalogTileFor('etcd').$('.catalog-tile-pf-footer').getText()).toContain('Installed'); }); @@ -131,8 +141,9 @@ describe('Subscribing to an Operator from Operator Hub', () => { it('displays Operator in "Cluster Service Versions" view for "default" namespace', async() => { await browser.get(`${appHost}/operatorhub/ns/${testName}`); await crudView.isLoaded(); - await operatorHubView.showCommunityOperators(); await catalogPageView.catalogTileFor('etcd').click(); + await operatorHubView.operatorCommunityWarningIsLoaded(); + await operatorHubView.acceptCommunityWarningModal(); await operatorHubView.operatorModalIsLoaded(); await operatorHubView.viewInstalledOperator(); await crudView.isLoaded(); diff --git a/frontend/integration-tests/views/operator-hub.view.ts b/frontend/integration-tests/views/operator-hub.view.ts index 08433561358..e0eb9afe98d 100644 --- a/frontend/integration-tests/views/operator-hub.view.ts +++ b/frontend/integration-tests/views/operator-hub.view.ts @@ -1,6 +1,6 @@ /* eslint-disable no-undef, no-unused-vars */ -import { browser, $, ExpectedConditions as until, $$, by, element } from 'protractor'; +import { browser, $, ExpectedConditions as until, by, element } from 'protractor'; export const operatorModal = $('.modal-content'); export const operatorModalIsLoaded = () => browser.wait(until.presenceOf(operatorModal), 1000) @@ -16,9 +16,10 @@ export const createSubscriptionFormTitle = element(by.cssContainingText('h1', 'C export const createSubscriptionFormBtn = element(by.buttonText('Subscribe')); export const createSubscriptionFormInstallMode = element(by.cssContainingText('label', 'Installation Mode')); -export const showCommunityOperators = async() => { - await $$('.co-catalog-page__filter-toggle').click(); - await browser.wait(until.presenceOf($('.co-modal-ignore-warning')), 1000).then(() => browser.sleep(500)); - await $('.co-modal-ignore-warning').$('.btn-primary').click(); - await browser.wait(until.not(until.presenceOf($('.co-modal-ignore-warning'))), 1000).then(() => browser.sleep(500)); -}; +export const communityWarningModal = $('.co-modal-ignore-warning'); +export const operatorCommunityWarningIsLoaded = () => browser.wait(until.presenceOf(communityWarningModal), 1000) + .then(() => browser.sleep(500)); +export const operatorCommunityWarningIsClosed = () => browser.wait(until.not(until.presenceOf(communityWarningModal)), 1000) + .then(() => browser.sleep(500)); +export const closeCommunityWarningModal = () => communityWarningModal.$('.btn-default').click(); +export const acceptCommunityWarningModal = () => communityWarningModal.$('.btn-primary').click(); diff --git a/frontend/public/components/catalog/_catalog.scss b/frontend/public/components/catalog/_catalog.scss index 1123fa7b724..2abd8b5d2c4 100644 --- a/frontend/public/components/catalog/_catalog.scss +++ b/frontend/public/components/catalog/_catalog.scss @@ -198,6 +198,8 @@ $co-modal-ignore-warning-icon-width: 30px; } .co-modal-ignore-warning { + height: initial; + &__checkbox.checkbox { margin-bottom: 0; padding-top: 15px; diff --git a/frontend/public/components/operator-hub/operator-hub-community-provider-modal.tsx b/frontend/public/components/operator-hub/operator-hub-community-provider-modal.tsx index 32d7039499d..0a454877026 100644 --- a/frontend/public/components/operator-hub/operator-hub-community-provider-modal.tsx +++ b/frontend/public/components/operator-hub/operator-hub-community-provider-modal.tsx @@ -27,9 +27,9 @@ export class OperatorHubCommunityProviderModal extends React.ComponentShow Community Operators; + const submitButtonContent = Continue; return
- Show Community Operators + Show Community Operator
@@ -37,14 +37,13 @@ export class OperatorHubCommunityProviderModal extends React.Component

- These are operators which have not been vetted or verified by Red Hat. Community Operators should be used with + Community Operators are operators which have not been vetted or verified by Red Hat. Community Operators should be used with caution because their stability is unknown. Red Hat provides no support for Community Operators. {RH_OPERATOR_SUPPORT_POLICY_LINK && ( )} - Do you want to show Community Operators in the Operator Hub?

Do not show this warning again diff --git a/frontend/public/components/operator-hub/operator-hub-items.tsx b/frontend/public/components/operator-hub/operator-hub-items.tsx index 8ae7d3b11cd..7c1798cdc2b 100644 --- a/frontend/public/components/operator-hub/operator-hub-items.tsx +++ b/frontend/public/components/operator-hub/operator-hub-items.tsx @@ -3,15 +3,15 @@ import * as React from 'react'; import * as _ from 'lodash-es'; import * as PropTypes from 'prop-types'; -import { Button, Icon, Modal } from 'patternfly-react'; -import { CatalogTile, FilterSidePanel } from 'patternfly-react-extensions'; +import { Icon, Modal } from 'patternfly-react'; +import { CatalogTile } from 'patternfly-react-extensions'; import { history } from '../utils/router'; import { COMMUNITY_PROVIDERS_WARNING_LOCAL_STORAGE_KEY } from '../../const'; import { K8sResourceKind } from '../../module/k8s'; import { requireOperatorGroup } from '../operator-lifecycle-manager/operator-group'; import { normalizeIconClass } from '../catalog/catalog-item-icon'; -import { TileViewPage, updateURLParams, getFilterSearchParam, updateActiveFilters } from '../utils/tile-view-page'; +import { TileViewPage } from '../utils/tile-view-page'; import { OperatorHubItemDetails } from './operator-hub-item-details'; import { communityOperatorWarningModal } from './operator-hub-community-provider-modal'; @@ -189,22 +189,18 @@ const setURLParams = params => { }; export const OperatorHubTileView = requireOperatorGroup( - // TODO: Can be functional stateless component class OperatorHubTileView extends React.Component { constructor(props) { super(props); this.state = { detailsItem: null, - items: props.items, - communityOperatorsExist: false, - includeCommunityOperators: false, + showDetails: false, communityModalShown: false, }; this.openOverlay = this.openOverlay.bind(this); this.closeOverlay = this.closeOverlay.bind(this); - this.renderFilterGroup = this.renderFilterGroup.bind(this); this.renderTile = this.renderTile.bind(this); } @@ -212,119 +208,47 @@ export const OperatorHubTileView = requireOperatorGroup( const {items} = this.props; const searchParams = new URLSearchParams(window.location.search); const detailsItemID = searchParams.get('details-item'); - const includeCommunityOperators = searchParams.get('community-operators') === 'true'; - const communityOperatorsExist = _.some(items, item => item.providerType === COMMUNITY_PROVIDER_TYPE); - let stateItems = items; - if (communityOperatorsExist && !includeCommunityOperators) { - stateItems = _.filter(items, item => item.providerType !== COMMUNITY_PROVIDER_TYPE); - } - - const detailsItem = detailsItemID && _.find(stateItems, {uid: detailsItemID}); + const detailsItem = detailsItemID && _.find(items, {uid: detailsItemID}); - this.setState({detailsItem, items: stateItems, communityOperatorsExist, includeCommunityOperators}); + this.setState({detailsItem}); } - componentDidUpdate(prevProps, prevState) { - const {items} = this.props; - const {includeCommunityOperators} = this.state; + showCommunityOperator = (ignoreWarning: boolean = false) => { + const { detailsItem } = this.state; - if (!_.isEqual(items, prevProps.items) || includeCommunityOperators !== prevState.includeCommunityOperators) { - const communityOperatorsExist = _.some(items, item => item.providerType === COMMUNITY_PROVIDER_TYPE); - let stateItems = items; - if (communityOperatorsExist && !includeCommunityOperators) { - stateItems = _.filter(items, item => item.providerType !== COMMUNITY_PROVIDER_TYPE); - } - this.setState({items: stateItems, communityOperatorsExist}); - } - } - - openOverlay(detailsItem) { const params = new URLSearchParams(window.location.search); params.set('details-item', detailsItem.uid); setURLParams(params); + this.setState({showDetails: true}); - this.setState({detailsItem}); - } - - closeOverlay() { - const params = new URLSearchParams(window.location.search); - params.delete('details-item'); - setURLParams(params); - - this.setState({detailsItem: null}); - } - - onIncludeCommunityOperatorsToggle = (activeFilters, onUpdateFilters) => { - const {items} = this.props; - const {includeCommunityOperators} = this.state; + if (ignoreWarning) { + localStorage.setItem(COMMUNITY_PROVIDERS_WARNING_LOCAL_STORAGE_KEY, 'true'); + } + }; - if (!includeCommunityOperators) { - const ignoreWarning = localStorage.getItem(COMMUNITY_PROVIDERS_WARNING_LOCAL_STORAGE_KEY); - if (ignoreWarning === 'true') { - this.showCommunityOperators(); - return; - } + openOverlay(detailsItem) { + const ignoreWarning = localStorage.getItem(COMMUNITY_PROVIDERS_WARNING_LOCAL_STORAGE_KEY) === 'true'; - communityOperatorWarningModal({ showCommunityOperators: this.showCommunityOperators }); + if (!ignoreWarning && detailsItem.providerType === COMMUNITY_PROVIDER_TYPE) { + this.setState({detailsItem}); + communityOperatorWarningModal({ showCommunityOperators: this.showCommunityOperator }); return; } - const stateItems = _.filter(items, item => item.providerType !== COMMUNITY_PROVIDER_TYPE); const params = new URLSearchParams(window.location.search); - params.delete('community-operators'); + params.set('details-item', detailsItem.uid); setURLParams(params); - /* Clear the community filter if it is active */ - let updatedFilters = activeFilters; - if (_.get(activeFilters, 'providerType.Community.active')) { - const groupFilter = _.cloneDeep(activeFilters.providerType); - _.set(groupFilter, [COMMUNITY_PROVIDER_TYPE, 'active'], false); - updateURLParams('providerType', getFilterSearchParam(groupFilter)); - updatedFilters = updateActiveFilters(activeFilters, 'providerType', COMMUNITY_PROVIDER_TYPE, false); - onUpdateFilters(updatedFilters); - } - - this.setState({items: stateItems, includeCommunityOperators: false}); - }; + this.setState({detailsItem, showDetails: true}); + } - showCommunityOperators = (ignoreWarning: boolean = false) => { - const { items } = this.props; + closeOverlay() { const params = new URLSearchParams(window.location.search); - params.set('community-operators', 'true'); + params.delete('details-item'); setURLParams(params); - this.setState({items, includeCommunityOperators: true}); - - if (ignoreWarning) { - localStorage.setItem(COMMUNITY_PROVIDERS_WARNING_LOCAL_STORAGE_KEY, 'true'); - } - }; - - renderFilterGroup(filterGroup, groupName, activeFilters, filterCounts, onFilterChange, onUpdateFilters) { - const { includeCommunityOperators, communityOperatorsExist } = this.state; - return - {_.map(filterGroup, (filter, filterName) => { - const { label, active } = filter; - return onFilterChange(groupName, filterName, e.target.checked)} - title={label} - > - {label} - ; - })} - {groupName === 'providerType' && communityOperatorsExist && ( - - )} - ; + this.setState({detailsItem: null, showDetails: false}); } renderTile(item) { @@ -352,7 +276,8 @@ export const OperatorHubTileView = requireOperatorGroup( } render() { - const { items, detailsItem } = this.state; + const { detailsItem, showDetails } = this.state; + const { items } = this.props; return - + {detailsItem && } ; @@ -388,9 +313,7 @@ export type OperatorHubTileViewProps = { export type OperatorHubTileViewState = { detailsItem: any; - items: any[]; - communityOperatorsExist: boolean; - includeCommunityOperators: boolean; + showDetails: boolean; communityModalShown: boolean; }; From 4d3dbc70a69576fc0737102dfd1a17a0f20a2deb Mon Sep 17 00:00:00 2001 From: Jeffrey Phillips Date: Wed, 13 Feb 2019 11:22:06 -0500 Subject: [PATCH 10/45] Add a badge to indicate community operators, sort categories --- .../components/operator-hub/operator-hub-items.tsx | 13 ++++++++++++- frontend/public/vendor.scss | 1 + 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/frontend/public/components/operator-hub/operator-hub-items.tsx b/frontend/public/components/operator-hub/operator-hub-items.tsx index 7c1798cdc2b..14a1b82e7b5 100644 --- a/frontend/public/components/operator-hub/operator-hub-items.tsx +++ b/frontend/public/components/operator-hub/operator-hub-items.tsx @@ -23,6 +23,9 @@ const pageDescription = ( providing a self-service experience. ); + +const communityOperatorBadge = Community; + /** * Filter property white list */ @@ -56,7 +59,12 @@ const determineCategories = items => { }); }); - return newCategories; + const sortedKeys = _.keys(newCategories).sort((key1, key2) => key1.toLowerCase().localeCompare(key2.toLowerCase())); + + return _.reduce(sortedKeys, (categories, key) => { + categories[key] = newCategories[key]; + return categories; + }, {}); }; export const getProviderValue = value => { @@ -260,11 +268,14 @@ export const OperatorHubTileView = requireOperatorGroup( const normalizedIconClass = iconClass && `icon ${normalizeIconClass(iconClass)}`; const vendor = provider ? `provided by ${provider}` : null; + const badges = item.providerType === COMMUNITY_PROVIDER_TYPE ? [communityOperatorBadge] : []; + return ( Date: Tue, 26 Feb 2019 11:37:25 -0500 Subject: [PATCH 11/45] frontend: Change CRD link and update kebab/actions Changed the links for the CRD list page to go to the details page instead of the instances page. Updated the kebab and actions menu with a link to the instances page. Fixes https://jira.coreos.com/projects/CONSOLE/issues/CONSOLE-1210 --- .../integration-tests/tests/crud.scenario.ts | 6 ++-- .../components/custom-resource-definition.tsx | 28 +++++++++++++++---- frontend/public/components/resource-pages.ts | 1 + 3 files changed, 27 insertions(+), 8 deletions(-) diff --git a/frontend/integration-tests/tests/crud.scenario.ts b/frontend/integration-tests/tests/crud.scenario.ts index b255a2a9a9c..6d036cd98c6 100644 --- a/frontend/integration-tests/tests/crud.scenario.ts +++ b/frontend/integration-tests/tests/crud.scenario.ts @@ -271,14 +271,16 @@ describe('Kubernetes resource CRUD operations', () => { it('displays YAML editor for creating a new custom resource instance', async() => { await browser.get(`${appHost}/k8s/cluster/customresourcedefinitions?name=${name}`); await crudView.isLoaded(); - await crudView.resourceRows.first().element(by.linkText(crd.spec.names.kind)).click(); + await crudView.resourceRows.$$('.co-kebab__button').click(); + await browser.wait(until.elementToBeClickable($('.co-kebab__dropdown'))); + await $('.co-kebab__dropdown').$$('a').filter(link => link.getText().then(text => text.startsWith('View Instances'))).first().click(); await crudView.isLoaded(); await crudView.createYAMLButton.click(); await yamlView.isLoaded(); expect(yamlView.editorContent.getText()).toContain(`kind: CRD${testName}`); }); - xit('creates a new custom resource instance', async() => { + it('creates a new custom resource instance', async() => { leakedResources.add(JSON.stringify({name, plural: 'customresourcedefinitions'})); await yamlView.saveButton.click(); expect(crudView.errorMessage.isPresent()).toBe(false); diff --git a/frontend/public/components/custom-resource-definition.tsx b/frontend/public/components/custom-resource-definition.tsx index 57784e5213f..858a8ebf7e3 100644 --- a/frontend/public/components/custom-resource-definition.tsx +++ b/frontend/public/components/custom-resource-definition.tsx @@ -1,13 +1,22 @@ import * as _ from 'lodash-es'; import * as React from 'react'; -import { Link } from 'react-router-dom'; -import { ColHead, List, ListHeader, ListPage } from './factory'; -import { Kebab, ResourceKebab, ResourceIcon } from './utils'; +import { ColHead, DetailsPage, List, ListHeader, ListPage } from './factory'; +import { Kebab, navFactory, ResourceKebab, ResourceLink, ResourceSummary, SectionHeading } from './utils'; import { referenceForCRD } from '../module/k8s'; const { common } = Kebab.factory; -const menuActions = [...common]; + +const crdInstancesPath = crd => _.get(crd, 'spec.scope') === 'Namespaced' + ? `/k8s/all-namespaces/${referenceForCRD(crd)}` + : `/k8s/cluster/${referenceForCRD(crd)}`; + +const instances = (kind, obj) => ({ + label: 'View Instances', + href: crdInstancesPath(obj), +}); + +const menuActions = [instances, ...common]; const CRDHeader = props => Name @@ -27,8 +36,7 @@ const namespaced = crd => crd.spec.scope === 'Namespaced'; const CRDRow = ({obj: crd}) =>
- - {_.get(crd, 'spec.names.kind', crd.metadata.name)} +
@@ -52,8 +60,16 @@ const CRDRow = ({obj: crd}) =>
; +const Details = ({obj: crd}) => { + return
+ + +
; +}; + export const CustomResourceDefinitionsList: React.SFC = props => ; export const CustomResourceDefinitionsPage: React.SFC = props => ; +export const CustomResourceDefinitionsDetailsPage = props => ; export type CustomResourceDefinitionsListProps = { diff --git a/frontend/public/components/resource-pages.ts b/frontend/public/components/resource-pages.ts index 69a25057d2d..da24f3bad1e 100644 --- a/frontend/public/components/resource-pages.ts +++ b/frontend/public/components/resource-pages.ts @@ -107,6 +107,7 @@ export const resourceDetailPages = ImmutableMap .set(ReportReference, () => import('./chargeback' /* webpackChunkName: "chargeback" */).then(m => m.ReportsDetailsPage)) .set(ReportGenerationQueryReference, () => import('./chargeback' /* webpackChunkName: "chargeback" */).then(m => m.ReportGenerationQueriesDetailsPage)) .set(referenceForModel(StorageClassModel), () => import('./storage-class' /* webpackChunkName: "storage-class" */).then(m => m.StorageClassDetailsPage)) + .set(referenceForModel(CustomResourceDefinitionModel), () => import('./custom-resource-definition' /* webpackChunkName: "custom-resource-definition" */).then(m => m.CustomResourceDefinitionsDetailsPage)) .set(referenceForModel(ClusterServiceVersionModel), () => import('./operator-lifecycle-manager/clusterserviceversion' /* webpackChunkName: "clusterserviceversion" */).then(m => m.ClusterServiceVersionsDetailsPage)) .set(referenceForModel(CatalogSourceModel), () => import('./operator-lifecycle-manager/catalog-source' /* webpackChunkName: "catalog-source" */).then(m => m.CatalogSourceDetailsPage)) .set(referenceForModel(SubscriptionModel), () => import('./operator-lifecycle-manager/subscription' /* webpackChunkName: "subscription" */).then(m => m.SubscriptionDetailsPage)) From cb4fd3ed5ab6d80dd4241cde9da545c9d3c3ea45 Mon Sep 17 00:00:00 2001 From: Andy Pickering Date: Fri, 22 Feb 2019 16:44:12 +0900 Subject: [PATCH 12/45] Monitoring: Add metric graphs to Alert and Rule details pages Adds a `QueryBrowser` component, which plots a PromQL query as a line graph along with controls for changing the graph to display the query for any time range. Adds the `QueryBrowser` to both the alert details page and the rule details page. The alert graph shows the single metric for that alert and the rule graph shows all metrics data for that rule. Upgrade Plotly to version 1.44.4. Move the "View in Prometheus UI" link from the top of the page to the graph area. Make some changes to the graph Base class. - Make the `title` property optional - Add the ability to invoke `fetch()` without enabling polling - Set a lower limit of 5 seconds on the graph refresh interval to prevent too frequent polling when viewing narrow time ranges. - Add optional `numSamples` property that defines how many data points will be plotted for each metric --- .../__tests__/components/utils/datetime.ts | 83 +- frontend/package.json | 2 +- .../public/components/graphs/_graphs.scss | 40 + frontend/public/components/graphs/base.jsx | 23 +- .../public/components/graphs/graph-loader.jsx | 1 + frontend/public/components/graphs/index.jsx | 1 + .../components/graphs/query-browser.jsx | 174 ++ frontend/public/components/monitoring.tsx | 32 +- frontend/public/components/utils/datetime.ts | 36 + frontend/yarn.lock | 1531 ++++++++++++----- 10 files changed, 1447 insertions(+), 476 deletions(-) create mode 100644 frontend/public/components/graphs/query-browser.jsx diff --git a/frontend/__tests__/components/utils/datetime.ts b/frontend/__tests__/components/utils/datetime.ts index 93954748635..f1565ad851e 100644 --- a/frontend/__tests__/components/utils/datetime.ts +++ b/frontend/__tests__/components/utils/datetime.ts @@ -1,4 +1,4 @@ -import { fromNow, isValid, formatDuration } from '../../../public/components/utils/datetime'; +import { fromNow, isValid, formatDuration, formatPrometheusDuration, parsePrometheusDuration } from '../../../public/components/utils/datetime'; describe('fromNow', () => { it('prints past dates correctly', () => { @@ -92,3 +92,84 @@ describe('formatDuration', () => { }); }); +// Converts time durations to milliseconds +const ms = (s = 0, m = 0, h = 0, d = 0, w = 0) => ((((w * 7 + d) * 24 + h) * 60 + m) * 60 + s) * 1000; + +describe('formatPrometheusDuration', () => { + it('formats durations correctly', () => { + expect(formatPrometheusDuration(ms(1))).toEqual('1s'); + expect(formatPrometheusDuration(ms(2, 1))).toEqual('1m 2s'); + expect(formatPrometheusDuration(ms(3, 2, 1))).toEqual('1h 2m 3s'); + expect(formatPrometheusDuration(ms(4, 3, 2, 1))).toEqual('1d 2h 3m 4s'); + expect(formatPrometheusDuration(ms(5, 4, 3, 2, 1))).toEqual('1w 2d 3h 4m 5s'); + }); + + it('handles invalid values', () => { + [null, undefined, 0, -1, -9999].forEach(v => expect(formatPrometheusDuration(v)).toEqual('')); + }); +}); + +describe('parsePrometheusDuration', () => { + it('parses durations correctly', () => { + expect(parsePrometheusDuration('1s')).toEqual(ms(1)); + expect(parsePrometheusDuration('100s')).toEqual(ms(100)); + expect(parsePrometheusDuration('1m')).toEqual(ms(0, 1)); + expect(parsePrometheusDuration('90m')).toEqual(ms(0, 90)); + expect(parsePrometheusDuration('1h')).toEqual(ms(0, 0, 1)); + expect(parsePrometheusDuration('2h 0m 0s')).toEqual(ms(0, 0, 2)); + expect(parsePrometheusDuration('13h 10m 23s')).toEqual(ms(23, 10, 13)); + expect(parsePrometheusDuration('25h 61m 61s')).toEqual(ms(61, 61, 25)); + expect(parsePrometheusDuration('123h')).toEqual(ms(0, 0, 123)); + expect(parsePrometheusDuration('1d')).toEqual(ms(0, 0, 0, 1)); + expect(parsePrometheusDuration('2d 6h')).toEqual(ms(0, 0, 6, 2)); + expect(parsePrometheusDuration('8d 12h')).toEqual(ms(0, 0, 12, 8)); + expect(parsePrometheusDuration('10d 12h 30m 1s')).toEqual(ms(1, 30, 12, 10)); + expect(parsePrometheusDuration('1w')).toEqual(ms(0, 0, 0, 0, 1)); + expect(parsePrometheusDuration('5w 10d 12h 30m 1s')).toEqual(ms(1, 30, 12, 10, 5)); + expect(parsePrometheusDuration('999w 999h 999s')).toEqual(ms(999, 0, 999, 0, 999)); + }); + + it('handles 0 values', () => { + expect(parsePrometheusDuration('0s')).toEqual(0); + expect(parsePrometheusDuration('0w 0d 0h 0m 0s')).toEqual(0); + expect(parsePrometheusDuration('00h 000000m 0s')).toEqual(0); + }); + + it('handles invalid duration formats', () => { + [ + '', + null, + undefined, + '0', + '12', + 'z', + 'h', + 'abc', + '全角', + '0.5h', + '1hh', + '1h1m', + '1h h', + '1h 0', + '1h 0z', + '-1h', + ].forEach(v => expect(parsePrometheusDuration(v)).toEqual(0)); + }); + + it('mirrors formatPrometheusDuration()', () => { + [ + '1s', + '1m', + '1h', + '1m 40s', + '13h 10m 23s', + '2h 10s', + '1d', + '2d 6h', + '1w', + '5w 6d 12h 30m 1s', + '999w', + '', + ].forEach(v => expect(formatPrometheusDuration(parsePrometheusDuration(v))).toEqual(v)); + }); +}); diff --git a/frontend/package.json b/frontend/package.json index d64c8e83170..7c882c8e30a 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -71,7 +71,7 @@ "patternfly": "^3.59.0", "patternfly-react": "^2.29.1", "patternfly-react-extensions": "2.14.1", - "plotly.js": "1.28.x", + "plotly.js": "1.44.4", "prop-types": "15.6.x", "react": "16.6.3", "react-copy-to-clipboard": "5.x", diff --git a/frontend/public/components/graphs/_graphs.scss b/frontend/public/components/graphs/_graphs.scss index 3bf1a3b9332..689efd69ab7 100644 --- a/frontend/public/components/graphs/_graphs.scss +++ b/frontend/public/components/graphs/_graphs.scss @@ -14,3 +14,43 @@ white-space: nowrap; line-height: 1.4; // so descenders don't clip } + +.query-browser__wrapper { + border: 1px solid $color-grey-background-border; + margin: 0 0 20px 0; + overflow: visible; + width: 100%; +} + +.query-browser__header { + display: inline-flex; + justify-content: space-between; + padding: 15px 10px 10px 10px; + width: 100%; +} + +.query-browser__controls { + display: inline-flex; +} + +.query-browser__span-text { + border-bottom-right-radius: 0; + border-right: none; + border-top-right-radius: 0; + width: 100px; +} + +.query-browser__span-text--error { + background-color: #fdd; +} + +.query-browser__span-dropdown { + border-bottom-left-radius: 0; + border-top-left-radius: 0; + margin-right: 20px; + width: 30px; +} + +.query-browser__span-reset { + margin-right: 20px; +} diff --git a/frontend/public/components/graphs/base.jsx b/frontend/public/components/graphs/base.jsx index 6c401051c7e..84b7506e85a 100644 --- a/frontend/public/components/graphs/base.jsx +++ b/frontend/public/components/graphs/base.jsx @@ -32,7 +32,7 @@ export class BaseGraph extends SafetyFirst { } } - fetch() { + fetch(enablePolling = true) { const timeSpan = this.end - this.start || this.timeSpan; const end = this.end || Date.now(); const start = this.start || (end - timeSpan); @@ -45,8 +45,8 @@ export class BaseGraph extends SafetyFirst { } const basePath = this.props.basePath || (this.props.namespace ? prometheusTenancyBasePath : prometheusBasePath); - const pollInterval = timeSpan / 120 || 15000; - const stepSize = pollInterval / 1000; + const pollInterval = timeSpan ? Math.max(timeSpan / 120, 5000) : 15000; + const stepSize = (timeSpan && this.props.numSamples ? timeSpan / this.props.numSamples : pollInterval) / 1000; const promises = queries.map(q => { const nsParam = this.props.namespace ? `&namespace=${encodeURIComponent(this.props.namespace)}` : ''; const url = this.timeSpan @@ -64,11 +64,15 @@ export class BaseGraph extends SafetyFirst { } }) .catch(error => this.updateGraph(null, error)) - .then(() => this.interval = setTimeout(() => { - if (this.isMounted_) { - this.fetch(); + .then(() => { + if (enablePolling) { + this.interval = setTimeout(() => { + if (this.isMounted_) { + this.fetch(); + } + }, pollInterval); } - }, pollInterval)); + }); } componentWillMount() { @@ -132,7 +136,7 @@ export class BaseGraph extends SafetyFirst { const { title, className } = this.props; const url = this.props.query ? this.prometheusURL() : null; const graph =
-
{title}
+ {title &&
{title}
}
; @@ -154,7 +158,8 @@ BaseGraph.propTypes = { ]), percent: PropTypes.number, // for gauge charts className: PropTypes.string, - title: PropTypes.string.isRequired, + numSamples: PropTypes.number, + title: PropTypes.string, timeSpan: PropTypes.number, basePath: PropTypes.string, }; diff --git a/frontend/public/components/graphs/graph-loader.jsx b/frontend/public/components/graphs/graph-loader.jsx index 07892936db2..638e659e037 100644 --- a/frontend/public/components/graphs/graph-loader.jsx +++ b/frontend/public/components/graphs/graph-loader.jsx @@ -1,5 +1,6 @@ export { Bar } from './bar'; export { Gauge } from './gauge'; export { Line } from './line'; +export { QueryBrowser } from './query-browser'; export { Scalar } from './scalar'; export { Donut } from './donut'; diff --git a/frontend/public/components/graphs/index.jsx b/frontend/public/components/graphs/index.jsx index 6ace8d1623d..262e917c3e8 100644 --- a/frontend/public/components/graphs/index.jsx +++ b/frontend/public/components/graphs/index.jsx @@ -9,6 +9,7 @@ export const prometheusBasePath = window.SERVER_FLAGS.prometheusBaseURL; export const prometheusTenancyBasePath = window.SERVER_FLAGS.prometheusTenancyBaseURL; export const alertManagerBasePath = window.SERVER_FLAGS.alertManagerBaseURL; +export const QueryBrowser = props => import('./graph-loader').then(c => c.QueryBrowser)} {...props} />; export const Bar = props => import('./graph-loader').then(c => c.Bar)} {...props} />; export const Gauge = props => import('./graph-loader').then(c => c.Gauge)} {...props} />; export const Line = props => import('./graph-loader').then(c => c.Line)} {...props} />; diff --git a/frontend/public/components/graphs/query-browser.jsx b/frontend/public/components/graphs/query-browser.jsx new file mode 100644 index 00000000000..89f02eea8f8 --- /dev/null +++ b/frontend/public/components/graphs/query-browser.jsx @@ -0,0 +1,174 @@ +import * as React from 'react'; +import * as _ from 'lodash-es'; +import * as classNames from 'classnames'; +import { addTraces, relayout, restyle } from 'plotly.js/lib/core'; + +import { connectToURLs, MonitoringRoutes } from '../../monitoring'; +import { Dropdown, ExternalLink, LoadingInline } from '../utils'; +import { formatPrometheusDuration, parsePrometheusDuration } from '../utils/datetime'; +import { Line_ } from './line'; + +const spans = ['5m', '15m', '30m', '1h', '2h', '6h', '12h', '1d', '2d', '1w', '2w']; +const dropdownItems = _.zipObject(spans, spans); + +class QueryBrowser_ extends Line_ { + constructor(props) { + super(props); + + _.assign(this.state, { + isSpanValid: true, + spanText: formatPrometheusDuration(props.timeSpan), + span: props.timeSpan, + updating: true, + }); + + this.data = [{}]; + this.traces = [0]; + + _.merge(this.layout, { + dragmode: 'zoom', + height: 200, + hoverlabel: { + namelength: 80, + }, + showlegend: false, + xaxis: { + fixedrange: false, + tickformat: null, // Use Plotly's default datetime labels + type: 'date', + }, + }); + + this.onPlotlyRelayout = e => { + if (e['xaxis.autorange']) { + this.showLatest(this.state.span); + } else { + const start = e['xaxis.range[0]']; + const end = e['xaxis.range[1]']; + if (start && end) { + // Zoom to a specific graph time range + this.start = new Date(start).getTime(); + this.end = new Date(end).getTime(); + const span = this.end - this.start; + this.timeSpan = span; + this.setState({isSpanValid: true, span, spanText: formatPrometheusDuration(span), updating: true}, () => { + clearInterval(this.interval); + + // Refresh the graph data, but stop polling, since we are no longer displaying the latest data + this.fetch(false); + }); + } + } + }; + + this.relayout = () => { + const now = new Date(); + const end = this.end || now; + const start = this.start || new Date(end - this.state.span); + // eslint-disable-next-line no-console + relayout(this.node, {'xaxis.range': [start, end]}).catch(e => console.error(e)); + }; + + this.showLatest = span => { + this.start = null; + this.end = null; + this.timeSpan = span; + this.setState({isSpanValid: true, span, spanText: formatPrometheusDuration(span), updating: true}, () => { + clearInterval(this.interval); + this.fetch(); + this.relayout(); + }); + }; + + this.onSpanTextChange = e => { + const spanText = e.target.value; + const span = parsePrometheusDuration(spanText); + const isSpanValid = (span > 0); + if (isSpanValid) { + this.showLatest(span); + } + this.setState({isSpanValid, spanText}); + }; + } + + updateGraph(data) { + const newData = _.get(data, '[0].data.result'); + if (!_.isEmpty(newData)) { + this.data = newData; + let traceIndex = 0; + _.each(newData, ({metric, values}) => { + // If props.metric is specified, ignore all other metrics + const labels = _.omit(metric, '__name__'); + if (this.props.metric && _.some(labels, (v, k) => _.get(this.props.metric, k) !== v)) { + return; + } + + // The data may have missing values, so we fill those gaps with nulls so that the graph correctly shows the + // missing values as gaps in the line + const start = values[0][0]; + const end = _.last(values)[0]; + const step = this.state.span / this.props.numSamples / 1000; + _.range(start, end, step).map((t, i) => { + if (_.get(values, [i, 0]) > t) { + values.splice(i, 0, [t, null]); + } + }); + + const update = { + line: { + width: 1, + }, + name: _.map(labels, (v, k) => `${k}=${v}`).join(','), + x: [values.map(v => new Date(v[0] * 1000))], + y: [values.map(v => v[1])], + }; + + if (!this.traces.includes(traceIndex)) { + // eslint-disable-next-line no-console + addTraces(this.node, update, traceIndex).catch(e => console.error(e)); + this.traces.push(traceIndex); + } + // eslint-disable-next-line no-console + restyle(this.node, update, [traceIndex]).catch(e => console.error(e)); + traceIndex += 1; + }); + + this.relayout(); + } + this.setState({updating: false}); + } + + render() { + const {query, timeSpan, urls} = this.props; + const {spanText, isSpanValid, updating} = this.state; + const baseUrl = urls[MonitoringRoutes.Prometheus]; + + return
+
+
+ + this.showLatest(parsePrometheusDuration(v))} + /> + + {updating && } +
+ {baseUrl && query && } +
+
+
; + } +} +export const QueryBrowser = connectToURLs(MonitoringRoutes.Prometheus)(QueryBrowser_); diff --git a/frontend/public/components/monitoring.tsx b/frontend/public/components/monitoring.tsx index bb1e2c3eafa..f54bca5d757 100644 --- a/frontend/public/components/monitoring.tsx +++ b/frontend/public/components/monitoring.tsx @@ -12,6 +12,7 @@ import { alertState, AlertStates, connectToURLs, MonitoringRoutes, silenceState, import store from '../redux'; import { UIActions } from '../ui/ui-actions'; import { ColHead, List, ListHeader, ResourceRow, TextFilter } from './factory'; +import { QueryBrowser } from './graphs'; import { confirmModal } from './modals'; import { CheckBoxes } from './row-filter'; import { SafetyFirst } from './safety-first'; @@ -168,6 +169,15 @@ const Label = ({k, v}) =>
{v}
; +const Graph = ({metric = undefined, numSamples, rule}) => { + const {duration = 0, query = ''} = rule || {}; + + // 3 times the rule's duration, but not less than 30 minutes + const timeSpan = Math.max(3 * duration, 30 * 60) * 1000; + + return ; +}; + const SilenceMatchersList = ({silence}) =>
{_.map(silence.matchers, ({name, isRegex, value}, i) =>
; @@ -210,6 +220,11 @@ const AlertsDetailsPage = withFallback(connect(alertStateToProps)((props: Alerts
+
+
+ {state !== AlertStates.NotFiring && } +
+
@@ -273,17 +288,6 @@ const AlertsDetailsPage = withFallback(connect(alertStateToProps)((props: Alerts ; })); -const ViewInPrometheusLink_ = ({rule, urls}) => { - const baseUrl = urls[MonitoringRoutes.Prometheus]; - const query = _.get(rule, 'query'); - if (!baseUrl || !query) { - return null; - } - const href = `${baseUrl}/graph?g0.expr=${encodeURIComponent(query)}&g0.tab=0`; - return ; -}; -const ViewInPrometheusLink = connectToURLs(MonitoringRoutes.Prometheus)(ViewInPrometheusLink_); - const ActiveAlerts = ({alerts, ruleID}) =>
Description
@@ -329,7 +333,6 @@ const AlertRulesDetailsPage = withFallback(connect(ruleStateToProps)((props: Ale
-
@@ -362,6 +365,11 @@ const AlertRulesDetailsPage = withFallback(connect(ruleStateToProps)((props: Ale
+
+
+ +
+
{_.isEmpty(alerts) ?
None Found
: } diff --git a/frontend/public/components/utils/datetime.ts b/frontend/public/components/utils/datetime.ts index 79b1a4a23cb..5befd3c4045 100644 --- a/frontend/public/components/utils/datetime.ts +++ b/frontend/public/components/utils/datetime.ts @@ -114,3 +114,39 @@ export const formatDuration = (ms: number) => { return formatted; }; + +// Conversions between units and milliseconds +const s = 1000; +const m = s * 60; +const h = m * 60; +const d = h * 24; +const w = d * 7; +const units = {w, d, h, m, s}; + +// Formats a duration in milliseconds like "1h 10m" +export const formatPrometheusDuration = (ms: number) => { + if (!_.isFinite(ms) || ms < 0) { + return ''; + } + let remaining = ms; + let str = ''; + _.each(units, (factor, unit) => { + const n = Math.floor(remaining / factor); + if (n > 0) { + str += `${n}${unit} `; + remaining -= n * factor; + } + }); + return _.trim(str); +}; + +// Converts a duration like "1h 10m 23s" to milliseconds or returns 0 if the duration could not be parsed +export const parsePrometheusDuration = (duration: string): number => { + try { + const parts = duration.trim().split(/\s+/).map(p => p.match(/^(\d+)([wdhms])$/)); + return _.sumBy(parts, p => parseInt(p[1], 10) * units[p[2]]); + } catch (ignored) { + // Invalid duration format + return 0; + } +}; diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 9761713a5d2..a05fb23fcf4 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -2,7 +2,7 @@ # yarn lockfile v1 -"3d-view-controls@^2.2.0": +"3d-view-controls@^2.2.2": version "2.2.2" resolved "https://registry.yarnpkg.com/3d-view-controls/-/3d-view-controls-2.2.2.tgz#7173fc197e9e7e4dbc63213438467047dbc84fa2" dependencies: @@ -86,6 +86,50 @@ version "0.8.2" resolved "https://registry.yarnpkg.com/@emotion/utils/-/utils-0.8.2.tgz#576ff7fb1230185b619a75d258cbc98f0867a8dc" +"@mapbox/geojson-area@0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@mapbox/geojson-area/-/geojson-area-0.2.2.tgz#18d7814aa36bf23fbbcc379f8e26a22927debf10" + dependencies: + wgs84 "0.0.0" + +"@mapbox/gl-matrix@^0.0.1": + version "0.0.1" + resolved "https://registry.yarnpkg.com/@mapbox/gl-matrix/-/gl-matrix-0.0.1.tgz#e5126aab4d64c36b81c7a97d0ae0dddde5773d2b" + +"@mapbox/jsonlint-lines-primitives@^2.0.1": + version "2.0.2" + resolved "https://registry.yarnpkg.com/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz#ce56e539f83552b58d10d672ea4d6fc9adc7b234" + +"@mapbox/mapbox-gl-supported@^1.3.1": + version "1.4.0" + resolved "https://registry.yarnpkg.com/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.4.0.tgz#36946b22944fe2cfa43cfafd5ef36fdb54a069e4" + +"@mapbox/point-geometry@0.1.0", "@mapbox/point-geometry@^0.1.0", "@mapbox/point-geometry@~0.1.0": + version "0.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz#8a83f9335c7860effa2eeeca254332aa0aeed8f2" + +"@mapbox/shelf-pack@^3.1.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@mapbox/shelf-pack/-/shelf-pack-3.2.0.tgz#df3630ecce8c042817c9a365b88078412963de64" + +"@mapbox/tiny-sdf@^1.1.0": + version "1.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/tiny-sdf/-/tiny-sdf-1.1.0.tgz#b0b8f5c22005e6ddb838f421ffd257c1f74f9a20" + +"@mapbox/unitbezier@^0.0.0": + version "0.0.0" + resolved "https://registry.yarnpkg.com/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz#15651bd553a67b8581fb398810c98ad86a34524e" + +"@mapbox/vector-tile@^1.3.1": + version "1.3.1" + resolved "https://registry.yarnpkg.com/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz#d3a74c90402d06e89ec66de49ec817ff53409666" + dependencies: + "@mapbox/point-geometry" "~0.1.0" + +"@mapbox/whoots-js@^3.0.0": + version "3.1.0" + resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" + "@patternfly/patternfly-next@^1.0.109": version "1.0.109" resolved "https://registry.yarnpkg.com/@patternfly/patternfly-next/-/patternfly-next-1.0.109.tgz#5c1a8ca29ca48d030324d3d588af9954e2f36cea" @@ -127,9 +171,9 @@ version "1.5.2" resolved "https://registry.yarnpkg.com/@patternfly/react-tokens/-/react-tokens-1.5.2.tgz#0b8c84524d018ad92979a07494ce75a8d4304d32" -"@plotly/d3-sankey@^0.5.0": - version "0.5.0" - resolved "https://registry.yarnpkg.com/@plotly/d3-sankey/-/d3-sankey-0.5.0.tgz#b22faea742e58251335ee5d9fba248772607800f" +"@plotly/d3-sankey@^0.5.1": + version "0.5.1" + resolved "https://registry.yarnpkg.com/@plotly/d3-sankey/-/d3-sankey-0.5.1.tgz#c2862c71374aba4f097a95a3449c7274a15a22de" dependencies: d3-array "1" d3-collection "1" @@ -614,11 +658,7 @@ "@webassemblyjs/wast-parser" "1.5.12" long "^3.2.0" -"JSV@>= 4.0.x": - version "4.0.2" - resolved "https://registry.yarnpkg.com/JSV/-/JSV-4.0.2.tgz#d077f6825571f82132f9dffaed587b4029feff57" - -a-big-triangle@^1.0.0: +a-big-triangle@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/a-big-triangle/-/a-big-triangle-1.0.3.tgz#eefd30b02a8f525e8b1f72bb6bb1b0c16751c794" dependencies: @@ -638,6 +678,10 @@ abbrev@1: version "1.1.1" resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.1.tgz#f8f2c887ad10bf67f634f005b6987fed3179aac8" +abs-svg-path@^0.1.1, abs-svg-path@~0.1.1: + version "0.1.1" + resolved "https://registry.yarnpkg.com/abs-svg-path/-/abs-svg-path-0.1.1.tgz#df601c8e8d2ba10d4a76d625e236a9a39c2723bf" + accepts@~1.3.5: version "1.3.5" resolved "https://registry.yarnpkg.com/accepts/-/accepts-1.3.5.tgz#eb777df6011723a3b14e8a72c0805c8e86746bd2" @@ -678,11 +722,11 @@ acorn@^3.0.4: version "3.3.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-3.3.0.tgz#45e37fb39e8da3f25baee3ff5369e2bb5f22017a" -acorn@^4.0.0, acorn@^4.0.4: +acorn@^4.0.4: version "4.0.13" resolved "https://registry.yarnpkg.com/acorn/-/acorn-4.0.13.tgz#105495ae5361d697bd195c825192e1ad7f253787" -acorn@^5.0.0, acorn@^5.1.0, acorn@^5.5.0: +acorn@^5.0.0, acorn@^5.5.0: version "5.5.3" resolved "https://registry.yarnpkg.com/acorn/-/acorn-5.5.3.tgz#f473dd47e0277a08e28e9bec5aeeb04751f0b8c9" @@ -857,6 +901,10 @@ ansi-wrap@0.1.0, ansi-wrap@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/ansi-wrap/-/ansi-wrap-0.1.0.tgz#a82250ddb0015e9a27ca82e82ea603bbfa45efaf" +ansicolors@~0.2.1: + version "0.2.1" + resolved "https://registry.yarnpkg.com/ansicolors/-/ansicolors-0.2.1.tgz#be089599097b74a5c9c4a84a0cdbcdb62bd87aef" + any-observable@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/any-observable/-/any-observable-0.2.0.tgz#c67870058003579009083f54ac0abafb5c33d242" @@ -962,12 +1010,20 @@ array-map@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" -array-normalize@^1.1.2: +array-normalize@^1.1.3: version "1.1.3" resolved "https://registry.yarnpkg.com/array-normalize/-/array-normalize-1.1.3.tgz#73fb837f4816ec19151d3c5e8d853a4590ce01bd" dependencies: array-bounds "^1.0.0" +array-range@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/array-range/-/array-range-1.0.1.tgz#f56e46591843611c6a56f77ef02eda7c50089bfc" + +array-rearrange@^2.2.2: + version "2.2.2" + resolved "https://registry.yarnpkg.com/array-rearrange/-/array-rearrange-2.2.2.tgz#fa1a2acf8d02e88dd0c9602aa0e06a79158b2283" + array-reduce@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" @@ -1074,6 +1130,10 @@ atob-lite@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-1.0.0.tgz#b88dca6006922b962094f7556826bab31c4a296b" +atob-lite@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/atob-lite/-/atob-lite-2.0.0.tgz#0fef5ad46f1bd7a8502c65727f0367d5ee43d696" + atob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/atob/-/atob-2.1.1.tgz#ae2d5a729477f289d60dd7f96a6314a22dd6c22a" @@ -1869,10 +1929,6 @@ barycentric@^1.0.1: dependencies: robust-linear-solve "^1.0.0" -base64-js@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-0.0.2.tgz#024f0f72afa25b75f9c0ee73cd4f55ec1bed9784" - base64-js@^1.0.2: version "1.3.0" resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.0.tgz#cab1e6118f051095e58b5281aea8c1cd22bfc0e3" @@ -1923,7 +1979,7 @@ binary-search-bounds@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/binary-search-bounds/-/binary-search-bounds-1.0.0.tgz#323ca317e3f2a40f4244c7255f5384a5b207bb69" -binary-search-bounds@^2.0.0, binary-search-bounds@^2.0.3: +binary-search-bounds@^2.0.0, binary-search-bounds@^2.0.3, binary-search-bounds@^2.0.4: version "2.0.4" resolved "https://registry.yarnpkg.com/binary-search-bounds/-/binary-search-bounds-2.0.4.tgz#eea0e4081da93baa851c7d851a7e636c3d51307f" @@ -1939,6 +1995,12 @@ bit-twiddle@~0.0.1: version "0.0.2" resolved "https://registry.yarnpkg.com/bit-twiddle/-/bit-twiddle-0.0.2.tgz#c2eaebb952a3b94acc140497e1cdcd2f1a33f58e" +bitmap-sdf@^1.0.0: + version "1.0.3" + resolved "https://registry.yarnpkg.com/bitmap-sdf/-/bitmap-sdf-1.0.3.tgz#c99913e5729357a6fd350de34158180c013880b2" + dependencies: + clamp "^1.0.1" + bl@^0.9.4: version "0.9.5" resolved "https://registry.yarnpkg.com/bl/-/bl-0.9.5.tgz#c06b797af085ea00bc527afc8efcf11de2232054" @@ -2053,13 +2115,6 @@ bootstrap@~3.4.0: version "3.4.0" resolved "https://registry.yarnpkg.com/bootstrap/-/bootstrap-3.4.0.tgz#f8d77540dd3062283d2ae7687e21c1e691961640" -bops@0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/bops/-/bops-0.0.6.tgz#082d1d55fa01e60dbdc2ebc2dba37f659554cf3a" - dependencies: - base64-js "0.0.2" - to-utf8 "0.0.1" - boundary-cells@^2.0.0: version "2.0.1" resolved "https://registry.yarnpkg.com/boundary-cells/-/boundary-cells-2.0.1.tgz#e905a8d1419cf47cb36be3dbf525db5e24de0042" @@ -2111,9 +2166,9 @@ breakjs@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/breakjs/-/breakjs-1.0.0.tgz#ec8353a06862eb43962deae09072ee66a4cd8459" -brfs@^1.4.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.5.0.tgz#a3822ed7a65723e056f89ff4b58e8abc63658f03" +brfs@^1.4.4: + version "1.6.1" + resolved "https://registry.yarnpkg.com/brfs/-/brfs-1.6.1.tgz#b78ce2336d818e25eea04a0947cba6d4fb8849c3" dependencies: quote-stream "^1.0.1" resolve "^1.1.5" @@ -2205,6 +2260,23 @@ bser@^2.0.0: dependencies: node-int64 "^0.4.0" +buble@^0.19.3: + version "0.19.6" + resolved "https://registry.yarnpkg.com/buble/-/buble-0.19.6.tgz#915909b6bd5b11ee03b1c885ec914a8b974d34d3" + dependencies: + chalk "^2.4.1" + magic-string "^0.25.1" + minimist "^1.2.0" + os-homedir "^1.0.1" + regexpu-core "^4.2.0" + vlq "^1.0.0" + +bubleify@^1.0.0, bubleify@^1.1.0, bubleify@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/bubleify/-/bubleify-1.2.0.tgz#17a65b6b70160c4d81a06f28fc2a461621415ea9" + dependencies: + buble "^0.19.3" + buffer-equal@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/buffer-equal/-/buffer-equal-0.0.1.tgz#91bc74b11ea405bc916bc6aa908faafa5b4aac4b" @@ -2300,15 +2372,6 @@ cacheable-request@^2.1.1: normalize-url "2.0.1" responselike "1.0.2" -call-matcher@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/call-matcher/-/call-matcher-1.0.1.tgz#5134d077984f712a54dad3cbf62de28dce416ca8" - dependencies: - core-js "^2.0.0" - deep-equal "^1.0.0" - espurify "^1.6.0" - estraverse "^4.0.0" - caller-path@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/caller-path/-/caller-path-0.1.0.tgz#94085ef63581ecd3daa92444a8fe94e82577751f" @@ -2366,6 +2429,19 @@ caniuse-db@^1.0.30000529, caniuse-db@^1.0.30000634, caniuse-db@^1.0.30000639: version "1.0.30000815" resolved "https://registry.yarnpkg.com/caniuse-db/-/caniuse-db-1.0.30000815.tgz#0e218fa133d0d071c886aa041b435258cc746891" +canvas-fit@^1.5.0: + version "1.5.0" + resolved "https://registry.yarnpkg.com/canvas-fit/-/canvas-fit-1.5.0.tgz#ae13be66ade42f5be0e487e345fce30a5e5b5e5f" + dependencies: + element-size "^1.1.1" + +cardinal@~0.4.2: + version "0.4.4" + resolved "https://registry.yarnpkg.com/cardinal/-/cardinal-0.4.4.tgz#ca5bb68a5b511b90fe93b9acea49bdee5c32bfe2" + dependencies: + ansicolors "~0.2.1" + redeyed "~0.4.0" + caseless@~0.11.0: version "0.11.0" resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" @@ -2423,6 +2499,14 @@ chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" +chalk@^2.4.1: + version "2.4.2" + resolved "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz#cd42541677a54333cf541a49108c1432b44c9424" + dependencies: + ansi-styles "^3.2.1" + escape-string-regexp "^1.0.5" + supports-color "^5.3.0" + chalk@~0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/chalk/-/chalk-0.4.0.tgz#5199a3ddcd0c1efe23bc08c1b027b06176e0c64f" @@ -2701,6 +2785,12 @@ collection-visit@^1.0.0: map-visit "^1.0.0" object-visit "^1.0.0" +color-alpha@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/color-alpha/-/color-alpha-1.0.3.tgz#318e33edb215bd695d51cae4922640a44107e959" + dependencies: + color-parse "^1.2.0" + color-convert@^1.3.0: version "1.9.1" resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.1.tgz#c1261107aeb2f294ebffec9ed9ecad529a6097ed" @@ -2727,20 +2817,28 @@ color-name@^1.1.1: version "1.1.4" resolved "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz#c2a09a87acbde69543de6f63fa3995c826c536a2" -color-parse@^1.3.4: - version "1.3.5" - resolved "https://registry.yarnpkg.com/color-parse/-/color-parse-1.3.5.tgz#4c810f72e808e4f73b63f72acd78da538a515564" +color-normalize@^1.0.0, color-normalize@^1.0.3, color-normalize@^1.1.0, color-normalize@^1.3.0: + version "1.3.0" + resolved "https://registry.yarnpkg.com/color-normalize/-/color-normalize-1.3.0.tgz#fcf1f822196b863416fc701350dff8d1e8fdebe1" + dependencies: + clamp "^1.0.1" + color-rgba "^2.1.0" + dtype "^2.0.0" + +color-parse@^1.2.0, color-parse@^1.3.7: + version "1.3.7" + resolved "https://registry.yarnpkg.com/color-parse/-/color-parse-1.3.7.tgz#34ac4fb0782b992d3614417b60896c4884771b26" dependencies: color-name "^1.0.0" defined "^1.0.0" is-plain-obj "^1.1.0" -color-rgba@^1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/color-rgba/-/color-rgba-1.1.1.tgz#eed993a4297880f44a77c2d62b2f6eba78101d78" +color-rgba@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/color-rgba/-/color-rgba-2.1.0.tgz#d6f91376b745a76506558ec17b3390e721892ee9" dependencies: clamp "^1.0.1" - color-parse "^1.3.4" + color-parse "^1.3.7" color-space "^1.14.6" color-space@^1.14.6: @@ -2863,6 +2961,16 @@ component-emitter@^1.2.1: version "1.2.1" resolved "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.2.1.tgz#137918d6d78283f7df7a6b7c5a63e140e69425e6" +compute-dims@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/compute-dims/-/compute-dims-1.1.0.tgz#6d5b712929b6c531af3b4d580ed5adacbbd77e0c" + dependencies: + utils-copy "^1.0.0" + validate.io-array "^1.0.6" + validate.io-matrix-like "^1.0.2" + validate.io-ndarray-like "^1.0.0" + validate.io-positive-integer "^1.0.0" + concat-map@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" @@ -2876,12 +2984,6 @@ concat-stream@1.6.2, concat-stream@^1.5.0, concat-stream@^1.5.2, concat-stream@^ readable-stream "^2.2.2" typedarray "^0.0.6" -concat-stream@~1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.2.1.tgz#f35100b6c46378bfba8b6b80f9f0d0ccdf13dc60" - dependencies: - bops "0.0.6" - console-browserify@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.1.0.tgz#f0241c45730a9fc6323b206dbf38edc741d0bb10" @@ -2892,6 +2994,14 @@ console-control-strings@^1.0.0, console-control-strings@~1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" +const-max-uint32@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/const-max-uint32/-/const-max-uint32-1.0.2.tgz#f009bb6230e678ed874dd2d6a9cd9e3cbfabb676" + +const-pinf-float64@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/const-pinf-float64/-/const-pinf-float64-1.0.0.tgz#f6efb0d79f9c0986d3e79f2923abf9b70b63d726" + constants-browserify@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz#c20b96d8c617748aaf1c16021760cd27fcb8cb75" @@ -2916,7 +3026,7 @@ convert-source-map@^0.3.3: version "0.3.5" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-0.3.5.tgz#f1d802950af7dd2631a1febe0596550c86ab3190" -convert-source-map@^1.1.1, convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: +convert-source-map@^1.4.0, convert-source-map@^1.5.0, convert-source-map@^1.5.1: version "1.5.1" resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.1.tgz#b8278097b9bc229365de5c62cf5fcaed8b5599e5" @@ -2957,7 +3067,7 @@ copy-to-clipboard@^3: dependencies: toggle-selection "^1.0.3" -core-js@2.x, core-js@^2.0.0, core-js@^2.4.1, core-js@^2.5.0: +core-js@2.x, core-js@^2.4.1, core-js@^2.5.0: version "2.5.3" resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.5.3.tgz#8acc38345824f16d8365b7c9b4259168e8ed603e" @@ -3121,6 +3231,40 @@ css-element-queries@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/css-element-queries/-/css-element-queries-1.0.2.tgz#a32edfee4a5023688ef4d45f402077306d51d44c" +css-font-size-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz#854875ace9aca6a8d2ee0d345a44aae9bb6db6cb" + +css-font-stretch-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-font-stretch-keywords/-/css-font-stretch-keywords-1.0.1.tgz#50cee9b9ba031fb5c952d4723139f1e107b54b10" + +css-font-style-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-font-style-keywords/-/css-font-style-keywords-1.0.1.tgz#5c3532813f63b4a1de954d13cea86ab4333409e4" + +css-font-weight-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-font-weight-keywords/-/css-font-weight-keywords-1.0.0.tgz#9bc04671ac85bc724b574ef5d3ac96b0d604fd97" + +css-font@^1.0.0, css-font@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/css-font/-/css-font-1.2.0.tgz#e73cbdc11fd87c8e6c928ad7098a9771c8c2b6e3" + dependencies: + css-font-size-keywords "^1.0.0" + css-font-stretch-keywords "^1.0.1" + css-font-style-keywords "^1.0.1" + css-font-weight-keywords "^1.0.0" + css-global-keywords "^1.0.1" + css-system-font-keywords "^1.0.0" + pick-by-alias "^1.2.0" + string-split-by "^1.0.0" + unquote "^1.1.0" + +css-global-keywords@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/css-global-keywords/-/css-global-keywords-1.0.1.tgz#72a9aea72796d019b1d2a3252de4e5aaa37e4a69" + css-loader@0.28.x: version "0.28.11" resolved "https://registry.yarnpkg.com/css-loader/-/css-loader-0.28.11.tgz#c3f9864a700be2711bb5a2462b2389b1a392dab7" @@ -3157,6 +3301,10 @@ css-selector-tokenizer@^0.7.0: fastparse "^1.1.1" regexpu-core "^1.0.0" +css-system-font-keywords@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/css-system-font-keywords/-/css-system-font-keywords-1.0.0.tgz#85c6f086aba4eb32c571a3086affc434b84823ed" + css-what@2.1: version "2.1.0" resolved "https://registry.yarnpkg.com/css-what/-/css-what-2.1.0.tgz#9467d032c38cfaefb9f2d79501253062f87fa1bd" @@ -3179,7 +3327,7 @@ css@^2.2.3: source-map-resolve "^0.5.2" urix "^0.1.0" -csscolorparser@^1.0.2, csscolorparser@~1.0.2: +csscolorparser@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/csscolorparser/-/csscolorparser-1.0.3.tgz#b34f391eea4da8f3e98231e2ccd8df9c041f171b" @@ -3340,6 +3488,12 @@ d3@^3.5.12, d3@~3.5.0, d3@~3.5.17: version "3.5.17" resolved "https://registry.yarnpkg.com/d3/-/d3-3.5.17.tgz#bc46748004378b21a360c9fc7cf5231790762fb8" +d@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/d/-/d-1.0.0.tgz#754bb5bfe55451da69a58b94d45f4c5b0462d58f" + dependencies: + es5-ext "^0.10.9" + dargs@^5.1.0: version "5.1.0" resolved "https://registry.yarnpkg.com/dargs/-/dargs-5.1.0.tgz#ec7ea50c78564cd36c9d5ec18f66329fade27829" @@ -3437,7 +3591,7 @@ decompress-response@^3.2.0, decompress-response@^3.3.0: dependencies: mimic-response "^1.0.0" -deep-equal@^1.0.0, deep-equal@^1.0.1, deep-equal@~1.0.1: +deep-equal@^1.0.1, deep-equal@~1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.0.1.tgz#f5d260292b660e084eff4cdbc9f08ad3247448b5" @@ -3551,6 +3705,10 @@ detect-indent@^4.0.0: dependencies: repeating "^2.0.0" +detect-kerning@^2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/detect-kerning/-/detect-kerning-2.1.2.tgz#4ecd548e4a5a3fc880fe2a50609312d000fa9fc2" + detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" @@ -3668,12 +3826,23 @@ double-bits@^1.1.0, double-bits@^1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/double-bits/-/double-bits-1.1.1.tgz#58abba45494da4d0fa36b73ad11a286c9184b1c6" +draw-svg-path@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/draw-svg-path/-/draw-svg-path-1.0.0.tgz#6f116d962dd314b99ea534d6f58dd66cdbd69379" + dependencies: + abs-svg-path "~0.1.1" + normalize-svg-path "~0.1.0" + drmonty-datatables-colvis@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/drmonty-datatables-colvis/-/drmonty-datatables-colvis-1.1.2.tgz#96ab9edfb48643cc2edda3f87b88933cdee8127c" dependencies: jquery ">=1.7.0" +dtype@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/dtype/-/dtype-2.0.0.tgz#cd052323ce061444ecd2e8f5748f69a29be28434" + dup@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/dup/-/dup-1.0.0.tgz#51fc5ac685f8196469df0b905e934b20af5b4029" @@ -3716,9 +3885,9 @@ duplexify@^3.4.5: readable-stream "^2.0.0" stream-shift "^1.0.0" -earcut@^2.0.3: - version "2.1.3" - resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.1.3.tgz#ca579545f351941af7c3d0df49c9f7d34af99b0c" +earcut@^2.1.1, earcut@^2.1.3: + version "2.1.4" + resolved "https://registry.yarnpkg.com/earcut/-/earcut-2.1.4.tgz#6b161f89bfe4bb08576b9e8af165e1477d6a1c02" ecc-jsbn@~0.1.1: version "0.1.1" @@ -3756,6 +3925,10 @@ elegant-spinner@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/elegant-spinner/-/elegant-spinner-1.0.1.tgz#db043521c95d7e303fd8f345bedc3349cfb0729e" +element-size@^1.1.1: + version "1.1.1" + resolved "https://registry.yarnpkg.com/element-size/-/element-size-1.1.1.tgz#64e5f159d97121631845bcbaecaf279c39b5e34e" + elliptic@^6.0.0: version "6.4.0" resolved "https://registry.yarnpkg.com/elliptic/-/elliptic-6.4.0.tgz#cac9af8762c85836187003c8dfe193e5e2eae5df" @@ -3910,10 +4083,26 @@ es-to-primitive@^1.1.1: is-date-object "^1.0.1" is-symbol "^1.0.2" +es5-ext@^0.10.14, es5-ext@^0.10.35, es5-ext@^0.10.9, es5-ext@~0.10.14: + version "0.10.47" + resolved "https://registry.yarnpkg.com/es5-ext/-/es5-ext-0.10.47.tgz#d24232e1380daad5449a817be19bde9729024a11" + dependencies: + es6-iterator "~2.0.3" + es6-symbol "~3.1.1" + next-tick "1" + es6-error@^4.1.1: version "4.1.1" resolved "https://registry.yarnpkg.com/es6-error/-/es6-error-4.1.1.tgz#9e3af407459deed47e9a91f9b885a84eb05c561d" +es6-iterator@^2.0.1, es6-iterator@~2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/es6-iterator/-/es6-iterator-2.0.3.tgz#a7de889141a05a94b0854403b2d0a0fbfa98f3b7" + dependencies: + d "1" + es5-ext "^0.10.35" + es6-symbol "^3.1.1" + es6-promise@^3.0.2: version "3.3.1" resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-3.3.1.tgz#a08cdde84ccdbf34d027a1451bc91d4bcd28a613" @@ -3932,6 +4121,22 @@ es6-promisify@^5.0.0: dependencies: es6-promise "^4.0.3" +es6-symbol@^3.1.1, es6-symbol@~3.1.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/es6-symbol/-/es6-symbol-3.1.1.tgz#bf00ef4fdab6ba1b46ecb7b629b4c7ed5715cc77" + dependencies: + d "1" + es5-ext "~0.10.14" + +es6-weak-map@^2.0.2: + version "2.0.2" + resolved "https://registry.yarnpkg.com/es6-weak-map/-/es6-weak-map-2.0.2.tgz#5e3ab32251ffd1538a1f8e5ffa1357772f92d96f" + dependencies: + d "1" + es5-ext "^0.10.14" + es6-iterator "^2.0.1" + es6-symbol "^3.1.1" + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -4096,7 +4301,7 @@ esprima@^4.0.0, esprima@~4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/esprima/-/esprima-4.0.0.tgz#4499eddcd1110e0b218bacf2fa7f7f59f55ca804" -esprima@~1.0.2: +esprima@~1.0.2, esprima@~1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.0.4.tgz#9f557e08fc3b4d26ece9dd34f8fbf476b62585ad" @@ -4104,12 +4309,6 @@ esprima@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/esprima/-/esprima-1.1.1.tgz#5b6f1547f4d102e670e140c509be6771d6aeb549" -espurify@^1.3.0, espurify@^1.6.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/espurify/-/espurify-1.7.0.tgz#1c5cf6cbccc32e6f639380bd4f991fab9ba9d226" - dependencies: - core-js "^2.0.0" - esquery@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/esquery/-/esquery-1.0.0.tgz#cfba8b57d7fba93f17298a8a006a04cda13d80fa" @@ -4217,6 +4416,10 @@ expand-tilde@^2.0.0, expand-tilde@^2.0.2: dependencies: homedir-polyfill "^1.0.1" +expect.js@~0.2.0: + version "0.2.0" + resolved "https://registry.yarnpkg.com/expect.js/-/expect.js-0.2.0.tgz#1028533d2c1c363f74a6796ff57ec0520ded2be1" + expect@^21.2.1: version "21.2.1" resolved "https://registry.yarnpkg.com/expect/-/expect-21.2.1.tgz#003ac2ac7005c3c29e73b38a272d4afadd6d1d7b" @@ -4338,7 +4541,7 @@ extsprintf@^1.2.0: version "1.4.0" resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz#e2689f8f356fad62cca65a3a91c5df5f9551692f" -falafel@^2.0.0, falafel@^2.1.0: +falafel@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/falafel/-/falafel-2.1.0.tgz#96bb17761daba94f46d001738b3cedf3a67fe06c" dependencies: @@ -4363,9 +4566,11 @@ fast-deep-equal@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz#7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49" -fast-isnumeric@^1.1.1: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fast-isnumeric/-/fast-isnumeric-1.1.1.tgz#57b81c07a3c09cb9ec3bef9c161818992d893643" +fast-isnumeric@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/fast-isnumeric/-/fast-isnumeric-1.1.2.tgz#e9dad2643b145d9469cf6e659833e824690446b8" + dependencies: + is-string-blank "^1.0.1" fast-json-stable-stringify@^2.0.0: version "2.0.0" @@ -4418,10 +4623,6 @@ fd-slicer@~1.0.1: dependencies: pend "~1.2.0" -feature-filter@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/feature-filter/-/feature-filter-2.2.0.tgz#3cc356015e968c362afbdf7ff1bb744ddf7fc2e0" - figures@^1.7.0: version "1.7.0" resolved "https://registry.yarnpkg.com/figures/-/figures-1.7.0.tgz#cbe1e3affcf1cd44b80cadfed28dc793a9701d2e" @@ -4557,10 +4758,20 @@ flat-cache@^1.2.1: graceful-fs "^4.1.2" write "^0.2.1" +flatten-vertex-data@^1.0.0, flatten-vertex-data@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flatten-vertex-data/-/flatten-vertex-data-1.0.2.tgz#889fd60bea506006ca33955ee1105175fb620219" + dependencies: + dtype "^2.0.0" + flatten@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/flatten/-/flatten-1.0.2.tgz#dae46a9d78fbe25292258cc1e780a41d95c03782" +flip-pixels@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/flip-pixels/-/flip-pixels-1.0.2.tgz#aad7b7d9fc65932d5f27e2e4dac4b494140845e4" + flow-parser@^0.*: version "0.68.0" resolved "https://registry.yarnpkg.com/flow-parser/-/flow-parser-0.68.0.tgz#9cc96620a102e316a314b6bcd56205ceace862d8" @@ -4585,13 +4796,19 @@ focus-trap@^3.0.0: tabbable "^3.1.0" xtend "^4.0.1" -font-atlas-sdf@^1.3.2, font-atlas-sdf@^1.3.3: +font-atlas-sdf@^1.3.3: version "1.3.3" resolved "https://registry.yarnpkg.com/font-atlas-sdf/-/font-atlas-sdf-1.3.3.tgz#8323f136c69d73a235aa8c6ada640e58f180b8c0" dependencies: optical-properties "^1.0.0" tiny-sdf "^1.0.2" +font-atlas@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/font-atlas/-/font-atlas-2.1.0.tgz#aa2d6dcf656a6c871d66abbd3dfbea2f77178348" + dependencies: + css-font "^1.0.0" + font-awesome-sass@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/font-awesome-sass/-/font-awesome-sass-4.7.0.tgz#4eda693e915009ce00b228e0964dc5eca9bc34e1" @@ -4600,6 +4817,12 @@ font-awesome@4.7.x, font-awesome@^4.7.0: version "4.7.0" resolved "https://registry.yarnpkg.com/font-awesome/-/font-awesome-4.7.0.tgz#8fa8cf0411a1a31afd07b06d2902bb9fc815a133" +font-measure@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/font-measure/-/font-measure-1.2.2.tgz#41dbdac5d230dbf4db08865f54da28a475e83026" + dependencies: + css-font "^1.2.0" + for-each@~0.3.2: version "0.3.2" resolved "https://registry.yarnpkg.com/for-each/-/for-each-0.3.2.tgz#2c40450b9348e97f281322593ba96704b9abd4d4" @@ -4814,23 +5037,18 @@ generate-object-property@^1.1.0: dependencies: is-property "^1.0.0" -geojson-area@0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/geojson-area/-/geojson-area-0.1.0.tgz#d48d807082cfadf4a78df1349be50f38bf1894ae" - dependencies: - wgs84 "0.0.0" - -geojson-rewind@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/geojson-rewind/-/geojson-rewind-0.1.0.tgz#57022a054b196660d755354fe5d26684d90cd019" +geojson-rewind@^0.3.0: + version "0.3.1" + resolved "https://registry.yarnpkg.com/geojson-rewind/-/geojson-rewind-0.3.1.tgz#22240797c847cc2f0c1d313e4aa0c915afa7f29d" dependencies: - concat-stream "~1.2.1" - geojson-area "0.1.0" - minimist "0.0.5" + "@mapbox/geojson-area" "0.2.2" + concat-stream "~1.6.0" + minimist "1.2.0" + sharkdown "^0.1.0" -geojson-vt@^2.4.0: - version "2.4.0" - resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-2.4.0.tgz#3c1cf44493f35eb4d2c70c95da6550de66072c05" +geojson-vt@^3.1.0: + version "3.2.1" + resolved "https://registry.yarnpkg.com/geojson-vt/-/geojson-vt-3.2.1.tgz#f8adb614d2c1d3f6ee7c4265cad4bbf3ad60c8b7" get-caller-file@^1.0.1: version "1.0.2" @@ -4871,23 +5089,23 @@ github-username@^4.0.0: dependencies: gh-got "^6.0.0" -gl-axes3d@^1.2.5: - version "1.2.7" - resolved "https://registry.yarnpkg.com/gl-axes3d/-/gl-axes3d-1.2.7.tgz#c0e491c28993060662fab286deb45ae5b67c9442" +gl-axes3d@^1.4.4: + version "1.4.4" + resolved "https://registry.yarnpkg.com/gl-axes3d/-/gl-axes3d-1.4.4.tgz#741ac7c6875048c31372461e144435cc12c2dc7e" dependencies: - bit-twiddle "^1.0.0" + bit-twiddle "^1.0.2" dup "^1.0.0" extract-frustum-planes "^1.0.0" - gl-buffer "^2.0.3" - gl-mat4 "^1.0.1" - gl-shader "^4.0.4" + gl-buffer "^2.1.2" + gl-mat4 "^1.2.0" + gl-shader "^4.2.1" gl-state "^1.0.0" - gl-vao "^1.1.1" + gl-vao "^1.3.0" gl-vec4 "^1.0.1" - glslify "^6.1.0" + glslify "^7.0.0" robust-orientation "^1.1.3" split-polygon "^1.0.0" - vectorize-text "^3.0.0" + vectorize-text "^3.2.1" gl-buffer@^2.0.3, gl-buffer@^2.0.6, gl-buffer@^2.0.8, gl-buffer@^2.1.1, gl-buffer@^2.1.2: version "2.1.2" @@ -4897,43 +5115,45 @@ gl-buffer@^2.0.3, gl-buffer@^2.0.6, gl-buffer@^2.0.8, gl-buffer@^2.1.1, gl-buffe ndarray-ops "^1.1.0" typedarray-pool "^1.0.0" +gl-cone3d@^1.2.2: + version "1.2.2" + resolved "https://registry.yarnpkg.com/gl-cone3d/-/gl-cone3d-1.2.2.tgz#f0b2bbcf478924453e4c1310f07a3cde3b61c50b" + dependencies: + gl-shader "^4.2.1" + gl-vec3 "^1.1.3" + glsl-inverse "^1.0.0" + glsl-out-of-range "^1.0.4" + glslify "^7.0.0" + gl-constants@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gl-constants/-/gl-constants-1.0.0.tgz#597a504e364750ff50253aa35f8dea7af4a5d233" -gl-contour2d@^1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/gl-contour2d/-/gl-contour2d-1.1.4.tgz#0d4fc9b59de4ae3e045218d3f67c7a33f9c93428" +gl-contour2d@^1.1.5: + version "1.1.5" + resolved "https://registry.yarnpkg.com/gl-contour2d/-/gl-contour2d-1.1.5.tgz#77d02f04500d969fd7f61e29b00f01f211963a11" dependencies: binary-search-bounds "^2.0.0" cdt2d "^1.0.0" clean-pslg "^1.1.0" gl-buffer "^2.1.2" gl-shader "^4.0.5" - glslify "^6.1.0" + glslify "^7.0.0" iota-array "^1.0.0" ndarray "^1.0.18" surface-nets "^1.0.2" -gl-error2d@^1.2.1: - version "1.2.1" - resolved "https://registry.yarnpkg.com/gl-error2d/-/gl-error2d-1.2.1.tgz#cc6977f6476f205db3c4eac5b8c48899e48dfdd1" - dependencies: - gl-buffer "^2.1.2" - gl-shader "^4.0.5" - glslify "^2.3.1" - typedarray-pool "^1.1.0" - -gl-error3d@^1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/gl-error3d/-/gl-error3d-1.0.7.tgz#67d3e5a6c96e7873f42e5efafd8afabb99158872" +gl-error3d@^1.0.13: + version "1.0.13" + resolved "https://registry.yarnpkg.com/gl-error3d/-/gl-error3d-1.0.13.tgz#ba93c235b15d75dc3d92bdc9c2d60aa9efac6c05" dependencies: gl-buffer "^2.1.2" gl-shader "^4.2.1" gl-vao "^1.3.0" - glslify "^6.0.2" + glsl-out-of-range "^1.0.4" + glslify "^7.0.0" -gl-fbo@^2.0.3: +gl-fbo@^2.0.3, gl-fbo@^2.0.5: version "2.0.5" resolved "https://registry.yarnpkg.com/gl-fbo/-/gl-fbo-2.0.5.tgz#0fa75a497cf787695530691c8f04abb6fb55fa22" dependencies: @@ -4948,40 +5168,29 @@ gl-format-compiler-error@^1.0.2: glsl-shader-name "^1.0.0" sprintf-js "^1.0.3" -gl-heatmap2d@^1.0.3: - version "1.0.4" - resolved "https://registry.yarnpkg.com/gl-heatmap2d/-/gl-heatmap2d-1.0.4.tgz#0a11cc113dbb9744004f5d265e7d8c1935ebab15" +gl-heatmap2d@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/gl-heatmap2d/-/gl-heatmap2d-1.0.5.tgz#90364ea643fe48bd555ce84143df076344dbb398" dependencies: binary-search-bounds "^2.0.3" gl-buffer "^2.1.2" gl-shader "^4.0.5" - glslify "^6.1.0" + glslify "^7.0.0" iota-array "^1.0.0" typedarray-pool "^1.1.0" -gl-line2d@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/gl-line2d/-/gl-line2d-1.4.1.tgz#bf81794738f9a7637dcdde9668666a44c12a1110" - dependencies: - gl-buffer "^2.1.2" - gl-shader "^4.0.5" - gl-texture2d "^2.0.9" - glslify "^2.1.2" - ndarray "^1.0.18" - snap-points-2d "^1.0.1" - typedarray-pool "^1.1.0" - -gl-line3d@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/gl-line3d/-/gl-line3d-1.1.2.tgz#873b0d0588feb23b19bf0bb4f6c6beb4e39e0b8a" +gl-line3d@^1.1.10: + version "1.1.10" + resolved "https://registry.yarnpkg.com/gl-line3d/-/gl-line3d-1.1.10.tgz#fd77a831aa949de5159dbc1bcf5af0316781ea4f" dependencies: - binary-search-bounds "^1.0.0" + binary-search-bounds "^2.0.4" gl-buffer "^2.0.8" gl-shader "^4.2.1" gl-texture2d "^2.0.2" gl-vao "^1.1.3" + glsl-out-of-range "^1.0.4" glsl-read-float "^1.0.0" - glslify "^6.1.0" + glslify "^7.0.0" ndarray "^1.0.16" gl-mat2@^1.0.0: @@ -4996,6 +5205,10 @@ gl-mat4@^1.0.0, gl-mat4@^1.0.1, gl-mat4@^1.0.2, gl-mat4@^1.0.3, gl-mat4@^1.1.2: version "1.1.4" resolved "https://registry.yarnpkg.com/gl-mat4/-/gl-mat4-1.1.4.tgz#1e895b55892e56a896867abd837d38f37a178086" +gl-mat4@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/gl-mat4/-/gl-mat4-1.2.0.tgz#49d8a7636b70aa00819216635f4a3fd3f4669b26" + gl-matrix-invert@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/gl-matrix-invert/-/gl-matrix-invert-1.0.0.tgz#a36d7bde3654c4590a127ee7c68f6e13fea8c63d" @@ -5004,13 +5217,9 @@ gl-matrix-invert@^1.0.0: gl-mat3 "^1.0.0" gl-mat4 "^1.0.0" -gl-matrix@^2.3.1: - version "2.4.0" - resolved "https://registry.yarnpkg.com/gl-matrix/-/gl-matrix-2.4.0.tgz#2089b13301a29eec822d9d99dffc1f78ee9a3c50" - -gl-mesh3d@^1.3.0: - version "1.3.2" - resolved "https://registry.yarnpkg.com/gl-mesh3d/-/gl-mesh3d-1.3.2.tgz#1436104ad86a82c3d25f030ec0cf682db41ebdc2" +gl-mesh3d@^2.0.7: + version "2.0.7" + resolved "https://registry.yarnpkg.com/gl-mesh3d/-/gl-mesh3d-2.0.7.tgz#db8faddd0197af04990d722a2bbe64e88118c543" dependencies: barycentric "^1.0.1" colormap "^2.1.0" @@ -5019,50 +5228,51 @@ gl-mesh3d@^1.3.0: gl-shader "^4.2.1" gl-texture2d "^2.0.8" gl-vao "^1.1.3" + glsl-out-of-range "^1.0.4" glsl-specular-cook-torrance "^2.0.1" - glslify "^6.1.0" + glslify "^7.0.0" ndarray "^1.0.15" normals "^1.0.1" polytope-closest-point "^1.0.0" simplicial-complex-contour "^1.0.0" typedarray-pool "^1.1.0" -gl-plot2d@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/gl-plot2d/-/gl-plot2d-1.3.1.tgz#93a09daaeabdb24127a38309ff4a2ca67191f48d" +gl-plot2d@^1.4.2: + version "1.4.2" + resolved "https://registry.yarnpkg.com/gl-plot2d/-/gl-plot2d-1.4.2.tgz#9da4ec97c489d6885deb835842da7888c1a2dff9" dependencies: - binary-search-bounds "^2.0.3" + binary-search-bounds "^2.0.4" gl-buffer "^2.1.2" - gl-select-static "^2.0.2" + gl-select-static "^2.0.4" gl-shader "^4.2.1" glsl-inverse "^1.0.0" - glslify "^6.1.0" - text-cache "^4.1.0" + glslify "^7.0.0" + text-cache "^4.2.1" -gl-plot3d@^1.5.4: - version "1.5.5" - resolved "https://registry.yarnpkg.com/gl-plot3d/-/gl-plot3d-1.5.5.tgz#a797bf4b9de0724181da73398b5332b67c731883" - dependencies: - "3d-view-controls" "^2.2.0" - a-big-triangle "^1.0.0" - gl-axes3d "^1.2.5" - gl-fbo "^2.0.3" - gl-mat4 "^1.1.2" - gl-select-static "^2.0.2" +gl-plot3d@^1.6.3: + version "1.6.3" + resolved "https://registry.yarnpkg.com/gl-plot3d/-/gl-plot3d-1.6.3.tgz#17e1420fa6da178d447f9ef5a82be34b86cb60d7" + dependencies: + "3d-view-controls" "^2.2.2" + a-big-triangle "^1.0.3" + gl-axes3d "^1.4.4" + gl-fbo "^2.0.5" + gl-mat4 "^1.2.0" + gl-select-static "^2.0.4" gl-shader "^4.2.1" - gl-spikes3d "^1.0.3" - glslify "^6.1.0" - is-mobile "^0.2.2" - mouse-change "^1.1.1" - ndarray "^1.0.16" + gl-spikes3d "^1.0.8" + glslify "^7.0.0" + is-mobile "^2.0.0" + mouse-change "^1.4.0" + ndarray "^1.0.18" -gl-pointcloud2d@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gl-pointcloud2d/-/gl-pointcloud2d-1.0.1.tgz#c87e55164346787af9e8a44459054ae52091546f" +gl-pointcloud2d@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/gl-pointcloud2d/-/gl-pointcloud2d-1.0.2.tgz#4cd692bf5a021759bdea5878e94a0f9683a8a431" dependencies: gl-buffer "^2.1.2" gl-shader "^4.2.1" - glslify "^6.1.0" + glslify "^7.0.0" typedarray-pool "^1.1.0" gl-quat@^1.0.0: @@ -5073,57 +5283,31 @@ gl-quat@^1.0.0: gl-vec3 "^1.0.3" gl-vec4 "^1.0.0" -gl-scatter2d-sdf@^1.3.11: - version "1.3.11" - resolved "https://registry.yarnpkg.com/gl-scatter2d-sdf/-/gl-scatter2d-sdf-1.3.11.tgz#aa760905d3cb3c42f4a98a78f830cb3b52bda0f4" - dependencies: - binary-search-bounds "^2.0.3" - clamp "^1.0.1" - color-id "^1.1.0" - font-atlas-sdf "^1.3.2" - gl-buffer "^2.1.2" - gl-shader "^4.2.1" - gl-texture2d "^2.1.0" - glslify "^2.3.1" - snap-points-2d "^3.1.0" - typedarray-pool "^1.1.0" - -gl-scatter2d@^1.3.2: - version "1.3.2" - resolved "https://registry.yarnpkg.com/gl-scatter2d/-/gl-scatter2d-1.3.2.tgz#27f12ffa7b4303f4215f2209a573d728f1804371" - dependencies: - array-bounds "^1.0.0" - array-normalize "^1.1.2" - binary-search-bounds "^2.0.3" - gl-buffer "^2.1.2" - gl-shader "^4.0.4" - glslify "^2.1.2" - snap-points-2d "^3.0.0" - typedarray-pool "^1.1.0" - -gl-scatter3d@^1.0.4: - version "1.0.11" - resolved "https://registry.yarnpkg.com/gl-scatter3d/-/gl-scatter3d-1.0.11.tgz#ac1e1d043381961558d414629ac9cb42c146e4c4" +gl-scatter3d@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/gl-scatter3d/-/gl-scatter3d-1.1.6.tgz#6b9440b60de754cab06b583789bd1ee6d72e99f2" dependencies: gl-buffer "^2.0.6" gl-mat4 "^1.0.0" gl-shader "^4.2.0" gl-vao "^1.1.2" - glslify "^6.1.0" + glsl-out-of-range "^1.0.4" + glslify "^7.0.0" + is-string-blank "^1.0.1" typedarray-pool "^1.0.2" - vectorize-text "^3.0.0" + vectorize-text "^3.2.1" -gl-select-box@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/gl-select-box/-/gl-select-box-1.0.2.tgz#0c712387eda7a49e8a0934f32a427a3c8ea6dfdb" +gl-select-box@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/gl-select-box/-/gl-select-box-1.0.3.tgz#8c47ac6f18fa583aa32d9dfe023ac1d588fd9d67" dependencies: gl-buffer "^2.1.2" gl-shader "^4.0.5" - glslify "^6.1.0" + glslify "^7.0.0" -gl-select-static@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/gl-select-static/-/gl-select-static-2.0.2.tgz#f3e1901df03181d532e795853230679d4af57ee9" +gl-select-static@^2.0.4: + version "2.0.4" + resolved "https://registry.yarnpkg.com/gl-select-static/-/gl-select-static-2.0.4.tgz#c6a12ca956f898bf2f8b9eece57c89bdc1bce6a4" dependencies: bit-twiddle "^1.0.2" cwise "^1.0.3" @@ -5131,32 +5315,32 @@ gl-select-static@^2.0.2: ndarray "^1.0.15" typedarray-pool "^1.1.0" -gl-shader@4.2.0, gl-shader@^4.0.5: +gl-shader@^4.0.5: version "4.2.0" resolved "https://registry.yarnpkg.com/gl-shader/-/gl-shader-4.2.0.tgz#28f77813effa0dd5cda9dab1f301d1b1cda3e87e" dependencies: gl-format-compiler-error "^1.0.2" weakmap-shim "^1.1.0" -gl-shader@^4.0.4, gl-shader@^4.2.0, gl-shader@^4.2.1: +gl-shader@^4.2.0, gl-shader@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/gl-shader/-/gl-shader-4.2.1.tgz#bc9b808e9293c51b668e88de615b0c113708dc2f" dependencies: gl-format-compiler-error "^1.0.2" weakmap-shim "^1.1.0" -gl-spikes2d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/gl-spikes2d/-/gl-spikes2d-1.0.1.tgz#cacdb2d3dbcd202b853452e8500a8b077949cc03" +gl-spikes2d@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/gl-spikes2d/-/gl-spikes2d-1.0.2.tgz#ef8dbcff6c7451dec2b751d7a3c593d09ad5457f" -gl-spikes3d@^1.0.3: - version "1.0.6" - resolved "https://registry.yarnpkg.com/gl-spikes3d/-/gl-spikes3d-1.0.6.tgz#6cf748730fb6759d566a6b6c1e32c2fd17f62ef0" +gl-spikes3d@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/gl-spikes3d/-/gl-spikes3d-1.0.8.tgz#4a7ce6659a5404a444d51071d17acbeacf927445" dependencies: gl-buffer "^2.1.2" - gl-shader "^4.0.4" - gl-vao "^1.2.1" - glslify "^6.1.0" + gl-shader "^4.2.1" + gl-vao "^1.3.0" + glslify "^7.0.0" gl-state@^1.0.0: version "1.0.0" @@ -5164,11 +5348,20 @@ gl-state@^1.0.0: dependencies: uniq "^1.0.0" -gl-surface3d@^1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/gl-surface3d/-/gl-surface3d-1.3.4.tgz#778f3d8f7598589997e17300d71d1da4eaf93529" +gl-streamtube3d@^1.1.2: + version "1.1.2" + resolved "https://registry.yarnpkg.com/gl-streamtube3d/-/gl-streamtube3d-1.1.2.tgz#f47562f48a56339624d31430155d45a897a1bd0a" dependencies: - binary-search-bounds "^1.0.0" + gl-vec3 "^1.0.0" + glsl-inverse "^1.0.0" + glsl-out-of-range "^1.0.4" + glslify "^7.0.0" + +gl-surface3d@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/gl-surface3d/-/gl-surface3d-1.4.1.tgz#cdb4e661b3c6a5ccecacc00e0a0185ff6863aaf4" + dependencies: + binary-search-bounds "^2.0.4" bit-twiddle "^1.0.2" colormap "^2.1.0" dup "^1.0.0" @@ -5177,8 +5370,9 @@ gl-surface3d@^1.3.0: gl-shader "^4.2.0" gl-texture2d "^2.0.0" gl-vao "^1.1.1" + glsl-out-of-range "^1.0.4" glsl-specular-beckmann "^1.1.2" - glslify "^6.1.0" + glslify "^7.0.0" ndarray "^1.0.16" ndarray-gradient "^1.0.0" ndarray-ops "^1.2.1" @@ -5187,7 +5381,29 @@ gl-surface3d@^1.3.0: surface-nets "^1.0.2" typedarray-pool "^1.0.0" -gl-texture2d@^2.0.0, gl-texture2d@^2.0.2, gl-texture2d@^2.0.8, gl-texture2d@^2.0.9, gl-texture2d@^2.1.0: +gl-text@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/gl-text/-/gl-text-1.1.6.tgz#1c9aa1e8dbbb9b63067b23a1359bc56ad63922ab" + dependencies: + bit-twiddle "^1.0.2" + color-normalize "^1.1.0" + css-font "^1.2.0" + detect-kerning "^2.1.2" + es6-weak-map "^2.0.2" + flatten-vertex-data "^1.0.2" + font-atlas "^2.1.0" + font-measure "^1.2.2" + gl-util "^3.0.7" + is-plain-obj "^1.1.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + parse-unit "^1.0.1" + pick-by-alias "^1.2.0" + regl "^1.3.6" + to-px "^1.0.1" + typedarray-pool "^1.1.0" + +gl-texture2d@^2.0.0, gl-texture2d@^2.0.2, gl-texture2d@^2.0.8: version "2.1.0" resolved "https://registry.yarnpkg.com/gl-texture2d/-/gl-texture2d-2.1.0.tgz#ff6824e7e7c31a8ba6fdcdbe9e5c695d7e2187c7" dependencies: @@ -5195,10 +5411,26 @@ gl-texture2d@^2.0.0, gl-texture2d@^2.0.2, gl-texture2d@^2.0.8, gl-texture2d@^2.0 ndarray-ops "^1.2.2" typedarray-pool "^1.1.0" -gl-vao@^1.1.1, gl-vao@^1.1.2, gl-vao@^1.1.3, gl-vao@^1.2.0, gl-vao@^1.2.1, gl-vao@^1.3.0: +gl-util@^3.0.7: + version "3.1.1" + resolved "https://registry.yarnpkg.com/gl-util/-/gl-util-3.1.1.tgz#998d009d42e7bb85bac25e709d6f90cea0a24eb7" + dependencies: + is-browser "^2.0.1" + is-firefox "^1.0.3" + is-plain-obj "^1.1.0" + number-is-integer "^1.0.1" + object-assign "^4.1.0" + pick-by-alias "^1.2.0" + weak-map "^1.0.5" + +gl-vao@^1.1.1, gl-vao@^1.1.2, gl-vao@^1.1.3, gl-vao@^1.2.0, gl-vao@^1.3.0: version "1.3.0" resolved "https://registry.yarnpkg.com/gl-vao/-/gl-vao-1.3.0.tgz#e9e92aa95588cab9d5c2f04b693440c3df691923" +gl-vec3@^1.0.0, gl-vec3@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/gl-vec3/-/gl-vec3-1.1.3.tgz#a47c62f918774a06cbed1b65bcd0288ecbb03826" + gl-vec3@^1.0.2, gl-vec3@^1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/gl-vec3/-/gl-vec3-1.0.3.tgz#110fd897d0729f6398307381567d0944941bf22b" @@ -5328,6 +5560,10 @@ glsl-inverse@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/glsl-inverse/-/glsl-inverse-1.0.0.tgz#12c0b1d065f558444d1e6feaf79b5ddf8a918ae6" +glsl-out-of-range@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/glsl-out-of-range/-/glsl-out-of-range-1.0.4.tgz#3d73d083bc9ecc73efd45dfc7063c29e92c9c873" + glsl-read-float@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/glsl-read-float/-/glsl-read-float-1.1.0.tgz#dfb088b0162dcfcc56fc4eddd2f86e18cac32f26" @@ -5451,7 +5687,7 @@ glslify-loader@1.x: dependencies: glslify "^2.1.1" -glslify@^2.1.1, glslify@^2.1.2, glslify@^2.3.1: +glslify@^2.1.1: version "2.3.1" resolved "https://registry.yarnpkg.com/glslify/-/glslify-2.3.1.tgz#47a8ce5bf08609556aa7ec76c6a7d3430776dd46" dependencies: @@ -5465,14 +5701,14 @@ glslify@^2.1.1, glslify@^2.1.2, glslify@^2.3.1: through2 "^0.6.3" xtend "^4.0.0" -glslify@^6.0.2, glslify@^6.1.0: - version "6.1.1" - resolved "https://registry.yarnpkg.com/glslify/-/glslify-6.1.1.tgz#f5ee3e79f314bbdb8ededb7a27830db3f2df7e40" +glslify@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/glslify/-/glslify-7.0.0.tgz#10d5db9541ee07c6548ea55c679edda20307653d" dependencies: bl "^1.0.0" concat-stream "^1.5.2" duplexify "^3.4.5" - falafel "^2.0.0" + falafel "^2.1.0" from2 "^2.3.0" glsl-resolve "0.0.1" glsl-token-whitespace-trim "^1.0.0" @@ -5482,7 +5718,6 @@ glslify@^6.0.2, glslify@^6.1.0: resolve "^1.1.5" stack-trace "0.0.9" static-eval "^2.0.0" - tape "^4.6.0" through2 "^2.0.1" xtend "^4.0.0" @@ -5535,6 +5770,15 @@ graceful-fs@^4.1.11, graceful-fs@^4.1.2, graceful-fs@^4.1.6: version "4.1.11" resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" +gray-matter@^3.0.8: + version "3.1.1" + resolved "https://registry.yarnpkg.com/gray-matter/-/gray-matter-3.1.1.tgz#101f80d9e69eeca6765cdce437705b18f40876ac" + dependencies: + extend-shallow "^2.0.1" + js-yaml "^3.10.0" + kind-of "^5.0.2" + strip-bom-string "^1.0.0" + grid-index@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/grid-index/-/grid-index-1.0.0.tgz#ad2c5d54ce5b35437faff1d70a9aeb3d1d261110" @@ -5626,6 +5870,12 @@ has-flag@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz#b5d454dc2199ae225699f3467e5a07f3b955bafd" +has-hover@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/has-hover/-/has-hover-1.0.1.tgz#3d97437aeb199c62b8ac08acbdc53d3bc52c17f7" + dependencies: + is-browser "^2.0.1" + has-passive-events@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/has-passive-events/-/has-passive-events-1.0.0.tgz#75fc3dc6dada182c58f24ebbdc018276d1ea3515" @@ -5941,6 +6191,14 @@ ignore@^3.3.3: version "3.3.7" resolved "https://registry.yarnpkg.com/ignore/-/ignore-3.3.7.tgz#612289bfb3c220e186a58118618d5be8c1bab021" +image-palette@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/image-palette/-/image-palette-2.1.0.tgz#d976525a1df75964ca125d2dba2741e92905547f" + dependencies: + color-id "^1.1.0" + pxls "^2.0.0" + quantize "^1.0.2" + immediate@~3.0.5: version "3.0.6" resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.0.6.tgz#9db1dbd0faf8de6fbe0f5dd5e56bb606280de69b" @@ -6101,12 +6359,20 @@ is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" +is-base64@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/is-base64/-/is-base64-0.1.0.tgz#a6f20610c6ef4863a51cba32bc0222544b932622" + is-binary-path@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" dependencies: binary-extensions "^1.0.0" +is-blob@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/is-blob/-/is-blob-2.0.1.tgz#7fde57ef8782a154bc0f3bdcaa0ffdccb6c33767" + is-boolean-object@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-boolean-object/-/is-boolean-object-1.0.0.tgz#98f8b28030684219a95f375cfbd88ce3405dff93" @@ -6115,10 +6381,18 @@ is-browser@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/is-browser/-/is-browser-2.0.1.tgz#8bf0baf799a9c62fd9de5bcee4cf3397c3e7529a" +is-browser@^2.1.0: + version "2.1.0" + resolved "https://registry.yarnpkg.com/is-browser/-/is-browser-2.1.0.tgz#fc084d59a5fced307d6708c59356bad7007371a9" + is-buffer@^1.0.2, is-buffer@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz#efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be" +is-buffer@^2.0.3: + version "2.0.3" + resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-2.0.3.tgz#4ecf3fcf749cbd1e472689e109ac66261a25e725" + is-builtin-module@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" @@ -6199,12 +6473,20 @@ is-extglob@^2.1.0, is-extglob@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" -is-finite@^1.0.0: +is-finite@^1.0.0, is-finite@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" dependencies: number-is-nan "^1.0.0" +is-firefox@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/is-firefox/-/is-firefox-1.0.3.tgz#2a2a1567783a417f6e158323108f3861b0918562" + +is-float-array@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-float-array/-/is-float-array-1.0.0.tgz#96d67b1cbadf47ab1e05be208933acd386978a09" + is-fullwidth-code-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" @@ -6237,9 +6519,13 @@ is-glob@^4.0.0: dependencies: is-extglob "^2.1.1" -is-mobile@^0.2.2: - version "0.2.2" - resolved "https://registry.yarnpkg.com/is-mobile/-/is-mobile-0.2.2.tgz#0e2e006d99ed2c2155b761df80f2a3619ae2ad9f" +is-iexplorer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/is-iexplorer/-/is-iexplorer-1.0.0.tgz#1d72bc66d3fe22eaf6170dda8cf10943248cfc76" + +is-mobile@^2.0.0: + version "2.0.0" + resolved "https://registry.yarnpkg.com/is-mobile/-/is-mobile-2.0.0.tgz#4d0140e91bb4e26d7e0402ead2f8a79d1551b9d5" is-my-ip-valid@^1.0.0: version "1.0.0" @@ -6275,6 +6561,10 @@ is-number@^4.0.0: version "4.0.0" resolved "https://registry.yarnpkg.com/is-number/-/is-number-4.0.0.tgz#0026e37f5454d73e356dfe6564699867c6a7f0ff" +is-obj@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" + is-object@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/is-object/-/is-object-1.0.1.tgz#8952688c5ec2ffd6b03ecc85e769e02903083470" @@ -6357,6 +6647,10 @@ is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" +is-string-blank@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/is-string-blank/-/is-string-blank-1.0.1.tgz#866dca066d41d2894ebdfd2d8fe93e586e583a03" + is-string@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/is-string/-/is-string-1.0.4.tgz#cc3a9b69857d621e963725a24caeec873b826e64" @@ -6365,6 +6659,10 @@ is-subset@^0.1.1: version "0.1.1" resolved "https://registry.yarnpkg.com/is-subset/-/is-subset-0.1.1.tgz#8a59117d932de1de00f245fcdd39ce43f1e939a6" +is-svg-path@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/is-svg-path/-/is-svg-path-1.0.2.tgz#77ab590c12b3d20348e5c7a13d0040c87784dda0" + is-svg@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/is-svg/-/is-svg-2.1.0.tgz#cf61090da0d9efbcab8722deba6f032208dbb0e9" @@ -6823,6 +7121,13 @@ js-yaml@3.x, js-yaml@^3.7.0, js-yaml@^3.9.1: argparse "^1.0.7" esprima "^4.0.0" +js-yaml@^3.10.0: + version "3.12.1" + resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.1.tgz#295c8632a18a23e054cf5c9d3cecafe678167600" + dependencies: + argparse "^1.0.7" + esprima "^4.0.0" + js-yaml@^3.9.0: version "3.12.0" resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.12.0.tgz#eaed656ec8344f10f527c6bfa1b6e2244de167d1" @@ -6992,13 +7297,6 @@ jsonify@~0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" -jsonlint-lines-primitives@~1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/jsonlint-lines-primitives/-/jsonlint-lines-primitives-1.6.0.tgz#bb89f60c8b9b612fd913ddaa236649b840d86611" - dependencies: - JSV ">= 4.0.x" - nomnom ">= 1.5.x" - jsonpointer@^4.0.0: version "4.0.1" resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" @@ -7058,7 +7356,7 @@ kind-of@^4.0.0: dependencies: is-buffer "^1.1.5" -kind-of@^5.0.0: +kind-of@^5.0.0, kind-of@^5.0.2: version "5.1.0" resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz#729c91e2d857b7a419a1f9aa65685c4c33f5845d" @@ -7224,14 +7522,6 @@ lodash._basecopy@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" -lodash._baseisequal@^3.0.0: - version "3.0.7" - resolved "https://registry.yarnpkg.com/lodash._baseisequal/-/lodash._baseisequal-3.0.7.tgz#d8025f76339d29342767dcc887ce5cb95a5b51f1" - dependencies: - lodash.isarray "^3.0.0" - lodash.istypedarray "^3.0.0" - lodash.keys "^3.0.0" - lodash._bindcallback@^3.0.0: version "3.0.1" resolved "https://registry.yarnpkg.com/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz#e531c27644cf8b57a99e17ed95b35c748789392e" @@ -7301,14 +7591,7 @@ lodash.isarguments@^3.0.0: lodash.isarray@^3.0.0: version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - -lodash.isequal@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-3.0.4.tgz#1c35eb3b6ef0cd1ff51743e3ea3cf7fdffdacb64" - dependencies: - lodash._baseisequal "^3.0.0" - lodash._bindcallback "^3.0.0" + resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" lodash.isfunction@^3.0.8: version "3.0.9" @@ -7322,10 +7605,6 @@ lodash.isstring@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/lodash.isstring/-/lodash.isstring-4.0.1.tgz#d527dfb5456eca7cc9bb95d5daeaf88ba54a5451" -lodash.istypedarray@^3.0.0: - version "3.0.6" - resolved "https://registry.yarnpkg.com/lodash.istypedarray/-/lodash.istypedarray-3.0.6.tgz#c9a477498607501d8e8494d283b87c39281cef62" - lodash.keys@^3.0.0: version "3.1.2" resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" @@ -7468,6 +7747,12 @@ magic-string@^0.22.4: dependencies: vlq "^0.2.2" +magic-string@^0.25.1: + version "0.25.1" + resolved "https://registry.yarnpkg.com/magic-string/-/magic-string-0.25.1.tgz#b1c248b399cd7485da0fe7385c2fc7011843266e" + dependencies: + sourcemap-codec "^1.4.1" + make-dir@^1.0.0: version "1.3.0" resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c" @@ -7514,60 +7799,36 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" -mapbox-gl-function@^1.2.1: - version "1.3.0" - resolved "https://registry.yarnpkg.com/mapbox-gl-function/-/mapbox-gl-function-1.3.0.tgz#cee3d95750c189d45e83ab41a0a57fc2a8a509bc" - -mapbox-gl-shaders@mapbox/mapbox-gl-shaders#de2ab007455aa2587c552694c68583f94c9f2747: - version "1.0.0" - resolved "https://codeload.github.com/mapbox/mapbox-gl-shaders/tar.gz/de2ab007455aa2587c552694c68583f94c9f2747" - dependencies: - brfs "^1.4.0" - -mapbox-gl-style-spec@mapbox/mapbox-gl-style-spec#83b1a3e5837d785af582efd5ed1a212f2df6a4ae: - version "8.8.0" - resolved "https://codeload.github.com/mapbox/mapbox-gl-style-spec/tar.gz/83b1a3e5837d785af582efd5ed1a212f2df6a4ae" - dependencies: +mapbox-gl@0.45.0: + version "0.45.0" + resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-0.45.0.tgz#af71cc824f0d7e51ccd5c505eaae411bc0910ccd" + dependencies: + "@mapbox/gl-matrix" "^0.0.1" + "@mapbox/jsonlint-lines-primitives" "^2.0.1" + "@mapbox/mapbox-gl-supported" "^1.3.1" + "@mapbox/point-geometry" "^0.1.0" + "@mapbox/shelf-pack" "^3.1.0" + "@mapbox/tiny-sdf" "^1.1.0" + "@mapbox/unitbezier" "^0.0.0" + "@mapbox/vector-tile" "^1.3.1" + "@mapbox/whoots-js" "^3.0.0" + brfs "^1.4.4" csscolorparser "~1.0.2" - jsonlint-lines-primitives "~1.6.0" - lodash.isequal "^3.0.4" - minimist "0.0.8" - rw "^0.1.4" - sort-object "^0.3.2" - -mapbox-gl-supported@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mapbox-gl-supported/-/mapbox-gl-supported-1.2.0.tgz#cbd34df894206cadda9a33c8d9a4609f26bb1989" - -mapbox-gl@^0.22.0: - version "0.22.1" - resolved "https://registry.yarnpkg.com/mapbox-gl/-/mapbox-gl-0.22.1.tgz#92a965547d4c2f24c22cbc487eeda48694cb627a" - dependencies: - csscolorparser "^1.0.2" - earcut "^2.0.3" - feature-filter "^2.2.0" - geojson-rewind "^0.1.0" - geojson-vt "^2.4.0" - gl-matrix "^2.3.1" + earcut "^2.1.3" + geojson-rewind "^0.3.0" + geojson-vt "^3.1.0" + gray-matter "^3.0.8" grid-index "^1.0.0" - mapbox-gl-function "^1.2.1" - mapbox-gl-shaders mapbox/mapbox-gl-shaders#de2ab007455aa2587c552694c68583f94c9f2747 - mapbox-gl-style-spec mapbox/mapbox-gl-style-spec#83b1a3e5837d785af582efd5ed1a212f2df6a4ae - mapbox-gl-supported "^1.2.0" - pbf "^1.3.2" - pngjs "^2.2.0" - point-geometry "^0.0.0" + minimist "0.0.8" + pbf "^3.0.5" quickselect "^1.0.0" - request "^2.39.0" - resolve-url "^0.2.1" - shelf-pack "^1.0.0" - supercluster "^2.0.1" - unassertify "^2.0.0" - unitbezier "^0.0.0" - vector-tile "^1.3.0" - vt-pbf "^2.0.2" - webworkify "^1.3.0" - whoots-js "^2.0.0" + rw "^1.3.3" + shuffle-seed "^1.1.6" + sort-object "^0.3.2" + supercluster "^2.3.0" + through2 "^2.0.3" + tinyqueue "^1.1.0" + vt-pbf "^3.0.1" marching-simplex-table@^1.0.0: version "1.0.0" @@ -7602,6 +7863,10 @@ math-expression-evaluator@^1.2.14: version "1.2.17" resolved "https://registry.yarnpkg.com/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz#de819fdbcd84dccd8fae59c6aeb79615b9d266ac" +math-log2@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/math-log2/-/math-log2-1.0.1.tgz#fb8941be5f5ebe8979e718e6273b178e58694565" + matrix-camera-controller@^2.1.1, matrix-camera-controller@^2.1.3: version "2.1.3" resolved "https://registry.yarnpkg.com/matrix-camera-controller/-/matrix-camera-controller-2.1.3.tgz#35e5260cc1cd550962ba799f2d8d4e94b1a39370" @@ -7795,14 +8060,14 @@ minimist@0.0.8, minimist@~0.0.1: version "0.0.8" resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" +minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" + minimist@^0.1.0: version "0.1.0" resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.1.0.tgz#99df657a52574c21c9057497df742790b2b4c0de" -minimist@^1.1.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0, minimist@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - minimist@~0.0.8: version "0.0.10" resolved "http://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz#de3f98543dbf96082be48ad1a0c7cda836301dcf" @@ -7912,12 +8177,6 @@ ms@^2.1.1: version "2.1.1" resolved "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz#30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a" -multi-stage-sourcemap@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/multi-stage-sourcemap/-/multi-stage-sourcemap-0.2.1.tgz#b09fc8586eaa17f81d575c4ad02e0f7a3f6b1105" - dependencies: - source-map "^0.1.34" - multimatch@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" @@ -8075,6 +8334,10 @@ neo-async@^2.5.0: version "2.5.1" resolved "https://registry.yarnpkg.com/neo-async/-/neo-async-2.5.1.tgz#acb909e327b1e87ec9ef15f41b8a269512ad41ee" +next-tick@1: + version "1.0.0" + resolved "https://registry.yarnpkg.com/next-tick/-/next-tick-1.0.0.tgz#ca86d1fe8828169b0120208e3dc8424b9db8342c" + nextafter@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/nextafter/-/nextafter-1.0.0.tgz#b7d77b535310e3e097e6025abb0a903477ec1a3a" @@ -8216,7 +8479,7 @@ node-sass@4.8.x: stdout-stream "^1.4.0" "true-case-path" "^1.0.2" -"nomnom@>= 1.5.x", nomnom@^1.8.1: +nomnom@^1.8.1: version "1.8.1" resolved "https://registry.yarnpkg.com/nomnom/-/nomnom-1.8.1.tgz#2151f722472ba79e50a76fc125bb8c8f2e4dc2a7" dependencies: @@ -8268,6 +8531,16 @@ normalize-range@^0.1.2: version "0.1.2" resolved "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz#2d10c06bdfd312ea9777695a4d28439456b75942" +normalize-svg-path@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-1.0.1.tgz#6f729ad6b70bb4ca4eff2fe4b107489efe1d56fe" + dependencies: + svg-arc-to-cubic-bezier "^3.0.0" + +normalize-svg-path@~0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/normalize-svg-path/-/normalize-svg-path-0.1.0.tgz#456360e60ece75fbef7b5d7e160480e7ffd16fe5" + normalize-url@2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/normalize-url/-/normalize-url-2.0.1.tgz#835a9da1551fa26f70e92329069a23aa6574d7e6" @@ -8325,6 +8598,12 @@ num2fraction@^1.2.2: version "1.2.2" resolved "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz#6f682b6a027a4e9ddfa4564cd2589d1d4e669ede" +number-is-integer@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/number-is-integer/-/number-is-integer-1.0.1.tgz#e59bca172ffed27318e79c7ceb6cb72c095b2152" + dependencies: + is-finite "^1.0.1" + number-is-nan@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" @@ -8377,7 +8656,7 @@ object-is@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/object-is/-/object-is-1.0.1.tgz#0aa60ec9989a0b3ed795cf4d06f62cf1ad6539b6" -object-keys@^1.0.11, object-keys@^1.0.12: +object-keys@^1.0.11, object-keys@^1.0.12, object-keys@^1.0.9: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" @@ -8524,7 +8803,7 @@ os-browserify@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz#854373c7f5c2315914fc9bfc6bd8238fdda1ec27" -os-homedir@^1.0.0: +os-homedir@^1.0.0, os-homedir@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" @@ -8639,6 +8918,10 @@ param-case@2.1.x: dependencies: no-case "^2.2.0" +parenthesis@^3.1.5: + version "3.1.5" + resolved "https://registry.yarnpkg.com/parenthesis/-/parenthesis-3.1.5.tgz#077d0738bb6f65d951b9f9b7c438f2aabe965c6e" + parse-asn1@^5.0.0: version "5.1.1" resolved "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.1.tgz#f6bf293818332bd0dab54efb16087724745e6ca8" @@ -8675,6 +8958,16 @@ parse-passwd@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/parse-passwd/-/parse-passwd-1.0.0.tgz#6d5b934a456993b23d37f40a382d6f1666a8e5c6" +parse-rect@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/parse-rect/-/parse-rect-1.2.0.tgz#e0a5b0dbaaaee637a0a1eb9779969e19399d8dec" + dependencies: + pick-by-alias "^1.2.0" + +parse-svg-path@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/parse-svg-path/-/parse-svg-path-0.1.2.tgz#7a7ec0d1eb06fa5325c7d3e009b859a09b5d49eb" + parse-unit@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/parse-unit/-/parse-unit-1.0.1.tgz#7e1bb6d5bef3874c28e392526a2541170291eecf" @@ -8900,9 +9193,9 @@ patternfly@^3.59.0: patternfly-bootstrap-combobox "~1.1.7" patternfly-bootstrap-treeview "~2.1.0" -pbf@^1.3.2: - version "1.3.7" - resolved "https://registry.yarnpkg.com/pbf/-/pbf-1.3.7.tgz#1e3d047ba3cbe8086ae854a25503ab4537d4335d" +pbf@^3.0.5: + version "3.1.0" + resolved "https://registry.yarnpkg.com/pbf/-/pbf-3.1.0.tgz#f70004badcb281761eabb1e76c92f179f08189e9" dependencies: ieee754 "^1.1.6" resolve-protobuf-schema "^2.0.0" @@ -8942,6 +9235,10 @@ permutation-rank@^1.0.0: invert-permutation "^1.0.0" typedarray-pool "^1.0.0" +pick-by-alias@^1.1.0, pick-by-alias@^1.1.1, pick-by-alias@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/pick-by-alias/-/pick-by-alias-1.2.0.tgz#5f7cb2b1f21a6e1e884a0c87855aa4a37361107b" + pify@^2.0.0, pify@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" @@ -8991,41 +9288,44 @@ planar-graph-to-polyline@^1.0.0: two-product "^1.0.0" uniq "^1.0.0" -plotly.js@1.28.x: - version "1.28.3" - resolved "https://registry.yarnpkg.com/plotly.js/-/plotly.js-1.28.3.tgz#79241d119882e07ee97bf62afe7cc312b5108663" +plotly.js@1.44.4: + version "1.44.4" + resolved "https://registry.yarnpkg.com/plotly.js/-/plotly.js-1.44.4.tgz#dcf6ffb27f7586e1e19f0c601fd4f4364a47aba0" dependencies: "3d-view" "^2.0.0" - "@plotly/d3-sankey" "^0.5.0" + "@plotly/d3-sankey" "^0.5.1" alpha-shape "^1.0.0" - color-rgba "^1.1.0" + array-range "^1.0.1" + canvas-fit "^1.5.0" + color-normalize "^1.3.0" convex-hull "^1.0.3" country-regex "^1.1.0" d3 "^3.5.12" d3-force "^1.0.6" delaunay-triangulate "^1.1.6" es6-promise "^3.0.2" - fast-isnumeric "^1.1.1" + fast-isnumeric "^1.1.2" font-atlas-sdf "^1.3.3" - gl-contour2d "^1.1.2" - gl-error2d "^1.2.1" - gl-error3d "^1.0.6" - gl-heatmap2d "^1.0.3" - gl-line2d "^1.4.1" - gl-line3d "^1.1.0" - gl-mat4 "^1.1.2" - gl-mesh3d "^1.3.0" - gl-plot2d "^1.2.0" - gl-plot3d "^1.5.4" - gl-pointcloud2d "^1.0.0" - gl-scatter2d "^1.3.2" - gl-scatter2d-sdf "^1.3.11" - gl-scatter3d "^1.0.4" - gl-select-box "^1.0.1" - gl-shader "4.2.0" - gl-spikes2d "^1.0.1" - gl-surface3d "^1.3.0" - mapbox-gl "^0.22.0" + gl-cone3d "^1.2.2" + gl-contour2d "^1.1.5" + gl-error3d "^1.0.13" + gl-heatmap2d "^1.0.5" + gl-line3d "^1.1.10" + gl-mat4 "^1.2.0" + gl-mesh3d "^2.0.7" + gl-plot2d "^1.4.2" + gl-plot3d "^1.6.3" + gl-pointcloud2d "^1.0.2" + gl-scatter3d "^1.1.6" + gl-select-box "^1.0.3" + gl-spikes2d "^1.0.2" + gl-streamtube3d "^1.1.2" + gl-surface3d "^1.4.1" + gl-text "^1.1.6" + glslify "^7.0.0" + has-hover "^1.0.1" + has-passive-events "^1.0.0" + mapbox-gl "0.45.0" matrix-camera-controller "^2.1.3" mouse-change "^1.4.0" mouse-event-offset "^3.0.2" @@ -9033,13 +9333,19 @@ plotly.js@1.28.x: ndarray "^1.0.18" ndarray-fill "^1.0.2" ndarray-homography "^1.0.0" - ndarray-ops "^1.2.2" - regl "^1.3.0" + point-cluster "^3.1.4" + polybooljs "^1.2.0" + regl "^1.3.11" + regl-error2d "^2.0.6" + regl-line2d "3.0.13" + regl-scatter2d "^3.1.3" + regl-splom "^1.0.6" right-now "^1.0.0" robust-orientation "^1.1.3" sane-topojson "^2.0.0" strongly-connected-components "^1.0.1" superscript-text "^1.0.0" + svg-path-sdf "^1.1.3" tinycolor2 "^1.3.0" topojson-client "^2.1.0" webgl-context "^2.2.0" @@ -9063,13 +9369,20 @@ pn@^1.1.0: version "1.1.0" resolved "https://registry.yarnpkg.com/pn/-/pn-1.1.0.tgz#e2f4cef0e219f463c179ab37463e4e1ecdccbafb" -pngjs@^2.2.0: - version "2.3.1" - resolved "https://registry.yarnpkg.com/pngjs/-/pngjs-2.3.1.tgz#11d1e12b9cb64d63e30c143a330f4c1f567da85f" - -point-geometry@0.0.0, point-geometry@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/point-geometry/-/point-geometry-0.0.0.tgz#6fcbcad7a803b6418247dd6e49c2853c584daff7" +point-cluster@^3.1.4: + version "3.1.4" + resolved "https://registry.yarnpkg.com/point-cluster/-/point-cluster-3.1.4.tgz#785fe5ca1351e2cf00f8291a5a653113db892f8e" + dependencies: + array-bounds "^1.0.1" + array-normalize "^1.1.3" + binary-search-bounds "^2.0.4" + bubleify "^1.1.0" + clamp "^1.0.1" + dtype "^2.0.0" + flatten-vertex-data "^1.0.0" + is-obj "^1.0.1" + math-log2 "^1.0.1" + parse-rect "^1.2.0" point-in-big-polygon@^2.0.0: version "2.0.0" @@ -9080,6 +9393,10 @@ point-in-big-polygon@^2.0.0: robust-orientation "^1.1.3" slab-decomposition "^1.0.1" +polybooljs@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/polybooljs/-/polybooljs-1.2.0.tgz#b4390c2e079d4c262d3b2504c6288d95ba7a4758" + polytope-closest-point@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/polytope-closest-point/-/polytope-closest-point-1.0.0.tgz#e6e57f4081ab5e8c778b811ef06e2c48ae338c3f" @@ -9532,6 +9849,17 @@ punycode@^2.1.0: version "2.1.0" resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.0.tgz#5f863edc89b96db09074bad7947bf09056ca4e7d" +pxls@^2.0.0: + version "2.3.2" + resolved "https://registry.yarnpkg.com/pxls/-/pxls-2.3.2.tgz#79100d2cc95089fc6e00053a9d93c1ddddb2c7b4" + dependencies: + arr-flatten "^1.1.0" + compute-dims "^1.1.0" + flip-pixels "^1.0.2" + is-browser "^2.1.0" + is-buffer "^2.0.3" + to-uint8 "^1.4.1" + q@1.4.1, q@^1.1.2, q@^1.4.1: version "1.4.1" resolved "https://registry.yarnpkg.com/q/-/q-1.4.1.tgz#55705bcd93c5f3673530c2c2cbc0c2b3addc286e" @@ -9552,6 +9880,10 @@ qs@~6.5.1: version "6.5.1" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.1.tgz#349cdf6eef89ec45c12d7d5eb3fc0c870343a6d8" +quantize@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/quantize/-/quantize-1.0.2.tgz#d25ac200a77b6d70f40127ca171a10e33c8546de" + quat-slerp@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/quat-slerp/-/quat-slerp-1.0.1.tgz#2baa15ce3a6bbdc3241d972eb17283139ed69f29" @@ -9606,6 +9938,12 @@ raf@^3.1.0, raf@^3.4.0: dependencies: performance-now "^2.1.0" +raf@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/raf/-/raf-3.4.1.tgz#0742e99a4a6552f445d73e3ee0328af0ff1ede39" + dependencies: + performance-now "^2.1.0" + railroad-diagrams@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/railroad-diagrams/-/railroad-diagrams-1.0.0.tgz#eb7e6267548ddedfb899c1b90e57374559cddb7e" @@ -10006,7 +10344,7 @@ read-pkg@^3.0.0: normalize-package-data "^2.3.2" path-type "^3.0.0" -"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6: +"readable-stream@1 || 2", readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5, readable-stream@^2.2.2, readable-stream@^2.3.3, readable-stream@^2.3.6, readable-stream@~2.3.6: version "2.3.6" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.6.tgz#b11c27d88b8ff1fbe070643cf94b0c79ae1b0aaf" dependencies: @@ -10039,7 +10377,7 @@ readable-stream@^2.3.5, readable-stream@~2.3.3: string_decoder "~1.0.3" util-deprecate "~1.0.1" -readable-stream@~1.1.9: +readable-stream@~1.1.0, readable-stream@~1.1.9: version "1.1.14" resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" dependencies: @@ -10109,6 +10447,12 @@ redent@^1.0.0: indent-string "^2.1.0" strip-indent "^1.0.1" +redeyed@~0.4.0: + version "0.4.4" + resolved "https://registry.yarnpkg.com/redeyed/-/redeyed-0.4.4.tgz#37e990a6f2b21b2a11c2e6a48fd4135698cba97f" + dependencies: + esprima "~1.0.4" + reduce-css-calc@^1.2.6: version "1.3.0" resolved "https://registry.yarnpkg.com/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz#747c914e049614a4c9cfbba629871ad1d2927716" @@ -10164,10 +10508,20 @@ redux@^4.0.0: loose-envify "^1.1.0" symbol-observable "^1.2.0" +regenerate-unicode-properties@^7.0.0: + version "7.0.0" + resolved "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-7.0.0.tgz#107405afcc4a190ec5ed450ecaa00ed0cafa7a4c" + dependencies: + regenerate "^1.4.0" + regenerate@^1.2.1: version "1.3.3" resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.3.3.tgz#0c336d3980553d755c39b586ae3b20aa49c82b7f" +regenerate@^1.4.0: + version "1.4.0" + resolved "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.0.tgz#4a856ec4b56e4077c557589cae85e7a4c8869a11" + regenerator-runtime@^0.11.0: version "0.11.1" resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz#be05ad7f9bf7d22e056f9726cee5017fbf19e2e9" @@ -10201,6 +10555,10 @@ regex-parser@^2.2.9: version "2.2.9" resolved "https://registry.yarnpkg.com/regex-parser/-/regex-parser-2.2.9.tgz#a372f45a248b62976a568037c1b6e60a60599192" +regex-regex@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/regex-regex/-/regex-regex-1.0.0.tgz#9048a1eaeb870f4d480dabc76fc42cdcc0bc3a72" + regexpp@^1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/regexpp/-/regexpp-1.0.1.tgz#d857c3a741dce075c2848dcb019a0a975b190d43" @@ -10221,19 +10579,108 @@ regexpu-core@^2.0.0: regjsgen "^0.2.0" regjsparser "^0.1.4" +regexpu-core@^4.2.0: + version "4.4.0" + resolved "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.4.0.tgz#8d43e0d1266883969720345e70c275ee0aec0d32" + dependencies: + regenerate "^1.4.0" + regenerate-unicode-properties "^7.0.0" + regjsgen "^0.5.0" + regjsparser "^0.6.0" + unicode-match-property-ecmascript "^1.0.4" + unicode-match-property-value-ecmascript "^1.0.2" + regjsgen@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.2.0.tgz#6c016adeac554f75823fe37ac05b92d5a4edb1f7" +regjsgen@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.0.tgz#a7634dc08f89209c2049adda3525711fb97265dd" + regjsparser@^0.1.4: version "0.1.5" resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.1.5.tgz#7ee8f84dc6fa792d3fd0ae228d24bd949ead205c" dependencies: jsesc "~0.5.0" -regl@^1.3.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/regl/-/regl-1.3.1.tgz#2995e63a7984c520ef2da0f6f1027f7051338140" +regjsparser@^0.6.0: + version "0.6.0" + resolved "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.0.tgz#f1e6ae8b7da2bae96c99399b868cd6c933a2ba9c" + dependencies: + jsesc "~0.5.0" + +regl-error2d@^2.0.6: + version "2.0.6" + resolved "https://registry.yarnpkg.com/regl-error2d/-/regl-error2d-2.0.6.tgz#0d980b4b0e5b8fba23b3bf16b51a29daad7ccc0d" + dependencies: + array-bounds "^1.0.1" + bubleify "^1.0.0" + color-normalize "^1.0.3" + flatten-vertex-data "^1.0.0" + object-assign "^4.1.1" + pick-by-alias "^1.1.1" + to-float32 "^1.0.0" + update-diff "^1.0.2" + +regl-line2d@3.0.13: + version "3.0.13" + resolved "https://registry.yarnpkg.com/regl-line2d/-/regl-line2d-3.0.13.tgz#0300dc523f95145b553ac59740f9d798e5f1e73f" + dependencies: + array-bounds "^1.0.0" + array-normalize "^1.1.3" + bubleify "^1.0.0" + color-normalize "^1.0.0" + earcut "^2.1.1" + es6-weak-map "^2.0.2" + flatten-vertex-data "^1.0.0" + glslify "^7.0.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + pick-by-alias "^1.1.0" + to-float32 "^1.0.0" + +regl-scatter2d@^3.1.2, regl-scatter2d@^3.1.3: + version "3.1.3" + resolved "https://registry.yarnpkg.com/regl-scatter2d/-/regl-scatter2d-3.1.3.tgz#1ddd8572fd02b3fbe2baca9a7fe08fd6ec73a802" + dependencies: + array-range "^1.0.1" + array-rearrange "^2.2.2" + clamp "^1.0.1" + color-id "^1.1.0" + color-normalize "^1.3.0" + color-rgba "^2.1.0" + flatten-vertex-data "^1.0.2" + glslify "^7.0.0" + image-palette "^2.1.0" + is-iexplorer "^1.0.0" + object-assign "^4.1.1" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + point-cluster "^3.1.4" + to-float32 "^1.0.1" + update-diff "^1.1.0" + +regl-splom@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/regl-splom/-/regl-splom-1.0.6.tgz#c14dba179d93490722e23d9d4751184cd247320e" + dependencies: + array-bounds "^1.0.1" + array-range "^1.0.1" + bubleify "^1.2.0" + color-alpha "^1.0.3" + defined "^1.0.0" + flatten-vertex-data "^1.0.2" + left-pad "^1.3.0" + parse-rect "^1.2.0" + pick-by-alias "^1.2.0" + point-cluster "^3.1.4" + raf "^3.4.1" + regl-scatter2d "^3.1.2" + +regl@^1.3.11, regl@^1.3.6: + version "1.3.11" + resolved "https://registry.yarnpkg.com/regl/-/regl-1.3.11.tgz#515e5173ffdc0618f908dd4e338a34ae9555f745" relateurl@0.2.x: version "0.2.7" @@ -10295,7 +10742,7 @@ request-promise-native@^1.0.5: stealthy-require "^1.1.0" tough-cookie ">=2.3.3" -request@2, request@^2.39.0, request@^2.78.0, request@^2.79.0: +request@2, request@^2.78.0, request@^2.79.0: version "2.85.0" resolved "https://registry.yarnpkg.com/request/-/request-2.85.0.tgz#5a03615a47c61420b3eb99b7dba204f83603e1fa" dependencies: @@ -10646,9 +11093,9 @@ run-queue@^1.0.0, run-queue@^1.0.3: dependencies: aproba "^1.1.1" -rw@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/rw/-/rw-0.1.4.tgz#4903cbd80248ae0ede685bf58fd236a7a9b29a3e" +rw@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4" rx-lite-aggregates@^4.0.8: version "4.0.8" @@ -10777,6 +11224,10 @@ scss-tokenizer@^0.2.3: js-base64 "^2.1.8" source-map "^0.4.2" +seedrandom@^2.4.2: + version "2.4.4" + resolved "https://registry.yarnpkg.com/seedrandom/-/seedrandom-2.4.4.tgz#b25ea98632c73e45f58b77cfaa931678df01f9ba" + selenium-webdriver@3.6.0, selenium-webdriver@^3.0.1: version "3.6.0" resolved "https://registry.yarnpkg.com/selenium-webdriver/-/selenium-webdriver-3.6.0.tgz#2ba87a1662c020b8988c981ae62cb2a01298eafc" @@ -10890,6 +11341,17 @@ shallowequal@^1.0.1: version "1.0.2" resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.0.2.tgz#1561dbdefb8c01408100319085764da3fcf83f8f" +sharkdown@^0.1.0: + version "0.1.0" + resolved "https://registry.yarnpkg.com/sharkdown/-/sharkdown-0.1.0.tgz#61d4fe529e75d02442127cc9234362265099214f" + dependencies: + cardinal "~0.4.2" + expect.js "~0.2.0" + minimist "0.0.5" + split "~0.2.10" + stream-spigot "~2.1.2" + through "~2.3.4" + shebang-command@^1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz#44aac65b695b03398968c39f363fee5deafdf1ea" @@ -10900,10 +11362,6 @@ shebang-regex@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz#da42f49740c0b42db2ca9728571cb190c98efea3" -shelf-pack@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/shelf-pack/-/shelf-pack-1.1.0.tgz#b4679afdd00ad68dfd9bbd2b5a3e819293a74d82" - shell-quote@^1.6.1: version "1.6.1" resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" @@ -10931,6 +11389,12 @@ showdown@1.8.x: dependencies: yargs "^10.0.3" +shuffle-seed@^1.1.6: + version "1.1.6" + resolved "https://registry.yarnpkg.com/shuffle-seed/-/shuffle-seed-1.1.6.tgz#533c12683bab3b4fa3e8751fc4e562146744260b" + dependencies: + seedrandom "^2.4.2" + signal-exit@^3.0.0, signal-exit@^3.0.2: version "3.0.2" resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" @@ -11006,18 +11470,6 @@ slide@^1.1.5: version "1.1.6" resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" -snap-points-2d@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/snap-points-2d/-/snap-points-2d-1.0.1.tgz#8a679a47e195fa31405b03dc6e0c03e18228dcf4" - dependencies: - typedarray-pool "^1.1.0" - -snap-points-2d@^3.0.0, snap-points-2d@^3.1.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/snap-points-2d/-/snap-points-2d-3.2.0.tgz#0e19e22a3a0e96bce21cdf5c7f1d7ed5b96745f0" - dependencies: - array-bounds "^1.0.1" - snapdragon-node@^2.0.1: version "2.1.1" resolved "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz#6c175f86ff14bdb0724563e8f3c1b021a286853b" @@ -11139,7 +11591,7 @@ source-map@0.5.x, source-map@^0.5.3, source-map@^0.5.6, source-map@^0.5.7, sourc version "0.6.1" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz#74722af32e9614e9c287a8d0bbde48b5e2f1a263" -source-map@^0.1.34, source-map@^0.1.38, source-map@~0.1.33: +source-map@^0.1.38, source-map@~0.1.33: version "0.1.43" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.1.43.tgz#c24bc146ca517c1471f5dacbe2571b2b7f9e3346" dependencies: @@ -11155,6 +11607,10 @@ source-map@^0.7.2: version "0.7.3" resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.7.3.tgz#5302f8169031735226544092e64981f751750383" +sourcemap-codec@^1.4.1: + version "1.4.4" + resolved "https://registry.yarnpkg.com/sourcemap-codec/-/sourcemap-codec-1.4.4.tgz#c63ea927c029dd6bd9a2b7fa03b3fec02ad56e9f" + spdx-correct@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.0.0.tgz#05a5b4d7153a195bc92c3c425b69f3b2a9524c82" @@ -11190,6 +11646,12 @@ split-string@^3.0.1, split-string@^3.0.2: dependencies: extend-shallow "^3.0.0" +split@~0.2.10: + version "0.2.10" + resolved "https://registry.yarnpkg.com/split/-/split-0.2.10.tgz#67097c601d697ce1368f418f06cd201cf0521a57" + dependencies: + through "2" + sprintf-js@^1.0.3, sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" @@ -11325,6 +11787,12 @@ stream-shift@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" +stream-spigot@~2.1.2: + version "2.1.2" + resolved "https://registry.yarnpkg.com/stream-spigot/-/stream-spigot-2.1.2.tgz#7de145e819f8dd0db45090d13dcf73a8ed3cc035" + dependencies: + readable-stream "~1.1.0" + stream-to-observable@^0.2.0: version "0.2.0" resolved "https://registry.yarnpkg.com/stream-to-observable/-/stream-to-observable-0.2.0.tgz#59d6ea393d87c2c0ddac10aa0d561bc6ba6f0e10" @@ -11342,10 +11810,23 @@ string-length@^2.0.0: astral-regex "^1.0.0" strip-ansi "^4.0.0" +string-split-by@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/string-split-by/-/string-split-by-1.0.0.tgz#53895fb3397ebc60adab1f1e3a131f5372586812" + dependencies: + parenthesis "^3.1.5" + string-template@~0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/string-template/-/string-template-0.2.1.tgz#42932e598a352d01fc22ec3367d9d84eec6c9add" +string-to-arraybuffer@^1.0.0: + version "1.0.2" + resolved "https://registry.yarnpkg.com/string-to-arraybuffer/-/string-to-arraybuffer-1.0.2.tgz#161147fbadea02e28b0935002cec4c40f1ca7f0a" + dependencies: + atob-lite "^2.0.0" + is-base64 "^0.1.0" + string-width@^1.0.1, string-width@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" @@ -11420,6 +11901,10 @@ strip-bom-stream@^2.0.0: first-chunk-stream "^2.0.0" strip-bom "^2.0.0" +strip-bom-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/strip-bom-string/-/strip-bom-string-1.0.0.tgz#e5211e9224369fbb81d633a2f00044dc8cedad92" + strip-bom@3.0.0, strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3" @@ -11462,7 +11947,7 @@ subarg@^1.0.0: dependencies: minimist "^1.1.0" -supercluster@^2.0.1: +supercluster@^2.3.0: version "2.3.0" resolved "https://registry.yarnpkg.com/supercluster/-/supercluster-2.3.0.tgz#87ab56081bbea9a1d724df5351ee9e8c3af2f48b" dependencies: @@ -11502,6 +11987,29 @@ surface-nets@^1.0.0, surface-nets@^1.0.2: triangulate-hypercube "^1.0.0" zero-crossings "^1.0.0" +svg-arc-to-cubic-bezier@^3.0.0: + version "3.1.3" + resolved "https://registry.yarnpkg.com/svg-arc-to-cubic-bezier/-/svg-arc-to-cubic-bezier-3.1.3.tgz#7b5f76445310ef03238964c39ae7dbc761fda879" + +svg-path-bounds@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/svg-path-bounds/-/svg-path-bounds-1.0.1.tgz#bf458b783726bf53431b4633f2792f60748d9f74" + dependencies: + abs-svg-path "^0.1.1" + is-svg-path "^1.0.1" + normalize-svg-path "^1.0.0" + parse-svg-path "^0.1.2" + +svg-path-sdf@^1.1.3: + version "1.1.3" + resolved "https://registry.yarnpkg.com/svg-path-sdf/-/svg-path-sdf-1.1.3.tgz#92957a31784c0eaf68945472c8dc6bf9e6d126fc" + dependencies: + bitmap-sdf "^1.0.0" + draw-svg-path "^1.0.0" + is-svg-path "^1.0.1" + parse-svg-path "^0.1.2" + svg-path-bounds "^1.0.1" + svgo@^0.7.0: version "0.7.2" resolved "https://registry.yarnpkg.com/svgo/-/svgo-0.7.2.tgz#9f5772413952135c6fefbf40afe6a4faa88b4bb5" @@ -11553,7 +12061,7 @@ tapable@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/tapable/-/tapable-1.0.0.tgz#cbb639d9002eed9c6b5975eb20598d7936f1f9f2" -tape@^4.0.0, tape@^4.6.0: +tape@^4.0.0: version "4.9.0" resolved "https://registry.yarnpkg.com/tape/-/tape-4.9.0.tgz#855c08360395133709d34d3fbf9ef341eb73ca6a" dependencies: @@ -11628,11 +12136,11 @@ test-exclude@^4.1.1: read-pkg-up "^1.0.1" require-main-filename "^1.0.1" -text-cache@^4.1.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/text-cache/-/text-cache-4.1.0.tgz#7c58090e85ac0910f976df4cfc8ce8aa0ea58766" +text-cache@^4.2.1: + version "4.2.1" + resolved "https://registry.yarnpkg.com/text-cache/-/text-cache-4.2.1.tgz#c89e2407827c288f668b3a3454912511c2364245" dependencies: - vectorize-text "^3.0.1" + vectorize-text "^3.2.1" text-encoding@0.x: version "0.6.4" @@ -11672,6 +12180,13 @@ through2@^2.0.0, through2@^2.0.1, through2@~2.0.3: readable-stream "^2.1.5" xtend "~4.0.1" +through2@^2.0.3: + version "2.0.5" + resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd" + dependencies: + readable-stream "~2.3.6" + xtend "~4.0.1" + through2@~0.4.1: version "0.4.2" resolved "https://registry.yarnpkg.com/through2/-/through2-0.4.2.tgz#dbf5866031151ec8352bb6c4db64a2292a840b9b" @@ -11679,7 +12194,7 @@ through2@~0.4.1: readable-stream "~1.0.17" xtend "~2.1.1" -through@^2.3.6, through@^2.3.7, through@^2.3.8, through@~2.3.4, through@~2.3.8: +through@2, through@^2.3.6, through@^2.3.8, through@~2.3.4, through@~2.3.8: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" @@ -11705,6 +12220,10 @@ tinycolor2@^1.3.0: version "1.4.1" resolved "https://registry.yarnpkg.com/tinycolor2/-/tinycolor2-1.4.1.tgz#f4fad333447bc0b07d4dc8e9209d8f39a8ac77e8" +tinyqueue@^1.1.0: + version "1.2.3" + resolved "https://registry.yarnpkg.com/tinyqueue/-/tinyqueue-1.2.3.tgz#b6a61de23060584da29f82362e45df1ec7353f3d" + tippy.js@^3.2.0: version "3.3.0" resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-3.3.0.tgz#90d4f90be9c80fdc0d0025f49378e3d9f60508d3" @@ -11727,6 +12246,14 @@ tmpl@1.0.x: version "1.0.4" resolved "https://registry.yarnpkg.com/tmpl/-/tmpl-1.0.4.tgz#23640dd7b42d00433911140820e5cf440e521dd1" +to-array-buffer@^3.0.0: + version "3.2.0" + resolved "https://registry.yarnpkg.com/to-array-buffer/-/to-array-buffer-3.2.0.tgz#cb684dd691a7368c3b249c2348d75227f7d4dbb4" + dependencies: + flatten-vertex-data "^1.0.2" + is-blob "^2.0.1" + string-to-arraybuffer "^1.0.0" + to-arraybuffer@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz#7d229b1fcc637e466ca081180836a7aabff83f43" @@ -11739,6 +12266,10 @@ to-fast-properties@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz#dc5e698cbd079265bc73e0377681a4e4e83f616e" +to-float32@^1.0.0, to-float32@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/to-float32/-/to-float32-1.0.1.tgz#22d5921f38183164b9e7e9876158c0c16cb9753a" + to-object-path@^0.3.0: version "0.3.0" resolved "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz#297588b7b0e7e0ac08e04e672f85c1f4999e17af" @@ -11767,9 +12298,15 @@ to-regex@^3.0.1, to-regex@^3.0.2: regex-not "^1.0.2" safe-regex "^1.1.0" -to-utf8@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/to-utf8/-/to-utf8-0.0.1.tgz#d17aea72ff2fba39b9e43601be7b3ff72e089852" +to-uint8@^1.4.1: + version "1.4.1" + resolved "https://registry.yarnpkg.com/to-uint8/-/to-uint8-1.4.1.tgz#9f45694905b827f247d37bc8ec83b2818d81fac9" + dependencies: + arr-flatten "^1.1.0" + clamp "^1.0.1" + is-base64 "^0.1.0" + is-float-array "^1.0.0" + to-array-buffer "^3.0.0" toggle-selection@^1.0.3: version "1.0.6" @@ -11935,6 +12472,10 @@ type-is@~1.6.16: media-typer "0.3.0" mime-types "~2.1.18" +type-name@^2.0.0: + version "2.0.2" + resolved "https://registry.yarnpkg.com/type-name/-/type-name-2.0.2.tgz#efe7d4123d8ac52afff7f40c7e4dec5266008fb4" + typed-styles@^0.0.5: version "0.0.5" resolved "https://registry.yarnpkg.com/typed-styles/-/typed-styles-0.0.5.tgz#a60df245d482a9b1adf9c06c078d0f06085ed1cf" @@ -12009,29 +12550,6 @@ uid-number@^0.0.6: version "0.0.6" resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" -unassert@^1.3.1: - version "1.5.1" - resolved "https://registry.yarnpkg.com/unassert/-/unassert-1.5.1.tgz#cbc88ec387417c5a5e4c02d3cd07be98bd75ff76" - dependencies: - acorn "^4.0.0" - call-matcher "^1.0.1" - deep-equal "^1.0.0" - espurify "^1.3.0" - estraverse "^4.1.0" - esutils "^2.0.2" - object-assign "^4.1.0" - -unassertify@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/unassertify/-/unassertify-2.1.0.tgz#6b07abf5c6598ba3852a27a676caad1df526a96d" - dependencies: - acorn "^5.1.0" - convert-source-map "^1.1.1" - escodegen "^1.6.1" - multi-stage-sourcemap "^0.2.1" - through "^2.3.7" - unassert "^1.3.1" - uncontrollable@^5.0.0: version "5.1.0" resolved "https://registry.yarnpkg.com/uncontrollable/-/uncontrollable-5.1.0.tgz#7e9a1c50ea24e3c78b625e52d21ff3f758c7bd59" @@ -12046,6 +12564,25 @@ underscore@~1.6.0: version "1.6.0" resolved "https://registry.yarnpkg.com/underscore/-/underscore-1.6.0.tgz#8b38b10cacdef63337b8b24e4ff86d45aea529a8" +unicode-canonical-property-names-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz#2619800c4c825800efdd8343af7dd9933cbe2818" + +unicode-match-property-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz#8ed2a32569961bce9227d09cd3ffbb8fed5f020c" + dependencies: + unicode-canonical-property-names-ecmascript "^1.0.4" + unicode-property-aliases-ecmascript "^1.0.4" + +unicode-match-property-value-ecmascript@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.0.2.tgz#9f1dc76926d6ccf452310564fd834ace059663d4" + +unicode-property-aliases-ecmascript@^1.0.4: + version "1.0.4" + resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" + union-find@^1.0.0, union-find@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/union-find/-/union-find-1.0.2.tgz#292bac415e6ad3a89535d237010db4a536284e58" @@ -12089,10 +12626,6 @@ unique-slug@^2.0.0: dependencies: imurmurhash "^0.1.4" -unitbezier@^0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/unitbezier/-/unitbezier-0.0.0.tgz#33bf7f5d7284c5350bfc5c7f770fba7549c54a5e" - universalify@^0.1.0: version "0.1.1" resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.1.1.tgz#fa71badd4437af4c148841e3b3b165f9e9e590b7" @@ -12101,6 +12634,10 @@ unpipe@1.0.0, unpipe@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz#b2bf4ee8514aae6165b4817829d21b2ef49904ec" +unquote@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz#8fded7324ec6e88a0ff8b905e7c098cdc086d544" + unset-value@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz#8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559" @@ -12116,6 +12653,10 @@ upath@^1.0.0: version "1.1.0" resolved "https://registry.yarnpkg.com/upath/-/upath-1.1.0.tgz#35256597e46a581db4793d0ce47fa9aebfc9fabd" +update-diff@^1.0.2, update-diff@^1.1.0: + version "1.1.0" + resolved "https://registry.yarnpkg.com/update-diff/-/update-diff-1.1.0.tgz#f510182d81ee819fb82c3a6b22b62bbdeda7808f" + upper-case@^1.1.1: version "1.1.3" resolved "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz#f6b4501c2ec4cdd26ba78be7222961de77621598" @@ -12192,10 +12733,45 @@ utila@~0.4: version "0.4.0" resolved "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz#8a16a05d445657a3aea5eecc5b12a4fa5379772c" +utils-copy-error@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/utils-copy-error/-/utils-copy-error-1.0.1.tgz#791de393c0f09890afd59f3cbea635f079a94fa5" + dependencies: + object-keys "^1.0.9" + utils-copy "^1.1.0" + +utils-copy@^1.0.0, utils-copy@^1.1.0: + version "1.1.1" + resolved "https://registry.yarnpkg.com/utils-copy/-/utils-copy-1.1.1.tgz#6e2b97982aa8cd73e1182a3e6f8bec3c0f4058a7" + dependencies: + const-pinf-float64 "^1.0.0" + object-keys "^1.0.9" + type-name "^2.0.0" + utils-copy-error "^1.0.0" + utils-indexof "^1.0.0" + utils-regex-from-string "^1.0.0" + validate.io-array "^1.0.3" + validate.io-buffer "^1.0.1" + validate.io-nonnegative-integer "^1.0.0" + +utils-indexof@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-indexof/-/utils-indexof-1.0.0.tgz#20feabf09ef1018b523643e8380e7bc83ec61b5c" + dependencies: + validate.io-array-like "^1.0.1" + validate.io-integer-primitive "^1.0.0" + utils-merge@1.0.1: version "1.0.1" resolved "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz#9f95710f50a267947b2ccc124741c1028427e713" +utils-regex-from-string@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/utils-regex-from-string/-/utils-regex-from-string-1.0.0.tgz#fe1a2909f8de0ff0d5182c80fbc654d6a687d189" + dependencies: + regex-regex "^1.0.0" + validate.io-string-primitive "^1.0.0" + uuid@^2.0.0: version "2.0.3" resolved "https://registry.yarnpkg.com/uuid/-/uuid-2.0.3.tgz#67e2e863797215530dff318e5bf9dcebfd47b21a" @@ -12219,6 +12795,65 @@ validate-npm-package-license@^3.0.1: spdx-correct "^3.0.0" spdx-expression-parse "^3.0.0" +validate.io-array-like@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-array-like/-/validate.io-array-like-1.0.2.tgz#7af9f7eb7b51715beb2215668ec5cce54faddb5a" + dependencies: + const-max-uint32 "^1.0.2" + validate.io-integer-primitive "^1.0.0" + +validate.io-array@^1.0.3, validate.io-array@^1.0.6: + version "1.0.6" + resolved "https://registry.yarnpkg.com/validate.io-array/-/validate.io-array-1.0.6.tgz#5b5a2cafd8f8b85abb2f886ba153f2d93a27774d" + +validate.io-buffer@^1.0.1: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-buffer/-/validate.io-buffer-1.0.2.tgz#852d6734021914d5d13afc32531761e3720ed44e" + +validate.io-integer-primitive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-integer-primitive/-/validate.io-integer-primitive-1.0.0.tgz#a9aa010355fe8681c0fea6c1a74ad2419cadddc6" + dependencies: + validate.io-number-primitive "^1.0.0" + +validate.io-integer@^1.0.5: + version "1.0.5" + resolved "https://registry.yarnpkg.com/validate.io-integer/-/validate.io-integer-1.0.5.tgz#168496480b95be2247ec443f2233de4f89878068" + dependencies: + validate.io-number "^1.0.3" + +validate.io-matrix-like@^1.0.2: + version "1.0.2" + resolved "https://registry.yarnpkg.com/validate.io-matrix-like/-/validate.io-matrix-like-1.0.2.tgz#5ec32a75d0889dac736dea68bdd6145b155edfc3" + +validate.io-ndarray-like@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-ndarray-like/-/validate.io-ndarray-like-1.0.0.tgz#d8a3b0ed165bbf1d2fc0d0073270cfa552295919" + +validate.io-nonnegative-integer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-nonnegative-integer/-/validate.io-nonnegative-integer-1.0.0.tgz#8069243a08c5f98e95413c929dfd7b18f3f6f29f" + dependencies: + validate.io-integer "^1.0.5" + +validate.io-number-primitive@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-number-primitive/-/validate.io-number-primitive-1.0.0.tgz#d2e01f202989369dcf1155449564203afe584e55" + +validate.io-number@^1.0.3: + version "1.0.3" + resolved "https://registry.yarnpkg.com/validate.io-number/-/validate.io-number-1.0.3.tgz#f63ffeda248bf28a67a8d48e0e3b461a1665baf8" + +validate.io-positive-integer@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/validate.io-positive-integer/-/validate.io-positive-integer-1.0.0.tgz#7ed2d03b4c27558cc66a00aab0f0e921814a6582" + dependencies: + validate.io-integer "^1.0.5" + +validate.io-string-primitive@^1.0.0: + version "1.0.1" + resolved "https://registry.yarnpkg.com/validate.io-string-primitive/-/validate.io-string-primitive-1.0.1.tgz#b8135b9fb1372bde02fdd53ad1d0ccd6de798fee" + value-equal@^0.4.0: version "0.4.0" resolved "https://registry.yarnpkg.com/value-equal/-/value-equal-0.4.0.tgz#c5bdd2f54ee093c04839d71ce2e4758a6890abc7" @@ -12227,15 +12862,9 @@ vary@~1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz#2299f02c6ded30d4a5961b0b9f74524a18f634fc" -vector-tile@^1.1.3, vector-tile@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/vector-tile/-/vector-tile-1.3.0.tgz#06d516a83b063f04c82ef539cf1bb1aebeb696b4" - dependencies: - point-geometry "0.0.0" - -vectorize-text@^3.0.0, vectorize-text@^3.0.1: - version "3.0.2" - resolved "https://registry.yarnpkg.com/vectorize-text/-/vectorize-text-3.0.2.tgz#05ab1630e409f377964e2b9205b2d559a92f60d8" +vectorize-text@^3.2.1: + version "3.2.1" + resolved "https://registry.yarnpkg.com/vectorize-text/-/vectorize-text-3.2.1.tgz#85921abd9685af775fd20a01041a2837fe51bdb5" dependencies: cdt2d "^1.0.0" clean-pslg "^1.1.0" @@ -12291,19 +12920,23 @@ vlq@^0.2.2: version "0.2.3" resolved "https://registry.yarnpkg.com/vlq/-/vlq-0.2.3.tgz#8f3e4328cf63b1540c0d67e1b2778386f8975b26" +vlq@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/vlq/-/vlq-1.0.0.tgz#8101be90843422954c2b13eb27f2f3122bdcc806" + vm-browserify@0.0.4: version "0.0.4" resolved "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-0.0.4.tgz#5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73" dependencies: indexof "0.0.1" -vt-pbf@^2.0.2: - version "2.1.4" - resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-2.1.4.tgz#b5df7c3f9706156e0b9881a99dcb05635740b522" +vt-pbf@^3.0.1: + version "3.1.1" + resolved "https://registry.yarnpkg.com/vt-pbf/-/vt-pbf-3.1.1.tgz#b0f627e39a10ce91d943b898ed2363d21899fb82" dependencies: - pbf "^1.3.2" - point-geometry "0.0.0" - vector-tile "^1.1.3" + "@mapbox/point-geometry" "0.1.0" + "@mapbox/vector-tile" "^1.3.1" + pbf "^3.0.5" vue-parser@^1.1.5: version "1.1.6" @@ -12485,10 +13118,6 @@ webpack@4.12.0: watchpack "^1.5.0" webpack-sources "^1.0.1" -webworkify@^1.3.0: - version "1.5.0" - resolved "https://registry.yarnpkg.com/webworkify/-/webworkify-1.5.0.tgz#734ad87a774de6ebdd546e1d3e027da5b8f4a42c" - wgs84@0.0.0: version "0.0.0" resolved "https://registry.yarnpkg.com/wgs84/-/wgs84-0.0.0.tgz#34fdc555917b6e57cf2a282ed043710c049cdc76" @@ -12558,10 +13187,6 @@ which@1, which@^1.2.12, which@^1.2.14, which@^1.2.9, which@^1.3.0: dependencies: isexe "^2.0.0" -whoots-js@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/whoots-js/-/whoots-js-2.1.0.tgz#bcb201c34e0eaf335fcce5ae2cf874579a99c487" - wide-align@^1.1.0: version "1.1.2" resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" From 652b41018ea337e67022b5bc25102ad8e42d3293 Mon Sep 17 00:00:00 2001 From: Samuel Padgett Date: Mon, 4 Mar 2019 08:25:14 -0500 Subject: [PATCH 13/45] Bug 1685006: Show mock resource quota page when user has no projects Fixes https://bugzilla.redhat.com/show_bug.cgi?id=1685006 --- frontend/public/components/resource-quota.jsx | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/frontend/public/components/resource-quota.jsx b/frontend/public/components/resource-quota.jsx index d46152ced29..1f82c8fcffa 100644 --- a/frontend/public/components/resource-quota.jsx +++ b/frontend/public/components/resource-quota.jsx @@ -213,7 +213,7 @@ export const quotaType = quota => { // Split each resource quota into one row per subject export const flatten = resources => _.flatMap(resources, resource => _.compact(resource.data)); -export const ResourceQuotasPage = connectToFlags(FLAGS.OPENSHIFT)(({namespace, flags}) => { +export const ResourceQuotasPage = connectToFlags(FLAGS.OPENSHIFT)(({namespace, flags, mock}) => { const resources = [{kind: 'ResourceQuota', namespaced: true}]; let rowFilters = null; @@ -245,6 +245,7 @@ export const ResourceQuotasPage = connectToFlags(FLAGS.OPENSHIFT)(({namespace, f flatten={flatten} title="Resource Quotas" rowFilters={rowFilters} + mock={mock} />; }); From fc52867724346d7b6fe0d74ac7a4bf31ff6ce325 Mon Sep 17 00:00:00 2001 From: Jakub Hadvig Date: Fri, 1 Mar 2019 11:12:50 +0100 Subject: [PATCH 14/45] Bug 1683890 - Runtime error when encoding Unicode string --- .../public/components/configmap-and-secret-data.jsx | 4 +++- .../modals/configure-ns-pull-secret-modal.jsx | 11 ++++++----- frontend/public/components/secrets/create-secret.tsx | 7 ++++--- frontend/public/components/service-account.jsx | 3 ++- frontend/public/components/utils/index.tsx | 1 - frontend/public/ui/ui-actions.js | 4 +++- 6 files changed, 18 insertions(+), 12 deletions(-) diff --git a/frontend/public/components/configmap-and-secret-data.jsx b/frontend/public/components/configmap-and-secret-data.jsx index 924348afb6b..238fca61361 100644 --- a/frontend/public/components/configmap-and-secret-data.jsx +++ b/frontend/public/components/configmap-and-secret-data.jsx @@ -1,8 +1,10 @@ import * as React from 'react'; import * as PropTypes from 'prop-types'; +import { Base64 } from 'js-base64'; import { CopyToClipboard, EmptyBox, SectionHeading } from './utils'; + export const MaskedData = () => Value hidden @@ -35,7 +37,7 @@ export class SecretData extends React.PureComponent { } const { showSecret } = this.state; - const decodedValue = window.atob(rawValue); + const decodedValue = Base64.decode(rawValue); const visibleValue = showSecret ? decodedValue : ; return ; } diff --git a/frontend/public/components/modals/configure-ns-pull-secret-modal.jsx b/frontend/public/components/modals/configure-ns-pull-secret-modal.jsx index f2bb33c0139..8f584a54cf8 100644 --- a/frontend/public/components/modals/configure-ns-pull-secret-modal.jsx +++ b/frontend/public/components/modals/configure-ns-pull-secret-modal.jsx @@ -1,6 +1,7 @@ import * as _ from 'lodash-es'; import * as React from 'react'; import * as PropTypes from 'prop-types'; +import { Base64 } from 'js-base64'; import { k8sPatch, k8sCreate } from '../../module/k8s'; import { SecretModel } from '../../models'; @@ -14,7 +15,7 @@ const parseExisitingPullSecret = (pullSecret) => { let username, email, password, address; try { - const existingData = pullSecret && window.atob(pullSecret.data[CONST.PULL_SECRET_DATA]); + const existingData = pullSecret && Base64.decode(pullSecret.data[CONST.PULL_SECRET_DATA]); if (existingData) { const data = JSON.parse(existingData); @@ -35,7 +36,7 @@ const parseExisitingPullSecret = (pullSecret) => { } address = keys[0]; email = data.auths[address].email; - const auth = window.atob(data.auths[address].auth); + const auth = Base64.decode(data.auths[address].auth); const authParts = auth.split(':'); if (authParts.length === 1) { @@ -68,11 +69,11 @@ const generateSecretData = (formData) => { authParts.push(formData.password); config.auths[formData.address] = { - auth: window.btoa(authParts.join(':')), + auth: Base64.encode(authParts.join(':')), email: formData.email, }; - return window.btoa(JSON.stringify(config)); + return Base64.encode(JSON.stringify(config)); }; class ConfigureNamespacePullSecret extends PromiseComponent { @@ -127,7 +128,7 @@ class ConfigureNamespacePullSecret extends PromiseComponent { let secretData; if (this.state.method === 'upload') { - secretData = window.btoa(this.state.fileData); + secretData = Base64.encode(this.state.fileData); } else { const elements = event.target.elements; const formData = { diff --git a/frontend/public/components/secrets/create-secret.tsx b/frontend/public/components/secrets/create-secret.tsx index eca886a6146..877d87663ab 100644 --- a/frontend/public/components/secrets/create-secret.tsx +++ b/frontend/public/components/secrets/create-secret.tsx @@ -2,6 +2,7 @@ import * as _ from 'lodash-es'; import * as React from 'react'; import { Helmet } from 'react-helmet'; +import { Base64 } from 'js-base64'; import { k8sCreate, k8sUpdate, K8sResourceKind, referenceFor } from '../../module/k8s'; import { ButtonBar, Firehose, history, StatusBox, LoadingBox, Dropdown, resourceObjPath } from '../utils'; @@ -108,7 +109,7 @@ const withSecretForm = (SubForm) => class SecretFormComponent extends React.Comp inProgress: false, type: defaultSecretType, stringData: _.mapValues(_.get(props.obj, 'data'), (value) => { - return value ? window.atob(value) : ''; + return value ? Base64.decode(value) : ''; }), disableForm: false, }; @@ -310,7 +311,7 @@ class ConfigEntryForm extends React.Component { // Decode and parse 'auth' in case 'username' and 'password' are not part of the secret. - const decodedAuth = window.atob(_.get(v, 'auth', '')); + const decodedAuth = Base64.decode(_.get(v, 'auth', '')); const parsedAuth = _.isEmpty(decodedAuth) ? _.fill(Array(2), '') : _.split(decodedAuth, ':'); imageSecretArray.push({ entry: { diff --git a/frontend/public/components/service-account.jsx b/frontend/public/components/service-account.jsx index b6529353452..1f6d7b5e8d0 100644 --- a/frontend/public/components/service-account.jsx +++ b/frontend/public/components/service-account.jsx @@ -1,6 +1,7 @@ import * as _ from 'lodash-es'; import * as React from 'react'; import { safeDump } from 'js-yaml'; +import { Base64 } from 'js-base64'; import { ColHead, DetailsPage, List, ListHeader, ListPage, ResourceRow } from './factory'; import { Kebab, SectionHeading, navFactory, ResourceKebab, ResourceLink, ResourceSummary } from './utils'; @@ -22,7 +23,7 @@ const KubeConfigify = (kind, sa) => ({ const server = window.SERVER_FLAGS.kubeAPIServerURL; const clusterName = window.SERVER_FLAGS.clusterName; - const token = atob(data.token); + const token = Base64.decode(data.token); const cert = data['ca.crt']; const config = { diff --git a/frontend/public/components/utils/index.tsx b/frontend/public/components/utils/index.tsx index 60b955abaae..e4fad8f9aa7 100644 --- a/frontend/public/components/utils/index.tsx +++ b/frontend/public/components/utils/index.tsx @@ -47,7 +47,6 @@ export * from './k8s-watcher'; export * from './workload-pause'; export * from './list-dropdown'; export * from './status-icon'; - /* Add the enum for NameValueEditorPair here and not in its namesake file because the editor should always be loaded asynchronously in order not to bloat the vendor file. The enum reference into the editor diff --git a/frontend/public/ui/ui-actions.js b/frontend/public/ui/ui-actions.js index b6deb1eeb80..118f8d9cb15 100644 --- a/frontend/public/ui/ui-actions.js +++ b/frontend/public/ui/ui-actions.js @@ -1,3 +1,5 @@ +import { Base64 } from 'js-base64'; + import store from '../redux'; import { history } from '../components/utils/router'; import { ALL_NAMESPACES_KEY, LAST_NAMESPACE_NAME_LOCAL_STORAGE_KEY } from '../const'; @@ -136,7 +138,7 @@ export const UIActions = { * and "/" aren't allowed, so base64 but replace illegal chars. */ let encodedName = textEncoder.encode(name); - encodedName = window.btoa(String.fromCharCode.apply(String, encodedName)); + encodedName = Base64.encode(String.fromCharCode.apply(String, encodedName)); encodedName = encodedName.replace(/=/g, '_').replace(/\//g, '-'); let subprotocols; From 3fe986fcb216cbc452236eee260b1196971d71d7 Mon Sep 17 00:00:00 2001 From: Robb Hamilton Date: Tue, 5 Mar 2019 10:00:17 -0500 Subject: [PATCH 15/45] Fix bug where position of .co-m-modal-link icon differed across browsers Fixes https://jira.coreos.com/browse/CONSOLE-1311 --- frontend/public/style/_common.scss | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/frontend/public/style/_common.scss b/frontend/public/style/_common.scss index ffd094ca88e..df87865a0c0 100644 --- a/frontend/public/style/_common.scss +++ b/frontend/public/style/_common.scss @@ -396,18 +396,17 @@ outline: none; padding-right: 20px; position: relative; - &:after { + &::after { color: $color-pf-black-600; content: $pficon-var-edit; font-family: $icon-font-name-pf; + line-height: 1; pointer-events: none; position: absolute; right: 0; + top: 0; } - &:focus { - outline: none; - } - &:hover:after { + &:hover::after { color: $color-pf-black-700; } } From 1387183682b4ef2faa2156c208ac9e4a0e52c9fb Mon Sep 17 00:00:00 2001 From: Robb Hamilton Date: Tue, 5 Mar 2019 10:54:25 -0500 Subject: [PATCH 16/45] Remove orphaned methods from NavSection --- frontend/public/components/nav.jsx | 23 +---------------------- 1 file changed, 1 insertion(+), 22 deletions(-) diff --git a/frontend/public/components/nav.jsx b/frontend/public/components/nav.jsx index ff74b7e84cb..5f52f49eac7 100644 --- a/frontend/public/components/nav.jsx +++ b/frontend/public/components/nav.jsx @@ -25,7 +25,7 @@ import { } from '../models'; import { referenceForModel } from '../module/k8s'; -import { history, stripBasePath } from './utils'; +import { stripBasePath } from './utils'; export const matchesPath = (resourcePath, prefix) => resourcePath === prefix || _.startsWith(resourcePath, `${prefix}/`); export const matchesModel = (resourcePath, model) => model && matchesPath(resourcePath, referenceForModel(model)); @@ -155,8 +155,6 @@ const NavSection = connect(navSectionStateToProps)( class NavSection extends React.Component { constructor(props) { super(props); - this.toggle = e => this.toggle_(e); - this.open = () => this.open_(); this.state = { isOpen: false, activeChild: null }; const activeChild = this.getActiveChild(); @@ -217,25 +215,6 @@ const NavSection = connect(navSectionStateToProps)( this.setState(state); } - open_() { - this.setState({isOpen: true}); - } - - toggle_(e) { - const { href, onClick } = this.props; - - if (href) { - e && e.stopPropagation(); - history.push(href); - } - - if (onClick) { - onClick(); - } - - this.setState({isOpen: !this.state.isOpen}); - } - render() { if (!this.props.canRender) { return null; From e9504722acc26dbf80a43bf74357c82b783a47b2 Mon Sep 17 00:00:00 2001 From: Robb Hamilton Date: Tue, 5 Mar 2019 11:34:02 -0500 Subject: [PATCH 17/45] Fix bug where Operator Hub empty state background did not fill viewport --- frontend/public/components/utils/error-boundary.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/components/utils/error-boundary.tsx b/frontend/public/components/utils/error-boundary.tsx index ea06e08edfb..7dba6fc96e4 100644 --- a/frontend/public/components/utils/error-boundary.tsx +++ b/frontend/public/components/utils/error-boundary.tsx @@ -37,7 +37,7 @@ export class ErrorBoundary extends React.Component - :
{this.props.children}
; + : {this.props.children}; } } From da7c477754a14e5787259d6b21b037d9a769d2f8 Mon Sep 17 00:00:00 2001 From: Lance Date: Wed, 27 Feb 2019 10:27:21 -0500 Subject: [PATCH 18/45] Updating: fixed bugzilla 1669300 --- .../tests/operator-hub/operator-hub.scenario.ts | 6 +++--- .../public/components/operator-hub/operator-hub-page.tsx | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/integration-tests/tests/operator-hub/operator-hub.scenario.ts b/frontend/integration-tests/tests/operator-hub/operator-hub.scenario.ts index bcd0b7bdb4b..269d3a15816 100644 --- a/frontend/integration-tests/tests/operator-hub/operator-hub.scenario.ts +++ b/frontend/integration-tests/tests/operator-hub/operator-hub.scenario.ts @@ -33,12 +33,12 @@ describe('Subscribing to an Operator from Operator Hub', () => { }); }); - it('displays Couchbase Operator operator when filter "MongoDB" is active', async() => { - await catalogPageView.clickFilterCheckbox('MongoDB'); + it('displays Couchbase Operator operator when filter "Couchbase" is active', async() => { + await catalogPageView.clickFilterCheckbox('Couchbase'); expect(catalogPageView.catalogTileFor('Couchbase Operator').isDisplayed()).toBe(true); - await catalogPageView.clickFilterCheckbox('MongoDB'); + await catalogPageView.clickFilterCheckbox('Couchbase'); }); it('does not display Couchbase Operator operator when filter "Red Hat" is active', async() => { diff --git a/frontend/public/components/operator-hub/operator-hub-page.tsx b/frontend/public/components/operator-hub/operator-hub-page.tsx index fc7cbb87ee8..d81f8906101 100644 --- a/frontend/public/components/operator-hub/operator-hub-page.tsx +++ b/frontend/public/components/operator-hub/operator-hub-page.tsx @@ -34,7 +34,7 @@ export const OperatorHubList: React.SFC = (props) => { imgUrl: iconObj ? `data:${iconObj.mediatype};base64,${iconObj.base64data}` : operatorImg, description: currentCSVAnnotations.description || currentCSVDesc.description, longDescription: currentCSVDesc.description || currentCSVAnnotations.description, - provider: _.get(pkg, 'metadata.labels.provider'), + provider: _.get(pkg, 'status.provider.name', _.get(pkg, 'metadata.labels.provider')), providerType: getOperatorProviderType(pkg), tags: pkg.metadata.tags, version: _.get(currentCSVDesc, 'version'), From 2e1a4a9421851c5e36dbe0eb7500e3576dd101da Mon Sep 17 00:00:00 2001 From: David Taylor Date: Wed, 6 Mar 2019 10:54:23 -0500 Subject: [PATCH 19/45] Bug 1685802 - Fix when no externalMetadata for displayName when Creating Service Instance --- frontend/public/components/service-catalog/create-instance.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/public/components/service-catalog/create-instance.tsx b/frontend/public/components/service-catalog/create-instance.tsx index 59b1408dfdb..053b060869c 100644 --- a/frontend/public/components/service-catalog/create-instance.tsx +++ b/frontend/public/components/service-catalog/create-instance.tsx @@ -134,7 +134,7 @@ class CreateInstance extends React.Component
; From 0805b1e5ab8324318dc18d03529b093fd116f363 Mon Sep 17 00:00:00 2001 From: Sami Shahin Date: Wed, 6 Mar 2019 07:38:10 -0500 Subject: [PATCH 20/45] Bandaid fix OperatorHub tests for etcd operator - Changed OperatorHub test to check for OwnNamespace installmode rather than AllNamespaces - Updated namespace to match testName for single namespace install - Added views for selecting namespace on Subscription page The etcd operator in community-operators changed late last week, replacing AllNamespaces functionality with SingleNamespace. This puts a bandaid on the issue. Operators in community-operators can change frequently, and because of this OperatorHub tests will be unstable when relying on external content. --- .../tests/operator-hub/operator-hub.scenario.ts | 17 +++++++++++------ .../views/operator-hub.view.ts | 7 +++++++ 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/frontend/integration-tests/tests/operator-hub/operator-hub.scenario.ts b/frontend/integration-tests/tests/operator-hub/operator-hub.scenario.ts index 436e931ace3..997163372d0 100644 --- a/frontend/integration-tests/tests/operator-hub/operator-hub.scenario.ts +++ b/frontend/integration-tests/tests/operator-hub/operator-hub.scenario.ts @@ -14,9 +14,10 @@ describe('Subscribing to an Operator from Operator Hub', () => { afterAll(() => { // FIXME: Don't hardcode namespace for running tests against upstream k8s - execSync('kubectl delete catalogsourceconfig -n openshift-marketplace installed-community-openshift-operators'); - execSync('kubectl delete subscription -n openshift-operators --all'); - execSync('kubectl delete clusterserviceversion -n openshift-operators --all'); + execSync(`kubectl delete catalogsourceconfig -n openshift-marketplace installed-community-${testName}`); + execSync(`kubectl delete subscription -n ${testName} --all`); + execSync(`kubectl delete clusterserviceversion -n ${testName} --all`); + execSync(`kubectl delete operatorgroup -n ${testName} --all`); }); afterEach(() => { @@ -25,7 +26,7 @@ describe('Subscribing to an Operator from Operator Hub', () => { }); it('displays Operator Hub with expected available operators', async() => { - await browser.get(`${appHost}/operatorhub`); + await browser.get(`${appHost}/operatorhub/ns/${testName}`); await crudView.isLoaded(); openCloudServices.forEach(name => { @@ -128,17 +129,21 @@ describe('Subscribing to an Operator from Operator Hub', () => { it('selects target namespace for Operator subscription', async() => { await browser.wait(until.visibilityOf(operatorHubView.createSubscriptionFormInstallMode)); - expect($('input[value="AllNamespaces"]').getAttribute('disabled')).toBe(null); + expect($('input[value="OwnNamespace"]').getAttribute('disabled')).toBe(null); }); it('displays Operator as subscribed in Operator Hub', async() => { + await operatorHubView.installNamespaceDropdownBtn.click(); + await operatorHubView.installNamespaceDropdownFilter(testName); + await operatorHubView.installNamespaceDropdownSelect(testName).click(); + await operatorHubView.createSubscriptionFormBtn.click(); await crudView.isLoaded(); expect(catalogPageView.catalogTileFor('etcd').$('.catalog-tile-pf-footer').getText()).toContain('Installed'); }); - it('displays Operator in "Cluster Service Versions" view for "default" namespace', async() => { + it(`displays Operator in "Cluster Service Versions" view for "${testName}" namespace`, async() => { await browser.get(`${appHost}/operatorhub/ns/${testName}`); await crudView.isLoaded(); await catalogPageView.catalogTileFor('etcd').click(); diff --git a/frontend/integration-tests/views/operator-hub.view.ts b/frontend/integration-tests/views/operator-hub.view.ts index e0eb9afe98d..f5bdc33a4e9 100644 --- a/frontend/integration-tests/views/operator-hub.view.ts +++ b/frontend/integration-tests/views/operator-hub.view.ts @@ -16,6 +16,13 @@ export const createSubscriptionFormTitle = element(by.cssContainingText('h1', 'C export const createSubscriptionFormBtn = element(by.buttonText('Subscribe')); export const createSubscriptionFormInstallMode = element(by.cssContainingText('label', 'Installation Mode')); +export const installNamespaceDropdown = $('.dropdown--full-width'); +export const installNamespaceDropdownBtn = installNamespaceDropdown.$('.dropdown-toggle'); +export const installNamespaceDropdownFilter = (filter: string) => installNamespaceDropdown + .$('.dropdown-menu__filter').$('input').sendKeys(filter); +export const installNamespaceDropdownSelect = (namespace: string) => installNamespaceDropdown + .$(`#${namespace}-Project-link`); + export const communityWarningModal = $('.co-modal-ignore-warning'); export const operatorCommunityWarningIsLoaded = () => browser.wait(until.presenceOf(communityWarningModal), 1000) .then(() => browser.sleep(500)); From 88aa7a889d8e2e1285ce31df04419cff3b240931 Mon Sep 17 00:00:00 2001 From: Andy Pickering Date: Thu, 7 Mar 2019 14:32:56 +0900 Subject: [PATCH 21/45] Monitoring: Disable Alerts Firing link if user can't access Monitoring "Alerts Firing" on the Status page links to the Monitoring UI "Alerts" page, but not all users can access that page. This PR disables the link for those who do not have access. --- frontend/public/components/graphs/health.jsx | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/frontend/public/components/graphs/health.jsx b/frontend/public/components/graphs/health.jsx index 85130c29702..15587643229 100644 --- a/frontend/public/components/graphs/health.jsx +++ b/frontend/public/components/graphs/health.jsx @@ -1,7 +1,9 @@ import * as React from 'react'; +import { connect } from 'react-redux'; import { Status, errorStatus } from './'; import { coFetch, coFetchJSON } from '../../co-fetch'; +import { FLAGS, featureReducerName } from '../../features'; import { k8sBasePath } from '../../module/k8s'; // Use the shorter 'OpenShift Console' instead of 'OpenShift Container Platform Console' since the title appears in the chart. @@ -25,15 +27,19 @@ export const KubernetesHealth = () => ; -const AlertsFiring = ({namespace}) => ( - ({canAccessMonitoring: !!state[featureReducerName].get(FLAGS.CAN_GET_NS)}); + +const AlertsFiring_ = ({canAccessMonitoring, namespace}) => { + const toProp = canAccessMonitoring && !!window.SERVER_FLAGS.prometheusBaseURL ? {to: '/monitoring'} : {}; + return -); + />; +}; +const AlertsFiring = connect(alertsFiringStateToProps)(AlertsFiring_); const CrashloopingPods = ({namespace}) => ( Date: Thu, 28 Feb 2019 10:07:45 -0500 Subject: [PATCH 22/45] Correctly show cluster operator operand versions The cluster operator no longer has a single version field. It has a list of versions instead. --- .../cluster-settings/cluster-operator.tsx | 69 +++++++++++++++---- frontend/public/components/factory/list.tsx | 2 + .../public/module/k8s/cluster-operator.ts | 12 +++- frontend/public/module/k8s/index.ts | 21 ++++++ 4 files changed, 87 insertions(+), 17 deletions(-) diff --git a/frontend/public/components/cluster-settings/cluster-operator.tsx b/frontend/public/components/cluster-settings/cluster-operator.tsx index c305952a9bb..65d5a1641ab 100644 --- a/frontend/public/components/cluster-settings/cluster-operator.tsx +++ b/frontend/public/components/cluster-settings/cluster-operator.tsx @@ -12,14 +12,17 @@ import { } from '../factory'; import { getClusterOperatorStatus, + getClusterOperatorVersion, getStatusAndMessage, - K8sResourceKind, + ClusterOperator, K8sResourceKindReference, + OperandVersion, OperatorStatus, referenceForModel, } from '../../module/k8s'; import { navFactory, + EmptyBox, ResourceLink, ResourceSummary, SectionHeading, @@ -46,11 +49,12 @@ const ClusterOperatorHeader = props => Name Status Message - Version + Version ; const ClusterOperatorRow: React.SFC = ({obj}) => { const { status, message } = getStatusAndMessage(obj); + const operatorVersion = getClusterOperatorVersion(obj); return
@@ -62,7 +66,7 @@ const ClusterOperatorRow: React.SFC = ({obj}) => { {message ? _.truncate(message, { length: 256, separator: ' ' }) : '-'}
- {_.get(obj, 'status.version') || Unknown} + {operatorVersion || '-'}
; }; @@ -96,17 +100,50 @@ export const ClusterOperatorPage: React.SFC = props => rowFilters={filters} />; +const OperandVersions: React.SFC = ({versions}) => { + return _.isEmpty(versions) + ? + :
+
Name
{image.names.find(name => !name.includes('@')) || image.names[0]}{image.names.find(name => !name.includes('@')) || image.names[0]} {units.humanize(image.sizeBytes, 'decimalBytes', true).string || '-'}
+ + + + + + + + {_.map(versions, ({name, version}, i) => ( + + + + + ))} + +
NameVersion
{name}{version}
+
; +}; + + const ClusterOperatorDetails: React.SFC = ({obj}) => { const { status, message } = getStatusAndMessage(obj); - return
- - -
Status
-
-
Message
-
{message || '-'}
-
-
; + const versions: OperandVersion[] = _.get(obj, 'status.versions', []); + return ( + +
+ + +
Status
+
+
Message
+
{message || '-'}
+
+
+
+ + +
+
+ ); }; export const ClusterOperatorDetailsPage: React.SFC = props => @@ -121,7 +158,7 @@ type OperatorStatusIconAndLabelProps = { }; type ClusterOperatorRowProps = { - obj: K8sResourceKind; + obj: ClusterOperator; }; type ClusterOperatorPageProps = { @@ -129,8 +166,12 @@ type ClusterOperatorPageProps = { showTitle?: boolean; }; +type OperandVersionsProps = { + versions: OperandVersion[]; +}; + type ClusterOperatorDetailsProps = { - obj: K8sResourceKind; + obj: ClusterOperator; }; type ClusterOperatorDetailsPageProps = { diff --git a/frontend/public/components/factory/list.tsx b/frontend/public/components/factory/list.tsx index af95e45bb9b..987ddc47e3b 100644 --- a/frontend/public/components/factory/list.tsx +++ b/frontend/public/components/factory/list.tsx @@ -48,6 +48,7 @@ import { serviceCatalogStatus, serviceClassDisplayName, getClusterOperatorStatus, + getClusterOperatorVersion, } from '../../module/k8s'; const fuzzyCaseInsensitive = (a, b) => fuzzy(_.toLower(a), _.toLower(b)); @@ -236,6 +237,7 @@ const sorts = { silenceStateOrder, string: val => JSON.stringify(val), getClusterOperatorStatus, + getClusterOperatorVersion, }; export class ColHead extends React.Component { diff --git a/frontend/public/module/k8s/cluster-operator.ts b/frontend/public/module/k8s/cluster-operator.ts index ca509f32b2c..b08f024af26 100644 --- a/frontend/public/module/k8s/cluster-operator.ts +++ b/frontend/public/module/k8s/cluster-operator.ts @@ -1,6 +1,6 @@ /* eslint-disable no-unused-vars, no-undef */ import * as _ from 'lodash-es'; -import { K8sResourceKind } from '.'; +import { ClusterOperator, OperandVersion } from '.'; export enum OperatorStatus { Available = 'Available', @@ -9,7 +9,7 @@ export enum OperatorStatus { Unknown = 'Unknown', } -export const getStatusAndMessage = (operator: K8sResourceKind) => { +export const getStatusAndMessage = (operator: ClusterOperator) => { const conditions = _.get(operator, 'status.conditions'); const failing: any = _.find(conditions, { type: 'Failing', status: 'True' }); if (failing) { @@ -29,7 +29,13 @@ export const getStatusAndMessage = (operator: K8sResourceKind) => { return { status: OperatorStatus.Unknown, message: '' }; }; -export const getClusterOperatorStatus = (operator: K8sResourceKind) => { +export const getClusterOperatorStatus = (operator: ClusterOperator) => { const { status } = getStatusAndMessage(operator); return status; }; + +export const getClusterOperatorVersion = (operator: ClusterOperator) => { + const versions: OperandVersion[] = _.get(operator, 'status.versions', []); + const operatorVersion = _.find(versions, v => v.name === 'operator'); + return operatorVersion ? operatorVersion.version : ''; +}; diff --git a/frontend/public/module/k8s/index.ts b/frontend/public/module/k8s/index.ts index 7290384e0a1..69d20888207 100644 --- a/frontend/public/module/k8s/index.ts +++ b/frontend/public/module/k8s/index.ts @@ -242,6 +242,27 @@ export type ClusterVersionKind = { }; } & K8sResourceKind; +export type OperandVersion = { + name: string; + version: string; +}; + +type ClusterOperatorObjectReference = { + group: string; + resource: string; + namespace?: string; + name: string; +}; + +export type ClusterOperator = { + spec: {}; + status: { + conditions?: any[]; + versions?: OperandVersion[]; + relatedObjects?: ClusterOperatorObjectReference[]; + }; +} & K8sResourceKind; + export type K8sKind = { abbr: string; kind: string; From 9c9ee6b916d287dd1754eb37acf3515d9bb39694 Mon Sep 17 00:00:00 2001 From: sg00dwin Date: Tue, 19 Feb 2019 11:00:46 -0500 Subject: [PATCH 23/45] Make overview sidebar resource name a link - css adjustments to parent node so that .pull-left class isn't needed --- frontend/public/components/_resource.scss | 3 +-- frontend/public/components/monitoring.tsx | 6 +++--- frontend/public/components/utils/headings.tsx | 10 ++++++---- frontend/public/style/_common.scss | 2 ++ 4 files changed, 12 insertions(+), 9 deletions(-) diff --git a/frontend/public/components/_resource.scss b/frontend/public/components/_resource.scss index 033ed8ac2a8..308eb9f8f53 100644 --- a/frontend/public/components/_resource.scss +++ b/frontend/public/components/_resource.scss @@ -16,8 +16,7 @@ line-height: 21px; margin-right: 7px; min-width: 24px; - padding-left: 7px; - padding-right: 7px; + padding: 0 7px; } } diff --git a/frontend/public/components/monitoring.tsx b/frontend/public/components/monitoring.tsx index bb1e2c3eafa..a987f7d877c 100644 --- a/frontend/public/components/monitoring.tsx +++ b/frontend/public/components/monitoring.tsx @@ -201,7 +201,7 @@ const AlertsDetailsPage = withFallback(connect(alertStateToProps)((props: Alerts

-
{alertname}
+
{alertname}
{(state === AlertStates.Firing || state === AlertStates.Pending) &&
} @@ -323,7 +323,7 @@ const AlertRulesDetailsPage = withFallback(connect(ruleStateToProps)((props: Ale

-
{name}
+
{name}

@@ -412,7 +412,7 @@ const SilencesDetailsPage = withFallback(connect(silenceParamToProps)((props: Si

-
{name}
+
{name}

diff --git a/frontend/public/components/utils/headings.tsx b/frontend/public/components/utils/headings.tsx index 311db0174f3..cd1cf4600b7 100644 --- a/frontend/public/components/utils/headings.tsx +++ b/frontend/public/components/utils/headings.tsx @@ -3,7 +3,7 @@ import * as classNames from 'classnames'; import * as _ from 'lodash-es'; import { Link } from 'react-router-dom'; -import { ActionsMenu, ResourceIcon, KebabAction } from './index'; +import { ActionsMenu, ResourceIcon, KebabAction, resourcePath } from './index'; import { ClusterServiceVersionLogo } from '../operator-lifecycle-manager'; import { connectToModel } from '../../kinds'; import { ClusterServiceVersionModel } from '../../models'; @@ -48,7 +48,7 @@ export const PageHeading = connectToModel((props: PageHeadingProps) => { const logo = isCSV ? csvLogo() - :
{ kind && } {resourceTitle}
; + :
{ kind && } {resourceTitle}
; const hasButtonActions = !_.isEmpty(buttonActions); const hasMenuActions = !_.isEmpty(menuActions); const showActions = (hasButtonActions || hasMenuActions) && !_.isEmpty(data) && !_.get(data, 'deletionTimestamp'); @@ -73,8 +73,10 @@ export const SidebarSectionHeading: React.SFC = ({te export const ResourceOverviewHeading: React.SFC = ({kindObj, actions, resource}) =>

- - {resource.metadata.name} + + + {resource.metadata.name} +
a(kindObj, resource))} /> diff --git a/frontend/public/style/_common.scss b/frontend/public/style/_common.scss index ffd094ca88e..2e2279c04aa 100644 --- a/frontend/public/style/_common.scss +++ b/frontend/public/style/_common.scss @@ -101,6 +101,8 @@ .co-m-pane__name { @include co-break-word; + align-items: baseline; + display: flex; flex: 1; margin-right: 10px; min-width: 0; // necessary for wrapping since its a flex child From 099eb0c5d9cd747c05d5d85281e0be773bfe636d Mon Sep 17 00:00:00 2001 From: Robb Hamilton Date: Thu, 7 Mar 2019 15:43:50 -0500 Subject: [PATCH 24/45] Fix bug where update link lacked modal decorator --- .../public/components/cluster-settings/cluster-settings.tsx | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/public/components/cluster-settings/cluster-settings.tsx b/frontend/public/components/cluster-settings/cluster-settings.tsx index c8c375a05e1..914449600d6 100644 --- a/frontend/public/components/cluster-settings/cluster-settings.tsx +++ b/frontend/public/components/cluster-settings/cluster-settings.tsx @@ -99,7 +99,7 @@ const UpdateInProgressAlert = () =>
const UpdatesAvailableAlert = ({cv}) =>
Cluster update is available. -
; @@ -110,7 +110,7 @@ const UpdateStatus: React.SFC = ({cv}) => { return { status === ClusterUpdateStatus.UpdatesAvailable - ? + + + +
; + } +} + +type AddHTPasswdPageState = { + name: string; + login: boolean; + challenge: boolean; + mappingMethod: string; + htpasswdFileContent: string; + inProgress: boolean; + errorMessage: string; +}; diff --git a/frontend/public/components/cluster-settings/oauth.tsx b/frontend/public/components/cluster-settings/oauth.tsx index bea1c52a217..a46e3a62084 100644 --- a/frontend/public/components/cluster-settings/oauth.tsx +++ b/frontend/public/components/cluster-settings/oauth.tsx @@ -6,11 +6,13 @@ import { OAuthModel } from '../../models'; import { K8sResourceKind, referenceForModel } from '../../module/k8s'; import { DetailsPage } from '../factory'; import { + Dropdown, EmptyBox, Kebab, - navFactory, - SectionHeading, ResourceSummary, + SectionHeading, + history, + navFactory, } from '../utils'; import { formatDuration } from '../utils/datetime'; @@ -51,6 +53,9 @@ const IdentityProviders: React.SFC = ({identityProviders const OAuthDetails: React.SFC = ({obj}: {obj: K8sResourceKind}) => { const { identityProviders, tokenConfig = {} } = obj.spec; + const addIDPItems = { + htpasswd: 'HTPasswd', + }; return
@@ -61,9 +66,15 @@ const OAuthDetails: React.SFC = ({obj}: {obj: K8sResourceKind
-

+

Identity providers determine how users log into the cluster.

+ history.push(`/settings/idp/${name}`)} />
; diff --git a/frontend/public/components/nav.jsx b/frontend/public/components/nav.jsx index 5f52f49eac7..924bd29304a 100644 --- a/frontend/public/components/nav.jsx +++ b/frontend/public/components/nav.jsx @@ -265,7 +265,7 @@ const rolebindingsStartsWith = ['rolebindings', 'clusterrolebindings']; const quotaStartsWith = ['resourcequotas', 'clusterresourcequotas']; const imagestreamsStartsWith = ['imagestreams', 'imagestreamtags']; const monitoringAlertsStartsWith = ['monitoring/alerts', 'monitoring/alertrules']; -const clusterSettingsStartsWith = ['settings/cluster', 'config.openshift.io']; +const clusterSettingsStartsWith = ['settings/cluster', 'settings/idp', 'config.openshift.io']; const monitoringNavSectionStateToProps = (state) => ({ canAccess: !!state[featureReducerName].get(FLAGS.CAN_GET_NS), diff --git a/frontend/public/components/utils/file-input.tsx b/frontend/public/components/utils/file-input.tsx index ed2f91e2e36..00c8a9e2121 100644 --- a/frontend/public/components/utils/file-input.tsx +++ b/frontend/public/components/utils/file-input.tsx @@ -1,7 +1,8 @@ +/* eslint-disable no-undef, no-unused-vars */ + import * as React from 'react'; import * as classNames from 'classnames'; import { NativeTypes } from 'react-dnd-html5-backend'; -// eslint-disable-next-line no-unused-vars import { DropTarget, ConnectDropTarget, DropTargetMonitor } from 'react-dnd'; import withDragDropContext from './drag-drop-context'; @@ -41,7 +42,7 @@ export class FileInput extends React.Component { this.readFile(event.target.files[0]); } render() { - const { connectDropTarget, isOver, canDrop, id, isRequired } = this.props; + const { connectDropTarget, errorMessage, hideContents, isOver, canDrop, id, isRequired } = this.props; const klass = classNames('co-file-dropzone-container', {'co-file-dropzone--drop-over': isOver}); return ( connectDropTarget( @@ -66,14 +67,14 @@ export class FileInput extends React.Component {

{this.props.inputFieldHelpText}

- + }

{this.props.textareaFieldHelpText}

- { this.props.errorMessage &&
{this.props.errorMessage}
} + { errorMessage &&
{errorMessage}
}

@@ -148,38 +149,42 @@ export const DroppableFileInput = withDragDropContext(class DroppableFileInput e inputFileName={this.state.inputFileName} />; } }); -/* eslint-disable no-undef */ + export type DroppableFileInputProps = { - inputFileData: string, - onChange: Function, - label: string, - id: string, - inputFieldHelpText: string, - textareaFieldHelpText: string, - isRequired: boolean, + inputFileData: string; + onChange: Function; + label: string; + id: string; + inputFieldHelpText: string; + textareaFieldHelpText: string; + isRequired: boolean; + hideContents?: boolean; }; + export type DroppableFileInputState = { - inputFileData: string, - inputFileName: string, - errorMessage?: any, + inputFileData: string; + inputFileName: string; + errorMessage?: any; }; + export type FileInputState = { - inputFileData: string, - inputFileName: string, + inputFileData: string; + inputFileName: string; }; + export type FileInputProps = { - errorMessage: string, - connectDropTarget?: ConnectDropTarget, - isOver?: boolean, - canDrop?: boolean, - onDrop: (props: FileInputProps, monitor: DropTargetMonitor) => void, - inputFileData: string, - inputFileName: string, - onChange: Function, - label: string, - id: string, - inputFieldHelpText: string, - textareaFieldHelpText: string, - isRequired: boolean, + errorMessage: string; + connectDropTarget?: ConnectDropTarget; + isOver?: boolean; + canDrop?: boolean; + onDrop: (props: FileInputProps, monitor: DropTargetMonitor) => void; + inputFileData: string; + inputFileName: string; + onChange: Function; + label: string; + id: string; + inputFieldHelpText: string; + textareaFieldHelpText: string; + isRequired: boolean; + hideContents?: boolean; }; -/* eslint-enable no-undef */ diff --git a/frontend/public/style/_common.scss b/frontend/public/style/_common.scss index df87865a0c0..deb705c6830 100644 --- a/frontend/public/style/_common.scss +++ b/frontend/public/style/_common.scss @@ -166,11 +166,19 @@ } } +.co-m-pane__dropdown { + margin-bottom: 20px; +} + .co-m-pane__explanation { color: $color-pf-black-600; margin-bottom: 30px; } +.co-m-pane__explanation--alt { + margin-bottom: 20px; +} + .co-help-text { color: $color-pf-black-600; } From df9b3c58fa4b7079a63490280c00f6b3f25e3942 Mon Sep 17 00:00:00 2001 From: Jeffrey Phillips Date: Fri, 8 Mar 2019 16:59:25 -0500 Subject: [PATCH 32/45] Fix to correctly filter CSVs when navigating from Operator details dialog --- .../operator-hub/operator-hub-item-details.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/frontend/public/components/operator-hub/operator-hub-item-details.tsx b/frontend/public/components/operator-hub/operator-hub-item-details.tsx index c0fd3980c16..4a8e40c2746 100644 --- a/frontend/public/components/operator-hub/operator-hub-item-details.tsx +++ b/frontend/public/components/operator-hub/operator-hub-item-details.tsx @@ -1,6 +1,7 @@ /* eslint-disable no-undef, no-unused-vars */ import * as React from 'react'; +import * as _ from 'lodash-es'; import { Button, HintBlock, Modal } from 'patternfly-react'; import { CatalogItemHeader, PropertiesSidePanel, PropertyItem } from 'patternfly-react-extensions'; @@ -34,12 +35,18 @@ export const OperatorHubItemDetails: React.SFC = ({ const getHintBlock = () => { if (installed) { + const filterName = _.get(item.obj, 'status.channels[0].currentCSV', item.obj.metadata.name); return ( - This Operator has been installed on the cluster. View it here. + This Operator has been installed on the cluster.{' '} + + View it here. + } /> From 44dbdecdd389aad2f32d469727a1e3c0200f6781 Mon Sep 17 00:00:00 2001 From: Samuel Padgett Date: Fri, 8 Mar 2019 19:11:06 -0500 Subject: [PATCH 33/45] auth: change back-off interval when connecting to OAuth server on startup Try to connect every 10 seconds for 5 minutes. This will allow the console to report ready more quickly after the OAuth serer is ready during install. --- auth/auth.go | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/auth/auth.go b/auth/auth.go index 1eb18dac9a8..5569cd3ad45 100644 --- a/auth/auth.go +++ b/auth/auth.go @@ -140,9 +140,11 @@ func newHTTPClient(issuerCA string, includeSystemRoots bool) (*http.Client, erro // NewAuthenticator initializes an Authenticator struct. It blocks until the authenticator is // able to contact the provider. func NewAuthenticator(ctx context.Context, c *Config) (*Authenticator, error) { - // Retry connecting to the identity provider a few times - backoff := time.Second * 2 - maxSteps := 7 + // Retry connecting to the identity provider every 10s for 5 minutes + const ( + backoff = time.Second * 10 + maxSteps = 30 + ) steps := 0 for { @@ -194,7 +196,6 @@ func NewAuthenticator(ctx context.Context, c *Config) (*Authenticator, error) { log.Errorf("error contacting auth provider (retrying in %s): %v", backoff, err) time.Sleep(backoff) - backoff *= 2 continue } From 3d8b12c17217589a49c882a09fc9b3dea8a02f32 Mon Sep 17 00:00:00 2001 From: Joseph Caiani Date: Mon, 25 Feb 2019 17:23:49 -0500 Subject: [PATCH 34/45] Change Summary Page showPodSelector property to not show the pod selector. --- frontend/public/components/build-config.tsx | 2 +- frontend/public/components/build.tsx | 2 +- frontend/public/components/chargeback.tsx | 4 ++-- frontend/public/components/cluster-service-broker.tsx | 2 +- frontend/public/components/cluster-service-class.tsx | 2 +- frontend/public/components/cluster-service-plan.tsx | 2 +- .../public/components/cluster-settings/cluster-operator.tsx | 2 +- frontend/public/components/cluster-settings/oauth.tsx | 2 +- frontend/public/components/configmap.jsx | 2 +- frontend/public/components/cron-job.jsx | 2 +- frontend/public/components/daemon-set.jsx | 2 +- frontend/public/components/deployment-config.tsx | 2 +- frontend/public/components/deployment.jsx | 2 +- frontend/public/components/hpa.tsx | 2 +- frontend/public/components/image-stream-tag.tsx | 2 +- frontend/public/components/image-stream.tsx | 2 +- frontend/public/components/ingress.jsx | 2 +- frontend/public/components/job.jsx | 2 +- frontend/public/components/limit-range.tsx | 2 +- frontend/public/components/machine-config-pool.tsx | 2 +- frontend/public/components/machine-config.tsx | 2 +- frontend/public/components/machine-deployment.tsx | 2 +- frontend/public/components/machine-set.tsx | 2 +- frontend/public/components/machine.tsx | 2 +- frontend/public/components/namespace.jsx | 2 +- frontend/public/components/network-policy.jsx | 2 +- .../clusterserviceversion-resource.tsx | 2 +- .../operator-lifecycle-manager/clusterserviceversion.tsx | 2 +- .../components/operator-lifecycle-manager/install-plan.tsx | 2 +- .../components/operator-lifecycle-manager/subscription.tsx | 2 +- frontend/public/components/overview/daemon-set-overview.tsx | 2 +- .../public/components/overview/deployment-config-overview.tsx | 2 +- frontend/public/components/overview/deployment-overview.tsx | 2 +- frontend/public/components/overview/stateful-set-overview.tsx | 2 +- frontend/public/components/persistent-volume-claim.jsx | 2 +- frontend/public/components/persistent-volume.jsx | 2 +- frontend/public/components/pod.jsx | 2 +- frontend/public/components/replicaset.jsx | 2 +- frontend/public/components/replication-controller.jsx | 2 +- frontend/public/components/resource-quota.jsx | 2 +- frontend/public/components/routes.tsx | 2 +- frontend/public/components/secret.jsx | 2 +- frontend/public/components/service-account.jsx | 2 +- frontend/public/components/service-binding.tsx | 2 +- frontend/public/components/service-instance.tsx | 2 +- frontend/public/components/service.jsx | 2 +- frontend/public/components/stateful-set.jsx | 2 +- frontend/public/components/storage-class.tsx | 2 +- frontend/public/components/utils/details-page.tsx | 2 +- 49 files changed, 50 insertions(+), 50 deletions(-) diff --git a/frontend/public/components/build-config.tsx b/frontend/public/components/build-config.tsx index 3f576093c3e..522ea0514da 100644 --- a/frontend/public/components/build-config.tsx +++ b/frontend/public/components/build-config.tsx @@ -36,7 +36,7 @@ export const BuildConfigsDetails: React.SFC = ({obj: b
- +
diff --git a/frontend/public/components/build.tsx b/frontend/public/components/build.tsx index ef93c26315b..a57352e05ae 100644 --- a/frontend/public/components/build.tsx +++ b/frontend/public/components/build.tsx @@ -123,7 +123,7 @@ export const BuildsDetails: React.SFC = ({ obj: build }) =>
}
- + {triggeredBy &&
Triggered By
} {triggeredBy &&
{triggeredBy}
} {startTimestamp &&
Started
} diff --git a/frontend/public/components/chargeback.tsx b/frontend/public/components/chargeback.tsx index 9696d14a236..cae39237133 100644 --- a/frontend/public/components/chargeback.tsx +++ b/frontend/public/components/chargeback.tsx @@ -101,7 +101,7 @@ class ReportsDetails extends React.Component {
- +
@@ -439,7 +439,7 @@ const ReportGenerationQueriesDetails: React.SFC
- +
Query
{_.get(obj, ['spec', 'query'])}
diff --git a/frontend/public/components/cluster-service-broker.tsx b/frontend/public/components/cluster-service-broker.tsx index b39411e4e98..c8646e72beb 100644 --- a/frontend/public/components/cluster-service-broker.tsx +++ b/frontend/public/components/cluster-service-broker.tsx @@ -42,7 +42,7 @@ const ClusterServiceBrokerDetails: React.SFC =
- +
Last Catalog Retrieval Time
{serviceBroker.spec.insecureSkipTLSVerify &&
Insecure Skip TLS Verify
} diff --git a/frontend/public/components/cluster-service-class.tsx b/frontend/public/components/cluster-service-class.tsx index 3fd6ce7c7e9..cb27ce123d0 100644 --- a/frontend/public/components/cluster-service-class.tsx +++ b/frontend/public/components/cluster-service-class.tsx @@ -59,7 +59,7 @@ const ClusterServiceClassDetails: React.SFC = (
- +
External Name
{serviceClass.spec.externalName || '-'}
diff --git a/frontend/public/components/cluster-service-plan.tsx b/frontend/public/components/cluster-service-plan.tsx index d7256c05af0..9dc1ea7856b 100644 --- a/frontend/public/components/cluster-service-plan.tsx +++ b/frontend/public/components/cluster-service-plan.tsx @@ -32,7 +32,7 @@ const ClusterServicePlanDetails: React.SFC = ({o
- +
diff --git a/frontend/public/components/cluster-settings/cluster-operator.tsx b/frontend/public/components/cluster-settings/cluster-operator.tsx index 82b75ae4639..634081e4f15 100644 --- a/frontend/public/components/cluster-settings/cluster-operator.tsx +++ b/frontend/public/components/cluster-settings/cluster-operator.tsx @@ -131,7 +131,7 @@ const ClusterOperatorDetails: React.SFC = ({obj}) =
- +
Status
Message
diff --git a/frontend/public/components/cluster-settings/oauth.tsx b/frontend/public/components/cluster-settings/oauth.tsx index a46e3a62084..aaaef36be23 100644 --- a/frontend/public/components/cluster-settings/oauth.tsx +++ b/frontend/public/components/cluster-settings/oauth.tsx @@ -59,7 +59,7 @@ const OAuthDetails: React.SFC = ({obj}: {obj: K8sResourceKind return
- +
Access Token Max Age
{tokenDuration(tokenConfig.accessTokenMaxAgeSeconds)}
diff --git a/frontend/public/components/configmap.jsx b/frontend/public/components/configmap.jsx index bfc095cbb3c..91cab26b6e9 100644 --- a/frontend/public/components/configmap.jsx +++ b/frontend/public/components/configmap.jsx @@ -33,7 +33,7 @@ const ConfigMapDetails = ({obj: configMap}) => { return
- +
diff --git a/frontend/public/components/cron-job.jsx b/frontend/public/components/cron-job.jsx index d3f788e1b57..f2fbb2071a0 100644 --- a/frontend/public/components/cron-job.jsx +++ b/frontend/public/components/cron-job.jsx @@ -45,7 +45,7 @@ const Details = ({obj: cronjob}) => {
- +
Schedule
{cronjob.spec.schedule}
Concurrency Policy
diff --git a/frontend/public/components/daemon-set.jsx b/frontend/public/components/daemon-set.jsx index 99432b4244e..59c4527ee66 100644 --- a/frontend/public/components/daemon-set.jsx +++ b/frontend/public/components/daemon-set.jsx @@ -70,7 +70,7 @@ const Details = ({obj: daemonset}) =>
- +
diff --git a/frontend/public/components/deployment-config.tsx b/frontend/public/components/deployment-config.tsx index f28c97b1678..fbfd0beef2c 100644 --- a/frontend/public/components/deployment-config.tsx +++ b/frontend/public/components/deployment-config.tsx @@ -110,7 +110,7 @@ export const DeploymentConfigsDetails: React.SFC<{obj: any}> = ({obj: dc}) => {
- +
Status
{dc.status.availableReplicas === dc.status.updatedReplicas ? : }
diff --git a/frontend/public/components/deployment.jsx b/frontend/public/components/deployment.jsx index a7043971203..6d4049d5b59 100644 --- a/frontend/public/components/deployment.jsx +++ b/frontend/public/components/deployment.jsx @@ -74,7 +74,7 @@ const DeploymentDetails = ({obj: deployment}) => {
- +
Status
{deployment.status.availableReplicas === deployment.status.updatedReplicas ? : }
diff --git a/frontend/public/components/hpa.tsx b/frontend/public/components/hpa.tsx index e5d0599c81a..27ac621d141 100644 --- a/frontend/public/components/hpa.tsx +++ b/frontend/public/components/hpa.tsx @@ -131,7 +131,7 @@ export const HorizontalPodAutoscalersDetails: React.SFC
- +
diff --git a/frontend/public/components/image-stream-tag.tsx b/frontend/public/components/image-stream-tag.tsx index 8fb2b383445..91ced4a08c6 100644 --- a/frontend/public/components/image-stream-tag.tsx +++ b/frontend/public/components/image-stream-tag.tsx @@ -47,7 +47,7 @@ export const ImageStreamTagsDetails: React.SFC = ({
- + {labels.name &&
Image Name
} {labels.name &&
{labels.name}
} {labels.summary &&
Summary
} diff --git a/frontend/public/components/image-stream.tsx b/frontend/public/components/image-stream.tsx index 2a76182468e..cf4c74f433a 100644 --- a/frontend/public/components/image-stream.tsx +++ b/frontend/public/components/image-stream.tsx @@ -116,7 +116,7 @@ export const ImageStreamsDetails: React.SFC = ({obj: i return
- + {imageRepository &&
Image Repository
} {imageRepository &&
{imageRepository}
} {publicImageRepository &&
Public Image Repository
} diff --git a/frontend/public/components/ingress.jsx b/frontend/public/components/ingress.jsx index a3826176685..c5b2d15ff85 100644 --- a/frontend/public/components/ingress.jsx +++ b/frontend/public/components/ingress.jsx @@ -118,7 +118,7 @@ const RulesRows = (props) => { const Details = ({obj: ingress}) =>
- +
TLS Certificate
{getTLSCert(ingress)}
diff --git a/frontend/public/components/job.jsx b/frontend/public/components/job.jsx index a5c97807f71..790f9624ed2 100644 --- a/frontend/public/components/job.jsx +++ b/frontend/public/components/job.jsx @@ -57,7 +57,7 @@ const Details = ({obj: job}) =>
- +
Desired Completions
{job.spec.completions || '-'}
Parallelism
diff --git a/frontend/public/components/limit-range.tsx b/frontend/public/components/limit-range.tsx index 8be4fe1b7d4..af78a7f6216 100644 --- a/frontend/public/components/limit-range.tsx +++ b/frontend/public/components/limit-range.tsx @@ -101,7 +101,7 @@ export const LimitRangeDetailsList = (resource) => { const Details = ({obj: rq}) =>
- +
; diff --git a/frontend/public/components/machine-config-pool.tsx b/frontend/public/components/machine-config-pool.tsx index 9779d7cc20c..252ac9bbfb3 100644 --- a/frontend/public/components/machine-config-pool.tsx +++ b/frontend/public/components/machine-config-pool.tsx @@ -131,7 +131,7 @@ const MachineConfigPoolCounts: React.SFC = ({obj}) const MachineConfigPoolSummary: React.SFC = ({obj}) => { const machineConfigSelector = _.get(obj, 'spec.machineConfigSelector'); const machineSelector = _.get(obj, 'spec.machineSelector'); - return + return
Machine Config Selector
= ({obj}) => ( - +
OS Image URL
{obj.spec.osImageURL || '-'}
diff --git a/frontend/public/components/machine-deployment.tsx b/frontend/public/components/machine-deployment.tsx index 735c0c268db..74081d0a415 100644 --- a/frontend/public/components/machine-deployment.tsx +++ b/frontend/public/components/machine-deployment.tsx @@ -67,7 +67,7 @@ const MachineDeploymentDetails: React.SFC = ({obj
- +
Selector
= ({obj}) => {
- +
Selector
= ({obj}: {obj: MachineKind return
- + {nodeName &&
Node
diff --git a/frontend/public/components/namespace.jsx b/frontend/public/components/namespace.jsx index 7ab1b7ac9dd..1220b4a4b93 100644 --- a/frontend/public/components/namespace.jsx +++ b/frontend/public/components/namespace.jsx @@ -201,7 +201,7 @@ export const NamespaceSummary = ({ns}) => { const requester = getRequester(ns); return
- + {displayName &&
Display Name
} {displayName &&
{displayName}
} {requester &&
Requester
} diff --git a/frontend/public/components/network-policy.jsx b/frontend/public/components/network-policy.jsx index 06d27d80552..b041568f034 100644 --- a/frontend/public/components/network-policy.jsx +++ b/frontend/public/components/network-policy.jsx @@ -97,7 +97,7 @@ const Details_ = ({obj: np}) => { return
- +
diff --git a/frontend/public/components/operator-lifecycle-manager/clusterserviceversion-resource.tsx b/frontend/public/components/operator-lifecycle-manager/clusterserviceversion-resource.tsx index 97bbf01fdf2..57b4fb951ed 100644 --- a/frontend/public/components/operator-lifecycle-manager/clusterserviceversion-resource.tsx +++ b/frontend/public/components/operator-lifecycle-manager/clusterserviceversion-resource.tsx @@ -191,7 +191,7 @@ export const ClusterServiceVersionResourceDetails = connectToModel(
{ this.state.expanded - ? + ? :
Name
{metadata.name}
diff --git a/frontend/public/components/operator-lifecycle-manager/clusterserviceversion.tsx b/frontend/public/components/operator-lifecycle-manager/clusterserviceversion.tsx index f3a676500c9..219d0f31ad8 100644 --- a/frontend/public/components/operator-lifecycle-manager/clusterserviceversion.tsx +++ b/frontend/public/components/operator-lifecycle-manager/clusterserviceversion.tsx @@ -214,7 +214,7 @@ export const ClusterServiceVersionDetails: React.SFC
- +
Status
diff --git a/frontend/public/components/operator-lifecycle-manager/install-plan.tsx b/frontend/public/components/operator-lifecycle-manager/install-plan.tsx index 7ef44d26239..dc17c3d639a 100644 --- a/frontend/public/components/operator-lifecycle-manager/install-plan.tsx +++ b/frontend/public/components/operator-lifecycle-manager/install-plan.tsx @@ -94,7 +94,7 @@ export const InstallPlanDetails: React.SFC = ({obj}) =>
- +
diff --git a/frontend/public/components/operator-lifecycle-manager/subscription.tsx b/frontend/public/components/operator-lifecycle-manager/subscription.tsx index b2211b40d44..c118496f877 100644 --- a/frontend/public/components/operator-lifecycle-manager/subscription.tsx +++ b/frontend/public/components/operator-lifecycle-manager/subscription.tsx @@ -103,7 +103,7 @@ export const SubscriptionDetails: React.SFC = (props)
- +
diff --git a/frontend/public/components/overview/daemon-set-overview.tsx b/frontend/public/components/overview/daemon-set-overview.tsx index e65950e10e8..f5b0989ae73 100644 --- a/frontend/public/components/overview/daemon-set-overview.tsx +++ b/frontend/public/components/overview/daemon-set-overview.tsx @@ -15,7 +15,7 @@ import { ResourceOverviewDetails } from './resource-overview-details'; const DaemonSetOverviewDetails: React.SFC = ({item}) =>
- +
diff --git a/frontend/public/components/overview/deployment-config-overview.tsx b/frontend/public/components/overview/deployment-config-overview.tsx index 6ed903c7a31..a6925d6bcd1 100644 --- a/frontend/public/components/overview/deployment-config-overview.tsx +++ b/frontend/public/components/overview/deployment-config-overview.tsx @@ -23,7 +23,7 @@ const DeploymentConfigOverviewDetails: React.SFC
- +
Status
{ diff --git a/frontend/public/components/overview/deployment-overview.tsx b/frontend/public/components/overview/deployment-overview.tsx index f9acd7ae0b4..338f2416576 100644 --- a/frontend/public/components/overview/deployment-overview.tsx +++ b/frontend/public/components/overview/deployment-overview.tsx @@ -23,7 +23,7 @@ const DeploymentOverviewDetails: React.SFC = ({i
- +
Status
{ diff --git a/frontend/public/components/overview/stateful-set-overview.tsx b/frontend/public/components/overview/stateful-set-overview.tsx index 63d61d5b64f..b82d9f5ef47 100644 --- a/frontend/public/components/overview/stateful-set-overview.tsx +++ b/frontend/public/components/overview/stateful-set-overview.tsx @@ -10,7 +10,7 @@ import { ResourceOverviewDetails } from './resource-overview-details'; const StatefulSetOverviewDetails: React.SFC = ({item}) =>
- +
; const tabs = [ diff --git a/frontend/public/components/persistent-volume-claim.jsx b/frontend/public/components/persistent-volume-claim.jsx index ca06058e8c1..e21832ada84 100644 --- a/frontend/public/components/persistent-volume-claim.jsx +++ b/frontend/public/components/persistent-volume-claim.jsx @@ -50,7 +50,7 @@ const Details_ = ({flags, obj: pvc}) => {
- +
Label Selector
diff --git a/frontend/public/components/persistent-volume.jsx b/frontend/public/components/persistent-volume.jsx index 6dfb98ad0f8..8ef4e4e5b34 100644 --- a/frontend/public/components/persistent-volume.jsx +++ b/frontend/public/components/persistent-volume.jsx @@ -31,7 +31,7 @@ const Row = ({obj}) =>
const Details = ({obj}) =>
- +
; diff --git a/frontend/public/components/pod.jsx b/frontend/public/components/pod.jsx index 64e7d6b0b79..1dfdc3e2fee 100644 --- a/frontend/public/components/pod.jsx +++ b/frontend/public/components/pod.jsx @@ -189,7 +189,7 @@ export const PodDetailsList = ({pod}) => { }; export const PodResourceSummary = ({pod}) => ( - +
Node Selector
diff --git a/frontend/public/components/replicaset.jsx b/frontend/public/components/replicaset.jsx index 9d748a45cad..b459ca884d9 100644 --- a/frontend/public/components/replicaset.jsx +++ b/frontend/public/components/replicaset.jsx @@ -19,7 +19,7 @@ const Details = ({obj: replicaSet}) => {
- + {revision &&
Deployment Revision
{revision}
diff --git a/frontend/public/components/replication-controller.jsx b/frontend/public/components/replication-controller.jsx index d928d25de83..fc22dbebbad 100644 --- a/frontend/public/components/replication-controller.jsx +++ b/frontend/public/components/replication-controller.jsx @@ -14,7 +14,7 @@ const Details = ({obj: replicationController}) => {
- + {revision &&
Deployment Revision
{revision}
diff --git a/frontend/public/components/resource-quota.jsx b/frontend/public/components/resource-quota.jsx index 1f82c8fcffa..bc4d4ed73ed 100644 --- a/frontend/public/components/resource-quota.jsx +++ b/frontend/public/components/resource-quota.jsx @@ -166,7 +166,7 @@ const Details = ({obj: rq}) => { {showChartRow && }
- +
{scopes &&
diff --git a/frontend/public/components/routes.tsx b/frontend/public/components/routes.tsx index a237aad0aa1..7bf4e1fb5e1 100644 --- a/frontend/public/components/routes.tsx +++ b/frontend/public/components/routes.tsx @@ -213,7 +213,7 @@ const RouteDetails: React.SFC = ({obj: route}) =>
- +
{route.spec.to.kind}
diff --git a/frontend/public/components/secret.jsx b/frontend/public/components/secret.jsx index 1efc0e2c0ea..fe83b1a3654 100644 --- a/frontend/public/components/secret.jsx +++ b/frontend/public/components/secret.jsx @@ -66,7 +66,7 @@ const SecretDetails = ({obj: secret}) => { return
- +
diff --git a/frontend/public/components/service-account.jsx b/frontend/public/components/service-account.jsx index a4755f7e94d..d9707f4c2ec 100644 --- a/frontend/public/components/service-account.jsx +++ b/frontend/public/components/service-account.jsx @@ -112,7 +112,7 @@ const Details = ({obj: serviceaccount}) => {
- +
diff --git a/frontend/public/components/service-binding.tsx b/frontend/public/components/service-binding.tsx index e1a5c038ca6..46e876aa6db 100644 --- a/frontend/public/components/service-binding.tsx +++ b/frontend/public/components/service-binding.tsx @@ -38,7 +38,7 @@ const ServiceBindingDetails: React.SFC = ({obj: sb})
- +
diff --git a/frontend/public/components/service-instance.tsx b/frontend/public/components/service-instance.tsx index 28e69d0c471..a6d9d4346e4 100644 --- a/frontend/public/components/service-instance.tsx +++ b/frontend/public/components/service-instance.tsx @@ -117,7 +117,7 @@ const ServiceInstanceDetails: React.SFC = ({obj: si
- +
diff --git a/frontend/public/components/service.jsx b/frontend/public/components/service.jsx index f35f8cf8504..b09dd9e117b 100644 --- a/frontend/public/components/service.jsx +++ b/frontend/public/components/service.jsx @@ -115,7 +115,7 @@ const Details = ({obj: s}) =>
- +
Session Affinity
{s.spec.sessionAffinity || '-'}
diff --git a/frontend/public/components/stateful-set.jsx b/frontend/public/components/stateful-set.jsx index ad9d72ca2f4..d4a67b07c52 100644 --- a/frontend/public/components/stateful-set.jsx +++ b/frontend/public/components/stateful-set.jsx @@ -26,7 +26,7 @@ const Row = props =>
- +
diff --git a/frontend/public/components/storage-class.tsx b/frontend/public/components/storage-class.tsx index 6702c9ba1f8..23305219792 100644 --- a/frontend/public/components/storage-class.tsx +++ b/frontend/public/components/storage-class.tsx @@ -44,7 +44,7 @@ const StorageClassRow: React.SFC = ({obj}) => { const StorageClassDetails: React.SFC = ({obj}) =>
- +
Provisioner
{obj.provisioner || '-'}
Reclaim Policy
diff --git a/frontend/public/components/utils/details-page.tsx b/frontend/public/components/utils/details-page.tsx index 4be10aa7f8a..7b82ac7503e 100644 --- a/frontend/public/components/utils/details-page.tsx +++ b/frontend/public/components/utils/details-page.tsx @@ -15,7 +15,7 @@ export const detailsPage = (Component: React.ComponentType) => return ; }; -export const ResourceSummary: React.SFC = ({children, resource, showPodSelector = true, showNodeSelector = true, showAnnotations = true, podSelector = 'spec.selector'}) => { +export const ResourceSummary: React.SFC = ({children, resource, showPodSelector = false, showNodeSelector = true, showAnnotations = true, podSelector = 'spec.selector'}) => { const { metadata, type } = resource; const reference = referenceFor(resource); const model = modelFor(reference); From 6d9ed5a96b44b72e313cd50e03f429ae87db733a Mon Sep 17 00:00:00 2001 From: Joseph Caiani Date: Thu, 7 Mar 2019 10:36:04 -0500 Subject: [PATCH 35/45] toggle showNodeSelector default in details view --- frontend/public/components/build-config.tsx | 2 +- frontend/public/components/build.tsx | 2 +- frontend/public/components/chargeback.tsx | 2 +- frontend/public/components/cluster-service-broker.tsx | 2 +- frontend/public/components/cluster-service-class.tsx | 2 +- frontend/public/components/cluster-service-plan.tsx | 2 +- frontend/public/components/cluster-settings/oauth.tsx | 2 +- frontend/public/components/configmap.jsx | 2 +- frontend/public/components/cron-job.jsx | 2 +- frontend/public/components/daemon-set.jsx | 2 +- frontend/public/components/deployment-config.tsx | 2 +- frontend/public/components/deployment.jsx | 2 +- frontend/public/components/hpa.tsx | 2 +- frontend/public/components/image-stream-tag.tsx | 2 +- frontend/public/components/image-stream.tsx | 2 +- frontend/public/components/ingress.jsx | 2 +- frontend/public/components/job.jsx | 2 +- frontend/public/components/limit-range.tsx | 2 +- frontend/public/components/machine-config-pool.tsx | 2 +- frontend/public/components/machine-config.tsx | 2 +- frontend/public/components/machine-deployment.tsx | 2 +- frontend/public/components/machine-set.tsx | 2 +- frontend/public/components/machine.tsx | 2 +- frontend/public/components/namespace.jsx | 2 +- frontend/public/components/network-policy.jsx | 2 +- .../operator-lifecycle-manager/clusterserviceversion.tsx | 2 +- .../components/operator-lifecycle-manager/install-plan.tsx | 2 +- .../components/operator-lifecycle-manager/subscription.tsx | 2 +- frontend/public/components/overview/daemon-set-overview.tsx | 2 +- .../public/components/overview/deployment-config-overview.tsx | 2 +- frontend/public/components/overview/deployment-overview.tsx | 2 +- frontend/public/components/persistent-volume-claim.jsx | 2 +- frontend/public/components/pod.jsx | 2 +- frontend/public/components/replicaset.jsx | 2 +- frontend/public/components/replication-controller.jsx | 2 +- frontend/public/components/resource-quota.jsx | 2 +- frontend/public/components/routes.tsx | 2 +- frontend/public/components/secret.jsx | 2 +- frontend/public/components/service-account.jsx | 2 +- frontend/public/components/service-binding.tsx | 2 +- frontend/public/components/service-instance.tsx | 2 +- frontend/public/components/service.jsx | 2 +- frontend/public/components/stateful-set.jsx | 2 +- frontend/public/components/storage-class.tsx | 2 +- frontend/public/components/utils/details-page.tsx | 2 +- 45 files changed, 45 insertions(+), 45 deletions(-) diff --git a/frontend/public/components/build-config.tsx b/frontend/public/components/build-config.tsx index 522ea0514da..aa52fa08745 100644 --- a/frontend/public/components/build-config.tsx +++ b/frontend/public/components/build-config.tsx @@ -36,7 +36,7 @@ export const BuildConfigsDetails: React.SFC = ({obj: b
- +
diff --git a/frontend/public/components/build.tsx b/frontend/public/components/build.tsx index a57352e05ae..65b3206cdf7 100644 --- a/frontend/public/components/build.tsx +++ b/frontend/public/components/build.tsx @@ -123,7 +123,7 @@ export const BuildsDetails: React.SFC = ({ obj: build }) =>
}
- + {triggeredBy &&
Triggered By
} {triggeredBy &&
{triggeredBy}
} {startTimestamp &&
Started
} diff --git a/frontend/public/components/chargeback.tsx b/frontend/public/components/chargeback.tsx index cae39237133..b9c12ad4062 100644 --- a/frontend/public/components/chargeback.tsx +++ b/frontend/public/components/chargeback.tsx @@ -101,7 +101,7 @@ class ReportsDetails extends React.Component {
- +
diff --git a/frontend/public/components/cluster-service-broker.tsx b/frontend/public/components/cluster-service-broker.tsx index c8646e72beb..dfcbf5d12e2 100644 --- a/frontend/public/components/cluster-service-broker.tsx +++ b/frontend/public/components/cluster-service-broker.tsx @@ -42,7 +42,7 @@ const ClusterServiceBrokerDetails: React.SFC =
- +
Last Catalog Retrieval Time
{serviceBroker.spec.insecureSkipTLSVerify &&
Insecure Skip TLS Verify
} diff --git a/frontend/public/components/cluster-service-class.tsx b/frontend/public/components/cluster-service-class.tsx index cb27ce123d0..4a4c2698009 100644 --- a/frontend/public/components/cluster-service-class.tsx +++ b/frontend/public/components/cluster-service-class.tsx @@ -59,7 +59,7 @@ const ClusterServiceClassDetails: React.SFC = (
- +
External Name
{serviceClass.spec.externalName || '-'}
diff --git a/frontend/public/components/cluster-service-plan.tsx b/frontend/public/components/cluster-service-plan.tsx index 9dc1ea7856b..ee855705cf2 100644 --- a/frontend/public/components/cluster-service-plan.tsx +++ b/frontend/public/components/cluster-service-plan.tsx @@ -32,7 +32,7 @@ const ClusterServicePlanDetails: React.SFC = ({o
- +
diff --git a/frontend/public/components/cluster-settings/oauth.tsx b/frontend/public/components/cluster-settings/oauth.tsx index aaaef36be23..0e3ae64d0c7 100644 --- a/frontend/public/components/cluster-settings/oauth.tsx +++ b/frontend/public/components/cluster-settings/oauth.tsx @@ -59,7 +59,7 @@ const OAuthDetails: React.SFC = ({obj}: {obj: K8sResourceKind return
- +
Access Token Max Age
{tokenDuration(tokenConfig.accessTokenMaxAgeSeconds)}
diff --git a/frontend/public/components/configmap.jsx b/frontend/public/components/configmap.jsx index 91cab26b6e9..323f0a032ee 100644 --- a/frontend/public/components/configmap.jsx +++ b/frontend/public/components/configmap.jsx @@ -33,7 +33,7 @@ const ConfigMapDetails = ({obj: configMap}) => { return
- +
diff --git a/frontend/public/components/cron-job.jsx b/frontend/public/components/cron-job.jsx index f2fbb2071a0..efed5498895 100644 --- a/frontend/public/components/cron-job.jsx +++ b/frontend/public/components/cron-job.jsx @@ -45,7 +45,7 @@ const Details = ({obj: cronjob}) => {
- +
Schedule
{cronjob.spec.schedule}
Concurrency Policy
diff --git a/frontend/public/components/daemon-set.jsx b/frontend/public/components/daemon-set.jsx index 59c4527ee66..2d1ac65f576 100644 --- a/frontend/public/components/daemon-set.jsx +++ b/frontend/public/components/daemon-set.jsx @@ -70,7 +70,7 @@ const Details = ({obj: daemonset}) =>
- +
diff --git a/frontend/public/components/deployment-config.tsx b/frontend/public/components/deployment-config.tsx index fbfd0beef2c..7fc74f636c4 100644 --- a/frontend/public/components/deployment-config.tsx +++ b/frontend/public/components/deployment-config.tsx @@ -110,7 +110,7 @@ export const DeploymentConfigsDetails: React.SFC<{obj: any}> = ({obj: dc}) => {
- +
Status
{dc.status.availableReplicas === dc.status.updatedReplicas ? : }
diff --git a/frontend/public/components/deployment.jsx b/frontend/public/components/deployment.jsx index 6d4049d5b59..39236733995 100644 --- a/frontend/public/components/deployment.jsx +++ b/frontend/public/components/deployment.jsx @@ -74,7 +74,7 @@ const DeploymentDetails = ({obj: deployment}) => {
- +
Status
{deployment.status.availableReplicas === deployment.status.updatedReplicas ? : }
diff --git a/frontend/public/components/hpa.tsx b/frontend/public/components/hpa.tsx index 27ac621d141..5e54e224ec1 100644 --- a/frontend/public/components/hpa.tsx +++ b/frontend/public/components/hpa.tsx @@ -131,7 +131,7 @@ export const HorizontalPodAutoscalersDetails: React.SFC
- +
diff --git a/frontend/public/components/image-stream-tag.tsx b/frontend/public/components/image-stream-tag.tsx index 91ced4a08c6..ec669682f4e 100644 --- a/frontend/public/components/image-stream-tag.tsx +++ b/frontend/public/components/image-stream-tag.tsx @@ -47,7 +47,7 @@ export const ImageStreamTagsDetails: React.SFC = ({
- + {labels.name &&
Image Name
} {labels.name &&
{labels.name}
} {labels.summary &&
Summary
} diff --git a/frontend/public/components/image-stream.tsx b/frontend/public/components/image-stream.tsx index cf4c74f433a..09771a6ff4c 100644 --- a/frontend/public/components/image-stream.tsx +++ b/frontend/public/components/image-stream.tsx @@ -116,7 +116,7 @@ export const ImageStreamsDetails: React.SFC = ({obj: i return
- + {imageRepository &&
Image Repository
} {imageRepository &&
{imageRepository}
} {publicImageRepository &&
Public Image Repository
} diff --git a/frontend/public/components/ingress.jsx b/frontend/public/components/ingress.jsx index c5b2d15ff85..f6b38d668a0 100644 --- a/frontend/public/components/ingress.jsx +++ b/frontend/public/components/ingress.jsx @@ -118,7 +118,7 @@ const RulesRows = (props) => { const Details = ({obj: ingress}) =>
- +
TLS Certificate
{getTLSCert(ingress)}
diff --git a/frontend/public/components/job.jsx b/frontend/public/components/job.jsx index 790f9624ed2..3f0c7edebbc 100644 --- a/frontend/public/components/job.jsx +++ b/frontend/public/components/job.jsx @@ -57,7 +57,7 @@ const Details = ({obj: job}) =>
- +
Desired Completions
{job.spec.completions || '-'}
Parallelism
diff --git a/frontend/public/components/limit-range.tsx b/frontend/public/components/limit-range.tsx index af78a7f6216..70168250b1a 100644 --- a/frontend/public/components/limit-range.tsx +++ b/frontend/public/components/limit-range.tsx @@ -101,7 +101,7 @@ export const LimitRangeDetailsList = (resource) => { const Details = ({obj: rq}) =>
- +
; diff --git a/frontend/public/components/machine-config-pool.tsx b/frontend/public/components/machine-config-pool.tsx index 252ac9bbfb3..4bd20b91ae4 100644 --- a/frontend/public/components/machine-config-pool.tsx +++ b/frontend/public/components/machine-config-pool.tsx @@ -131,7 +131,7 @@ const MachineConfigPoolCounts: React.SFC = ({obj}) const MachineConfigPoolSummary: React.SFC = ({obj}) => { const machineConfigSelector = _.get(obj, 'spec.machineConfigSelector'); const machineSelector = _.get(obj, 'spec.machineSelector'); - return + return
Machine Config Selector
= ({obj}) => ( - +
OS Image URL
{obj.spec.osImageURL || '-'}
diff --git a/frontend/public/components/machine-deployment.tsx b/frontend/public/components/machine-deployment.tsx index 74081d0a415..0d13b6bbbb3 100644 --- a/frontend/public/components/machine-deployment.tsx +++ b/frontend/public/components/machine-deployment.tsx @@ -67,7 +67,7 @@ const MachineDeploymentDetails: React.SFC = ({obj
- +
Selector
= ({obj}) => {
- +
Selector
= ({obj}: {obj: MachineKind return
- + {nodeName &&
Node
diff --git a/frontend/public/components/namespace.jsx b/frontend/public/components/namespace.jsx index 1220b4a4b93..cccaccbc8c0 100644 --- a/frontend/public/components/namespace.jsx +++ b/frontend/public/components/namespace.jsx @@ -201,7 +201,7 @@ export const NamespaceSummary = ({ns}) => { const requester = getRequester(ns); return
- + {displayName &&
Display Name
} {displayName &&
{displayName}
} {requester &&
Requester
} diff --git a/frontend/public/components/network-policy.jsx b/frontend/public/components/network-policy.jsx index b041568f034..a6e4b385d21 100644 --- a/frontend/public/components/network-policy.jsx +++ b/frontend/public/components/network-policy.jsx @@ -97,7 +97,7 @@ const Details_ = ({obj: np}) => { return
- +
diff --git a/frontend/public/components/operator-lifecycle-manager/clusterserviceversion.tsx b/frontend/public/components/operator-lifecycle-manager/clusterserviceversion.tsx index 219d0f31ad8..d9c873512cb 100644 --- a/frontend/public/components/operator-lifecycle-manager/clusterserviceversion.tsx +++ b/frontend/public/components/operator-lifecycle-manager/clusterserviceversion.tsx @@ -214,7 +214,7 @@ export const ClusterServiceVersionDetails: React.SFC
- +
Status
diff --git a/frontend/public/components/operator-lifecycle-manager/install-plan.tsx b/frontend/public/components/operator-lifecycle-manager/install-plan.tsx index dc17c3d639a..353dd3b2a66 100644 --- a/frontend/public/components/operator-lifecycle-manager/install-plan.tsx +++ b/frontend/public/components/operator-lifecycle-manager/install-plan.tsx @@ -94,7 +94,7 @@ export const InstallPlanDetails: React.SFC = ({obj}) =>
- +
diff --git a/frontend/public/components/operator-lifecycle-manager/subscription.tsx b/frontend/public/components/operator-lifecycle-manager/subscription.tsx index c118496f877..18efdf8c8d3 100644 --- a/frontend/public/components/operator-lifecycle-manager/subscription.tsx +++ b/frontend/public/components/operator-lifecycle-manager/subscription.tsx @@ -103,7 +103,7 @@ export const SubscriptionDetails: React.SFC = (props)
- +
diff --git a/frontend/public/components/overview/daemon-set-overview.tsx b/frontend/public/components/overview/daemon-set-overview.tsx index f5b0989ae73..58dc1311c3a 100644 --- a/frontend/public/components/overview/daemon-set-overview.tsx +++ b/frontend/public/components/overview/daemon-set-overview.tsx @@ -15,7 +15,7 @@ import { ResourceOverviewDetails } from './resource-overview-details'; const DaemonSetOverviewDetails: React.SFC = ({item}) =>
- +
diff --git a/frontend/public/components/overview/deployment-config-overview.tsx b/frontend/public/components/overview/deployment-config-overview.tsx index a6925d6bcd1..dd82b98cd61 100644 --- a/frontend/public/components/overview/deployment-config-overview.tsx +++ b/frontend/public/components/overview/deployment-config-overview.tsx @@ -23,7 +23,7 @@ const DeploymentConfigOverviewDetails: React.SFC
- +
Status
{ diff --git a/frontend/public/components/overview/deployment-overview.tsx b/frontend/public/components/overview/deployment-overview.tsx index 338f2416576..48b779b2930 100644 --- a/frontend/public/components/overview/deployment-overview.tsx +++ b/frontend/public/components/overview/deployment-overview.tsx @@ -23,7 +23,7 @@ const DeploymentOverviewDetails: React.SFC = ({i
- +
Status
{ diff --git a/frontend/public/components/persistent-volume-claim.jsx b/frontend/public/components/persistent-volume-claim.jsx index e21832ada84..4e52b5b41ee 100644 --- a/frontend/public/components/persistent-volume-claim.jsx +++ b/frontend/public/components/persistent-volume-claim.jsx @@ -50,7 +50,7 @@ const Details_ = ({flags, obj: pvc}) => {
- +
Label Selector
diff --git a/frontend/public/components/pod.jsx b/frontend/public/components/pod.jsx index 1dfdc3e2fee..8b17a1df05e 100644 --- a/frontend/public/components/pod.jsx +++ b/frontend/public/components/pod.jsx @@ -189,7 +189,7 @@ export const PodDetailsList = ({pod}) => { }; export const PodResourceSummary = ({pod}) => ( - +
Node Selector
diff --git a/frontend/public/components/replicaset.jsx b/frontend/public/components/replicaset.jsx index b459ca884d9..259ebdc47dd 100644 --- a/frontend/public/components/replicaset.jsx +++ b/frontend/public/components/replicaset.jsx @@ -19,7 +19,7 @@ const Details = ({obj: replicaSet}) => {
- + {revision &&
Deployment Revision
{revision}
diff --git a/frontend/public/components/replication-controller.jsx b/frontend/public/components/replication-controller.jsx index fc22dbebbad..6de76fd19d6 100644 --- a/frontend/public/components/replication-controller.jsx +++ b/frontend/public/components/replication-controller.jsx @@ -14,7 +14,7 @@ const Details = ({obj: replicationController}) => {
- + {revision &&
Deployment Revision
{revision}
diff --git a/frontend/public/components/resource-quota.jsx b/frontend/public/components/resource-quota.jsx index bc4d4ed73ed..6b680182948 100644 --- a/frontend/public/components/resource-quota.jsx +++ b/frontend/public/components/resource-quota.jsx @@ -166,7 +166,7 @@ const Details = ({obj: rq}) => { {showChartRow && }
- +
{scopes &&
diff --git a/frontend/public/components/routes.tsx b/frontend/public/components/routes.tsx index 7bf4e1fb5e1..4e6fc6546e5 100644 --- a/frontend/public/components/routes.tsx +++ b/frontend/public/components/routes.tsx @@ -213,7 +213,7 @@ const RouteDetails: React.SFC = ({obj: route}) =>
- +
{route.spec.to.kind}
diff --git a/frontend/public/components/secret.jsx b/frontend/public/components/secret.jsx index fe83b1a3654..96cb81d53c6 100644 --- a/frontend/public/components/secret.jsx +++ b/frontend/public/components/secret.jsx @@ -66,7 +66,7 @@ const SecretDetails = ({obj: secret}) => { return
- +
diff --git a/frontend/public/components/service-account.jsx b/frontend/public/components/service-account.jsx index d9707f4c2ec..b2410cb1bf3 100644 --- a/frontend/public/components/service-account.jsx +++ b/frontend/public/components/service-account.jsx @@ -112,7 +112,7 @@ const Details = ({obj: serviceaccount}) => {
- +
diff --git a/frontend/public/components/service-binding.tsx b/frontend/public/components/service-binding.tsx index 46e876aa6db..02b5b269e05 100644 --- a/frontend/public/components/service-binding.tsx +++ b/frontend/public/components/service-binding.tsx @@ -38,7 +38,7 @@ const ServiceBindingDetails: React.SFC = ({obj: sb})
- +
diff --git a/frontend/public/components/service-instance.tsx b/frontend/public/components/service-instance.tsx index a6d9d4346e4..f076067fd0f 100644 --- a/frontend/public/components/service-instance.tsx +++ b/frontend/public/components/service-instance.tsx @@ -117,7 +117,7 @@ const ServiceInstanceDetails: React.SFC = ({obj: si
- +
diff --git a/frontend/public/components/service.jsx b/frontend/public/components/service.jsx index b09dd9e117b..68bbc4d10d4 100644 --- a/frontend/public/components/service.jsx +++ b/frontend/public/components/service.jsx @@ -115,7 +115,7 @@ const Details = ({obj: s}) =>
- +
Session Affinity
{s.spec.sessionAffinity || '-'}
diff --git a/frontend/public/components/stateful-set.jsx b/frontend/public/components/stateful-set.jsx index d4a67b07c52..579720d26c6 100644 --- a/frontend/public/components/stateful-set.jsx +++ b/frontend/public/components/stateful-set.jsx @@ -26,7 +26,7 @@ const Row = props =>
- +
diff --git a/frontend/public/components/storage-class.tsx b/frontend/public/components/storage-class.tsx index 23305219792..f6a5e524061 100644 --- a/frontend/public/components/storage-class.tsx +++ b/frontend/public/components/storage-class.tsx @@ -44,7 +44,7 @@ const StorageClassRow: React.SFC = ({obj}) => { const StorageClassDetails: React.SFC = ({obj}) =>
- +
Provisioner
{obj.provisioner || '-'}
Reclaim Policy
diff --git a/frontend/public/components/utils/details-page.tsx b/frontend/public/components/utils/details-page.tsx index 7b82ac7503e..df11dfba345 100644 --- a/frontend/public/components/utils/details-page.tsx +++ b/frontend/public/components/utils/details-page.tsx @@ -15,7 +15,7 @@ export const detailsPage = (Component: React.ComponentType) => return ; }; -export const ResourceSummary: React.SFC = ({children, resource, showPodSelector = false, showNodeSelector = true, showAnnotations = true, podSelector = 'spec.selector'}) => { +export const ResourceSummary: React.SFC = ({children, resource, showPodSelector = false, showNodeSelector = false, showAnnotations = true, podSelector = 'spec.selector'}) => { const { metadata, type } = resource; const reference = referenceFor(resource); const model = modelFor(reference); From 1ecf46737f11f488e08634ae90fdc5396171f4e2 Mon Sep 17 00:00:00 2001 From: Joseph Caiani Date: Fri, 8 Mar 2019 17:03:26 -0500 Subject: [PATCH 36/45] updates based on code review --- frontend/public/components/chargeback.tsx | 4 ++-- frontend/public/components/cron-job.jsx | 2 +- frontend/public/components/daemon-set.jsx | 2 +- frontend/public/components/deployment-config.tsx | 2 +- frontend/public/components/deployment.jsx | 2 +- frontend/public/components/job.jsx | 2 +- frontend/public/components/network-policy.jsx | 2 +- frontend/public/components/overview/daemon-set-overview.tsx | 2 +- .../public/components/overview/deployment-config-overview.tsx | 2 +- frontend/public/components/overview/deployment-overview.tsx | 2 +- frontend/public/components/overview/stateful-set-overview.tsx | 2 +- frontend/public/components/persistent-volume.jsx | 2 +- frontend/public/components/pod.jsx | 2 +- frontend/public/components/replicaset.jsx | 2 +- frontend/public/components/replication-controller.jsx | 2 +- frontend/public/components/service.jsx | 2 +- frontend/public/components/stateful-set.jsx | 2 +- 17 files changed, 18 insertions(+), 18 deletions(-) diff --git a/frontend/public/components/chargeback.tsx b/frontend/public/components/chargeback.tsx index b9c12ad4062..67b3534d33e 100644 --- a/frontend/public/components/chargeback.tsx +++ b/frontend/public/components/chargeback.tsx @@ -101,7 +101,7 @@ class ReportsDetails extends React.Component {
- +
@@ -439,7 +439,7 @@ const ReportGenerationQueriesDetails: React.SFC
- +
Query
{_.get(obj, ['spec', 'query'])}
diff --git a/frontend/public/components/cron-job.jsx b/frontend/public/components/cron-job.jsx index efed5498895..51bfcd8aa52 100644 --- a/frontend/public/components/cron-job.jsx +++ b/frontend/public/components/cron-job.jsx @@ -45,7 +45,7 @@ const Details = ({obj: cronjob}) => {
- +
Schedule
{cronjob.spec.schedule}
Concurrency Policy
diff --git a/frontend/public/components/daemon-set.jsx b/frontend/public/components/daemon-set.jsx index 2d1ac65f576..d264f26f16a 100644 --- a/frontend/public/components/daemon-set.jsx +++ b/frontend/public/components/daemon-set.jsx @@ -70,7 +70,7 @@ const Details = ({obj: daemonset}) =>
- +
diff --git a/frontend/public/components/deployment-config.tsx b/frontend/public/components/deployment-config.tsx index 7fc74f636c4..972002da3de 100644 --- a/frontend/public/components/deployment-config.tsx +++ b/frontend/public/components/deployment-config.tsx @@ -110,7 +110,7 @@ export const DeploymentConfigsDetails: React.SFC<{obj: any}> = ({obj: dc}) => {
- +
Status
{dc.status.availableReplicas === dc.status.updatedReplicas ? : }
diff --git a/frontend/public/components/deployment.jsx b/frontend/public/components/deployment.jsx index 39236733995..5baf822d41a 100644 --- a/frontend/public/components/deployment.jsx +++ b/frontend/public/components/deployment.jsx @@ -74,7 +74,7 @@ const DeploymentDetails = ({obj: deployment}) => {
- +
Status
{deployment.status.availableReplicas === deployment.status.updatedReplicas ? : }
diff --git a/frontend/public/components/job.jsx b/frontend/public/components/job.jsx index 3f0c7edebbc..13f8e14318a 100644 --- a/frontend/public/components/job.jsx +++ b/frontend/public/components/job.jsx @@ -57,7 +57,7 @@ const Details = ({obj: job}) =>
- +
Desired Completions
{job.spec.completions || '-'}
Parallelism
diff --git a/frontend/public/components/network-policy.jsx b/frontend/public/components/network-policy.jsx index a6e4b385d21..7220783acf9 100644 --- a/frontend/public/components/network-policy.jsx +++ b/frontend/public/components/network-policy.jsx @@ -97,7 +97,7 @@ const Details_ = ({obj: np}) => { return
- +
diff --git a/frontend/public/components/overview/daemon-set-overview.tsx b/frontend/public/components/overview/daemon-set-overview.tsx index 58dc1311c3a..3e886714883 100644 --- a/frontend/public/components/overview/daemon-set-overview.tsx +++ b/frontend/public/components/overview/daemon-set-overview.tsx @@ -15,7 +15,7 @@ import { ResourceOverviewDetails } from './resource-overview-details'; const DaemonSetOverviewDetails: React.SFC = ({item}) =>
- +
diff --git a/frontend/public/components/overview/deployment-config-overview.tsx b/frontend/public/components/overview/deployment-config-overview.tsx index dd82b98cd61..c7251966316 100644 --- a/frontend/public/components/overview/deployment-config-overview.tsx +++ b/frontend/public/components/overview/deployment-config-overview.tsx @@ -23,7 +23,7 @@ const DeploymentConfigOverviewDetails: React.SFC
- +
Status
{ diff --git a/frontend/public/components/overview/deployment-overview.tsx b/frontend/public/components/overview/deployment-overview.tsx index 48b779b2930..f1ae5356148 100644 --- a/frontend/public/components/overview/deployment-overview.tsx +++ b/frontend/public/components/overview/deployment-overview.tsx @@ -23,7 +23,7 @@ const DeploymentOverviewDetails: React.SFC = ({i
- +
Status
{ diff --git a/frontend/public/components/overview/stateful-set-overview.tsx b/frontend/public/components/overview/stateful-set-overview.tsx index b82d9f5ef47..f8c3dc0a7b1 100644 --- a/frontend/public/components/overview/stateful-set-overview.tsx +++ b/frontend/public/components/overview/stateful-set-overview.tsx @@ -10,7 +10,7 @@ import { ResourceOverviewDetails } from './resource-overview-details'; const StatefulSetOverviewDetails: React.SFC = ({item}) =>
- +
; const tabs = [ diff --git a/frontend/public/components/persistent-volume.jsx b/frontend/public/components/persistent-volume.jsx index 8ef4e4e5b34..7795c6a6ce1 100644 --- a/frontend/public/components/persistent-volume.jsx +++ b/frontend/public/components/persistent-volume.jsx @@ -31,7 +31,7 @@ const Row = ({obj}) =>
const Details = ({obj}) =>
- +
; diff --git a/frontend/public/components/pod.jsx b/frontend/public/components/pod.jsx index 8b17a1df05e..165c82407bc 100644 --- a/frontend/public/components/pod.jsx +++ b/frontend/public/components/pod.jsx @@ -189,7 +189,7 @@ export const PodDetailsList = ({pod}) => { }; export const PodResourceSummary = ({pod}) => ( - +
Node Selector
diff --git a/frontend/public/components/replicaset.jsx b/frontend/public/components/replicaset.jsx index 259ebdc47dd..d5dcd95f6c7 100644 --- a/frontend/public/components/replicaset.jsx +++ b/frontend/public/components/replicaset.jsx @@ -19,7 +19,7 @@ const Details = ({obj: replicaSet}) => {
- + {revision &&
Deployment Revision
{revision}
diff --git a/frontend/public/components/replication-controller.jsx b/frontend/public/components/replication-controller.jsx index 6de76fd19d6..9eac4b80f2f 100644 --- a/frontend/public/components/replication-controller.jsx +++ b/frontend/public/components/replication-controller.jsx @@ -14,7 +14,7 @@ const Details = ({obj: replicationController}) => {
- + {revision &&
Deployment Revision
{revision}
diff --git a/frontend/public/components/service.jsx b/frontend/public/components/service.jsx index 68bbc4d10d4..0b10ae5ff02 100644 --- a/frontend/public/components/service.jsx +++ b/frontend/public/components/service.jsx @@ -115,7 +115,7 @@ const Details = ({obj: s}) =>
- +
Session Affinity
{s.spec.sessionAffinity || '-'}
diff --git a/frontend/public/components/stateful-set.jsx b/frontend/public/components/stateful-set.jsx index 579720d26c6..50f976d5521 100644 --- a/frontend/public/components/stateful-set.jsx +++ b/frontend/public/components/stateful-set.jsx @@ -26,7 +26,7 @@ const Row = props =>
- +
From 8d9f0a3a96f590614fc2bdf9729adfd323efacd9 Mon Sep 17 00:00:00 2001 From: Robb Hamilton Date: Wed, 9 Jan 2019 11:20:03 -0500 Subject: [PATCH 37/45] Bump patternfly* to latest versions to pick up bug fixes --- frontend/package.json | 8 +- frontend/public/components/about-modal.jsx | 1 - .../public/components/masthead-toolbar.jsx | 6 +- frontend/public/components/masthead.jsx | 11 +- frontend/public/components/nav.jsx | 13 +- frontend/public/style/_layout.scss | 5 +- frontend/public/style/_overrides.scss | 96 ++++++---- frontend/public/style/_vars.scss | 2 +- frontend/public/vendor.scss | 14 +- frontend/yarn.lock | 168 +++++++++++------- 10 files changed, 194 insertions(+), 130 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 7c882c8e30a..08ead58ee1d 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -53,8 +53,8 @@ ] }, "dependencies": { - "@patternfly/patternfly-next": "^1.0.109", - "@patternfly/react-core": "^1.43.5", + "@patternfly/patternfly": "1.0.219", + "@patternfly/react-core": "2.4.1", "brace": "0.11.x", "classnames": "2.x", "core-js": "2.x", @@ -69,8 +69,8 @@ "murmurhash-js": "1.0.x", "openshift-logos-icon": "1.7.1", "patternfly": "^3.59.0", - "patternfly-react": "^2.29.1", - "patternfly-react-extensions": "2.14.1", + "patternfly-react": "2.29.17", + "patternfly-react-extensions": "2.16.19", "plotly.js": "1.44.4", "prop-types": "15.6.x", "react": "16.6.3", diff --git a/frontend/public/components/about-modal.jsx b/frontend/public/components/about-modal.jsx index 55fcc4d15d9..8d10eeee09b 100644 --- a/frontend/public/components/about-modal.jsx +++ b/frontend/public/components/about-modal.jsx @@ -39,7 +39,6 @@ class AboutModal_ extends React.Component { brandImageAlt={details.logoAlt} logoImageSrc={details.logoImg} logoImageAlt={details.logoAlt} - heroImageSrc={details.backgroundImg} >

OpenShift is Red Hat's container application platform that allows developers to quickly develop, host, and scale applications in a cloud environment.

diff --git a/frontend/public/components/masthead-toolbar.jsx b/frontend/public/components/masthead-toolbar.jsx index e914cc70bef..4c336190b4e 100644 --- a/frontend/public/components/masthead-toolbar.jsx +++ b/frontend/public/components/masthead-toolbar.jsx @@ -239,7 +239,7 @@ class MastheadToolbar_ extends React.Component { return ( - + {/* desktop -- (updates button) */} @@ -285,9 +285,9 @@ class MastheadToolbar_ extends React.Component { {/* mobile -- kebab dropdown [(cluster manager |) documentation, about (| logout)] */} - {this._renderMenu(true)} + {this._renderMenu(true)} {/* desktop -- (user dropdown [logout]) */} - {this._renderMenu(false)} + {this._renderMenu(false)} {showAboutModal && } diff --git a/frontend/public/components/masthead.jsx b/frontend/public/components/masthead.jsx index 338f9cc2260..8416cbfdd5b 100644 --- a/frontend/public/components/masthead.jsx +++ b/frontend/public/components/masthead.jsx @@ -10,49 +10,42 @@ import ocpLogoImg from '../imgs/openshift-platform-logo.svg'; import onlineLogoImg from '../imgs/openshift-online-logo.svg'; import dedicatedLogoImg from '../imgs/openshift-dedicated-logo.svg'; import azureLogoImg from '../imgs/azure-red-hat-openshift-logo.svg'; -import * as pfBg992 from '../../public/imgs/pfbg_992.jpg'; export const getBrandingDetails = () => { - let backgroundImg, logoImg, logoAlt, productTitle; + let logoImg, logoAlt, productTitle; // Webpack won't bundle these images if we don't directly reference them, hence the switch switch (window.SERVER_FLAGS.branding) { case 'openshift': - backgroundImg = pfBg992; logoImg = openshiftLogoImg; logoAlt = 'OpenShift'; productTitle = 'Red Hat OpenShift'; break; case 'ocp': - backgroundImg = pfBg992; logoImg = ocpLogoImg; logoAlt = 'OpenShift Container Platform'; productTitle = 'Red Hat OpenShift Container Platform'; break; case 'online': - backgroundImg = pfBg992; logoImg = onlineLogoImg; logoAlt = 'OpenShift Online'; productTitle = 'Red Hat OpenShift Online'; break; case 'dedicated': - backgroundImg = pfBg992; logoImg = dedicatedLogoImg; logoAlt = 'OpenShift Dedicated'; productTitle = 'Red Hat OpenShift Dedicated'; break; case 'azure': - backgroundImg = pfBg992; logoImg = azureLogoImg; logoAlt = 'Azure Red Hat OpenShift'; productTitle = 'Azure Red Hat OpenShift'; break; default: - backgroundImg = pfBg992; logoImg = okdLogoImg; logoAlt = 'OKD'; productTitle = 'OKD'; } - return { backgroundImg, logoImg, logoAlt, productTitle }; + return { logoImg, logoAlt, productTitle }; }; export const Masthead = ({ onNavToggle }) => { diff --git a/frontend/public/components/nav.jsx b/frontend/public/components/nav.jsx index 924bd29304a..37f81899a4b 100644 --- a/frontend/public/components/nav.jsx +++ b/frontend/public/components/nav.jsx @@ -55,13 +55,13 @@ class NavLink extends React.PureComponent { } render() { - const { isActive, id, name, onClick } = this.props; + const { isActive, isSeparated, id, name, onClick } = this.props; // onClick is now handled globally by the Nav's onSelect, // however onClick can still be passed if desired in certain cases return ( - + this.toggle_(e, val); this.state = { isOpen: false, activeChild: null }; const activeChild = this.getActiveChild(); @@ -215,6 +216,10 @@ const NavSection = connect(navSectionStateToProps)( this.setState(state); } + toggle_(e, expandState) { + this.setState({isOpen: expandState}); + } + render() { if (!this.props.canRender) { return null; @@ -239,7 +244,7 @@ const NavSection = connect(navSectionStateToProps)( }); return Children ? ( - + {Children} ) : null; @@ -339,7 +344,7 @@ export const Navigation = ({ isNavOpen, onNavSelect }) => { - + diff --git a/frontend/public/style/_layout.scss b/frontend/public/style/_layout.scss index 3da309f7c67..fca95d70cbb 100644 --- a/frontend/public/style/_layout.scss +++ b/frontend/public/style/_layout.scss @@ -10,6 +10,7 @@ body, #content { display: flex; flex-direction: column; + font-size: $font-size-base; // so PatternFly 4's PatternFly 3 shield rules don't override } #content-scrollable { @@ -19,10 +20,6 @@ body, -webkit-overflow-scrolling: touch; } -.pf-c-page__main-section { - --pf-global--FontSize--md: #{$font-size-base}; -} - .absolute-zero { position: absolute; top: 0px; diff --git a/frontend/public/style/_overrides.scss b/frontend/public/style/_overrides.scss index 12bbf98cabf..32ab8a607e3 100644 --- a/frontend/public/style/_overrides.scss +++ b/frontend/public/style/_overrides.scss @@ -227,8 +227,6 @@ tags-input .autocomplete .suggestion-item em { } } - - .modal.right-side-modal-pf { top: 76px; // since PatternFly 4's masthead is taller than PatternFly 3's @@ -258,14 +256,26 @@ tags-input .autocomplete .suggestion-item em { // PatternFly 4 overrides +// Webpack will not properly bundle the background-image from PatternFly +@media only screen and (min-width: 576px) { + .pf-c-about-modal-box__hero { + background-image: url('../imgs/pfbg_992.jpg') !important; + } +} + .pf-c-dropdown__menu { list-style: none; } -.pf-c-page { - // TEMP fix until https://github.com/patternfly/patternfly-next/issues/1174 is fixed upstream - height: 100% !important; +// TEMP fix until https://github.com/patternfly/patternfly-next/issues/1543 is fixed upstream +.pf-c-dropdown__menu-item { + &:focus, + &:hover { + color: var(--pf-global--Color--dark-100); + } +} +.pf-c-page { &__header { background-color: var(--pf-global--BackgroundColor--dark-200); background-image: url("../imgs/pfbg_2000.jpg"); @@ -280,11 +290,10 @@ tags-input .autocomplete .suggestion-item em { // `.pf-c-page` specificity required .pf-c-page__main-section { - --pf-c-page__main-section--Padding: 0; - - @media screen and (min-width: $grid-float-breakpoint) { - --pf-c-page__main-section--Padding: 0; - } + --pf-c-page__main-section--PaddingBottom: 0; + --pf-c-page__main-section--PaddingLeft: 0; + --pf-c-page__main-section--PaddingRight: 0; + --pf-c-page__main-section--PaddingTop: 0; } .pf-c-page__sidebar { @@ -336,11 +345,13 @@ tags-input .autocomplete .suggestion-item em { --pf-c-nav__simple-list-link--focus--BackgroundColor: var(--pf-c-nav__list-link--hover--BackgroundColor); --pf-c-nav__simple-list-link--focus--Color: var(--pf-c-nav__list-link--hover--Color); --pf-c-nav__simple-list-link--focus--FontWeight: var(--pf-global--FontWeight--normal); + --pf-c-nav__simple-list-link--hover--BackgroundColor: var(--pf-c-nav__list-link--hover--BackgroundColor); + --pf-c-nav__simple-list-link--hover--Color: var(--pf-c-nav__list-link--hover--Color); --pf-c-nav__simple-list-link--m-current--BackgroundColor: var(--pf-c-nav__list-link--hover--BackgroundColor); --pf-c-nav__simple-list-link--m-current--Color: var(--pf-c-nav__simple-list-link--active--Color); --pf-c-nav__simple-list-link--PaddingBottom: 2px; --pf-c-nav__simple-list-link--PaddingRight: 5px; - --pf-c-nav__simple-list-link--PaddingTop: 4px; + --pf-c-nav__simple-list-link--PaddingTop: 2px; // Subnav --pf-c-nav__subnav--MarginTop: 0; --pf-c-nav__subnav--MaxHeight: 100%; @@ -348,11 +359,13 @@ tags-input .autocomplete .suggestion-item em { --pf-c-nav__list-toggle--PaddingRight: 0; } - .pf-c-nav__item .pf-c-nav__simple-list .pf-c-nav__link { - --pf-c-nav__subnav-item--PaddingLeft: var(--pf-c-nav__list-link--PaddingLeft); + .pf-c-nav__item .pf-c-nav__simple-list .pf-c-nav__link.pf-m-separator::after { + --pf-c-nav__simple-list-link--m-separator--after--Left: var(--pf-c-nav__list-link--PaddingLeft); + right: var(--pf-c-nav__list-link--PaddingRight); @media screen and (min-width: $grid-float-breakpoint) { - --pf-c-nav__subnav-item--PaddingLeft: var(--pf-c-nav__list-link--md--PaddingLeft); + --pf-c-nav__simple-list-link--m-separator--after--Left: var(--pf-c-nav__list-link--md--PaddingLeft); + right: var(--pf-c-nav__list-link--md--PaddingRight); } } @@ -360,18 +373,25 @@ tags-input .autocomplete .suggestion-item em { list-style: none; // turn off list-styles to fix bug in Edge > .pf-c-nav__item { border-bottom: 1px solid #{$color-pf-black}; - font-size: 14px; margin-top: 0; + &:not(.pf-m-current) > .pf-c-nav__link { + &:active, + &:focus, + &:hover { + background-color: var(--pf-c-nav__list-link--hover--BackgroundColor); + } + } + &.pf-m-current { background-color: #{$color-pf-black-800}; - &:not(.pf-m-expanded) { - .pf-c-nav__link { - &::after { - display: block; - } - } + &.pf-m-expanded > .pf-c-nav__link::after { + display: none; + } + + .pf-c-nav__simple-list .pf-c-nav__link.pf-m-separator:after { + --pf-c-nav__simple-list-link--m-separator--after--Background: #292929; } } @@ -385,22 +405,36 @@ tags-input .autocomplete .suggestion-item em { .pf-c-nav__link { align-items: center; + padding-left: var(--pf-c-nav__list-link--PaddingLeft); - &::after { - display: none; + @media screen and (min-width: $grid-float-breakpoint) { + padding-left: var(--pf-c-nav__list-link--md--PaddingLeft); } } } - .pf-c-nav__simple-list { - .pf-c-nav__link { - font-size: 14px; - line-height: 25px; + .pf-c-nav__simple-list .pf-c-nav__link { + font-size: $font-size-base; + line-height: 25px; + + // use `::before` so as not to conflict with `.pf-m-separator::after` + &.pf-m-current::before { + background-color: var(--pf-c-nav__list-link--m-current--after--BackgroundColor); + bottom: 0; + content: ""; + display: block; + height: var(--pf-c-nav__list-link--after--Height); + left: var(--pf-c-nav__list-link--after--Left); + position: absolute; + width: var(--pf-c-nav__list-link--after--Width); + } - &.pf-m-current { - &::after { - display: block; - } + &.pf-m-separator { + margin-bottom: 17px; + + &::after { + --pf-c-nav__simple-list-link--m-separator--after--Background: #{$color-pf-black}; + --pf-c-nav__simple-list-link--m-separator--after--Bottom: -9px; } } } diff --git a/frontend/public/style/_vars.scss b/frontend/public/style/_vars.scss index 259654ef3e1..a1e908c3803 100644 --- a/frontend/public/style/_vars.scss +++ b/frontend/public/style/_vars.scss @@ -22,7 +22,7 @@ $icon-font-path: $consoleWebFontPath + '/'; // Disable PatternFly 4 reset. $pf-global--enable-reset: false; // PatternFly 4 font path. -$pf-global--font-path: '~@patternfly/patternfly-next/assets/fonts'; +$pf-global--font-path: '~@patternfly/patternfly/assets/fonts'; $popover-max-width: 325px; $table-border-color: $color-pf-black-200; diff --git a/frontend/public/vendor.scss b/frontend/public/vendor.scss index 115b9d0dd23..e0c52e34728 100644 --- a/frontend/public/vendor.scss +++ b/frontend/public/vendor.scss @@ -57,10 +57,10 @@ @import '~patternfly-react-extensions/dist/sass/filter-side-panel'; @import '~patternfly-react-extensions/dist/sass/properties-side-panel'; @import '~patternfly-react-extensions/dist/sass/vertical-tabs'; -@import '~@patternfly/patternfly-next/sass-utilities/all'; -@import "~@patternfly/patternfly-next/_variables"; -@import "~@patternfly/patternfly-next/_fonts"; -@import "~@patternfly/patternfly-next/_base"; -@import '~@patternfly/patternfly-next/utilities/Accessibility/accessibility'; -@import '~@patternfly/patternfly-next/utilities/Spacing/spacing'; -@import '~@patternfly/patternfly-next/components/Badge/badge'; +@import '~@patternfly/patternfly/sass-utilities/all'; +@import "~@patternfly/patternfly/_variables"; +@import "~@patternfly/patternfly/_fonts"; +@import "~@patternfly/patternfly/_base"; +@import '~@patternfly/patternfly/utilities/Accessibility/accessibility'; +@import '~@patternfly/patternfly/utilities/Spacing/spacing'; +@import '~@patternfly/patternfly/components/Badge/badge'; diff --git a/frontend/yarn.lock b/frontend/yarn.lock index a05fb23fcf4..669e8b52c2a 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -130,46 +130,52 @@ version "3.1.0" resolved "https://registry.yarnpkg.com/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz#497c67a1cef50d1a2459ba60f315e448d2ad87fe" -"@patternfly/patternfly-next@^1.0.109": - version "1.0.109" - resolved "https://registry.yarnpkg.com/@patternfly/patternfly-next/-/patternfly-next-1.0.109.tgz#5c1a8ca29ca48d030324d3d588af9954e2f36cea" +"@patternfly/patternfly@1.0.219": + version "1.0.219" + resolved "https://registry.yarnpkg.com/@patternfly/patternfly/-/patternfly-1.0.219.tgz#3fb57ca7ec88437d78cd84f6e9563979f1081469" + integrity sha512-1HWy1T51G5KgqhmDV9FRXlaxHiQqS0e3vqS3EuAqrlszKh2TChMi1u6kxMGtp/m9VuDziuGiue3V/0+U1mKnRQ== -"@patternfly/react-core@^1.43.5": - version "1.43.5" - resolved "https://registry.yarnpkg.com/@patternfly/react-core/-/react-core-1.43.5.tgz#b66e8915785aecde621663b1c719cf965d9d5bd4" +"@patternfly/react-core@2.4.1": + version "2.4.1" + resolved "https://registry.yarnpkg.com/@patternfly/react-core/-/react-core-2.4.1.tgz#3f2fedb160ed9451be5126b906bb8ec493146540" + integrity sha512-vWhgD9TGtZwiywcpQQqEv4mtpac3BVfLfviebPdGYqAVde9ZhV+ODcnJcgNGWmPRd+LKVlCJSzpIvbpqYPJ1Wg== dependencies: - "@patternfly/react-icons" "^2.9.5" - "@patternfly/react-styles" "^2.3.0" + "@patternfly/react-icons" "^3.2.0" + "@patternfly/react-styles" "^2.3.6" + "@patternfly/react-tokens" "^2.0.6" "@tippy.js/react" "^1.1.1" + emotion "^9.2.9" exenv "^1.2.2" focus-trap-react "^4.0.1" - optionalDependencies: - "@patternfly/react-tokens" "^1.0.0" + tippy.js "^3.4.1" -"@patternfly/react-icons@^2.9.5": - version "2.9.5" - resolved "https://registry.yarnpkg.com/@patternfly/react-icons/-/react-icons-2.9.5.tgz#abccb6b151f965cb1370a1e0210bc650e202ce97" +"@patternfly/react-icons@^3.2.0": + version "3.2.0" + resolved "https://registry.yarnpkg.com/@patternfly/react-icons/-/react-icons-3.2.0.tgz#ad7e121d43d4d2c857a61c89baef81da38716a55" + integrity sha512-DBmddOWqfEcMEn5G1gXv3L53aiwjW95U/mIafBS186xf5ZnVOSZpdzSEMT8NjNyj6AXsIZ965iAY8nO4ryR+VQ== -"@patternfly/react-styles@^2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@patternfly/react-styles/-/react-styles-2.3.0.tgz#e6041a22c8ad11f622e6ca280075aaf482879d7e" +"@patternfly/react-styles@^2.3.6": + version "2.3.6" + resolved "https://registry.yarnpkg.com/@patternfly/react-styles/-/react-styles-2.3.6.tgz#8b5712d9c414ebc27d748985106781520a54f215" + integrity sha512-IGhq3KE4bSNrjaIq9ELYZGfabavWtzDlD+9q4mWVKjfXd7Fn0814+MK3dGb8GfjES84bDStiwCAcMGRftcssbQ== dependencies: "@babel/helper-plugin-utils" "^7.0.0-beta.48" camel-case "^3.0.0" css "^2.2.3" cssom "^0.3.4" cssstyle "^0.3.1" - emotion "^9.2.6" - emotion-server "^9.2.6" + emotion "^9.2.9" + emotion-server "^9.2.9" fbjs-scripts "^0.8.3" fs-extra "^6.0.1" jsdom "^11.11.0" relative "^3.0.2" resolve-from "^4.0.0" -"@patternfly/react-tokens@^1.0.0": - version "1.5.2" - resolved "https://registry.yarnpkg.com/@patternfly/react-tokens/-/react-tokens-1.5.2.tgz#0b8c84524d018ad92979a07494ce75a8d4304d32" +"@patternfly/react-tokens@^2.0.6": + version "2.0.6" + resolved "https://registry.yarnpkg.com/@patternfly/react-tokens/-/react-tokens-2.0.6.tgz#40f42a1e176541053478e5c462e22f5412bf2356" + integrity sha512-nf6/UpOZNF8B0cKlKR00/IoX3pR9C7srAXlQFBbVevdqjSG2RPLUZaCAPr0ZPN3+XH8WLaPJgY2NrYrlgnsoUw== "@plotly/d3-sankey@^0.5.1": version "0.5.1" @@ -2642,7 +2648,7 @@ classnames@2.x: version "2.2.5" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.5.tgz#fb3801d453467649ef3603c7d61a02bd129bde6d" -classnames@^2.2.0, classnames@^2.2.3, classnames@^2.2.5: +classnames@^2.2.0, classnames@^2.2.3, classnames@^2.2.5, classnames@^2.2.6: version "2.2.6" resolved "https://registry.yarnpkg.com/classnames/-/classnames-2.2.6.tgz#43935bffdd291f326dad0a205309b38d00f650ce" @@ -3163,7 +3169,7 @@ create-hmac@^1.1.0, create-hmac@^1.1.2, create-hmac@^1.1.4: safe-buffer "^5.0.1" sha.js "^2.4.8" -create-react-context@^0.2.1: +create-react-context@^0.2.1, create-react-context@^0.2.3: version "0.2.3" resolved "https://registry.yarnpkg.com/create-react-context/-/create-react-context-0.2.3.tgz#9ec140a6914a22ef04b8b09b7771de89567cb6f3" dependencies: @@ -3713,6 +3719,11 @@ detect-libc@^1.0.2: version "1.0.3" resolved "https://registry.yarnpkg.com/detect-libc/-/detect-libc-1.0.3.tgz#fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b" +diff@^2.2.2: + version "2.2.3" + resolved "https://registry.yarnpkg.com/diff/-/diff-2.2.3.tgz#60eafd0d28ee906e4e8ff0a52c1229521033bf99" + integrity sha1-YOr9DSjukG5Oj/ClLBIpUhAzv5k= + diff@^3.1.0, diff@^3.2.0, diff@^3.3.1, diff@^3.5.0: version "3.5.0" resolved "https://registry.yarnpkg.com/diff/-/diff-3.5.0.tgz#800c0dd1e0a8bfbc95835c202ad220fe317e5a12" @@ -3945,15 +3956,17 @@ emojis-list@^2.0.0: version "2.1.0" resolved "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz#4daa4d9db00f9819880c79fa457ae5b09a1fd389" -emotion-server@^9.2.6: +emotion-server@^9.2.9: version "9.2.12" resolved "https://registry.yarnpkg.com/emotion-server/-/emotion-server-9.2.12.tgz#aaaaa04843108943d1ce5a796e0bc40b06a3223e" + integrity sha512-Bhjdl7eNoIeiAVa2QPP5d+1nP/31SiO/K1P/qI9cdXCydg91NwGYmteqhhge8u7PF8fLGTEVQfcPwj21815eBw== dependencies: create-emotion-server "^9.2.12" -emotion@^9.2.6: +emotion@^9.2.9: version "9.2.12" resolved "https://registry.yarnpkg.com/emotion/-/emotion-9.2.12.tgz#53925aaa005614e65c6e43db8243c843574d1ea9" + integrity sha512-hcx7jppaI8VoXxIWEhxpDW7I+B4kq9RNzQLmsrF6LY8BGKqe2N+gFAQr0EfuFucFlPs2A9HM4+xNj4NeqEWIOQ== dependencies: babel-plugin-emotion "^9.2.11" create-emotion "^9.2.12" @@ -5083,6 +5096,11 @@ gh-got@^6.0.0: got "^7.0.0" is-plain-obj "^1.1.0" +gitdiff-parser@^0.1.2: + version "0.1.2" + resolved "https://registry.yarnpkg.com/gitdiff-parser/-/gitdiff-parser-0.1.2.tgz#26a256e05e9c2d5016b512a96c1dacb40862b92a" + integrity sha512-glDM6E1AwLYYTOPyI0CqamNEUSuwwAkmwULWpE2sHMpMZNzGJwErt7+eV+yIZcsbDza0pVSlwlBHFWbTf2Wu7A== + github-username@^4.0.0: version "4.1.0" resolved "https://registry.yarnpkg.com/github-username/-/github-username-4.1.0.tgz#cbe280041883206da4212ae9e4b5f169c30bf417" @@ -7577,10 +7595,20 @@ lodash.endswith@^4.2.1: version "4.2.1" resolved "https://registry.yarnpkg.com/lodash.endswith/-/lodash.endswith-4.2.1.tgz#fed59ac1738ed3e236edd7064ec456448b37bc09" +lodash.escape@^4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-4.0.1.tgz#c9044690c21e04294beaa517712fded1fa88de98" + integrity sha1-yQRGkMIeBClL6qUXcS/e0fqI3pg= + lodash.escaperegexp@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz#64762c48618082518ac3df4ccf5d5886dae20347" +lodash.findlastindex@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.findlastindex/-/lodash.findlastindex-4.6.0.tgz#b8375ac0f02e9b926375cdf8dc3ea814abf9c6ac" + integrity sha1-uDdawPAum5Jjdc343D6oFKv5xqw= + lodash.flattendeep@^4.4.0: version "4.4.0" resolved "https://registry.yarnpkg.com/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz#fb030917f86a3134e5bc9bec0d69e0013ddfedb2" @@ -7613,6 +7641,11 @@ lodash.keys@^3.0.0: lodash.isarguments "^3.0.0" lodash.isarray "^3.0.0" +lodash.mapvalues@^4.6.0: + version "4.6.0" + resolved "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz#1bafa5005de9dd6f4f26668c30ca37230cc9689c" + integrity sha1-G6+lAF3p3W9PJmaMMMo3IwzJaJw= + lodash.memoize@^4.1.2: version "4.1.2" resolved "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz#bcc6c49a42a2840ed997f323eada5ecd182e0bfe" @@ -9069,21 +9102,25 @@ patternfly-bootstrap-treeview@~2.1.0: bootstrap "3.3.x" jquery ">= 2.1.x" -patternfly-react-extensions@2.14.1: - version "2.14.1" - resolved "https://registry.yarnpkg.com/patternfly-react-extensions/-/patternfly-react-extensions-2.14.1.tgz#86690c80ed8af055649bf8c3de9087ca69c4a8f3" +patternfly-react-extensions@2.16.19: + version "2.16.19" + resolved "https://registry.yarnpkg.com/patternfly-react-extensions/-/patternfly-react-extensions-2.16.19.tgz#233c1e70dbe6b7bb68117830ea056a59672d0677" + integrity sha512-Wg7HyZnx/WBbdZtMkdBlsLqAe0HYH8lgpAzvgpD5Cvg/20cVUaOBozU/SMnTjj2IG0DNVwnN8IAR6M/GSmIt/g== dependencies: breakjs "^1.0.0" classnames "^2.2.5" css-element-queries "^1.0.1" patternfly "^3.58.0" - patternfly-react "^2.28.1" + patternfly-react "^2.29.17" react-bootstrap "^0.32.1" + react-diff-view "^1.8.1" react-virtualized "9.x" + unidiff "^1.0.1" -patternfly-react@^2.28.1: - version "2.28.2" - resolved "https://registry.yarnpkg.com/patternfly-react/-/patternfly-react-2.28.2.tgz#aca060da08bfe5dae1643ddbe5f2aaa24f4949df" +patternfly-react@2.29.17, patternfly-react@^2.29.17: + version "2.29.17" + resolved "https://registry.yarnpkg.com/patternfly-react/-/patternfly-react-2.29.17.tgz#e6d11a8dde35a7c9ba15383c3c6e74b7db10f75e" + integrity sha512-/lq9rVYM+wDVXdudPMNluymnPaSrj1djiEpm+MzNdj95unnlkW4SKtr6uND2IWIvSscKWPF+1Dvkjwsi7hZ2Kg== dependencies: bootstrap-slider-without-jquery "^10.0.0" breakjs "^1.0.0" @@ -9093,32 +9130,7 @@ patternfly-react@^2.28.1: patternfly "^3.58.0" react-bootstrap "^0.32.1" react-bootstrap-switch "^15.5.3" - react-bootstrap-typeahead "^3.1.3" - react-c3js "^0.1.20" - react-click-outside "^3.0.1" - react-collapse "^4.0.3" - react-fontawesome "^1.6.1" - react-motion "^0.5.2" - reactabular-table "^8.14.0" - recompose "^0.26.0" - uuid "^3.3.2" - optionalDependencies: - sortabular "^1.5.1" - table-resolver "^3.2.0" - -patternfly-react@^2.29.1: - version "2.29.1" - resolved "https://registry.yarnpkg.com/patternfly-react/-/patternfly-react-2.29.1.tgz#3def482e4ca48b0c0b0ccad13b32a6eb49d4e9c4" - dependencies: - bootstrap-slider-without-jquery "^10.0.0" - breakjs "^1.0.0" - classnames "^2.2.5" - css-element-queries "^1.0.1" - lodash "^4.17.11" - patternfly "^3.58.0" - react-bootstrap "^0.32.1" - react-bootstrap-switch "^15.5.3" - react-bootstrap-typeahead "^3.1.3" + react-bootstrap-typeahead "^3.4.1" react-c3js "^0.1.20" react-click-outside "^3.0.1" react-collapse "^4.0.3" @@ -10007,17 +10019,18 @@ react-bootstrap-switch@^15.5.3: version "15.5.3" resolved "https://registry.yarnpkg.com/react-bootstrap-switch/-/react-bootstrap-switch-15.5.3.tgz#97287791d4ec0d1892d142542e7e5248002b1251" -react-bootstrap-typeahead@^3.1.3: - version "3.2.3" - resolved "https://registry.yarnpkg.com/react-bootstrap-typeahead/-/react-bootstrap-typeahead-3.2.3.tgz#ef93c9afbcc43335c6c77c90e160a3abad95732c" +react-bootstrap-typeahead@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/react-bootstrap-typeahead/-/react-bootstrap-typeahead-3.4.1.tgz#484c3c1be635c49898ca8dce59a6c71f2fce5888" + integrity sha512-Isutst1PaIO+GSlyDfoAskCdvp5biyUIL/VdDjfSYFaFmZ89W8pSCJ6rALowkvTlCVxoRHJMrmhxb/5KOTAPzQ== dependencies: classnames "^2.2.0" + create-react-context "^0.2.3" escape-string-regexp "^1.0.5" invariant "^2.2.1" lodash "^4.17.2" prop-types "^15.5.8" prop-types-extra "^1.0.1" - react-onclickoutside "^6.1.1" react-overlays "^0.8.1" react-popper "^1.0.0" warning "^4.0.1" @@ -10064,6 +10077,19 @@ react-copy-to-clipboard@5.x: copy-to-clipboard "^3" prop-types "^15.5.8" +react-diff-view@^1.8.1: + version "1.8.1" + resolved "https://registry.yarnpkg.com/react-diff-view/-/react-diff-view-1.8.1.tgz#0b9b4adcb92de6730d28177d68654dfcc2097f73" + integrity sha512-+soJL85Xnsak/VOdxSgiDKhhaFiOkckiswwrXdiWVCxV3LP9POyJR4AqGVFGdkntJ3YT63mtwTYuunFeId+XSA== + dependencies: + classnames "^2.2.6" + gitdiff-parser "^0.1.2" + leven "^2.1.0" + lodash.escape "^4.0.1" + lodash.findlastindex "^4.6.0" + lodash.mapvalues "^4.6.0" + warning "^4.0.1" + react-dnd-html5-backend@^2.6.0: version "2.6.0" resolved "https://registry.yarnpkg.com/react-dnd-html5-backend/-/react-dnd-html5-backend-2.6.0.tgz#590cd1cca78441bb274edd571fef4c0b16ddcf8e" @@ -10143,10 +10169,6 @@ react-motion@^0.5.2: prop-types "^15.5.8" raf "^3.1.0" -react-onclickoutside@^6.1.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/react-onclickoutside/-/react-onclickoutside-6.7.1.tgz#6a5b5b8b4eae6b776259712c89c8a2b36b17be93" - react-overlays@^0.8.0, react-overlays@^0.8.1: version "0.8.3" resolved "https://registry.yarnpkg.com/react-overlays/-/react-overlays-0.8.3.tgz#fad65eea5b24301cca192a169f5dddb0b20d3ac5" @@ -12230,6 +12252,13 @@ tippy.js@^3.2.0: dependencies: popper.js "^1.14.6" +tippy.js@^3.4.1: + version "3.4.1" + resolved "https://registry.yarnpkg.com/tippy.js/-/tippy.js-3.4.1.tgz#f0eb3081824ad6c5d364336451ad77ae2f543da8" + integrity sha512-ZiyGP9WZyCCcjxKM4G88cm4U1r1ytjeMDGa5FSKPaPzwc/3yZJVZsb1ffcmqUMCpryRp5LNxRNGKLzbs11sb/Q== + dependencies: + popper.js "^1.14.6" + tmp@0.0.30: version "0.0.30" resolved "https://registry.yarnpkg.com/tmp/-/tmp-0.0.30.tgz#72419d4a8be7d6ce75148fd8b324e593a711c2ed" @@ -12583,6 +12612,13 @@ unicode-property-aliases-ecmascript@^1.0.4: version "1.0.4" resolved "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.0.4.tgz#5a533f31b4317ea76f17d807fa0d116546111dd0" +unidiff@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/unidiff/-/unidiff-1.0.1.tgz#2ff8da0710a9abb4e1133e9da4c87747fb5ff508" + integrity sha512-n9pCo9OKQE+QWsUa45BdSy7Y0hpHpyPHwNxcEgqFgPqxb1Y8DH4d9WTepcJpmLsnDEWDch6hxh2g/sM0bvyxMA== + dependencies: + diff "^2.2.2" + union-find@^1.0.0, union-find@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/union-find/-/union-find-1.0.2.tgz#292bac415e6ad3a89535d237010db4a536284e58" From dcadd6ce542b797cd5bc77fdc3e5855d47e6fb78 Mon Sep 17 00:00:00 2001 From: Jon Jackson Date: Thu, 14 Feb 2019 14:32:26 -0500 Subject: [PATCH 38/45] Change Operator Hub to OperatorHub --- .../tests/operator-hub/operator-hub.scenario.ts | 8 ++++---- frontend/integration-tests/tests/performance.scenario.ts | 2 +- frontend/public/components/nav.jsx | 2 +- .../public/components/operator-hub/operator-hub-items.tsx | 2 +- .../public/components/operator-hub/operator-hub-page.tsx | 8 ++++---- .../components/operator-hub/operator-hub-subscribe.tsx | 2 +- frontend/public/const.js | 2 +- 7 files changed, 13 insertions(+), 13 deletions(-) diff --git a/frontend/integration-tests/tests/operator-hub/operator-hub.scenario.ts b/frontend/integration-tests/tests/operator-hub/operator-hub.scenario.ts index b2ac01b6bdd..22933f60f68 100644 --- a/frontend/integration-tests/tests/operator-hub/operator-hub.scenario.ts +++ b/frontend/integration-tests/tests/operator-hub/operator-hub.scenario.ts @@ -9,7 +9,7 @@ import * as catalogView from '../../views/catalog.view'; import * as catalogPageView from '../../views/catalog-page.view'; import * as operatorHubView from '../../views/operator-hub.view'; -describe('Subscribing to an Operator from Operator Hub', () => { +describe('Subscribing to an Operator from OperatorHub', () => { const openCloudServices = new Set(['AMQ Streams', 'MongoDB']); afterAll(() => { @@ -25,7 +25,7 @@ describe('Subscribing to an Operator from Operator Hub', () => { checkErrors(); }); - it('displays Operator Hub with expected available operators', async() => { + it('displays OperatorHub with expected available operators', async() => { await browser.get(`${appHost}/operatorhub/ns/${testName}`); await crudView.isLoaded(); @@ -110,7 +110,7 @@ describe('Subscribing to an Operator from Operator Hub', () => { await operatorHubView.operatorModalIsClosed(); }); - it('filters Operator Hub tiles by Category', async() => { + it('filters OperatorHub tiles by Category', async() => { expect(catalogPageView.catalogTiles.isPresent()).toBe(true); expect(catalogView.categoryTabs.isPresent()).toBe(true); }); @@ -132,7 +132,7 @@ describe('Subscribing to an Operator from Operator Hub', () => { expect($('input[value="OwnNamespace"]').getAttribute('disabled')).toBe(null); }); - it('displays Operator as subscribed in Operator Hub', async() => { + it('displays Operator as subscribed in OperatorHub', async() => { await operatorHubView.installNamespaceDropdownBtn.click(); await operatorHubView.installNamespaceDropdownFilter(testName); await operatorHubView.installNamespaceDropdownSelect(testName).click(); diff --git a/frontend/integration-tests/tests/performance.scenario.ts b/frontend/integration-tests/tests/performance.scenario.ts index 0a09bc16e8b..265bdb2d3f8 100644 --- a/frontend/integration-tests/tests/performance.scenario.ts +++ b/frontend/integration-tests/tests/performance.scenario.ts @@ -32,7 +32,7 @@ const chunkedRoutes = OrderedMap() .set('limit-range', {section: 'Administration', name: 'Limit Ranges'}) .set('custom-resource-definition', {section: 'Administration', name: 'CRDs'}) .set('catalog', {section: 'Catalog', name: 'Developer Catalog'}) - .set('operator-hub', {section: 'Catalog', name: 'Operator Hub'}); + .set('operator-hub', {section: 'Catalog', name: 'OperatorHub'}); describe('Performance test', () => { diff --git a/frontend/public/components/nav.jsx b/frontend/public/components/nav.jsx index 924bd29304a..de6f2ad4847 100644 --- a/frontend/public/components/nav.jsx +++ b/frontend/public/components/nav.jsx @@ -317,7 +317,7 @@ export const Navigation = ({ isNavOpen, onNavSelect }) => { startsWith={provisionedServicesStartsWith} required={FLAGS.SERVICE_CATALOG} /> - + {detailsItem && } diff --git a/frontend/public/components/operator-hub/operator-hub-page.tsx b/frontend/public/components/operator-hub/operator-hub-page.tsx index d81f8906101..63dfb322175 100644 --- a/frontend/public/components/operator-hub/operator-hub-page.tsx +++ b/frontend/public/components/operator-hub/operator-hub-page.tsx @@ -59,8 +59,8 @@ export const OperatorHubList: React.SFC = (props) => { label="Resources" EmptyMsg={() => ( Please check that the OperatorHub is running and that you have created a valid OperatorSource. For more information about Operator Hub, please click .} + title="No OperatorHub Items Found" + detail={Please check that the OperatorHub is running and that you have created a valid OperatorSource. For more information about OperatorHub, please click .} /> )}> @@ -69,10 +69,10 @@ export const OperatorHubList: React.SFC = (props) => { export const OperatorHubPage = withFallback((props: OperatorHubPageProps) => - Operator Hub + OperatorHub
- +
= (props) =>
- Operator Hub Subscription + OperatorHub Subscription

Create Operator Subscription

diff --git a/frontend/public/const.js b/frontend/public/const.js index 2967e16cd5b..00c1478275d 100644 --- a/frontend/public/const.js +++ b/frontend/public/const.js @@ -34,5 +34,5 @@ export const KUBE_ADMIN_USERNAME = 'kube:admin'; export const OPERATOR_HUB_CSC_BASE = 'installed'; export const RH_OPERATOR_SUPPORT_POLICY_LINK = 'https://access.redhat.com/third-party-software-support'; -// Package manifests for the Operator Hub use this label. +// Package manifests for the OperatorHub use this label. export const OPERATOR_HUB_LABEL = 'openshift-marketplace'; From 5b1bad71702a855f1d96ff4057c3dc0b4e218ce8 Mon Sep 17 00:00:00 2001 From: Jon Jackson Date: Fri, 8 Feb 2019 11:10:58 -0500 Subject: [PATCH 39/45] Always provide a cluster update path when updates are available --- .../cluster-settings/cluster-settings.tsx | 147 +++++++++--------- .../public/components/masthead-toolbar.jsx | 2 +- .../modals/cluster-channel-modal.tsx | 18 ++- .../modals/cluster-update-modal.tsx | 25 ++- .../public/module/k8s/cluster-settings.ts | 66 ++++++++ frontend/public/module/k8s/index.ts | 40 +++-- 6 files changed, 201 insertions(+), 97 deletions(-) create mode 100644 frontend/public/module/k8s/cluster-settings.ts diff --git a/frontend/public/components/cluster-settings/cluster-settings.tsx b/frontend/public/components/cluster-settings/cluster-settings.tsx index da6bdc7f9da..8063a53fc5f 100644 --- a/frontend/public/components/cluster-settings/cluster-settings.tsx +++ b/frontend/public/components/cluster-settings/cluster-settings.tsx @@ -1,5 +1,3 @@ -// TODO (jon) - Remove mock code from this file once cluster update feature is complete - /* eslint-disable no-unused-vars, no-undef */ import * as React from 'react'; @@ -8,11 +6,26 @@ import { Helmet } from 'react-helmet'; import { Button } from 'patternfly-react'; import { Link } from 'react-router-dom'; -import { ClusterVersionKind, K8sResourceKind, referenceForModel } from '../../module/k8s'; -import { ClusterAutoscalerModel, ClusterVersionModel } from '../../models'; import { ClusterOperatorPage } from './cluster-operator'; import { clusterChannelModal, clusterUpdateModal } from '../modals'; import { GlobalConfigPage } from './global-config'; +import { ClusterAutoscalerModel } from '../../models'; +import { + ClusterUpdateStatus, + ClusterVersionCondition, + ClusterVersionConditionType, + ClusterVersionKind, + clusterVersionReference, + getAvailableClusterUpdates, + getClusterUpdateStatus, + getClusterVersionCondition, + getDesiredClusterVersion, + isProgressing, + K8sResourceConditionStatus, + K8sResourceKind, + referenceForModel, + updateFailing, +} from '../../module/k8s'; import { EmptyBox, Firehose, @@ -23,56 +36,12 @@ import { Timestamp, } from '../utils'; -enum ClusterUpdateStatus { - UpToDate = 'Up to Date', - UpdatesAvailable = 'Updates Available', - Updating = 'Updating', - Failing = 'Failing', - ErrorRetrieving = 'Error Retrieving', -} - const clusterAutoscalerReference = referenceForModel(ClusterAutoscalerModel); -export const clusterVersionReference = referenceForModel(ClusterVersionModel); - -export const getAvailableClusterChannels = () => ({'nightly-4.0': 'nightly-4.0', 'pre-release-4.0': 'pre-release-4.0', 'stable-4.0': 'stable-4.0'}); - -export const getAvailableClusterUpdates = (cv: ClusterVersionKind) => { - return _.get(cv, 'status.availableUpdates'); -}; - -export const getDesiredClusterVersion = (cv: ClusterVersionKind) => { - return _.get(cv, 'status.desired.version'); -}; - -const launchUpdateModal = (cv: ClusterVersionKind) => { - clusterUpdateModal({cv}); -}; const CurrentChannel: React.SFC = ({cv}) => ; -const getClusterUpdateStatus = (cv: ClusterVersionKind): ClusterUpdateStatus => { - const conditions = _.get(cv, 'status.conditions', []); - const isFailingCondition = _.find(conditions, { type: 'Failing', status: 'True' }); - if (isFailingCondition) { - return ClusterUpdateStatus.Failing; - } - - const retrievedUpdatesFailedCondition = _.find(conditions, { type: 'RetrievedUpdates', status: 'False' }); - if (retrievedUpdatesFailedCondition) { - return ClusterUpdateStatus.ErrorRetrieving; - } - - const isProgressingCondition = _.find(conditions, { type: 'Progressing', status: 'True' }); - if (isProgressingCondition) { - return ClusterUpdateStatus.Updating; - } - - const updates = _.get(cv, 'status.availableUpdates'); - return _.isEmpty(updates) ? ClusterUpdateStatus.UpToDate : ClusterUpdateStatus.UpdatesAvailable; -}; - const getIconClass = (status: ClusterUpdateStatus) => { return { [ClusterUpdateStatus.UpToDate]: 'pficon pficon-ok', @@ -83,26 +52,44 @@ const getIconClass = (status: ClusterUpdateStatus) => { }[status]; }; -const FailedConditionAlert = ({message, condition}) =>
-