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,107 @@
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"] = void 0;
9
+ var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
12
+ var _react = _interopRequireWildcard(require("react"));
13
+ var _reactI18next = require("react-i18next");
14
+ var _reactstrap = require("reactstrap");
15
+ var _locationReplace = require("../../../components/locationReplace");
16
+ require("./AccessDeniedCard.scss");
17
+ 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); }
18
+ 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; }
19
+ function AccessDeniedCard(props) {
20
+ var _useTranslation = (0, _reactI18next.useTranslation)(),
21
+ t = _useTranslation.t;
22
+ var _useState = (0, _react.useState)(false),
23
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
24
+ accessDenied = _useState2[0],
25
+ setAccessDenied = _useState2[1];
26
+ var _useState3 = (0, _react.useState)(""),
27
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
28
+ deniedTenant = _useState4[0],
29
+ setDeniedTenant = _useState4[1];
30
+ (0, _react.useEffect)(function () {
31
+ var qs = new URLSearchParams(window.location.search);
32
+ var errorType = qs.get('error');
33
+ /*
34
+ If error appears in the URL search params and is NOT
35
+ tenant_access_denied, user will stay in splashscreen
36
+ with Access denied card
37
+ */
38
+ if (errorType != undefined && errorType != 'tenant_access_denied') {
39
+ setAccessDenied(true);
40
+ if (errorType.includes("no_tenants")) {
41
+ setDeniedTenant(t("AccessDeniedCard|is not assigned!"));
42
+ } else {
43
+ var tenantParameter = qs.get('tenant');
44
+ setDeniedTenant(tenantParameter);
45
+ }
46
+ }
47
+ }, []);
48
+
49
+ /*
50
+ We can't use logout/redirection to login via /openidconnect/logout,
51
+ since we dont have a oauth token here (access denied)
52
+ */
53
+ var continueToLogin = /*#__PURE__*/function () {
54
+ var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
55
+ var SeaCatAuthAPI, response;
56
+ return _regenerator["default"].wrap(function _callee$(_context) {
57
+ while (1) switch (_context.prev = _context.next) {
58
+ case 0:
59
+ SeaCatAuthAPI = props.app.axiosCreate('seacat-auth');
60
+ _context.prev = 1;
61
+ _context.next = 4;
62
+ return SeaCatAuthAPI.put('/public/logout');
63
+ case 4:
64
+ response = _context.sent;
65
+ _context.next = 10;
66
+ break;
67
+ case 7:
68
+ _context.prev = 7;
69
+ _context.t0 = _context["catch"](1);
70
+ props.app.addAlertFromException(_context.t0, t("AccessDeniedCard|Silly as it sounds, the logout failed"));
71
+ case 10:
72
+ _context.next = 12;
73
+ return (0, _locationReplace.locationReplace)("".concat(window.location.pathname));
74
+ case 12:
75
+ case "end":
76
+ return _context.stop();
77
+ }
78
+ }, _callee, null, [[1, 7]]);
79
+ }));
80
+ return function continueToLogin() {
81
+ return _ref.apply(this, arguments);
82
+ };
83
+ }();
84
+ return props.app.Services.TenantService && props.app.Modules.filter(function (obj) {
85
+ return obj.Name === "AuthModule";
86
+ }).length > 0 && accessDenied == true ? /*#__PURE__*/_react["default"].createElement("div", {
87
+ className: "access-denied-wrapper"
88
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Card, null, /*#__PURE__*/_react["default"].createElement(_reactstrap.CardHeader, {
89
+ className: "card-header-flex"
90
+ }, /*#__PURE__*/_react["default"].createElement("div", {
91
+ className: "flex-fill text-center"
92
+ }, /*#__PURE__*/_react["default"].createElement("h2", {
93
+ className: "text-primary"
94
+ }, t("AccessDeniedCard|Access denied")))), /*#__PURE__*/_react["default"].createElement(_reactstrap.CardBody, null, /*#__PURE__*/_react["default"].createElement("p", {
95
+ className: "text-center"
96
+ }, t("AccessDeniedCard|Please contact application administrator for assigning appropriate access rights.")), deniedTenant && /*#__PURE__*/_react["default"].createElement("p", {
97
+ className: "text-center tenant-text"
98
+ }, /*#__PURE__*/_react["default"].createElement("span", null, "Tenant "), deniedTenant), /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
99
+ className: "justify-content-center",
100
+ block: true,
101
+ color: "primary",
102
+ onClick: function onClick() {
103
+ continueToLogin();
104
+ }
105
+ }, t("AccessDeniedCard|Leave"))))) : null;
106
+ }
107
+ var _default = exports["default"] = AccessDeniedCard;
@@ -0,0 +1,6 @@
1
+ .access-denied-wrapper {
2
+ position: absolute;
3
+ z-index: 99999;
4
+ left: 50%; /*Horizontally center*/
5
+ transform: translateX(-50%); /*Horizontally center*/
6
+ }
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.types = void 0;
7
+ var types = exports.types = {
8
+ TENANTS_CHANGED: "asab/TenantService/CHANGED",
9
+ TENANT_SELECTED: "asab/TenantService/SELECT_TENANT"
10
+ };
@@ -0,0 +1,41 @@
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 _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
9
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
10
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
11
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
12
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
13
+ var _react = _interopRequireDefault(require("react"));
14
+ var _asab_webui_components = require("asab_webui_components");
15
+ var _service = _interopRequireDefault(require("./service"));
16
+ var _TenantDropdown = _interopRequireDefault(require("./TenantDropdown"));
17
+ var _reducer = _interopRequireDefault(require("./reducer"));
18
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
19
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
20
+ var TenantModule = exports["default"] = /*#__PURE__*/function (_Module) {
21
+ function TenantModule(app, name) {
22
+ var _this;
23
+ (0, _classCallCheck2["default"])(this, TenantModule);
24
+ _this = _callSuper(this, TenantModule, [app, "TenantModule"]);
25
+ _this.App = app;
26
+ _this.TenantService = new _service["default"](app, "TenantService");
27
+ _this.App.ReduxService.addReducer("tenant", _reducer["default"]);
28
+ return _this;
29
+ }
30
+ (0, _inherits2["default"])(TenantModule, _Module);
31
+ return (0, _createClass2["default"])(TenantModule, [{
32
+ key: "initialize",
33
+ value: function initialize() {
34
+ var headerService = this.App.locateService("HeaderService");
35
+ headerService.addComponent({
36
+ component: _TenantDropdown["default"],
37
+ order: 600
38
+ });
39
+ }
40
+ }]);
41
+ }(_asab_webui_components.Module);
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports["default"] = reducer;
7
+ var _actions = require("./actions");
8
+ // Actions
9
+
10
+ var initialState = {
11
+ tenants: [],
12
+ current: null
13
+ };
14
+ function reducer() {
15
+ var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
16
+ var action = arguments.length > 1 ? arguments[1] : undefined;
17
+ switch (action.type) {
18
+ case _actions.types.TENANTS_CHANGED:
19
+ return {
20
+ tenants: action.tenants_list,
21
+ current: action.current
22
+ };
23
+ default:
24
+ return state;
25
+ }
26
+ }
@@ -0,0 +1,228 @@
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 _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
9
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
10
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
11
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
13
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
14
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
15
+ var _asab_webui_components = require("asab_webui_components");
16
+ var _actions = require("./actions");
17
+ var _locationReplace = require("../../components/locationReplace");
18
+ function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); }
19
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
20
+ var TenantService = exports["default"] = /*#__PURE__*/function (_Service) {
21
+ function TenantService(app) {
22
+ var _this;
23
+ var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'TenantService';
24
+ (0, _classCallCheck2["default"])(this, TenantService);
25
+ _this = _callSuper(this, TenantService, [app, name]);
26
+ // Tenant data cache
27
+ _this.TenantDataCache = {};
28
+ return _this;
29
+ }
30
+ (0, _inherits2["default"])(TenantService, _Service);
31
+ return (0, _createClass2["default"])(TenantService, [{
32
+ key: "initialize",
33
+ value: function () {
34
+ var _initialize = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee() {
35
+ var tenants, tenants_list, i;
36
+ return _regenerator["default"].wrap(function _callee$(_context) {
37
+ while (1) switch (_context.prev = _context.next) {
38
+ case 0:
39
+ // If the tenant list is in the configuration, use it
40
+ // This is useful when tenants are present but auth not
41
+ tenants = this.App.Config.get('tenants');
42
+ if (!(tenants != null)) {
43
+ _context.next = 6;
44
+ break;
45
+ }
46
+ tenants_list = [];
47
+ for (i = 0; tenants[i] != undefined; i++) {
48
+ tenants_list.push(tenants[i]);
49
+ }
50
+ _context.next = 6;
51
+ return this.setTenants(tenants_list);
52
+ case 6:
53
+ case "end":
54
+ return _context.stop();
55
+ }
56
+ }, _callee, this);
57
+ }));
58
+ function initialize() {
59
+ return _initialize.apply(this, arguments);
60
+ }
61
+ return initialize;
62
+ }()
63
+ /*
64
+ setTenants updates the current active tenant and the list of available tenants
65
+ and dispatches that information into the application store
66
+ */
67
+ }, {
68
+ key: "setTenants",
69
+ value: (function () {
70
+ var _setTenants = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(availableTenants) {
71
+ var authorizedTenant,
72
+ tenantFromUrl,
73
+ currentTenant,
74
+ _args2 = arguments;
75
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
76
+ while (1) switch (_context2.prev = _context2.next) {
77
+ case 0:
78
+ authorizedTenant = _args2.length > 1 && _args2[1] !== undefined ? _args2[1] : undefined;
79
+ // Extract the current tenant from URL params
80
+ tenantFromUrl = this._extractTenantFromUrl();
81
+ /* If tenant has not been provided in access URL, insert the authorized tenant
82
+ or the first available tenant into the URL and reload the application */
83
+ if (!(tenantFromUrl == null)) {
84
+ _context2.next = 13;
85
+ break;
86
+ }
87
+ if (!authorizedTenant) {
88
+ _context2.next = 9;
89
+ break;
90
+ }
91
+ _context2.next = 6;
92
+ return (0, _locationReplace.locationReplace)("".concat(window.location.pathname, "?tenant=").concat(authorizedTenant).concat(window.location.hash));
93
+ case 6:
94
+ return _context2.abrupt("return");
95
+ case 9:
96
+ if (!(availableTenants && availableTenants.length > 0)) {
97
+ _context2.next = 13;
98
+ break;
99
+ }
100
+ _context2.next = 12;
101
+ return (0, _locationReplace.locationReplace)("".concat(window.location.pathname, "?tenant=").concat(availableTenants[0]).concat(window.location.hash));
102
+ case 12:
103
+ return _context2.abrupt("return");
104
+ case 13:
105
+ if (!(!availableTenants || availableTenants.length == 0)) {
106
+ _context2.next = 17;
107
+ break;
108
+ }
109
+ _context2.next = 16;
110
+ return (0, _locationReplace.locationReplace)(window.location.pathname + window.location.hash);
111
+ case 16:
112
+ return _context2.abrupt("return");
113
+ case 17:
114
+ if (availableTenants) {
115
+ if (!availableTenants.includes(tenantFromUrl)) {
116
+ // Display Invalid tenant alert message only when authorization is disabled
117
+ if (this.App.Config.get('authorization') === 'disabled') {
118
+ this.App.addAlert('danger', 'ASABTenantModule|Invalid tenant', 40000, true);
119
+ }
120
+ }
121
+ currentTenant = tenantFromUrl;
122
+ // Sort available tenants
123
+ availableTenants.sort(function (a, b) {
124
+ var _a$toString, _b$toString;
125
+ var tenantA = (a === null || a === void 0 || (_a$toString = a.toString()) === null || _a$toString === void 0 ? void 0 : _a$toString.toLowerCase()) || '';
126
+ var tenantB = (b === null || b === void 0 || (_b$toString = b.toString()) === null || _b$toString === void 0 ? void 0 : _b$toString.toLowerCase()) || '';
127
+ return tenantA.localeCompare(tenantB);
128
+ });
129
+ } else {
130
+ currentTenant = undefined;
131
+ }
132
+
133
+ // Dispatch tenants obtained from userinfo
134
+ this.App.Store.dispatch({
135
+ type: _actions.types.TENANTS_CHANGED,
136
+ tenants_list: availableTenants,
137
+ current: currentTenant
138
+ });
139
+ case 19:
140
+ case "end":
141
+ return _context2.stop();
142
+ }
143
+ }, _callee2, this);
144
+ }));
145
+ function setTenants(_x) {
146
+ return _setTenants.apply(this, arguments);
147
+ }
148
+ return setTenants;
149
+ }()
150
+ /*
151
+ getTenantData() method is used for returning the tenant data
152
+ It requires SeaCat Auth service
153
+ */
154
+ )
155
+ }, {
156
+ key: "getTenantData",
157
+ value: (function () {
158
+ var _getTenantData = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
159
+ var currentTenant, tenantData, SeaCatAuthAPI, response;
160
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
161
+ while (1) switch (_context3.prev = _context3.next) {
162
+ case 0:
163
+ currentTenant = this.getCurrentTenant(); // If tenant data being cached already, then return the data
164
+ if (!this.TenantDataCache[currentTenant]) {
165
+ _context3.next = 3;
166
+ break;
167
+ }
168
+ return _context3.abrupt("return", this.TenantDataCache[currentTenant]);
169
+ case 3:
170
+ tenantData = {};
171
+ if (!currentTenant) {
172
+ _context3.next = 19;
173
+ break;
174
+ }
175
+ SeaCatAuthAPI = this.App.axiosCreate('seacat-auth');
176
+ _context3.prev = 6;
177
+ _context3.next = 9;
178
+ return SeaCatAuthAPI.get("/tenant/".concat(currentTenant));
179
+ case 9:
180
+ response = _context3.sent;
181
+ tenantData = response.data;
182
+ this.TenantDataCache[currentTenant] = tenantData;
183
+ _context3.next = 19;
184
+ break;
185
+ case 14:
186
+ _context3.prev = 14;
187
+ _context3.t0 = _context3["catch"](6);
188
+ console.warn("Tenant service can't retrieve data for ".concat(currentTenant));
189
+ console.error(_context3.t0);
190
+ // Remove data from the TenantDataCache eventually
191
+ delete this.TenantDataCache[currentTenant];
192
+ case 19:
193
+ return _context3.abrupt("return", tenantData);
194
+ case 20:
195
+ case "end":
196
+ return _context3.stop();
197
+ }
198
+ }, _callee3, this, [[6, 14]]);
199
+ }));
200
+ function getTenantData() {
201
+ return _getTenantData.apply(this, arguments);
202
+ }
203
+ return getTenantData;
204
+ }() // getCurrentTenant() method is used for obtaining current tenant
205
+ )
206
+ }, {
207
+ key: "getCurrentTenant",
208
+ value: function getCurrentTenant() {
209
+ var state = this.App.Store.getState();
210
+ var currentTenant = state.tenant.current;
211
+ // If current tenant is not in redux store yet, get it from the URL params
212
+ if (!currentTenant) {
213
+ currentTenant = this._extractTenantFromUrl();
214
+ }
215
+ return currentTenant;
216
+ }
217
+
218
+ // Extract tenant from URL params
219
+ }, {
220
+ key: "_extractTenantFromUrl",
221
+ value: function _extractTenantFromUrl() {
222
+ var search = window.location.search;
223
+ var params = new URLSearchParams(search);
224
+ var tenant = params.get('tenant');
225
+ return tenant;
226
+ }
227
+ }]);
228
+ }(_asab_webui_components.Service);
@@ -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["default"] = InvalidRouteScreen;
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _reactI18next = require("react-i18next");
10
+ var _reactstrap = require("reactstrap");
11
+ require("./InvalidRouteScreen.scss");
12
+ function InvalidRouteScreen(props) {
13
+ var _useTranslation = (0, _reactI18next.useTranslation)(),
14
+ t = _useTranslation.t;
15
+ return /*#__PURE__*/_react["default"].createElement(_reactstrap.Container, {
16
+ className: "invalid-route-container h-100",
17
+ fluid: true
18
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Card, {
19
+ className: "invalid-route-card"
20
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.CardBody, {
21
+ className: "text-center invalid-route-cardbody"
22
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Row, {
23
+ className: "justify-content-center"
24
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Col, null, /*#__PURE__*/_react["default"].createElement("p", null, /*#__PURE__*/_react["default"].createElement("i", {
25
+ className: "bi bi-emoji-frown fs-1 text-primary",
26
+ title: t("InvalidRouteScreen|Nothing here")
27
+ })), /*#__PURE__*/_react["default"].createElement("p", {
28
+ className: "card-text"
29
+ }, t("InvalidRouteScreen|Sorry, we can't find the page you are looking for.")))))));
30
+ }
@@ -0,0 +1,19 @@
1
+ .invalid-route-container {
2
+ overflow: hidden;
3
+ }
4
+
5
+ .invalid-route-card {
6
+ height: 80%;
7
+ width: 50%;
8
+ position: absolute;
9
+ top: 50%;
10
+ left: 50%;
11
+ transform: translate(-50%, -50%);
12
+ border: 1px solid var(--bs-primary);
13
+ }
14
+
15
+ .invalid-route-cardbody {
16
+ display: flex;
17
+ align-items: center; /* Vertically center */
18
+ justify-content: center; /* Horizontally center */
19
+ }
@@ -0,0 +1,43 @@
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"] = SuspenseScreen;
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _reactRedux = require("react-redux");
12
+ var _asab_webui_components = require("asab_webui_components");
13
+ var _reactstrap = require("reactstrap");
14
+ var _BrandImage = require("../components/branding/BrandImage");
15
+ require("./SuspenseScreen.scss");
16
+ 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); }
17
+ 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; }
18
+ function SuspenseScreen(props) {
19
+ var _useState = (0, _react.useState)(undefined),
20
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
21
+ brandImage = _useState2[0],
22
+ setBrandImage = _useState2[1];
23
+ var theme = (0, _reactRedux.useSelector)(function (state) {
24
+ return state.theme;
25
+ });
26
+ (0, _react.useEffect)(function () {
27
+ setBrandImage((0, _BrandImage.getBrandImage)(props, theme));
28
+ }, [theme]);
29
+ return /*#__PURE__*/_react["default"].createElement(_reactstrap.Container, {
30
+ className: "h-100",
31
+ fluid: true
32
+ }, /*#__PURE__*/_react["default"].createElement("div", {
33
+ className: "h-100 suspense-content-wrapper"
34
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Col, null, /*#__PURE__*/_react["default"].createElement(_reactstrap.Row, {
35
+ className: "justify-content-center mb-4"
36
+ }, brandImage ? /*#__PURE__*/_react["default"].createElement("img", {
37
+ className: "suspense-img",
38
+ src: brandImage === null || brandImage === void 0 ? void 0 : brandImage.full,
39
+ alt: "Loading..."
40
+ }) : /*#__PURE__*/_react["default"].createElement("h2", {
41
+ className: "text-center text-primary"
42
+ }, "Loading...")), /*#__PURE__*/_react["default"].createElement(_asab_webui_components.Spinner, null))));
43
+ }
@@ -0,0 +1,9 @@
1
+ .suspense-content-wrapper {
2
+ display: flex;
3
+ align-items: center; /* Vertically center */
4
+ justify-content: center; /* Horizontally center */
5
+ }
6
+
7
+ .suspense-img {
8
+ max-width: 500px;
9
+ }
@@ -0,0 +1,79 @@
1
+ "use strict";
2
+
3
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = UnauthorizedAccessScreen;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _reactI18next = require("react-i18next");
10
+ var _reactRedux = require("react-redux");
11
+ var _reactstrap = require("reactstrap");
12
+ require("./UnauthorizedAccessScreen.scss");
13
+ 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); }
14
+ 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; }
15
+ /*
16
+ Unauthorized Access screen can be displayed only when:
17
+ - AuthModule is present within the application
18
+ - user does not have a particular resource and user is not superuser
19
+
20
+ Unauthorized Access screen replace the content of the container by its own screen with
21
+ information about what resource is missing to enable the access to the desired (blocked)
22
+ screen.
23
+ */
24
+ function UnauthorizedAccessScreen(props) {
25
+ var _useTranslation = (0, _reactI18next.useTranslation)(),
26
+ t = _useTranslation.t;
27
+ var resources = (0, _reactRedux.useSelector)(function (state) {
28
+ var _state$auth;
29
+ return (_state$auth = state.auth) !== null && _state$auth !== void 0 && _state$auth.resources ? state.auth.resources : [];
30
+ });
31
+
32
+ // Check if auth module is active. If not, return the original component
33
+ // Check for desired resource. If present or user is superuser, return the original component
34
+ var isAuthorized = props.resource === "*" || props.app.Modules.filter(function (obj) {
35
+ return obj.Name === "AuthModule";
36
+ }).length === 0 || resources.indexOf(props.resource) !== -1 || resources.indexOf("authz:superuser") !== -1;
37
+ (0, _react.useLayoutEffect)(function () {
38
+ // Determine if the component should be in print-ready or print-unauthorized state
39
+ if (!isAuthorized) {
40
+ document.body.setAttribute('print-ready', 'true');
41
+ document.body.setAttribute('print-unauthorized', 'true');
42
+ } else {
43
+ document.body.removeAttribute('print-ready');
44
+ document.body.removeAttribute('print-unauthorized');
45
+ }
46
+
47
+ // Cleanup function to remove the attributes when the component unmounts
48
+ return function () {
49
+ document.body.removeAttribute('print-ready');
50
+ document.body.removeAttribute('print-unauthorized');
51
+ };
52
+ }, [isAuthorized]);
53
+
54
+ // If user is authorized, let them see the screen content
55
+ if (isAuthorized) {
56
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, props.routeComponent);
57
+ }
58
+
59
+ // Else return the Not authorized screen
60
+ return /*#__PURE__*/_react["default"].createElement(_reactstrap.Container, {
61
+ className: "unauthorized-container h-100",
62
+ fluid: true
63
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Card, {
64
+ className: "unauthorized-card"
65
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.CardBody, {
66
+ className: "text-center unauthorized-cardbody"
67
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Row, {
68
+ className: "justify-content-center"
69
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Col, null, /*#__PURE__*/_react["default"].createElement("p", null, /*#__PURE__*/_react["default"].createElement("i", {
70
+ className: "bi bi-exclamation-triangle text-danger fs-1",
71
+ title: t("UnauthorizedAccessScreen|Unauthorized access")
72
+ })), props.resource ? /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("p", {
73
+ className: "card-text"
74
+ }, t("UnauthorizedAccessScreen|You are not authorized to access this part of the application. Please ask your application administrator for following resource"), ":"), /*#__PURE__*/_react["default"].createElement("h5", {
75
+ className: "card-title"
76
+ }, props.resource)) : /*#__PURE__*/_react["default"].createElement("p", {
77
+ className: "card-text"
78
+ }, t("UnauthorizedAccessScreen|You are not authorized to access this part of the application.")))))));
79
+ }
@@ -0,0 +1,19 @@
1
+ .unauthorized-container {
2
+ overflow: hidden;
3
+ }
4
+
5
+ .unauthorized-card {
6
+ height: 80%;
7
+ width: 50%;
8
+ position: absolute;
9
+ top: 50%;
10
+ left: 50%;
11
+ transform: translate(-50%, -50%);
12
+ border: 1px solid var(--bs-danger);
13
+ }
14
+
15
+ .unauthorized-cardbody {
16
+ display: flex;
17
+ align-items: center; /* Vertically center */
18
+ justify-content: center; /* Horizontally center */
19
+ }