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,36 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = reducer;
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
+ userinfo: null,
14
+ resources: [],
15
+ sessionExpired: false
16
+ };
17
+ function reducer() {
18
+ var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
19
+ var action = arguments.length > 1 ? arguments[1] : undefined;
20
+ switch (action.type) {
21
+ case _actions.types.AUTH_USERINFO:
22
+ return _objectSpread(_objectSpread({}, state), {}, {
23
+ userinfo: action.payload
24
+ });
25
+ case _actions.types.AUTH_RESOURCES:
26
+ return _objectSpread(_objectSpread({}, state), {}, {
27
+ resources: action.resources
28
+ });
29
+ case _actions.types.AUTH_SESSION_EXPIRATION:
30
+ return _objectSpread(_objectSpread({}, state), {}, {
31
+ sessionExpired: action.sessionExpired
32
+ });
33
+ default:
34
+ return state;
35
+ }
36
+ }
@@ -0,0 +1,78 @@
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 _react = _interopRequireDefault(require("react"));
9
+ var _reactI18next = require("react-i18next");
10
+ var _reactRedux = require("react-redux");
11
+ var _reactstrap = require("reactstrap");
12
+ /*
13
+
14
+ Language localizations for AccessControlScreen can be added to the translation.json files of
15
+ public/locales/en & public/locales/cs of the product where AccessControlScreen component is used.
16
+
17
+ Example:
18
+
19
+ {
20
+ "AccessControlScreen": {
21
+ "Access control": "Access control",
22
+ "Username": "Username",
23
+ "Tenant": "Tenant",
24
+ "Resources": "Resources"
25
+ }
26
+ }
27
+
28
+ */
29
+
30
+ function AccessControlScreen(props) {
31
+ return /*#__PURE__*/_react["default"].createElement(_reactstrap.Container, null, /*#__PURE__*/_react["default"].createElement(_reactstrap.Row, {
32
+ className: "justify-content-center pt-5"
33
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Col, {
34
+ md: "6"
35
+ }, /*#__PURE__*/_react["default"].createElement(AccessControlCard, null))));
36
+ }
37
+ var _default = exports["default"] = AccessControlScreen;
38
+ function AccessControlCard(props) {
39
+ var _useSelector;
40
+ var _useTranslation = (0, _reactI18next.useTranslation)(),
41
+ t = _useTranslation.t,
42
+ i18n = _useTranslation.i18n;
43
+ var tenant = (0, _reactRedux.useSelector)(function (state) {
44
+ var _state$tenant;
45
+ return (_state$tenant = state.tenant) === null || _state$tenant === void 0 ? void 0 : _state$tenant.current;
46
+ });
47
+ var userinfo = (0, _reactRedux.useSelector)(function (state) {
48
+ var _state$auth;
49
+ return (_state$auth = state.auth) === null || _state$auth === void 0 ? void 0 : _state$auth.userinfo;
50
+ });
51
+ var resources = ((_useSelector = (0, _reactRedux.useSelector)(function (state) {
52
+ var _state$auth2;
53
+ return (_state$auth2 = state.auth) === null || _state$auth2 === void 0 ? void 0 : _state$auth2.resources;
54
+ })) === null || _useSelector === void 0 ? void 0 : _useSelector.sort()) || [];
55
+ return /*#__PURE__*/_react["default"].createElement(_reactstrap.Card, null, /*#__PURE__*/_react["default"].createElement(_reactstrap.CardHeader, {
56
+ className: "card-header-flex"
57
+ }, /*#__PURE__*/_react["default"].createElement("div", {
58
+ className: "flex-fill"
59
+ }, /*#__PURE__*/_react["default"].createElement("h3", null, t('AccessControlScreen|Access control')))), /*#__PURE__*/_react["default"].createElement("ul", {
60
+ className: "list-group list-group-flush"
61
+ }, (userinfo === null || userinfo === void 0 ? void 0 : userinfo.username) && /*#__PURE__*/_react["default"].createElement("li", {
62
+ className: "list-group-item"
63
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Row, null, /*#__PURE__*/_react["default"].createElement(_reactstrap.Col, {
64
+ className: "col-6"
65
+ }, t('AccessControlScreen|Username')), /*#__PURE__*/_react["default"].createElement(_reactstrap.Col, null, userinfo.username))), tenant && /*#__PURE__*/_react["default"].createElement("li", {
66
+ className: "list-group-item"
67
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Row, null, /*#__PURE__*/_react["default"].createElement(_reactstrap.Col, {
68
+ className: "col-6"
69
+ }, t('AccessControlScreen|Tenant')), /*#__PURE__*/_react["default"].createElement(_reactstrap.Col, null, tenant))), resources && /*#__PURE__*/_react["default"].createElement("li", {
70
+ className: "list-group-item"
71
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Row, null, /*#__PURE__*/_react["default"].createElement(_reactstrap.Col, {
72
+ className: "col-6"
73
+ }, t('AccessControlScreen|Resources')), /*#__PURE__*/_react["default"].createElement(_reactstrap.Col, null, resources.map(function (resource) {
74
+ return /*#__PURE__*/_react["default"].createElement("div", {
75
+ key: resource
76
+ }, resource);
77
+ }))))));
78
+ }
@@ -0,0 +1,161 @@
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"] = InvitationScreen;
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 _reactRedux = require("react-redux");
15
+ var _asab_webui_components = require("asab_webui_components");
16
+ var _reactRouterDom = require("react-router-dom");
17
+ var _reactstrap = require("reactstrap");
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
+ // Component that handles user invitation
21
+ function InvitationScreen(props) {
22
+ var _useState = (0, _react.useState)(''),
23
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
24
+ emailValue = _useState2[0],
25
+ setEmailValue = _useState2[1];
26
+ var _useState3 = (0, _react.useState)(undefined),
27
+ _useState4 = (0, _slicedToArray2["default"])(_useState3, 2),
28
+ isInvitationSuccessful = _useState4[0],
29
+ setIsInvitationSuccessful = _useState4[1];
30
+ var tenant = (0, _reactRedux.useSelector)(function (state) {
31
+ var _state$tenant;
32
+ return (_state$tenant = state.tenant) === null || _state$tenant === void 0 ? void 0 : _state$tenant.current;
33
+ });
34
+ var _useTranslation = (0, _reactI18next.useTranslation)(),
35
+ t = _useTranslation.t;
36
+ var navigate = (0, _reactRouterDom.useNavigate)();
37
+ var SeaCatAuthAPI = props.app.axiosCreate('seacat-auth');
38
+
39
+ // Validate email input
40
+ var emailValidation = function emailValidation(e) {
41
+ e.preventDefault();
42
+ setEmailValue(e.target.value);
43
+ };
44
+
45
+ // Send invitation to the specified email
46
+ var sendInvitation = /*#__PURE__*/function () {
47
+ var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(e) {
48
+ var body, _response$data, response;
49
+ return _regenerator["default"].wrap(function _callee$(_context) {
50
+ while (1) switch (_context.prev = _context.next) {
51
+ case 0:
52
+ e.preventDefault();
53
+ body = {
54
+ email: emailValue
55
+ };
56
+ _context.prev = 2;
57
+ _context.next = 5;
58
+ return SeaCatAuthAPI.post("/account/".concat(tenant, "/invite"), body);
59
+ case 5:
60
+ response = _context.sent;
61
+ if (!((response === null || response === void 0 || (_response$data = response.data) === null || _response$data === void 0 ? void 0 : _response$data.result) !== 'OK')) {
62
+ _context.next = 8;
63
+ break;
64
+ }
65
+ throw new Error('Invitation has not been sent');
66
+ case 8:
67
+ setIsInvitationSuccessful(true);
68
+ setEmailValue('');
69
+ _context.next = 15;
70
+ break;
71
+ case 12:
72
+ _context.prev = 12;
73
+ _context.t0 = _context["catch"](2);
74
+ setIsInvitationSuccessful(false);
75
+ case 15:
76
+ case "end":
77
+ return _context.stop();
78
+ }
79
+ }, _callee, null, [[2, 12]]);
80
+ }));
81
+ return function sendInvitation(_x) {
82
+ return _ref.apply(this, arguments);
83
+ };
84
+ }();
85
+
86
+ // Display for successful invitation
87
+ var SuccessfulInvitationCardBody = function SuccessfulInvitationCardBody() {
88
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("h6", null, t('InvitationScreen|Invitation has been sent successfully')), /*#__PURE__*/_react["default"].createElement("div", {
89
+ className: "mt-2"
90
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
91
+ block: true,
92
+ onClick: function onClick() {
93
+ return navigate('/auth/credentials');
94
+ },
95
+ color: "primary",
96
+ size: "lg"
97
+ }, t('General|Continue'))));
98
+ };
99
+
100
+ // Display for unsuccessful invitation
101
+ var UnsuccessfulInvitationCardBody = function UnsuccessfulInvitationCardBody() {
102
+ return /*#__PURE__*/_react["default"].createElement(_react["default"].Fragment, null, /*#__PURE__*/_react["default"].createElement("h6", null, t('InvitationScreen|Invitation has not been sent')), /*#__PURE__*/_react["default"].createElement(_reactstrap.FormText, null, t('InvitationScreen|The user could not be invited')), /*#__PURE__*/_react["default"].createElement("div", {
103
+ className: "mt-2"
104
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
105
+ block: true,
106
+ onClick: function onClick() {
107
+ return setIsInvitationSuccessful(undefined);
108
+ },
109
+ color: "primary",
110
+ size: "lg"
111
+ }, t('General|Back'))));
112
+ };
113
+ return /*#__PURE__*/_react["default"].createElement(_reactstrap.Container, {
114
+ fluid: true,
115
+ className: isInvitationSuccessful == undefined ? '' : 'h-100'
116
+ }, isInvitationSuccessful != undefined ? /*#__PURE__*/_react["default"].createElement(_asab_webui_components.ResultCard, {
117
+ isSuccessful: isInvitationSuccessful ? true : false,
118
+ body: isInvitationSuccessful ? /*#__PURE__*/_react["default"].createElement(SuccessfulInvitationCardBody, null) : /*#__PURE__*/_react["default"].createElement(UnsuccessfulInvitationCardBody, null)
119
+ }) : /*#__PURE__*/_react["default"].createElement(_reactstrap.Row, {
120
+ className: "justify-content-center pt-5"
121
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Col, {
122
+ md: "4"
123
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Form, {
124
+ onSubmit: function onSubmit(e) {
125
+ sendInvitation(e);
126
+ }
127
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Card, {
128
+ className: "invite-card"
129
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.CardHeader, {
130
+ className: "card-header-flex"
131
+ }, /*#__PURE__*/_react["default"].createElement("div", {
132
+ className: "flex-fill"
133
+ }, /*#__PURE__*/_react["default"].createElement("h3", null, /*#__PURE__*/_react["default"].createElement("i", {
134
+ className: "bi bi-person-plus pe-2"
135
+ }), t('InvitationScreen|Invite other users')))), /*#__PURE__*/_react["default"].createElement(_reactstrap.CardBody, null, /*#__PURE__*/_react["default"].createElement(_reactstrap.Label, null, t('InvitationScreen|Enter the email to invite a user')), /*#__PURE__*/_react["default"].createElement(_reactstrap.InputGroup, null, /*#__PURE__*/_react["default"].createElement(_reactstrap.InputGroupText, null, /*#__PURE__*/_react["default"].createElement("i", {
136
+ className: "bi bi-envelope-at"
137
+ })), /*#__PURE__*/_react["default"].createElement(_reactstrap.Input, {
138
+ name: "email",
139
+ type: "email",
140
+ autoComplete: "email",
141
+ autoFocus: true,
142
+ value: emailValue,
143
+ onChange: function onChange(e) {
144
+ emailValidation(e);
145
+ }
146
+ }))), /*#__PURE__*/_react["default"].createElement(_reactstrap.CardFooter, {
147
+ className: "card-footer-flex"
148
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
149
+ outline: true,
150
+ color: "primary",
151
+ type: "button",
152
+ onClick: function onClick() {
153
+ return navigate(-1);
154
+ }
155
+ }, t('General|Cancel')), /*#__PURE__*/_react["default"].createElement("div", {
156
+ className: "flex-fill"
157
+ }, "\xA0"), /*#__PURE__*/_react["default"].createElement(_reactstrap.Button, {
158
+ color: "primary",
159
+ disabled: emailValue === '' // Disable button if input is empty
160
+ }, t('InvitationScreen|Send'))))))));
161
+ }
@@ -0,0 +1,7 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.CHANGE_LANGUAGE = void 0;
7
+ var CHANGE_LANGUAGE = exports.CHANGE_LANGUAGE = "asab/changeLanguage";
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+
3
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = LanguageDropdown;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _reactI18next = require("react-i18next");
10
+ var _actions = require("./actions");
11
+ var _reactRedux = require("react-redux");
12
+ var _reactstrap = require("reactstrap");
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
+ function LanguageDropdown(props) {
16
+ var _useTranslation = (0, _reactI18next.useTranslation)(),
17
+ t = _useTranslation.t,
18
+ i18n = _useTranslation.i18n;
19
+ var changeLanguage = function changeLanguage(language) {
20
+ i18n.changeLanguage(language).then(function () {
21
+ // if the hard refresh is needed: window.location.reload(false);
22
+ });
23
+ };
24
+ var dispatch = (0, _reactRedux.useDispatch)();
25
+ (0, _react.useEffect)(function () {
26
+ var _i18n$language;
27
+ dispatch({
28
+ type: _actions.CHANGE_LANGUAGE,
29
+ language: (_i18n$language = i18n === null || i18n === void 0 ? void 0 : i18n.language) !== null && _i18n$language !== void 0 ? _i18n$language : window.navigator.language
30
+ });
31
+ }, [i18n.language]);
32
+
33
+ // This means that we basically don't know what languages are supported
34
+ if (i18n.options.supportedLngs == null || i18n.options.supportedLngs == false) {
35
+ return null;
36
+ }
37
+ return /*#__PURE__*/_react["default"].createElement(_reactstrap.UncontrolledDropdown, {
38
+ direction: "down"
39
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.DropdownToggle, {
40
+ nav: true,
41
+ caret: true
42
+ }, /*#__PURE__*/_react["default"].createElement(LanguageFlag, {
43
+ language: i18n.language,
44
+ style: {
45
+ width: '24px'
46
+ }
47
+ })), /*#__PURE__*/_react["default"].createElement(_reactstrap.DropdownMenu, {
48
+ className: "shadow"
49
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.DropdownItem, {
50
+ header: true
51
+ }, t('i18n|Language')), i18n.options.supportedLngs.map(function (language, i) {
52
+ if (language == 'cimode') return null;
53
+ return /*#__PURE__*/_react["default"].createElement(_reactstrap.DropdownItem, {
54
+ key: language,
55
+ title: language,
56
+ onClick: function onClick() {
57
+ changeLanguage(language);
58
+ }
59
+ }, /*#__PURE__*/_react["default"].createElement(LanguageFlag, {
60
+ language: language,
61
+ className: "pe-2",
62
+ style: {
63
+ width: '32px'
64
+ }
65
+ }), t('i18n|language|' + language));
66
+ })));
67
+ }
68
+ function LanguageFlag(_ref) {
69
+ var language = _ref.language,
70
+ className = _ref.className,
71
+ style = _ref.style;
72
+ return /*#__PURE__*/_react["default"].createElement("img", {
73
+ className: className,
74
+ src: "media/locale/".concat(language, ".svg"),
75
+ style: style
76
+ });
77
+ }
@@ -0,0 +1,44 @@
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 _asab_webui_components = require("asab_webui_components");
14
+ var _service = _interopRequireDefault(require("./service.js"));
15
+ var _dropdown = _interopRequireDefault(require("./dropdown.js"));
16
+ var _reducer = _interopRequireDefault(require("./reducer.js"));
17
+ 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)); }
18
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
19
+ var I18nModule = exports["default"] = /*#__PURE__*/function (_Module) {
20
+ function I18nModule(app, name, props) {
21
+ var _this;
22
+ (0, _classCallCheck2["default"])(this, I18nModule);
23
+ _this = _callSuper(this, I18nModule, [app, "I18nModule"]);
24
+ _this.App = app;
25
+ _this.I18nService = new _service["default"](app, "I18nService");
26
+ _this.App.ReduxService.addReducer("language", _reducer["default"]);
27
+ return _this;
28
+ }
29
+ (0, _inherits2["default"])(I18nModule, _Module);
30
+ return (0, _createClass2["default"])(I18nModule, [{
31
+ key: "initialize",
32
+ value: function initialize() {
33
+ var headerService = this.App.locateService("HeaderService");
34
+ headerService.addComponent({
35
+ component: _dropdown["default"],
36
+ componentProps: {
37
+ children: "LanguageDropdown"
38
+ },
39
+ order: 500,
40
+ fullscreenVisible: true
41
+ });
42
+ }
43
+ }]);
44
+ }(_asab_webui_components.Module);
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = languageReducer;
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 initialValue = {
13
+ language: 'en'
14
+ };
15
+ function languageReducer() {
16
+ var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialValue;
17
+ var action = arguments.length > 1 ? arguments[1] : undefined;
18
+ switch (action.type) {
19
+ case _actions.CHANGE_LANGUAGE:
20
+ return _objectSpread(_objectSpread({}, state), {}, {
21
+ current: action.language
22
+ });
23
+ default:
24
+ return state;
25
+ }
26
+ }
@@ -0,0 +1,158 @@
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 _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
11
+ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
12
+ var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
13
+ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn"));
14
+ var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
15
+ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits"));
16
+ var _asab_webui_components = require("asab_webui_components");
17
+ var _axios = _interopRequireDefault(require("axios"));
18
+ var _i18next = _interopRequireDefault(require("i18next"));
19
+ var _i18nextBrowserLanguagedetector = _interopRequireDefault(require("i18next-browser-languagedetector"));
20
+ var _reactI18next = require("react-i18next");
21
+ 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; }
22
+ 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; }
23
+ 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)); }
24
+ function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
25
+ var I18nService = exports["default"] = /*#__PURE__*/function (_Service) {
26
+ function I18nService(app) {
27
+ var _this;
28
+ var name = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : "I18nService";
29
+ (0, _classCallCheck2["default"])(this, I18nService);
30
+ _this = _callSuper(this, I18nService, [app, name]);
31
+ app.addSplashScreenRequestor(_this);
32
+ _this.Sources = [];
33
+ var config = _this.App.Config.get('i18n');
34
+ if (config === undefined) {
35
+ config = {
36
+ debug: true
37
+ };
38
+ }
39
+
40
+ // config.supportedLngs is not an array but some faked array crap so we need to convert that
41
+ var supportedLngs = [];
42
+ for (var i in config.supportedLngs) {
43
+ supportedLngs.push(config.supportedLngs[i]);
44
+ }
45
+ config.supportedLngs = supportedLngs;
46
+
47
+ // Missing keys are displayed without the namespace
48
+ config.parseMissingKeyHandler = function (key) {
49
+ var n = key.lastIndexOf("|");
50
+ if (n > 0) {
51
+ return key.slice(n + 1);
52
+ }
53
+ return key;
54
+ };
55
+
56
+ // Set default key separator
57
+ config.keySeparator = "|";
58
+ _this.Sources.push(/*#__PURE__*/function () {
59
+ var _ref = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee(language, namespace) {
60
+ var response;
61
+ return _regenerator["default"].wrap(function _callee$(_context) {
62
+ while (1) switch (_context.prev = _context.next) {
63
+ case 0:
64
+ _context.next = 2;
65
+ return _axios["default"].get("locales/".concat(language, "/").concat(namespace, ".json"));
66
+ case 2:
67
+ response = _context.sent;
68
+ return _context.abrupt("return", response.data);
69
+ case 4:
70
+ case "end":
71
+ return _context.stop();
72
+ }
73
+ }, _callee);
74
+ }));
75
+ return function (_x, _x2) {
76
+ return _ref.apply(this, arguments);
77
+ };
78
+ }());
79
+ _this.Backend = {
80
+ type: "backend",
81
+ init: function init(services, backendOptions, i18nextOptions) {},
82
+ read: function read(language, namespace, callback) {
83
+ // Prepare all promises that obtain (downloads) translations for a given language and namespace
84
+ var promises = _this.Sources.flatMap(function (source) {
85
+ return source(language, namespace);
86
+ });
87
+ return new Promise(/*#__PURE__*/function () {
88
+ var _ref2 = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee2(resolve, reject) {
89
+ var bundles, combined;
90
+ return _regenerator["default"].wrap(function _callee2$(_context2) {
91
+ while (1) switch (_context2.prev = _context2.next) {
92
+ case 0:
93
+ _context2.next = 2;
94
+ return Promise.all(promises.map(function (p) {
95
+ return p["catch"](function (err) {
96
+ console.warn("Failed to load locales:", err);
97
+ return {}; // Skip errors
98
+ });
99
+ }));
100
+ case 2:
101
+ bundles = _context2.sent;
102
+ // Combine downloaded bundles into a one
103
+ combined = bundles.reduce(function (accumulator, currentObject) {
104
+ return _objectSpread(_objectSpread({}, accumulator), currentObject);
105
+ }, {}); // Set the combined bundle to i18n
106
+ resolve(callback(null, combined));
107
+ case 5:
108
+ case "end":
109
+ return _context2.stop();
110
+ }
111
+ }, _callee2);
112
+ }));
113
+ return function (_x3, _x4) {
114
+ return _ref2.apply(this, arguments);
115
+ };
116
+ }());
117
+ }
118
+ };
119
+ _this.i18n = _i18next["default"].use(_this.Backend).use(_reactI18next.initReactI18next).use(_i18nextBrowserLanguagedetector["default"]).init(config, function (err, t) {
120
+ if (err) {
121
+ console.log('Failed to load localizations:', err);
122
+ }
123
+ });
124
+ return _this;
125
+ }
126
+ (0, _inherits2["default"])(I18nService, _Service);
127
+ return (0, _createClass2["default"])(I18nService, [{
128
+ key: "initialize",
129
+ value: function () {
130
+ var _initialize = (0, _asyncToGenerator2["default"])(/*#__PURE__*/_regenerator["default"].mark(function _callee3() {
131
+ return _regenerator["default"].wrap(function _callee3$(_context3) {
132
+ while (1) switch (_context3.prev = _context3.next) {
133
+ case 0:
134
+ _context3.next = 2;
135
+ return this.i18n;
136
+ case 2:
137
+ _context3.next = 4;
138
+ return _i18next["default"].reloadResources();
139
+ case 4:
140
+ this.App.removeSplashScreenRequestor(this);
141
+ case 5:
142
+ case "end":
143
+ return _context3.stop();
144
+ }
145
+ }, _callee3, this);
146
+ }));
147
+ function initialize() {
148
+ return _initialize.apply(this, arguments);
149
+ }
150
+ return initialize;
151
+ }()
152
+ }, {
153
+ key: "addSource",
154
+ value: function addSource(promise) {
155
+ this.Sources.push(promise);
156
+ }
157
+ }]);
158
+ }(_asab_webui_components.Service);
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+
3
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports["default"] = void 0;
8
+ var _react = _interopRequireWildcard(require("react"));
9
+ var _reactRedux = require("react-redux");
10
+ var _reactI18next = require("react-i18next");
11
+ var _reactstrap = require("reactstrap");
12
+ 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); }
13
+ 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; }
14
+ function TenantDropdown(_ref) {
15
+ var tenants = _ref.tenants,
16
+ current = _ref.current;
17
+ var _useTranslation = (0, _reactI18next.useTranslation)(),
18
+ t = _useTranslation.t;
19
+ return /*#__PURE__*/_react["default"].createElement(_reactstrap.UncontrolledDropdown, {
20
+ direction: "down",
21
+ title: t('tenant|Tenant')
22
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.DropdownToggle, {
23
+ nav: true,
24
+ caret: true
25
+ }, /*#__PURE__*/_react["default"].createElement("i", {
26
+ className: "bi bi-house-lock pe-2"
27
+ }), /*#__PURE__*/_react["default"].createElement(TenantLabel, {
28
+ tenant: current
29
+ })), tenants && tenants.length > 0 ? /*#__PURE__*/_react["default"].createElement(_reactstrap.DropdownMenu, {
30
+ className: "shadow"
31
+ }, /*#__PURE__*/_react["default"].createElement(_reactstrap.DropdownItem, {
32
+ header: true
33
+ }, "Tenants"), tenants.map(function (tenant, i) {
34
+ return /*#__PURE__*/_react["default"].createElement(_reactstrap.DropdownItem, {
35
+ key: i,
36
+ tag: "a",
37
+ href: '?tenant=' + tenant + '#/'
38
+ }, /*#__PURE__*/_react["default"].createElement(TenantLabel, {
39
+ tenant: tenant
40
+ }));
41
+ })) : null);
42
+ }
43
+ function TenantLabel(_ref2) {
44
+ var tenant = _ref2.tenant;
45
+ return /*#__PURE__*/_react["default"].createElement("span", null, tenant);
46
+ }
47
+ var mapStateToProps = function mapStateToProps(state) {
48
+ return {
49
+ current: state.tenant.current,
50
+ tenants: state.tenant.tenants
51
+ };
52
+ };
53
+ var _default = exports["default"] = (0, _reactRedux.connect)(mapStateToProps, null)(TenantDropdown);