check for duplicate signal names

fixes #70
main
Joost Wooning 2022-03-11 16:42:19 +01:00
parent 6182b9aed0
commit 18b21025d9
4 changed files with 28 additions and 5 deletions

View File

@ -507,9 +507,13 @@ export default class AddSignals extends Component {
this.setState({ signals }); this.setState({ signals });
}; };
onSignalChange = (signal, oldSignal) => { onSignalChange = (signal) => {
const { signals } = this.state; const { signals } = this.state;
if (signal.name in signals && signals[signal.name].uid !== signal.uid) {
return false;
}
for (const signalName in signals) { for (const signalName in signals) {
if (signals[signalName].uid === signal.uid) { if (signals[signalName].uid === signal.uid) {
delete signals[signalName]; delete signals[signalName];
@ -518,6 +522,7 @@ export default class AddSignals extends Component {
signals[signal.name] = signal; signals[signal.name] = signal;
this.setState({ signals }, this.propagateUpSignalChange); this.setState({ signals }, this.propagateUpSignalChange);
return true;
}; };
onSignalRemove = (signal) => { onSignalRemove = (signal) => {

View File

@ -95,6 +95,15 @@
} }
&-form { &-form {
&-field { &-field {
&-error {
input,
select {
border-color: rgb(220, 0, 0);
&:focus {
border-color: rgb(220, 0, 0);
}
}
}
min-height: $input-height; min-height: $input-height;
padding: 1px 0; padding: 1px 0;
@extend %clearfix; @extend %clearfix;

View File

@ -1,4 +1,5 @@
import React from 'react'; import React from 'react';
import cx from 'classnames';
import FIELDS from './FIELDS'; import FIELDS from './FIELDS';
import NumberField from './NumberField'; import NumberField from './NumberField';
@ -16,13 +17,15 @@ export default ({
onSignalRemove, onSignalRemove,
isExpanded, isExpanded,
getSignalEdited, getSignalEdited,
fieldError,
update update
}) => ( }) => (
<div className="signals-legend-entry-form"> <div className="signals-legend-entry-form">
{FIELDS.map((field) => { {FIELDS.map((field) => {
const Node = FieldMap[field.type]; const Node = FieldMap[field.type];
const errorClass = fieldError === field.field ? 'signals-legend-entry-form-field-error' : null;
return ( return (
<div className="signals-legend-entry-form-field" key={field.field}> <div className={cx("signals-legend-entry-form-field", errorClass)} key={field.field}>
<Node <Node
fieldSpec={field} fieldSpec={field}
signal={signal} signal={signal}

View File

@ -29,6 +29,7 @@ export default class SignalLegendEntry extends Component {
constructor(props) { constructor(props) {
super(props); super(props);
this.state = { this.state = {
fieldError: null,
signalEdited: Object.assign(Object.create(props.signal), props.signal) signalEdited: Object.assign(Object.create(props.signal), props.signal)
}; };
} }
@ -36,6 +37,7 @@ export default class SignalLegendEntry extends Component {
componentDidUpdate(prevProps) { componentDidUpdate(prevProps) {
if (!this.props.signal.equals(prevProps.signal)) { if (!this.props.signal.equals(prevProps.signal)) {
this.setState({ this.setState({
fieldError: null,
signalEdited: Object.assign( signalEdited: Object.assign(
Object.create(this.props.signal), Object.create(this.props.signal),
this.props.signal this.props.signal
@ -60,7 +62,9 @@ export default class SignalLegendEntry extends Component {
Object.entries(signalEdited).forEach(([field, value]) => { Object.entries(signalEdited).forEach(([field, value]) => {
signalCopy[field] = value; signalCopy[field] = value;
}); });
this.props.onSignalChange(signalCopy, signal);
const updated = this.props.onSignalChange(signalCopy);
this.setState({ fieldError: !updated ? fieldSpec.field : null });
}; };
toggleEditing = (e) => { toggleEditing = (e) => {
@ -87,14 +91,15 @@ export default class SignalLegendEntry extends Component {
signalCopy[field] = value; signalCopy[field] = value;
}); });
this.props.onSignalChange(signalCopy, signal); this.props.onSignalChange(signalCopy);
} else { } else {
signalEdited = signalCopy; signalEdited = signalCopy;
} }
// Expand and enable signal editing // Expand and enable signal editing
this.setState({ this.setState({
signalEdited fieldError: null,
signalEdited,
}); });
this.props.toggleExpandSignal(signal); this.props.toggleExpandSignal(signal);
e.stopPropagation(); e.stopPropagation();
@ -148,6 +153,7 @@ export default class SignalLegendEntry extends Component {
onSignalRemove={this.props.onSignalRemove} onSignalRemove={this.props.onSignalRemove}
isExpanded={isExpanded} isExpanded={isExpanded}
getSignalEdited={this.getSignalEdited} getSignalEdited={this.getSignalEdited}
fieldError={this.state.fieldError}
update={this.updateField} update={this.updateField}
/> />
)} )}