import { flatMap, uniq } from 'lodash'; import * as React from 'react'; import type { Subject } from 'rxjs'; import type { IMetricAlarmDimension, IServerGroup } from '@spinnaker/core'; import { CloudMetricsReader, ReactSelectInput, TextInput, useData } from '@spinnaker/core'; import type { IScalingPolicyAlarmView } from '../../../../../domain'; import './dimensionsEditor.less'; export interface IDimensionsEditorProps { alarm: IScalingPolicyAlarmView; namespaceUpdated?: Subject; serverGroup: IServerGroup; updateAvailableMetrics: (dimensions: IMetricAlarmDimension[]) => void; } export const DimensionsEditor = ({ alarm, serverGroup, updateAvailableMetrics }: IDimensionsEditorProps) => { const dimensions = alarm.dimensions || []; const fetchDimensions = () => { return CloudMetricsReader.listMetrics('aws', serverGroup.account, serverGroup.region, { namespace: alarm.namespace, }) .then((results) => { const allDimensions = flatMap(results, (r) => r.dimensions); const sortedDimensions = uniq(allDimensions.filter((d) => d).map((d) => d.name)).sort(); return sortedDimensions; }) .catch(() => { return []; }); }; const { result: dimensionOptions } = useData(fetchDimensions, [], [alarm.namespace, serverGroup.name]); const addDimension = () => { const newDimensions = [...dimensions, {} as IMetricAlarmDimension]; updateAvailableMetrics(newDimensions); }; const removeDimension = (index: number) => { const newDimensions = alarm.dimensions.filter((_d, i) => i !== index); updateAvailableMetrics(newDimensions); }; const updateDimension = (key: 'name' | 'value', value: string, index: number) => { const newDimensions = [...dimensions]; const updatedDimension = newDimensions[index]; updatedDimension[key] = value; updateAvailableMetrics(newDimensions); }; return (
Dimensions
{dimensions.map((dimension, i) => (
updateDimension('name', e.target.value, i)} value={dimension.name} stringOptions={dimensionOptions} />
updateDimension('value', e.target.value, i)} value={dimension.value} /> {!alarm.disableEditingDimensions && (
removeDimension(i)}>
)}
))} {!alarm.disableEditingDimensions && (
)}
); };