asab_webui_shell 25.1.6 → 25.1.8-alpha.0

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/README.md CHANGED
@@ -1,3 +1,28 @@
1
1
  # TeskaLabs ASAB WebUI Shell Library
2
2
 
3
3
  Shell library of ASAB used in WebUI projects.
4
+
5
+ ## Getting started
6
+
7
+ ```
8
+ pnpm add asab_webui_shell
9
+ ```
10
+
11
+ ## Usage
12
+
13
+ ```
14
+ import { Application } from 'asab_webui_shell';
15
+ ```
16
+
17
+ Possible imports:
18
+
19
+ - Application
20
+ - AboutModule
21
+ - AuthModule
22
+ - TenantModule
23
+ - I18nModule
24
+ - getBrandImage
25
+
26
+ ## Documentation
27
+
28
+ **TODO**
@@ -124,6 +124,10 @@ var Application = /*#__PURE__*/function (_Component) {
124
124
  _this.ReduxService.addReducer("sidebar", _reducer2["default"]);
125
125
  _this.ReduxService.addReducer("navigation", _reducer4["default"]);
126
126
  _this.ReduxService.addReducer("router", _reducer5["default"]);
127
+
128
+ // The application can provide a list of keys that should be automatically parsed as BigInt, when received from the server in Axios call
129
+ // This is important to preserve 64bit numbers from the server such as IP addresses, timestamps etc.
130
+ _this.JSONParseBigInt = new Set(props === null || props === void 0 ? void 0 : props.bigint);
127
131
  _this._handleKeyUp = _this._handleKeyUp.bind(_this);
128
132
  _this.state = {
129
133
  networking: 0,
@@ -337,6 +341,10 @@ var Application = /*#__PURE__*/function (_Component) {
337
341
  return undefined;
338
342
  }
339
343
  var axios = _axios["default"].create(_objectSpread(_objectSpread({}, props), {}, {
344
+ transformResponse: function transformResponse(res) {
345
+ return res;
346
+ },
347
+ // Disable implicit JSON parsing, we explicitly parse JSON in the interceptor ( https://stackoverflow.com/questions/41013082/disable-json-parsing-in-axios )
340
348
  baseURL: service_url
341
349
  }));
342
350
 
@@ -370,9 +378,39 @@ var Application = /*#__PURE__*/function (_Component) {
370
378
  return Promise.reject(error);
371
379
  });
372
380
 
373
- // We want to remove networking indicator when we recieve the response
381
+ // We want to remove the networking indicator when we receive the response
374
382
  axios.interceptors.response.use(function (response) {
383
+ var _response$headers$con;
384
+ // Call the `popNetworkingIndicator` method to remove the networking indicator (e.g., loading spinner)
375
385
  that.popNetworkingIndicator();
386
+
387
+ // Check if the response content type is 'application/json' or starts with 'application/json'
388
+ if (response !== null && response !== void 0 && (_response$headers$con = response.headers['content-type']) !== null && _response$headers$con !== void 0 && _response$headers$con.startsWith('application/json')) {
389
+ // If the response is JSON, then parse it with respect to BigInt
390
+ // https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/parse
391
+ try {
392
+ // Parse the response data using a custom reviver function
393
+ response.data = JSON.parse(response.data,
394
+ // Custom reviver function to handle BigInt values
395
+ function (key, value, context) {
396
+ // If there is no data in the JSONParseBigInt, return the value immediately
397
+ if (that.JSONParseBigInt.size === 0) {
398
+ return value;
399
+ }
400
+ // Check if the key is in the `JSONParseBigInt` set and the value is a number
401
+ if (that.JSONParseBigInt.has(key) && typeof value === 'number') {
402
+ // Convert the number to a BigInt
403
+ return BigInt(context.source);
404
+ }
405
+ // Return the original value if no conversion is needed
406
+ return value;
407
+ });
408
+ } catch (e) {
409
+ // Log any errors that occur during JSON parsing
410
+ console.error("Error in axios.interceptors.response", e);
411
+ }
412
+ }
413
+ // If the request was satisfied (application/json and presence of BigInt) return the modified object. If not, we return unchanged object
376
414
  return response;
377
415
  }, function (error) {
378
416
  that.popNetworkingIndicator();
@@ -10,7 +10,7 @@ var _actions = require("../../actions");
10
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
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
12
  var initialState = {
13
- helpPath: "https://docs.teskalabs.com/logman.io/user/",
13
+ helpPath: undefined,
14
14
  subtitle: undefined,
15
15
  flag: undefined,
16
16
  headerNavItems: []
@@ -49,14 +49,16 @@ function RouteRenderer(props) {
49
49
  return (_state$auth = state.auth) !== null && _state$auth !== void 0 && _state$auth.resources ? state.auth.resources : [];
50
50
  });
51
51
  var dispatch = (0, _reactRedux.useDispatch)();
52
+ var defaultHelp = props.app.Config.get("help");
53
+
52
54
  // Set up and dispatch help content
53
55
  (0, _react.useEffect)(function () {
54
- var defaultHelp = "https://docs.teskalabs.com/logman.io/user/";
55
56
  dispatch({
56
57
  type: _actions.SET_HELP_PATH,
57
58
  helpPath: props.route.help ? props.route.help : defaultHelp
58
59
  });
59
60
  }, [props.route.help]);
61
+
60
62
  // Route component renders the approriate screen based on the route
61
63
  if (props.route.resource) {
62
64
  // If resource present, let UnauthorizedAccessScreen to decide if the Screen will be rendered
@@ -1,22 +1,42 @@
1
1
  "use strict";
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
4
5
  Object.defineProperty(exports, "__esModule", {
5
6
  value: true
6
7
  });
7
8
  exports["default"] = void 0;
8
- var _react = _interopRequireDefault(require("react"));
9
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
10
+ var _react = _interopRequireWildcard(require("react"));
9
11
  var _reactI18next = require("react-i18next");
10
12
  var _reactRedux = require("react-redux");
13
+ var _BrandImage = require("../../components/branding/BrandImage");
11
14
  var _reactstrap = require("reactstrap");
15
+ 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); }
16
+ 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; }
12
17
  function AboutScreen(props) {
18
+ var _useState = (0, _react.useState)(undefined),
19
+ _useState2 = (0, _slicedToArray2["default"])(_useState, 2),
20
+ brandImage = _useState2[0],
21
+ setBrandImage = _useState2[1];
22
+ var theme = (0, _reactRedux.useSelector)(function (state) {
23
+ return state.theme;
24
+ });
25
+ (0, _react.useEffect)(function () {
26
+ setBrandImage((0, _BrandImage.getBrandImage)(props, theme));
27
+ }, [theme]);
13
28
  return /*#__PURE__*/_react["default"].createElement(_reactstrap.Container, {
14
29
  className: "pt-5"
15
30
  }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Row, {
16
31
  className: "justify-content-center"
17
32
  }, /*#__PURE__*/_react["default"].createElement(_reactstrap.Col, {
18
33
  md: "6"
19
- }, /*#__PURE__*/_react["default"].createElement(AboutCard, {
34
+ }, /*#__PURE__*/_react["default"].createElement("div", {
35
+ className: "my-4"
36
+ }, brandImage ? /*#__PURE__*/_react["default"].createElement("img", {
37
+ src: brandImage === null || brandImage === void 0 ? void 0 : brandImage.full,
38
+ alt: "TeskaLabs logo"
39
+ }) : null), /*#__PURE__*/_react["default"].createElement(AboutCard, {
20
40
  app: props.app
21
41
  }))));
22
42
  }
@@ -86,7 +86,7 @@ function AuthHeaderDropdown(props) {
86
86
  }) : /*#__PURE__*/_react["default"].createElement("i", {
87
87
  alt: userinfo === null || userinfo === void 0 ? void 0 : userinfo.username,
88
88
  className: "pe-2 bi ".concat(isSuperuser ? 'bi-universal-access' : 'bi-person-gear')
89
- }), /*#__PURE__*/_react["default"].createElement("span", null, userinfo === null || userinfo === void 0 ? void 0 : userinfo.username)), /*#__PURE__*/_react["default"].createElement(_reactstrap.DropdownMenu, {
89
+ }), /*#__PURE__*/_react["default"].createElement("span", null, (userinfo === null || userinfo === void 0 ? void 0 : userinfo.username) || (userinfo === null || userinfo === void 0 ? void 0 : userinfo.sub))), /*#__PURE__*/_react["default"].createElement(_reactstrap.DropdownMenu, {
90
90
  className: "shadow"
91
91
  }, /*#__PURE__*/_react["default"].createElement(_reactstrap.DropdownItem, {
92
92
  header: true
package/package.json CHANGED
@@ -1,8 +1,23 @@
1
1
  {
2
2
  "name": "asab_webui_shell",
3
- "version": "25.1.6",
3
+ "version": "25.1.8-alpha.0",
4
4
  "license": "BSD-3-Clause",
5
5
  "description": "TeskaLabs ASAB WebUI Shell Application",
6
+ "contributors": [
7
+ {
8
+ "name": "TeskaLabs",
9
+ "email": "info@teskalabs.com",
10
+ "url": "https://teskalabs.com"
11
+ }
12
+ ],
13
+ "repository": {
14
+ "type": "git",
15
+ "url": "git+ssh://git@github.com:TeskaLabs/asab-webui-shell-lib.git"
16
+ },
17
+ "bugs": {
18
+ "url": "https://github.com/TeskaLabs/asab-webui-shell-lib/issues"
19
+ },
20
+ "homepage": "https://github.com/TeskaLabs/asab-webui-shell-lib",
6
21
  "main": "dist/index.js",
7
22
  "files": [
8
23
  "dist"