Skip to content

Commit 4e2a473

Browse files
Satyapzrq
authored andcommitted
Compass 317 disable validation builder (#631)
* COMPASS-317: added a isWritable prop to some of the validation fields * COMPASS-317 added isWritable status * COMPASS-317 UI disabled if isWritable is false + tested * added read preference option for listCollections * COMPASS-317 included data-service update * removed erroneous isWritable calls and fixed test cases * rebased with master, added defaults to rules to pass tests * with fixes * COMPASS-317 added a wait for error message in functional test * adding isWritable flag on validation rule test * allowed regex options to be displayed but not selected
1 parent 0330b25 commit 4e2a473

File tree

16 files changed

+108
-51
lines changed

16 files changed

+108
-51
lines changed

src/internal-packages/validation/lib/components/common/bson-type-selector.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ class BSONTypeSelector extends React.Component {
105105
label="BSON Type"
106106
value={selectedTypeName}
107107
onSelect={this.onTypeClicked.bind(this)}
108+
disabled={this.props.isDisabled}
108109
/>
109110
);
110111
}
@@ -115,7 +116,8 @@ BSONTypeSelector.propTypes = {
115116
typeAlias: React.PropTypes.string,
116117
typeName: React.PropTypes.string,
117118
onTypeClicked: React.PropTypes.func,
118-
serverVersion: React.PropTypes.string
119+
serverVersion: React.PropTypes.string,
120+
isDisabled: React.PropTypes.bool
119121
};
120122

121123
BSONTypeSelector.displayName = 'BSONTypeSelector';

src/internal-packages/validation/lib/components/common/option-selector.jsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ class OptionSelector extends React.Component {
2929
id={this.props.id}
3030
onSelect={this.props.onSelect}
3131
title={title}
32+
disabled={this.props.disabled}
3233
>{menuItems}
3334
</DropdownButton>
3435
</div>
@@ -42,13 +43,15 @@ OptionSelector.propTypes = {
4243
options: React.PropTypes.object.isRequired,
4344
label: React.PropTypes.string,
4445
value: React.PropTypes.string,
45-
onSelect: React.PropTypes.func
46+
onSelect: React.PropTypes.func,
47+
disabled: React.PropTypes.bool
4648
};
4749

4850
OptionSelector.defaultProps = {
4951
label: '',
5052
value: '',
51-
onSelect: () => {}
53+
onSelect: () => {},
54+
disabled: false
5255
};
5356

5457
OptionSelector.displayName = 'OptionSelector';

src/internal-packages/validation/lib/components/common/range-input.jsx

Lines changed: 19 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ class RangeInput extends React.Component {
3131
super(props);
3232
const op = this._getOperatorString(props);
3333
this.state = {
34-
disabled: op === 'none',
34+
hidden: op === 'none',
3535
operator: op,
3636
value: this.props.value,
3737
isValid: true,
@@ -73,7 +73,7 @@ class RangeInput extends React.Component {
7373
*/
7474
onDropdownSelect(evtKey) {
7575
this.setState({
76-
disabled: evtKey === 'none',
76+
hidden: evtKey === 'none',
7777
operator: evtKey
7878
});
7979
this.props.onRangeInputBlur({
@@ -93,7 +93,7 @@ class RangeInput extends React.Component {
9393
if (!force && !this.state.hasStartedValidating) {
9494
return true;
9595
}
96-
if (this.state.disabled) {
96+
if (this.state.hidden) {
9797
return true;
9898
}
9999
const value = this.state.value;
@@ -118,7 +118,7 @@ class RangeInput extends React.Component {
118118
_getOperatorString(props) {
119119
props = props || this.props;
120120

121-
if (props.disabled) {
121+
if (props.hidden) {
122122
return 'none';
123123
}
124124
if (props.upperBound) {
@@ -152,21 +152,22 @@ class RangeInput extends React.Component {
152152
const boundString = `${this.props.upperBound ?
153153
'upper' : 'lower'} bound`.toUpperCase();
154154

155-
// disabled, only show dropdown
156-
if (this.state.disabled) {
155+
// hidden, only show dropdown
156+
if (this.state.hidden) {
157157
return (
158158
<FormGroup>
159159
<DropdownButton
160160
id={`range-input-${this.props.upperBound ? 'upper' : 'lower'}`}
161161
style={{width: this.props.width}}
162162
title={this.state.operator}
163-
onSelect={this.onDropdownSelect.bind(this)}>
163+
onSelect={this.onDropdownSelect.bind(this)}
164+
disabled={this.props.disabled}>
164165
{this.renderMenuItems()}
165166
</DropdownButton>
166167
</FormGroup>
167168
);
168169
}
169-
// not disabled, render input group with value input and operator dropdown
170+
// not hidden, render input group with value input and operator dropdown
170171
const placeholder = `${boundString}`.toLowerCase();
171172
const validationState = this.state.isValid ? null : 'error';
172173
return (
@@ -176,7 +177,8 @@ class RangeInput extends React.Component {
176177
id={`range-input-${this.props.upperBound ? 'upper' : 'lower'}`}
177178
componentClass={InputGroup.Button}
178179
title={this.state.operator}
179-
onSelect={this.onDropdownSelect.bind(this)}>
180+
onSelect={this.onDropdownSelect.bind(this)}
181+
disabled={this.props.disabled}>
180182
{this.renderMenuItems()}
181183
</DropdownButton>
182184
<FormControl
@@ -185,7 +187,8 @@ class RangeInput extends React.Component {
185187
placeholder={placeholder}
186188
value={this.state.value}
187189
onChange={this.onInputChange.bind(this)}
188-
onBlur={this.onInputBlur.bind(this)}/>
190+
onBlur={this.onInputBlur.bind(this)}
191+
disabled={this.props.disabled}/>
189192
</InputGroup>
190193
</FormGroup>
191194
);
@@ -198,18 +201,20 @@ RangeInput.propTypes = {
198201
upperBound: React.PropTypes.bool,
199202
validationState: React.PropTypes.string,
200203
boundIncluded: React.PropTypes.bool.isRequired,
201-
disabled: React.PropTypes.bool.isRequired,
204+
hidden: React.PropTypes.bool.isRequired,
202205
onRangeInputBlur: React.PropTypes.func,
203-
width: React.PropTypes.number
206+
width: React.PropTypes.number,
207+
disabled: React.PropTypes.bool
204208
};
205209

206210
RangeInput.defaultProps = {
207-
disabled: false,
211+
hidden: false,
208212
boundIncluded: false,
209213
upperBound: false,
210214
validationState: null,
211215
value: '',
212-
width: 160
216+
width: 160,
217+
disabled: false
213218
};
214219

215220
RangeInput.displayName = 'RangeInput';

src/internal-packages/validation/lib/components/json-view.jsx

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,7 @@ class JSONView extends React.Component {
125125
value={this.props.validationAction}
126126
label="validation action:"
127127
onSelect={this.onActionSelect.bind(this)}
128+
disabled={!this.props.isWritable}
128129
/>
129130
<OptionSelector
130131
id="validation-level-selector"
@@ -133,6 +134,7 @@ class JSONView extends React.Component {
133134
value={this.props.validationLevel}
134135
label="validation level:"
135136
onSelect={this.onLevelSelect.bind(this)}
137+
disabled={!this.props.isWritable}
136138
/>
137139
</div>
138140
</Col>
@@ -147,6 +149,7 @@ class JSONView extends React.Component {
147149
value={this.state.input}
148150
onChange={this.onInputChanged.bind(this)}
149151
onBlur={this.onBlur.bind(this)}
152+
disabled={!this.props.isWritable}
150153
/>
151154
</FormGroup>
152155
</Col>
@@ -161,7 +164,12 @@ JSONView.propTypes = {
161164
editState: React.PropTypes.oneOf(['unmodified', 'modified', 'updating', 'error', 'success']).isRequired,
162165
validationAction: React.PropTypes.oneOf(['warn', 'error']).isRequired,
163166
validationLevel: React.PropTypes.oneOf(['off', 'moderate', 'strict']).isRequired,
164-
validatorDoc: React.PropTypes.object.isRequired
167+
validatorDoc: React.PropTypes.object.isRequired,
168+
isWritable: React.PropTypes.bool
169+
};
170+
171+
JSONView.defaultProps = {
172+
isWritable: false
165173
};
166174

167175
JSONView.displayName = 'JSONView';

src/internal-packages/validation/lib/components/rule-builder.jsx

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,24 @@ class RuleBuilder extends React.Component {
9191

9292
renderRules() {
9393
return _.map(this.props.validationRules, (rule) => {
94-
return <Rule ref={rule.id} key={rule.id} serverVersion={this.props.serverVersion} {...rule} />;
94+
return (<Rule ref={rule.id}
95+
key={rule.id}
96+
isWritable={this.props.isWritable}
97+
serverVersion={this.props.serverVersion}
98+
{...rule} />);
9599
});
96100
}
101+
102+
renderAddButton() {
103+
return (
104+
<Button
105+
bsStyle="success"
106+
bsSize="xsmall"
107+
disabled={!this.props.isWritable}
108+
onClick={this.onAddClick.bind(this)}>+ Add Rule
109+
</Button>);
110+
}
111+
97112
/**
98113
* Render status row component.
99114
*
@@ -119,11 +134,7 @@ class RuleBuilder extends React.Component {
119134
<Grid fluid className="rule-builder">
120135
<Row className="header">
121136
<Col lg={6} md={6} sm={6} xs={6}>
122-
<Button
123-
bsStyle="success"
124-
bsSize="xsmall"
125-
onClick={this.onAddClick.bind(this)}>+ Add Rule
126-
</Button>
137+
{this.props.isWritable ? this.renderAddButton() : null}
127138
</Col>
128139
<Col lg={6} md={6} sm={6} xs={6}>
129140
<div className="pull-right">
@@ -133,6 +144,7 @@ class RuleBuilder extends React.Component {
133144
options={{warn: 'Warning', error: 'Error'}}
134145
value={this.props.validationAction}
135146
label="validation action:"
147+
disabled={!this.props.isWritable}
136148
onSelect={this.onActionSelect.bind(this)}
137149
/>
138150
<OptionSelector
@@ -141,6 +153,7 @@ class RuleBuilder extends React.Component {
141153
options={{off: 'Off', moderate: 'Moderate', strict: 'Strict'}}
142154
value={this.props.validationLevel}
143155
label="validation level:"
156+
disabled={!this.props.isWritable}
144157
onSelect={this.onLevelSelect.bind(this)}
145158
/>
146159
</div>
@@ -175,7 +188,8 @@ RuleBuilder.propTypes = {
175188
validationAction: React.PropTypes.oneOf(['warn', 'error']).isRequired,
176189
validationLevel: React.PropTypes.oneOf(['off', 'moderate', 'strict']).isRequired,
177190
validationRules: React.PropTypes.array.isRequired,
178-
serverVersion: React.PropTypes.string
191+
serverVersion: React.PropTypes.string.isRequired,
192+
isWritable: React.PropTypes.bool.isRequired
179193
};
180194

181195
RuleBuilder.displayName = 'RuleBuilder';

src/internal-packages/validation/lib/components/rule-categories/range.jsx

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,8 @@ class RuleCategoryRange extends React.Component {
213213
<RangeInput
214214
ref="lower"
215215
boundIncluded={this.props.parameters.lowerBoundType === '$gte'}
216-
disabled={this.props.parameters.lowerBoundType === null}
216+
hidden={this.props.parameters.lowerBoundType === null}
217+
disabled={!this.props.isWritable}
217218
value={this.props.parameters.lowerBoundValue || ''}
218219
onRangeInputBlur={this.onRangeInputBlur.bind(this, 'lower')}
219220
validationState={validationState}
@@ -222,7 +223,8 @@ class RuleCategoryRange extends React.Component {
222223
ref="upper"
223224
upperBound
224225
boundIncluded={this.props.parameters.upperBoundType === '$lte'}
225-
disabled={this.props.parameters.upperBoundType === null}
226+
hidden={this.props.parameters.upperBoundType === null}
227+
disabled={!this.props.isWritable}
226228
value={this.props.parameters.upperBoundValue || ''}
227229
onRangeInputBlur={this.onRangeInputBlur.bind(this, 'upper')}
228230
validationState={validationState}
@@ -234,7 +236,8 @@ class RuleCategoryRange extends React.Component {
234236

235237
RuleCategoryRange.propTypes = {
236238
id: React.PropTypes.string.isRequired,
237-
parameters: React.PropTypes.object.isRequired
239+
parameters: React.PropTypes.object.isRequired,
240+
isWritable: React.PropTypes.bool.isRequired
238241
};
239242

240243
RuleCategoryRange.displayName = 'RuleCategoryRange';

src/internal-packages/validation/lib/components/rule-categories/regex.jsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -136,6 +136,7 @@ class RuleCategoryRegex extends React.Component {
136136
placeholder="Enter regular expression"
137137
onChange={this.onChange.bind(this)}
138138
onBlur={this.onBlur.bind(this)}
139+
disabled={!this.props.isWritable}
139140
/>
140141
<DropdownButton id="regex-options"
141142
title="options"
@@ -146,6 +147,7 @@ class RuleCategoryRegex extends React.Component {
146147
type="checkbox"
147148
value="i"
148149
checked={this.isOptionSelected('i')}
150+
disabled={!this.props.isWritable}
149151
onChange={this.onOptionChange.bind(this)} />
150152
<b>i</b>
151153
{CASE_INSENSITIVE}
@@ -155,6 +157,7 @@ class RuleCategoryRegex extends React.Component {
155157
type="checkbox"
156158
value="m"
157159
checked={this.isOptionSelected('m')}
160+
disabled={!this.props.isWritable}
158161
onChange={this.onOptionChange.bind(this)} />
159162
<b>m</b>
160163
{MULTILINE}
@@ -164,6 +167,7 @@ class RuleCategoryRegex extends React.Component {
164167
type="checkbox"
165168
value="x"
166169
checked={this.isOptionSelected('x')}
170+
disabled={!this.props.isWritable}
167171
onChange={this.onOptionChange.bind(this)} />
168172
<b>x</b>
169173
{EXTENDED}
@@ -173,6 +177,7 @@ class RuleCategoryRegex extends React.Component {
173177
type="checkbox"
174178
value="s"
175179
checked={this.isOptionSelected('s')}
180+
disabled={!this.props.isWritable}
176181
onChange={this.onOptionChange.bind(this)} />
177182
<b>s</b>
178183
{NEWLINE}
@@ -185,7 +190,8 @@ class RuleCategoryRegex extends React.Component {
185190

186191
RuleCategoryRegex.propTypes = {
187192
id: React.PropTypes.string.isRequired,
188-
parameters: React.PropTypes.object.isRequired
193+
parameters: React.PropTypes.object.isRequired,
194+
isWritable: React.PropTypes.bool.isRequired
189195
};
190196

191197
RuleCategoryRegex.displayName = 'RuleCategoryRegex';

src/internal-packages/validation/lib/components/rule-categories/type.jsx

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -80,15 +80,20 @@ class RuleCategoryType extends React.Component {
8080
const typeNumber = this.props.parameters.type;
8181

8282
return (
83-
<BSONTypeSelector typeNumber={typeNumber} serverVersion={this.props.serverVersion} onTypeClicked={this.onTypeClicked.bind(this)} />
83+
<BSONTypeSelector
84+
typeNumber={typeNumber}
85+
serverVersion={this.props.serverVersion}
86+
isDisabled={!this.props.isWritable}
87+
onTypeClicked={this.onTypeClicked.bind(this)} />
8488
);
8589
}
8690
}
8791

8892
RuleCategoryType.propTypes = {
8993
id: React.PropTypes.string.isRequired,
9094
parameters: React.PropTypes.object.isRequired,
91-
serverVersion: React.PropTypes.string
95+
serverVersion: React.PropTypes.string.isRequired,
96+
isWritable: React.PropTypes.bool.isRequired
9297
};
9398

9499
RuleCategoryType.displayName = 'RuleCategoryType';

src/internal-packages/validation/lib/components/rule-category-selector.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ class RuleCategorySelector extends React.Component {
7575
label=""
7676
value={this.state.category}
7777
onSelect={this.onSelect.bind(this)}
78+
disabled={!this.props.isWritable}
7879
/>
7980
</FormGroup>
8081
);
@@ -83,7 +84,8 @@ class RuleCategorySelector extends React.Component {
8384

8485
RuleCategorySelector.propTypes = {
8586
id: React.PropTypes.string.isRequired,
86-
category: React.PropTypes.string.isRequired
87+
category: React.PropTypes.string.isRequired,
88+
isWritable: React.PropTypes.bool
8789
};
8890

8991
RuleCategorySelector.displayName = 'RuleCategorySelector';

src/internal-packages/validation/lib/components/rule-field-selector.jsx

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ class RuleFieldSelector extends React.Component {
8080
value={this.state.value}
8181
onChange={this.onFieldChanged.bind(this)}
8282
onBlur={this.onBlur.bind(this)}
83+
disabled={!this.props.isWritable}
8384
/>
8485
</FormGroup>
8586
);
@@ -88,7 +89,8 @@ class RuleFieldSelector extends React.Component {
8889

8990
RuleFieldSelector.propTypes = {
9091
id: React.PropTypes.string.isRequired,
91-
field: React.PropTypes.string.isRequired
92+
field: React.PropTypes.string.isRequired,
93+
isWritable: React.PropTypes.bool
9294
};
9395

9496
RuleFieldSelector.displayName = 'RuleFieldSelector';

0 commit comments

Comments
 (0)