Skip to content

Commit 9f8b73b

Browse files
committed
mark required fields as red on save new row
1 parent 50846f2 commit 9f8b73b

File tree

5 files changed

+69
-2
lines changed

5 files changed

+69
-2
lines changed

src/components/BrowserCell/BrowserCell.react.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ export default class BrowserCell extends Component {
214214
//#endregion
215215

216216
render() {
217-
let { type, value, hidden, width, current, onSelect, onEditChange, setCopyableValue, setRelation, onPointerClick, row, col, field, onEditSelectedRow, readonly, isRequired } = this.props;
217+
let { type, value, hidden, width, current, onSelect, onEditChange, setCopyableValue, setRelation, onPointerClick, row, col, field, onEditSelectedRow, readonly, isRequired, markRequiredField } = this.props;
218218
let content = value;
219219
this.copyableValue = content;
220220
let classes = [styles.cell, unselectable];
@@ -305,6 +305,10 @@ export default class BrowserCell extends Component {
305305
classes.push(styles.current);
306306
}
307307

308+
if (markRequiredField && isRequired && !value) {
309+
classes.push(styles.required);
310+
}
311+
308312
return readonly ? (
309313
<Tooltip placement='bottom' tooltip='Read only (CTRL+C to copy)' visible={this.state.showTooltip} >
310314
<span

src/components/BrowserCell/BrowserCell.scss

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,3 +35,18 @@
3535
bottom: 0;
3636
}
3737
}
38+
39+
.required {
40+
position: relative;
41+
42+
&:after {
43+
position: absolute;
44+
pointer-events: none;
45+
content: '';
46+
border: 2px solid #ff395e;
47+
top: 0;
48+
left: 0;
49+
right: 0;
50+
bottom: 0;
51+
}
52+
}

src/components/BrowserRow/BrowserRow.react.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export default class BrowserRow extends Component {
1919
}
2020

2121
render() {
22-
const { className, columns, currentCol, isUnique, obj, onPointerClick, order, readOnlyFields, row, rowWidth, selection, selectRow, setCopyableValue, setCurrent, setEditing, setRelation, onEditSelectedRow, setContextMenu, onFilterChange } = this.props;
22+
const { className, columns, currentCol, isUnique, obj, onPointerClick, order, readOnlyFields, row, rowWidth, selection, selectRow, setCopyableValue, setCurrent, setEditing, setRelation, onEditSelectedRow, setContextMenu, onFilterChange, markRequiredField } = this.props;
2323
let attributes = obj.attributes;
2424
return (
2525
<div className={styles.tableRow} style={{ minWidth: rowWidth }}>
@@ -82,6 +82,7 @@ export default class BrowserRow extends Component {
8282
value={attr}
8383
hidden={hidden}
8484
isRequired={isRequired}
85+
markRequiredField={markRequiredField}
8586
setCopyableValue={setCopyableValue}
8687
setContextMenu={setContextMenu}
8788
onEditSelectedRow={onEditSelectedRow} />

src/dashboard/Data/Browser/Browser.react.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,7 @@ class Browser extends DashboardView {
7979

8080
isUnique: false,
8181
uniqueField: null,
82+
markRequiredField: false
8283
};
8384

8485
this.prefetchData = this.prefetchData.bind(this);
@@ -302,6 +303,11 @@ class Browser extends DashboardView {
302303
newObject: null
303304
});
304305
}
306+
if (this.state.markRequiredField) {
307+
this.setState({
308+
markRequiredField: false
309+
});
310+
}
305311
}
306312

307313
saveNewRow(){
@@ -310,6 +316,45 @@ class Browser extends DashboardView {
310316
return;
311317
}
312318

319+
// check if required fields are missing
320+
const className = this.props.params.className;
321+
let requiredCols = [];
322+
if (className) {
323+
let classColumns = this.props.schema.data.get('classes').get(className);
324+
classColumns.forEach(({ required }, name) => {
325+
if (name === 'objectId' || this.state.isUnique && name !== this.state.uniqueField) {
326+
return;
327+
}
328+
if (!!required) {
329+
requiredCols.push(name);
330+
}
331+
if (className === '_User' && (name === 'username' || name === 'password')) {
332+
if (!obj.get('authData')) {
333+
requiredCols.push(name);
334+
}
335+
}
336+
if (className === '_Role' && (name === 'name' || name === 'ACL')) {
337+
requiredCols.push(name);
338+
}
339+
});
340+
}
341+
if (requiredCols.length) {
342+
for (let idx = 0; idx < requiredCols.length; idx++) {
343+
const name = requiredCols[idx];
344+
if (!obj.get(name)) {
345+
this.showNote("Please enter all required fields", true);
346+
this.setState({
347+
markRequiredField: true
348+
});
349+
return;
350+
}
351+
}
352+
}
353+
if (this.state.markRequiredField) {
354+
this.setState({
355+
markRequiredField: false
356+
});
357+
}
313358
obj.save(null, { useMasterKey: true }).then(
314359
objectSaved => {
315360
let msg = objectSaved.className + ' with id \'' + objectSaved.id + '\' created';
@@ -1080,6 +1125,7 @@ class Browser extends DashboardView {
10801125
onSaveNewRow={this.saveNewRow}
10811126
onAbortAddRow={this.abortAddRow}
10821127

1128+
markRequiredField={this.state.markRequiredField}
10831129
columns={columns}
10841130
className={className}
10851131
fetchNextPage={this.fetchNextPage}

src/dashboard/Data/Browser/BrowserTable.react.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ export default class BrowserTable extends React.Component {
143143
setCopyableValue={this.props.setCopyableValue}
144144
setContextMenu={this.props.setContextMenu}
145145
onEditSelectedRow={this.props.onEditSelectedRow}
146+
markRequiredField={this.props.markRequiredField}
146147
/>
147148
<Button
148149
value="Add"

0 commit comments

Comments
 (0)