import classnames from 'classnames'; import { isEmpty } from 'lodash'; import React from 'react'; import { RelativeTimestamp } from '../../RelativeTimestamp'; import { VersionOperationIcon } from './VersionOperation'; import { constraintsManager } from '../../constraints/registry'; import type { FetchVersionQueryVariables } from '../../graphql/graphql-sdk'; import { FetchVersionDocument, useRestartConstraintEvaluationMutation, useUpdateConstraintMutation, } from '../../graphql/graphql-sdk'; import { CollapsibleSection, useApplicationContextSafe } from '../../../presentation'; import type { ArtifactVersionProps, QueryConstraint } from '../types'; import { getConstraintsStatusSummary } from './utils'; import { useLogEvent } from '../../utils/logging'; import { useNotifyOnError } from '../../utils/useNotifyOnError.hook'; import { Spinner } from '../../../widgets'; import './Constraints.less'; interface IConstraintContentProps { constraint: QueryConstraint; versionProps: ArtifactVersionProps; } const ConstraintContent = ({ constraint, versionProps }: IConstraintContentProps) => { const description = constraintsManager.renderDescription(constraint); const actions = constraintsManager.getActions(constraint)?.sort((action) => (action.pass ? -1 : 1)); // positive actions first const application = useApplicationContextSafe(); const logEvent = useLogEvent('ArtifactConstraints', 'UpdateStatus'); const refetchVariables: FetchVersionQueryVariables = { appName: application.name, versions: [versionProps.version] }; const refetchQueries = [{ query: FetchVersionDocument, variables: refetchVariables }]; const showRestartButton = constraintsManager.isRestartVisible(constraint); const baseRequestProps = { application: application.name, environment: versionProps.environment, version: versionProps.version, reference: versionProps.reference, type: constraint.type, }; const [ updateConstraint, { loading: isUpdatingConstraint, error: updateConstraintError }, ] = useUpdateConstraintMutation({ refetchQueries }); const [ restartConstraint, { loading: isRestartingConstraint, error: restartConstraintError }, ] = useRestartConstraintEvaluationMutation({ variables: { payload: baseRequestProps }, refetchQueries, }); useNotifyOnError({ key: 'updateConstraintError', content: `Failed to update constraint`, error: updateConstraintError, }); useNotifyOnError({ key: 'restartConstraintError', content: `Failed to restart constraint`, error: restartConstraintError, }); return (
{description &&
{description}
} {(!isEmpty(actions) || showRestartButton) && (
{actions?.map(({ title, pass }) => ( ))} {showRestartButton && ( )} {isUpdatingConstraint || (isRestartingConstraint && )}
)}
); }; interface IConstraintProps { constraint: QueryConstraint; versionProps: ArtifactVersionProps; } const Constraint = ({ constraint, versionProps }: IConstraintProps) => { const hasContent = constraintsManager.hasContent(constraint); const title = constraintsManager.renderTitle(constraint); return (
(
{title} {constraint.judgedAt && ( () )}
{chevron}
)} > {hasContent || constraintsManager.isRestartVisible(constraint) ? ( ) : undefined}
); }; export const Constraints = ({ constraints, versionProps, expandedByDefault, }: { constraints?: QueryConstraint[]; versionProps: ArtifactVersionProps; expandedByDefault?: boolean; }) => { if (!constraints || !constraints.length) return null; const summary = getConstraintsStatusSummary(constraints); return (
(
Constraints: {summary.text} {chevron}
)} outerDivClassName="" toggleClassName="constraint-toggle" bodyClassName="sp-margin-xs-top sp-margin-xs-bottom" expandIconSize="12px" expandIconPosition="right" defaultExpanded={expandedByDefault} enableCaching={false} > {constraints?.map((constraint, index) => ( ))}
); };