Skip to content

Commit f2c2e66

Browse files
committed
allow adding, removing, editing multiple seach patterns
1 parent e8025bb commit f2c2e66

File tree

3 files changed

+123
-33
lines changed

3 files changed

+123
-33
lines changed

modules/st2-criteria/criteria.component.js

Lines changed: 117 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ const types = {
5757
const searchConditions = {
5858
'any': 'Any',
5959
'all': 'All',
60+
'any2any': 'Any2Any',
61+
'all2any': 'All2Any',
6062
};
6163

6264
export default class Criteria extends React.Component {
@@ -85,7 +87,33 @@ export default class Criteria extends React.Component {
8587
});
8688
}
8789

88-
handleChangeSearchPattern(key, pattern) {
90+
91+
handleChangeSearchItemKey(key, oldItemKey, itemKey) {
92+
const { onChange } = this.props;
93+
94+
if(oldItemKey !== itemKey) {
95+
const data = { ...this.props.data };
96+
const dataItem = { ...data[key].pattern };
97+
delete dataItem[oldItemKey];
98+
99+
return onChange({
100+
...data,
101+
[key]: {
102+
...data[key],
103+
pattern: {
104+
...dataItem,
105+
[itemKey]: {
106+
...data[key].pattern[oldItemKey],
107+
},
108+
},
109+
},
110+
});
111+
}
112+
return onChange(this.props.data);
113+
114+
}
115+
116+
handleChangeSearchPattern(key, itemKey, pattern) {
89117
const { data, onChange } = this.props;
90118

91119
return onChange({
@@ -94,16 +122,16 @@ export default class Criteria extends React.Component {
94122
...data[key],
95123
pattern: {
96124
...data[key].pattern,
97-
['item.data']: {
98-
...data[key].pattern['item.data'],
125+
[itemKey]: {
126+
...data[key].pattern[itemKey],
99127
pattern,
100128
},
101129
},
102130
},
103131
});
104132
}
105133

106-
handleChangeSearchType(key, type) {
134+
handleChangeSearchType(key, itemKey, type) {
107135
const { data, onChange } = this.props;
108136

109137
return onChange({
@@ -112,27 +140,65 @@ export default class Criteria extends React.Component {
112140
...data[key],
113141
pattern: {
114142
...data[key].pattern,
115-
['item.data']: {
116-
...data[key].pattern['item.data'],
143+
[itemKey]: {
144+
...data[key].pattern[itemKey],
117145
type,
118146
},
119147
},
120148
},
121149
});
122150
}
123151

124-
handleChangeKey(oldKey, key) {
152+
handleAddSearchPatternItem(key) {
153+
const { data, onChange } = this.props;
154+
155+
return onChange({
156+
...data,
157+
[key]: {
158+
...data[key],
159+
pattern: {
160+
...data[key].pattern,
161+
['']: {
162+
type: Object.keys(types)[0],
163+
},
164+
},
165+
},
166+
});
167+
}
168+
169+
handleRemoveSearchPatternItem(key, itemKey) {
125170
const { onChange } = this.props;
126171

127172
const data = { ...this.props.data };
128-
delete data[oldKey];
173+
const dataPattern = {...this.props.data[key].pattern};
174+
delete dataPattern[itemKey];
129175

130176
return onChange({
131177
...data,
132-
[key]: this.props.data[oldKey],
178+
[key]: {
179+
...data[key],
180+
pattern: {
181+
...dataPattern,
182+
},
183+
},
133184
});
134185
}
135186

187+
handleChangeKey(oldKey, key) {
188+
const { onChange } = this.props;
189+
190+
if(oldKey!== key) {
191+
const data = { ...this.props.data };
192+
delete data[oldKey];
193+
194+
return onChange({
195+
...data,
196+
[key]: this.props.data[oldKey],
197+
});
198+
}
199+
return onChange(this.props.data);
200+
}
201+
136202
handleChangeType(key, type) {
137203
const { data, onChange } = this.props;
138204

@@ -145,9 +211,7 @@ export default class Criteria extends React.Component {
145211
type,
146212
condition: 'all',
147213
pattern: {
148-
...data[key].pattern,
149-
['item.data']: {
150-
...data[key].pattern['item.data'],
214+
['']: {
151215
type: Object.keys(types)[0],
152216
},
153217
},
@@ -211,13 +275,15 @@ export default class Criteria extends React.Component {
211275
{ _.map(data, ({ type, pattern, condition }, key) => (
212276
<div className={style.line} key={key}>
213277
<AutoFormCombobox
278+
name='Key'
214279
className={style.entity}
215280
disabled={disabled}
216281
data={key}
217282
spec={spec}
218283
onChange={(value) => this.handleChangeKey(key, value)}
219284
/>
220285
<AutoFormSelect
286+
name='Type'
221287
className={style.entity}
222288
disabled={disabled}
223289
data={type}
@@ -240,30 +306,47 @@ export default class Criteria extends React.Component {
240306
}}
241307
onChange={(value) => this.handleChangeSearchCondition(key, value)}
242308
/>
243-
<AutoFormInput
244-
name={'Pattern'}
245-
className={style.entity}
246-
disabled={disabled}
247-
data={pattern['item.data'] ? pattern['item.data'].pattern : ''}
248-
spec={{
249-
required: true,
250-
}}
251-
onChange={(value) => this.handleChangeSearchPattern(key, value)}
252-
/>
253-
<AutoFormSelect
254-
name={'Type'}
255-
className={style.entity}
256-
disabled={disabled}
257-
data={pattern['item.data'] ? pattern['item.data'].type : ''}
258-
spec={{
259-
required: true,
260-
enum: types,
261-
}}
262-
onChange={(value) => this.handleChangeSearchType(key, value)}
263-
/>
309+
<div className={style.break} />
310+
<h5>Search Patterns <i className={cx('icon-plus', style.remove)} onClick={() => this.handleAddSearchPatternItem(key)} /></h5>
311+
<div className={style.break} />
312+
{ _.map(pattern, ({ type, pattern }, itemKey) => (
313+
<div style={{display: 'flex'}} key={itemKey}>
314+
<AutoFormCombobox
315+
name={'Item name'}
316+
className={style.entity}
317+
disabled={disabled}
318+
data={itemKey}
319+
spec={spec}
320+
onChange={(value) => this.handleChangeSearchItemKey(key, itemKey, value)}
321+
/>
322+
<AutoFormSelect
323+
name={'Type'}
324+
className={style.entity}
325+
disabled={disabled}
326+
data={type}
327+
spec={{
328+
required: true,
329+
enum: types,
330+
}}
331+
onChange={(value) => this.handleChangeSearchType(key, itemKey, value)}
332+
/>
333+
<AutoFormInput
334+
name={'Pattern'}
335+
className={style.entity}
336+
disabled={disabled}
337+
data={pattern || ''}
338+
spec={{
339+
required: true,
340+
}}
341+
onChange={(value) => this.handleChangeSearchPattern(key, itemKey, value)}
342+
/>
343+
<i className={cx('icon-cross', style.remove)} onClick={() => this.handleRemoveSearchPatternItem(key, itemKey)} />
344+
</div>
345+
))}
264346
</>
265347
) : (
266348
<AutoFormInput
349+
name={'Pattern'}
267350
className={style.entity}
268351
disabled={disabled}
269352
data={pattern}
@@ -273,6 +356,7 @@ export default class Criteria extends React.Component {
273356
onChange={(value) => this.handleChangePattern(key, value)}
274357
/>
275358
)}
359+
<div className={style.break} />
276360
{ disabled ? null :
277361
<i className={cx('icon-cross', style.remove)} onClick={() => this.handleRemove(key)} />
278362
}

modules/st2-criteria/style.css

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,3 +63,8 @@
6363

6464
flex: initial;
6565
}
66+
67+
.break {
68+
flex-basis: 100%;
69+
height: 0;
70+
}

modules/st2-panel/style.css

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -782,6 +782,7 @@
782782
&-search-patterns-list {
783783
list-style-type: none;
784784
padding-inline-start: 10px;
785+
padding-left: 10px;
785786
&-details {
786787
margin-left: 5px;
787788
}

0 commit comments

Comments
 (0)