From 87552b6f7af6e10c0c16281f9e2eae13a7805228 Mon Sep 17 00:00:00 2001 From: Alan Greene Date: Sat, 29 Jun 2024 12:59:38 +0100 Subject: [PATCH] Use react router's route handle functionality to remove duplicate containers Configure the resource GVK on the relevant routes to enable use of a common container for most resource list pages. This also means that a number of custom hooks are no longer required. Ensure extensions work as expected in this new setup, correctly handling the namespace dropdown behaviour depending on whether the extension is for namespace-scoped or cluster-scoped resources. Rename params in paths to use consistent naming, i.e. `name` should always be used for the resource name to allow for common code to process this centrally without the need for resource-specific handling. --- .../components/PipelineRuns/PipelineRuns.jsx | 2 +- .../src/components/TaskRuns/TaskRuns.jsx | 4 +- .../src/components/Trigger/Trigger.jsx | 12 +- packages/utils/src/utils/router.js | 44 +++--- packages/utils/src/utils/router.test.js | 77 ++++----- src/api/clusterInterceptors.js | 32 ---- src/api/clusterInterceptors.test.js | 45 ------ src/api/clusterTriggerBindings.js | 11 +- src/api/clusterTriggerBindings.test.js | 15 -- src/api/eventListeners.js | 11 +- src/api/eventListeners.test.js | 15 -- src/api/index.js | 14 +- src/api/index.test.js | 22 --- src/api/interceptors.js | 32 ---- src/api/interceptors.test.js | 45 ------ src/api/triggerBindings.js | 11 +- src/api/triggerBindings.test.js | 15 -- src/api/triggerTemplates.js | 11 +- src/api/triggerTemplates.test.js | 15 -- src/api/triggers.js | 11 +- src/api/triggers.test.js | 15 -- .../ClusterInterceptors.jsx | 124 --------------- .../ClusterInterceptors.test.jsx | 66 -------- src/containers/ClusterInterceptors/index.js | 15 -- src/containers/ClusterTasks/ClusterTasks.jsx | 3 +- .../ClusterTriggerBinding.jsx | 12 +- .../ClusterTriggerBinding.test.jsx | 2 +- .../ClusterTriggerBindings.jsx | 109 ------------- .../ClusterTriggerBindings.test.jsx | 110 ------------- .../ClusterTriggerBindings/index.js | 15 -- .../CustomResourceDefinition.jsx | 52 +++---- src/containers/CustomRun/CustomRun.jsx | 6 +- src/containers/CustomRuns/CustomRuns.jsx | 4 +- .../EventListener/EventListener.jsx | 10 +- .../EventListener/EventListener.stories.jsx | 2 +- .../EventListener/EventListener.test.jsx | 6 +- .../EventListeners/EventListeners.jsx | 124 --------------- .../EventListeners/EventListeners.test.jsx | 123 --------------- src/containers/EventListeners/index.js | 15 -- .../ImportResources/ImportResources.jsx | 4 +- .../ImportResources/ImportResources.test.jsx | 4 +- src/containers/Interceptors/Interceptors.jsx | 126 --------------- .../Interceptors/Interceptors.test.jsx | 122 --------------- src/containers/Interceptors/index.js | 15 -- src/containers/PipelineRun/PipelineRun.jsx | 14 +- .../PipelineRun/PipelineRun.test.jsx | 4 +- src/containers/Pipelines/Pipelines.jsx | 3 +- src/containers/ResourceList/ResourceList.jsx | 115 ++++++++++---- src/containers/TaskRun/TaskRun.jsx | 10 +- src/containers/Tasks/Tasks.jsx | 3 +- src/containers/Trigger/Trigger.jsx | 6 +- src/containers/Trigger/Trigger.test.jsx | 2 +- .../TriggerBinding/TriggerBinding.jsx | 2 +- .../TriggerBinding/TriggerBinding.test.jsx | 4 +- .../TriggerBindings/TriggerBindings.jsx | 124 --------------- .../TriggerBindings/TriggerBindings.test.jsx | 122 --------------- src/containers/TriggerBindings/index.js | 15 -- .../TriggerTemplate/TriggerTemplate.jsx | 2 +- .../TriggerTemplate/TriggerTemplate.test.jsx | 4 +- .../TriggerTemplates/TriggerTemplates.jsx | 120 -------------- .../TriggerTemplates.test.jsx | 117 -------------- src/containers/TriggerTemplates/index.js | 15 -- src/containers/Triggers/Triggers.jsx | 134 ---------------- src/containers/Triggers/Triggers.test.jsx | 67 -------- src/containers/Triggers/index.js | 15 -- src/containers/index.js | 7 - src/nls/messages_de.json | 1 - src/nls/messages_en.json | 1 - src/nls/messages_es.json | 1 - src/nls/messages_fr.json | 1 - src/nls/messages_it.json | 1 - src/nls/messages_ja.json | 1 - src/nls/messages_ko.json | 1 - src/nls/messages_pt.json | 1 - src/nls/messages_zh-Hans.json | 1 - src/nls/messages_zh-Hant.json | 1 - src/routes/dashboard.jsx | 20 +-- src/routes/pipelines.jsx | 37 +++++ src/routes/triggers.jsx | 147 ++++++++++++++---- 79 files changed, 377 insertions(+), 2270 deletions(-) delete mode 100644 src/api/clusterInterceptors.js delete mode 100644 src/api/clusterInterceptors.test.js delete mode 100644 src/api/interceptors.js delete mode 100644 src/api/interceptors.test.js delete mode 100644 src/containers/ClusterInterceptors/ClusterInterceptors.jsx delete mode 100644 src/containers/ClusterInterceptors/ClusterInterceptors.test.jsx delete mode 100644 src/containers/ClusterInterceptors/index.js delete mode 100644 src/containers/ClusterTriggerBindings/ClusterTriggerBindings.jsx delete mode 100644 src/containers/ClusterTriggerBindings/ClusterTriggerBindings.test.jsx delete mode 100644 src/containers/ClusterTriggerBindings/index.js delete mode 100644 src/containers/EventListeners/EventListeners.jsx delete mode 100644 src/containers/EventListeners/EventListeners.test.jsx delete mode 100644 src/containers/EventListeners/index.js delete mode 100644 src/containers/Interceptors/Interceptors.jsx delete mode 100644 src/containers/Interceptors/Interceptors.test.jsx delete mode 100644 src/containers/Interceptors/index.js delete mode 100644 src/containers/TriggerBindings/TriggerBindings.jsx delete mode 100644 src/containers/TriggerBindings/TriggerBindings.test.jsx delete mode 100644 src/containers/TriggerBindings/index.js delete mode 100644 src/containers/TriggerTemplates/TriggerTemplates.jsx delete mode 100644 src/containers/TriggerTemplates/TriggerTemplates.test.jsx delete mode 100644 src/containers/TriggerTemplates/index.js delete mode 100644 src/containers/Triggers/Triggers.jsx delete mode 100644 src/containers/Triggers/Triggers.test.jsx delete mode 100644 src/containers/Triggers/index.js diff --git a/packages/components/src/components/PipelineRuns/PipelineRuns.jsx b/packages/components/src/components/PipelineRuns/PipelineRuns.jsx index cb11fc518..eef86248f 100644 --- a/packages/components/src/components/PipelineRuns/PipelineRuns.jsx +++ b/packages/components/src/components/PipelineRuns/PipelineRuns.jsx @@ -165,8 +165,8 @@ const PipelineRuns = ({ const { reason, status } = getStatus(pipelineRun); const statusIcon = getPipelineRunStatusIcon(pipelineRun); const pipelineRunURL = getPipelineRunURL({ + name: pipelineRunName, namespace, - pipelineRunName, annotations }); const pipelineRunsByPipelineURL = diff --git a/packages/components/src/components/TaskRuns/TaskRuns.jsx b/packages/components/src/components/TaskRuns/TaskRuns.jsx index 3da09ce56..d699aea75 100644 --- a/packages/components/src/components/TaskRuns/TaskRuns.jsx +++ b/packages/components/src/components/TaskRuns/TaskRuns.jsx @@ -137,8 +137,8 @@ const TaskRuns = ({ } = getStatus(taskRun); const statusIcon = getTaskRunStatusIcon(taskRun); const taskRunURL = getTaskRunURL({ - namespace, - taskRunName + name: taskRunName, + namespace }); const taskRunsURL = diff --git a/packages/components/src/components/Trigger/Trigger.jsx b/packages/components/src/components/Trigger/Trigger.jsx index b0d307b6e..8e6379991 100644 --- a/packages/components/src/components/Trigger/Trigger.jsx +++ b/packages/components/src/components/Trigger/Trigger.jsx @@ -73,11 +73,11 @@ const Trigger = ({ namespace, trigger }) => { to={ binding.kind === 'ClusterTriggerBinding' ? urls.clusterTriggerBindings.byName({ - clusterTriggerBindingName: binding.ref + name: binding.ref }) : urls.triggerBindings.byName({ - namespace, - triggerBindingName: binding.ref + name: binding.ref, + namespace }) } > @@ -105,8 +105,8 @@ const Trigger = ({ namespace, trigger }) => { {triggerTemplateName} @@ -324,7 +324,7 @@ const Trigger = ({ namespace, trigger }) => { content = ( diff --git a/packages/utils/src/utils/router.js b/packages/utils/src/utils/router.js index 1d3c71401..cc48febc8 100644 --- a/packages/utils/src/utils/router.js +++ b/packages/utils/src/utils/router.js @@ -25,22 +25,25 @@ export const paths = { clusterTasks: { all() { return '/clustertasks'; + }, + byName() { + return '/clustertasks/:name'; } }, clusterInterceptors: { all() { return '/clusterinterceptors'; }, - byName: function byName() { - return '/clusterinterceptors/:clusterInterceptorName'; + byName() { + return '/clusterinterceptors/:name'; } }, clusterTriggerBindings: { all() { return '/clustertriggerbindings'; }, - byName: function byName() { - return '/clustertriggerbindings/:clusterTriggerBindingName'; + byName() { + return '/clustertriggerbindings/:name'; } }, customRuns: { @@ -48,7 +51,7 @@ export const paths = { return '/customruns'; }, byName() { - return byNamespace({ path: '/customruns/:runName' }); + return byNamespace({ path: '/customruns/:name' }); }, byNamespace() { return byNamespace({ path: '/customruns' }); @@ -62,7 +65,7 @@ export const paths = { return '/eventlisteners'; }, byName() { - return byNamespace({ path: '/eventlisteners/:eventListenerName' }); + return byNamespace({ path: '/eventlisteners/:name' }); }, byNamespace() { return byNamespace({ path: '/eventlisteners' }); @@ -76,7 +79,7 @@ export const paths = { return '/interceptors'; }, byName() { - return byNamespace({ path: '/interceptors/:interceptorName' }); + return byNamespace({ path: '/interceptors/:name' }); }, byNamespace() { return byNamespace({ path: '/interceptors' }); @@ -102,7 +105,7 @@ export const paths = { }, byName() { return byNamespace({ - path: '/pipelineruns/:pipelineRunName' + path: '/pipelineruns/:name' }); }, byNamespace() { @@ -116,19 +119,11 @@ export const paths = { all() { return '/pipelines'; }, - byNamespace() { - return byNamespace({ path: '/pipelines' }); - } - }, - rawCRD: { - all() { - return '/:kind'; + byName() { + return byNamespace({ path: '/pipelines/:name' }); }, byNamespace() { - return byNamespace({ path: '/:kind/:name' }); - }, - cluster() { - return '/:kind/:name'; + return byNamespace({ path: '/pipelines' }); } }, settings() { @@ -139,7 +134,7 @@ export const paths = { return '/taskruns'; }, byName() { - return byNamespace({ path: '/taskruns/:taskRunName' }); + return byNamespace({ path: '/taskruns/:name' }); }, byNamespace() { return byNamespace({ path: '/taskruns' }); @@ -152,6 +147,9 @@ export const paths = { all() { return '/tasks'; }, + byName() { + return byNamespace({ path: '/tasks/:name' }); + }, byNamespace() { return byNamespace({ path: '/tasks' }); } @@ -161,7 +159,7 @@ export const paths = { return '/triggerbindings'; }, byName() { - return byNamespace({ path: '/triggerbindings/:triggerBindingName' }); + return byNamespace({ path: '/triggerbindings/:name' }); }, byNamespace() { return byNamespace({ path: '/triggerbindings' }); @@ -172,7 +170,7 @@ export const paths = { return '/triggers'; }, byName() { - return byNamespace({ path: '/triggers/:triggerName' }); + return byNamespace({ path: '/triggers/:name' }); }, byNamespace() { return byNamespace({ path: '/triggers' }); @@ -183,7 +181,7 @@ export const paths = { return '/triggertemplates'; }, byName() { - return byNamespace({ path: '/triggertemplates/:triggerTemplateName' }); + return byNamespace({ path: '/triggertemplates/:name' }); }, byNamespace() { return byNamespace({ path: '/triggertemplates' }); diff --git a/packages/utils/src/utils/router.test.js b/packages/utils/src/utils/router.test.js index 60e201ba4..8bced391f 100644 --- a/packages/utils/src/utils/router.test.js +++ b/packages/utils/src/utils/router.test.js @@ -61,9 +61,11 @@ describe('clusterInterceptors', () => { ); }); it('byName', () => { - expect(urls.clusterInterceptors.byName({ clusterInterceptorName })).toEqual( + expect( + urls.clusterInterceptors.byName({ name: clusterInterceptorName }) + ).toEqual( generatePath(paths.clusterInterceptors.byName(), { - clusterInterceptorName + name: clusterInterceptorName }) ); }); @@ -77,10 +79,10 @@ describe('clusterTriggerBindings', () => { }); it('byName', () => { expect( - urls.clusterTriggerBindings.byName({ clusterTriggerBindingName }) + urls.clusterTriggerBindings.byName({ name: clusterTriggerBindingName }) ).toEqual( generatePath(paths.clusterTriggerBindings.byName(), { - clusterTriggerBindingName + name: clusterTriggerBindingName }) ); }); @@ -95,11 +97,11 @@ describe('eventListeners', () => { it('byName', () => { expect( - urls.eventListeners.byName({ namespace, eventListenerName }) + urls.eventListeners.byName({ name: eventListenerName, namespace }) ).toEqual( generatePath(paths.eventListeners.byName(), { - namespace, - eventListenerName + name: eventListenerName, + namespace }) ); }); @@ -176,10 +178,12 @@ describe('pipelineRuns', () => { }); it('byName', () => { - expect(urls.pipelineRuns.byName({ namespace, pipelineRunName })).toEqual( + expect( + urls.pipelineRuns.byName({ name: pipelineRunName, namespace }) + ).toEqual( generatePath(paths.pipelineRuns.byName(), { - namespace, - pipelineRunName + name: pipelineRunName, + namespace }) ); }); @@ -223,41 +227,16 @@ describe('pipelines', () => { }); }); -describe('rawCRD', () => { - it('all', () => { - const kind = 'tasks'; - expect(urls.rawCRD.all({ kind })).toEqual( - generatePath(paths.rawCRD.all(), { kind }) - ); - }); - - it('byNamespace', () => { - const kind = 'tasks'; - const name = taskName; - expect(urls.rawCRD.byNamespace({ namespace, kind, name })).toEqual( - generatePath(paths.rawCRD.byNamespace(), { kind, name, namespace }) - ); - }); - - it('cluster', () => { - const kind = 'tasks'; - const name = taskName; - expect(urls.rawCRD.cluster({ kind, name })).toEqual( - generatePath(paths.rawCRD.cluster(), { kind, name }) - ); - }); -}); - describe('customRuns', () => { it('all', () => { expect(urls.customRuns.all()).toEqual(generatePath(paths.customRuns.all())); }); it('byName', () => { - expect(urls.customRuns.byName({ namespace, runName })).toEqual( + expect(urls.customRuns.byName({ name: runName, namespace })).toEqual( generatePath(paths.customRuns.byName(), { - namespace, - runName + name: runName, + namespace }) ); }); @@ -290,8 +269,8 @@ describe('taskRuns', () => { }); it('byName', () => { - expect(urls.taskRuns.byName({ namespace, taskRunName })).toEqual( - generatePath(paths.taskRuns.byName(), { namespace, taskRunName }) + expect(urls.taskRuns.byName({ name: taskRunName, namespace })).toEqual( + generatePath(paths.taskRuns.byName(), { name: taskRunName, namespace }) ); }); @@ -340,11 +319,11 @@ describe('triggerBindings', () => { it('byName', () => { expect( - urls.triggerBindings.byName({ namespace, triggerBindingName }) + urls.triggerBindings.byName({ name: triggerBindingName, namespace }) ).toEqual( generatePath(paths.triggerBindings.byName(), { - namespace, - triggerBindingName + name: triggerBindingName, + namespace }) ); }); @@ -362,10 +341,10 @@ describe('triggers', () => { }); it('byName', () => { - expect(urls.triggers.byName({ namespace, triggerName })).toEqual( + expect(urls.triggers.byName({ name: triggerName, namespace })).toEqual( generatePath(paths.triggers.byName(), { - namespace, - triggerName + name: triggerName, + namespace }) ); }); @@ -386,11 +365,11 @@ describe('triggerTemplates', () => { it('byName', () => { expect( - urls.triggerTemplates.byName({ namespace, triggerTemplateName }) + urls.triggerTemplates.byName({ name: triggerTemplateName, namespace }) ).toEqual( generatePath(paths.triggerTemplates.byName(), { - namespace, - triggerTemplateName + name: triggerTemplateName, + namespace }) ); }); diff --git a/src/api/clusterInterceptors.js b/src/api/clusterInterceptors.js deleted file mode 100644 index 82d8d4782..000000000 --- a/src/api/clusterInterceptors.js +++ /dev/null @@ -1,32 +0,0 @@ -/* -Copyright 2021-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { triggersAPIGroup, useCollection, useResource } from './utils'; - -export function useClusterInterceptors(params) { - return useCollection({ - group: triggersAPIGroup, - kind: 'clusterinterceptors', - params, - version: 'v1alpha1' - }); -} - -export function useClusterInterceptor(params) { - return useResource({ - group: triggersAPIGroup, - kind: 'clusterinterceptors', - params, - version: 'v1alpha1' - }); -} diff --git a/src/api/clusterInterceptors.test.js b/src/api/clusterInterceptors.test.js deleted file mode 100644 index 5acbe15a8..000000000 --- a/src/api/clusterInterceptors.test.js +++ /dev/null @@ -1,45 +0,0 @@ -/* -Copyright 2021-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import * as API from './clusterInterceptors'; -import * as utils from './utils'; - -it('useClusterInterceptors', () => { - const query = { fake: 'query' }; - const params = { fake: 'params' }; - vi.spyOn(utils, 'useCollection').mockImplementation(() => query); - expect(API.useClusterInterceptors(params)).toEqual(query); - expect(utils.useCollection).toHaveBeenCalledWith( - expect.objectContaining({ - group: utils.triggersAPIGroup, - kind: 'clusterinterceptors', - params, - version: 'v1alpha1' - }) - ); -}); - -it('useClusterInterceptor', () => { - const query = { fake: 'query' }; - const params = { fake: 'params' }; - vi.spyOn(utils, 'useResource').mockImplementation(() => query); - expect(API.useClusterInterceptor(params)).toEqual(query); - expect(utils.useResource).toHaveBeenCalledWith( - expect.objectContaining({ - group: utils.triggersAPIGroup, - kind: 'clusterinterceptors', - params, - version: 'v1alpha1' - }) - ); -}); diff --git a/src/api/clusterTriggerBindings.js b/src/api/clusterTriggerBindings.js index 879c21c0a..e79ea8935 100644 --- a/src/api/clusterTriggerBindings.js +++ b/src/api/clusterTriggerBindings.js @@ -11,16 +11,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { triggersAPIGroup, useCollection, useResource } from './utils'; - -export function useClusterTriggerBindings(params) { - return useCollection({ - group: triggersAPIGroup, - kind: 'clustertriggerbindings', - params, - version: 'v1beta1' - }); -} +import { triggersAPIGroup, useResource } from './utils'; export function useClusterTriggerBinding(params) { return useResource({ diff --git a/src/api/clusterTriggerBindings.test.js b/src/api/clusterTriggerBindings.test.js index 610d3b3bf..847c98454 100644 --- a/src/api/clusterTriggerBindings.test.js +++ b/src/api/clusterTriggerBindings.test.js @@ -14,21 +14,6 @@ limitations under the License. import * as API from './clusterTriggerBindings'; import * as utils from './utils'; -it('useClusterTriggerBindings', () => { - const query = { fake: 'query' }; - const params = { fake: 'params' }; - vi.spyOn(utils, 'useCollection').mockImplementation(() => query); - expect(API.useClusterTriggerBindings(params)).toEqual(query); - expect(utils.useCollection).toHaveBeenCalledWith( - expect.objectContaining({ - group: utils.triggersAPIGroup, - kind: 'clustertriggerbindings', - params, - version: 'v1beta1' - }) - ); -}); - it('useClusterTriggerBinding', () => { const query = { fake: 'query' }; const params = { fake: 'params' }; diff --git a/src/api/eventListeners.js b/src/api/eventListeners.js index 9ccc8239e..cc8a5620f 100644 --- a/src/api/eventListeners.js +++ b/src/api/eventListeners.js @@ -11,16 +11,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { triggersAPIGroup, useCollection, useResource } from './utils'; - -export function useEventListeners(params) { - return useCollection({ - group: triggersAPIGroup, - kind: 'eventlisteners', - params, - version: 'v1beta1' - }); -} +import { triggersAPIGroup, useResource } from './utils'; export function useEventListener(params) { return useResource({ diff --git a/src/api/eventListeners.test.js b/src/api/eventListeners.test.js index 7734e452c..301559120 100644 --- a/src/api/eventListeners.test.js +++ b/src/api/eventListeners.test.js @@ -14,21 +14,6 @@ limitations under the License. import * as API from './eventListeners'; import * as utils from './utils'; -it('useEventListeners', () => { - const query = { fake: 'query' }; - const params = { fake: 'params' }; - vi.spyOn(utils, 'useCollection').mockImplementation(() => query); - expect(API.useEventListeners(params)).toEqual(query); - expect(utils.useCollection).toHaveBeenCalledWith( - expect.objectContaining({ - group: utils.triggersAPIGroup, - kind: 'eventlisteners', - params, - version: 'v1beta1' - }) - ); -}); - it('useEventListener', () => { const query = { fake: 'query' }; const params = { fake: 'params' }; diff --git a/src/api/index.js b/src/api/index.js index dab25d220..d4d19d163 100644 --- a/src/api/index.js +++ b/src/api/index.js @@ -31,13 +31,11 @@ import { import importResourcesPipelineRunTemplate from './resources/import-resources-pipelinerun.yaml'; export { NamespaceContext, useSelectedNamespace } from './utils'; -export * from './clusterInterceptors'; export * from './clusterTasks'; export * from './clusterTriggerBindings'; export * from './customRuns'; export * from './eventListeners'; export * from './extensions'; -export * from './interceptors'; export * from './pipelineRuns'; export * from './pipelines'; export * from './serviceAccounts'; @@ -60,15 +58,6 @@ export function useCustomResources( }); } -export function useCustomResource({ group, kind, version, ...params }) { - return useResource({ - group, - kind, - params, - version - }); -} - export function useTaskByKind({ kind, ...rest }, queryConfig) { if (kind === 'ClusterTask') { return useClusterTask({ ...rest }, queryConfig); @@ -260,10 +249,11 @@ export function getAPIResource({ group, kind, version }) { ); } -export function useAPIResource(params) { +export function useAPIResource(params, queryConfig) { return useResource({ group: params.group, queryConfig: { + ...queryConfig, queryFn: () => getAPIResource(params) }, version: params.version diff --git a/src/api/index.test.js b/src/api/index.test.js index 5c4d3339a..0c98bf8fd 100644 --- a/src/api/index.test.js +++ b/src/api/index.test.js @@ -24,28 +24,6 @@ import * as TasksAPI from './tasks'; import * as comms from './comms'; import * as utils from './utils'; -it('useCustomResource', () => { - const group = 'fake_group'; - const kind = 'fake_kind'; - const version = 'fake_version'; - const params = { fake: 'params', group, kind, version }; - const query = { fake: 'query' }; - vi.spyOn(utils, 'useResource').mockImplementation(() => query); - const returnValue = API.useCustomResource(params); - - expect(utils.useResource).toHaveBeenCalledWith( - expect.objectContaining({ - group, - kind, - params: { - fake: 'params' - }, - version - }) - ); - expect(returnValue).toEqual(query); -}); - it('useCustomResources', async () => { const group = 'fake_group'; const kind = 'fake_kind'; diff --git a/src/api/interceptors.js b/src/api/interceptors.js deleted file mode 100644 index c10395e27..000000000 --- a/src/api/interceptors.js +++ /dev/null @@ -1,32 +0,0 @@ -/* -Copyright 2022-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { triggersAPIGroup, useCollection, useResource } from './utils'; - -export function useInterceptors(params) { - return useCollection({ - group: triggersAPIGroup, - kind: 'interceptors', - params, - version: 'v1alpha1' - }); -} - -export function useInterceptor(params) { - return useResource({ - group: triggersAPIGroup, - kind: 'interceptors', - params, - version: 'v1alpha1' - }); -} diff --git a/src/api/interceptors.test.js b/src/api/interceptors.test.js deleted file mode 100644 index 35217c23f..000000000 --- a/src/api/interceptors.test.js +++ /dev/null @@ -1,45 +0,0 @@ -/* -Copyright 2022-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import * as API from './interceptors'; -import * as utils from './utils'; - -it('useInterceptors', () => { - const query = { fake: 'query' }; - const params = { fake: 'params' }; - vi.spyOn(utils, 'useCollection').mockImplementation(() => query); - expect(API.useInterceptors(params)).toEqual(query); - expect(utils.useCollection).toHaveBeenCalledWith( - expect.objectContaining({ - group: utils.triggersAPIGroup, - kind: 'interceptors', - params, - version: 'v1alpha1' - }) - ); -}); - -it('useInterceptor', () => { - const query = { fake: 'query' }; - const params = { fake: 'params' }; - vi.spyOn(utils, 'useResource').mockImplementation(() => query); - expect(API.useInterceptor(params)).toEqual(query); - expect(utils.useResource).toHaveBeenCalledWith( - expect.objectContaining({ - group: utils.triggersAPIGroup, - kind: 'interceptors', - params, - version: 'v1alpha1' - }) - ); -}); diff --git a/src/api/triggerBindings.js b/src/api/triggerBindings.js index 101796c54..1c1d36669 100644 --- a/src/api/triggerBindings.js +++ b/src/api/triggerBindings.js @@ -11,16 +11,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { triggersAPIGroup, useCollection, useResource } from './utils'; - -export function useTriggerBindings(params) { - return useCollection({ - group: triggersAPIGroup, - kind: 'triggerbindings', - params, - version: 'v1beta1' - }); -} +import { triggersAPIGroup, useResource } from './utils'; export function useTriggerBinding(params) { return useResource({ diff --git a/src/api/triggerBindings.test.js b/src/api/triggerBindings.test.js index fc5901d6d..fca8a0fa1 100644 --- a/src/api/triggerBindings.test.js +++ b/src/api/triggerBindings.test.js @@ -14,21 +14,6 @@ limitations under the License. import * as API from './triggerBindings'; import * as utils from './utils'; -it('useTriggerBindings', () => { - const query = { fake: 'query' }; - const params = { fake: 'params' }; - vi.spyOn(utils, 'useCollection').mockImplementation(() => query); - expect(API.useTriggerBindings(params)).toEqual(query); - expect(utils.useCollection).toHaveBeenCalledWith( - expect.objectContaining({ - group: utils.triggersAPIGroup, - kind: 'triggerbindings', - params, - version: 'v1beta1' - }) - ); -}); - it('useTriggerBinding', () => { const query = { fake: 'query' }; const params = { fake: 'params' }; diff --git a/src/api/triggerTemplates.js b/src/api/triggerTemplates.js index 214d20975..c1928a6b2 100644 --- a/src/api/triggerTemplates.js +++ b/src/api/triggerTemplates.js @@ -11,16 +11,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { triggersAPIGroup, useCollection, useResource } from './utils'; - -export function useTriggerTemplates(params) { - return useCollection({ - group: triggersAPIGroup, - kind: 'triggertemplates', - params, - version: 'v1beta1' - }); -} +import { triggersAPIGroup, useResource } from './utils'; export function useTriggerTemplate(params) { return useResource({ diff --git a/src/api/triggerTemplates.test.js b/src/api/triggerTemplates.test.js index c304adb86..02b0cdb53 100644 --- a/src/api/triggerTemplates.test.js +++ b/src/api/triggerTemplates.test.js @@ -14,21 +14,6 @@ limitations under the License. import * as API from './triggerTemplates'; import * as utils from './utils'; -it('useTriggerTemplates', () => { - const query = { fake: 'query' }; - const params = { fake: 'params' }; - vi.spyOn(utils, 'useCollection').mockImplementation(() => query); - expect(API.useTriggerTemplates(params)).toEqual(query); - expect(utils.useCollection).toHaveBeenCalledWith( - expect.objectContaining({ - group: utils.triggersAPIGroup, - kind: 'triggertemplates', - params, - version: 'v1beta1' - }) - ); -}); - it('useTriggerTemplate', () => { const query = { fake: 'query' }; const params = { fake: 'params' }; diff --git a/src/api/triggers.js b/src/api/triggers.js index 9e84c8393..778d61a7e 100644 --- a/src/api/triggers.js +++ b/src/api/triggers.js @@ -11,16 +11,7 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { triggersAPIGroup, useCollection, useResource } from './utils'; - -export function useTriggers(params) { - return useCollection({ - group: triggersAPIGroup, - kind: 'triggers', - params, - version: 'v1beta1' - }); -} +import { triggersAPIGroup, useResource } from './utils'; export function useTrigger(params) { return useResource({ diff --git a/src/api/triggers.test.js b/src/api/triggers.test.js index 2eebcd641..f2f9c8bf8 100644 --- a/src/api/triggers.test.js +++ b/src/api/triggers.test.js @@ -14,21 +14,6 @@ limitations under the License. import * as API from './triggers'; import * as utils from './utils'; -it('useTriggers', () => { - const query = { fake: 'query' }; - const params = { fake: 'params' }; - vi.spyOn(utils, 'useCollection').mockImplementation(() => query); - expect(API.useTriggers(params)).toEqual(query); - expect(utils.useCollection).toHaveBeenCalledWith( - expect.objectContaining({ - group: utils.triggersAPIGroup, - kind: 'triggers', - params, - version: 'v1beta1' - }) - ); -}); - it('useTrigger', () => { const query = { fake: 'query' }; const params = { fake: 'params' }; diff --git a/src/containers/ClusterInterceptors/ClusterInterceptors.jsx b/src/containers/ClusterInterceptors/ClusterInterceptors.jsx deleted file mode 100644 index 7d0409860..000000000 --- a/src/containers/ClusterInterceptors/ClusterInterceptors.jsx +++ /dev/null @@ -1,124 +0,0 @@ -/* -Copyright 2021-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { useLocation } from 'react-router-dom'; -import { useIntl } from 'react-intl'; -import { getFilters, urls, useTitleSync } from '@tektoncd/dashboard-utils'; -import { FormattedDate, Link, Table } from '@tektoncd/dashboard-components'; - -import ListPageLayout from '../ListPageLayout'; -import { useClusterInterceptors } from '../../api'; - -function getFormattedResources(resources) { - return resources.map(clusterInterceptor => ({ - id: clusterInterceptor.metadata.uid, - name: ( - - {clusterInterceptor.metadata.name} - - ), - createdTime: ( - - ) - })); -} - -function ClusterInterceptors() { - const intl = useIntl(); - const location = useLocation(); - const filters = getFilters(location); - - useTitleSync({ page: 'ClusterInterceptors' }); - - const { - data: clusterInterceptors = [], - error, - isLoading - } = useClusterInterceptors({ filters }); - - function getError() { - if (error) { - return { - error, - title: intl.formatMessage( - { - id: 'dashboard.resourceList.errorLoading', - defaultMessage: 'Error loading {type}' - }, - { type: 'ClusterInterceptors' } - ) - }; - } - - return null; - } - - const headers = [ - { - key: 'name', - header: intl.formatMessage({ - id: 'dashboard.tableHeader.name', - defaultMessage: 'Name' - }) - }, - { - key: 'createdTime', - header: intl.formatMessage({ - id: 'dashboard.tableHeader.createdTime', - defaultMessage: 'Created' - }) - } - ]; - - return ( - - {({ resources }) => ( - - )} - - ); -} - -export default ClusterInterceptors; diff --git a/src/containers/ClusterInterceptors/ClusterInterceptors.test.jsx b/src/containers/ClusterInterceptors/ClusterInterceptors.test.jsx deleted file mode 100644 index 1243a33d9..000000000 --- a/src/containers/ClusterInterceptors/ClusterInterceptors.test.jsx +++ /dev/null @@ -1,66 +0,0 @@ -/* -Copyright 2021-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { paths, urls } from '@tektoncd/dashboard-utils'; - -import { renderWithRouter } from '../../utils/test'; -import * as API from '../../api/clusterInterceptors'; -import ClusterInterceptorsContainer from './ClusterInterceptors'; - -const clusterInterceptor = { - metadata: { - name: 'clusterInterceptorWithSingleLabel', - uid: 'clusterInterceptorWithSingleLabel-id', - labels: { - foo: 'bar' - } - } -}; - -describe('ClusterInterceptors', () => { - it('renders loading state', async () => { - vi.spyOn(API, 'useClusterInterceptors').mockImplementation(() => ({ - isLoading: true - })); - const { queryByText } = renderWithRouter(, { - path: paths.clusterInterceptors.all(), - route: urls.clusterInterceptors.all() - }); - expect(queryByText('ClusterInterceptors')).toBeTruthy(); - }); - - it('renders data', async () => { - vi.spyOn(API, 'useClusterInterceptors').mockImplementation(() => ({ - data: [clusterInterceptor] - })); - const { queryByText } = renderWithRouter(, { - path: paths.clusterInterceptors.all(), - route: urls.clusterInterceptors.all() - }); - - expect(queryByText('clusterInterceptorWithSingleLabel')).toBeTruthy(); - }); - - it('handles error', async () => { - const error = 'fake_errorMessage'; - vi.spyOn(API, 'useClusterInterceptors').mockImplementation(() => ({ - error - })); - const { queryByText } = renderWithRouter(, { - path: paths.clusterInterceptors.all(), - route: urls.clusterInterceptors.all() - }); - - expect(queryByText(error)).toBeTruthy(); - }); -}); diff --git a/src/containers/ClusterInterceptors/index.js b/src/containers/ClusterInterceptors/index.js deleted file mode 100644 index 955d606e6..000000000 --- a/src/containers/ClusterInterceptors/index.js +++ /dev/null @@ -1,15 +0,0 @@ -/* -Copyright 2021 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -/* istanbul ignore file */ - -export { default } from './ClusterInterceptors'; diff --git a/src/containers/ClusterTasks/ClusterTasks.jsx b/src/containers/ClusterTasks/ClusterTasks.jsx index 1178608a4..5d7d0eea1 100644 --- a/src/containers/ClusterTasks/ClusterTasks.jsx +++ b/src/containers/ClusterTasks/ClusterTasks.jsx @@ -43,8 +43,7 @@ function getFormattedResources({ id: clusterTask.metadata.uid, name: ( ({ - id: name, - name, + clusterTriggerBinding?.spec.params.map(({ name: paramName, value }) => ({ + id: paramName, + name: paramName, value })) || []; diff --git a/src/containers/ClusterTriggerBinding/ClusterTriggerBinding.test.jsx b/src/containers/ClusterTriggerBinding/ClusterTriggerBinding.test.jsx index 34bb915f4..d0ead8545 100644 --- a/src/containers/ClusterTriggerBinding/ClusterTriggerBinding.test.jsx +++ b/src/containers/ClusterTriggerBinding/ClusterTriggerBinding.test.jsx @@ -102,7 +102,7 @@ it('ClusterTriggerBindingContainer renders YAML', async () => { { path: paths.clusterTriggerBindings.byName(), route: urls.clusterTriggerBindings.byName({ - clusterTriggerBindingName + name: clusterTriggerBindingName }) } ); diff --git a/src/containers/ClusterTriggerBindings/ClusterTriggerBindings.jsx b/src/containers/ClusterTriggerBindings/ClusterTriggerBindings.jsx deleted file mode 100644 index 62ed32463..000000000 --- a/src/containers/ClusterTriggerBindings/ClusterTriggerBindings.jsx +++ /dev/null @@ -1,109 +0,0 @@ -/* -Copyright 2020-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { useLocation } from 'react-router-dom'; -import { useIntl } from 'react-intl'; -import { getFilters, urls, useTitleSync } from '@tektoncd/dashboard-utils'; -import { FormattedDate, Link, Table } from '@tektoncd/dashboard-components'; - -import ListPageLayout from '../ListPageLayout'; -import { useClusterTriggerBindings } from '../../api'; - -function getFormattedResources(resources) { - return resources.map(binding => ({ - id: `${binding.metadata.name}`, - name: ( - - {binding.metadata.name} - - ), - date: - })); -} - -function ClusterTriggerBindings() { - const intl = useIntl(); - const location = useLocation(); - const filters = getFilters(location); - - useTitleSync({ page: 'ClusterTriggerBindings' }); - - const { - data: clusterTriggerBindings = [], - error, - isLoading - } = useClusterTriggerBindings({ filters }); - - function getError() { - if (error) { - return { error }; - } - - return null; - } - - const initialHeaders = [ - { - key: 'name', - header: intl.formatMessage({ - id: 'dashboard.tableHeader.name', - defaultMessage: 'Name' - }) - }, - { - key: 'date', - header: intl.formatMessage({ - id: 'dashboard.tableHeader.createdTime', - defaultMessage: 'Created' - }) - } - ]; - - return ( - - {({ resources }) => ( -
- )} - - ); -} - -export default ClusterTriggerBindings; diff --git a/src/containers/ClusterTriggerBindings/ClusterTriggerBindings.test.jsx b/src/containers/ClusterTriggerBindings/ClusterTriggerBindings.test.jsx deleted file mode 100644 index 72c0fe09d..000000000 --- a/src/containers/ClusterTriggerBindings/ClusterTriggerBindings.test.jsx +++ /dev/null @@ -1,110 +0,0 @@ -/* -Copyright 2020-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { fireEvent } from '@testing-library/react'; - -import { renderWithRouter } from '../../utils/test'; -import ClusterTriggerBindings from '.'; -import * as API from '../../api/clusterTriggerBindings'; - -const clusterTriggerBinding = { - apiVersion: 'triggers.tekton.dev/v1alpha1', - kind: 'ClusterTriggerBinding', - metadata: { - creationTimestamp: '2019-11-12T19:29:46Z', - name: 'cluster-trigger-binding', - namespace: 'default', - uid: 'c930f02e-0582-11ea-8c1f-025765432111' - } -}; - -it('ClusterTriggerBindings renders with no bindings', () => { - vi.spyOn(API, 'useClusterTriggerBindings').mockImplementation(() => ({ - data: [] - })); - - const { getByText } = renderWithRouter(, { - path: '/clustertriggerbindings', - route: '/clustertriggerbindings' - }); - - expect(getByText('ClusterTriggerBindings')).toBeTruthy(); - expect(getByText('No matching ClusterTriggerBindings found')).toBeTruthy(); -}); - -it('ClusterTriggerBindings renders with one binding', () => { - vi.spyOn(API, 'useClusterTriggerBindings').mockImplementation(() => ({ - data: [clusterTriggerBinding] - })); - - const { queryByText } = renderWithRouter(, { - path: '/clustertriggerbindings', - route: '/clustertriggerbindings' - }); - - expect(queryByText('ClusterTriggerBindings')).toBeTruthy(); - expect(queryByText(clusterTriggerBinding.metadata.name)).toBeTruthy(); -}); - -it('ClusterTriggerBindings can be filtered on a single label filter', async () => { - vi.spyOn(API, 'useClusterTriggerBindings').mockImplementation( - ({ filters }) => ({ - data: filters.length ? [] : [clusterTriggerBinding] - }) - ); - - const { queryByText, getByPlaceholderText, getByText } = renderWithRouter( - , - { - path: '/clustertriggerbindings', - route: '/clustertriggerbindings' - } - ); - - const filterValue = 'baz:bam'; - const filterInputField = getByPlaceholderText(/Input a label filter/); - fireEvent.change(filterInputField, { target: { value: filterValue } }); - fireEvent.submit(getByText(/Input a label filter/i)); - - expect(queryByText(filterValue)).toBeTruthy(); - expect(queryByText('cluster-trigger-bindings')).toBeFalsy(); -}); - -it('ClusterTriggerBindings renders in loading state', () => { - vi.spyOn(API, 'useClusterTriggerBindings').mockImplementation(() => ({ - isLoading: true - })); - - const { queryByText } = renderWithRouter(, { - path: '/clustertriggerbindings', - route: '/clustertriggerbindings' - }); - - expect(queryByText(/ClusterTriggerBindings/i)).toBeTruthy(); - expect(queryByText('No matching ClusterTriggerBindings found')).toBeFalsy(); - expect(queryByText('cluster-trigger-bindings')).toBeFalsy(); -}); - -it('ClusterTriggerBindings renders in error state', () => { - const error = 'fake_error_message'; - vi.spyOn(API, 'useClusterTriggerBindings').mockImplementation(() => ({ - error - })); - - const { queryByText } = renderWithRouter(, { - path: '/clustertriggerbindings', - route: '/clustertriggerbindings' - }); - - expect(queryByText(error)).toBeTruthy(); -}); diff --git a/src/containers/ClusterTriggerBindings/index.js b/src/containers/ClusterTriggerBindings/index.js deleted file mode 100644 index 0e29f2704..000000000 --- a/src/containers/ClusterTriggerBindings/index.js +++ /dev/null @@ -1,15 +0,0 @@ -/* -Copyright 2020-2021 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -/* istanbul ignore file */ - -export { default } from './ClusterTriggerBindings'; diff --git a/src/containers/CustomResourceDefinition/CustomResourceDefinition.jsx b/src/containers/CustomResourceDefinition/CustomResourceDefinition.jsx index bd27ee189..320252427 100644 --- a/src/containers/CustomResourceDefinition/CustomResourceDefinition.jsx +++ b/src/containers/CustomResourceDefinition/CustomResourceDefinition.jsx @@ -12,42 +12,34 @@ limitations under the License. */ /* istanbul ignore file */ -import { useLocation, useNavigate, useParams } from 'react-router-dom'; +import { + useLocation, + useMatches, + useNavigate, + useParams +} from 'react-router-dom'; import { useTitleSync } from '@tektoncd/dashboard-utils'; import { ResourceDetails } from '@tektoncd/dashboard-components'; import { getViewChangeHandler } from '../../utils'; -import { - useClusterInterceptor, - useClusterTask, - useCustomResource, - useInterceptor, - usePipeline, - useTask -} from '../../api'; - -function useResource({ group, kind, name, namespace, version }) { - switch (kind) { - case 'clusterinterceptors': - return useClusterInterceptor({ name }); - case 'clustertasks': - return useClusterTask({ name }); - case 'interceptors': - return useInterceptor({ name, namespace }); - case 'pipelines': - return usePipeline({ name, namespace }); - case 'tasks': - return useTask({ name, namespace }); - default: - return useCustomResource({ group, kind, name, namespace, version }); - } -} +import { useResource } from '../../api/utils'; function CustomResourceDefinition() { const location = useLocation(); const navigate = useNavigate(); + + const matches = useMatches(); const params = useParams(); - const { group, kind, name, namespace, version } = params; + + const { name, namespace } = params; + const match = matches.at(-1); + let { group, kind, version } = match.handle || {}; + + if (!(group && kind && version)) { + // we're on a kubernetes resource extension page + // grab values directly from the URL + ({ group, kind, version } = params); + } const queryParams = new URLSearchParams(location.search); const view = queryParams.get('view'); @@ -55,8 +47,10 @@ function CustomResourceDefinition() { const { data, error, isFetching } = useResource({ group, kind, - name, - namespace, + params: { + name, + namespace + }, version }); diff --git a/src/containers/CustomRun/CustomRun.jsx b/src/containers/CustomRun/CustomRun.jsx index a1328d516..eb91db339 100644 --- a/src/containers/CustomRun/CustomRun.jsx +++ b/src/containers/CustomRun/CustomRun.jsx @@ -99,7 +99,7 @@ function CustomRun() { const intl = useIntl(); const location = useLocation(); const navigate = useNavigate(); - const { namespace, runName: resourceName } = useParams(); + const { namespace, name: resourceName } = useParams(); const queryParams = new URLSearchParams(location.search); const view = queryParams.get('view'); @@ -177,8 +177,8 @@ function CustomRun() { setShowNotification({ kind: 'success', logsURL: urls.customRuns.byName({ - namespace, - runName: newRun.metadata.name + name: newRun.metadata.name, + namespace }), message: intl.formatMessage({ id: 'dashboard.rerun.triggered', diff --git a/src/containers/CustomRuns/CustomRuns.jsx b/src/containers/CustomRuns/CustomRuns.jsx index 8795d0b76..13346ec5c 100644 --- a/src/containers/CustomRuns/CustomRuns.jsx +++ b/src/containers/CustomRuns/CustomRuns.jsx @@ -437,8 +437,8 @@ function CustomRuns() { diff --git a/src/containers/EventListener/EventListener.jsx b/src/containers/EventListener/EventListener.jsx index 8d66d2597..b5fed95ee 100644 --- a/src/containers/EventListener/EventListener.jsx +++ b/src/containers/EventListener/EventListener.jsx @@ -25,14 +25,14 @@ export function EventListenerContainer() { const navigate = useNavigate(); const location = useLocation(); const params = useParams(); - const { eventListenerName, namespace } = params; + const { name, namespace } = params; const queryParams = new URLSearchParams(location.search); const view = queryParams.get('view'); useTitleSync({ page: 'EventListener', - resourceName: eventListenerName + resourceName: name }); const { @@ -40,7 +40,7 @@ export function EventListenerContainer() { error, isFetching } = useEventListener({ - name: eventListenerName, + name, namespace }); @@ -109,8 +109,8 @@ export function EventListenerContainer() { Trigger: diff --git a/src/containers/EventListener/EventListener.stories.jsx b/src/containers/EventListener/EventListener.stories.jsx index 3528ab688..e2cc925a2 100644 --- a/src/containers/EventListener/EventListener.stories.jsx +++ b/src/containers/EventListener/EventListener.stories.jsx @@ -141,7 +141,7 @@ const props = { intl }; export default { args: { - path: '/namespaces/:namespace/eventlisteners/:eventListenerName', + path: '/namespaces/:namespace/eventlisteners/:name', route: `/namespaces/${namespace}/eventlisteners/${name}` }, component: EventListenerContainer, diff --git a/src/containers/EventListener/EventListener.test.jsx b/src/containers/EventListener/EventListener.test.jsx index 25fb80df0..f979057d3 100644 --- a/src/containers/EventListener/EventListener.test.jsx +++ b/src/containers/EventListener/EventListener.test.jsx @@ -135,7 +135,7 @@ it('EventListener displays with formatted labels', async () => { , { path: paths.eventListeners.byName(), - route: urls.eventListeners.byName({ eventListenerName, namespace }) + route: urls.eventListeners.byName({ name: eventListenerName, namespace }) } ); @@ -178,7 +178,7 @@ it('EventListener handles no serviceAccountName', async () => { , { path: paths.eventListeners.byName(), - route: urls.eventListeners.byName({ eventListenerName, namespace }) + route: urls.eventListeners.byName({ name: eventListenerName, namespace }) } ); @@ -201,7 +201,7 @@ it('EventListener handles no service type', async () => { , { path: paths.eventListeners.byName(), - route: urls.eventListeners.byName({ eventListenerName, namespace }) + route: urls.eventListeners.byName({ name: eventListenerName, namespace }) } ); diff --git a/src/containers/EventListeners/EventListeners.jsx b/src/containers/EventListeners/EventListeners.jsx deleted file mode 100644 index 8823082c4..000000000 --- a/src/containers/EventListeners/EventListeners.jsx +++ /dev/null @@ -1,124 +0,0 @@ -/* -Copyright 2019-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { useLocation, useParams } from 'react-router-dom'; -import { useIntl } from 'react-intl'; -import { getFilters, urls, useTitleSync } from '@tektoncd/dashboard-utils'; -import { FormattedDate, Link, Table } from '@tektoncd/dashboard-components'; - -import ListPageLayout from '../ListPageLayout'; -import { useEventListeners, useSelectedNamespace } from '../../api'; - -function getFormattedResources(resources) { - return resources.map(listener => ({ - id: `${listener.metadata.namespace}:${listener.metadata.name}`, - name: ( - - {listener.metadata.name} - - ), - namespace: listener.metadata.namespace, - date: - })); -} - -function EventListeners() { - const intl = useIntl(); - const location = useLocation(); - const params = useParams(); - const filters = getFilters(location); - - useTitleSync({ page: 'EventListeners' }); - - const { selectedNamespace: defaultNamespace } = useSelectedNamespace(); - const { namespace: selectedNamespace = defaultNamespace } = params; - - const { - data: eventListeners = [], - error, - isLoading - } = useEventListeners({ - filters, - namespace: selectedNamespace - }); - - function getError() { - if (error) { - return { error }; - } - - return null; - } - - const initialHeaders = [ - { - key: 'name', - header: intl.formatMessage({ - id: 'dashboard.tableHeader.name', - defaultMessage: 'Name' - }) - }, - { - key: 'namespace', - header: 'Namespace' - }, - { - key: 'date', - header: intl.formatMessage({ - id: 'dashboard.tableHeader.createdTime', - defaultMessage: 'Created' - }) - } - ]; - - return ( - - {({ resources }) => ( -
- )} - - ); -} - -export default EventListeners; diff --git a/src/containers/EventListeners/EventListeners.test.jsx b/src/containers/EventListeners/EventListeners.test.jsx deleted file mode 100644 index 1d0631628..000000000 --- a/src/containers/EventListeners/EventListeners.test.jsx +++ /dev/null @@ -1,123 +0,0 @@ -/* -Copyright 2019-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { fireEvent } from '@testing-library/react'; -import { ALL_NAMESPACES } from '@tektoncd/dashboard-utils'; - -import { renderWithRouter } from '../../utils/test'; -import EventListeners from '.'; -import * as API from '../../api'; -import * as APIUtils from '../../api/utils'; -import * as EventListenersAPI from '../../api/eventListeners'; - -const eventListener = { - apiVersion: 'triggers.tekton.dev/v1alpha1', - kind: 'EventListener', - metadata: { - creationTimestamp: '2019-11-12T19:29:46Z', - name: 'event-listener', - namespace: 'default', - uid: 'c930f02e-0582-11ea-8c1f-025765432111' - } -}; - -describe('EventListeners', () => { - beforeEach(() => { - vi.spyOn(API, 'useNamespaces').mockImplementation(() => ({ - data: [{ metadata: { name: 'default' } }] - })); - vi.spyOn(APIUtils, 'useSelectedNamespace').mockImplementation(() => ({ - selectedNamespace: ALL_NAMESPACES - })); - }); - - it('renders with no bindings', () => { - vi.spyOn(EventListenersAPI, 'useEventListeners').mockImplementation(() => ({ - data: [] - })); - - const { getByText } = renderWithRouter(, { - path: '/eventlisteners', - route: '/eventlisteners' - }); - - expect(getByText('EventListeners')).toBeTruthy(); - expect(getByText('No matching EventListeners found')).toBeTruthy(); - }); - - it('renders with one binding', () => { - vi.spyOn(EventListenersAPI, 'useEventListeners').mockImplementation(() => ({ - data: [eventListener] - })); - - const { queryByText, queryByTitle } = renderWithRouter(, { - path: '/eventlisteners', - route: '/eventlisteners' - }); - - expect(queryByText('EventListeners')).toBeTruthy(); - expect(queryByText('No matching EventListeners found')).toBeFalsy(); - expect(queryByText('event-listener')).toBeTruthy(); - expect(queryByTitle('event-listener')).toBeTruthy(); - }); - - it('can be filtered on a single label filter', async () => { - vi.spyOn(EventListenersAPI, 'useEventListeners').mockImplementation( - ({ filters }) => ({ - data: filters.length ? [] : [eventListener] - }) - ); - - const { getByPlaceholderText, getByText, queryByText } = renderWithRouter( - , - { path: '/eventlisteners', route: '/eventlisteners' } - ); - - const filterValue = 'baz:bam'; - const filterInputField = getByPlaceholderText(/Input a label filter/); - fireEvent.change(filterInputField, { target: { value: filterValue } }); - fireEvent.submit(getByText(/Input a label filter/i)); - - expect(queryByText(filterValue)).toBeTruthy(); - expect(queryByText('event-listeners')).toBeFalsy(); - }); - - it('renders in loading state', () => { - vi.spyOn(EventListenersAPI, 'useEventListeners').mockImplementation(() => ({ - isLoading: true - })); - - const { queryByText } = renderWithRouter(, { - path: '/eventlisteners', - route: '/eventlisteners' - }); - - expect(queryByText(/EventListeners/i)).toBeTruthy(); - expect(queryByText('No matching EventListeners found')).toBeFalsy(); - expect(queryByText('event-listeners')).toBeFalsy(); - }); - - it('renders in error state', () => { - const error = 'fake_error_message'; - vi.spyOn(EventListenersAPI, 'useEventListeners').mockImplementation(() => ({ - error - })); - - const { queryByText } = renderWithRouter(, { - path: '/eventlisteners', - route: '/eventlisteners' - }); - - expect(queryByText(error)).toBeTruthy(); - }); -}); diff --git a/src/containers/EventListeners/index.js b/src/containers/EventListeners/index.js deleted file mode 100644 index 84ab5ea75..000000000 --- a/src/containers/EventListeners/index.js +++ /dev/null @@ -1,15 +0,0 @@ -/* -Copyright 2019-2021 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -/* istanbul ignore file */ - -export { default } from './EventListeners'; diff --git a/src/containers/ImportResources/ImportResources.jsx b/src/containers/ImportResources/ImportResources.jsx index 5943c0dc6..7df254442 100644 --- a/src/containers/ImportResources/ImportResources.jsx +++ b/src/containers/ImportResources/ImportResources.jsx @@ -168,8 +168,8 @@ export function ImportResources() { const pipelineRunName = body.metadata.name; const finalURL = urls.pipelineRuns.byName({ - namespace: importerNamespace, - pipelineRunName + name: pipelineRunName, + namespace: importerNamespace }); setLogsURL(finalURL); diff --git a/src/containers/ImportResources/ImportResources.test.jsx b/src/containers/ImportResources/ImportResources.test.jsx index e27c24920..3ff0ca505 100644 --- a/src/containers/ImportResources/ImportResources.test.jsx +++ b/src/containers/ImportResources/ImportResources.test.jsx @@ -139,8 +139,8 @@ describe('ImportResources component', () => { )[0].innerHTML ).toContain( urls.pipelineRuns.byName({ - namespace: 'tekton-dashboard', - pipelineRunName + name: pipelineRunName, + namespace: 'tekton-dashboard' }) ); }); diff --git a/src/containers/Interceptors/Interceptors.jsx b/src/containers/Interceptors/Interceptors.jsx deleted file mode 100644 index 316b3bdbc..000000000 --- a/src/containers/Interceptors/Interceptors.jsx +++ /dev/null @@ -1,126 +0,0 @@ -/* -Copyright 2022-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { useLocation, useParams } from 'react-router-dom'; -import { useIntl } from 'react-intl'; -import { getFilters, urls, useTitleSync } from '@tektoncd/dashboard-utils'; -import { FormattedDate, Link, Table } from '@tektoncd/dashboard-components'; - -import ListPageLayout from '../ListPageLayout'; -import { useInterceptors, useSelectedNamespace } from '../../api'; - -function getFormattedResources(resources) { - return resources.map(interceptor => ({ - id: `${interceptor.metadata.namespace}:${interceptor.metadata.name}`, - name: ( - - {interceptor.metadata.name} - - ), - namespace: interceptor.metadata.namespace, - date: ( - - ) - })); -} - -export function Interceptors() { - const intl = useIntl(); - const location = useLocation(); - const params = useParams(); - const filters = getFilters(location); - - const { selectedNamespace } = useSelectedNamespace(); - const { namespace = selectedNamespace } = params; - - useTitleSync({ page: 'Interceptors' }); - - const { - data: interceptors = [], - error, - isLoading - } = useInterceptors({ - filters, - namespace - }); - - function getError() { - if (error) { - return { error }; - } - - return null; - } - - const initialHeaders = [ - { - key: 'name', - header: intl.formatMessage({ - id: 'dashboard.tableHeader.name', - defaultMessage: 'Name' - }) - }, - { - key: 'namespace', - header: 'Namespace' - }, - { - key: 'date', - header: intl.formatMessage({ - id: 'dashboard.tableHeader.createdTime', - defaultMessage: 'Created' - }) - } - ]; - - return ( - - {({ resources }) => ( -
- )} - - ); -} - -export default Interceptors; diff --git a/src/containers/Interceptors/Interceptors.test.jsx b/src/containers/Interceptors/Interceptors.test.jsx deleted file mode 100644 index fac4abc17..000000000 --- a/src/containers/Interceptors/Interceptors.test.jsx +++ /dev/null @@ -1,122 +0,0 @@ -/* -Copyright 2022-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { fireEvent } from '@testing-library/react'; -import { ALL_NAMESPACES } from '@tektoncd/dashboard-utils'; - -import { renderWithRouter } from '../../utils/test'; -import Interceptors from '.'; -import * as API from '../../api'; -import * as APIUtils from '../../api/utils'; -import * as InterceptorsAPI from '../../api/interceptors'; - -const interceptor = { - apiVersion: 'triggers.tekton.dev/v1alpha1', - kind: 'interceptor', - metadata: { - creationTimestamp: '2019-11-12T19:29:46Z', - name: 'interceptor', - namespace: 'default', - uid: 'c930f02e-0582-11ea-8c1f-025765432111' - } -}; - -describe('Interceptors', () => { - beforeEach(() => { - vi.spyOn(API, 'useNamespaces').mockImplementation(() => ({ - data: [{ metadata: { name: 'default' } }] - })); - vi.spyOn(APIUtils, 'useSelectedNamespace').mockImplementation(() => ({ - selectedNamespace: ALL_NAMESPACES - })); - }); - - it('renders with no interceptors', () => { - vi.spyOn(InterceptorsAPI, 'useInterceptors').mockImplementation(() => ({ - data: [] - })); - - const { getByText } = renderWithRouter(, { - path: '/interceptors', - route: '/interceptors' - }); - - expect(getByText('Interceptors')).toBeTruthy(); - expect(getByText('No matching Interceptors found')).toBeTruthy(); - }); - - it('renders with one interceptor', () => { - vi.spyOn(InterceptorsAPI, 'useInterceptors').mockImplementation(() => ({ - data: [interceptor] - })); - - const { queryByText } = renderWithRouter(, { - path: '/interceptors', - route: '/interceptors' - }); - - expect(queryByText('Interceptors')).toBeTruthy(); - expect(queryByText('No matching Interceptors found')).toBeFalsy(); - expect(queryByText('interceptor')).toBeTruthy(); - }); - - it('can be filtered on a single label filter', async () => { - vi.spyOn(InterceptorsAPI, 'useInterceptors').mockImplementation( - ({ filters }) => ({ - data: filters.length ? [] : [interceptor] - }) - ); - - const { queryByText, getByPlaceholderText, getByText } = renderWithRouter( - , - { path: '/interceptors', route: '/interceptors' } - ); - - const filterValue = 'baz:bam'; - const filterInputField = getByPlaceholderText(/Input a label filter/); - fireEvent.change(filterInputField, { target: { value: filterValue } }); - fireEvent.submit(getByText(/Input a label filter/i)); - - expect(queryByText(filterValue)).toBeTruthy(); - expect(queryByText('interceptor')).toBeFalsy(); - }); - - it('renders in loading state', () => { - vi.spyOn(InterceptorsAPI, 'useInterceptors').mockImplementation(() => ({ - isLoading: true - })); - - const { queryByText } = renderWithRouter(, { - path: '/interceptors', - route: '/interceptors' - }); - - expect(queryByText(/interceptors/i)).toBeTruthy(); - expect(queryByText('No matching Interceptors found')).toBeFalsy(); - expect(queryByText('interceptor')).toBeFalsy(); - }); - - it('renders in error state', () => { - const error = 'fake_error_message'; - vi.spyOn(InterceptorsAPI, 'useInterceptors').mockImplementation(() => ({ - error - })); - - const { queryByText } = renderWithRouter(, { - path: '/interceptors', - route: '/interceptors' - }); - - expect(queryByText(error)).toBeTruthy(); - }); -}); diff --git a/src/containers/Interceptors/index.js b/src/containers/Interceptors/index.js deleted file mode 100644 index 0aae15550..000000000 --- a/src/containers/Interceptors/index.js +++ /dev/null @@ -1,15 +0,0 @@ -/* -Copyright 2022 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -/* istanbul ignore file */ - -export { default } from './Interceptors'; diff --git a/src/containers/PipelineRun/PipelineRun.jsx b/src/containers/PipelineRun/PipelineRun.jsx index 296dd3c10..a9cc05989 100644 --- a/src/containers/PipelineRun/PipelineRun.jsx +++ b/src/containers/PipelineRun/PipelineRun.jsx @@ -66,7 +66,7 @@ export /* istanbul ignore next */ function PipelineRunContainer() { const navigate = useNavigate(); const params = useParams(); - const { namespace, pipelineRunName } = params; + const { name, namespace } = params; const queryParams = new URLSearchParams(location.search); const currentPipelineTaskName = queryParams.get(PIPELINE_TASK); @@ -94,7 +94,7 @@ export /* istanbul ignore next */ function PipelineRunContainer() { useTitleSync({ page: 'PipelineRun', - resourceName: pipelineRunName + resourceName: name }); useEffect(() => { @@ -114,14 +114,14 @@ export /* istanbul ignore next */ function PipelineRunContainer() { data: pipelineRun, error: pipelineRunError, isLoading: isLoadingPipelineRun - } = usePipelineRun({ name: pipelineRunName, namespace }); + } = usePipelineRun({ name, namespace }); const { data: taskRunsResponse = [], error: taskRunsError, isLoading: isLoadingTaskRuns } = useTaskRuns({ - filters: [`${labelConstants.PIPELINE_RUN}=${pipelineRunName}`], + filters: [`${labelConstants.PIPELINE_RUN}=${name}`], namespace }); @@ -219,10 +219,9 @@ export /* istanbul ignore next */ function PipelineRunContainer() { const savedCancelStatus = localStorage.getItem( preferences.CANCEL_STATUS_KEY ); - const { name, namespace: resourceNamespace } = pipelineRun.metadata; cancelPipelineRun({ name, - namespace: resourceNamespace, + namespace, status: savedCancelStatus }).catch(err => { err.response.text().then(text => { @@ -237,8 +236,7 @@ export /* istanbul ignore next */ function PipelineRunContainer() { } function deleteRun() { - const { name, namespace: resourceNamespace } = pipelineRun.metadata; - deletePipelineRun({ name, namespace: resourceNamespace }) + deletePipelineRun({ name, namespace }) .then(() => { navigate(urls.pipelineRuns.byNamespace({ namespace })); }) diff --git a/src/containers/PipelineRun/PipelineRun.test.jsx b/src/containers/PipelineRun/PipelineRun.test.jsx index 7c32c5714..a98648ccc 100644 --- a/src/containers/PipelineRun/PipelineRun.test.jsx +++ b/src/containers/PipelineRun/PipelineRun.test.jsx @@ -77,7 +77,7 @@ it('PipelineRunContainer renders not found state', async () => { , { path: paths.pipelineRuns.byName(), - route: urls.pipelineRuns.byName({ pipelineRunName, namespace }) + route: urls.pipelineRuns.byName({ name: pipelineRunName, namespace }) } ); await findByText(/Page not found/); @@ -111,7 +111,7 @@ it('PipelineRunContainer renders error state', async () => { , { path: paths.pipelineRuns.byName(), - route: urls.pipelineRuns.byName({ pipelineRunName, namespace }) + route: urls.pipelineRuns.byName({ name: pipelineRunName, namespace }) } ); await findByText(/Page not found/); diff --git a/src/containers/Pipelines/Pipelines.jsx b/src/containers/Pipelines/Pipelines.jsx index cabfc310b..826537f7b 100644 --- a/src/containers/Pipelines/Pipelines.jsx +++ b/src/containers/Pipelines/Pipelines.jsx @@ -53,8 +53,7 @@ function getFormattedResources({ id: pipeline.metadata.uid, name: ( {({ resources: paginatedResources }) => (
{ const { creationTimestamp, @@ -125,22 +189,7 @@ export function ResourceListContainer() { id: uid, name: ( {name} @@ -150,9 +199,7 @@ export function ResourceListContainer() { createdTime: }; })} - loading={isLoadingAPIResource || isLoadingResources} - emptyTextAllNamespaces={emptyText} - emptyTextSelectedNamespace={emptyText} + selectedNamespace={isNamespaced ? namespace : ALL_NAMESPACES} /> )} diff --git a/src/containers/TaskRun/TaskRun.jsx b/src/containers/TaskRun/TaskRun.jsx index 79994dd95..5d17feba8 100644 --- a/src/containers/TaskRun/TaskRun.jsx +++ b/src/containers/TaskRun/TaskRun.jsx @@ -66,7 +66,7 @@ export function TaskRunContainer() { const navigate = useNavigate(); const params = useParams(); - const { namespace: namespaceParam, taskRunName } = params; + const { name, namespace: namespaceParam } = params; const queryParams = new URLSearchParams(location.search); let currentRetry = queryParams.get(RETRY); @@ -93,7 +93,7 @@ export function TaskRunContainer() { useTitleSync({ page: 'TaskRun', - resourceName: taskRunName + resourceName: name }); const { @@ -101,7 +101,7 @@ export function TaskRunContainer() { error, isLoading: isLoadingTaskRun } = useTaskRun({ - name: taskRunName, + name, namespace }); @@ -246,8 +246,8 @@ export function TaskRunContainer() { setShowNotification({ kind: 'success', logsURL: urls.taskRuns.byName({ - namespace, - taskRunName: newRun.metadata.name + name: newRun.metadata.name, + namespace }), message: intl.formatMessage({ id: 'dashboard.rerun.triggered', diff --git a/src/containers/Tasks/Tasks.jsx b/src/containers/Tasks/Tasks.jsx index 9898fe0ee..884deef50 100644 --- a/src/containers/Tasks/Tasks.jsx +++ b/src/containers/Tasks/Tasks.jsx @@ -53,8 +53,7 @@ function getFormattedResources({ id: task.metadata.uid, name: ( { } })); - const path = '/namespaces/:namespace/triggers/:triggerName'; + const path = '/namespaces/:namespace/triggers/:name'; const { queryByText } = renderWithRouter(, { path, route: `/namespaces/${namespace}/triggers/${triggerName}` diff --git a/src/containers/TriggerBinding/TriggerBinding.jsx b/src/containers/TriggerBinding/TriggerBinding.jsx index 24030ade2..54b5e14c8 100644 --- a/src/containers/TriggerBinding/TriggerBinding.jsx +++ b/src/containers/TriggerBinding/TriggerBinding.jsx @@ -24,7 +24,7 @@ export function TriggerBindingContainer() { const location = useLocation(); const navigate = useNavigate(); const params = useParams(); - const { namespace, triggerBindingName: resourceName } = params; + const { namespace, name: resourceName } = params; const queryParams = new URLSearchParams(location.search); const view = queryParams.get('view'); diff --git a/src/containers/TriggerBinding/TriggerBinding.test.jsx b/src/containers/TriggerBinding/TriggerBinding.test.jsx index f2a941846..d82bb8da0 100644 --- a/src/containers/TriggerBinding/TriggerBinding.test.jsx +++ b/src/containers/TriggerBinding/TriggerBinding.test.jsx @@ -104,8 +104,8 @@ it('TriggerBindingContainer renders YAML', async () => { { path: paths.triggerBindings.byName(), route: urls.triggerBindings.byName({ - namespace, - triggerBindingName + name: triggerBindingName, + namespace }) } ); diff --git a/src/containers/TriggerBindings/TriggerBindings.jsx b/src/containers/TriggerBindings/TriggerBindings.jsx deleted file mode 100644 index 48b93f02f..000000000 --- a/src/containers/TriggerBindings/TriggerBindings.jsx +++ /dev/null @@ -1,124 +0,0 @@ -/* -Copyright 2019-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { useLocation, useParams } from 'react-router-dom'; -import { useIntl } from 'react-intl'; -import { getFilters, urls, useTitleSync } from '@tektoncd/dashboard-utils'; -import { FormattedDate, Link, Table } from '@tektoncd/dashboard-components'; - -import ListPageLayout from '../ListPageLayout'; -import { useSelectedNamespace, useTriggerBindings } from '../../api'; - -function getFormattedResources(resources) { - return resources.map(binding => ({ - id: `${binding.metadata.namespace}:${binding.metadata.name}`, - name: ( - - {binding.metadata.name} - - ), - namespace: binding.metadata.namespace, - date: - })); -} - -export function TriggerBindings() { - const intl = useIntl(); - const location = useLocation(); - const params = useParams(); - const filters = getFilters(location); - - const { selectedNamespace } = useSelectedNamespace(); - const { namespace = selectedNamespace } = params; - - useTitleSync({ page: 'TriggerBindings' }); - - const { - data: triggerBindings = [], - error, - isLoading - } = useTriggerBindings({ - filters, - namespace - }); - - function getError() { - if (error) { - return { error }; - } - - return null; - } - - const initialHeaders = [ - { - key: 'name', - header: intl.formatMessage({ - id: 'dashboard.tableHeader.name', - defaultMessage: 'Name' - }) - }, - { - key: 'namespace', - header: 'Namespace' - }, - { - key: 'date', - header: intl.formatMessage({ - id: 'dashboard.tableHeader.createdTime', - defaultMessage: 'Created' - }) - } - ]; - - return ( - - {({ resources }) => ( -
- )} - - ); -} - -export default TriggerBindings; diff --git a/src/containers/TriggerBindings/TriggerBindings.test.jsx b/src/containers/TriggerBindings/TriggerBindings.test.jsx deleted file mode 100644 index 2e59c5941..000000000 --- a/src/containers/TriggerBindings/TriggerBindings.test.jsx +++ /dev/null @@ -1,122 +0,0 @@ -/* -Copyright 2019-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { fireEvent } from '@testing-library/react'; -import { ALL_NAMESPACES } from '@tektoncd/dashboard-utils'; - -import { renderWithRouter } from '../../utils/test'; -import TriggerBindings from '.'; -import * as API from '../../api'; -import * as APIUtils from '../../api/utils'; -import * as TriggerBindingsAPI from '../../api/triggerBindings'; - -const triggerBinding = { - apiVersion: 'triggers.tekton.dev/v1alpha1', - kind: 'triggerBinding', - metadata: { - creationTimestamp: '2019-11-12T19:29:46Z', - name: 'trigger-binding', - namespace: 'default', - uid: 'c930f02e-0582-11ea-8c1f-025765432111' - } -}; - -describe('TriggerBindings', () => { - beforeEach(() => { - vi.spyOn(API, 'useNamespaces').mockImplementation(() => ({ - data: [{ metadata: { name: 'default' } }] - })); - vi.spyOn(APIUtils, 'useSelectedNamespace').mockImplementation(() => ({ - selectedNamespace: ALL_NAMESPACES - })); - }); - - it('renders with no bindings', () => { - vi.spyOn(TriggerBindingsAPI, 'useTriggerBindings').mockImplementation( - () => ({ data: [] }) - ); - - const { getByText } = renderWithRouter(, { - path: '/triggerbindings', - route: '/triggerbindings' - }); - - expect(getByText('TriggerBindings')).toBeTruthy(); - expect(getByText('No matching TriggerBindings found')).toBeTruthy(); - }); - - it('renders with one binding', () => { - vi.spyOn(TriggerBindingsAPI, 'useTriggerBindings').mockImplementation( - () => ({ data: [triggerBinding] }) - ); - - const { queryByText } = renderWithRouter(, { - path: '/triggerbindings', - route: '/triggerbindings' - }); - - expect(queryByText('TriggerBindings')).toBeTruthy(); - expect(queryByText('No matching TriggerBindings found')).toBeFalsy(); - expect(queryByText('trigger-binding')).toBeTruthy(); - }); - - it('can be filtered on a single label filter', async () => { - vi.spyOn(TriggerBindingsAPI, 'useTriggerBindings').mockImplementation( - ({ filters }) => ({ - data: filters.length ? [] : [triggerBinding] - }) - ); - - const { queryByText, getByPlaceholderText, getByText } = renderWithRouter( - , - { path: '/triggerbindings', route: '/triggerbindings' } - ); - - const filterValue = 'baz:bam'; - const filterInputField = getByPlaceholderText(/Input a label filter/); - fireEvent.change(filterInputField, { target: { value: filterValue } }); - fireEvent.submit(getByText(/Input a label filter/i)); - - expect(queryByText(filterValue)).toBeTruthy(); - expect(queryByText('trigger-bindings')).toBeFalsy(); - }); - - it('renders in loading state', () => { - vi.spyOn(TriggerBindingsAPI, 'useTriggerBindings').mockImplementation( - () => ({ isLoading: true }) - ); - - const { queryByText } = renderWithRouter(, { - path: '/triggerbindings', - route: '/triggerbindings' - }); - - expect(queryByText(/TriggerBindings/i)).toBeTruthy(); - expect(queryByText('No matching TriggerBindings found')).toBeFalsy(); - expect(queryByText('trigger-bindings')).toBeFalsy(); - }); - - it('renders in error state', () => { - const error = 'fake_error_message'; - vi.spyOn(TriggerBindingsAPI, 'useTriggerBindings').mockImplementation( - () => ({ error }) - ); - - const { queryByText } = renderWithRouter(, { - path: '/triggerbindings', - route: '/triggerbindings' - }); - - expect(queryByText(error)).toBeTruthy(); - }); -}); diff --git a/src/containers/TriggerBindings/index.js b/src/containers/TriggerBindings/index.js deleted file mode 100644 index ffe3a9545..000000000 --- a/src/containers/TriggerBindings/index.js +++ /dev/null @@ -1,15 +0,0 @@ -/* -Copyright 2019-2021 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -/* istanbul ignore file */ - -export { default } from './TriggerBindings'; diff --git a/src/containers/TriggerTemplate/TriggerTemplate.jsx b/src/containers/TriggerTemplate/TriggerTemplate.jsx index fb3b354a1..3ff9281dd 100644 --- a/src/containers/TriggerTemplate/TriggerTemplate.jsx +++ b/src/containers/TriggerTemplate/TriggerTemplate.jsx @@ -42,7 +42,7 @@ export /* istanbul ignore next */ function TriggerTemplateContainer() { const intl = useIntl(); const location = useLocation(); const navigate = useNavigate(); - const { namespace, triggerTemplateName: resourceName } = useParams(); + const { namespace, name: resourceName } = useParams(); const queryParams = new URLSearchParams(location.search); const view = queryParams.get('view'); diff --git a/src/containers/TriggerTemplate/TriggerTemplate.test.jsx b/src/containers/TriggerTemplate/TriggerTemplate.test.jsx index 624b48117..aa4aca1f5 100644 --- a/src/containers/TriggerTemplate/TriggerTemplate.test.jsx +++ b/src/containers/TriggerTemplate/TriggerTemplate.test.jsx @@ -194,8 +194,8 @@ it('TriggerTemplateContainer contains YAML tab with accurate information', async { path: paths.triggerTemplates.byName(), route: urls.triggerTemplates.byName({ - namespace, - triggerTemplateName: 'pipeline-template' + name: 'pipeline-template', + namespace }) } ); diff --git a/src/containers/TriggerTemplates/TriggerTemplates.jsx b/src/containers/TriggerTemplates/TriggerTemplates.jsx deleted file mode 100644 index 0e34c125c..000000000 --- a/src/containers/TriggerTemplates/TriggerTemplates.jsx +++ /dev/null @@ -1,120 +0,0 @@ -/* -Copyright 2019-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { useLocation, useParams } from 'react-router-dom'; -import { useIntl } from 'react-intl'; -import { getFilters, urls, useTitleSync } from '@tektoncd/dashboard-utils'; -import { FormattedDate, Link, Table } from '@tektoncd/dashboard-components'; - -import ListPageLayout from '../ListPageLayout'; -import { useSelectedNamespace, useTriggerTemplates } from '../../api'; - -function getFormattedResources(resources) { - return resources.map(template => ({ - id: `${template.metadata.namespace}:${template.metadata.name}`, - name: ( - - {template.metadata.name} - - ), - namespace: template.metadata.namespace, - date: - })); -} - -function TriggerTemplates() { - const intl = useIntl(); - useTitleSync({ page: 'TriggerTemplates' }); - - const location = useLocation(); - const params = useParams(); - const filters = getFilters(location); - const { selectedNamespace: defaultNamespace } = useSelectedNamespace(); - const { namespace: selectedNamespace = defaultNamespace } = params; - - const { - data: triggerTemplates = [], - error, - isLoading - } = useTriggerTemplates({ filters, namespace: selectedNamespace }); - - function getError() { - if (error) { - return { error }; - } - - return null; - } - - const initialHeaders = [ - { - key: 'name', - header: intl.formatMessage({ - id: 'dashboard.tableHeader.name', - defaultMessage: 'Name' - }) - }, - { - key: 'namespace', - header: 'Namespace' - }, - { - key: 'date', - header: intl.formatMessage({ - id: 'dashboard.tableHeader.createdTime', - defaultMessage: 'Created' - }) - } - ]; - - return ( - - {({ resources }) => ( -
- )} - - ); -} - -export default TriggerTemplates; diff --git a/src/containers/TriggerTemplates/TriggerTemplates.test.jsx b/src/containers/TriggerTemplates/TriggerTemplates.test.jsx deleted file mode 100644 index db121aac9..000000000 --- a/src/containers/TriggerTemplates/TriggerTemplates.test.jsx +++ /dev/null @@ -1,117 +0,0 @@ -/* -Copyright 2019-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { fireEvent } from '@testing-library/react'; -import { ALL_NAMESPACES } from '@tektoncd/dashboard-utils'; - -import { renderWithRouter } from '../../utils/test'; -import TriggerTemplates from '.'; -import * as API from '../../api'; -import * as APIUtils from '../../api/utils'; -import * as TriggerTemplatesAPI from '../../api/triggerTemplates'; - -const triggerTemplate = { - apiVersion: 'triggers.tekton.dev/v1alpha1', - kind: 'TriggerTemplate', - metadata: { - creationTimestamp: '2019-11-12T19:29:46Z', - name: 'trigger-template', - namespace: 'default', - uid: 'c930f02e-0582-11ea-8c1f-025765432111' - } -}; - -it('TriggerTemplates renders with no templates', () => { - vi.spyOn(TriggerTemplatesAPI, 'useTriggerTemplates').mockImplementation( - () => ({ data: [] }) - ); - - vi.spyOn(API, 'useNamespaces').mockImplementation(() => ({ - data: [{ metadata: { name: 'default' } }] - })); - vi.spyOn(APIUtils, 'useSelectedNamespace').mockImplementation(() => ({ - selectedNamespace: ALL_NAMESPACES - })); - - const { queryByText } = renderWithRouter(, { - path: '/triggertemplates', - route: '/triggertemplates' - }); - - expect(queryByText('TriggerTemplates')).toBeTruthy(); - expect(queryByText('No matching TriggerTemplates found')).toBeTruthy(); -}); - -it('TriggerTemplates renders with one template', () => { - vi.spyOn(TriggerTemplatesAPI, 'useTriggerTemplates').mockImplementation( - () => ({ data: [triggerTemplate] }) - ); - - const { queryByText } = renderWithRouter(, { - path: '/triggertemplates', - route: '/triggertemplates' - }); - - expect(queryByText(/TriggerTemplates/i)).toBeTruthy(); - expect(queryByText('No matching TriggerTemplates found')).toBeFalsy(); - expect(queryByText('trigger-template')).toBeTruthy(); -}); - -it('TriggerTemplates can be filtered on a single label filter', async () => { - vi.spyOn(TriggerTemplatesAPI, 'useTriggerTemplates').mockImplementation( - ({ filters }) => ({ - data: filters.length ? [] : [triggerTemplate] - }) - ); - - const { queryByText, getByPlaceholderText, getByText } = renderWithRouter( - , - { path: '/triggertemplates', route: '/triggertemplates' } - ); - - const filterValue = 'baz:bam'; - const filterInputField = getByPlaceholderText(/Input a label filter/); - fireEvent.change(filterInputField, { target: { value: filterValue } }); - fireEvent.submit(getByText(/Input a label filter/i)); - - expect(queryByText(filterValue)).toBeTruthy(); - expect(queryByText('trigger-template')).toBeFalsy(); -}); - -it('TriggerTemplates renders in loading state', () => { - vi.spyOn(TriggerTemplatesAPI, 'useTriggerTemplates').mockImplementation( - () => ({ isLoading: true }) - ); - - const { queryByText } = renderWithRouter(, { - path: '/triggertemplates', - route: '/triggertemplates' - }); - - expect(queryByText(/TriggerTemplates/i)).toBeTruthy(); - expect(queryByText('No matching TriggerTemplates found')).toBeFalsy(); -}); - -it('TriggerTemplates renders in error state', () => { - const error = 'fake_error_message'; - vi.spyOn(TriggerTemplatesAPI, 'useTriggerTemplates').mockImplementation( - () => ({ error }) - ); - - const { queryByText } = renderWithRouter(, { - path: '/triggertemplates', - route: '/triggertemplates' - }); - - expect(queryByText(error)).toBeTruthy(); -}); diff --git a/src/containers/TriggerTemplates/index.js b/src/containers/TriggerTemplates/index.js deleted file mode 100644 index 273d6f03e..000000000 --- a/src/containers/TriggerTemplates/index.js +++ /dev/null @@ -1,15 +0,0 @@ -/* -Copyright 2019-2021 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -/* istanbul ignore file */ - -export { default } from './TriggerTemplates'; diff --git a/src/containers/Triggers/Triggers.jsx b/src/containers/Triggers/Triggers.jsx deleted file mode 100644 index 64218a10b..000000000 --- a/src/containers/Triggers/Triggers.jsx +++ /dev/null @@ -1,134 +0,0 @@ -/* -Copyright 2021-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { useLocation, useParams } from 'react-router-dom'; -import { useIntl } from 'react-intl'; -import { getFilters, urls, useTitleSync } from '@tektoncd/dashboard-utils'; -import { FormattedDate, Link, Table } from '@tektoncd/dashboard-components'; - -import ListPageLayout from '../ListPageLayout'; -import { useSelectedNamespace, useTriggers } from '../../api'; - -function getFormattedResources(resources) { - return resources.map(trigger => ({ - id: trigger.metadata.uid, - name: ( - - {trigger.metadata.name} - - ), - namespace: trigger.metadata.namespace, - createdTime: ( - - ) - })); -} - -function Triggers() { - const intl = useIntl(); - useTitleSync({ page: 'Triggers' }); - - const location = useLocation(); - const params = useParams(); - const filters = getFilters(location); - const { selectedNamespace } = useSelectedNamespace(); - const { namespace = selectedNamespace } = params; - - const { - data: triggers = [], - error, - isLoading - } = useTriggers({ - filters, - namespace - }); - - function getError() { - if (error) { - return { - error, - title: intl.formatMessage( - { - id: 'dashboard.resourceList.errorLoading', - defaultMessage: 'Error loading {type}' - }, - { type: 'Triggers' } - ) - }; - } - - return null; - } - - const headers = [ - { - key: 'name', - header: intl.formatMessage({ - id: 'dashboard.tableHeader.name', - defaultMessage: 'Name' - }) - }, - { - key: 'namespace', - header: 'Namespace' - }, - { - key: 'createdTime', - header: intl.formatMessage({ - id: 'dashboard.tableHeader.createdTime', - defaultMessage: 'Created' - }) - } - ]; - - return ( - - {({ resources }) => ( -
- )} - - ); -} - -export default Triggers; diff --git a/src/containers/Triggers/Triggers.test.jsx b/src/containers/Triggers/Triggers.test.jsx deleted file mode 100644 index cfc8a3bd8..000000000 --- a/src/containers/Triggers/Triggers.test.jsx +++ /dev/null @@ -1,67 +0,0 @@ -/* -Copyright 2021-2024 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ - -import { paths, urls } from '@tektoncd/dashboard-utils'; - -import { renderWithRouter } from '../../utils/test'; -import * as API from '../../api/triggers'; -import TriggersContainer from './Triggers'; - -describe('Triggers', () => { - it('renders loading state', async () => { - vi.spyOn(API, 'useTriggers').mockImplementation(() => ({ - isLoading: true - })); - const { queryByText } = renderWithRouter(, { - path: paths.triggers.all(), - route: urls.triggers.all() - }); - expect(queryByText('Triggers')).toBeTruthy(); - }); - - it('renders resources', async () => { - vi.spyOn(API, 'useTriggers').mockImplementation(() => ({ - data: [ - { - metadata: { - name: 'triggerWithSingleLabel', - namespace: 'namespace-1', - uid: 'triggerWithSingleLabel-id', - labels: { - foo: 'bar' - } - } - } - ] - })); - const { queryByText } = renderWithRouter(, { - path: paths.triggers.all(), - route: urls.triggers.all() - }); - - expect(queryByText('triggerWithSingleLabel')).toBeTruthy(); - }); - - it('handles error', async () => { - const errorMessage = 'fake_errorMessage'; - vi.spyOn(API, 'useTriggers').mockImplementation(() => ({ - error: errorMessage - })); - const { queryByText } = renderWithRouter(, { - path: paths.triggers.all(), - route: urls.triggers.all() - }); - - expect(queryByText(errorMessage)).toBeTruthy(); - }); -}); diff --git a/src/containers/Triggers/index.js b/src/containers/Triggers/index.js deleted file mode 100644 index 1196a0b11..000000000 --- a/src/containers/Triggers/index.js +++ /dev/null @@ -1,15 +0,0 @@ -/* -Copyright 2021 The Tekton Authors -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - http://www.apache.org/licenses/LICENSE-2.0 -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. -*/ -/* istanbul ignore file */ - -export { default } from './Triggers'; diff --git a/src/containers/index.js b/src/containers/index.js index 55aa53ab2..5dacdc021 100644 --- a/src/containers/index.js +++ b/src/containers/index.js @@ -12,11 +12,9 @@ limitations under the License. */ /* istanbul ignore file */ export { default as About } from './About'; -export { default as ClusterInterceptors } from './ClusterInterceptors'; export { default as ClusterTasks } from './ClusterTasks'; export { default as ClusterTasksDropdown } from './ClusterTasksDropdown'; export { default as ClusterTriggerBinding } from './ClusterTriggerBinding'; -export { default as ClusterTriggerBindings } from './ClusterTriggerBindings'; export { default as CustomResourceDefinition } from './CustomResourceDefinition'; export { default as CreateCustomRun } from './CreateCustomRun'; export { default as CreatePipelineRun } from './CreatePipelineRun'; @@ -25,11 +23,9 @@ export { default as CustomRun } from './CustomRun'; export { default as CustomRuns } from './CustomRuns'; export { default as ErrorPage } from './ErrorPage'; export { default as EventListener } from './EventListener'; -export { default as EventListeners } from './EventListeners'; export { default as Header } from './Header'; export { default as HeaderBarContent } from './HeaderBarContent'; export { default as ImportResources } from './ImportResources'; -export { default as Interceptors } from './Interceptors'; export { default as LabelFilter } from './LabelFilter'; export { default as ListPageLayout } from './ListPageLayout'; export { default as LoadingShell } from './LoadingShell'; @@ -50,8 +46,5 @@ export { default as TasksDropdown } from './TasksDropdown'; export { default as TaskRun } from './TaskRun'; export { default as TaskRuns } from './TaskRuns'; export { default as TriggerBinding } from './TriggerBinding'; -export { default as TriggerBindings } from './TriggerBindings'; export { default as Trigger } from './Trigger'; -export { default as Triggers } from './Triggers'; export { default as TriggerTemplate } from './TriggerTemplate'; -export { default as TriggerTemplates } from './TriggerTemplates'; diff --git a/src/nls/messages_de.json b/src/nls/messages_de.json index 4278d2476..4bb7dfd86 100644 --- a/src/nls/messages_de.json +++ b/src/nls/messages_de.json @@ -209,7 +209,6 @@ "dashboard.resourceDetails.errorloading": "", "dashboard.resourceDetails.spec.description": "", "dashboard.resourceDetails.spec.displayName": "", - "dashboard.resourceList.emptyState": "", "dashboard.resourceList.errorLoading": "", "dashboard.resourceList.viewRuns": "", "dashboard.run.duration": "Dauer: {duration}", diff --git a/src/nls/messages_en.json b/src/nls/messages_en.json index 816a17831..1566a8237 100644 --- a/src/nls/messages_en.json +++ b/src/nls/messages_en.json @@ -209,7 +209,6 @@ "dashboard.resourceDetails.errorloading": "Error loading resource", "dashboard.resourceDetails.spec.description": "Description:", "dashboard.resourceDetails.spec.displayName": "Display name:", - "dashboard.resourceList.emptyState": "No matching resources found for type {type}", "dashboard.resourceList.errorLoading": "Error loading {type}", "dashboard.resourceList.viewRuns": "View {kind} of {resource}", "dashboard.run.duration": "Duration: {duration}", diff --git a/src/nls/messages_es.json b/src/nls/messages_es.json index 91de973c1..abac7603b 100644 --- a/src/nls/messages_es.json +++ b/src/nls/messages_es.json @@ -209,7 +209,6 @@ "dashboard.resourceDetails.errorloading": "", "dashboard.resourceDetails.spec.description": "", "dashboard.resourceDetails.spec.displayName": "", - "dashboard.resourceList.emptyState": "", "dashboard.resourceList.errorLoading": "", "dashboard.resourceList.viewRuns": "", "dashboard.run.duration": "Duración: {duration}", diff --git a/src/nls/messages_fr.json b/src/nls/messages_fr.json index 904dad2bf..30b44763c 100644 --- a/src/nls/messages_fr.json +++ b/src/nls/messages_fr.json @@ -209,7 +209,6 @@ "dashboard.resourceDetails.errorloading": "", "dashboard.resourceDetails.spec.description": "", "dashboard.resourceDetails.spec.displayName": "", - "dashboard.resourceList.emptyState": "", "dashboard.resourceList.errorLoading": "", "dashboard.resourceList.viewRuns": "", "dashboard.run.duration": "Durée: {duration}", diff --git a/src/nls/messages_it.json b/src/nls/messages_it.json index fae6857b0..6d9fa81a5 100644 --- a/src/nls/messages_it.json +++ b/src/nls/messages_it.json @@ -209,7 +209,6 @@ "dashboard.resourceDetails.errorloading": "", "dashboard.resourceDetails.spec.description": "", "dashboard.resourceDetails.spec.displayName": "", - "dashboard.resourceList.emptyState": "", "dashboard.resourceList.errorLoading": "", "dashboard.resourceList.viewRuns": "", "dashboard.run.duration": "Durata: {duration}", diff --git a/src/nls/messages_ja.json b/src/nls/messages_ja.json index b40e054a5..15417b244 100644 --- a/src/nls/messages_ja.json +++ b/src/nls/messages_ja.json @@ -209,7 +209,6 @@ "dashboard.resourceDetails.errorloading": "リソースのロード中にエラーが発生しました", "dashboard.resourceDetails.spec.description": "", "dashboard.resourceDetails.spec.displayName": "", - "dashboard.resourceList.emptyState": "{type}のリソースがありません", "dashboard.resourceList.errorLoading": "{type}のロード中にエラーが発生しました", "dashboard.resourceList.viewRuns": "{resource}の{kind}を表示", "dashboard.run.duration": "実行時間:{duration}", diff --git a/src/nls/messages_ko.json b/src/nls/messages_ko.json index 66c8af4c2..428868654 100644 --- a/src/nls/messages_ko.json +++ b/src/nls/messages_ko.json @@ -209,7 +209,6 @@ "dashboard.resourceDetails.errorloading": "리소스를 로드하는 중에 오류가 발생했습니다.", "dashboard.resourceDetails.spec.description": "설명:", "dashboard.resourceDetails.spec.displayName": "보여지는 이름:", - "dashboard.resourceList.emptyState": "유형 {type}에 대해 일치하는 리소스가 없습니다.", "dashboard.resourceList.errorLoading": "{type} 로드 오류", "dashboard.resourceList.viewRuns": "{resource}의 {kind} 보기", "dashboard.run.duration": "지속 기간: {duration}", diff --git a/src/nls/messages_pt.json b/src/nls/messages_pt.json index 8e9d1b03e..00d44f41e 100644 --- a/src/nls/messages_pt.json +++ b/src/nls/messages_pt.json @@ -209,7 +209,6 @@ "dashboard.resourceDetails.errorloading": "", "dashboard.resourceDetails.spec.description": "", "dashboard.resourceDetails.spec.displayName": "", - "dashboard.resourceList.emptyState": "", "dashboard.resourceList.errorLoading": "", "dashboard.resourceList.viewRuns": "", "dashboard.run.duration": "Duração: {duration}", diff --git a/src/nls/messages_zh-Hans.json b/src/nls/messages_zh-Hans.json index a0d69841e..3f083174b 100644 --- a/src/nls/messages_zh-Hans.json +++ b/src/nls/messages_zh-Hans.json @@ -209,7 +209,6 @@ "dashboard.resourceDetails.errorloading": "加载资源时发生错误", "dashboard.resourceDetails.spec.description": "", "dashboard.resourceDetails.spec.displayName": "", - "dashboard.resourceList.emptyState": "没有为类型 {type} 找到匹配的资源", "dashboard.resourceList.errorLoading": "加载 {type} 时发生错误", "dashboard.resourceList.viewRuns": "查看 {resource} 的 {kind}", "dashboard.run.duration": "持续时间:{duration}", diff --git a/src/nls/messages_zh-Hant.json b/src/nls/messages_zh-Hant.json index 5f1aed60b..313e84c6c 100644 --- a/src/nls/messages_zh-Hant.json +++ b/src/nls/messages_zh-Hant.json @@ -209,7 +209,6 @@ "dashboard.resourceDetails.errorloading": "", "dashboard.resourceDetails.spec.description": "", "dashboard.resourceDetails.spec.displayName": "", - "dashboard.resourceList.emptyState": "", "dashboard.resourceList.errorLoading": "", "dashboard.resourceList.viewRuns": "", "dashboard.run.duration": "持續時間: {duration}", diff --git a/src/routes/dashboard.jsx b/src/routes/dashboard.jsx index ae56c8499..6935d6fb1 100644 --- a/src/routes/dashboard.jsx +++ b/src/routes/dashboard.jsx @@ -39,24 +39,10 @@ export default [ ) }, - { - path: paths.rawCRD.byNamespace(), - element: , - handle: { - isNamespaced: true, - isResourceDetails: true, - path: paths.rawCRD.byNamespace() - } - }, - { - path: paths.rawCRD.cluster(), - element: - }, { path: paths.kubernetesResources.all(), element: , handle: { - isNamespaced: true, path: paths.kubernetesResources.all() } }, @@ -64,7 +50,6 @@ export default [ path: paths.kubernetesResources.byNamespace(), element: , handle: { - isNamespaced: true, path: paths.kubernetesResources.byNamespace() } }, @@ -79,6 +64,9 @@ export default [ }, { path: paths.kubernetesResources.cluster(), - element: + element: , + handle: { + isResourceDetails: true + } } ]; diff --git a/src/routes/pipelines.jsx b/src/routes/pipelines.jsx index 2471aed96..59e969e71 100644 --- a/src/routes/pipelines.jsx +++ b/src/routes/pipelines.jsx @@ -18,6 +18,7 @@ import { CreateCustomRun, CreatePipelineRun, CreateTaskRun, + CustomResourceDefinition, CustomRun, CustomRuns, PipelineRun, @@ -28,12 +29,24 @@ import { TaskRuns, Tasks } from '../containers'; +import { getTektonPipelinesAPIVersion, tektonAPIGroup } from '../api/utils'; export default [ { path: paths.clusterTasks.all(), element: }, + { + path: paths.clusterTasks.byName(), + element: , + handle: { + group: tektonAPIGroup, + isResourceDetails: true, + kind: 'clustertasks', + path: paths.clusterTasks.byName(), + version: 'v1beta1' + } + }, { path: paths.customRuns.all(), element: , @@ -83,6 +96,18 @@ export default [ path: paths.pipelines.byNamespace() } }, + { + path: paths.pipelines.byName(), + element: , + handle: { + group: tektonAPIGroup, + isNamespaced: true, + isResourceDetails: true, + kind: 'pipelines', + path: paths.pipelines.byName(), + version: getTektonPipelinesAPIVersion() + } + }, { path: paths.pipelineRuns.all(), element: , @@ -132,6 +157,18 @@ export default [ path: paths.tasks.byNamespace() } }, + { + path: paths.tasks.byName(), + element: , + handle: { + group: tektonAPIGroup, + isNamespaced: true, + isResourceDetails: true, + kind: 'tasks', + path: paths.tasks.byName(), + version: getTektonPipelinesAPIVersion() + } + }, { path: paths.taskRuns.all(), element: , diff --git a/src/routes/triggers.jsx b/src/routes/triggers.jsx index d0db27aee..670d72421 100644 --- a/src/routes/triggers.jsx +++ b/src/routes/triggers.jsx @@ -11,31 +11,54 @@ See the License for the specific language governing permissions and limitations under the License. */ -import { paths } from '@tektoncd/dashboard-utils'; +import { paths, urls } from '@tektoncd/dashboard-utils'; import { - ClusterInterceptors, ClusterTriggerBinding, - ClusterTriggerBindings, + CustomResourceDefinition, EventListener, - EventListeners, - Interceptors, + ResourceList, Trigger, TriggerBinding, - TriggerBindings, - Triggers, - TriggerTemplate, - TriggerTemplates + TriggerTemplate } from '../containers'; +import { triggersAPIGroup } from '../api/utils'; export default [ { path: paths.clusterInterceptors.all(), - element: + element: , + handle: { + group: triggersAPIGroup, + kind: 'clusterinterceptors', + path: paths.clusterInterceptors.all(), + resourceURL: urls.clusterInterceptors.byName, + title: 'ClusterInterceptors', + version: 'v1alpha1' + } + }, + { + path: paths.clusterInterceptors.byName(), + element: , + handle: { + group: triggersAPIGroup, + isResourceDetails: true, + kind: 'clusterinterceptors', + path: paths.clusterInterceptors.byName(), + version: 'v1alpha1' + } }, { path: paths.clusterTriggerBindings.all(), - element: + element: , + handle: { + group: triggersAPIGroup, + kind: 'clustertriggerbindings', + path: paths.clusterTriggerBindings.all(), + resourceURL: urls.clusterTriggerBindings.byName, + title: 'ClusterTriggerBindings', + version: 'v1beta1' + } }, { path: paths.clusterTriggerBindings.byName(), @@ -43,18 +66,28 @@ export default [ }, { path: paths.eventListeners.all(), - element: , + element: , handle: { + group: triggersAPIGroup, isNamespaced: true, - path: paths.eventListeners.all() + kind: 'eventlisteners', + path: paths.eventListeners.all(), + resourceURL: urls.eventListeners.byName, + title: 'EventListeners', + version: 'v1beta1' } }, { path: paths.eventListeners.byNamespace(), - element: , + element: , handle: { + group: triggersAPIGroup, isNamespaced: true, - path: paths.eventListeners.byNamespace() + kind: 'eventlisteners', + path: paths.eventListeners.byNamespace(), + resourceURL: urls.eventListeners.byName, + title: 'EventListeners', + version: 'v1beta1' } }, { @@ -68,18 +101,28 @@ export default [ }, { path: paths.triggers.all(), - element: , + element: , handle: { + group: triggersAPIGroup, isNamespaced: true, - path: paths.triggers.all() + kind: 'triggers', + path: paths.triggers.all(), + resourceURL: urls.triggers.byName, + title: 'Triggers', + version: 'v1beta1' } }, { path: paths.triggers.byNamespace(), - element: , + element: , handle: { + group: triggersAPIGroup, isNamespaced: true, - path: paths.triggers.byNamespace() + kind: 'triggers', + path: paths.triggers.byNamespace(), + resourceURL: urls.triggers.byName, + title: 'Triggers', + version: 'v1beta1' } }, { @@ -93,18 +136,28 @@ export default [ }, { path: paths.triggerBindings.all(), - element: , + element: , handle: { + group: triggersAPIGroup, isNamespaced: true, - path: paths.triggerBindings.all() + kind: 'triggerbindings', + path: paths.triggerBindings.all(), + resourceURL: urls.triggerBindings.byName, + title: 'TriggerBindings', + version: 'v1beta1' } }, { path: paths.triggerBindings.byNamespace(), - element: , + element: , handle: { + group: triggersAPIGroup, isNamespaced: true, - path: paths.triggerBindings.byNamespace() + kind: 'triggerbindings', + path: paths.triggerBindings.byNamespace(), + resourceURL: urls.triggerBindings.byName, + title: 'TriggerBindings', + version: 'v1beta1' } }, { @@ -118,18 +171,28 @@ export default [ }, { path: paths.triggerTemplates.all(), - element: , + element: , handle: { + group: triggersAPIGroup, isNamespaced: true, - path: paths.triggerTemplates.all() + kind: 'triggertemplates', + path: paths.triggerTemplates.all(), + resourceURL: urls.triggerTemplates.byName, + title: 'TriggerTemplates', + version: 'v1beta1' } }, { path: paths.triggerTemplates.byNamespace(), - element: , + element: , handle: { + group: triggersAPIGroup, isNamespaced: true, - path: paths.triggerTemplates.byNamespace() + kind: 'triggertemplates', + path: paths.triggerTemplates.byNamespace(), + resourceURL: urls.triggerTemplates.byName, + title: 'TriggerTemplates', + version: 'v1beta1' } }, { @@ -143,18 +206,40 @@ export default [ }, { path: paths.interceptors.all(), - element: , + element: , handle: { + group: triggersAPIGroup, isNamespaced: true, - path: paths.interceptors.all() + kind: 'interceptors', + path: paths.interceptors.all(), + resourceURL: urls.interceptors.byName, + title: 'Interceptors', + version: 'v1alpha1' } }, { path: paths.interceptors.byNamespace(), - element: , + element: , handle: { + group: triggersAPIGroup, isNamespaced: true, - path: paths.interceptors.byNamespace() + kind: 'interceptors', + path: paths.interceptors.byNamespace(), + resourceURL: urls.interceptors.byName, + title: 'Interceptors', + version: 'v1alpha1' + } + }, + { + path: paths.interceptors.byName(), + element: , + handle: { + group: triggersAPIGroup, + isNamespaced: true, + isResourceDetails: true, + kind: 'interceptors', + path: paths.interceptors.byName(), + version: 'v1alpha1' } } ];