Skip to content

Commit

Permalink
Don't show Remove Trigger when there are no triggers
Browse files Browse the repository at this point in the history
  • Loading branch information
vikram-raj committed May 14, 2020
1 parent 47967cb commit 1ec11aa
Show file tree
Hide file tree
Showing 6 changed files with 57 additions and 38 deletions.
@@ -1,10 +1,11 @@
import * as React from 'react';
import * as _ from 'lodash';
import { DetailsPage, DetailsPageProps } from '@console/internal/components/factory';
import { KebabAction, navFactory } from '@console/internal/components/utils';
import { k8sGet, k8sList } from '@console/internal/module/k8s';
import { ErrorPage404 } from '@console/internal/components/error';
import { getPipelineKebabActions } from '../../utils/pipeline-actions';
import { getLatestRun } from '../../utils/pipeline-augment';
import { getLatestRun, PipelineRun } from '../../utils/pipeline-augment';
import { PipelineRunModel, PipelineModel } from '../../models';
import { useMenuActionsWithUserLabel } from '../pipelineruns/triggered-by';
import {
Expand All @@ -16,12 +17,13 @@ import {
parametersValidationSchema,
resourcesValidationSchema,
} from './detail-page-tabs';
import { usePipelineTriggerTemplateNames } from './utils/triggers';

const PipelineDetailsPage: React.FC<DetailsPageProps> = (props) => {
const [errorCode, setErrorCode] = React.useState(null);
const [menuActions, setMenuActions] = React.useState<KebabAction[]>([]);

const [latestPipelineRun, setLatestPipelineRun] = React.useState<PipelineRun>({});
const { name, namespace } = props;
const templateNames = usePipelineTriggerTemplateNames(name, namespace);

React.useEffect(() => {
k8sGet(PipelineModel, name, namespace)
Expand All @@ -33,7 +35,7 @@ const PipelineDetailsPage: React.FC<DetailsPageProps> = (props) => {
})
.then((listres) => {
const latestRun = getLatestRun({ data: listres }, 'creationTimestamp');
setMenuActions(getPipelineKebabActions(latestRun));
setLatestPipelineRun(latestRun);
})
.catch((error) => {
setErrorCode(error.response.status);
Expand All @@ -42,7 +44,9 @@ const PipelineDetailsPage: React.FC<DetailsPageProps> = (props) => {
.catch((error) => setErrorCode(error.response.status));
}, [name, namespace]);

const augmentedMenuActions: KebabAction[] = useMenuActionsWithUserLabel(menuActions);
const augmentedMenuActions: KebabAction[] = useMenuActionsWithUserLabel(
getPipelineKebabActions(latestPipelineRun, !_.isEmpty(templateNames)),
);

if (errorCode === 404) {
return <ErrorPage404 />;
Expand Down
Expand Up @@ -16,7 +16,10 @@ interface PipelineDetailsProps {
}

const PipelineDetails: React.FC<PipelineDetailsProps> = ({ obj: pipeline }) => {
const routeTemplates: RouteTemplate[] = usePipelineTriggerTemplateNames(pipeline) || [];
const {
metadata: { name, namespace },
} = pipeline;
const routeTemplates: RouteTemplate[] = usePipelineTriggerTemplateNames(name, namespace) || [];
const taskLinks = pipeline.spec.tasks
.filter((pipelineTask: PipelineTask) => !!pipelineTask.taskRef)
.map((task) => ({
Expand Down
@@ -1,4 +1,5 @@
import * as React from 'react';
import * as _ from 'lodash';
import { Status } from '@console/shared';
import { TableRow, TableData, RowFunction } from '@console/internal/components/factory';
import { ResourceLink, Timestamp } from '@console/internal/components/utils';
Expand All @@ -10,29 +11,36 @@ import { getPipelineKebabActions } from '../../../utils/pipeline-actions';
import LinkedPipelineRunTaskStatus from '../../pipelineruns/status/LinkedPipelineRunTaskStatus';
import { ResourceKebabWithUserLabel } from '../../pipelineruns/triggered-by';
import { tableColumnClasses } from './pipeline-table';
import { usePipelineTriggerTemplateNames } from '../utils/triggers';

const pipelineReference = referenceForModel(PipelineModel);
const pipelinerunReference = referenceForModel(PipelineRunModel);

const PipelineRow: RowFunction<Pipeline> = ({ obj, index, key, style }) => {
type PipelineTableRowProps = {
obj: Pipeline;
index: number;
style: object;
};

const PipelineTableRow: React.FC<PipelineTableRowProps> = ({ obj, index, style }) => {
const {
metadata: { name, namespace, uid },
} = obj;
const templateNames = usePipelineTriggerTemplateNames(name, namespace);

return (
<TableRow
id={obj.metadata.uid}
data-test-id={`${obj.metadata.namespace}-${obj.metadata.name}`}
id={uid}
data-test-id={`${namespace}-${name}`}
index={index}
trKey={key}
trKey={uid}
style={style}
>
<TableData className={tableColumnClasses[0]}>
<ResourceLink
kind={pipelineReference}
name={obj.metadata.name}
namespace={obj.metadata.namespace}
title={obj.metadata.name}
/>
<ResourceLink kind={pipelineReference} name={name} namespace={namespace} title={name} />
</TableData>
<TableData className={tableColumnClasses[1]}>
<ResourceLink kind="Namespace" name={obj.metadata.namespace} />
<ResourceLink kind="Namespace" name={namespace} />
</TableData>
<TableData className={tableColumnClasses[2]}>
{obj.latestRun && obj.latestRun.metadata && obj.latestRun.metadata.name ? (
Expand Down Expand Up @@ -63,7 +71,7 @@ const PipelineRow: RowFunction<Pipeline> = ({ obj, index, key, style }) => {
</TableData>
<TableData className={tableColumnClasses[6]}>
<ResourceKebabWithUserLabel
actions={getPipelineKebabActions(obj.latestRun)}
actions={getPipelineKebabActions(obj.latestRun, !_.isEmpty(templateNames))}
kind={pipelineReference}
resource={obj}
/>
Expand All @@ -72,4 +80,8 @@ const PipelineRow: RowFunction<Pipeline> = ({ obj, index, key, style }) => {
);
};

const PipelineRow: RowFunction<Pipeline> = ({ obj, index, style }) => {
return <PipelineTableRow obj={obj} index={index} style={style} />;
};

export default PipelineRow;
Expand Up @@ -14,11 +14,15 @@ type TriggerTemplateSelectorProps = {

const TriggerTemplateSelector: React.FC<TriggerTemplateSelectorProps> = (props) => {
const { name, pipeline, placeholder } = props;
const {
metadata: { name: pipelineName, namespace },
} = pipeline;

const [field] = useField(name);
const selection = field.value;

const templateNames: RouteTemplate[] = usePipelineTriggerTemplateNames(pipeline) || [];
const templateNames: RouteTemplate[] =
usePipelineTriggerTemplateNames(pipelineName, namespace) || [];
const items = templateNames.reduce(
(acc, { triggerTemplateName }) => ({ ...acc, [triggerTemplateName]: triggerTemplateName }),
{},
Expand Down
Expand Up @@ -13,11 +13,7 @@ import {
WatchK8sResultsObject,
} from '@console/internal/components/utils/k8s-watch-hook';
import { EventListenerModel, PipelineRunModel, TriggerTemplateModel } from '../../../models';
import {
getResourceModelFromBindingKind,
Pipeline,
PipelineRun,
} from '../../../utils/pipeline-augment';
import { getResourceModelFromBindingKind, PipelineRun } from '../../../utils/pipeline-augment';
import {
EventListenerKind,
EventListenerKindTrigger,
Expand Down Expand Up @@ -59,10 +55,7 @@ const useEventListenerRoutes = (
return mapValues(results, (result: WatchK8sResultsObject<RouteKind>) => result.data);
};

const useAllEventListeners = (resource: K8sResourceCommon) => {
const {
metadata: { namespace },
} = resource;
const useAllEventListeners = (namespace: string) => {
const eventListenerResource: WatchK8sResource = React.useMemo(
() => ({
kind: referenceForModel(EventListenerModel),
Expand All @@ -83,11 +76,11 @@ export type RouteTemplate = {
triggerTemplateName: string;
};

export const usePipelineTriggerTemplateNames = (pipeline: Pipeline): RouteTemplate[] | null => {
const eventListenerResources = useAllEventListeners(pipeline);
const {
metadata: { namespace },
} = pipeline;
export const usePipelineTriggerTemplateNames = (
pipelineName: string,
namespace: string,
): RouteTemplate[] | null => {
const eventListenerResources = useAllEventListeners(namespace);
const triggerTemplateResources: WatchK8sResources<TriggerTemplateMapping> = React.useMemo(() => {
if (!eventListenerResources) {
return {};
Expand Down Expand Up @@ -126,7 +119,7 @@ export const usePipelineTriggerTemplateNames = (pipeline: Pipeline): RouteTempla
const plr: PipelineRun = triggerTemplate?.spec?.resourcetemplates?.find(
({ kind }) => kind === PipelineRunModel.kind,
);
return plr?.spec?.pipelineRef?.name === getResourceName(pipeline);
return plr?.spec?.pipelineRef?.name === pipelineName;
})
.map(getResourceName);

Expand Down Expand Up @@ -203,7 +196,7 @@ export const getTriggerTemplatePipelineName = (triggerTemplate: TriggerTemplateK
};

export const useTriggerTemplateEventListenerNames = (triggerTemplate: TriggerTemplateKind) => {
const eventListenerResources = useAllEventListeners(triggerTemplate) || [];
const eventListenerResources = useAllEventListeners(triggerTemplate.metadata.namespace) || [];

return eventListenerResources
.filter((eventListener: EventListenerKind) =>
Expand All @@ -215,7 +208,7 @@ export const useTriggerTemplateEventListenerNames = (triggerTemplate: TriggerTem
};

export const useTriggerBindingEventListenerNames = (triggerBinding: TriggerBindingKind) => {
const eventListenerResources = useAllEventListeners(triggerBinding) || [];
const eventListenerResources = useAllEventListeners(triggerBinding.metadata.namespace) || [];
return eventListenerResources
.filter((eventListener: EventListenerKind) =>
eventListener.spec.triggers.find(({ bindings }) =>
Expand Down
7 changes: 5 additions & 2 deletions frontend/packages/dev-console/src/utils/pipeline-actions.tsx
Expand Up @@ -228,11 +228,14 @@ const removeTrigger: KebabAction = (kind: K8sKind, pipeline: Pipeline) => ({
verb: 'delete',
},
});
export const getPipelineKebabActions = (pipelineRun?: PipelineRun): KebabAction[] => [
export const getPipelineKebabActions = (
pipelineRun?: PipelineRun,
isTriggerPresent?: boolean,
): KebabAction[] => [
(model, resource: Pipeline) => startPipeline(model, resource, handlePipelineRunSubmit),
...(pipelineRun ? [() => rerunPipelineAndRedirect(PipelineRunModel, pipelineRun)] : []),
(model, pipeline) => addTrigger(EventListenerModel, pipeline),
(model, pipeline) => removeTrigger(EventListenerModel, pipeline),
...(isTriggerPresent ? [(model, pipeline) => removeTrigger(EventListenerModel, pipeline)] : []),
editPipeline,
Kebab.factory.Delete,
];
Expand Down

0 comments on commit 1ec11aa

Please sign in to comment.