import { isEqual } from 'lodash'; import React from 'react'; import type { Option } from 'react-select'; import Select from 'react-select'; import { bannerBackgroundColorOptions, bannerTextColorOptions } from './customBannerColors'; import { ConfigSectionFooter } from '../footer/ConfigSectionFooter'; import { HelpField } from '../../../help/HelpField'; import { Markdown } from '../../../presentation/Markdown'; import { noop } from '../../../utils'; import './customBannerConfig.less'; export interface ICustomBannerConfig { backgroundColor: string; enabled: boolean; text: string; textColor: string; } export interface ICustomBannerConfigProps { bannerConfigs: ICustomBannerConfig[]; isSaving: boolean; saveError: boolean; updateBannerConfigs: (bannerConfigs: ICustomBannerConfig[]) => void; } export interface ICustomBannerConfigState { bannerConfigsEditing: ICustomBannerConfig[]; } export class CustomBannerConfig extends React.Component { public static defaultProps: Partial = { bannerConfigs: [], isSaving: false, saveError: false, updateBannerConfigs: noop, }; constructor(props: ICustomBannerConfigProps) { super(props); this.state = { bannerConfigsEditing: props.bannerConfigs, }; } private onEnabledChange = (idx: number, isChecked: boolean) => { this.setState({ bannerConfigsEditing: this.state.bannerConfigsEditing.map((config, i) => { if (i === idx) { return { ...config, enabled: isChecked, }; } // Only one config can be enabled return { ...config, enabled: isChecked ? false : config.enabled, }; }), }); }; private onTextChange = (idx: number, text: string) => { this.setState({ bannerConfigsEditing: this.state.bannerConfigsEditing.map((config, i) => { if (i === idx) { return { ...config, text, }; } return config; }), }); }; private onTextColorChange = (idx: number, option: Option) => { this.setState({ bannerConfigsEditing: this.state.bannerConfigsEditing.map((config, i) => { if (i === idx) { return { ...config, textColor: option.value, }; } return config; }), }); }; private onBackgroundColorChange = (idx: number, option: Option) => { this.setState({ bannerConfigsEditing: this.state.bannerConfigsEditing.map((config, i) => { if (i === idx) { return { ...config, backgroundColor: option.value, }; } return config; }), }); }; private addBanner = (): void => { this.setState({ bannerConfigsEditing: this.state.bannerConfigsEditing.concat([ { backgroundColor: 'var(--color-alert)', enabled: false, text: 'Your custom banner text', textColor: 'var(--color-text-on-dark)', } as ICustomBannerConfig, ]), }); }; private removeBanner = (idx: number): void => { this.setState({ bannerConfigsEditing: this.state.bannerConfigsEditing.filter((_config, i) => i !== idx), }); }; private isDirty = (): boolean => { return !isEqual(this.props.bannerConfigs, this.state.bannerConfigsEditing); }; private onRevertClicked = (): void => { this.setState({ bannerConfigsEditing: this.props.bannerConfigs, }); }; private onSaveClicked = (): void => { this.props.updateBannerConfigs(this.state.bannerConfigsEditing); }; private colorOptionRenderer = (option: Option): JSX.Element => { return
; }; public render() { return (
Custom Banners allow you to specify application-specific headers that will appear above the main Spinnaker navigation bar.
{this.state.bannerConfigsEditing.map((banner, idx) => (
Enabled Text Text Color Background
) => this.onEnabledChange(idx, e.target.checked)} type="checkbox" />