-
-
Notifications
You must be signed in to change notification settings - Fork 1.4k
/
FilterRow.react.js
121 lines (115 loc) · 3.78 KB
/
FilterRow.react.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
/*
* Copyright (c) 2016-present, Parse, LLC
* All rights reserved.
*
* This source code is licensed under the license found in the LICENSE file in
* the root directory of this source tree.
*/
import ChromeDropdown from 'components/ChromeDropdown/ChromeDropdown.react';
import { Constraints } from 'lib/Filters';
import DateTimeEntry from 'components/DateTimeEntry/DateTimeEntry.react';
import Icon from 'components/Icon/Icon.react';
import Parse from 'parse';
import PropTypes from 'lib/PropTypes';
import React from 'react';
import styles from 'components/BrowserFilter/BrowserFilter.scss';
import validateNumeric from 'lib/validateNumeric';
let constraintLookup = {};
for (let c in Constraints) {
constraintLookup[Constraints[c].name] = c;
}
let setFocus = (input) => {
if (input !== null) {
input.focus();
}
}
function compareValue(info, value, onChangeCompareTo, onKeyDown, active, parentContentId) {
switch (info.type) {
case null:
return null;
case 'Object':
case 'String':
return <input type='text' value={value} onChange={(e) => onChangeCompareTo(e.target.value)} onKeyDown={onKeyDown} ref={setFocus}/>;
case 'Pointer':
return (
<input
type='text'
value={value.objectId || ''}
onChange={(e) => {
let obj = new Parse.Object(info.targetClass);
obj.id = e.target.value;
onChangeCompareTo(obj.toPointer());
}}
ref={setFocus} />
);
case 'Boolean':
return <ChromeDropdown color={active ? 'blue' : 'purple'} value={value ? 'True' : 'False'} options={['True', 'False']} onChange={(val) => onChangeCompareTo(val === 'True')} />;
case 'Number':
return (
<input
type='text'
value={value}
onChange={(e) => {
let val = value;
if (!e.target.value.length || e.target.value === '-') {
val = e.target.value;
} else if (validateNumeric(e.target.value)) {
val = parseFloat(e.target.value);
}
onChangeCompareTo(val);
}}
onKeyDown={onKeyDown}
/>
);
case 'Date':
return (
<DateTimeEntry
fixed={true}
className={styles.date}
value={Parse._decode('date', value)}
onChange={(value) => onChangeCompareTo(Parse._encode(value))}
ref={setFocus}
parentContentId={parentContentId} />
);
}
}
let FilterRow = ({
fields,
constraints,
compareInfo,
currentField,
currentConstraint,
compareTo,
onChangeField,
onChangeConstraint,
onChangeCompareTo,
onKeyDown,
onDeleteRow,
active,
parentContentId,
}) => (
<div className={styles.row}>
<ChromeDropdown
color={active ? 'blue' : 'purple'}
value={currentField}
options={fields}
onChange={onChangeField} />
<ChromeDropdown
width={compareInfo.type ? '175' : '325'}
color={active ? 'blue' : 'purple'}
value={Constraints[currentConstraint].name}
options={constraints.map((c) => Constraints[c].name)}
onChange={(c) => onChangeConstraint(constraintLookup[c], compareTo)} />
{compareValue(compareInfo, compareTo, onChangeCompareTo, onKeyDown, active, parentContentId)}
<button type='button' className={styles.remove} onClick={onDeleteRow}><Icon name='minus-solid' width={14} height={14} fill='rgba(0,0,0,0.4)' /></button>
</div>
);
export default FilterRow;
FilterRow.propTypes = {
fields: PropTypes.arrayOf(PropTypes.string).isRequired,
currentField: PropTypes.string.isRequired,
constraints: PropTypes.arrayOf(PropTypes.string).isRequired,
currentConstraint: PropTypes.string.isRequired,
compareTo: PropTypes.any,
compareInfo: PropTypes.object
};