config-editor-base 3.1.3 → 3.2.1
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.
- package/dist/index.js +180 -27
- package/dist/index.js.map +1 -1
- package/dist/index.modern.js +178 -27
- package/dist/index.modern.js.map +1 -1
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -5,7 +5,8 @@ var reactRedux = require('react-redux');
|
|
|
5
5
|
var classNames = _interopDefault(require('classnames'));
|
|
6
6
|
var validator = _interopDefault(require('@rjsf/validator-ajv6'));
|
|
7
7
|
var Form = _interopDefault(require('@rjsf/core'));
|
|
8
|
-
var saveAs =
|
|
8
|
+
var saveAs = require('file-saver');
|
|
9
|
+
var saveAs__default = _interopDefault(saveAs);
|
|
9
10
|
var Select = _interopDefault(require('react-select'));
|
|
10
11
|
var Files = _interopDefault(require('react-files'));
|
|
11
12
|
var applyNav = require('rjsf-tabs');
|
|
@@ -150,7 +151,7 @@ var loadFile = function loadFile(fileName) {
|
|
|
150
151
|
var _require = require('detect-browser'),
|
|
151
152
|
detect = _require.detect;
|
|
152
153
|
var browser = detect();
|
|
153
|
-
var crcBrowserSupport = ['chrome', 'firefox', 'opera', 'safari', 'edge'].includes(browser.name);
|
|
154
|
+
var crcBrowserSupport = ['chrome', 'firefox', 'opera', 'safari', 'edge'].includes(browser && browser.name);
|
|
154
155
|
|
|
155
156
|
var SET_SCHEMA_LIST = "editor/SET_SCHEMA_LIST";
|
|
156
157
|
var SET_CONFIG_LIST = "editor/SET_CONFIG_LIST";
|
|
@@ -1294,6 +1295,19 @@ var runConfigurationWarningChecks = function runConfigurationWarningChecks(conte
|
|
|
1294
1295
|
dispatch(checkCANmodMonitoringMode(content));
|
|
1295
1296
|
};
|
|
1296
1297
|
};
|
|
1298
|
+
var collectConfigurationWarnings = function collectConfigurationWarnings(content) {
|
|
1299
|
+
var messages = [];
|
|
1300
|
+
var _capture = function capture(action) {
|
|
1301
|
+
if (typeof action === "function") return action(_capture, function () {
|
|
1302
|
+
return {};
|
|
1303
|
+
});
|
|
1304
|
+
if (action && action.type === "alert/SET" && action.alert && action.alert.type === "warning") {
|
|
1305
|
+
messages.push(action.alert.message);
|
|
1306
|
+
}
|
|
1307
|
+
};
|
|
1308
|
+
_capture(runConfigurationWarningChecks(content));
|
|
1309
|
+
return messages;
|
|
1310
|
+
};
|
|
1297
1311
|
var checkCANmodMonitoringMode = function checkCANmodMonitoringMode(content) {
|
|
1298
1312
|
return function (dispatch) {
|
|
1299
1313
|
var _content$phy, _content$phy$can, _content$phy$can$phy;
|
|
@@ -1314,7 +1328,7 @@ var saveUpdatedConfiguration = function saveUpdatedConfiguration(filename, conte
|
|
|
1314
1328
|
var blob = new Blob([JSON.stringify(content, null, 2)], {
|
|
1315
1329
|
type: "text/json"
|
|
1316
1330
|
});
|
|
1317
|
-
|
|
1331
|
+
saveAs__default(blob, "" + filename);
|
|
1318
1332
|
};
|
|
1319
1333
|
};
|
|
1320
1334
|
var setUpdatedFormData = function setUpdatedFormData(formData) {
|
|
@@ -1433,6 +1447,7 @@ var actions = {
|
|
|
1433
1447
|
checkFileSplitValue: checkFileSplitValue,
|
|
1434
1448
|
checkGNSSEstimate: checkGNSSEstimate,
|
|
1435
1449
|
runConfigurationWarningChecks: runConfigurationWarningChecks,
|
|
1450
|
+
collectConfigurationWarnings: collectConfigurationWarnings,
|
|
1436
1451
|
checkCANmodMonitoringMode: checkCANmodMonitoringMode,
|
|
1437
1452
|
saveUpdatedConfiguration: saveUpdatedConfiguration,
|
|
1438
1453
|
setUpdatedFormData: setUpdatedFormData,
|
|
@@ -18938,11 +18953,9 @@ var PartialConfigLoader = /*#__PURE__*/function (_React$Component) {
|
|
|
18938
18953
|
var _this$props = this.props,
|
|
18939
18954
|
formData = _this$props.formData,
|
|
18940
18955
|
schemaContent = _this$props.schemaContent;
|
|
18941
|
-
return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h4", null, "Partial config loader"), /*#__PURE__*/React.createElement("
|
|
18956
|
+
return /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("h4", null, "Partial config loader"), /*#__PURE__*/React.createElement("div", null, /*#__PURE__*/React.createElement("div", {
|
|
18942
18957
|
className: "form-group pl0 field-string"
|
|
18943
18958
|
}, /*#__PURE__*/React.createElement("p", {
|
|
18944
|
-
className: "reduced-margin"
|
|
18945
|
-
}, "Upload partial Configuration File"), /*#__PURE__*/React.createElement("p", {
|
|
18946
18959
|
className: "field-description field-description-shift"
|
|
18947
18960
|
}, "Select a JSON file containing a partial Configuration File. This lets you e.g. load a list of transmit messages or filters. The loaded JSON is validated vs. the Rule Schema, after which it can be merged into the editor Configuration File (even if it is not valid)")), /*#__PURE__*/React.createElement("div", null, formData ? /*#__PURE__*/React.createElement("div", {
|
|
18948
18961
|
className: "text-area-wrapper row no-gutters reduced-margin"
|
|
@@ -18961,10 +18974,13 @@ var PartialConfigLoader = /*#__PURE__*/function (_React$Component) {
|
|
|
18961
18974
|
minFileSize: 0,
|
|
18962
18975
|
clickable: true
|
|
18963
18976
|
}, /*#__PURE__*/React.createElement("button", {
|
|
18964
|
-
className: "btn btn-primary"
|
|
18977
|
+
className: "btn btn-primary",
|
|
18978
|
+
title: "Upload a partial Configuration File to merge it"
|
|
18965
18979
|
}, "Load JSON file"), /*#__PURE__*/React.createElement("div", {
|
|
18966
18980
|
className: "browse-file-name"
|
|
18967
|
-
}, jsonFileName))), Object.keys(jsonFile).length ? /*#__PURE__*/React.createElement("div",
|
|
18981
|
+
}, jsonFileName))), Object.keys(jsonFile).length ? /*#__PURE__*/React.createElement("div", {
|
|
18982
|
+
className: "text-area-wrapper row no-gutters"
|
|
18983
|
+
}, /*#__PURE__*/React.createElement("pre", {
|
|
18968
18984
|
className: "browse-file-preview"
|
|
18969
18985
|
}, JSON.stringify(jsonFile, null, 2)), formData ? /*#__PURE__*/React.createElement("div", null, mergedConfigValid ? /*#__PURE__*/React.createElement("div", {
|
|
18970
18986
|
className: "btn-highlight",
|
|
@@ -19159,6 +19175,57 @@ function ArrayFieldTemplate(props) {
|
|
|
19159
19175
|
}), " "))));
|
|
19160
19176
|
}
|
|
19161
19177
|
|
|
19178
|
+
var isPlainObject = function isPlainObject(value) {
|
|
19179
|
+
return value !== null && typeof value === 'object' && !Array.isArray(value);
|
|
19180
|
+
};
|
|
19181
|
+
var jsonEqual = function jsonEqual(a, b) {
|
|
19182
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
19183
|
+
};
|
|
19184
|
+
var clone = function clone(value) {
|
|
19185
|
+
return JSON.parse(JSON.stringify(value));
|
|
19186
|
+
};
|
|
19187
|
+
var computeConfigDelta = function computeConfigDelta(past, current) {
|
|
19188
|
+
var deletions = [];
|
|
19189
|
+
if (!isPlainObject(past) || !isPlainObject(current)) {
|
|
19190
|
+
return {
|
|
19191
|
+
partial: isPlainObject(current) ? clone(current) : {},
|
|
19192
|
+
deletions: deletions
|
|
19193
|
+
};
|
|
19194
|
+
}
|
|
19195
|
+
var _walk = function walk(pastNode, currentNode, path) {
|
|
19196
|
+
var partialNode = {};
|
|
19197
|
+
Object.keys(currentNode).forEach(function (key) {
|
|
19198
|
+
var childPath = path ? path + '.' + key : key;
|
|
19199
|
+
var pastValue = pastNode[key];
|
|
19200
|
+
var currentValue = currentNode[key];
|
|
19201
|
+
if (!(key in pastNode)) {
|
|
19202
|
+
partialNode[key] = clone(currentValue);
|
|
19203
|
+
} else if (isPlainObject(pastValue) && isPlainObject(currentValue)) {
|
|
19204
|
+
var childPartial = _walk(pastValue, currentValue, childPath);
|
|
19205
|
+
if (Object.keys(childPartial).length) {
|
|
19206
|
+
partialNode[key] = childPartial;
|
|
19207
|
+
}
|
|
19208
|
+
} else if (!jsonEqual(pastValue, currentValue)) {
|
|
19209
|
+
if (Array.isArray(pastValue) && isPlainObject(currentValue)) {
|
|
19210
|
+
deletions.push(childPath);
|
|
19211
|
+
} else {
|
|
19212
|
+
partialNode[key] = clone(currentValue);
|
|
19213
|
+
}
|
|
19214
|
+
}
|
|
19215
|
+
});
|
|
19216
|
+
Object.keys(pastNode).forEach(function (key) {
|
|
19217
|
+
if (!(key in currentNode)) {
|
|
19218
|
+
deletions.push(path ? path + '.' + key : key);
|
|
19219
|
+
}
|
|
19220
|
+
});
|
|
19221
|
+
return partialNode;
|
|
19222
|
+
};
|
|
19223
|
+
return {
|
|
19224
|
+
partial: _walk(past, current, ''),
|
|
19225
|
+
deletions: deletions
|
|
19226
|
+
};
|
|
19227
|
+
};
|
|
19228
|
+
|
|
19162
19229
|
var selectOptions$1 = function selectOptions(Files) {
|
|
19163
19230
|
Files = lodash.orderBy(Files, ["name"], ["desc"]);
|
|
19164
19231
|
return [].concat(Files, [{
|
|
@@ -19174,7 +19241,7 @@ var pastCrc32 = "N/A";
|
|
|
19174
19241
|
var _require$1 = require("detect-browser"),
|
|
19175
19242
|
detect$1 = _require$1.detect;
|
|
19176
19243
|
var browser$1 = detect$1();
|
|
19177
|
-
var crcBrowserSupport$1 = ["chrome", "firefox", "opera", "safari", "edge"].includes(browser$1.name);
|
|
19244
|
+
var crcBrowserSupport$1 = ["chrome", "firefox", "opera", "safari", "edge"].includes(browser$1 && browser$1.name);
|
|
19178
19245
|
var EditorChangesComparison = /*#__PURE__*/function (_React$Component) {
|
|
19179
19246
|
function EditorChangesComparison(props) {
|
|
19180
19247
|
var _this;
|
|
@@ -19187,6 +19254,68 @@ var EditorChangesComparison = /*#__PURE__*/function (_React$Component) {
|
|
|
19187
19254
|
_this.handleSelectChange = function (selectedValue) {
|
|
19188
19255
|
_this.props.handleDropdownChange(selectedValue.value, "Previous Configuration File");
|
|
19189
19256
|
};
|
|
19257
|
+
_this.getPartialDelta = function () {
|
|
19258
|
+
var _this$props = _this.props,
|
|
19259
|
+
past = _this$props.past,
|
|
19260
|
+
current = _this$props.current,
|
|
19261
|
+
showAlert = _this$props.showAlert;
|
|
19262
|
+
var pastObj = null;
|
|
19263
|
+
try {
|
|
19264
|
+
pastObj = JSON.parse(past);
|
|
19265
|
+
} catch (e) {
|
|
19266
|
+
pastObj = null;
|
|
19267
|
+
}
|
|
19268
|
+
if (!pastObj || typeof pastObj !== "object") {
|
|
19269
|
+
if (showAlert) {
|
|
19270
|
+
showAlert("info", "Select a Previous Configuration File first");
|
|
19271
|
+
}
|
|
19272
|
+
return null;
|
|
19273
|
+
}
|
|
19274
|
+
var _computeConfigDelta = computeConfigDelta(pastObj, current),
|
|
19275
|
+
partial = _computeConfigDelta.partial,
|
|
19276
|
+
deletions = _computeConfigDelta.deletions;
|
|
19277
|
+
if (!Object.keys(partial).length) {
|
|
19278
|
+
if (showAlert) {
|
|
19279
|
+
showAlert("info", "No changes detected vs. the Previous Configuration File");
|
|
19280
|
+
}
|
|
19281
|
+
return null;
|
|
19282
|
+
}
|
|
19283
|
+
if (deletions.length && showAlert) {
|
|
19284
|
+
showAlert("warning", deletions.length + " deleted setting(s) cannot be expressed in a partial config and were excluded: " + deletions.join(", "));
|
|
19285
|
+
}
|
|
19286
|
+
return {
|
|
19287
|
+
partial: partial,
|
|
19288
|
+
deletions: deletions
|
|
19289
|
+
};
|
|
19290
|
+
};
|
|
19291
|
+
_this.onDownloadPartial = function () {
|
|
19292
|
+
var delta = _this.getPartialDelta();
|
|
19293
|
+
if (!delta) {
|
|
19294
|
+
return;
|
|
19295
|
+
}
|
|
19296
|
+
var revisedConfigFile = _this.props.revisedConfigFile;
|
|
19297
|
+
var fileName = "partial-" + (revisedConfigFile && revisedConfigFile.value || "config.json");
|
|
19298
|
+
var blob = new Blob([JSON.stringify(delta.partial, null, 2)], {
|
|
19299
|
+
type: "text/json"
|
|
19300
|
+
});
|
|
19301
|
+
saveAs.saveAs(blob, fileName);
|
|
19302
|
+
};
|
|
19303
|
+
_this.onTransferClick = function () {
|
|
19304
|
+
var delta = _this.getPartialDelta();
|
|
19305
|
+
if (!delta) {
|
|
19306
|
+
return;
|
|
19307
|
+
}
|
|
19308
|
+
var _this$props2 = _this.props,
|
|
19309
|
+
onTransferPartial = _this$props2.onTransferPartial,
|
|
19310
|
+
closeChangesModal = _this$props2.closeChangesModal,
|
|
19311
|
+
revisedConfigFile = _this$props2.revisedConfigFile;
|
|
19312
|
+
closeChangesModal();
|
|
19313
|
+
onTransferPartial({
|
|
19314
|
+
partial: delta.partial,
|
|
19315
|
+
deletions: delta.deletions,
|
|
19316
|
+
configName: revisedConfigFile && revisedConfigFile.value || null
|
|
19317
|
+
});
|
|
19318
|
+
};
|
|
19190
19319
|
_this.toggleCheckbox = _this.toggleCheckbox.bind(_this);
|
|
19191
19320
|
_this.handleSelectChange = _this.handleSelectChange.bind(_this);
|
|
19192
19321
|
_this.state = {
|
|
@@ -19197,17 +19326,17 @@ var EditorChangesComparison = /*#__PURE__*/function (_React$Component) {
|
|
|
19197
19326
|
_inheritsLoose(EditorChangesComparison, _React$Component);
|
|
19198
19327
|
var _proto = EditorChangesComparison.prototype;
|
|
19199
19328
|
_proto.render = function render() {
|
|
19200
|
-
var _this$
|
|
19201
|
-
options = _this$
|
|
19202
|
-
selected = _this$
|
|
19203
|
-
past = _this$
|
|
19204
|
-
current = _this$
|
|
19205
|
-
closeChangesModal = _this$
|
|
19206
|
-
revisedConfigFile = _this$
|
|
19207
|
-
crc32EditorLive = _this$
|
|
19208
|
-
isCompareChanges = _this$
|
|
19209
|
-
enableDownload = _this$
|
|
19210
|
-
externalSubmit = _this$
|
|
19329
|
+
var _this$props3 = this.props,
|
|
19330
|
+
options = _this$props3.options,
|
|
19331
|
+
selected = _this$props3.selected,
|
|
19332
|
+
past = _this$props3.past,
|
|
19333
|
+
current = _this$props3.current,
|
|
19334
|
+
closeChangesModal = _this$props3.closeChangesModal,
|
|
19335
|
+
revisedConfigFile = _this$props3.revisedConfigFile,
|
|
19336
|
+
crc32EditorLive = _this$props3.crc32EditorLive,
|
|
19337
|
+
isCompareChanges = _this$props3.isCompareChanges,
|
|
19338
|
+
enableDownload = _this$props3.enableDownload,
|
|
19339
|
+
externalSubmit = _this$props3.externalSubmit;
|
|
19211
19340
|
var pastCleaned = past && Object.keys(past).length ? JSON.stringify(JSON.parse(past), null, 2) : "";
|
|
19212
19341
|
if (crcBrowserSupport$1 == 1 && past && Object.keys(past).length) {
|
|
19213
19342
|
var _require2 = require("crc"),
|
|
@@ -19216,6 +19345,15 @@ var EditorChangesComparison = /*#__PURE__*/function (_React$Component) {
|
|
|
19216
19345
|
} else {
|
|
19217
19346
|
pastCrc32 = "N/A";
|
|
19218
19347
|
}
|
|
19348
|
+
var partialAvailable = false;
|
|
19349
|
+
try {
|
|
19350
|
+
var pastObj = past ? JSON.parse(past) : null;
|
|
19351
|
+
if (pastObj && typeof pastObj === "object") {
|
|
19352
|
+
partialAvailable = Object.keys(computeConfigDelta(pastObj, current).partial).length > 0;
|
|
19353
|
+
}
|
|
19354
|
+
} catch (e) {
|
|
19355
|
+
partialAvailable = false;
|
|
19356
|
+
}
|
|
19219
19357
|
return /*#__PURE__*/React.createElement("div", {
|
|
19220
19358
|
className: isCompareChanges ? "show modal-custom-wrapper" : "hidden modal-custom-wrapper"
|
|
19221
19359
|
}, /*#__PURE__*/React.createElement("div", {
|
|
@@ -19292,7 +19430,19 @@ var EditorChangesComparison = /*#__PURE__*/function (_React$Component) {
|
|
|
19292
19430
|
type: "submit",
|
|
19293
19431
|
onClick: enableDownload,
|
|
19294
19432
|
className: "btn btn-primary ml15"
|
|
19295
|
-
}, " ", "Download to disk", " ")
|
|
19433
|
+
}, " ", "Download to disk", " "), /*#__PURE__*/React.createElement("button", {
|
|
19434
|
+
type: "button",
|
|
19435
|
+
onClick: this.onDownloadPartial,
|
|
19436
|
+
className: "btn btn-white ml15",
|
|
19437
|
+
disabled: !partialAvailable,
|
|
19438
|
+
title: "Download the delta changes as a partial config JSON e.g. for application across multiple devices"
|
|
19439
|
+
}, " ", "Download partial JSON to disk", " "), typeof this.props.onTransferPartial === "function" ? /*#__PURE__*/React.createElement("button", {
|
|
19440
|
+
type: "button",
|
|
19441
|
+
onClick: this.onTransferClick,
|
|
19442
|
+
className: "btn btn-white ml15",
|
|
19443
|
+
disabled: !partialAvailable,
|
|
19444
|
+
title: "Transfer the delta changes as a partial config JSON to the OTA batch manager for application across multiple devices"
|
|
19445
|
+
}, " ", "Transfer to OTA batch manager", " ") : null)));
|
|
19296
19446
|
};
|
|
19297
19447
|
return EditorChangesComparison;
|
|
19298
19448
|
}(React.Component);
|
|
@@ -19627,7 +19777,9 @@ var EditorSection = /*#__PURE__*/function (_React$Component) {
|
|
|
19627
19777
|
handleDropdownChange: this.handleDropdownChange,
|
|
19628
19778
|
closeChangesModal: this.closeChangesModal,
|
|
19629
19779
|
enableDownload: this.enableDownload.bind(this),
|
|
19630
|
-
externalSubmit: this.props.fetchFileContentExt ? true : false
|
|
19780
|
+
externalSubmit: this.props.fetchFileContentExt ? true : false,
|
|
19781
|
+
showAlert: this.props.showAlert,
|
|
19782
|
+
onTransferPartial: this.props.onTransferPartial
|
|
19631
19783
|
}), /*#__PURE__*/React.createElement("div", {
|
|
19632
19784
|
className: classNames({
|
|
19633
19785
|
'config-bar': true,
|
|
@@ -24917,7 +25069,7 @@ var FilterBuilderTool = /*#__PURE__*/function (_React$Component) {
|
|
|
24917
25069
|
style: {
|
|
24918
25070
|
width: barWidth + "px",
|
|
24919
25071
|
height: "10px",
|
|
24920
|
-
backgroundColor: "#
|
|
25072
|
+
backgroundColor: "#46a5e0",
|
|
24921
25073
|
borderRadius: "2px",
|
|
24922
25074
|
display: "inline-block"
|
|
24923
25075
|
}
|
|
@@ -25383,7 +25535,7 @@ var FilterBuilderTool = /*#__PURE__*/function (_React$Component) {
|
|
|
25383
25535
|
}
|
|
25384
25536
|
}, "Select: "), /*#__PURE__*/React.createElement("span", {
|
|
25385
25537
|
style: {
|
|
25386
|
-
color: "#
|
|
25538
|
+
color: "#46a5e0",
|
|
25387
25539
|
cursor: "pointer",
|
|
25388
25540
|
marginLeft: "4px"
|
|
25389
25541
|
},
|
|
@@ -25397,7 +25549,7 @@ var FilterBuilderTool = /*#__PURE__*/function (_React$Component) {
|
|
|
25397
25549
|
}
|
|
25398
25550
|
}, "|"), /*#__PURE__*/React.createElement("span", {
|
|
25399
25551
|
style: {
|
|
25400
|
-
color: "#
|
|
25552
|
+
color: "#46a5e0",
|
|
25401
25553
|
cursor: "pointer"
|
|
25402
25554
|
},
|
|
25403
25555
|
onClick: function onClick() {
|
|
@@ -25410,7 +25562,7 @@ var FilterBuilderTool = /*#__PURE__*/function (_React$Component) {
|
|
|
25410
25562
|
}
|
|
25411
25563
|
}, "|"), /*#__PURE__*/React.createElement("span", {
|
|
25412
25564
|
style: {
|
|
25413
|
-
color: "#
|
|
25565
|
+
color: "#46a5e0",
|
|
25414
25566
|
cursor: "pointer"
|
|
25415
25567
|
},
|
|
25416
25568
|
onClick: function onClick() {
|
|
@@ -25423,7 +25575,7 @@ var FilterBuilderTool = /*#__PURE__*/function (_React$Component) {
|
|
|
25423
25575
|
}
|
|
25424
25576
|
}, "|"), /*#__PURE__*/React.createElement("span", {
|
|
25425
25577
|
style: {
|
|
25426
|
-
color: "#
|
|
25578
|
+
color: "#46a5e0",
|
|
25427
25579
|
cursor: "pointer"
|
|
25428
25580
|
},
|
|
25429
25581
|
onClick: function onClick() {
|
|
@@ -25751,6 +25903,7 @@ var FilterBuilderTool$1 = reactRedux.connect(mapStateToProps$4, mapDispatchToPro
|
|
|
25751
25903
|
exports.EditorSection = EditorSection$1;
|
|
25752
25904
|
exports.FilterBuilderTool = FilterBuilderTool$1;
|
|
25753
25905
|
exports.OBDTool = OBDTool$1;
|
|
25906
|
+
exports.computeConfigDelta = computeConfigDelta;
|
|
25754
25907
|
exports.editor = reducer;
|
|
25755
25908
|
exports.editorActions = actions;
|
|
25756
25909
|
//# sourceMappingURL=index.js.map
|