@configura/debug-react 2.0.0-alpha.20 → 2.0.0-alpha.21

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 (56) hide show
  1. package/.eslintrc.json +5 -18
  2. package/.postcssrc.json +8 -8
  3. package/LICENSE +201 -201
  4. package/dist/LogMessageView.d.ts +5 -5
  5. package/dist/LogMessageView.js +8 -8
  6. package/dist/LogMessagesView.d.ts +5 -5
  7. package/dist/LogMessagesView.js +10 -10
  8. package/dist/TextualConfigurationView.d.ts +7 -7
  9. package/dist/TextualConfigurationView.js +58 -58
  10. package/dist/css/debug.css +1 -1
  11. package/dist/css/debug.css.map +1 -1
  12. package/dist/exerciser/Exerciser.d.ts +37 -37
  13. package/dist/exerciser/Exerciser.js +155 -155
  14. package/dist/exerciser/ExerciserReportFilterView.d.ts +9 -9
  15. package/dist/exerciser/ExerciserReportFilterView.js +205 -205
  16. package/dist/exerciser/ExerciserReportItem.d.ts +10 -10
  17. package/dist/exerciser/ExerciserReportItem.js +1 -1
  18. package/dist/exerciser/ExerciserReportItemView.d.ts +6 -5
  19. package/dist/exerciser/ExerciserReportItemView.js +53 -53
  20. package/dist/exerciser/ExerciserReportView.d.ts +7 -7
  21. package/dist/exerciser/ExerciserReportView.js +8 -8
  22. package/dist/exerciser/ExerciserRun.d.ts +19 -19
  23. package/dist/exerciser/ExerciserRun.js +158 -144
  24. package/dist/exerciser/ExerciserSetup.d.ts +15 -15
  25. package/dist/exerciser/ExerciserSetup.js +54 -54
  26. package/dist/exerciser/FilterSelect.d.ts +8 -8
  27. package/dist/exerciser/FilterSelect.js +40 -40
  28. package/dist/hooks.d.ts +2 -2
  29. package/dist/hooks.js +7 -7
  30. package/dist/index.d.ts +12 -12
  31. package/dist/index.js +12 -12
  32. package/dist/productConfiguration/DebugAdditionalProductView.d.ts +3 -3
  33. package/dist/productConfiguration/DebugAdditionalProductView.js +6 -6
  34. package/dist/productConfiguration/DebugFeatureCommon.d.ts +10 -10
  35. package/dist/productConfiguration/DebugFeatureCommon.js +34 -34
  36. package/dist/productConfiguration/DebugFeatureGroupView.d.ts +4 -4
  37. package/dist/productConfiguration/DebugFeatureGroupView.js +20 -20
  38. package/dist/productConfiguration/DebugFeatureView.d.ts +4 -4
  39. package/dist/productConfiguration/DebugFeatureView.js +8 -8
  40. package/dist/productConfiguration/DebugOptionCommon.d.ts +10 -10
  41. package/dist/productConfiguration/DebugOptionCommon.js +30 -30
  42. package/dist/productConfiguration/DebugOptionView.d.ts +4 -4
  43. package/dist/productConfiguration/DebugOptionView.js +8 -8
  44. package/dist/productConfiguration/DebugProductCommon.d.ts +9 -9
  45. package/dist/productConfiguration/DebugProductCommon.js +40 -40
  46. package/dist/productConfiguration/DebugProductConfigurationView.d.ts +16 -16
  47. package/dist/productConfiguration/DebugProductConfigurationView.js +26 -26
  48. package/dist/productConfiguration/DebugRowsFactory.d.ts +9 -9
  49. package/dist/productConfiguration/DebugRowsFactory.js +33 -33
  50. package/dist/productConfiguration/DebugTable.d.ts +8 -8
  51. package/dist/productConfiguration/DebugTable.js +8 -8
  52. package/dist/productConfiguration/debugComponentsHelper.d.ts +3 -3
  53. package/dist/productConfiguration/debugComponentsHelper.js +28 -28
  54. package/dist/productConfiguration/index.d.ts +6 -6
  55. package/dist/productConfiguration/index.js +6 -6
  56. package/package.json +6 -6
@@ -1,58 +1,58 @@
1
- import { ErrorIcon } from "@configura/web-ui";
2
- import React, { useCallback, useEffect, useState } from "react";
3
- export const TextualConfigurationView = (props) => {
4
- const { active, observableStateManager } = props;
5
- const [editActive, setEditActive] = useState(false);
6
- const [warnings, setWarnings] = useState([]);
7
- const [textualConfiguration, setTextualConfiguration] = useState(observableStateManager.stateAsString);
8
- useEffect(() => {
9
- const textualConfigurationListener = (v) => {
10
- if (editActive) {
11
- return;
12
- }
13
- setTextualConfiguration(v);
14
- };
15
- observableStateManager.listenForStateChange(textualConfigurationListener);
16
- return () => {
17
- observableStateManager.stopListenForStateChange(textualConfigurationListener);
18
- };
19
- }, [editActive, observableStateManager]);
20
- const refreshWarnings = useCallback(() => {
21
- const ws = observableStateManager.getWarnings();
22
- setWarnings(ws);
23
- }, [observableStateManager]);
24
- return active ? (React.createElement("div", { className: `cfgTextualConfiguration ${props.className || ""}`, style: props.style },
25
- props.children,
26
- editActive && React.createElement("p", null, "Editing like this is experimental"),
27
- React.createElement("textarea", { className: "cfgTextualConfiguration__input cfgInput", disabled: !editActive, value: textualConfiguration, onChange: (event) => {
28
- if (!editActive) {
29
- return;
30
- }
31
- refreshWarnings();
32
- setTextualConfiguration(event.target.value);
33
- } }),
34
- React.createElement("div", { className: "cfgButtonRow" },
35
- React.createElement("button", { className: "cfgButtonRow__button cfgButton", onClick: () => {
36
- refreshWarnings();
37
- navigator.clipboard.writeText(textualConfiguration);
38
- } }, "Copy to clipboard"),
39
- !editActive && (React.createElement("button", { className: "cfgButtonRow__button cfgButton", onClick: () => {
40
- refreshWarnings();
41
- setEditActive(true);
42
- } }, "Edit")),
43
- editActive && (React.createElement(React.Fragment, null,
44
- React.createElement("button", { className: "cfgButtonRow__button cfgButton", onClick: () => {
45
- refreshWarnings();
46
- setTextualConfiguration(observableStateManager.stateAsString);
47
- setEditActive(false);
48
- } }, "Cancel Edit"),
49
- React.createElement("button", { className: "cfgButtonRow__button cfgButton", disabled: observableStateManager.stateAsString === textualConfiguration, onClick: () => {
50
- refreshWarnings();
51
- setEditActive(false);
52
- observableStateManager.stateAsString = textualConfiguration;
53
- } }, "Apply Edit")))),
54
- warnings.map((w) => (React.createElement("div", { className: "cfgTextualConfiguration__error", key: w },
55
- React.createElement(ErrorIcon, null),
56
- " ",
57
- w))))) : null;
58
- };
1
+ import { ErrorIcon } from "@configura/web-ui";
2
+ import React, { useCallback, useEffect, useState } from "react";
3
+ export const TextualConfigurationView = (props) => {
4
+ const { active, observableStateManager } = props;
5
+ const [editActive, setEditActive] = useState(false);
6
+ const [warnings, setWarnings] = useState([]);
7
+ const [textualConfiguration, setTextualConfiguration] = useState(observableStateManager.stateAsString);
8
+ useEffect(() => {
9
+ const textualConfigurationListener = (v) => {
10
+ if (editActive) {
11
+ return;
12
+ }
13
+ setTextualConfiguration(v);
14
+ };
15
+ observableStateManager.listenForStateChange(textualConfigurationListener);
16
+ return () => {
17
+ observableStateManager.stopListenForStateChange(textualConfigurationListener);
18
+ };
19
+ }, [editActive, observableStateManager]);
20
+ const refreshWarnings = useCallback(() => {
21
+ const ws = observableStateManager.getWarnings();
22
+ setWarnings(ws);
23
+ }, [observableStateManager]);
24
+ return active ? (React.createElement("div", { className: `cfgTextualConfiguration ${props.className || ""}`, style: props.style },
25
+ props.children,
26
+ editActive && React.createElement("p", null, "Editing like this is experimental"),
27
+ React.createElement("textarea", { className: "cfgTextualConfiguration__input cfgInput", disabled: !editActive, value: textualConfiguration, onChange: (event) => {
28
+ if (!editActive) {
29
+ return;
30
+ }
31
+ refreshWarnings();
32
+ setTextualConfiguration(event.target.value);
33
+ } }),
34
+ React.createElement("div", { className: "cfgButtonRow" },
35
+ React.createElement("button", { className: "cfgButtonRow__button cfgButton", onClick: () => {
36
+ refreshWarnings();
37
+ navigator.clipboard.writeText(textualConfiguration);
38
+ } }, "Copy to clipboard"),
39
+ !editActive && (React.createElement("button", { className: "cfgButtonRow__button cfgButton", onClick: () => {
40
+ refreshWarnings();
41
+ setEditActive(true);
42
+ } }, "Edit")),
43
+ editActive && (React.createElement(React.Fragment, null,
44
+ React.createElement("button", { className: "cfgButtonRow__button cfgButton", onClick: () => {
45
+ refreshWarnings();
46
+ setTextualConfiguration(observableStateManager.stateAsString);
47
+ setEditActive(false);
48
+ } }, "Cancel Edit"),
49
+ React.createElement("button", { className: "cfgButtonRow__button cfgButton", disabled: observableStateManager.stateAsString === textualConfiguration, onClick: () => {
50
+ refreshWarnings();
51
+ setEditActive(false);
52
+ observableStateManager.stateAsString = textualConfiguration;
53
+ } }, "Apply Edit")))),
54
+ warnings.map((w) => (React.createElement("div", { className: "cfgTextualConfiguration__error", key: w },
55
+ React.createElement(ErrorIcon, null),
56
+ " ",
57
+ w))))) : null;
58
+ };
@@ -1 +1 @@
1
- :root{--cfgExerciserImageWidth:200px;--cfgExerciserLink:#2667cf}.cfgExerciser{overflow-wrap:anywhere}.cfgExerciserColumn{display:flex;flex-direction:column;flex:1 1 auto}.cfgExerciserRow{display:flex;flex-direction:row;flex-wrap:wrap}.cfgExerciserLink{color:var(--cfgExerciserLink);text-decoration:none;word-break:break-all}.cfgExerciserView{margin:0 1em}.cfgExerciserButton{font-size:1em}.cfgExerciserControl{margin:.5em 0}.cfgExerciserControl__label{display:block;text-transform:capitalize;font-weight:500}.cfgExerciserControl__select--operator{margin-right:.5em}.cfgExerciserControl__selectWrapper{display:flex;flex-direction:row;flex-wrap:wrap}.cfgExerciserControl__select--full{flex:1 0 auto}.cfgExerciserControl__error{color:#dc143c}.cfgCanvasWrapper{width:100%}.cfgExerciserReportItem{border-top:1px solid #000;display:flex;flex-wrap:wrap}.cfgExerciserReportItem .cfgDebugLog{font-size:1em}.cfgExerciserReportItem .cfgDebugLog__item{padding:1px;margin:.5em 0}@media screen and (min-width:62.5em){.cfgExerciserReportItem{flex-wrap:nowrap}}.cfgExerciserReportItem__info{flex:1 1 auto}.cfgExerciserReportItem__image{width:var(--cfgExerciserImageWidth);height:var(--cfgExerciserImageWidth)}.cfgExerciserReportItem__image img{width:100%}.cfgExerciserFilter__logMessage{display:block;padding:1px 0}.cfgExerciserSetup{display:flex;flex-direction:row;flex-wrap:wrap}.cfgExerciserSetup__select{max-width:50rem}.cfgExerciserSetup__preview,.cfgExerciserSetup__select{flex:1 1 auto}.cfgExerciserSetup__select+.cfgExerciserSetup__preview{flex:1 1 50%}.cfgFontSize10{font-size:10px}.cfgDebugLog{font-size:1.5em;margin:1em 0}.cfgDebugLog__list{list-style:none;padding-left:0}.cfgDebugLog__item{padding:1em}.cfgDebugLog__item--severityInfo,.cfgDebugLog__item--severityLog{background-color:#33f;color:#fff}.cfgDebugLog__item--severityWarn{background-color:#fd0}.cfgDebugLog__item--severityError{background-color:#c00;color:#fff}ul.debug-wrapper{-webkit-padding-start:0;padding-inline-start:0;list-style:none}.debug-component__heading{font-weight:700}.debug-component__table{color:#00f;border-top:1px solid #00f;border-left:1px solid #00f;margin-left:1px;padding-left:5px;padding-top:5px;margin-top:10px}.debug-component__table--mark-hidden{color:#88f}.debug-component__table tr td:nth-child(2){white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.debug-component__group{list-style:none;-webkit-padding-start:10px;padding-inline-start:10px}.cfgTextualConfiguration__input{width:100%;min-height:15em}.cfgTextualConfiguration__error{margin-top:1em;font-size:1.2em}.cfgTextualConfiguration__error .cfgErrorIcon{margin-right:.75em;width:1.25em;height:1em}
1
+ :root{--cfgExerciserImageWidth:200px;--cfgExerciserLink:#2667cf}.cfgExerciser{overflow-wrap:anywhere}.cfgExerciserColumn{display:flex;flex-direction:column;flex:1 1 auto}.cfgExerciserRow{display:flex;flex-direction:row;flex-wrap:wrap}.cfgExerciserLink{color:var(--cfgExerciserLink);text-decoration:none;word-break:break-all}.cfgExerciserView{margin:0 1em}.cfgExerciserButton{font-size:1em}.cfgExerciserControl{margin:.5em 0}.cfgExerciserControl__label{display:block;text-transform:capitalize;font-weight:500}.cfgExerciserControl__select--operator{margin-right:.5em}.cfgExerciserControl__selectWrapper{display:flex;flex-direction:row;flex-wrap:wrap}.cfgExerciserControl__select--full{flex:1 0 auto}.cfgExerciserControl__error{color:#dc143c}.cfgCanvasWrapper{width:100%}.cfgExerciserReportItem{border-top:1px solid #000;display:flex;flex-wrap:wrap}.cfgExerciserReportItem .cfgDebugLog{font-size:1em}.cfgExerciserReportItem .cfgDebugLog__item{padding:1px;margin:.5em 0}@media screen and (min-width:62.5em){.cfgExerciserReportItem{flex-wrap:nowrap}}.cfgExerciserReportItem__info{flex:1 1 auto}.cfgExerciserReportItem__info p{margin-top:4px;margin-bottom:4px}.cfgExerciserReportItem__image{width:var(--cfgExerciserImageWidth);height:var(--cfgExerciserImageWidth)}.cfgExerciserReportItem__image img{width:100%}.cfgExerciserFilter__logMessage{display:block;padding:1px 0}.cfgExerciserSetup{display:flex;flex-direction:row;flex-wrap:wrap}.cfgExerciserSetup__select{max-width:50rem}.cfgExerciserSetup__preview,.cfgExerciserSetup__select{flex:1 1 auto}.cfgExerciserSetup__select+.cfgExerciserSetup__preview{flex:1 1 50%}.cfgFontSize10{font-size:10px}.cfgDebugLog{font-size:1.5em;margin:1em 0}.cfgDebugLog__list{list-style:none;padding-left:0}.cfgDebugLog__item{padding:1em}.cfgDebugLog__item--severityInfo,.cfgDebugLog__item--severityLog{background-color:#33f;color:#fff}.cfgDebugLog__item--severityWarn{background-color:#fd0}.cfgDebugLog__item--severityError{background-color:#c00;color:#fff}ul.debug-wrapper{-webkit-padding-start:0;padding-inline-start:0;list-style:none}.debug-component__heading{font-weight:700}.debug-component__table{color:#00f;border-top:1px solid #00f;border-left:1px solid #00f;margin-left:1px;padding-left:5px;padding-top:5px;margin-top:10px}.debug-component__table--mark-hidden{color:#88f}.debug-component__table tr td:nth-child(2){white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.debug-component__group{list-style:none;-webkit-padding-start:10px;padding-inline-start:10px}.cfgTextualConfiguration__input{width:100%;min-height:15em}.cfgTextualConfiguration__error{margin-top:1em;font-size:1.2em}.cfgTextualConfiguration__error .cfgErrorIcon{margin-right:.75em;width:1.25em;height:1em}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/scss/_exerciser.scss","../../src/scss/debug.scss","../../src/scss/debug.scss%23sass"],"names":[],"mappings":"AAAA,MACC,8BAAA,CCCD,0BACA,CDEA,cCCA,sBACA,CDEA,oBCCC,YAAA,CDCA,qBAAA,CACA,aCCD,CDEA,iBACC,YAAA,CACA,kBAAA,CACA,cCCD,CDEA,kBACC,6BAAA,CACA,oBAAA,CACA,oBCCD,CDEA,kBACC,YCCD,CDEA,oBACC,aCCD,CDEA,qBCCA,aACA,CDEA,4BACC,aAAA,CCCA,yBAAA,CDCA,eCCD,CDCA,uCACC,iBCED,CDCA,oCACC,YAAA,CACA,kBAAA,CACA,cCED,CDCA,mCACC,aCED,CDCA,4BACC,aCED,CDCA,kBACC,UCED,CDCA,wBCEC,yBAAA,CACD,YAAA,CDAC,cCED,CDAC,qCACC,aCEF,CDCC,2CACC,WAAA,CCCD,aACD,CDGA,qCACC,wBCAE,gBACD,CACF,CDGA,8BCDC,aACD,CDIA,+BACC,mCAAA,CACA,oCCDD,CDIA,mCACC,UCDD,CDIA,gCACC,aAAA,CACA,aCDD,CDIA,mBACC,YAAA,CACA,kBAAA,CACA,cCDD,CDIA,2BACC,eCDD,CDIA,uDAEC,aCDD,CDIA,uDACC,YCDD,CCtHA,eACC,cDyHD,CCtHA,aACC,eAAA,CACA,YDyHD,CCvHC,mBACC,eAAA,CACA,cDyHF,CCtHC,mBACC,WDwHF,CCtHE,iEAEC,qBAAA,CACA,UDuHH,CCrHE,iCACC,qBDuHH,CCrHE,kCACC,qBAAA,CACA,UDuHH,CClHA,iBACC,uBAAA,CAAA,sBAAA,CACA,eDqHD,CCjHC,0BACC,eDoHF,CCjHC,wBACC,UAAA,CACA,yBAAA,CACA,0BAAA,CACA,eAAA,CACA,gBAAA,CACA,eAAA,CACA,eDmHF,CCjHE,qCACC,UDmHH,CC/GG,2CACC,kBAAA,CACA,eAAA,CACA,sBDiHJ,CC5GC,wBACC,eAAA,CACA,0BAAA,CAAA,yBD8GF,CCzGC,gCACC,UAAA,CACA,eD4GF,CCzGC,gCACC,cAAA,CACA,eD2GF,CCzGE,8CACC,kBAAA,CACA,YAAA,CACA,UD2GH","file":"debug.css","sourcesContent":[":root {\n\t--cfgExerciserImageWidth: 200px;\n\t--cfgExerciserLink: hsl(217, 69%, 48%);\n}\n\n.cfgExerciser {\n\toverflow-wrap: anywhere;\n}\n\n.cfgExerciserColumn {\n\tdisplay: flex;\n\tflex-direction: column;\n\tflex: 1 1 auto;\n}\n\n.cfgExerciserRow {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: wrap;\n}\n\n.cfgExerciserLink {\n\tcolor: var(--cfgExerciserLink);\n\ttext-decoration: none;\n\tword-break: break-all;\n}\n\n.cfgExerciserView {\n\tmargin: 0 1em;\n}\n\n.cfgExerciserButton {\n\tfont-size: 1em;\n}\n\n.cfgExerciserControl {\n\tmargin: 0.5em 0;\n}\n\n.cfgExerciserControl__label {\n\tdisplay: block;\n\ttext-transform: capitalize;\n\tfont-weight: 500;\n}\n.cfgExerciserControl__select--operator {\n\tmargin-right: 0.5em;\n}\n\n.cfgExerciserControl__selectWrapper {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: wrap;\n}\n\n.cfgExerciserControl__select--full {\n\tflex: 1 0 auto;\n}\n\n.cfgExerciserControl__error {\n\tcolor: crimson;\n}\n\n.cfgCanvasWrapper {\n\twidth: 100%;\n}\n\n.cfgExerciserReportItem {\n\tborder-top: 1px solid black;\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\n\t& .cfgDebugLog {\n\t\tfont-size: 1em;\n\t}\n\n\t& .cfgDebugLog__item {\n\t\tpadding: 1px;\n\t\tmargin: 0.5em 0;\n\t}\n}\n\n@media screen and (min-width: 62.5em) {\n\t.cfgExerciserReportItem {\n\t\tflex-wrap: nowrap;\n\t}\n}\n\n.cfgExerciserReportItem__info {\n\tflex: 1 1 auto;\n}\n\n.cfgExerciserReportItem__image {\n\twidth: var(--cfgExerciserImageWidth);\n\theight: var(--cfgExerciserImageWidth);\n}\n\n.cfgExerciserReportItem__image img {\n\twidth: 100%;\n}\n\n.cfgExerciserFilter__logMessage {\n\tdisplay: block;\n\tpadding: 1px 0;\n}\n\n.cfgExerciserSetup {\n\tdisplay: flex;\n\tflex-direction: row;\n\tflex-wrap: wrap;\n}\n\n.cfgExerciserSetup__select {\n\tmax-width: 50rem;\n}\n\n.cfgExerciserSetup__select,\n.cfgExerciserSetup__preview {\n\tflex: 1 1 auto;\n}\n\n.cfgExerciserSetup__select + .cfgExerciserSetup__preview {\n\tflex: 1 1 50%;\n}\n","@import \"exerciser\";\n\n.cfgFontSize10 {\n\tfont-size: 10px;\n}\n\n.cfgDebugLog {\n\tfont-size: 1.5em;\n\tmargin: 1em 0;\n\n\t&__list {\n\t\tlist-style: none;\n\t\tpadding-left: 0;\n\t}\n\n\t&__item {\n\t\tpadding: 1em;\n\n\t\t&--severityLog,\n\t\t&--severityInfo {\n\t\t\tbackground-color: #3333ff;\n\t\t\tcolor: #fff;\n\t\t}\n\t\t&--severityWarn {\n\t\t\tbackground-color: #ffdd00;\n\t\t}\n\t\t&--severityError {\n\t\t\tbackground-color: #cc0000;\n\t\t\tcolor: #fff;\n\t\t}\n\t}\n}\n\nul.debug-wrapper {\n\tpadding-inline-start: 0;\n\tlist-style: none;\n}\n\n.debug-component {\n\t&__heading {\n\t\tfont-weight: 700;\n\t}\n\n\t&__table {\n\t\tcolor: blue;\n\t\tborder-top: 1px blue solid;\n\t\tborder-left: 1px blue solid;\n\t\tmargin-left: 1px;\n\t\tpadding-left: 5px;\n\t\tpadding-top: 5px;\n\t\tmargin-top: 10px;\n\n\t\t&--mark-hidden {\n\t\t\tcolor: #8888ff;\n\t\t}\n\n\t\ttr {\n\t\t\ttd:nth-child(2) {\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__group {\n\t\tlist-style: none;\n\t\tpadding-inline-start: 10px;\n\t}\n}\n\n.cfgTextualConfiguration {\n\t&__input {\n\t\twidth: 100%;\n\t\tmin-height: 15em;\n\t}\n\n\t&__error {\n\t\tmargin-top: 1em;\n\t\tfont-size: 1.2em;\n\n\t\t.cfgErrorIcon {\n\t\t\tmargin-right: 0.75em;\n\t\t\twidth: 1.25em;\n\t\t\theight: 1em;\n\t\t}\n\t}\n}\n","@import \"exerciser\";\n\n.cfgFontSize10 {\n\tfont-size: 10px;\n}\n\n.cfgDebugLog {\n\tfont-size: 1.5em;\n\tmargin: 1em 0;\n\n\t&__list {\n\t\tlist-style: none;\n\t\tpadding-left: 0;\n\t}\n\n\t&__item {\n\t\tpadding: 1em;\n\n\t\t&--severityLog,\n\t\t&--severityInfo {\n\t\t\tbackground-color: #3333ff;\n\t\t\tcolor: #fff;\n\t\t}\n\t\t&--severityWarn {\n\t\t\tbackground-color: #ffdd00;\n\t\t}\n\t\t&--severityError {\n\t\t\tbackground-color: #cc0000;\n\t\t\tcolor: #fff;\n\t\t}\n\t}\n}\n\nul.debug-wrapper {\n\tpadding-inline-start: 0;\n\tlist-style: none;\n}\n\n.debug-component {\n\t&__heading {\n\t\tfont-weight: 700;\n\t}\n\n\t&__table {\n\t\tcolor: blue;\n\t\tborder-top: 1px blue solid;\n\t\tborder-left: 1px blue solid;\n\t\tmargin-left: 1px;\n\t\tpadding-left: 5px;\n\t\tpadding-top: 5px;\n\t\tmargin-top: 10px;\n\n\t\t&--mark-hidden {\n\t\t\tcolor: #8888ff;\n\t\t}\n\n\t\ttr {\n\t\t\ttd:nth-child(2) {\n\t\t\t\twhite-space: nowrap;\n\t\t\t\toverflow: hidden;\n\t\t\t\ttext-overflow: ellipsis;\n\t\t\t}\n\t\t}\n\t}\n\n\t&__group {\n\t\tlist-style: none;\n\t\tpadding-inline-start: 10px;\n\t}\n}\n\n.cfgTextualConfiguration {\n\t&__input {\n\t\twidth: 100%;\n\t\tmin-height: 15em;\n\t}\n\n\t&__error {\n\t\tmargin-top: 1em;\n\t\tfont-size: 1.2em;\n\n\t\t.cfgErrorIcon {\n\t\t\tmargin-right: 0.75em;\n\t\t\twidth: 1.25em;\n\t\t\theight: 1em;\n\t\t}\n\t}\n}\n"]}
1
+ {"version":3,"sources":["../../src/scss/_exerciser.scss","../../src/scss/debug.scss","../../src/scss/debug.scss%23sass"],"names":[],"mappings":"AAAA,MACC,8BAAA,CCCD,0BACA,CDEA,cCCA,sBACA,CDEA,oBCCC,YAAA,CDCA,qBAAA,CACA,aCCD,CDEA,iBACC,YAAA,CACA,kBAAA,CACA,cCCD,CDEA,kBACC,6BAAA,CACA,oBAAA,CACA,oBCCD,CDEA,kBACC,YCCD,CDEA,oBACC,aCCD,CDEA,qBCCA,aACA,CDEA,4BACC,aAAA,CCCA,yBAAA,CDCA,eCCD,CDCA,uCACC,iBCED,CDCA,oCACC,YAAA,CACA,kBAAA,CACA,cCED,CDCA,mCACC,aCED,CDCA,4BACC,aCED,CDCA,kBACC,UCED,CDCA,wBCEC,yBAAA,CACD,YAAA,CDAC,cCED,CDAC,qCACC,aCEF,CDCC,2CACC,WAAA,CCCD,aACD,CDGA,qCACC,wBCAE,gBACD,CACF,CDGA,8BCDC,aACD,CDIA,gCACC,cAAA,CACA,iBCDD,CDIA,+BACC,mCAAA,CACA,oCCDD,CDIA,mCACC,UCDD,CDIA,gCACC,aAAA,CACA,aCDD,CDIA,mBACC,YAAA,CACA,kBAAA,CACA,cCDD,CDIA,2BACC,eCDD,CDIA,uDAEC,aCDD,CDIA,uDACC,YCDD,CC3HA,eACC,cD8HD,CC3HA,aACC,eAAA,CACA,YD8HD,CC5HC,mBACC,eAAA,CACA,cD8HF,CC3HC,mBACC,WD6HF,CC3HE,iEAEC,qBAAA,CACA,UD4HH,CC1HE,iCACC,qBD4HH,CC1HE,kCACC,qBAAA,CACA,UD4HH,CCvHA,iBACC,uBAAA,CAAA,sBAAA,CACA,eD0HD,CCtHC,0BACC,eDyHF,CCtHC,wBACC,UAAA,CACA,yBAAA,CACA,0BAAA,CACA,eAAA,CACA,gBAAA,CACA,eAAA,CACA,eDwHF,CCtHE,qCACC,UDwHH,CCpHG,2CACC,kBAAA,CACA,eAAA,CACA,sBDsHJ,CCjHC,wBACC,eAAA,CACA,0BAAA,CAAA,yBDmHF,CC9GC,gCACC,UAAA,CACA,eDiHF,CC9GC,gCACC,cAAA,CACA,eDgHF,CC9GE,8CACC,kBAAA,CACA,YAAA,CACA,UDgHH","file":"debug.css","sourcesContent":[":root {\r\n\t--cfgExerciserImageWidth: 200px;\r\n\t--cfgExerciserLink: hsl(217, 69%, 48%);\r\n}\r\n\r\n.cfgExerciser {\r\n\toverflow-wrap: anywhere;\r\n}\r\n\r\n.cfgExerciserColumn {\r\n\tdisplay: flex;\r\n\tflex-direction: column;\r\n\tflex: 1 1 auto;\r\n}\r\n\r\n.cfgExerciserRow {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tflex-wrap: wrap;\r\n}\r\n\r\n.cfgExerciserLink {\r\n\tcolor: var(--cfgExerciserLink);\r\n\ttext-decoration: none;\r\n\tword-break: break-all;\r\n}\r\n\r\n.cfgExerciserView {\r\n\tmargin: 0 1em;\r\n}\r\n\r\n.cfgExerciserButton {\r\n\tfont-size: 1em;\r\n}\r\n\r\n.cfgExerciserControl {\r\n\tmargin: 0.5em 0;\r\n}\r\n\r\n.cfgExerciserControl__label {\r\n\tdisplay: block;\r\n\ttext-transform: capitalize;\r\n\tfont-weight: 500;\r\n}\r\n.cfgExerciserControl__select--operator {\r\n\tmargin-right: 0.5em;\r\n}\r\n\r\n.cfgExerciserControl__selectWrapper {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tflex-wrap: wrap;\r\n}\r\n\r\n.cfgExerciserControl__select--full {\r\n\tflex: 1 0 auto;\r\n}\r\n\r\n.cfgExerciserControl__error {\r\n\tcolor: crimson;\r\n}\r\n\r\n.cfgCanvasWrapper {\r\n\twidth: 100%;\r\n}\r\n\r\n.cfgExerciserReportItem {\r\n\tborder-top: 1px solid black;\r\n\tdisplay: flex;\r\n\tflex-wrap: wrap;\r\n\r\n\t& .cfgDebugLog {\r\n\t\tfont-size: 1em;\r\n\t}\r\n\r\n\t& .cfgDebugLog__item {\r\n\t\tpadding: 1px;\r\n\t\tmargin: 0.5em 0;\r\n\t}\r\n}\r\n\r\n@media screen and (min-width: 62.5em) {\r\n\t.cfgExerciserReportItem {\r\n\t\tflex-wrap: nowrap;\r\n\t}\r\n}\r\n\r\n.cfgExerciserReportItem__info {\r\n\tflex: 1 1 auto;\r\n}\r\n\r\n.cfgExerciserReportItem__info p {\r\n\tmargin-top: 4px;\r\n\tmargin-bottom: 4px;\r\n}\r\n\r\n.cfgExerciserReportItem__image {\r\n\twidth: var(--cfgExerciserImageWidth);\r\n\theight: var(--cfgExerciserImageWidth);\r\n}\r\n\r\n.cfgExerciserReportItem__image img {\r\n\twidth: 100%;\r\n}\r\n\r\n.cfgExerciserFilter__logMessage {\r\n\tdisplay: block;\r\n\tpadding: 1px 0;\r\n}\r\n\r\n.cfgExerciserSetup {\r\n\tdisplay: flex;\r\n\tflex-direction: row;\r\n\tflex-wrap: wrap;\r\n}\r\n\r\n.cfgExerciserSetup__select {\r\n\tmax-width: 50rem;\r\n}\r\n\r\n.cfgExerciserSetup__select,\r\n.cfgExerciserSetup__preview {\r\n\tflex: 1 1 auto;\r\n}\r\n\r\n.cfgExerciserSetup__select + .cfgExerciserSetup__preview {\r\n\tflex: 1 1 50%;\r\n}\r\n","@import \"exerciser\";\r\n\r\n.cfgFontSize10 {\r\n\tfont-size: 10px;\r\n}\r\n\r\n.cfgDebugLog {\r\n\tfont-size: 1.5em;\r\n\tmargin: 1em 0;\r\n\r\n\t&__list {\r\n\t\tlist-style: none;\r\n\t\tpadding-left: 0;\r\n\t}\r\n\r\n\t&__item {\r\n\t\tpadding: 1em;\r\n\r\n\t\t&--severityLog,\r\n\t\t&--severityInfo {\r\n\t\t\tbackground-color: #3333ff;\r\n\t\t\tcolor: #fff;\r\n\t\t}\r\n\t\t&--severityWarn {\r\n\t\t\tbackground-color: #ffdd00;\r\n\t\t}\r\n\t\t&--severityError {\r\n\t\t\tbackground-color: #cc0000;\r\n\t\t\tcolor: #fff;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nul.debug-wrapper {\r\n\tpadding-inline-start: 0;\r\n\tlist-style: none;\r\n}\r\n\r\n.debug-component {\r\n\t&__heading {\r\n\t\tfont-weight: 700;\r\n\t}\r\n\r\n\t&__table {\r\n\t\tcolor: blue;\r\n\t\tborder-top: 1px blue solid;\r\n\t\tborder-left: 1px blue solid;\r\n\t\tmargin-left: 1px;\r\n\t\tpadding-left: 5px;\r\n\t\tpadding-top: 5px;\r\n\t\tmargin-top: 10px;\r\n\r\n\t\t&--mark-hidden {\r\n\t\t\tcolor: #8888ff;\r\n\t\t}\r\n\r\n\t\ttr {\r\n\t\t\ttd:nth-child(2) {\r\n\t\t\t\twhite-space: nowrap;\r\n\t\t\t\toverflow: hidden;\r\n\t\t\t\ttext-overflow: ellipsis;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t&__group {\r\n\t\tlist-style: none;\r\n\t\tpadding-inline-start: 10px;\r\n\t}\r\n}\r\n\r\n.cfgTextualConfiguration {\r\n\t&__input {\r\n\t\twidth: 100%;\r\n\t\tmin-height: 15em;\r\n\t}\r\n\r\n\t&__error {\r\n\t\tmargin-top: 1em;\r\n\t\tfont-size: 1.2em;\r\n\r\n\t\t.cfgErrorIcon {\r\n\t\t\tmargin-right: 0.75em;\r\n\t\t\twidth: 1.25em;\r\n\t\t\theight: 1em;\r\n\t\t}\r\n\t}\r\n}\r\n","@import \"exerciser\";\r\n\r\n.cfgFontSize10 {\r\n\tfont-size: 10px;\r\n}\r\n\r\n.cfgDebugLog {\r\n\tfont-size: 1.5em;\r\n\tmargin: 1em 0;\r\n\r\n\t&__list {\r\n\t\tlist-style: none;\r\n\t\tpadding-left: 0;\r\n\t}\r\n\r\n\t&__item {\r\n\t\tpadding: 1em;\r\n\r\n\t\t&--severityLog,\r\n\t\t&--severityInfo {\r\n\t\t\tbackground-color: #3333ff;\r\n\t\t\tcolor: #fff;\r\n\t\t}\r\n\t\t&--severityWarn {\r\n\t\t\tbackground-color: #ffdd00;\r\n\t\t}\r\n\t\t&--severityError {\r\n\t\t\tbackground-color: #cc0000;\r\n\t\t\tcolor: #fff;\r\n\t\t}\r\n\t}\r\n}\r\n\r\nul.debug-wrapper {\r\n\tpadding-inline-start: 0;\r\n\tlist-style: none;\r\n}\r\n\r\n.debug-component {\r\n\t&__heading {\r\n\t\tfont-weight: 700;\r\n\t}\r\n\r\n\t&__table {\r\n\t\tcolor: blue;\r\n\t\tborder-top: 1px blue solid;\r\n\t\tborder-left: 1px blue solid;\r\n\t\tmargin-left: 1px;\r\n\t\tpadding-left: 5px;\r\n\t\tpadding-top: 5px;\r\n\t\tmargin-top: 10px;\r\n\r\n\t\t&--mark-hidden {\r\n\t\t\tcolor: #8888ff;\r\n\t\t}\r\n\r\n\t\ttr {\r\n\t\t\ttd:nth-child(2) {\r\n\t\t\t\twhite-space: nowrap;\r\n\t\t\t\toverflow: hidden;\r\n\t\t\t\ttext-overflow: ellipsis;\r\n\t\t\t}\r\n\t\t}\r\n\t}\r\n\r\n\t&__group {\r\n\t\tlist-style: none;\r\n\t\tpadding-inline-start: 10px;\r\n\t}\r\n}\r\n\r\n.cfgTextualConfiguration {\r\n\t&__input {\r\n\t\twidth: 100%;\r\n\t\tmin-height: 15em;\r\n\t}\r\n\r\n\t&__error {\r\n\t\tmargin-top: 1em;\r\n\t\tfont-size: 1.2em;\r\n\r\n\t\t.cfgErrorIcon {\r\n\t\t\tmargin-right: 0.75em;\r\n\t\t\twidth: 1.25em;\r\n\t\t\theight: 1em;\r\n\t\t}\r\n\t}\r\n}\r\n"]}
@@ -1,38 +1,38 @@
1
- import { CatalogueAPI, DtoCatalogueParams, DtoCatalogueParamsWithCid, DtoCataloguePermission, DtoProductParamsWithCid, DtoTOCResponse, GeneratedProductConfiguration, ProductRefParams } from "@configura/web-api";
2
- import { AggregatedLoadingObservable, Filter, Filters, LogLevel } from "@configura/web-utilities";
3
- import React from "react";
4
- export declare type ExerciserAction = "setup" | "run";
5
- export declare function validateAction(action: string): ExerciserAction;
6
- export declare function flattenCataloguePermissions(permissions: DtoCataloguePermission[]): DtoCatalogueParamsWithCid[];
7
- export declare function filtersKey(...filters: Filter[]): string;
8
- export declare function catalogueFiltersKey(filters: Filters<DtoCatalogueParams>): string;
9
- export declare function useCatalogueFilters(props: ExerciserState): Filters<DtoCatalogueParams>;
10
- export declare function productFiltersKey(filters: Filters<ProductRefParams>): string;
11
- export declare function useProductFilters(props: ExerciserState): Filters<ProductRefParams>;
12
- export declare function useProductConfigurationIterator(api: CatalogueAPI, lang: string, result: DtoCatalogueParamsWithCid[], productConditions: Filters<ProductRefParams>): AsyncIterableIterator<GeneratedProductConfiguration | Error>;
13
- export declare function useToc(api: CatalogueAPI, params: DtoCatalogueParams | undefined, lang: string, setError: (err: unknown) => void, loadingObservable: AggregatedLoadingObservable): DtoTOCResponse | undefined;
14
- export interface LogMessageCount {
15
- message: string;
16
- level: LogLevel;
17
- count: number;
18
- }
19
- export interface ExerciserState {
20
- lang: string;
21
- action: ExerciserAction;
22
- enterprise: Filter;
23
- prdCat: Filter;
24
- prdCatVersion: Filter;
25
- vendor: Filter;
26
- priceList: Filter;
27
- partNr: Filter;
28
- }
29
- interface Props {
30
- api: CatalogueAPI;
31
- exerciserState: ExerciserState;
32
- generateExerciserUrl: (action: ExerciserAction, lang: string, params: Partial<DtoProductParamsWithCid>) => string;
33
- setError: (err: unknown) => void;
34
- setExerciserState: (next: ExerciserState) => void;
35
- }
36
- export declare const Exerciser: React.FC<Props>;
37
- export {};
1
+ import { CatalogueAPI, DtoCatalogueParams, DtoCatalogueParamsWithCid, DtoCataloguePermission, DtoProductParamsWithCid, DtoTOCResponse, GeneratedProductConfiguration, ProductRefParams } from "@configura/web-api";
2
+ import { AggregatedLoadingObservable, Filter, Filters, LogLevel } from "@configura/web-utilities";
3
+ import React from "react";
4
+ export declare type ExerciserAction = "setup" | "run";
5
+ export declare function validateAction(action: string): ExerciserAction;
6
+ export declare function flattenCataloguePermissions(permissions: DtoCataloguePermission[]): DtoCatalogueParamsWithCid[];
7
+ export declare function filtersKey(...filters: Filter[]): string;
8
+ export declare function catalogueFiltersKey(filters: Filters<DtoCatalogueParams>): string;
9
+ export declare function useCatalogueFilters(props: ExerciserState): Filters<DtoCatalogueParams>;
10
+ export declare function productFiltersKey(filters: Filters<ProductRefParams>): string;
11
+ export declare function useProductFilters(props: ExerciserState): Filters<ProductRefParams>;
12
+ export declare function useProductConfigurationIterator(api: CatalogueAPI, lang: string, result: DtoCatalogueParamsWithCid[], productConditions: Filters<ProductRefParams>): AsyncIterableIterator<GeneratedProductConfiguration | Error>;
13
+ export declare function useToc(api: CatalogueAPI, params: DtoCatalogueParams | undefined, lang: string, setError: (err: unknown) => void, loadingObservable: AggregatedLoadingObservable): DtoTOCResponse | undefined;
14
+ export interface LogMessageCount {
15
+ message: string;
16
+ level: LogLevel;
17
+ count: number;
18
+ }
19
+ export interface ExerciserState {
20
+ lang: string;
21
+ action: ExerciserAction;
22
+ enterprise: Filter;
23
+ prdCat: Filter;
24
+ prdCatVersion: Filter;
25
+ vendor: Filter;
26
+ priceList: Filter;
27
+ partNr: Filter;
28
+ }
29
+ interface Props {
30
+ api: CatalogueAPI;
31
+ exerciserState: ExerciserState;
32
+ generateExerciserUrl: (action: ExerciserAction, lang: string, params: Partial<DtoProductParamsWithCid>) => string;
33
+ setError: (err: unknown) => void;
34
+ setExerciserState: (next: ExerciserState) => void;
35
+ }
36
+ export declare const Exerciser: React.FC<Props>;
37
+ export {};
38
38
  //# sourceMappingURL=Exerciser.d.ts.map
@@ -1,155 +1,155 @@
1
- import { generateProductConfigurations, } from "@configura/web-api";
2
- import { Loading, useObservableState } from "@configura/web-ui";
3
- import { AggregatedLoadingObservable, encodeURIComponents, LogLevel, LogMessage, } from "@configura/web-utilities";
4
- import React, { useCallback, useEffect, useMemo, useState } from "react";
5
- import { ExerciserReportFilterView } from "./ExerciserReportFilterView.js";
6
- import { ExerciserReportView } from "./ExerciserReportView.js";
7
- import { ExerciserRunner } from "./ExerciserRun.js";
8
- import { ExerciserSetup } from "./ExerciserSetup.js";
9
- export function validateAction(action) {
10
- switch (action) {
11
- case "run":
12
- case "setup":
13
- return action;
14
- }
15
- return "setup";
16
- }
17
- export function flattenCataloguePermissions(permissions) {
18
- const params = [];
19
- for (const p of permissions) {
20
- const { cid, enterprise, prdCat, prdCatVersion } = p;
21
- const vendors = p.vendors || ["-"];
22
- for (const vendor of vendors) {
23
- const priceLists = p.priceLists || ["-"];
24
- for (const priceList of priceLists) {
25
- params.push({
26
- cid,
27
- enterprise,
28
- prdCat,
29
- prdCatVersion,
30
- priceList,
31
- vendor,
32
- });
33
- }
34
- }
35
- }
36
- return params;
37
- }
38
- export function filtersKey(...filters) {
39
- return filters.map((c) => encodeURIComponents(c.mode, c.value)).join("/");
40
- }
41
- export function catalogueFiltersKey(filters) {
42
- return filtersKey(filters.enterprise, filters.prdCat, filters.prdCatVersion, filters.priceList, filters.vendor);
43
- }
44
- export function useCatalogueFilters(props) {
45
- const key = catalogueFiltersKey(props);
46
- return useMemo(() => ({
47
- enterprise: props.enterprise,
48
- prdCat: props.prdCat,
49
- prdCatVersion: props.prdCatVersion,
50
- priceList: props.priceList,
51
- vendor: props.vendor,
52
- }),
53
- // eslint-disable-next-line react-hooks/exhaustive-deps
54
- [key]);
55
- }
56
- export function productFiltersKey(filters) {
57
- return filtersKey(filters.partNr);
58
- }
59
- export function useProductFilters(props) {
60
- const key = productFiltersKey(props);
61
- // eslint-disable-next-line react-hooks/exhaustive-deps
62
- return useMemo(() => ({ partNr: props.partNr }), [key]);
63
- }
64
- export function useProductConfigurationIterator(api, lang, result, productConditions) {
65
- return useMemo(() => generateProductConfigurations(api, lang, result, productConditions, {
66
- strictSelectOneSelectionCount: true,
67
- }), [api, lang, productConditions, result]);
68
- }
69
- export function useToc(api, params, lang, setError, loadingObservable) {
70
- const [response, setResponse] = useState();
71
- useEffect(() => {
72
- if (!params) {
73
- setResponse(undefined);
74
- return;
75
- }
76
- let canceled = false;
77
- const token = loadingObservable.startChildLoading();
78
- api.getTocFlat(Object.assign(Object.assign({}, params), { lang }))
79
- .then((res) => !canceled && setResponse(res))
80
- .catch((err) => !canceled && setError(err))
81
- .then(() => loadingObservable.stopChildLoading(token));
82
- return () => {
83
- canceled = true;
84
- loadingObservable.stopChildLoading(token);
85
- };
86
- }, [api, lang, loadingObservable, params, setError]);
87
- return response;
88
- }
89
- export const Exerciser = (props) => {
90
- const { action } = props.exerciserState;
91
- const loadingObservable = useMemo(() => new AggregatedLoadingObservable(), []);
92
- const [loading] = useObservableState(loadingObservable, false);
93
- const [productIterator, setProductIterator] = useState();
94
- const [logMessageCount, setLogMessageCount] = useState(() => new Map());
95
- const [reportItems, setReportItems] = useState([]);
96
- const [filteredReportItems, setFilteredReportItems] = useState([]);
97
- useEffect(() => {
98
- setLogMessageCount(new Map());
99
- setReportItems([]);
100
- setFilteredReportItems([]);
101
- // eslint-disable-next-line react-hooks/exhaustive-deps
102
- }, [productIterator]);
103
- const addLogMessages = useCallback((logMessages) => {
104
- setLogMessageCount((p) => {
105
- const n = new Map(p.entries());
106
- for (const logMessage of logMessages) {
107
- const hash = logMessage.levelMessageHash;
108
- let item = n.get(hash);
109
- if (item === undefined) {
110
- item = {
111
- level: logMessage.level,
112
- message: `${logMessage.message}`,
113
- count: 0,
114
- };
115
- n.set(hash, item);
116
- }
117
- item.count++;
118
- }
119
- return n;
120
- });
121
- }, []);
122
- const addErrorReportItem = useCallback((e) => {
123
- setReportItems((p) => {
124
- const message = {
125
- productUrl: "",
126
- logMessages: [new LogMessage(LogLevel.Error, `${e}`, [])],
127
- randId: Math.random(),
128
- duration: 0,
129
- };
130
- addLogMessages(message.logMessages);
131
- return p.concat(message);
132
- });
133
- }, [addLogMessages]);
134
- const addReportItem = useCallback((item) => {
135
- addLogMessages(item.logMessages);
136
- setReportItems((p) => {
137
- return p.concat(item);
138
- });
139
- }, [addLogMessages]);
140
- return (React.createElement("div", { className: "cfgExerciser cfgExerciserColumn" },
141
- React.createElement("div", { className: "cfgExerciserView" },
142
- React.createElement("h1", null,
143
- "Exerciser ",
144
- loading && React.createElement(Loading, { className: "cfgFontSize10", small: true }))),
145
- React.createElement("div", { className: "cfgExerciserRow" },
146
- React.createElement("div", { className: "cfgExerciserColumn" },
147
- React.createElement(ExerciserSetup, Object.assign({}, props, { loadingObservable: loadingObservable, setProductIterator: setProductIterator }))),
148
- action === "run" && productIterator && (React.createElement("div", { className: "cfgExerciserColumn" },
149
- React.createElement(ExerciserRunner, { generateExerciserUrl: props.generateExerciserUrl, addErrorReportItem: addErrorReportItem, addReportItem: addReportItem, loadingObservable: loadingObservable, productIterator: productIterator })))),
150
- action === "run" && (React.createElement(React.Fragment, null,
151
- React.createElement("div", { className: "cfgExerciserView cfgExerciserRow" },
152
- React.createElement(ExerciserReportFilterView, { allReportItems: reportItems, logMessageMap: logMessageCount, setFilteredReportItems: setFilteredReportItems })),
153
- React.createElement("div", { className: "cfgExerciserView cfgExerciserRow" },
154
- React.createElement(ExerciserReportView, { items: filteredReportItems }))))));
155
- };
1
+ import { generateProductConfigurations, } from "@configura/web-api";
2
+ import { Loading, useObservableState } from "@configura/web-ui";
3
+ import { AggregatedLoadingObservable, encodeURIComponents, LogLevel, LogMessage, } from "@configura/web-utilities";
4
+ import React, { useCallback, useEffect, useMemo, useState } from "react";
5
+ import { ExerciserReportFilterView } from "./ExerciserReportFilterView.js";
6
+ import { ExerciserReportView } from "./ExerciserReportView.js";
7
+ import { ExerciserRunner } from "./ExerciserRun.js";
8
+ import { ExerciserSetup } from "./ExerciserSetup.js";
9
+ export function validateAction(action) {
10
+ switch (action) {
11
+ case "run":
12
+ case "setup":
13
+ return action;
14
+ }
15
+ return "setup";
16
+ }
17
+ export function flattenCataloguePermissions(permissions) {
18
+ const params = [];
19
+ for (const p of permissions) {
20
+ const { cid, enterprise, prdCat, prdCatVersion } = p;
21
+ const vendors = p.vendors || ["-"];
22
+ for (const vendor of vendors) {
23
+ const priceLists = p.priceLists || ["-"];
24
+ for (const priceList of priceLists) {
25
+ params.push({
26
+ cid,
27
+ enterprise,
28
+ prdCat,
29
+ prdCatVersion,
30
+ priceList,
31
+ vendor,
32
+ });
33
+ }
34
+ }
35
+ }
36
+ return params;
37
+ }
38
+ export function filtersKey(...filters) {
39
+ return filters.map((c) => encodeURIComponents(c.mode, c.value)).join("/");
40
+ }
41
+ export function catalogueFiltersKey(filters) {
42
+ return filtersKey(filters.enterprise, filters.prdCat, filters.prdCatVersion, filters.priceList, filters.vendor);
43
+ }
44
+ export function useCatalogueFilters(props) {
45
+ const key = catalogueFiltersKey(props);
46
+ return useMemo(() => ({
47
+ enterprise: props.enterprise,
48
+ prdCat: props.prdCat,
49
+ prdCatVersion: props.prdCatVersion,
50
+ priceList: props.priceList,
51
+ vendor: props.vendor,
52
+ }),
53
+ // eslint-disable-next-line react-hooks/exhaustive-deps
54
+ [key]);
55
+ }
56
+ export function productFiltersKey(filters) {
57
+ return filtersKey(filters.partNr);
58
+ }
59
+ export function useProductFilters(props) {
60
+ const key = productFiltersKey(props);
61
+ // eslint-disable-next-line react-hooks/exhaustive-deps
62
+ return useMemo(() => ({ partNr: props.partNr }), [key]);
63
+ }
64
+ export function useProductConfigurationIterator(api, lang, result, productConditions) {
65
+ return useMemo(() => generateProductConfigurations(api, lang, result, productConditions, {
66
+ strictSelectOneSelectionCount: true,
67
+ }), [api, lang, productConditions, result]);
68
+ }
69
+ export function useToc(api, params, lang, setError, loadingObservable) {
70
+ const [response, setResponse] = useState();
71
+ useEffect(() => {
72
+ if (!params) {
73
+ setResponse(undefined);
74
+ return;
75
+ }
76
+ let canceled = false;
77
+ const token = loadingObservable.startChildLoading();
78
+ api.getTocFlat(Object.assign(Object.assign({}, params), { lang }))
79
+ .then((res) => !canceled && setResponse(res))
80
+ .catch((err) => !canceled && setError(err))
81
+ .then(() => loadingObservable.stopChildLoading(token));
82
+ return () => {
83
+ canceled = true;
84
+ loadingObservable.stopChildLoading(token);
85
+ };
86
+ }, [api, lang, loadingObservable, params, setError]);
87
+ return response;
88
+ }
89
+ export const Exerciser = (props) => {
90
+ const { action } = props.exerciserState;
91
+ const loadingObservable = useMemo(() => new AggregatedLoadingObservable(), []);
92
+ const [loading] = useObservableState(loadingObservable, false);
93
+ const [productIterator, setProductIterator] = useState();
94
+ const [logMessageCount, setLogMessageCount] = useState(() => new Map());
95
+ const [reportItems, setReportItems] = useState([]);
96
+ const [filteredReportItems, setFilteredReportItems] = useState([]);
97
+ useEffect(() => {
98
+ setLogMessageCount(new Map());
99
+ setReportItems([]);
100
+ setFilteredReportItems([]);
101
+ // eslint-disable-next-line react-hooks/exhaustive-deps
102
+ }, [productIterator]);
103
+ const addLogMessages = useCallback((logMessages) => {
104
+ setLogMessageCount((p) => {
105
+ const n = new Map(p.entries());
106
+ for (const logMessage of logMessages) {
107
+ const hash = logMessage.levelMessageHash;
108
+ let item = n.get(hash);
109
+ if (item === undefined) {
110
+ item = {
111
+ level: logMessage.level,
112
+ message: `${logMessage.message}`,
113
+ count: 0,
114
+ };
115
+ n.set(hash, item);
116
+ }
117
+ item.count++;
118
+ }
119
+ return n;
120
+ });
121
+ }, []);
122
+ const addErrorReportItem = useCallback((e) => {
123
+ setReportItems((p) => {
124
+ const message = {
125
+ productUrl: "",
126
+ logMessages: [new LogMessage(LogLevel.Error, `${e}`, [])],
127
+ randId: Math.random(),
128
+ duration: 0,
129
+ };
130
+ addLogMessages(message.logMessages);
131
+ return p.concat(message);
132
+ });
133
+ }, [addLogMessages]);
134
+ const addReportItem = useCallback((item) => {
135
+ addLogMessages(item.logMessages);
136
+ setReportItems((p) => {
137
+ return p.concat(item);
138
+ });
139
+ }, [addLogMessages]);
140
+ return (React.createElement("div", { className: "cfgExerciser cfgExerciserColumn" },
141
+ React.createElement("div", { className: "cfgExerciserView" },
142
+ React.createElement("h1", null,
143
+ "Exerciser ",
144
+ loading && React.createElement(Loading, { className: "cfgFontSize10", small: true }))),
145
+ React.createElement("div", { className: "cfgExerciserRow" },
146
+ React.createElement("div", { className: "cfgExerciserColumn" },
147
+ React.createElement(ExerciserSetup, Object.assign({}, props, { loadingObservable: loadingObservable, setProductIterator: setProductIterator }))),
148
+ action === "run" && productIterator && (React.createElement("div", { className: "cfgExerciserColumn" },
149
+ React.createElement(ExerciserRunner, { generateExerciserUrl: props.generateExerciserUrl, addErrorReportItem: addErrorReportItem, addReportItem: addReportItem, loadingObservable: loadingObservable, productIterator: productIterator })))),
150
+ action === "run" && (React.createElement(React.Fragment, null,
151
+ React.createElement("div", { className: "cfgExerciserView cfgExerciserRow" },
152
+ React.createElement(ExerciserReportFilterView, { allReportItems: reportItems, logMessageMap: logMessageCount, setFilteredReportItems: setFilteredReportItems })),
153
+ React.createElement("div", { className: "cfgExerciserView cfgExerciserRow" },
154
+ React.createElement(ExerciserReportView, { items: filteredReportItems }))))));
155
+ };
@@ -1,10 +1,10 @@
1
- import React from "react";
2
- import { ExerciserReportItem } from "./ExerciserReportItem.js";
3
- import { ExerciserLogMessagesMap } from "./ExerciserRun.js";
4
- export declare const ExerciserReportFilterView: React.FC<{
5
- className?: string;
6
- allReportItems: ExerciserReportItem[];
7
- logMessageMap: ExerciserLogMessagesMap;
8
- setFilteredReportItems: React.Dispatch<React.SetStateAction<ExerciserReportItem[]>>;
9
- }>;
1
+ import React from "react";
2
+ import { ExerciserReportItem } from "./ExerciserReportItem.js";
3
+ import { ExerciserLogMessagesMap } from "./ExerciserRun.js";
4
+ export declare const ExerciserReportFilterView: React.FC<{
5
+ className?: string;
6
+ allReportItems: ExerciserReportItem[];
7
+ logMessageMap: ExerciserLogMessagesMap;
8
+ setFilteredReportItems: React.Dispatch<React.SetStateAction<ExerciserReportItem[]>>;
9
+ }>;
10
10
  //# sourceMappingURL=ExerciserReportFilterView.d.ts.map