@jbrowse/plugin-config 1.7.9 → 1.7.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -31,6 +31,8 @@ var _Add = _interopRequireDefault(require("@material-ui/icons/Add"));
31
31
 
32
32
  var _RadioButtonUnchecked = _interopRequireDefault(require("@material-ui/icons/RadioButtonUnchecked"));
33
33
 
34
+ var _StringArrayEditor = _interopRequireDefault(require("./StringArrayEditor"));
35
+
34
36
  var _CallbackEditor = _interopRequireDefault(require("./CallbackEditor"));
35
37
 
36
38
  var _ColorEditor = _interopRequireDefault(require("./ColorEditor"));
@@ -89,59 +91,6 @@ var SvgCheckbox = function SvgCheckbox() {
89
91
  }));
90
92
  };
91
93
 
92
- var StringArrayEditor = (0, _mobxReact.observer)(function (_ref3) {
93
- var slot = _ref3.slot;
94
-
95
- var _useState = (0, _react.useState)(''),
96
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
97
- value = _useState2[0],
98
- setValue = _useState2[1];
99
-
100
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, slot.name ? /*#__PURE__*/_react.default.createElement(_core.InputLabel, null, slot.name) : null, /*#__PURE__*/_react.default.createElement(_core.List, {
101
- disablePadding: true
102
- }, slot.value.map(function (val, idx) {
103
- return /*#__PURE__*/_react.default.createElement(_core.ListItem, {
104
- key: idx,
105
- disableGutters: true
106
- }, /*#__PURE__*/_react.default.createElement(_core.TextField, {
107
- value: val,
108
- onChange: function onChange(evt) {
109
- return slot.setAtIndex(idx, evt.target.value);
110
- },
111
- InputProps: {
112
- endAdornment: /*#__PURE__*/_react.default.createElement(_core.InputAdornment, {
113
- position: "end"
114
- }, /*#__PURE__*/_react.default.createElement(_core.IconButton, {
115
- color: "secondary",
116
- onClick: function onClick() {
117
- return slot.removeAtIndex(idx);
118
- }
119
- }, /*#__PURE__*/_react.default.createElement(_Delete.default, null)))
120
- }
121
- }));
122
- }), /*#__PURE__*/_react.default.createElement(_core.ListItem, {
123
- disableGutters: true
124
- }, /*#__PURE__*/_react.default.createElement(_core.TextField, {
125
- value: value,
126
- placeholder: "add new",
127
- onChange: function onChange(event) {
128
- return setValue(event.target.value);
129
- },
130
- InputProps: {
131
- endAdornment: /*#__PURE__*/_react.default.createElement(_core.InputAdornment, {
132
- position: "end"
133
- }, /*#__PURE__*/_react.default.createElement(_core.IconButton, {
134
- onClick: function onClick() {
135
- slot.add(value);
136
- setValue('');
137
- },
138
- disabled: value === '',
139
- color: "secondary",
140
- "data-testid": "stringArrayAdd-".concat(slot.name)
141
- }, /*#__PURE__*/_react.default.createElement(_Add.default, null)))
142
- }
143
- }))), /*#__PURE__*/_react.default.createElement(_core.FormHelperText, null, slot.description));
144
- });
145
94
  var useMapEditorStyles = (0, _core.makeStyles)(function (theme) {
146
95
  return {
147
96
  card: {
@@ -149,19 +98,19 @@ var useMapEditorStyles = (0, _core.makeStyles)(function (theme) {
149
98
  }
150
99
  };
151
100
  });
152
- var StringArrayMapEditor = (0, _mobxReact.observer)(function (_ref4) {
153
- var slot = _ref4.slot;
101
+ var StringArrayMapEditor = (0, _mobxReact.observer)(function (_ref3) {
102
+ var slot = _ref3.slot;
154
103
  var classes = useMapEditorStyles();
155
104
 
156
- var _useState3 = (0, _react.useState)(''),
157
- _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
158
- value = _useState4[0],
159
- setValue = _useState4[1];
105
+ var _useState = (0, _react.useState)(''),
106
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
107
+ value = _useState2[0],
108
+ setValue = _useState2[1];
160
109
 
161
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_core.InputLabel, null, slot.name), Array.from(slot.value, function (_ref5) {
162
- var _ref6 = (0, _slicedToArray2.default)(_ref5, 2),
163
- key = _ref6[0],
164
- val = _ref6[1];
110
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_core.InputLabel, null, slot.name), Array.from(slot.value, function (_ref4) {
111
+ var _ref5 = (0, _slicedToArray2.default)(_ref4, 2),
112
+ key = _ref5[0],
113
+ val = _ref5[1];
165
114
 
166
115
  return /*#__PURE__*/_react.default.createElement(_core.Card, {
167
116
  raised: true,
@@ -175,7 +124,7 @@ var StringArrayMapEditor = (0, _mobxReact.observer)(function (_ref4) {
175
124
  return slot.remove(key);
176
125
  }
177
126
  }, /*#__PURE__*/_react.default.createElement(_Delete.default, null))
178
- }), /*#__PURE__*/_react.default.createElement(_core.CardContent, null, /*#__PURE__*/_react.default.createElement(StringArrayEditor, {
127
+ }), /*#__PURE__*/_react.default.createElement(_core.CardContent, null, /*#__PURE__*/_react.default.createElement(_StringArrayEditor.default, {
179
128
  slot: {
180
129
  value: val,
181
130
  description: "Values associated with entry ".concat(key),
@@ -217,19 +166,19 @@ var StringArrayMapEditor = (0, _mobxReact.observer)(function (_ref4) {
217
166
  })
218
167
  })), /*#__PURE__*/_react.default.createElement(_core.FormHelperText, null, slot.description));
219
168
  });
220
- var NumberMapEditor = (0, _mobxReact.observer)(function (_ref7) {
221
- var slot = _ref7.slot;
169
+ var NumberMapEditor = (0, _mobxReact.observer)(function (_ref6) {
170
+ var slot = _ref6.slot;
222
171
  var classes = useMapEditorStyles();
223
172
 
224
- var _useState5 = (0, _react.useState)(''),
225
- _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
226
- value = _useState6[0],
227
- setValue = _useState6[1];
173
+ var _useState3 = (0, _react.useState)(''),
174
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
175
+ value = _useState4[0],
176
+ setValue = _useState4[1];
228
177
 
229
- return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_core.InputLabel, null, slot.name), Array.from(slot.value, function (_ref8) {
230
- var _ref9 = (0, _slicedToArray2.default)(_ref8, 2),
231
- key = _ref9[0],
232
- val = _ref9[1];
178
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_core.InputLabel, null, slot.name), Array.from(slot.value, function (_ref7) {
179
+ var _ref8 = (0, _slicedToArray2.default)(_ref7, 2),
180
+ key = _ref8[0],
181
+ val = _ref8[1];
233
182
 
234
183
  return /*#__PURE__*/_react.default.createElement(_core.Card, {
235
184
  raised: true,
@@ -278,13 +227,13 @@ var NumberMapEditor = (0, _mobxReact.observer)(function (_ref7) {
278
227
  })
279
228
  })), /*#__PURE__*/_react.default.createElement(_core.FormHelperText, null, slot.description));
280
229
  });
281
- var NumberEditor = (0, _mobxReact.observer)(function (_ref10) {
282
- var slot = _ref10.slot;
230
+ var NumberEditor = (0, _mobxReact.observer)(function (_ref9) {
231
+ var slot = _ref9.slot;
283
232
 
284
- var _useState7 = (0, _react.useState)(slot.value),
285
- _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
286
- val = _useState8[0],
287
- setVal = _useState8[1];
233
+ var _useState5 = (0, _react.useState)(slot.value),
234
+ _useState6 = (0, _slicedToArray2.default)(_useState5, 2),
235
+ val = _useState6[0],
236
+ setVal = _useState6[1];
288
237
 
289
238
  (0, _react.useEffect)(function () {
290
239
  var num = parseFloat(val, 10);
@@ -305,13 +254,13 @@ var NumberEditor = (0, _mobxReact.observer)(function (_ref10) {
305
254
  }
306
255
  });
307
256
  });
308
- var IntegerEditor = (0, _mobxReact.observer)(function (_ref11) {
309
- var slot = _ref11.slot;
257
+ var IntegerEditor = (0, _mobxReact.observer)(function (_ref10) {
258
+ var slot = _ref10.slot;
310
259
 
311
- var _useState9 = (0, _react.useState)(slot.value),
312
- _useState10 = (0, _slicedToArray2.default)(_useState9, 2),
313
- val = _useState10[0],
314
- setVal = _useState10[1];
260
+ var _useState7 = (0, _react.useState)(slot.value),
261
+ _useState8 = (0, _slicedToArray2.default)(_useState7, 2),
262
+ val = _useState8[0],
263
+ setVal = _useState8[1];
315
264
 
316
265
  (0, _react.useEffect)(function () {
317
266
  var num = parseInt(val, 10);
@@ -330,8 +279,8 @@ var IntegerEditor = (0, _mobxReact.observer)(function (_ref11) {
330
279
  }
331
280
  });
332
281
  });
333
- var BooleanEditor = (0, _mobxReact.observer)(function (_ref12) {
334
- var slot = _ref12.slot;
282
+ var BooleanEditor = (0, _mobxReact.observer)(function (_ref11) {
283
+ var slot = _ref11.slot;
335
284
  return /*#__PURE__*/_react.default.createElement(_core.FormControl, null, /*#__PURE__*/_react.default.createElement(_core.FormControlLabel, {
336
285
  label: slot.name,
337
286
  control: /*#__PURE__*/_react.default.createElement(_core.Checkbox, {
@@ -342,9 +291,9 @@ var BooleanEditor = (0, _mobxReact.observer)(function (_ref12) {
342
291
  })
343
292
  }), /*#__PURE__*/_react.default.createElement(_core.FormHelperText, null, slot.description));
344
293
  });
345
- var StringEnumEditor = (0, _mobxReact.observer)(function (_ref13) {
346
- var slot = _ref13.slot,
347
- slotSchema = _ref13.slotSchema;
294
+ var StringEnumEditor = (0, _mobxReact.observer)(function (_ref12) {
295
+ var slot = _ref12.slot,
296
+ slotSchema = _ref12.slotSchema;
348
297
  var p = (0, _mobxStateTree.getPropertyMembers)((0, _mstReflection.getSubType)(slotSchema));
349
298
  var choices = (0, _mstReflection.getUnionSubTypes)((0, _mstReflection.getUnionSubTypes)((0, _mstReflection.getSubType)((0, _mstReflection.getPropertyType)(p, 'value')))[1]).map(function (t) {
350
299
  return t.value;
@@ -364,10 +313,10 @@ var StringEnumEditor = (0, _mobxReact.observer)(function (_ref13) {
364
313
  }, str);
365
314
  }));
366
315
  });
367
- var FileSelectorWrapper = (0, _mobxReact.observer)(function (_ref14) {
316
+ var FileSelectorWrapper = (0, _mobxReact.observer)(function (_ref13) {
368
317
  var _getEnv$pluginManager;
369
318
 
370
- var slot = _ref14.slot;
319
+ var slot = _ref13.slot;
371
320
  return /*#__PURE__*/_react.default.createElement(_ui.FileSelector, {
372
321
  location: slot.value,
373
322
  setLocation: function setLocation(location) {
@@ -382,7 +331,7 @@ var valueComponents = {
382
331
  string: StringEditor,
383
332
  text: TextEditor,
384
333
  fileLocation: FileSelectorWrapper,
385
- stringArray: StringArrayEditor,
334
+ stringArray: _StringArrayEditor.default,
386
335
  stringArrayMap: StringArrayMapEditor,
387
336
  numberMap: NumberMapEditor,
388
337
  number: NumberEditor,
@@ -413,9 +362,9 @@ var useSlotEditorStyles = (0, _core.makeStyles)(function (theme) {
413
362
  };
414
363
  });
415
364
  exports.useSlotEditorStyles = useSlotEditorStyles;
416
- var SlotEditor = (0, _mobxReact.observer)(function (_ref15) {
417
- var slot = _ref15.slot,
418
- slotSchema = _ref15.slotSchema;
365
+ var SlotEditor = (0, _mobxReact.observer)(function (_ref14) {
366
+ var slot = _ref14.slot,
367
+ slotSchema = _ref14.slotSchema;
419
368
  var classes = useSlotEditorStyles();
420
369
  var type = slot.type;
421
370
  var ValueComponent = slot.isCallback ? _CallbackEditor.default : valueComponents[type];
@@ -0,0 +1,12 @@
1
+ /// <reference types="react" />
2
+ declare const StringArrayEditor: ({ slot, }: {
3
+ slot: {
4
+ name: string;
5
+ value: string[];
6
+ setAtIndex: Function;
7
+ removeAtIndex: Function;
8
+ add: Function;
9
+ description: string;
10
+ };
11
+ }) => JSX.Element;
12
+ export default StringArrayEditor;
@@ -0,0 +1,110 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.default = void 0;
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _react = _interopRequireWildcard(require("react"));
15
+
16
+ var _mobxReact = require("mobx-react");
17
+
18
+ var _core = require("@material-ui/core");
19
+
20
+ var _Delete = _interopRequireDefault(require("@material-ui/icons/Delete"));
21
+
22
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
23
+
24
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
25
+
26
+ // icons
27
+ var StringArrayEditor = (0, _mobxReact.observer)(function (_ref) {
28
+ var slot = _ref.slot;
29
+
30
+ var _useState = (0, _react.useState)(''),
31
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
32
+ value = _useState2[0],
33
+ setValue = _useState2[1];
34
+
35
+ var _useState3 = (0, _react.useState)(false),
36
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
37
+ addNew = _useState4[0],
38
+ setAddNew = _useState4[1];
39
+
40
+ return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, slot.name ? /*#__PURE__*/_react.default.createElement(_core.InputLabel, null, slot.name) : null, /*#__PURE__*/_react.default.createElement(_core.List, {
41
+ disablePadding: true
42
+ }, slot.value.map(function (val, idx) {
43
+ return /*#__PURE__*/_react.default.createElement(_core.ListItem, {
44
+ key: idx,
45
+ disableGutters: true
46
+ }, /*#__PURE__*/_react.default.createElement(_core.TextField, {
47
+ value: val,
48
+ onChange: function onChange(evt) {
49
+ return slot.setAtIndex(idx, evt.target.value);
50
+ },
51
+ InputProps: {
52
+ endAdornment: /*#__PURE__*/_react.default.createElement(_core.InputAdornment, {
53
+ position: "end"
54
+ }, /*#__PURE__*/_react.default.createElement(_core.IconButton, {
55
+ color: "secondary",
56
+ onClick: function onClick() {
57
+ return slot.removeAtIndex(idx);
58
+ }
59
+ }, /*#__PURE__*/_react.default.createElement(_Delete.default, null)))
60
+ }
61
+ }));
62
+ }), addNew ? /*#__PURE__*/_react.default.createElement(_core.ListItem, {
63
+ disableGutters: true
64
+ }, /*#__PURE__*/_react.default.createElement(_core.TextField, {
65
+ value: value,
66
+ placeholder: "add new",
67
+ onChange: function onChange(event) {
68
+ return setValue(event.target.value);
69
+ },
70
+ InputProps: {
71
+ endAdornment: /*#__PURE__*/_react.default.createElement(_core.InputAdornment, {
72
+ position: "end"
73
+ }, /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_core.Button, {
74
+ color: "primary",
75
+ variant: "contained",
76
+ style: {
77
+ margin: 2
78
+ },
79
+ "data-testid": "stringArrayAdd-".concat(slot.name),
80
+ onClick: function onClick() {
81
+ setAddNew(false);
82
+ slot.add(value);
83
+ setValue('');
84
+ }
85
+ }, "OK"), /*#__PURE__*/_react.default.createElement(_core.Button, {
86
+ color: "primary",
87
+ variant: "contained",
88
+ style: {
89
+ margin: 2
90
+ },
91
+ onClick: function onClick() {
92
+ setAddNew(false);
93
+ setValue('');
94
+ }
95
+ }, "Cancel")))
96
+ }
97
+ })) : null, /*#__PURE__*/_react.default.createElement(_core.Button, {
98
+ color: "primary",
99
+ variant: "contained",
100
+ style: {
101
+ margin: 4
102
+ },
103
+ disabled: addNew,
104
+ onClick: function onClick() {
105
+ return setAddNew(true);
106
+ }
107
+ }, "Add item")), /*#__PURE__*/_react.default.createElement(_core.FormHelperText, null, slot.description));
108
+ });
109
+ var _default = StringArrayEditor;
110
+ exports.default = _default;
@@ -26,7 +26,7 @@ exports.configSchema = configSchema;
26
26
  var HeadingComponent = (0, _mobxReact.observer)(function (_ref) {
27
27
  var model = _ref.model;
28
28
 
29
- if (model && model.target) {
29
+ if (model !== null && model !== void 0 && model.target) {
30
30
  if (model.target.type) {
31
31
  return "".concat(model.target.type, " settings");
32
32
  }
@@ -34,7 +34,7 @@ var HeadingComponent = (0, _mobxReact.observer)(function (_ref) {
34
34
  if ((0, _mobxStateTree.isStateTreeNode)(model.target)) {
35
35
  var type = (0, _mobxStateTree.getType)(model.target);
36
36
 
37
- if (type && type.name) {
37
+ if (type !== null && type !== void 0 && type.name) {
38
38
  return "".concat(type.name.replace('ConfigurationSchema', ''), " settings");
39
39
  }
40
40
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbrowse/plugin-config",
3
- "version": "1.7.9",
3
+ "version": "1.7.10",
4
4
  "description": "JBrowse 2 config utilities",
5
5
  "keywords": [
6
6
  "jbrowse",
@@ -53,5 +53,5 @@
53
53
  "publishConfig": {
54
54
  "access": "public"
55
55
  },
56
- "gitHead": "a6504c385d703ce6e755d05652ef659ffe28c864"
56
+ "gitHead": "02d8c1e88e5603ea5855faed4ccb814e28071b32"
57
57
  }
@@ -18,8 +18,6 @@ import {
18
18
  IconButton,
19
19
  InputAdornment,
20
20
  InputLabel,
21
- List,
22
- ListItem,
23
21
  MenuItem,
24
22
  Paper,
25
23
  SvgIcon,
@@ -33,6 +31,7 @@ import AddIcon from '@material-ui/icons/Add'
33
31
  import RadioButtonUncheckedIcon from '@material-ui/icons/RadioButtonUnchecked'
34
32
 
35
33
  // locals
34
+ import StringArrayEditor from './StringArrayEditor'
36
35
  import CallbackEditor from './CallbackEditor'
37
36
  import ColorEditor from './ColorEditor'
38
37
  import JsonEditor from './JsonEditor'
@@ -80,62 +79,6 @@ const SvgCheckbox = () => (
80
79
  </SvgIcon>
81
80
  )
82
81
 
83
- const StringArrayEditor = observer(({ slot }) => {
84
- const [value, setValue] = useState('')
85
- return (
86
- <>
87
- {slot.name ? <InputLabel>{slot.name}</InputLabel> : null}
88
- <List disablePadding>
89
- {slot.value.map((val, idx) => (
90
- <ListItem key={idx} disableGutters>
91
- <TextField
92
- value={val}
93
- onChange={evt => slot.setAtIndex(idx, evt.target.value)}
94
- InputProps={{
95
- endAdornment: (
96
- <InputAdornment position="end">
97
- <IconButton
98
- color="secondary"
99
- onClick={() => slot.removeAtIndex(idx)}
100
- >
101
- <DeleteIcon />
102
- </IconButton>
103
- </InputAdornment>
104
- ),
105
- }}
106
- />
107
- </ListItem>
108
- ))}
109
- <ListItem disableGutters>
110
- <TextField
111
- value={value}
112
- placeholder="add new"
113
- onChange={event => setValue(event.target.value)}
114
- InputProps={{
115
- endAdornment: (
116
- <InputAdornment position="end">
117
- <IconButton
118
- onClick={() => {
119
- slot.add(value)
120
- setValue('')
121
- }}
122
- disabled={value === ''}
123
- color="secondary"
124
- data-testid={`stringArrayAdd-${slot.name}`}
125
- >
126
- <AddIcon />
127
- </IconButton>
128
- </InputAdornment>
129
- ),
130
- }}
131
- />
132
- </ListItem>
133
- </List>
134
- <FormHelperText>{slot.description}</FormHelperText>
135
- </>
136
- )
137
- })
138
-
139
82
  const useMapEditorStyles = makeStyles(theme => ({
140
83
  card: {
141
84
  marginTop: theme.spacing(1),
@@ -0,0 +1,115 @@
1
+ import React, { useState } from 'react'
2
+ import { observer } from 'mobx-react'
3
+
4
+ import {
5
+ Button,
6
+ FormHelperText,
7
+ IconButton,
8
+ InputAdornment,
9
+ InputLabel,
10
+ List,
11
+ ListItem,
12
+ TextField,
13
+ } from '@material-ui/core'
14
+
15
+ // icons
16
+ import DeleteIcon from '@material-ui/icons/Delete'
17
+
18
+ const StringArrayEditor = observer(
19
+ ({
20
+ slot,
21
+ }: {
22
+ slot: {
23
+ name: string
24
+ value: string[]
25
+ setAtIndex: Function
26
+ removeAtIndex: Function
27
+ add: Function
28
+ description: string
29
+ }
30
+ }) => {
31
+ const [value, setValue] = useState('')
32
+ const [addNew, setAddNew] = useState(false)
33
+ return (
34
+ <>
35
+ {slot.name ? <InputLabel>{slot.name}</InputLabel> : null}
36
+ <List disablePadding>
37
+ {slot.value.map((val, idx) => (
38
+ <ListItem key={idx} disableGutters>
39
+ <TextField
40
+ value={val}
41
+ onChange={evt => slot.setAtIndex(idx, evt.target.value)}
42
+ InputProps={{
43
+ endAdornment: (
44
+ <InputAdornment position="end">
45
+ <IconButton
46
+ color="secondary"
47
+ onClick={() => slot.removeAtIndex(idx)}
48
+ >
49
+ <DeleteIcon />
50
+ </IconButton>
51
+ </InputAdornment>
52
+ ),
53
+ }}
54
+ />
55
+ </ListItem>
56
+ ))}
57
+
58
+ {addNew ? (
59
+ <ListItem disableGutters>
60
+ <TextField
61
+ value={value}
62
+ placeholder="add new"
63
+ onChange={event => setValue(event.target.value)}
64
+ InputProps={{
65
+ endAdornment: (
66
+ <InputAdornment position="end">
67
+ <>
68
+ <Button
69
+ color="primary"
70
+ variant="contained"
71
+ style={{ margin: 2 }}
72
+ data-testid={`stringArrayAdd-${slot.name}`}
73
+ onClick={() => {
74
+ setAddNew(false)
75
+ slot.add(value)
76
+ setValue('')
77
+ }}
78
+ >
79
+ OK
80
+ </Button>
81
+ <Button
82
+ color="primary"
83
+ variant="contained"
84
+ style={{ margin: 2 }}
85
+ onClick={() => {
86
+ setAddNew(false)
87
+ setValue('')
88
+ }}
89
+ >
90
+ Cancel
91
+ </Button>
92
+ </>
93
+ </InputAdornment>
94
+ ),
95
+ }}
96
+ />
97
+ </ListItem>
98
+ ) : null}
99
+ <Button
100
+ color="primary"
101
+ variant="contained"
102
+ style={{ margin: 4 }}
103
+ disabled={addNew}
104
+ onClick={() => setAddNew(true)}
105
+ >
106
+ Add item
107
+ </Button>
108
+ </List>
109
+ <FormHelperText>{slot.description}</FormHelperText>
110
+ </>
111
+ )
112
+ },
113
+ )
114
+
115
+ export default StringArrayEditor
@@ -310,51 +310,21 @@ exports[`ConfigurationEditor widget renders all the different types of built-in
310
310
  </div>
311
311
  </div>
312
312
  </li>
313
- <li
314
- class="MuiListItem-root"
313
+ <button
314
+ class="MuiButtonBase-root MuiButton-root MuiButton-contained MuiButton-containedPrimary"
315
+ style="margin: 4px;"
316
+ tabindex="0"
317
+ type="button"
315
318
  >
316
- <div
317
- class="MuiFormControl-root MuiTextField-root"
319
+ <span
320
+ class="MuiButton-label"
318
321
  >
319
- <div
320
- class="MuiInputBase-root MuiInput-root MuiInput-underline MuiInputBase-formControl MuiInput-formControl MuiInputBase-adornedEnd"
321
- >
322
- <input
323
- aria-invalid="false"
324
- class="MuiInputBase-input MuiInput-input MuiInputBase-inputAdornedEnd"
325
- placeholder="add new"
326
- type="text"
327
- value=""
328
- />
329
- <div
330
- class="MuiInputAdornment-root MuiInputAdornment-positionEnd"
331
- >
332
- <button
333
- class="MuiButtonBase-root MuiIconButton-root MuiIconButton-colorSecondary MuiIconButton-disabled MuiButtonBase-disabled"
334
- data-testid="stringArrayAdd-stringArrayTest"
335
- disabled=""
336
- tabindex="-1"
337
- type="button"
338
- >
339
- <span
340
- class="MuiIconButton-label"
341
- >
342
- <svg
343
- aria-hidden="true"
344
- class="MuiSvgIcon-root"
345
- focusable="false"
346
- viewBox="0 0 24 24"
347
- >
348
- <path
349
- d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"
350
- />
351
- </svg>
352
- </span>
353
- </button>
354
- </div>
355
- </div>
356
- </div>
357
- </li>
322
+ Add item
323
+ </span>
324
+ <span
325
+ class="MuiTouchRipple-root"
326
+ />
327
+ </button>
358
328
  </ul>
359
329
  <p
360
330
  class="MuiFormHelperText-root"
@@ -516,51 +486,21 @@ exports[`ConfigurationEditor widget renders all the different types of built-in
516
486
  </div>
517
487
  </div>
518
488
  </li>
519
- <li
520
- class="MuiListItem-root"
489
+ <button
490
+ class="MuiButtonBase-root MuiButton-root MuiButton-contained MuiButton-containedPrimary"
491
+ style="margin: 4px;"
492
+ tabindex="0"
493
+ type="button"
521
494
  >
522
- <div
523
- class="MuiFormControl-root MuiTextField-root"
495
+ <span
496
+ class="MuiButton-label"
524
497
  >
525
- <div
526
- class="MuiInputBase-root MuiInput-root MuiInput-underline MuiInputBase-formControl MuiInput-formControl MuiInputBase-adornedEnd"
527
- >
528
- <input
529
- aria-invalid="false"
530
- class="MuiInputBase-input MuiInput-input MuiInputBase-inputAdornedEnd"
531
- placeholder="add new"
532
- type="text"
533
- value=""
534
- />
535
- <div
536
- class="MuiInputAdornment-root MuiInputAdornment-positionEnd"
537
- >
538
- <button
539
- class="MuiButtonBase-root MuiIconButton-root MuiIconButton-colorSecondary MuiIconButton-disabled MuiButtonBase-disabled"
540
- data-testid="stringArrayAdd-undefined"
541
- disabled=""
542
- tabindex="-1"
543
- type="button"
544
- >
545
- <span
546
- class="MuiIconButton-label"
547
- >
548
- <svg
549
- aria-hidden="true"
550
- class="MuiSvgIcon-root"
551
- focusable="false"
552
- viewBox="0 0 24 24"
553
- >
554
- <path
555
- d="M19 13h-6v6h-2v-6H5v-2h6V5h2v6h6v2z"
556
- />
557
- </svg>
558
- </span>
559
- </button>
560
- </div>
561
- </div>
562
- </div>
563
- </li>
498
+ Add item
499
+ </span>
500
+ <span
501
+ class="MuiTouchRipple-root"
502
+ />
503
+ </button>
564
504
  </ul>
565
505
  <p
566
506
  class="MuiFormHelperText-root"
@@ -5,13 +5,13 @@ import { ConfigurationSchema } from '@jbrowse/core/configuration'
5
5
  export { default as stateModelFactory } from './model'
6
6
  export const configSchema = ConfigurationSchema('ConfigurationEditorWidget', {})
7
7
  export const HeadingComponent = observer(({ model }) => {
8
- if (model && model.target) {
8
+ if (model?.target) {
9
9
  if (model.target.type) {
10
10
  return `${model.target.type} settings`
11
11
  }
12
12
  if (isStateTreeNode(model.target)) {
13
13
  const type = getType(model.target)
14
- if (type && type.name) {
14
+ if (type?.name) {
15
15
  return `${type.name.replace('ConfigurationSchema', '')} settings`
16
16
  }
17
17
  }