dotdata_widgets 0.0.28-dev.70.bfd2f27f

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 (91) hide show
  1. package/README.md +86 -0
  2. package/css/colors.css +124 -0
  3. package/css/typography.css +44 -0
  4. package/css/widget.css +87 -0
  5. package/dist/index.js +76 -0
  6. package/lib/components/accordion/Accordion.js +51 -0
  7. package/lib/components/accordion/index.js +18 -0
  8. package/lib/extension.js +31 -0
  9. package/lib/feature/feature-details/FeatureCorrelatedFeaturesTable.js +22 -0
  10. package/lib/feature/feature-details/FeatureDistributionChart.js +218 -0
  11. package/lib/feature/feature-details/FeatureStatisticsTable.js +44 -0
  12. package/lib/feature/feature-details/index.js +20 -0
  13. package/lib/feature/feature-explanation/FeatureExplanation.js +52 -0
  14. package/lib/feature/feature-explanation/components/ColoredExplanationBlock.js +30 -0
  15. package/lib/feature/feature-explanation/components/ColumnExplanationBlock.js +11 -0
  16. package/lib/feature/feature-explanation/components/DataSlotExplanationBlock.js +11 -0
  17. package/lib/feature/feature-explanation/components/PetExplanationBlock.js +11 -0
  18. package/lib/feature/feature-explanation/components/TextExplanationBlock.js +12 -0
  19. package/lib/feature/feature-explanation/components/TextWithDataSlotContextExplanationBlock.js +10 -0
  20. package/lib/feature/feature-explanation/components/TopicExplanationBlock.js +10 -0
  21. package/lib/feature/feature-explanation/components/UnknownExplanationBlock.js +10 -0
  22. package/lib/feature/feature-likes/feature-likes.js +44 -0
  23. package/lib/feature/feature-likes/index.js +18 -0
  24. package/lib/feature-descriptor/domains-descriptions-tree/components/column-tree-item.js +16 -0
  25. package/lib/feature-descriptor/domains-descriptions-tree/components/descriptions-tree-item.js +51 -0
  26. package/lib/feature-descriptor/domains-descriptions-tree/components/index.js +18 -0
  27. package/lib/feature-descriptor/domains-descriptions-tree/components/tree-item-label.js +54 -0
  28. package/lib/feature-descriptor/domains-descriptions-tree/components/type-tree-item.js +19 -0
  29. package/lib/feature-descriptor/domains-descriptions-tree/config/index.js +11 -0
  30. package/lib/feature-descriptor/domains-descriptions-tree/context/domains-descriptions-selection-context.js +54 -0
  31. package/lib/feature-descriptor/domains-descriptions-tree/context/domains-descriptions-tree-config-context.js +42 -0
  32. package/lib/feature-descriptor/domains-descriptions-tree/context/domains-descriptions-tree-item-selection-context.js +56 -0
  33. package/lib/feature-descriptor/domains-descriptions-tree/context/index.js +20 -0
  34. package/lib/feature-descriptor/domains-descriptions-tree/domains-descriptions-tree.js +44 -0
  35. package/lib/feature-descriptor/domains-descriptions-tree/index.js +21 -0
  36. package/lib/feature-descriptor/domains-descriptions-tree/models/domains-descriptions-tree.model.js +37 -0
  37. package/lib/feature-descriptor/domains-descriptions-tree/models/index.js +18 -0
  38. package/lib/feature-descriptor/domains-descriptions-tree/utils/create-domain-predicate.js +16 -0
  39. package/lib/feature-descriptor/domains-descriptions-tree/utils/filter-domains-descriptions-tree.js +23 -0
  40. package/lib/feature-descriptor/domains-descriptions-tree/utils/index.js +19 -0
  41. package/lib/feature-descriptor/feature-exploration-path/exploration-path-header.js +38 -0
  42. package/lib/feature-descriptor/feature-exploration-path/exploration-path-join-list.js +28 -0
  43. package/lib/feature-descriptor/feature-exploration-path/index.js +19 -0
  44. package/lib/index.js +21 -0
  45. package/lib/models/column/column.js +3 -0
  46. package/lib/models/column/index.js +18 -0
  47. package/lib/models/feature/feature-histogram.js +20 -0
  48. package/lib/models/feature/feature-metric.js +16 -0
  49. package/lib/models/feature/feature.js +3 -0
  50. package/lib/models/feature/index.js +20 -0
  51. package/lib/models/feature-descriptor-domain/fd-domains-description.js +15 -0
  52. package/lib/models/feature-descriptor-domain/fd-join-description.js +3 -0
  53. package/lib/models/feature-descriptor-domain/index.js +19 -0
  54. package/lib/models/feature-explanation/feature-explanation.model.js +30 -0
  55. package/lib/models/feature-explanation/index.js +18 -0
  56. package/lib/models/feature-leaderboard/feature-leaderboard.js +3 -0
  57. package/lib/models/feature-leaderboard/index.js +18 -0
  58. package/lib/models/feature-space/exploration-path.js +3 -0
  59. package/lib/models/feature-space/feature-space.js +3 -0
  60. package/lib/models/feature-space/grouped-domains-descriptions.js +3 -0
  61. package/lib/models/feature-space/index.js +20 -0
  62. package/lib/plugin.js +54 -0
  63. package/lib/utils/asserations.js +10 -0
  64. package/lib/utils/index.js +20 -0
  65. package/lib/utils/localize.js +18 -0
  66. package/lib/utils/model-transform-hook.js +21 -0
  67. package/lib/utils/object/extract-property.js +11 -0
  68. package/lib/utils/object/index.js +19 -0
  69. package/lib/utils/object/is-set.js +12 -0
  70. package/lib/utils/set.js +14 -0
  71. package/lib/utils/transducer.js +16 -0
  72. package/lib/utils/widget-model/index.js +19 -0
  73. package/lib/utils/widget-model/widget-model-context.js +42 -0
  74. package/lib/utils/widget-model/widget-model.js +30 -0
  75. package/lib/utils/widget-theme/index.js +18 -0
  76. package/lib/utils/widget-theme/widget-theme.js +99 -0
  77. package/lib/version.js +21 -0
  78. package/lib/widgets/FeatureLeaderboardWidget.js +61 -0
  79. package/lib/widgets/FeatureSpaceWidget.js +64 -0
  80. package/lib/widgets/feature-leaderboard/FeatureLeaderboardOverview.js +25 -0
  81. package/lib/widgets/feature-leaderboard/FeatureLeaderboardView.js +45 -0
  82. package/lib/widgets/feature-leaderboard/components/leaderboard-feature-likes.js +50 -0
  83. package/lib/widgets/feature-leaderboard/leaderboard-entry/FeatureLeaderboardEntry.js +19 -0
  84. package/lib/widgets/feature-leaderboard/leaderboard-entry/FeatureLeaderboardEntryDetails.js +23 -0
  85. package/lib/widgets/feature-leaderboard/leaderboard-entry/FeatureLeaderboardEntryRow.js +23 -0
  86. package/lib/widgets/feature-leaderboard/leaderboard-overview/overview-slider.js +62 -0
  87. package/lib/widgets/feature-space/FeatureDomainsDescriptions.js +74 -0
  88. package/lib/widgets/feature-space/FeatureExplorationPaths.js +16 -0
  89. package/lib/widgets/feature-space/FeatureSpaceView.js +52 -0
  90. package/lib/widgets/index.js +21 -0
  91. package/package.json +119 -0
@@ -0,0 +1,99 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.theme = void 0;
4
+ const styles_1 = require("@mui/material/styles");
5
+ const themeOptions = {
6
+ spacing: 4,
7
+ palette: {
8
+ primary: {
9
+ main: '#1976d2;', // --c-blue-700
10
+ },
11
+ },
12
+ typography: {
13
+ fontSize: 12,
14
+ },
15
+ components: {
16
+ MuiList: {
17
+ defaultProps: {
18
+ dense: true,
19
+ },
20
+ },
21
+ MuiMenuItem: {
22
+ defaultProps: {
23
+ dense: true,
24
+ },
25
+ },
26
+ MuiTable: {
27
+ defaultProps: {
28
+ size: 'small',
29
+ },
30
+ },
31
+ MuiButton: {
32
+ defaultProps: {
33
+ size: 'small',
34
+ },
35
+ },
36
+ MuiButtonGroup: {
37
+ defaultProps: {
38
+ size: 'small',
39
+ },
40
+ },
41
+ MuiCheckbox: {
42
+ defaultProps: {
43
+ // size: 'small',
44
+ },
45
+ },
46
+ MuiFab: {
47
+ defaultProps: {
48
+ size: 'small',
49
+ },
50
+ },
51
+ MuiFormControl: {
52
+ defaultProps: {
53
+ margin: 'dense',
54
+ size: 'small',
55
+ },
56
+ },
57
+ MuiFormHelperText: {
58
+ defaultProps: {
59
+ margin: 'dense',
60
+ },
61
+ },
62
+ MuiIconButton: {
63
+ defaultProps: {
64
+ size: 'small',
65
+ },
66
+ },
67
+ MuiInputBase: {
68
+ defaultProps: {
69
+ margin: 'dense',
70
+ },
71
+ },
72
+ MuiInputLabel: {
73
+ defaultProps: {
74
+ margin: 'dense',
75
+ },
76
+ },
77
+ MuiRadio: {
78
+ defaultProps: {
79
+ size: 'small',
80
+ },
81
+ },
82
+ MuiSwitch: {
83
+ defaultProps: {
84
+ size: 'small',
85
+ },
86
+ },
87
+ MuiTextField: {
88
+ defaultProps: {
89
+ margin: 'dense',
90
+ size: 'small',
91
+ },
92
+ },
93
+ },
94
+ shape: {
95
+ borderRadius: 4,
96
+ },
97
+ };
98
+ exports.theme = (0, styles_1.createTheme)(themeOptions);
99
+ //# sourceMappingURL=widget-theme.js.map
package/lib/version.js ADDED
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+ // Copyright (c) dotdata
3
+ // Distributed under the terms of the Modified BSD License.
4
+ Object.defineProperty(exports, "__esModule", { value: true });
5
+ exports.MODULE_NAME = exports.MODULE_VERSION = void 0;
6
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
7
+ // @ts-ignore
8
+ // eslint-disable-next-line @typescript-eslint/no-var-requires
9
+ const data = require('../package.json');
10
+ /**
11
+ * The _model_module_version/_view_module_version this package implements.
12
+ *
13
+ * The html widget manager assumes that this is the same as the npm package
14
+ * version number.
15
+ */
16
+ exports.MODULE_VERSION = data.version;
17
+ /*
18
+ * The current package name.
19
+ */
20
+ exports.MODULE_NAME = data.name;
21
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ // Copyright (c) dotdata
3
+ // Distributed under the terms of the Modified BSD License.
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.FeatureLeaderboardWidgetView = exports.FeatureLeaderboardWidgetModel = void 0;
9
+ const react_1 = __importDefault(require("react"));
10
+ const react_dom_1 = __importDefault(require("react-dom"));
11
+ const base_1 = require("@jupyter-widgets/base");
12
+ const version_1 = require("../version");
13
+ const FeatureLeaderboardView_1 = require("./feature-leaderboard/FeatureLeaderboardView");
14
+ const widget_model_1 = require("../utils/widget-model");
15
+ const defaultState = {
16
+ value: { allEntries: [] },
17
+ confidence: 0.95,
18
+ max_collinearity: 0.95,
19
+ liked_features: [],
20
+ disliked_features: [],
21
+ };
22
+ class FeatureLeaderboardWidgetModel extends base_1.DOMWidgetModel {
23
+ defaults() {
24
+ return {
25
+ ...super.defaults(),
26
+ _model_name: FeatureLeaderboardWidgetModel.model_name,
27
+ _model_module: FeatureLeaderboardWidgetModel.model_module,
28
+ _model_module_version: FeatureLeaderboardWidgetModel.model_module_version,
29
+ _view_name: FeatureLeaderboardWidgetModel.view_name,
30
+ _view_module: FeatureLeaderboardWidgetModel.view_module,
31
+ _view_module_version: FeatureLeaderboardWidgetModel.view_module_version,
32
+ ...defaultState,
33
+ };
34
+ }
35
+ }
36
+ exports.FeatureLeaderboardWidgetModel = FeatureLeaderboardWidgetModel;
37
+ FeatureLeaderboardWidgetModel.serializers = {
38
+ ...base_1.DOMWidgetModel.serializers,
39
+ };
40
+ FeatureLeaderboardWidgetModel.model_name = 'FeatureLeaderboardWidgetModel';
41
+ FeatureLeaderboardWidgetModel.model_module = version_1.MODULE_NAME;
42
+ FeatureLeaderboardWidgetModel.model_module_version = version_1.MODULE_VERSION;
43
+ FeatureLeaderboardWidgetModel.view_name = 'FeatureLeaderboardWidgetView'; // Set to null if no view
44
+ FeatureLeaderboardWidgetModel.view_module = version_1.MODULE_NAME; // Set to null if no view
45
+ FeatureLeaderboardWidgetModel.view_module_version = version_1.MODULE_VERSION;
46
+ class FeatureLeaderboardWidgetView extends base_1.DOMWidgetView {
47
+ render() {
48
+ this.el.classList.add('dotdata-widget');
49
+ try {
50
+ const component = react_1.default.createElement((0, widget_model_1.WidgetModelContextProvider)(FeatureLeaderboardView_1.FeatureLeaderboardView), {
51
+ model: this.model,
52
+ });
53
+ react_dom_1.default.render(component, this.el);
54
+ }
55
+ catch (err) {
56
+ console.error('FeatureSpaceWidgetView', err);
57
+ }
58
+ }
59
+ }
60
+ exports.FeatureLeaderboardWidgetView = FeatureLeaderboardWidgetView;
61
+ //# sourceMappingURL=FeatureLeaderboardWidget.js.map
@@ -0,0 +1,64 @@
1
+ "use strict";
2
+ // Copyright (c) dotdata
3
+ // Distributed under the terms of the Modified BSD License.
4
+ var __importDefault = (this && this.__importDefault) || function (mod) {
5
+ return (mod && mod.__esModule) ? mod : { "default": mod };
6
+ };
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.FeatureSpaceWidgetView = exports.FeatureSpaceWidgetModel = void 0;
9
+ const react_1 = __importDefault(require("react"));
10
+ const react_dom_1 = __importDefault(require("react-dom"));
11
+ const base_1 = require("@jupyter-widgets/base");
12
+ const version_1 = require("../version");
13
+ const FeatureSpaceView_1 = require("./feature-space/FeatureSpaceView");
14
+ const widget_model_1 = require("../utils/widget-model");
15
+ const defaultState = {
16
+ value: {
17
+ explorationPaths: [],
18
+ filters: { types: [] },
19
+ aggregations: { types: [] },
20
+ },
21
+ _selected_filters: [],
22
+ _selected_aggregations: [],
23
+ configuration: { selectable: true, disabled: false },
24
+ };
25
+ class FeatureSpaceWidgetModel extends base_1.DOMWidgetModel {
26
+ defaults() {
27
+ return {
28
+ ...super.defaults(),
29
+ _model_name: FeatureSpaceWidgetModel.model_name,
30
+ _model_module: FeatureSpaceWidgetModel.model_module,
31
+ _model_module_version: FeatureSpaceWidgetModel.model_module_version,
32
+ _view_name: FeatureSpaceWidgetModel.view_name,
33
+ _view_module: FeatureSpaceWidgetModel.view_module,
34
+ _view_module_version: FeatureSpaceWidgetModel.view_module_version,
35
+ ...defaultState,
36
+ };
37
+ }
38
+ }
39
+ exports.FeatureSpaceWidgetModel = FeatureSpaceWidgetModel;
40
+ FeatureSpaceWidgetModel.serializers = {
41
+ ...base_1.DOMWidgetModel.serializers,
42
+ };
43
+ FeatureSpaceWidgetModel.model_name = 'FeatureSpaceWidgetModel';
44
+ FeatureSpaceWidgetModel.model_module = version_1.MODULE_NAME;
45
+ FeatureSpaceWidgetModel.model_module_version = version_1.MODULE_VERSION;
46
+ FeatureSpaceWidgetModel.view_name = 'FeatureSpaceWidgetView'; // Set to null if no view
47
+ FeatureSpaceWidgetModel.view_module = version_1.MODULE_NAME; // Set to null if no view
48
+ FeatureSpaceWidgetModel.view_module_version = version_1.MODULE_VERSION;
49
+ class FeatureSpaceWidgetView extends base_1.DOMWidgetView {
50
+ render() {
51
+ this.el.classList.add('dotdata-widget');
52
+ try {
53
+ const component = react_1.default.createElement((0, widget_model_1.WidgetModelContextProvider)(FeatureSpaceView_1.FeatureSpaceView), {
54
+ model: this.model,
55
+ });
56
+ react_dom_1.default.render(component, this.el);
57
+ }
58
+ catch (e) {
59
+ console.error('FeatureSpaceWidgetView', e);
60
+ }
61
+ }
62
+ }
63
+ exports.FeatureSpaceWidgetView = FeatureSpaceWidgetView;
64
+ //# sourceMappingURL=FeatureSpaceWidget.js.map
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FeatureLeaderboardOverview = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const overview_slider_1 = require("./leaderboard-overview/overview-slider");
9
+ const material_1 = require("@mui/material");
10
+ const MAX_COLLINEARITY_TOOLTIP = 'Maximum correlation of any two features on the list';
11
+ const CONFIDENCE_TOOLTIP = 'The probability that a feature is better than a random feature';
12
+ const FeatureLeaderboardOverview = ({ isAssessed, confidence, setConfidence, maxCollinearity, setMaxCollinearity, setSearch, }) => {
13
+ const [searchPhrase, setSearchPhrase] = react_1.default.useState(() => '');
14
+ return (react_1.default.createElement("div", { style: { display: 'flex' } },
15
+ isAssessed ? (react_1.default.createElement(react_1.default.Fragment, null,
16
+ react_1.default.createElement(overview_slider_1.OverviewSlider, { value: maxCollinearity, setValue: setMaxCollinearity, label: "Max collinearity:", labelTooltip: MAX_COLLINEARITY_TOOLTIP }),
17
+ react_1.default.createElement(overview_slider_1.OverviewSlider, { value: confidence, setValue: setConfidence, label: "Confidence:", labelTooltip: CONFIDENCE_TOOLTIP }))) : null,
18
+ react_1.default.createElement("span", { style: { marginLeft: 'auto' } },
19
+ react_1.default.createElement(material_1.TextField, { sx: { top: '-8px' }, size: "small", label: "Search", type: "search", variant: "standard", margin: "dense", value: searchPhrase, onChange: e => {
20
+ setSearchPhrase(e.target.value);
21
+ setSearch(e.target.value);
22
+ } }))));
23
+ };
24
+ exports.FeatureLeaderboardOverview = FeatureLeaderboardOverview;
25
+ //# sourceMappingURL=FeatureLeaderboardOverview.js.map
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FeatureLeaderboardView = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const material_1 = require("@mui/material");
9
+ const _utils_1 = require("../../utils");
10
+ const widget_theme_1 = require("../../utils/widget-theme");
11
+ const widget_model_1 = require("../../utils/widget-model");
12
+ const transducer_1 = require("../../utils/transducer");
13
+ const FeatureLeaderboardOverview_1 = require("./FeatureLeaderboardOverview");
14
+ const FeatureLeaderboardEntry_1 = require("./leaderboard-entry/FeatureLeaderboardEntry");
15
+ const FeatureLeaderboardEntryRow_1 = require("./leaderboard-entry/FeatureLeaderboardEntryRow");
16
+ const FeatureLeaderboardView = ({ model }) => {
17
+ const [featureLeaderboard] = (0, widget_model_1.useModelState)('value');
18
+ const isAssessed = (0, _utils_1.isNotSet)(featureLeaderboard.isAssessed) || featureLeaderboard.isAssessed;
19
+ const [confidence, setConfidence] = (0, widget_model_1.useModelState)('confidence');
20
+ const [maxCollinearity, setMaxCollinearity] = (0, widget_model_1.useModelState)('max_collinearity');
21
+ const [explanationSearch, setExplanationSearch] = react_1.default.useState(() => '');
22
+ const featureEntries = react_1.default.useMemo(() => filterFeatures(featureLeaderboard, maxCollinearity, confidence, explanationSearch, isAssessed), [maxCollinearity, confidence, explanationSearch, featureLeaderboard]);
23
+ return (react_1.default.createElement(material_1.ThemeProvider, { theme: widget_theme_1.theme },
24
+ react_1.default.createElement(FeatureLeaderboardOverview_1.FeatureLeaderboardOverview, { isAssessed: isAssessed, confidence: confidence, setConfidence: setConfidence, maxCollinearity: maxCollinearity, setMaxCollinearity: setMaxCollinearity, setSearch: setExplanationSearch }),
25
+ react_1.default.createElement("br", null),
26
+ react_1.default.createElement("div", { style: { display: 'inline-block', minWidth: '100%' } }, isAssessed
27
+ ? featureEntries.map(featureEntry => (react_1.default.createElement(FeatureLeaderboardEntry_1.FeatureLeaderboardEntry, { key: featureEntry.feature.id, featureEntry: featureEntry })))
28
+ : featureEntries.map(featureEntry => (react_1.default.createElement("div", { className: "feature-leaderboard-entry-row-wrapper", key: featureEntry.feature.id },
29
+ react_1.default.createElement(FeatureLeaderboardEntryRow_1.FeatureLeaderboardEntryRow, { feature: featureEntry.feature })))))));
30
+ };
31
+ exports.FeatureLeaderboardView = FeatureLeaderboardView;
32
+ function filterFeatures(featureLeaderboard, maxCollinearity, confidence, explanationSearchPhrase, isAssessed) {
33
+ const explanationSearchFilter = (entry) => !explanationSearchPhrase ||
34
+ entry.feature.explanation_str?.includes(explanationSearchPhrase);
35
+ const correlationFilter = (entry) => entry.maxAbsCorrelationOfSimplerFeature <= maxCollinearity;
36
+ const confidenceFilter = (entry) => entry.signalConfidence >= confidence;
37
+ const reduces = isAssessed
38
+ ? (0, transducer_1.compose)((0, transducer_1.filter)(explanationSearchFilter), (0, transducer_1.filter)(correlationFilter), (0, transducer_1.filter)(confidenceFilter))
39
+ : (0, transducer_1.compose)((0, transducer_1.filter)(explanationSearchFilter));
40
+ const aggregation = (a, b) => a.concat([b]);
41
+ return featureLeaderboard.allEntries
42
+ .flat()
43
+ .reduce(reduces(aggregation), []);
44
+ }
45
+ //# sourceMappingURL=FeatureLeaderboardView.js.map
@@ -0,0 +1,50 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LeaderBoardFeatureLikes = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const lodash_1 = require("lodash");
9
+ const widget_model_1 = require("../../../utils/widget-model");
10
+ const feature_likes_1 = require("../../../feature/feature-likes");
11
+ const LeaderBoardFeatureLikes = ({ featureId, }) => {
12
+ const [likedFeatures, setLikedFeatures] = (0, widget_model_1.useModelState)('liked_features');
13
+ const [dislikedFeatures, setDislikedFeatures] = (0, widget_model_1.useModelState)('disliked_features');
14
+ const [liked, setLiked] = react_1.default.useState(() => feature_likes_1.FeatureLike.Neutral);
15
+ react_1.default.useEffect(() => {
16
+ const newState = likedFeatures.includes(featureId)
17
+ ? feature_likes_1.FeatureLike.Liked
18
+ : dislikedFeatures.includes(featureId)
19
+ ? feature_likes_1.FeatureLike.Disliked
20
+ : feature_likes_1.FeatureLike.Neutral;
21
+ setLiked(newState);
22
+ }, [likedFeatures, dislikedFeatures]);
23
+ function toggleIsLiked() {
24
+ if (liked === feature_likes_1.FeatureLike.Neutral) {
25
+ setLikedFeatures([...likedFeatures, featureId]);
26
+ }
27
+ if (liked === feature_likes_1.FeatureLike.Liked) {
28
+ setLikedFeatures((0, lodash_1.without)(likedFeatures, featureId));
29
+ }
30
+ if (liked === feature_likes_1.FeatureLike.Disliked) {
31
+ setDislikedFeatures((0, lodash_1.without)(dislikedFeatures, featureId));
32
+ setLikedFeatures([...likedFeatures, featureId]);
33
+ }
34
+ }
35
+ function toggleIsDisliked() {
36
+ if (liked === feature_likes_1.FeatureLike.Neutral) {
37
+ setDislikedFeatures([...dislikedFeatures, featureId]);
38
+ }
39
+ if (liked === feature_likes_1.FeatureLike.Disliked) {
40
+ setDislikedFeatures((0, lodash_1.without)(dislikedFeatures, featureId));
41
+ }
42
+ if (liked === feature_likes_1.FeatureLike.Liked) {
43
+ setLikedFeatures((0, lodash_1.without)(likedFeatures, featureId));
44
+ setDislikedFeatures([...dislikedFeatures, featureId]);
45
+ }
46
+ }
47
+ return (react_1.default.createElement(feature_likes_1.FeatureLikes, { liked: liked, toggleIsLiked: toggleIsLiked, toggleIsDisliked: toggleIsDisliked }));
48
+ };
49
+ exports.LeaderBoardFeatureLikes = LeaderBoardFeatureLikes;
50
+ //# sourceMappingURL=leaderboard-feature-likes.js.map
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FeatureLeaderboardEntry = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const accordion_1 = require("../../../components/accordion");
9
+ const FeatureLeaderboardEntryDetails_1 = require("./FeatureLeaderboardEntryDetails");
10
+ const FeatureLeaderboardEntryRow_1 = require("./FeatureLeaderboardEntryRow");
11
+ const FeatureLeaderboardEntry = ({ featureEntry }) => {
12
+ return (react_1.default.createElement(accordion_1.Accordion, { className: "feature-leaderboard-entry" },
13
+ react_1.default.createElement(accordion_1.AccordionHeader, null,
14
+ react_1.default.createElement(FeatureLeaderboardEntryRow_1.FeatureLeaderboardEntryRow, { feature: featureEntry.feature })),
15
+ react_1.default.createElement(accordion_1.AccordionDetails, null,
16
+ react_1.default.createElement(FeatureLeaderboardEntryDetails_1.FeatureLeaderboardEntryDetails, { entry: featureEntry }))));
17
+ };
18
+ exports.FeatureLeaderboardEntry = FeatureLeaderboardEntry;
19
+ //# sourceMappingURL=FeatureLeaderboardEntry.js.map
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FeatureLeaderboardEntryDetails = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const feature_details_1 = require("../../../feature/feature-details");
9
+ const FeatureLeaderboardEntryDetails = ({ entry }) => {
10
+ return (react_1.default.createElement("div", null,
11
+ react_1.default.createElement("div", { style: { display: 'flex', gap: '50px' } },
12
+ react_1.default.createElement("div", { className: "feature-metrics", style: { flex: 3 } },
13
+ react_1.default.createElement("h3", { className: "grey-label" }, "Feature Statistics:"),
14
+ react_1.default.createElement(feature_details_1.FeatureStatisticsTable, { statistics: entry.stats })),
15
+ react_1.default.createElement("div", { className: "feature-histogram", style: { flex: 1 } },
16
+ react_1.default.createElement("h3", { className: "grey-label" }, "Feature Distribution:"),
17
+ react_1.default.createElement(feature_details_1.FeatureDistributionChart, { histogram: entry.histogram }))),
18
+ react_1.default.createElement("div", { className: "correlated-features" },
19
+ react_1.default.createElement("h3", { className: "grey-label" }, "Correlated Features:"),
20
+ react_1.default.createElement(feature_details_1.FeatureCorrelatedFeaturesTable, { correlatedFeatures: entry.topCorrelatedFeatures }))));
21
+ };
22
+ exports.FeatureLeaderboardEntryDetails = FeatureLeaderboardEntryDetails;
23
+ //# sourceMappingURL=FeatureLeaderboardEntryDetails.js.map
@@ -0,0 +1,23 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FeatureLeaderboardEntryRow = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const FeatureExplanation_1 = require("../../../feature/feature-explanation/FeatureExplanation");
9
+ const leaderboard_feature_likes_1 = require("../components/leaderboard-feature-likes");
10
+ const featureNameLabelStyle = {
11
+ color: 'var(--c-grey-600)',
12
+ display: 'inline-block',
13
+ minWidth: '5rem',
14
+ };
15
+ const FeatureLeaderboardEntryRow = ({ feature }) => {
16
+ return (react_1.default.createElement("div", { className: "feature-leaderboard-entry-row" },
17
+ react_1.default.createElement("span", { className: "label-bold", style: featureNameLabelStyle }, feature.id),
18
+ react_1.default.createElement(FeatureExplanation_1.FeatureExplanation, { key: feature.id, explanationBlocks: feature.explanation.tokens }),
19
+ react_1.default.createElement("div", { style: { marginLeft: 'auto', display: 'flex', gap: '5px' } },
20
+ react_1.default.createElement(leaderboard_feature_likes_1.LeaderBoardFeatureLikes, { featureId: feature.id }))));
21
+ };
22
+ exports.FeatureLeaderboardEntryRow = FeatureLeaderboardEntryRow;
23
+ //# sourceMappingURL=FeatureLeaderboardEntryRow.js.map
@@ -0,0 +1,62 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.OverviewSlider = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const material_1 = require("@mui/material");
9
+ const MIN = 0;
10
+ const MAX = 1;
11
+ const STEP = 0.01;
12
+ const OverviewSlider = ({ value, setValue, label, labelTooltip, }) => {
13
+ const [localValue, setLocalValue] = react_1.default.useState(() => value);
14
+ react_1.default.useEffect(() => {
15
+ // !compare only value not types
16
+ // eslint-disable-next-line eqeqeq
17
+ if (localValue != value) {
18
+ setLocalValue(value);
19
+ }
20
+ }, [value]);
21
+ function onInputBlur() {
22
+ const val = Math.max(MIN, Math.min(MAX, Number(localValue)));
23
+ setLocalValue(val);
24
+ setNewValue(val);
25
+ }
26
+ function handleInputChange(event) {
27
+ setLocalValue(event.target.value);
28
+ setNewValue(event.target.value);
29
+ }
30
+ function setNewValue(v) {
31
+ const val = Number(v);
32
+ if (val !== value) {
33
+ setValue(val);
34
+ }
35
+ }
36
+ return (react_1.default.createElement("div", { style: {
37
+ display: 'inline-flex',
38
+ minWidth: '400px',
39
+ alignItems: 'center',
40
+ gap: '8px',
41
+ } },
42
+ react_1.default.createElement(material_1.Grid, { item: true },
43
+ react_1.default.createElement(material_1.Tooltip, { title: labelTooltip, placement: "bottom" },
44
+ react_1.default.createElement("span", { className: "grey-label label-bold", style: { position: 'relative', top: '-3px' } }, label))),
45
+ react_1.default.createElement(material_1.Grid, { item: true, sx: { maxWidth: '200px', width: '100%' } },
46
+ react_1.default.createElement(material_1.Slider, { size: "small", step: STEP, min: MIN, max: MAX, value: sliderValue(localValue), onChange: (e, value) => {
47
+ setLocalValue(value);
48
+ setNewValue(value);
49
+ } })),
50
+ react_1.default.createElement(material_1.Grid, { item: true },
51
+ react_1.default.createElement(material_1.Input, { value: localValue, size: "small", onChange: handleInputChange, onBlur: onInputBlur, inputProps: {
52
+ step: STEP,
53
+ min: MIN,
54
+ max: MAX,
55
+ type: 'number',
56
+ } }))));
57
+ };
58
+ exports.OverviewSlider = OverviewSlider;
59
+ function sliderValue(value) {
60
+ return Number(value);
61
+ }
62
+ //# sourceMappingURL=overview-slider.js.map
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || function (mod) {
19
+ if (mod && mod.__esModule) return mod;
20
+ var result = {};
21
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
22
+ __setModuleDefault(result, mod);
23
+ return result;
24
+ };
25
+ Object.defineProperty(exports, "__esModule", { value: true });
26
+ exports.FeatureDomainsDescriptions = void 0;
27
+ const react_1 = __importStar(require("react"));
28
+ const material_1 = require("@mui/material");
29
+ const domains_descriptions_tree_1 = require("../../feature-descriptor/domains-descriptions-tree");
30
+ const headerWrapperStyle = {
31
+ display: 'flex',
32
+ justifyContent: 'space-between',
33
+ alignItems: 'center',
34
+ width: '100%',
35
+ };
36
+ const FeatureDomainsDescriptions = props => {
37
+ const [selectedDomains] = (0, domains_descriptions_tree_1.useDomainsDescriptionsTreeItemSelection)();
38
+ const [domainSearchValue, setDomainSearchValue] = (0, react_1.useState)(() => '');
39
+ const [numberOfDescriptions, setNumberOfDescriptions] = (0, react_1.useState)(() => 0);
40
+ const [searchedDomain, setSearchedDomain] = (0, react_1.useState)(() => props.descriptionsTree);
41
+ (0, react_1.useEffect)(() => {
42
+ setNumberOfDescriptions(calculateNumberOfDescriptions(props.descriptionsTree));
43
+ }, [props.descriptionsTree]);
44
+ (0, react_1.useEffect)(() => {
45
+ const selectedDomainFilter = (0, domains_descriptions_tree_1.createDomainPredicate)(selectedDomains, props.selectedJoinIds);
46
+ const domains = (0, domains_descriptions_tree_1.filterDomainsDescriptionsTree)(props.descriptionsTree, description => description.description
47
+ .toLowerCase()
48
+ .includes(domainSearchValue.toLowerCase()) &&
49
+ selectedDomainFilter(description));
50
+ setSearchedDomain(domains);
51
+ }, [
52
+ domainSearchValue,
53
+ selectedDomains,
54
+ props.selectedJoinIds,
55
+ props.descriptionsTree,
56
+ ]);
57
+ return (react_1.default.createElement(domains_descriptions_tree_1.DomainsDescriptionsTree, { descriptionsTree: searchedDomain },
58
+ react_1.default.createElement(domains_descriptions_tree_1.FeatureDomainDescriptionsTreeHeader, null,
59
+ react_1.default.createElement("div", { style: headerWrapperStyle },
60
+ react_1.default.createElement("h4", { style: { margin: 0 } },
61
+ props.domainName,
62
+ ": (",
63
+ numberOfDescriptions,
64
+ ")"),
65
+ react_1.default.createElement(material_1.TextField, { sx: { top: '-8px' }, size: "small", label: `Search for ${props.domainName.toLowerCase()}`, type: "search", variant: "standard", margin: "dense", value: domainSearchValue, onChange: e => setDomainSearchValue(e.target.value) })))));
66
+ };
67
+ exports.FeatureDomainsDescriptions = FeatureDomainsDescriptions;
68
+ function calculateNumberOfDescriptions(descriptionsTree) {
69
+ return descriptionsTree.types
70
+ .map(({ columns }) => columns.map(({ descriptions }) => descriptions.length))
71
+ .flat(3)
72
+ .reduce((a, b) => a + b, 0);
73
+ }
74
+ //# sourceMappingURL=FeatureDomainsDescriptions.js.map
@@ -0,0 +1,16 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FeatureExplorationPaths = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const feature_exploration_path_1 = require("../../feature-descriptor/feature-exploration-path");
9
+ const FeatureExplorationPaths = ({ explorationPaths, selectedJoinIds, setSelectedJoinIds }) => {
10
+ return (react_1.default.createElement(react_1.default.Fragment, null, explorationPaths.map((explorationPath, idx) => (react_1.default.createElement("div", { key: idx, className: "exploration-path" },
11
+ react_1.default.createElement(feature_exploration_path_1.ExplorationPathHeader, { explorationPath: explorationPath, explorationPathIndex: idx }),
12
+ react_1.default.createElement("div", { style: { paddingLeft: '16px' } },
13
+ react_1.default.createElement(feature_exploration_path_1.ExplorationPathJoinList, { joins: explorationPath.joins, selectedJoinIds: selectedJoinIds, setSelectedJoinIds: setSelectedJoinIds })))))));
14
+ };
15
+ exports.FeatureExplorationPaths = FeatureExplorationPaths;
16
+ //# sourceMappingURL=FeatureExplorationPaths.js.map
@@ -0,0 +1,52 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.FeatureSpaceView = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ const styles_1 = require("@mui/material/styles");
9
+ const material_1 = require("@mui/material");
10
+ const widget_model_1 = require("../../utils/widget-model");
11
+ const widget_theme_1 = require("../../utils/widget-theme");
12
+ const FeatureExplorationPaths_1 = require("./FeatureExplorationPaths");
13
+ const domains_descriptions_tree_1 = require("../../feature-descriptor/domains-descriptions-tree");
14
+ const FeatureDomainsDescriptions_1 = require("./FeatureDomainsDescriptions");
15
+ const Divider = () => (react_1.default.createElement("div", { style: {
16
+ height: '1px',
17
+ borderTop: '1px solid var(--c-grey-300)',
18
+ marginBlock: '24px',
19
+ } }));
20
+ const FeatureSpaceView = props => {
21
+ const [featureSpace] = (0, widget_model_1.useModelState)('value');
22
+ const [configuration] = (0, widget_model_1.useModelState)('configuration');
23
+ const selectedFiltersModel = (0, widget_model_1.useModelState)('_selected_filters');
24
+ const selectedAggregationsModel = (0, widget_model_1.useModelState)('_selected_aggregations');
25
+ const [selectedJoinIds, setSelectedJoinIds] = react_1.default.useState(() => []);
26
+ const [filterDescriptionsTree, setFilterDescriptionsTree] = react_1.default.useState(() => ({ types: [] }));
27
+ const [aggregationDescriptionsTree, setAggregationDescriptionsTree] = react_1.default.useState(() => ({ types: [] }));
28
+ react_1.default.useEffect(() => {
29
+ setFilterDescriptionsTree(domains_descriptions_tree_1.DescriptionsTree.appendGroupId(featureSpace.filters, 'f'));
30
+ }, [featureSpace.filters]);
31
+ react_1.default.useEffect(() => {
32
+ setAggregationDescriptionsTree(domains_descriptions_tree_1.DescriptionsTree.appendGroupId(featureSpace.aggregations, 'a'));
33
+ }, [featureSpace.aggregations]);
34
+ const descriptionTreeConfig = react_1.default.useMemo(() => ({
35
+ isWithCheckboxes: configuration.selectable,
36
+ areCheckboxesDisabled: configuration.disabled,
37
+ }), [configuration]);
38
+ return (react_1.default.createElement(styles_1.ThemeProvider, { theme: widget_theme_1.theme },
39
+ react_1.default.createElement(domains_descriptions_tree_1.DomainsDescriptionsTreeConfigContextProvider, { configuration: descriptionTreeConfig },
40
+ react_1.default.createElement(domains_descriptions_tree_1.DomainsDescriptionsTreeItemSelectionContextProvider, null,
41
+ react_1.default.createElement(FeatureExplorationPaths_1.FeatureExplorationPaths, { explorationPaths: featureSpace.explorationPaths, selectedJoinIds: selectedJoinIds, setSelectedJoinIds: setSelectedJoinIds }),
42
+ react_1.default.createElement(Divider, null),
43
+ react_1.default.createElement(material_1.Grid, { container: true, spacing: 6 },
44
+ react_1.default.createElement(material_1.Grid, { item: true, xs: 6 },
45
+ react_1.default.createElement(domains_descriptions_tree_1.DomainsDescriptionsSelectionContextProvider, { selectedDomainDescriptionIds: selectedFiltersModel[0], setSelectedDomainDescriptionIds: selectedFiltersModel[1] },
46
+ react_1.default.createElement(FeatureDomainsDescriptions_1.FeatureDomainsDescriptions, { domainName: "Filters", descriptionsTree: filterDescriptionsTree, selectedJoinIds: selectedJoinIds }))),
47
+ react_1.default.createElement(material_1.Grid, { item: true, xs: 6, sx: { overflow: 'hidden' } },
48
+ react_1.default.createElement(domains_descriptions_tree_1.DomainsDescriptionsSelectionContextProvider, { selectedDomainDescriptionIds: selectedAggregationsModel[0], setSelectedDomainDescriptionIds: selectedAggregationsModel[1] },
49
+ react_1.default.createElement(FeatureDomainsDescriptions_1.FeatureDomainsDescriptions, { domainName: "Aggregations", descriptionsTree: aggregationDescriptionsTree, selectedJoinIds: selectedJoinIds }))))))));
50
+ };
51
+ exports.FeatureSpaceView = FeatureSpaceView;
52
+ //# sourceMappingURL=FeatureSpaceView.js.map