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.
- package/CHANGELOG.md +218 -0
- package/LICENSE +28 -0
- package/README.md +3 -0
- package/dist/actions.js +22 -0
- package/dist/components/branding/BrandImage.js +72 -0
- package/dist/components/locationReplace.js +51 -0
- package/dist/config/ConfigReducer.js +22 -0
- package/dist/config/ConfigService.js +169 -0
- package/dist/containers/AdvancedMode/reducer.js +28 -0
- package/dist/containers/Alerts/alerts.scss +9 -0
- package/dist/containers/Alerts/index.js +81 -0
- package/dist/containers/Alerts/reducer.js +68 -0
- package/dist/containers/Application.js +773 -0
- package/dist/containers/Application.scss +104 -0
- package/dist/containers/AttentionRequired/reducer.js +30 -0
- package/dist/containers/FullscreenMode/reducer.js +28 -0
- package/dist/containers/Header/ApplicationScreenTitle/ApplicationScreenTitle.js +47 -0
- package/dist/containers/Header/ApplicationScreenTitle/ApplicationScreenTitle.scss +8 -0
- package/dist/containers/Header/ApplicationScreenTitle/index.js +31 -0
- package/dist/containers/Header/Help/HelpButton.js +58 -0
- package/dist/containers/Header/Help/HelpButton.scss +15 -0
- package/dist/containers/Header/Help/HelpService.js +34 -0
- package/dist/containers/Header/Preview/PreviewFlag.js +34 -0
- package/dist/containers/Header/Preview/PreviewService.js +34 -0
- package/dist/containers/Header/header.scss +24 -0
- package/dist/containers/Header/index.js +39 -0
- package/dist/containers/Header/reducer.js +53 -0
- package/dist/containers/Navigation/index.js +66 -0
- package/dist/containers/Navigation/reducer.js +56 -0
- package/dist/containers/RouteErrorHandler/ErrorContainer.js +46 -0
- package/dist/containers/RouteErrorHandler/index.js +80 -0
- package/dist/containers/Router/ApplicationRouter.js +78 -0
- package/dist/containers/Router/index.js +50 -0
- package/dist/containers/Router/reducer.js +28 -0
- package/dist/containers/Sidebar/NavbarBrand.js +59 -0
- package/dist/containers/Sidebar/SidebarBottomItem.js +55 -0
- package/dist/containers/Sidebar/SidebarIcon.js +21 -0
- package/dist/containers/Sidebar/SidebarItem.js +209 -0
- package/dist/containers/Sidebar/SidebarItemRenderer.js +30 -0
- package/dist/containers/Sidebar/index.js +86 -0
- package/dist/containers/Sidebar/reducer.js +35 -0
- package/dist/containers/Sidebar/sidebar.scss +176 -0
- package/dist/containers/Sidepanel/Sidepanel.js +60 -0
- package/dist/containers/Sidepanel/Sidepanel.scss +20 -0
- package/dist/containers/Toast/ToastComponent.js +31 -0
- package/dist/containers/Toast/ToastComponent.jsx +28 -0
- package/dist/containers/Toast/ToastContainer.js +80 -0
- package/dist/containers/Toast/ToastContainer.jsx +59 -0
- package/dist/containers/Toast/reducer.js +55 -0
- package/dist/containers/Toast/reducer.jsx +45 -0
- package/dist/index.js +48 -0
- package/dist/modules/about/AboutScreen.js +84 -0
- package/dist/modules/about/index.js +41 -0
- package/dist/modules/auth/actions.js +11 -0
- package/dist/modules/auth/api.js +214 -0
- package/dist/modules/auth/components/SessionExpirationAlert.js +35 -0
- package/dist/modules/auth/header.js +109 -0
- package/dist/modules/auth/header.scss +9 -0
- package/dist/modules/auth/index.js +761 -0
- package/dist/modules/auth/reducer.js +36 -0
- package/dist/modules/auth/screens/AccessControlScreen.js +78 -0
- package/dist/modules/auth/screens/InvitationScreen.js +161 -0
- package/dist/modules/i18n/actions.js +7 -0
- package/dist/modules/i18n/dropdown.js +77 -0
- package/dist/modules/i18n/index.js +44 -0
- package/dist/modules/i18n/reducer.js +26 -0
- package/dist/modules/i18n/service.js +158 -0
- package/dist/modules/tenant/TenantDropdown.js +53 -0
- package/dist/modules/tenant/access/AccessDeniedCard.js +107 -0
- package/dist/modules/tenant/access/AccessDeniedCard.scss +6 -0
- package/dist/modules/tenant/actions.js +10 -0
- package/dist/modules/tenant/index.js +41 -0
- package/dist/modules/tenant/reducer.js +26 -0
- package/dist/modules/tenant/service.js +228 -0
- package/dist/screens/InvalidRouteScreen.js +30 -0
- package/dist/screens/InvalidRouteScreen.scss +19 -0
- package/dist/screens/SuspenseScreen.js +43 -0
- package/dist/screens/SuspenseScreen.scss +9 -0
- package/dist/screens/UnauthorizedAccessScreen.js +79 -0
- package/dist/screens/UnauthorizedAccessScreen.scss +19 -0
- package/dist/services/AttentionRequiredService.js +169 -0
- package/dist/services/BrandingService.js +104 -0
- package/dist/services/HeaderService.js +84 -0
- package/dist/services/ReduxService.js +25 -0
- package/dist/services/TitleService.js +45 -0
- package/dist/theme/ThemeButton.js +39 -0
- package/dist/theme/ThemeReducer.js +20 -0
- package/dist/theme/ThemeService.js +52 -0
- package/dist/theme/actions.js +7 -0
- 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,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,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
|
+
}
|