@jbrowse/plugin-config 1.6.7 → 1.7.0

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.
Files changed (29) hide show
  1. package/dist/ConfigurationEditorWidget/components/CallbackEditor.js +123 -0
  2. package/dist/ConfigurationEditorWidget/components/CodeEditor.js +77 -0
  3. package/dist/ConfigurationEditorWidget/components/ColorEditor.js +125 -0
  4. package/dist/ConfigurationEditorWidget/components/ColorEditor.test.js +31 -0
  5. package/dist/ConfigurationEditorWidget/components/ColorPicker.js +72 -0
  6. package/dist/ConfigurationEditorWidget/components/ConfigurationEditor.js +176 -0
  7. package/dist/ConfigurationEditorWidget/components/ConfigurationEditor.test.js +121 -0
  8. package/dist/ConfigurationEditorWidget/components/JsonEditor.js +82 -0
  9. package/dist/ConfigurationEditorWidget/components/SlotEditor.js +438 -0
  10. package/dist/ConfigurationEditorWidget/components/TypeSelector.js +48 -0
  11. package/dist/ConfigurationEditorWidget/index.js +45 -0
  12. package/dist/ConfigurationEditorWidget/model.js +28 -0
  13. package/dist/FromConfigAdapter/FromConfigAdapter.js +215 -0
  14. package/dist/FromConfigAdapter/FromConfigAdapter.test.js +100 -0
  15. package/dist/FromConfigAdapter/FromConfigRegionsAdapter.js +154 -0
  16. package/dist/FromConfigAdapter/FromConfigRegionsAdapter.test.js +200 -0
  17. package/dist/FromConfigAdapter/FromConfigSequenceAdapter.js +201 -0
  18. package/dist/FromConfigAdapter/FromConfigSequenceAdapter.test.js +110 -0
  19. package/dist/FromConfigAdapter/configSchema.js +51 -0
  20. package/dist/FromConfigAdapter/index.js +51 -0
  21. package/dist/RefNameAliasAdapter/RefNameAliasAdapter.js +125 -0
  22. package/dist/RefNameAliasAdapter/RefNameAliasAdapter.test.js +41 -0
  23. package/dist/RefNameAliasAdapter/configSchema.js +26 -0
  24. package/dist/RefNameAliasAdapter/index.js +23 -0
  25. package/dist/index.js +150 -6
  26. package/dist/index.test.js +41 -0
  27. package/package.json +3 -6
  28. package/src/ConfigurationEditorWidget/components/ConfigurationEditor.js +22 -17
  29. package/src/ConfigurationEditorWidget/components/JsonEditor.js +1 -2
@@ -0,0 +1,125 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = void 0;
9
+
10
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
+
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
14
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
15
+
16
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
17
+
18
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
19
+
20
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
21
+
22
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
23
+
24
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
25
+
26
+ var _BaseAdapter2 = require("@jbrowse/core/data_adapters/BaseAdapter");
27
+
28
+ var _io = require("@jbrowse/core/util/io");
29
+
30
+ var _configuration = require("@jbrowse/core/configuration");
31
+
32
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
33
+
34
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
35
+
36
+ var RefNameAliasAdapter = /*#__PURE__*/function (_BaseAdapter) {
37
+ (0, _inherits2["default"])(RefNameAliasAdapter, _BaseAdapter);
38
+
39
+ var _super = _createSuper(RefNameAliasAdapter);
40
+
41
+ function RefNameAliasAdapter() {
42
+ (0, _classCallCheck2["default"])(this, RefNameAliasAdapter);
43
+ return _super.apply(this, arguments);
44
+ }
45
+
46
+ (0, _createClass2["default"])(RefNameAliasAdapter, [{
47
+ key: "getRefNameAliases",
48
+ value: function () {
49
+ var _getRefNameAliases = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
50
+ var loc, results, refColumn;
51
+ return _regenerator["default"].wrap(function _callee$(_context) {
52
+ while (1) {
53
+ switch (_context.prev = _context.next) {
54
+ case 0:
55
+ loc = (0, _configuration.readConfObject)(this.config, 'location');
56
+
57
+ if (!(loc.uri === '' || loc.uri === '/path/to/my/aliases.txt')) {
58
+ _context.next = 3;
59
+ break;
60
+ }
61
+
62
+ return _context.abrupt("return", []);
63
+
64
+ case 3:
65
+ _context.next = 5;
66
+ return (0, _io.openLocation)(loc).readFile('utf8');
67
+
68
+ case 5:
69
+ results = _context.sent;
70
+ refColumn = (0, _configuration.readConfObject)(this.config, 'refNameColumn');
71
+ return _context.abrupt("return", results.trim().split('\n').filter(function (f) {
72
+ return !!f && !f.startsWith('#');
73
+ }).map(function (row) {
74
+ var aliases = row.split('\t');
75
+
76
+ var _aliases$splice = aliases.splice(refColumn, 1),
77
+ _aliases$splice2 = (0, _slicedToArray2["default"])(_aliases$splice, 1),
78
+ refName = _aliases$splice2[0];
79
+
80
+ return {
81
+ refName: refName,
82
+ aliases: aliases
83
+ };
84
+ }));
85
+
86
+ case 8:
87
+ case "end":
88
+ return _context.stop();
89
+ }
90
+ }
91
+ }, _callee, this);
92
+ }));
93
+
94
+ function getRefNameAliases() {
95
+ return _getRefNameAliases.apply(this, arguments);
96
+ }
97
+
98
+ return getRefNameAliases;
99
+ }()
100
+ }, {
101
+ key: "freeResources",
102
+ value: function () {
103
+ var _freeResources = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2() {
104
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
105
+ while (1) {
106
+ switch (_context2.prev = _context2.next) {
107
+ case 0:
108
+ case "end":
109
+ return _context2.stop();
110
+ }
111
+ }
112
+ }, _callee2);
113
+ }));
114
+
115
+ function freeResources() {
116
+ return _freeResources.apply(this, arguments);
117
+ }
118
+
119
+ return freeResources;
120
+ }()
121
+ }]);
122
+ return RefNameAliasAdapter;
123
+ }(_BaseAdapter2.BaseAdapter);
124
+
125
+ exports["default"] = RefNameAliasAdapter;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
6
+
7
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
8
+
9
+ var _RefNameAliasAdapter = _interopRequireDefault(require("./RefNameAliasAdapter"));
10
+
11
+ var _configSchema = _interopRequireDefault(require("./configSchema"));
12
+
13
+ test('adapter can fetch a simple alias file', /*#__PURE__*/(0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee() {
14
+ var adapter, result;
15
+ return _regenerator["default"].wrap(function _callee$(_context) {
16
+ while (1) {
17
+ switch (_context.prev = _context.next) {
18
+ case 0:
19
+ adapter = new _RefNameAliasAdapter["default"](_configSchema["default"].create({
20
+ location: {
21
+ localPath: require.resolve('./test_data/simple_alias.txt'),
22
+ locationType: 'LocalPathLocation'
23
+ }
24
+ }));
25
+ _context.next = 3;
26
+ return adapter.getRefNameAliases();
27
+
28
+ case 3:
29
+ result = _context.sent;
30
+ expect(result[0].refName).toBe('chr1');
31
+ expect(result[0].aliases).toEqual(['1', 'NC_000001.10']);
32
+ expect(result[1].refName).toBe('chr2');
33
+ expect(result[1].aliases).toEqual(['2', 'NC_000002.11']);
34
+
35
+ case 8:
36
+ case "end":
37
+ return _context.stop();
38
+ }
39
+ }
40
+ }, _callee);
41
+ })));
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = void 0;
7
+
8
+ var _configuration = require("@jbrowse/core/configuration");
9
+
10
+ var _default = (0, _configuration.ConfigurationSchema)('RefNameAliasAdapter', {
11
+ location: {
12
+ type: 'fileLocation',
13
+ defaultValue: {
14
+ uri: '/path/to/my/aliases.txt',
15
+ locationType: 'UriLocation'
16
+ }
17
+ },
18
+ refNameColumn: {
19
+ type: 'number',
20
+ defaultValue: 0
21
+ }
22
+ }, {
23
+ explicitlyTyped: true
24
+ });
25
+
26
+ exports["default"] = _default;
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ Object.defineProperty(exports, "AdapterClass", {
9
+ enumerable: true,
10
+ get: function get() {
11
+ return _RefNameAliasAdapter["default"];
12
+ }
13
+ });
14
+ Object.defineProperty(exports, "configSchema", {
15
+ enumerable: true,
16
+ get: function get() {
17
+ return _configSchema["default"];
18
+ }
19
+ });
20
+
21
+ var _RefNameAliasAdapter = _interopRequireDefault(require("./RefNameAliasAdapter"));
22
+
23
+ var _configSchema = _interopRequireDefault(require("./configSchema"));
package/dist/index.js CHANGED
@@ -1,8 +1,152 @@
1
+ "use strict";
1
2
 
2
- 'use strict'
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
3
4
 
4
- if (process.env.NODE_ENV === 'production') {
5
- module.exports = require('./plugin-config.cjs.production.min.js')
6
- } else {
7
- module.exports = require('./plugin-config.cjs.development.js')
8
- }
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.ConfigurationEditor = void 0;
9
+ Object.defineProperty(exports, "JsonEditor", {
10
+ enumerable: true,
11
+ get: function get() {
12
+ return _JsonEditor["default"];
13
+ }
14
+ });
15
+ exports["default"] = void 0;
16
+
17
+ var _typeof2 = _interopRequireDefault(require("@babel/runtime/helpers/typeof"));
18
+
19
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
20
+
21
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
22
+
23
+ var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime/helpers/assertThisInitialized"));
24
+
25
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
26
+
27
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
28
+
29
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
30
+
31
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
32
+
33
+ var _react = require("react");
34
+
35
+ var _AdapterType = _interopRequireDefault(require("@jbrowse/core/pluggableElementTypes/AdapterType"));
36
+
37
+ var _WidgetType = _interopRequireDefault(require("@jbrowse/core/pluggableElementTypes/WidgetType"));
38
+
39
+ var _Plugin2 = _interopRequireDefault(require("@jbrowse/core/Plugin"));
40
+
41
+ var _ConfigurationEditorWidget = require("./ConfigurationEditorWidget");
42
+
43
+ var _FromConfigAdapter = require("./FromConfigAdapter");
44
+
45
+ var _RefNameAliasAdapter = require("./RefNameAliasAdapter");
46
+
47
+ var _JsonEditor = _interopRequireDefault(require("./ConfigurationEditorWidget/components/JsonEditor"));
48
+
49
+ function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2["default"])(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2["default"])(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2["default"])(this, result); }; }
50
+
51
+ function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
52
+
53
+ 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); }
54
+
55
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || (0, _typeof2["default"])(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; }
56
+
57
+ var ConfigurationEditorComponent = /*#__PURE__*/(0, _react.lazy)(function () {
58
+ return Promise.resolve().then(function () {
59
+ return _interopRequireWildcard(require('./ConfigurationEditorWidget/components/ConfigurationEditor'));
60
+ });
61
+ });
62
+ exports.ConfigurationEditor = ConfigurationEditorComponent;
63
+
64
+ var _default = /*#__PURE__*/function (_Plugin) {
65
+ (0, _inherits2["default"])(_default, _Plugin);
66
+
67
+ var _super = _createSuper(_default);
68
+
69
+ function _default() {
70
+ var _this;
71
+
72
+ (0, _classCallCheck2["default"])(this, _default);
73
+
74
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
75
+ args[_key] = arguments[_key];
76
+ }
77
+
78
+ _this = _super.call.apply(_super, [this].concat(args));
79
+ (0, _defineProperty2["default"])((0, _assertThisInitialized2["default"])(_this), "name", 'ConfigurationPlugin');
80
+ return _this;
81
+ }
82
+
83
+ (0, _createClass2["default"])(_default, [{
84
+ key: "install",
85
+ value: function install(pluginManager) {
86
+ pluginManager.addAdapterType(function () {
87
+ return new _AdapterType["default"]({
88
+ name: 'FromConfigAdapter',
89
+ configSchema: _FromConfigAdapter.configSchema,
90
+ AdapterClass: _FromConfigAdapter.AdapterClass,
91
+ adapterMetadata: {
92
+ category: null,
93
+ hiddenFromGUI: true,
94
+ displayName: null,
95
+ description: null
96
+ }
97
+ });
98
+ });
99
+ pluginManager.addAdapterType(function () {
100
+ return new _AdapterType["default"]({
101
+ name: 'FromConfigRegionsAdapter',
102
+ configSchema: _FromConfigAdapter.regionsConfigSchema,
103
+ AdapterClass: _FromConfigAdapter.RegionsAdapterClass,
104
+ adapterMetadata: {
105
+ category: null,
106
+ hiddenFromGUI: true,
107
+ displayName: null,
108
+ description: null
109
+ }
110
+ });
111
+ });
112
+ pluginManager.addAdapterType(function () {
113
+ return new _AdapterType["default"]({
114
+ name: 'FromConfigSequenceAdapter',
115
+ configSchema: _FromConfigAdapter.sequenceConfigSchema,
116
+ AdapterClass: _FromConfigAdapter.SequenceAdapterClass,
117
+ adapterMetadata: {
118
+ category: null,
119
+ hiddenFromGUI: true,
120
+ displayName: null,
121
+ description: null
122
+ }
123
+ });
124
+ });
125
+ pluginManager.addAdapterType(function () {
126
+ return new _AdapterType["default"]({
127
+ name: 'RefNameAliasAdapter',
128
+ configSchema: _RefNameAliasAdapter.configSchema,
129
+ AdapterClass: _RefNameAliasAdapter.AdapterClass,
130
+ adapterMetadata: {
131
+ category: null,
132
+ hiddenFromGUI: true,
133
+ displayName: null,
134
+ description: null
135
+ }
136
+ });
137
+ });
138
+ pluginManager.addWidgetType(function () {
139
+ return new _WidgetType["default"]({
140
+ name: 'ConfigurationEditorWidget',
141
+ HeadingComponent: _ConfigurationEditorWidget.HeadingComponent,
142
+ configSchema: _ConfigurationEditorWidget.configSchema,
143
+ stateModel: (0, _ConfigurationEditorWidget.stateModelFactory)(pluginManager),
144
+ ReactComponent: ConfigurationEditorComponent
145
+ });
146
+ });
147
+ }
148
+ }]);
149
+ return _default;
150
+ }(_Plugin2["default"]);
151
+
152
+ exports["default"] = _default;
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _PluginManager = _interopRequireDefault(require("@jbrowse/core/PluginManager"));
6
+
7
+ var _mobxStateTree = require("mobx-state-tree");
8
+
9
+ var _ = _interopRequireDefault(require("."));
10
+
11
+ describe('Config editing', function () {
12
+ var pluginManager;
13
+ beforeAll(function () {
14
+ var originalConsoleWarn = console.warn;
15
+ console.warn = jest.fn();
16
+ pluginManager = new _PluginManager["default"]([new _["default"]()]);
17
+ pluginManager.createPluggableElements();
18
+ pluginManager.configure();
19
+ console.warn = originalConsoleWarn;
20
+ });
21
+ it("won't add if already added", function () {
22
+ expect(function () {
23
+ return pluginManager.addPlugin(new _["default"]());
24
+ }).toThrow(/JBrowse already configured, cannot add plugins/);
25
+ });
26
+ it('adds config editor widget', function () {
27
+ var ConfigurationEditorWidget = pluginManager.getWidgetType('ConfigurationEditorWidget');
28
+ var config = ConfigurationEditorWidget.configSchema.create({
29
+ type: 'ConfigurationEditorWidget'
30
+ });
31
+ expect((0, _mobxStateTree.getSnapshot)(config)).toMatchSnapshot();
32
+ });
33
+ it('creates proper FromConfigAdapter', function () {
34
+ var adapter = pluginManager.getAdapterType('FromConfigAdapter');
35
+ var config = adapter.configSchema.create({
36
+ type: 'FromConfigAdapter',
37
+ adapterId: 'testFromConfigAdapterId'
38
+ });
39
+ expect((0, _mobxStateTree.getSnapshot)(config)).toMatchSnapshot();
40
+ });
41
+ });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jbrowse/plugin-config",
3
- "version": "1.6.7",
3
+ "version": "1.7.0",
4
4
  "description": "JBrowse 2 config utilities",
5
5
  "keywords": [
6
6
  "jbrowse",
@@ -18,15 +18,12 @@
18
18
  "distMain": "dist/index.js",
19
19
  "srcMain": "src/index.ts",
20
20
  "main": "dist/index.js",
21
- "distModule": "dist/plugin-config.esm.js",
22
- "module": "dist/plugin-config.esm.js",
23
21
  "files": [
24
22
  "dist",
25
23
  "src"
26
24
  ],
27
25
  "scripts": {
28
- "start": "tsdx watch --verbose --noClean",
29
- "build": "tsdx build",
26
+ "build": "babel src --root-mode upward --out-dir dist --extensions .ts,.js,.tsx,.jsx",
30
27
  "test": "cd ../..; jest plugins/config",
31
28
  "prepublishOnly": "yarn test",
32
29
  "prepack": "yarn build; yarn useDist",
@@ -55,5 +52,5 @@
55
52
  "publishConfig": {
56
53
  "access": "public"
57
54
  },
58
- "gitHead": "02012ec299c36647f755316571775d36b0fee5ec"
55
+ "gitHead": "cc13844074d11881d211342a6a7eea113561b70b"
59
56
  }
@@ -125,24 +125,29 @@ const ConfigurationEditor = observer(({ model }) => {
125
125
  const key = model.target && readConfObject(model.target, 'trackId')
126
126
  const name = model.target && readConfObject(model.target, 'name')
127
127
  return (
128
- <Accordion
129
- key={key}
130
- defaultExpanded
131
- className={classes.accordion}
132
- TransitionProps={{ unmountOnExit: true, timeout: 150 }}
133
- >
134
- <AccordionSummary
135
- expandIcon={<ExpandMoreIcon className={classes.expandIcon} />}
136
- >
137
- <Typography>{name ? name : 'Configuration'}</Typography>
138
- </AccordionSummary>
139
- <AccordionDetails
140
- className={classes.expansionPanelDetails}
141
- data-testid="configEditor"
128
+ <>
129
+ <Accordion
130
+ key={key}
131
+ defaultExpanded
132
+ className={classes.accordion}
133
+ TransitionProps={{ unmountOnExit: true, timeout: 150 }}
142
134
  >
143
- {!model.target ? 'no target set' : <Schema schema={model.target} />}
144
- </AccordionDetails>
145
- </Accordion>
135
+ <AccordionSummary
136
+ expandIcon={<ExpandMoreIcon className={classes.expandIcon} />}
137
+ >
138
+ <Typography>{name ? name : 'Configuration'}</Typography>
139
+ </AccordionSummary>
140
+ <AccordionDetails
141
+ className={classes.expansionPanelDetails}
142
+ data-testid="configEditor"
143
+ >
144
+ {!model.target ? 'no target set' : <Schema schema={model.target} />}
145
+ </AccordionDetails>
146
+ </Accordion>
147
+
148
+ {/* blank space at the bottom of screen allows scroll */}
149
+ <div style={{ height: 300 }} />
150
+ </>
146
151
  )
147
152
  })
148
153
 
@@ -31,8 +31,7 @@ function JsonEditor({ slot }) {
31
31
  } catch (e) {
32
32
  setError(e.message)
33
33
  }
34
- // eslint-disable-next-line react-hooks/exhaustive-deps
35
- }, [debouncedJson])
34
+ }, [debouncedJson, slot])
36
35
 
37
36
  return (
38
37
  <>