asab_webui_shell 25.1.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.
Files changed (90) hide show
  1. package/CHANGELOG.md +218 -0
  2. package/LICENSE +28 -0
  3. package/README.md +3 -0
  4. package/dist/actions.js +22 -0
  5. package/dist/components/branding/BrandImage.js +72 -0
  6. package/dist/components/locationReplace.js +51 -0
  7. package/dist/config/ConfigReducer.js +22 -0
  8. package/dist/config/ConfigService.js +169 -0
  9. package/dist/containers/AdvancedMode/reducer.js +28 -0
  10. package/dist/containers/Alerts/alerts.scss +9 -0
  11. package/dist/containers/Alerts/index.js +81 -0
  12. package/dist/containers/Alerts/reducer.js +68 -0
  13. package/dist/containers/Application.js +773 -0
  14. package/dist/containers/Application.scss +104 -0
  15. package/dist/containers/AttentionRequired/reducer.js +30 -0
  16. package/dist/containers/FullscreenMode/reducer.js +28 -0
  17. package/dist/containers/Header/ApplicationScreenTitle/ApplicationScreenTitle.js +47 -0
  18. package/dist/containers/Header/ApplicationScreenTitle/ApplicationScreenTitle.scss +8 -0
  19. package/dist/containers/Header/ApplicationScreenTitle/index.js +31 -0
  20. package/dist/containers/Header/Help/HelpButton.js +58 -0
  21. package/dist/containers/Header/Help/HelpButton.scss +15 -0
  22. package/dist/containers/Header/Help/HelpService.js +34 -0
  23. package/dist/containers/Header/Preview/PreviewFlag.js +34 -0
  24. package/dist/containers/Header/Preview/PreviewService.js +34 -0
  25. package/dist/containers/Header/header.scss +24 -0
  26. package/dist/containers/Header/index.js +39 -0
  27. package/dist/containers/Header/reducer.js +53 -0
  28. package/dist/containers/Navigation/index.js +66 -0
  29. package/dist/containers/Navigation/reducer.js +56 -0
  30. package/dist/containers/RouteErrorHandler/ErrorContainer.js +46 -0
  31. package/dist/containers/RouteErrorHandler/index.js +80 -0
  32. package/dist/containers/Router/ApplicationRouter.js +78 -0
  33. package/dist/containers/Router/index.js +50 -0
  34. package/dist/containers/Router/reducer.js +28 -0
  35. package/dist/containers/Sidebar/NavbarBrand.js +59 -0
  36. package/dist/containers/Sidebar/SidebarBottomItem.js +55 -0
  37. package/dist/containers/Sidebar/SidebarIcon.js +21 -0
  38. package/dist/containers/Sidebar/SidebarItem.js +209 -0
  39. package/dist/containers/Sidebar/SidebarItemRenderer.js +30 -0
  40. package/dist/containers/Sidebar/index.js +86 -0
  41. package/dist/containers/Sidebar/reducer.js +35 -0
  42. package/dist/containers/Sidebar/sidebar.scss +176 -0
  43. package/dist/containers/Sidepanel/Sidepanel.js +60 -0
  44. package/dist/containers/Sidepanel/Sidepanel.scss +20 -0
  45. package/dist/containers/Toast/ToastComponent.js +31 -0
  46. package/dist/containers/Toast/ToastComponent.jsx +28 -0
  47. package/dist/containers/Toast/ToastContainer.js +80 -0
  48. package/dist/containers/Toast/ToastContainer.jsx +59 -0
  49. package/dist/containers/Toast/reducer.js +55 -0
  50. package/dist/containers/Toast/reducer.jsx +45 -0
  51. package/dist/index.js +48 -0
  52. package/dist/modules/about/AboutScreen.js +84 -0
  53. package/dist/modules/about/index.js +41 -0
  54. package/dist/modules/auth/actions.js +11 -0
  55. package/dist/modules/auth/api.js +214 -0
  56. package/dist/modules/auth/components/SessionExpirationAlert.js +35 -0
  57. package/dist/modules/auth/header.js +109 -0
  58. package/dist/modules/auth/header.scss +9 -0
  59. package/dist/modules/auth/index.js +761 -0
  60. package/dist/modules/auth/reducer.js +36 -0
  61. package/dist/modules/auth/screens/AccessControlScreen.js +78 -0
  62. package/dist/modules/auth/screens/InvitationScreen.js +161 -0
  63. package/dist/modules/i18n/actions.js +7 -0
  64. package/dist/modules/i18n/dropdown.js +77 -0
  65. package/dist/modules/i18n/index.js +44 -0
  66. package/dist/modules/i18n/reducer.js +26 -0
  67. package/dist/modules/i18n/service.js +158 -0
  68. package/dist/modules/tenant/TenantDropdown.js +53 -0
  69. package/dist/modules/tenant/access/AccessDeniedCard.js +107 -0
  70. package/dist/modules/tenant/access/AccessDeniedCard.scss +6 -0
  71. package/dist/modules/tenant/actions.js +10 -0
  72. package/dist/modules/tenant/index.js +41 -0
  73. package/dist/modules/tenant/reducer.js +26 -0
  74. package/dist/modules/tenant/service.js +228 -0
  75. package/dist/screens/InvalidRouteScreen.js +30 -0
  76. package/dist/screens/InvalidRouteScreen.scss +19 -0
  77. package/dist/screens/SuspenseScreen.js +43 -0
  78. package/dist/screens/SuspenseScreen.scss +9 -0
  79. package/dist/screens/UnauthorizedAccessScreen.js +79 -0
  80. package/dist/screens/UnauthorizedAccessScreen.scss +19 -0
  81. package/dist/services/AttentionRequiredService.js +169 -0
  82. package/dist/services/BrandingService.js +104 -0
  83. package/dist/services/HeaderService.js +84 -0
  84. package/dist/services/ReduxService.js +25 -0
  85. package/dist/services/TitleService.js +45 -0
  86. package/dist/theme/ThemeButton.js +39 -0
  87. package/dist/theme/ThemeReducer.js +20 -0
  88. package/dist/theme/ThemeService.js +52 -0
  89. package/dist/theme/actions.js +7 -0
  90. package/package.json +41 -0
@@ -0,0 +1,209 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.SidebarItem = exports.SidebarCollapsibleItem = void 0;
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+ var _react = _interopRequireWildcard(require("react"));
12
+ var _reactRouter = require("react-router");
13
+ var _reactRouterDom = require("react-router-dom");
14
+ var _reactI18next = require("react-i18next");
15
+ var _reactRedux = require("react-redux");
16
+ var _reactstrap = require("reactstrap");
17
+ var _asab_webui_components = require("asab_webui_components");
18
+ var _SidebarIcon = _interopRequireDefault(require("./SidebarIcon"));
19
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
20
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
21
+ function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
22
+ function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
23
+ function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
24
+ var SidebarItem = exports.SidebarItem = function SidebarItem(_ref) {
25
+ var _item$name;
26
+ var item = _ref.item,
27
+ disabled = _ref.disabled,
28
+ isOpen = _ref.isOpen,
29
+ setOpen = _ref.setOpen,
30
+ isSmallResolution = _ref.isSmallResolution,
31
+ _ref$beacon = _ref.beacon,
32
+ beacon = _ref$beacon === void 0 ? undefined : _ref$beacon;
33
+ var location = (0, _reactRouter.useLocation)();
34
+ var _useTranslation = (0, _reactI18next.useTranslation)(),
35
+ t = _useTranslation.t;
36
+ var isSidebarCollapsed = (0, _reactRedux.useSelector)(function (state) {
37
+ var _state$sidebar;
38
+ return (_state$sidebar = state.sidebar) === null || _state$sidebar === void 0 ? void 0 : _state$sidebar.isSidebarCollapsed;
39
+ });
40
+ var attentionRequired = (0, _reactRedux.useSelector)(function (state) {
41
+ var _state$attentionrequi;
42
+ return (_state$attentionrequi = state.attentionrequired) === null || _state$attentionrequi === void 0 ? void 0 : _state$attentionrequi.beacon;
43
+ });
44
+ var _useState = (0, _react.useState)(false),
45
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
46
+ isActive = _useState2[0],
47
+ setActive = _useState2[1];
48
+ var lowercasedItemName = item === null || item === void 0 || (_item$name = item.name) === null || _item$name === void 0 ? void 0 : _item$name.toLowerCase();
49
+ // Attention requred flag
50
+ var itemBeacon = beacon ? beacon["beacon.".concat(lowercasedItemName)] : attentionRequired["beacon.".concat(lowercasedItemName)];
51
+ (0, _react.useEffect)(function () {
52
+ if (isOpen && !isActive) {
53
+ setOpen(false);
54
+ }
55
+ setActive(item.url && (location.pathname === item.url || location.pathname.startsWith(item.url + '/')) ? true : false);
56
+ }, [location]);
57
+ return /*#__PURE__*/_react["default"].createElement("div", {
58
+ className: "nav-item"
59
+ }, /*#__PURE__*/_react["default"].createElement(_reactRouterDom.Link, {
60
+ disabled: disabled,
61
+ to: item.url,
62
+ title: t("Sidebar|".concat(item.name)),
63
+ className: "nav-link" + (isActive ? " active" : "")
64
+ }, !isSidebarCollapsed || isSmallResolution ?
65
+ /*#__PURE__*/
66
+ //hide item.name if sidebar is collapsed
67
+ _react["default"].createElement("div", {
68
+ className: "d-flex align-items-center"
69
+ }, /*#__PURE__*/_react["default"].createElement("div", {
70
+ className: "sidebar-item-name d-flex align-items-center flex-grow-1"
71
+ }, /*#__PURE__*/_react["default"].createElement(_SidebarIcon["default"], {
72
+ icon: item.icon,
73
+ className: "pe-2"
74
+ }), /*#__PURE__*/_react["default"].createElement("span", {
75
+ className: "sidebar-item-name"
76
+ }, t("Sidebar|".concat(item.name)))), itemBeacon && /*#__PURE__*/_react["default"].createElement(_asab_webui_components.AttentionBadge, {
77
+ className: "sidebar-badge-collapsed",
78
+ content: itemBeacon
79
+ })) : /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement(_SidebarIcon["default"], {
80
+ icon: item.icon,
81
+ className: "pe-2"
82
+ }), itemBeacon && /*#__PURE__*/_react["default"].createElement(_asab_webui_components.AttentionBadge, {
83
+ className: "sidebar-badge-collapsed",
84
+ content: itemBeacon
85
+ }))));
86
+ };
87
+ var SidebarCollapsibleItem = exports.SidebarCollapsibleItem = function SidebarCollapsibleItem(_ref2) {
88
+ var item = _ref2.item,
89
+ disabled = _ref2.disabled,
90
+ isSmallResolution = _ref2.isSmallResolution;
91
+ var _useState3 = (0, _react.useState)(false),
92
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
93
+ isOpen = _useState4[0],
94
+ setOpen = _useState4[1];
95
+ var location = (0, _reactRouter.useLocation)();
96
+ var _useTranslation2 = (0, _reactI18next.useTranslation)(),
97
+ t = _useTranslation2.t;
98
+ var isSidebarCollapsed = (0, _reactRedux.useSelector)(function (state) {
99
+ var _state$sidebar2;
100
+ return (_state$sidebar2 = state.sidebar) === null || _state$sidebar2 === void 0 ? void 0 : _state$sidebar2.isSidebarCollapsed;
101
+ });
102
+ var attentionRequired = (0, _reactRedux.useSelector)(function (state) {
103
+ var _state$attentionrequi2;
104
+ return (_state$attentionrequi2 = state.attentionrequired) === null || _state$attentionrequi2 === void 0 ? void 0 : _state$attentionrequi2.beacon;
105
+ });
106
+ var lowercasedItemName = item.name.toLowerCase();
107
+
108
+ // Attention required flag
109
+ var itemsBeacon = parentBeacon(attentionRequired, "beacon.".concat(lowercasedItemName), lowercasedItemName);
110
+ // Summarize parent beacon count based on children
111
+ var beaconCount = itemsBeacon && Object.keys(itemsBeacon).length > 0 ? Object.values(itemsBeacon).reduce(function (sum, current) {
112
+ return sum + (current.count || 0); // Ensure we sum only valid count values
113
+ }, 0) : 0;
114
+
115
+ // Should collapsed item uncollapse
116
+ (0, _react.useEffect)(function () {
117
+ if (item.children && !isOpen) {
118
+ var _iterator = _createForOfIteratorHelper(item.children),
119
+ _step;
120
+ try {
121
+ for (_iterator.s(); !(_step = _iterator.n()).done;) {
122
+ var child = _step.value;
123
+ if (location.pathname.includes(child.url)) {
124
+ setOpen(true);
125
+ break;
126
+ }
127
+ }
128
+ } catch (err) {
129
+ _iterator.e(err);
130
+ } finally {
131
+ _iterator.f();
132
+ }
133
+ }
134
+ }, [isOpen]);
135
+ var onClickOpen = function onClickOpen(e) {
136
+ e.preventDefault();
137
+ setOpen(!isOpen);
138
+ };
139
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", {
140
+ className: "nav-item sidebar-collapsible" + (isOpen ? " open" : "")
141
+ }, /*#__PURE__*/_react["default"].createElement("a", {
142
+ onClick: onClickOpen,
143
+ title: t("Sidebar|".concat(item.name)),
144
+ className: "d-flex align-items-center nav-link" + (isOpen ? " open" : ""),
145
+ href: "#"
146
+ }, !isSidebarCollapsed || isSmallResolution ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("span", {
147
+ className: "d-flex flex-column justify-content-center align-items-center pe-2"
148
+ }, /*#__PURE__*/_react["default"].createElement(_SidebarIcon["default"], {
149
+ icon: item.icon
150
+ }), /*#__PURE__*/_react["default"].createElement("i", {
151
+ className: "bi bi-chevron-down"
152
+ })), /*#__PURE__*/_react["default"].createElement("span", {
153
+ className: "sidebar-item-name"
154
+ }, t("Sidebar|".concat(item.name))), /*#__PURE__*/_react["default"].createElement("div", {
155
+ className: "ms-auto"
156
+ }, " ", beaconCount > 0 && /*#__PURE__*/_react["default"].createElement(_asab_webui_components.AttentionBadge, {
157
+ className: "sidebar-badge-collapsed",
158
+ content: {
159
+ count: beaconCount
160
+ }
161
+ }))) : /*#__PURE__*/_react["default"].createElement("div", {
162
+ className: "d-flex flex-column justify-content-center align-items-center"
163
+ }, /*#__PURE__*/_react["default"].createElement("span", {
164
+ className: "d-flex flex-column justify-content-center align-items-center"
165
+ }, /*#__PURE__*/_react["default"].createElement(_SidebarIcon["default"], {
166
+ icon: item.icon
167
+ }), /*#__PURE__*/_react["default"].createElement("i", {
168
+ className: "bi bi-chevron-down"
169
+ }), " "), beaconCount > 0 && /*#__PURE__*/_react["default"].createElement("div", {
170
+ className: "mt-1 w-100 justify-content-center d-flex"
171
+ }, /*#__PURE__*/_react["default"].createElement(_asab_webui_components.AttentionBadge, {
172
+ className: "sidebar-badge-collapsed",
173
+ content: {
174
+ count: beaconCount
175
+ }
176
+ }))))), /*#__PURE__*/_react["default"].createElement(_reactstrap.Collapse, {
177
+ isOpen: isOpen,
178
+ className: "sidebar-collapse"
179
+ }, item.children.map(function (child, idx) {
180
+ var _child$name;
181
+ return /*#__PURE__*/_react["default"].createElement(SidebarItem, {
182
+ key: idx,
183
+ item: child,
184
+ disabled: disabled,
185
+ isOpen: isOpen,
186
+ setOpen: setOpen,
187
+ isSmallResolution: isSmallResolution,
188
+ beacon: itemsBeacon["beacon.".concat(child === null || child === void 0 || (_child$name = child.name) === null || _child$name === void 0 ? void 0 : _child$name.toLowerCase())] && childBeacon(itemsBeacon, "beacon.".concat(child.name.toLowerCase()))
189
+ });
190
+ })));
191
+ };
192
+
193
+ // Filter beacon for the parent
194
+ var parentBeacon = function parentBeacon(data, prefix, itemName) {
195
+ if (!data) {
196
+ return {};
197
+ }
198
+ return Object.keys(data).filter(function (key) {
199
+ return key.startsWith(prefix);
200
+ }).reduce(function (result, key) {
201
+ result[key.replace(".".concat(itemName), '')] = data[key];
202
+ return result;
203
+ }, {});
204
+ };
205
+
206
+ // Filter beacon for the children
207
+ var childBeacon = function childBeacon(data, key) {
208
+ return data[key] ? (0, _defineProperty2["default"])({}, key, data[key]) : {};
209
+ };
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.SidebarItemRenderer = void 0;
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _SidebarItem = require("./SidebarItem");
10
+ var SidebarItemRenderer = exports.SidebarItemRenderer = function SidebarItemRenderer(_ref) {
11
+ var sidebarItems = _ref.sidebarItems,
12
+ sessionExpired = _ref.sessionExpired,
13
+ _ref$isSmallResolutio = _ref.isSmallResolution,
14
+ isSmallResolution = _ref$isSmallResolutio === void 0 ? undefined : _ref$isSmallResolutio;
15
+ return /*#__PURE__*/_react["default"].createElement("nav", {
16
+ className: "nav flex-column"
17
+ }, sidebarItems.map(function (item, idx) {
18
+ return item.children ? /*#__PURE__*/_react["default"].createElement(_SidebarItem.SidebarCollapsibleItem, {
19
+ key: idx,
20
+ item: item,
21
+ disabled: sessionExpired,
22
+ isSmallResolution: isSmallResolution
23
+ }) : /*#__PURE__*/_react["default"].createElement(_SidebarItem.SidebarItem, {
24
+ key: idx,
25
+ item: item,
26
+ disabled: sessionExpired,
27
+ isSmallResolution: isSmallResolution
28
+ });
29
+ }));
30
+ };
@@ -0,0 +1,86 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = Sidebar;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _reactRedux = require("react-redux");
12
+ var _reactstrap = require("reactstrap");
13
+ var _SidebarBottomItem = _interopRequireDefault(require("./SidebarBottomItem"));
14
+ var _actions = require("../../actions");
15
+ var _BrandImage = require("../../components/branding/BrandImage");
16
+ require("./sidebar.scss");
17
+ var _SidebarItemRenderer = require("./SidebarItemRenderer");
18
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
19
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
20
+ function Sidebar(props) {
21
+ var _useState = (0, _react.useState)(false),
22
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
23
+ isSmallResolution = _useState2[0],
24
+ setIsSmallResolution = _useState2[1];
25
+ var _useState3 = (0, _react.useState)({}),
26
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
27
+ sidebarBottomBranding = _useState4[0],
28
+ setSidebarBottomBranding = _useState4[1];
29
+ var _useState5 = (0, _react.useState)(window.innerWidth),
30
+ _useState6 = (0, _slicedToArray2["default"])(_useState5, 2),
31
+ windowWidth = _useState6[0],
32
+ setWindowWidth = _useState6[1];
33
+ var sidebarItems = (0, _reactRedux.useSelector)(function (state) {
34
+ var _state$navigation;
35
+ return (_state$navigation = state.navigation) === null || _state$navigation === void 0 ? void 0 : _state$navigation.navItems;
36
+ });
37
+ var sessionExpired = (0, _reactRedux.useSelector)(function (state) {
38
+ var _state$auth;
39
+ return (_state$auth = state.auth) === null || _state$auth === void 0 ? void 0 : _state$auth.sessionExpired;
40
+ });
41
+ var theme = (0, _reactRedux.useSelector)(function (state) {
42
+ return state.theme;
43
+ });
44
+ var dispatch = (0, _reactRedux.useDispatch)();
45
+ (0, _react.useEffect)(function () {
46
+ // Collapse sidebar if innerWidth is smaller or equal to 944px on page initialization
47
+ if (window.innerWidth <= 944) {
48
+ dispatch({
49
+ type: _actions.COLLAPSE_SIDEBAR,
50
+ isSidebarCollapsed: true
51
+ });
52
+ }
53
+ }, []);
54
+ (0, _react.useEffect)(function () {
55
+ setSidebarBottomBranding((0, _BrandImage.getBrandImage)(props, theme, 'sidebarLogo'));
56
+ }, [theme]);
57
+ var toggleSidebarModal = function toggleSidebarModal() {
58
+ return setIsSmallResolution(!isSmallResolution);
59
+ };
60
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, windowWidth <= 768 ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("div", {
61
+ onClick: toggleSidebarModal
62
+ }, /*#__PURE__*/_react["default"].createElement("i", {
63
+ className: "bi ms-2 bi-list text-primary fs-1"
64
+ })), /*#__PURE__*/_react["default"].createElement(_reactstrap.Modal, {
65
+ isOpen: isSmallResolution,
66
+ toggle: toggleSidebarModal,
67
+ className: "left"
68
+ }, /*#__PURE__*/_react["default"].createElement("div", {
69
+ className: "sidebar-modal"
70
+ }, /*#__PURE__*/_react["default"].createElement(_SidebarItemRenderer.SidebarItemRenderer, {
71
+ sidebarItems: sidebarItems,
72
+ sessionExpired: sessionExpired,
73
+ isSmallResolution: isSmallResolution
74
+ })))) : /*#__PURE__*/_react["default"].createElement("div", {
75
+ className: "h-100",
76
+ id: "app-sidebar"
77
+ }, /*#__PURE__*/_react["default"].createElement(_SidebarItemRenderer.SidebarItemRenderer, {
78
+ sidebarItems: sidebarItems,
79
+ sessionExpired: sessionExpired
80
+ }), /*#__PURE__*/_react["default"].createElement("div", {
81
+ className: "flex-fill"
82
+ }, "\xA0"), /*#__PURE__*/_react["default"].createElement(_SidebarBottomItem["default"], {
83
+ sidebarLogo: sidebarBottomBranding,
84
+ disabled: sessionExpired
85
+ })));
86
+ }
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _actions = require("../../actions");
10
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
11
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
12
+ var initialState = {
13
+ isSidebarCollapsed: false
14
+ };
15
+ var _default = exports["default"] = function _default() {
16
+ var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
17
+ var action = arguments.length > 1 ? arguments[1] : undefined;
18
+ switch (action.type) {
19
+ case _actions.COLLAPSE_SIDEBAR:
20
+ {
21
+ if (action.isSidebarCollapsed) {
22
+ document.getElementById('app').classList.add('sidebar-collapsed');
23
+ } else {
24
+ document.getElementById('app').classList.remove('sidebar-collapsed');
25
+ }
26
+ return _objectSpread(_objectSpread({}, state), {}, {
27
+ isSidebarCollapsed: action.isSidebarCollapsed
28
+ });
29
+ }
30
+ default:
31
+ {
32
+ return state;
33
+ }
34
+ }
35
+ };
@@ -0,0 +1,176 @@
1
+ $sidebar-item-border-width: 1px;
2
+ $sidebar-item-spacing: 0.5rem;
3
+
4
+ $sidebar-transition-timing-function: cubic-bezier(0.6, 0.6, 0, 1);
5
+
6
+ #app-sidebar {
7
+ display: flex;
8
+ flex-direction: column;
9
+ background-color: var(--bs-body-bg);
10
+ overflow-y: auto; // The sidebar is scrollable when it doesn't fit the screen
11
+ overflow-x: hidden;
12
+ min-height: 100%;
13
+ flex-wrap: nowrap;
14
+
15
+ & .nav-item {
16
+ width: 150px;
17
+
18
+ transition: width 0.2s $sidebar-transition-timing-function;
19
+
20
+ &:not(:last-child) {
21
+ margin-bottom: $sidebar-item-spacing;
22
+ }
23
+ }
24
+
25
+ & .nav-link {
26
+ padding: 0.75rem 0 0.75rem 8px;
27
+
28
+ transition: color 0.2s $sidebar-transition-timing-function, background-color 0.2s $sidebar-transition-timing-function;
29
+
30
+ &:hover {
31
+ color: var(--bs-nav-link-hover-color);
32
+ background-color: var(--bs-element-bg-color);
33
+
34
+ transition: color 0.1s $sidebar-transition-timing-function, background-color 0.1s $sidebar-transition-timing-function;
35
+ cursor: pointer;
36
+ }
37
+
38
+ &.active {
39
+ color: var(--bs-white);
40
+ background-color: var(--bs-primary);
41
+
42
+ transition: color 0.2s $sidebar-transition-timing-function, background-color 0.2s $sidebar-transition-timing-function;
43
+ }
44
+
45
+ & i {
46
+ font-size: 22px; // Make the icon a bit larger
47
+ }
48
+
49
+ & .sidebar-item-name {
50
+ overflow: hidden;
51
+ white-space: nowrap;
52
+ text-overflow: ellipsis;
53
+ vertical-align: 3px; // To center the text to a larger icon
54
+ }
55
+
56
+ & .sidebar-badge-collapsed {
57
+ margin-left: 2px;
58
+ margin-right: 0.3rem;
59
+ vertical-align: 3px; // To center the text to a larger icon
60
+ }
61
+ }
62
+
63
+ .sidebar-collapsible {
64
+ transition: transform 0.1s $sidebar-transition-timing-function;
65
+ &:hover {
66
+ span .bi-chevron-down {
67
+ transform: translateY(3px);
68
+ }
69
+ }
70
+
71
+ &.open {
72
+ margin-bottom: 0;
73
+ background-color: rgba(var(--bs-primary-rgb), 0.2);
74
+ }
75
+
76
+ & .bi-chevron-down {
77
+ margin-top: -1rem; //moving chevron closer to item icon
78
+ margin-bottom: -1rem;
79
+ }
80
+ }
81
+
82
+ .sidebar-collapse {
83
+ &.collapsing,
84
+ &.collapse.show {
85
+ background-color: rgba(var(--bs-primary-rgb), 0.1);
86
+ }
87
+ }
88
+
89
+ #app-sidebar-logo {
90
+ display: inline-block;
91
+ width: 124px;
92
+ height: 50px;
93
+
94
+ background-repeat: no-repeat;
95
+ background-position: 5px;
96
+ background-position-y: center;
97
+
98
+ text-decoration: none;
99
+
100
+ transition: background-image 0.2s $sidebar-transition-timing-function;
101
+ }
102
+
103
+ #app-sidebar-collapse {
104
+ cursor: pointer;
105
+
106
+ transition: color 0.2s $sidebar-transition-timing-function, background-color 0.2s $sidebar-transition-timing-function;
107
+
108
+ &:hover {
109
+ color: var(--bs-nav-link-hover-color);
110
+ transition: color 0.1s $sidebar-transition-timing-function, background-color 0.1s $sidebar-transition-timing-function;
111
+ }
112
+ }
113
+ }
114
+
115
+ .sidebar-modal {
116
+ & .bi-chevron-down {
117
+ margin-top: -0.6rem;
118
+ margin-bottom: 0;
119
+ }
120
+ }
121
+
122
+ #app.sidebar-collapsed {
123
+ grid-template-columns: 40px 1fr;
124
+
125
+ transition: all 0.2s linear; // This is speed of sidebar collapsing
126
+
127
+ & #app-sidebar {
128
+ width: 3rem;
129
+
130
+ > nav {
131
+ & .nav-item {
132
+
133
+ transition: width 0.2s $sidebar-transition-timing-function;
134
+
135
+ & .sidebar-item-name {
136
+ visibility: hidden;
137
+
138
+ transition: visibility 0.2s $sidebar-transition-timing-function;
139
+ }
140
+
141
+ & .sidebar-badge-collapsed {
142
+ display: block;
143
+ position: absolute;
144
+ }
145
+ }
146
+
147
+ & .nav-link {
148
+ text-overflow: unset;
149
+ }
150
+ }
151
+ }
152
+
153
+ #app-sidebar-logo {
154
+ width: 40px;
155
+ background-size: 28px;
156
+
157
+ transition: width 0.2s $sidebar-transition-timing-function;
158
+ }
159
+ }
160
+
161
+ #app-brandimage {
162
+ padding: 5px 0 5px 5px;
163
+
164
+ > a {
165
+ display: block;
166
+ width: 100%;
167
+ height: 100%;
168
+
169
+ background-repeat: no-repeat;
170
+ background-position: center;
171
+
172
+ text-decoration: none;
173
+
174
+ transition: background-image 0.2s $sidebar-transition-timing-function;
175
+ }
176
+ }
@@ -0,0 +1,60 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports["default"] = Sidepanel;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _reactstrap = require("reactstrap");
12
+ var _asab_webui_components = require("asab_webui_components");
13
+ require("./Sidepanel.scss");
14
+ function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
15
+ function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { "default": e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n["default"] = e, t && t.set(e, n), n; }
16
+ // Application sidepanel
17
+ function Sidepanel(props) {
18
+ var _usePubSub = (0, _asab_webui_components.usePubSub)(),
19
+ publish = _usePubSub.publish,
20
+ subscribe = _usePubSub.subscribe;
21
+ var _useState = (0, _react.useState)(undefined),
22
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
23
+ sidepanelContent = _useState2[0],
24
+ setSidepanelContent = _useState2[1];
25
+ (0, _react.useEffect)(function () {
26
+ var handleEvent = function handleEvent(message) {
27
+ if (message.mode === 'close') {
28
+ setSidepanelContent(undefined);
29
+ } else {
30
+ setSidepanelContent(message.mode);
31
+ }
32
+ };
33
+ // Subscription to Application.panel!
34
+ var subscriptionSidepanel = subscribe('Application.panel!', handleEvent);
35
+ // Clean up subscription on component unmount
36
+ return function () {
37
+ subscriptionSidepanel();
38
+ };
39
+ }, []);
40
+
41
+ // TODO: think of how to automatically close the sidepanel on screen leave
42
+ return /*#__PURE__*/_react["default"].createElement(_reactstrap.Collapse, {
43
+ id: "app-sidepanel",
44
+ isOpen: sidepanelContent != undefined ? true : false,
45
+ horizontal: true
46
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Card, {
47
+ className: "app-sidepanel-card h-100"
48
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.CardBody, {
49
+ className: "w-100 h-100 app-sidepanel-card-body"
50
+ }, sidepanelContent), /*#__PURE__*/_react["default"].createElement("div", {
51
+ className: "app-sidepanel-chevron-wrapper"
52
+ }, /*#__PURE__*/_react["default"].createElement("i", {
53
+ className: "app-sidepanel-chevron bi bi-chevron-right",
54
+ onClick: function onClick() {
55
+ return publish('Application.panel!', {
56
+ mode: 'close'
57
+ });
58
+ }
59
+ }))));
60
+ }
@@ -0,0 +1,20 @@
1
+ .app-sidepanel-card {
2
+ width: 300px;
3
+ }
4
+
5
+ .app-sidepanel-card-body {
6
+ overflow-y: auto;
7
+ }
8
+
9
+ .app-sidepanel-chevron-wrapper {
10
+ padding: 10px;
11
+ }
12
+
13
+ .app-sidepanel-chevron {
14
+ font-size: 21px;
15
+ color: var(--bs-primary);
16
+ }
17
+
18
+ .app-sidepanel-chevron:hover {
19
+ cursor: pointer;
20
+ }
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.ToastComponent = ToastComponent;
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _reactstrap = require("reactstrap");
10
+ var _actions = require("../../actions");
11
+ // import { timeToString } from 'asab_webui_components';
12
+
13
+ // Component for displaying Toast messages
14
+ function ToastComponent(_ref) {
15
+ var app = _ref.app,
16
+ content = _ref.content,
17
+ dispatch = _ref.dispatch;
18
+ return /*#__PURE__*/_react["default"].createElement(_reactstrap.Toast, {
19
+ fade: true,
20
+ className: "toast d-print-none"
21
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.ToastHeader, {
22
+ toggle: function toggle() {
23
+ return dispatch({
24
+ type: _actions.DEL_TOAST,
25
+ key: content.key
26
+ });
27
+ },
28
+ className: "toast-header",
29
+ icon: content !== null && content !== void 0 && content.level ? "".concat(content.level) : 'secondary'
30
+ }, content !== null && content !== void 0 && content.title ? content.title : ':-('), /*#__PURE__*/_react["default"].createElement(_reactstrap.ToastBody, null, content !== null && content !== void 0 && content.message ? content.message : 'Ooops, mistake is on our side. Message has not been defined!'));
31
+ }