@equinor/echo-framework 0.8.4 → 0.8.7

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 (77) hide show
  1. package/dist/components/contextualAppLinks/externalLinkButtons/externalLinkButtons.helpers.d.ts +47 -0
  2. package/dist/components/contextualAppLinks/externalLinkButtons/externalLinkButtons.helpers.test.d.ts +1 -0
  3. package/dist/components/contextualAppLinks/externalLinkButtons/externalLinkToCommApp.d.ts +14 -0
  4. package/dist/components/contextualAppLinks/externalLinkButtons/externalLinkToMcApp.d.ts +3 -1
  5. package/dist/components/contextualAppLinks/externalLinkButtons/externalLinkToProCoSys.d.ts +1 -2
  6. package/dist/components/contextualAppLinks/externalLinkButtons/externalLinkToSap.d.ts +3 -0
  7. package/dist/components/contextualAppLinks/externalLinkButtons/externalLinkToSemiDoc.d.ts +4 -0
  8. package/dist/components/contextualAppLinks/externalLinkButtons/externalLinkToTr2000.d.ts +2 -0
  9. package/dist/components/contextualAppLinks/externalLinkButtons/iconButtonSpinner.d.ts +18 -0
  10. package/dist/components/contextualAppLinks/externalLinkButtons/index.d.ts +1 -0
  11. package/dist/components/externalLinkButton/externalLinkButton.d.ts +16 -7
  12. package/dist/components/realTimeData/hooks/useSignalR.d.ts +3 -2
  13. package/dist/hooks/useSemi.d.ts +11 -7
  14. package/dist/hooks/useTagDetails.d.ts +10 -3
  15. package/dist/index.d.ts +11 -3
  16. package/dist/services/api/api-manager.d.ts +1 -1
  17. package/dist/services/api/api-tag-details.d.ts +18 -0
  18. package/dist/services/api/api-tag-details.test.d.ts +1 -0
  19. package/dist/services/api/api-tags.d.ts +17 -0
  20. package/dist/services/api/api-tags.test.d.ts +1 -0
  21. package/dist/services/api/index.d.ts +1 -0
  22. package/dist/services/echopediaAnalyticsModule/echopediaAnalyticsModule.d.ts +1 -0
  23. package/dist/src/components/containers/layout.module.css.js +1 -1
  24. package/dist/src/components/containers/layouts.js +45 -48
  25. package/dist/src/components/contextualAppLinks/externalAppsMenu.js +4 -4
  26. package/dist/src/components/contextualAppLinks/externalLinkButtons/allExternalLinks.js +66 -11
  27. package/dist/src/components/contextualAppLinks/externalLinkButtons/externalLinkButtons.helpers.js +169 -0
  28. package/dist/src/components/contextualAppLinks/externalLinkButtons/externalLinkToCommApp.js +93 -0
  29. package/dist/src/components/contextualAppLinks/externalLinkButtons/externalLinkToMcApp.js +60 -5
  30. package/dist/src/components/contextualAppLinks/externalLinkButtons/externalLinkToProCoSys.js +43 -11
  31. package/dist/src/components/contextualAppLinks/externalLinkButtons/externalLinkToSafeX.js +1 -1
  32. package/dist/src/components/contextualAppLinks/externalLinkButtons/externalLinkToSap.js +58 -11
  33. package/dist/src/components/contextualAppLinks/externalLinkButtons/externalLinkToSemiDoc.js +16 -5
  34. package/dist/src/components/contextualAppLinks/externalLinkButtons/externalLinkToStid.js +1 -1
  35. package/dist/src/components/contextualAppLinks/externalLinkButtons/externalLinkToTr2000.js +67 -16
  36. package/dist/src/components/contextualAppLinks/externalLinkButtons/iconButtonSpinner.js +44 -0
  37. package/dist/src/components/contextualAppLinks/externalLinkButtons/iconButtonSpinner.module.css.js +15 -0
  38. package/dist/src/components/externalLinkButton/externalLinkButton.js +89 -34
  39. package/dist/src/components/externalLinkButton/externalLinkButton.module.css.js +5 -2
  40. package/dist/src/components/realTimeData/components/connectorForIMSTag/IMSConnector.module.css.js +3 -2
  41. package/dist/src/components/realTimeData/components/connectorForIMSTag/RealTimeConnectorForIMSTag.js +32 -7
  42. package/dist/src/components/realTimeData/hooks/useSignalR.js +4 -2
  43. package/dist/src/coreApplication/EchoBarComponent.js +8 -9
  44. package/dist/src/coreApplication/EchoContent.js +1 -5
  45. package/dist/src/coreApplication/EchoContent.module.css.js +1 -5
  46. package/dist/src/hooks/useSemi.js +40 -14
  47. package/dist/src/hooks/useTagDetails.js +116 -45
  48. package/dist/src/icons/common/CommissionApp-icon.png.js +7 -0
  49. package/dist/src/icons/common/Evision.svg.js +3 -2
  50. package/dist/src/icons/common/Fusion.svg.js +30 -25
  51. package/dist/src/icons/common/McApp.svg.js +10 -6
  52. package/dist/src/icons/common/Notification.svg.js +82 -0
  53. package/dist/src/icons/common/ProCoSysIcon.svg.js +3 -2
  54. package/dist/src/icons/common/SapLogo.svg.js +5 -4
  55. package/dist/src/icons/common/SemiIcon.svg.js +11 -11
  56. package/dist/src/icons/common/Stid.svg.js +3 -2
  57. package/dist/src/icons/common/TR2000.svg.js +8 -6
  58. package/dist/src/icons/common/WorkOrder.svg.js +72 -0
  59. package/dist/src/icons/common/Yammer.svg.js +2 -1
  60. package/dist/src/icons/common/satos-logo.png.js +7 -0
  61. package/dist/src/index.js +15 -1
  62. package/dist/src/services/api/api-manager.js +2 -2
  63. package/dist/src/services/api/api-realtimedata.js +3 -1
  64. package/dist/src/services/api/api-tag-details.js +66 -0
  65. package/dist/src/services/api/api-tags.js +29 -0
  66. package/dist/src/services/echopediaAnalyticsModule/echopediaAnalyticsModule.js +10 -0
  67. package/dist/src/types/pingableSources.js +1 -0
  68. package/dist/src/utils/navigationUtils.js +28 -0
  69. package/dist/src/utils/plantInfo.js +1 -0
  70. package/dist/types/api-proCoSysTagResponse.d.ts +8 -0
  71. package/dist/types/pingableSources.d.ts +2 -1
  72. package/dist/utils/index.d.ts +1 -0
  73. package/dist/utils/navigationUtils.d.ts +7 -0
  74. package/dist/utils/navigationUtils.test.d.ts +1 -0
  75. package/dist/utils/plantInfo.d.ts +6 -0
  76. package/dist/utils/plantInfo.test.d.ts +1 -0
  77. package/package.json +3 -3
@@ -24,20 +24,31 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
24
24
  * Will only render if Semi is available for the passed tagNo.
25
25
  *
26
26
  * @param {string} tagNo The tag's number to open in Semi.
27
+ * @param {string} instCode Plant installation code.
28
+ * @param {(isLoading: boolean) => void} loadingStatusCallback Callback which provides an 'isLoading' param reflecting the actual API call state for checking Semi availability.
27
29
  * @returns {React.FC<ExternalLinkToSemiDocProps>} React component.
28
30
  */
29
31
 
30
32
 
31
33
  var ExternalLinkToSemiDoc = function ExternalLinkToSemiDoc(_ref) {
32
- var tagNo = _ref.tagNo;
34
+ var tagNo = _ref.tagNo,
35
+ instCode = _ref.instCode,
36
+ loadingStatusCallback = _ref.loadingStatusCallback;
33
37
 
34
38
  var _useSemi$useSemi = useSemi.useSemi({
35
- tagNo: tagNo
39
+ tagNo: tagNo,
40
+ instCode: instCode
36
41
  }),
37
42
  isSemiDocumentAvailable = _useSemi$useSemi.isSemiDocumentAvailable,
38
- semiDocumentId = _useSemi$useSemi.semiDocumentId;
39
-
40
- return isSemiDocumentAvailable ? /*#__PURE__*/React__default["default"].createElement(externalLinkButton["default"], {
43
+ semiDocumentId = _useSemi$useSemi.semiDocumentId,
44
+ isSemiLoading = _useSemi$useSemi.isSemiLoading;
45
+
46
+ React.useEffect(function () {
47
+ if (!!loadingStatusCallback) {
48
+ loadingStatusCallback(isSemiLoading);
49
+ }
50
+ }, [isSemiLoading, loadingStatusCallback]);
51
+ return isSemiDocumentAvailable && !isSemiLoading ? /*#__PURE__*/React__default["default"].createElement(externalLinkButton.ExternalLinkButton, {
41
52
  buttonName: "Semi",
42
53
  buttonIcon: "Semi",
43
54
  linkTo: "https://semi.equinor.com/uploaddocumentation?semiId=".concat(semiDocumentId),
@@ -29,7 +29,7 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
29
29
  var ExternalLinkToStid = function ExternalLinkToStid(_ref) {
30
30
  var tagNo = _ref.tagNo,
31
31
  instCode = _ref.instCode;
32
- return /*#__PURE__*/React__default["default"].createElement(externalLinkButton["default"], {
32
+ return /*#__PURE__*/React__default["default"].createElement(externalLinkButton.ExternalLinkButton, {
33
33
  buttonName: "STID",
34
34
  buttonIcon: "Stid",
35
35
  linkTo: "https://stid.equinor.com/".concat(instCode, "/tag/").concat(tagNo),
@@ -1,5 +1,17 @@
1
1
  'use strict';
2
2
 
3
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4
+
5
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
+
7
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
8
+
9
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
10
+
11
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
12
+
13
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
+
3
15
  function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
16
 
5
17
  Object.defineProperty(exports, '__esModule', {
@@ -8,8 +20,12 @@ Object.defineProperty(exports, '__esModule', {
8
20
 
9
21
  var EchoCore = require('@equinor/echo-core');
10
22
 
23
+ var EchoUtils = require('@equinor/echo-utils');
24
+
11
25
  var React = require('react');
12
26
 
27
+ require('react-router-dom');
28
+
13
29
  var useTagDetails = require('../../../hooks/useTagDetails.js');
14
30
 
15
31
  var externalLinkButton = require('../../externalLinkButton/externalLinkButton.js');
@@ -20,6 +36,8 @@ function _interopDefaultLegacy(e) {
20
36
  };
21
37
  }
22
38
 
39
+ var EchoUtils__default = /*#__PURE__*/_interopDefaultLegacy(EchoUtils);
40
+
23
41
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
24
42
  /**
25
43
  * External link button to TR2000.
@@ -27,35 +45,68 @@ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
27
45
  *
28
46
  * @param {string} tagNo The tag's number to open in TR2000.
29
47
  * @param {string} instCode Plant installation code.
48
+ * @param {(isLoading: boolean) => void} loadingStatusCallback Callback which provides an 'isLoading' param reflecting the actual API call state for checking TR2000 availability.
30
49
  * @returns {React.FC<ExternalLinkToTr2000Props>} React component.
31
50
  */
32
51
 
33
52
 
34
53
  var ExternalLinkToTr2000 = function ExternalLinkToTr2000(_ref) {
35
54
  var tagNo = _ref.tagNo,
36
- instCode = _ref.instCode;
37
- var tagDetails = useTagDetails.useTagDetails({
55
+ instCode = _ref.instCode,
56
+ loadingStatusCallback = _ref.loadingStatusCallback;
57
+ var useStateSafe = EchoUtils__default["default"].Hooks.useStateSafe;
58
+ var selectedPlant = EchoCore.EchoSettings.plant.getSelectedPlant();
59
+
60
+ var _useStateSafe = useStateSafe(''),
61
+ _useStateSafe2 = _slicedToArray(_useStateSafe, 2),
62
+ url = _useStateSafe2[0],
63
+ setUrl = _useStateSafe2[1];
64
+
65
+ var _useStateSafe3 = useStateSafe(false),
66
+ _useStateSafe4 = _slicedToArray(_useStateSafe3, 2),
67
+ hasTr2000 = _useStateSafe4[0],
68
+ setHasTr2000 = _useStateSafe4[1];
69
+
70
+ var _useTagDetails$useTag = useTagDetails.useTagDetails({
38
71
  tagNo: tagNo,
39
72
  instCode: instCode
40
- });
41
- var selectedPlant = EchoCore.EchoSettings.plant.getSelectedPlant();
73
+ }),
74
+ tagDetails = _useTagDetails$useTag.tagDetails,
75
+ hasError = _useTagDetails$useTag.hasError,
76
+ isTagDetailsLoading = _useTagDetails$useTag.isTagDetailsLoading;
42
77
 
43
- var hasTr2000 = function hasTr2000() {
44
- var valveOk = (tagDetails === null || tagDetails === void 0 ? void 0 : tagDetails.tagCategory) === 9 && !!tagDetails.valveDatash;
45
- var pipeOk = (tagDetails === null || tagDetails === void 0 ? void 0 : tagDetails.tagCategory) === 6 && !!tagDetails.pipingClass && !!tagDetails.nomDiam;
46
- return (valveOk || pipeOk) && !!(selectedPlant === null || selectedPlant === void 0 ? void 0 : selectedPlant.hasTr2000);
47
- };
78
+ React.useEffect(function () {
79
+ function evaluateTr2000Status(tagDetails) {
80
+ var valveOk = (tagDetails === null || tagDetails === void 0 ? void 0 : tagDetails.tagCategory) === 9 && !!tagDetails.valveDatash;
81
+ var pipeOk = (tagDetails === null || tagDetails === void 0 ? void 0 : tagDetails.tagCategory) === 6 && !!tagDetails.pipingClass && !!tagDetails.nomDiam;
82
+ return (valveOk || pipeOk) && !!(selectedPlant === null || selectedPlant === void 0 ? void 0 : selectedPlant.hasTr2000);
83
+ }
48
84
 
49
- var createTr2000Link = function createTr2000Link() {
50
- var ds = (tagDetails === null || tagDetails === void 0 ? void 0 : tagDetails.tagCategory) === 6 ? 'PCS' : 'VDS';
51
- var id = (tagDetails === null || tagDetails === void 0 ? void 0 : tagDetails.tagCategory) === 6 ? tagDetails.pipingClass : tagDetails === null || tagDetails === void 0 ? void 0 : tagDetails.valveDatash;
52
- return "https://tr2000.equinor.com/TR2000/integration/get_datasheet.jsp?SYS=STID&DS=".concat(ds, "&ID=").concat(id, "&PLANT=").concat(instCode);
53
- };
85
+ if (!!loadingStatusCallback) {
86
+ loadingStatusCallback(isTagDetailsLoading);
87
+ }
88
+
89
+ if (hasError) {
90
+ setHasTr2000(false);
91
+ return;
92
+ }
93
+
94
+ setHasTr2000(evaluateTr2000Status(tagDetails));
95
+
96
+ if (hasTr2000) {
97
+ var ds = (tagDetails === null || tagDetails === void 0 ? void 0 : tagDetails.tagCategory) === 6 ? 'PCS' : 'VDS';
98
+ var id = (tagDetails === null || tagDetails === void 0 ? void 0 : tagDetails.tagCategory) === 6 ? tagDetails.pipingClass : tagDetails === null || tagDetails === void 0 ? void 0 : tagDetails.valveDatash;
99
+ setUrl("https://tr2000.equinor.com/TR2000/integration/get_datasheet.jsp?SYS=STID&DS=".concat(ds, "&ID=").concat(id, "&PLANT=").concat(instCode));
100
+ }
54
101
 
55
- return tagDetails && hasTr2000() ? /*#__PURE__*/React__default["default"].createElement(externalLinkButton["default"], {
102
+ if (!!loadingStatusCallback) {
103
+ loadingStatusCallback(isTagDetailsLoading);
104
+ }
105
+ }, [tagNo, instCode, loadingStatusCallback, setUrl, setHasTr2000, isTagDetailsLoading, tagDetails, hasError, hasTr2000, selectedPlant]);
106
+ return hasTr2000 && !hasError ? /*#__PURE__*/React__default["default"].createElement(externalLinkButton.ExternalLinkButton, {
56
107
  buttonName: "TR2000",
57
108
  buttonIcon: "TR2000",
58
- linkTo: createTr2000Link(),
109
+ linkTo: url,
59
110
  buttonStyle: externalLinkButton.ExternalLinkButtonStyle.Rounded
60
111
  }) : null;
61
112
  };
@@ -0,0 +1,44 @@
1
+ 'use strict';
2
+
3
+ function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
+
5
+ Object.defineProperty(exports, '__esModule', {
6
+ value: true
7
+ });
8
+
9
+ var edsCoreReact = require('@equinor/eds-core-react');
10
+
11
+ var React = require('react');
12
+
13
+ var iconButtonSpinner_module = require('./iconButtonSpinner.module.css.js');
14
+
15
+ function _interopDefaultLegacy(e) {
16
+ return e && _typeof(e) === 'object' && 'default' in e ? e : {
17
+ 'default': e
18
+ };
19
+ }
20
+
21
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
22
+ /**
23
+ * Local component for external link buttons. Provides a spinner overlay for any icon buttons, which might have any async calls.
24
+ * @param {Object} param
25
+ * @param {number} param.size The size of the spinner. Default value is 24.
26
+ * @param {Object} param.customClassNames Optional custom class names to customize the component's parts.
27
+ * @param {string} param.customClassNames.spinner Class name applied on the spinner.
28
+ * @param {string} param.customClassNames.container Class name applied on the container element.
29
+ */
30
+
31
+
32
+ var IconButtonSpinner = function IconButtonSpinner(_ref) {
33
+ var customClassNames = _ref.customClassNames,
34
+ size = _ref.size;
35
+ return /*#__PURE__*/React__default["default"].createElement("div", {
36
+ className: "".concat((customClassNames === null || customClassNames === void 0 ? void 0 : customClassNames.container) || '', " ").concat(iconButtonSpinner_module["default"].container)
37
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
38
+ className: "".concat((customClassNames === null || customClassNames === void 0 ? void 0 : customClassNames.spinner) || '', " ").concat(iconButtonSpinner_module["default"].spinner)
39
+ }, /*#__PURE__*/React__default["default"].createElement(edsCoreReact.Progress.Circular, {
40
+ size: size || 24
41
+ })));
42
+ };
43
+
44
+ exports.IconButtonSpinner = IconButtonSpinner;
@@ -0,0 +1,15 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', {
4
+ value: true
5
+ });
6
+
7
+ var styleInject_es = require('../../../../node_modules/style-inject/dist/style-inject.es.js');
8
+
9
+ var css_248z = ".iconButtonSpinner-module_container__56QXT{height:48px;position:relative;width:48px}.iconButtonSpinner-module_spinner__Rym9p{position:relative;text-align:center;top:50%;transform:translateY(-50%)}";
10
+ var styles = {
11
+ "container": "iconButtonSpinner-module_container__56QXT",
12
+ "spinner": "iconButtonSpinner-module_spinner__Rym9p"
13
+ };
14
+ styleInject_es["default"](css_248z);
15
+ exports["default"] = styles;
@@ -1,5 +1,17 @@
1
1
  'use strict';
2
2
 
3
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
4
+
5
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
6
+
7
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
8
+
9
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }
10
+
11
+ function _iterableToArrayLimit(arr, i) { var _i = arr == null ? null : typeof Symbol !== "undefined" && arr[Symbol.iterator] || arr["@@iterator"]; if (_i == null) return; var _arr = []; var _n = true; var _d = false; var _s, _e; try { for (_i = _i.call(arr); !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"] != null) _i["return"](); } finally { if (_d) throw _e; } } return _arr; }
12
+
13
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
+
3
15
  function _typeof(obj) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (obj) { return typeof obj; } : function (obj) { return obj && "function" == typeof Symbol && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }, _typeof(obj); }
4
16
 
5
17
  Object.defineProperty(exports, '__esModule', {
@@ -10,22 +22,28 @@ var _tslib = require('../../../_virtual/_tslib.js');
10
22
 
11
23
  var echoComponents = require('@equinor/echo-components');
12
24
 
13
- var EchoCore = require('@equinor/echo-core');
25
+ var EchoUtils = require('@equinor/echo-utils');
14
26
 
15
27
  var edsCoreReact = require('@equinor/eds-core-react');
16
28
 
17
29
  var React = require('react');
18
30
 
31
+ var CommissionAppIcon = require('../../icons/common/CommissionApp-icon.png.js');
32
+
19
33
  var Evision = require('../../icons/common/Evision.svg.js');
20
34
 
21
35
  var Fusion = require('../../icons/common/Fusion.svg.js');
22
36
 
23
37
  var McApp = require('../../icons/common/McApp.svg.js');
24
38
 
39
+ var Notification = require('../../icons/common/Notification.svg.js');
40
+
25
41
  var ProCoSysIcon = require('../../icons/common/ProCoSysIcon.svg.js');
26
42
 
27
43
  var SapLogo = require('../../icons/common/SapLogo.svg.js');
28
44
 
45
+ var satosLogo = require('../../icons/common/satos-logo.png.js');
46
+
29
47
  var SemiIcon = require('../../icons/common/SemiIcon.svg.js');
30
48
 
31
49
  var Stid = require('../../icons/common/Stid.svg.js');
@@ -34,8 +52,14 @@ var SXLogo = require('../../icons/common/SX-logo.png.js');
34
52
 
35
53
  var TR2000 = require('../../icons/common/TR2000.svg.js');
36
54
 
55
+ var WorkOrder = require('../../icons/common/WorkOrder.svg.js');
56
+
37
57
  var Yammer = require('../../icons/common/Yammer.svg.js');
38
58
 
59
+ var navigationUtils = require('../../utils/navigationUtils.js');
60
+
61
+ var iconButtonSpinner = require('../contextualAppLinks/externalLinkButtons/iconButtonSpinner.js');
62
+
39
63
  var externalLinkButton_module = require('./externalLinkButton.module.css.js');
40
64
 
41
65
  function _interopDefaultLegacy(e) {
@@ -44,13 +68,15 @@ function _interopDefaultLegacy(e) {
44
68
  };
45
69
  }
46
70
 
71
+ var EchoUtils__default = /*#__PURE__*/_interopDefaultLegacy(EchoUtils);
72
+
47
73
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
48
74
 
49
- var echopediaAnalyticsModule = EchoCore.analytics.createAnalyticsModule('ep');
50
75
  exports.ExternalLinkButtonStyle = void 0;
51
76
 
52
77
  (function (ExternalLinkButtonStyle) {
53
78
  ExternalLinkButtonStyle["Rounded"] = "Rounded";
79
+ ExternalLinkButtonStyle["Large"] = "Large";
54
80
  })(exports.ExternalLinkButtonStyle || (exports.ExternalLinkButtonStyle = {}));
55
81
  /**
56
82
  *
@@ -61,7 +87,8 @@ exports.ExternalLinkButtonStyle = void 0;
61
87
  * @param {boolean} props.hideText Optional. If set to `true`, will hide `buttonName`.
62
88
  * @param {boolean} props.redirect Optional. If set to `true`, the app will not open in a new tab / window, but in the current one.
63
89
  * @param {ExternalLinkButtonStyle} props.buttonStyle Optional.
64
- * @param {() => Promise<string>} props.getUrlToOpen Optional. Function () => Promise<string>. Custom async function to be called to handle the navigation.
90
+ * @param {(...args) => Promise<string | undefined>} props.getUrlToOpen Optional. Pass this custom async function to create a URL based on async data.
91
+ * Return with 'undefined' to prevent any navigation. (Useful when the API call fails)
65
92
  * @param {boolean} props.disabledColor Optional. If set to `true`, the button will show disabled color. (If not Rounded button style is used)
66
93
  * @param {boolean} props.disabledButton Optional.
67
94
  * @param {string} props.hoverText Optional. Applies only if Rounded button style is applied.
@@ -80,7 +107,16 @@ var ExternalLinkButton = function ExternalLinkButton(_ref) {
80
107
  disabledColor = _ref.disabledColor,
81
108
  disabledButton = _ref.disabledButton,
82
109
  hoverText = _ref.hoverText;
110
+
111
+ var _EchoUtils__default$d = EchoUtils__default["default"].Hooks.useStateSafe(false),
112
+ _EchoUtils__default$d2 = _slicedToArray(_EchoUtils__default$d, 2),
113
+ isLoading = _EchoUtils__default$d2[0],
114
+ setIsLoading = _EchoUtils__default$d2[1];
115
+
83
116
  var icon = null;
117
+ var isAsyncButton = !!getUrlToOpen;
118
+ var isRoundedButtonStyle = buttonStyle === exports.ExternalLinkButtonStyle.Rounded;
119
+ var imageBasedIconStyle = isRoundedButtonStyle ? externalLinkButton_module["default"].roundedButtonIconAsImage : externalLinkButton_module["default"].largeButtonIconAsImage;
84
120
 
85
121
  function goToLink(event) {
86
122
  return _tslib.__awaiter(this, void 0, void 0, /*#__PURE__*/regeneratorRuntime.mark(function _callee() {
@@ -92,28 +128,29 @@ var ExternalLinkButton = function ExternalLinkButton(_ref) {
92
128
  event.persist();
93
129
  event.preventDefault();
94
130
 
95
- if (!getUrlToOpen) {
96
- _context.next = 8;
131
+ if (!isAsyncButton) {
132
+ _context.next = 10;
97
133
  break;
98
134
  }
99
135
 
100
- _context.next = 5;
136
+ setIsLoading(true);
137
+ _context.next = 6;
101
138
  return getUrlToOpen();
102
139
 
103
- case 5:
104
- _context.t0 = _context.sent;
105
- _context.next = 9;
140
+ case 6:
141
+ link = _context.sent;
142
+ setIsLoading(false);
143
+ _context.next = 11;
106
144
  break;
107
145
 
108
- case 8:
109
- _context.t0 = linkTo;
146
+ case 10:
147
+ link = linkTo;
110
148
 
111
- case 9:
112
- link = _context.t0;
113
- goToExternalLink(link, redirect);
149
+ case 11:
150
+ link && navigationUtils.goToExternalLink(link, redirect);
114
151
  event.stopPropagation();
115
152
 
116
- case 12:
153
+ case 13:
117
154
  case "end":
118
155
  return _context.stop();
119
156
  }
@@ -122,18 +159,6 @@ var ExternalLinkButton = function ExternalLinkButton(_ref) {
122
159
  }));
123
160
  }
124
161
 
125
- function goToExternalLink(link, redirect) {
126
- echopediaAnalyticsModule.trackEventBy('ExternalLink', 'Opened', {
127
- linkTo: link
128
- });
129
-
130
- if (redirect) {
131
- window.location.href = link;
132
- } else {
133
- window.open(link, '_blank');
134
- }
135
- }
136
-
137
162
  switch (buttonIcon) {
138
163
  case 'Fusion':
139
164
  icon = /*#__PURE__*/React__default["default"].createElement(Fusion.ReactComponent, null);
@@ -194,12 +219,18 @@ var ExternalLinkButton = function ExternalLinkButton(_ref) {
194
219
  icon = /*#__PURE__*/React__default["default"].createElement(McApp.ReactComponent, null);
195
220
  break;
196
221
 
197
- case 'Sap':
198
- icon = /*#__PURE__*/React__default["default"].createElement(SapLogo.ReactComponent, {
199
- viewBox: "0 0 92 45"
222
+ case 'CommApp':
223
+ icon = /*#__PURE__*/React__default["default"].createElement("img", {
224
+ src: CommissionAppIcon["default"],
225
+ className: imageBasedIconStyle,
226
+ alt: "CommissionAppIcon"
200
227
  });
201
228
  break;
202
229
 
230
+ case 'Sap':
231
+ icon = /*#__PURE__*/React__default["default"].createElement(SapLogo.ReactComponent, null);
232
+ break;
233
+
203
234
  case 'Semi':
204
235
  icon = /*#__PURE__*/React__default["default"].createElement(SemiIcon.ReactComponent, null);
205
236
  break;
@@ -207,8 +238,16 @@ var ExternalLinkButton = function ExternalLinkButton(_ref) {
207
238
  case 'SafeX':
208
239
  icon = /*#__PURE__*/React__default["default"].createElement("img", {
209
240
  src: SXLogo["default"],
210
- className: externalLinkButton_module["default"].buttonIconAsImage,
211
- alt: "SafeX"
241
+ className: imageBasedIconStyle,
242
+ alt: "SafeXIcon"
243
+ });
244
+ break;
245
+
246
+ case 'Satos':
247
+ icon = /*#__PURE__*/React__default["default"].createElement("img", {
248
+ src: satosLogo["default"],
249
+ className: imageBasedIconStyle,
250
+ alt: "SatosIcon"
212
251
  });
213
252
  break;
214
253
 
@@ -222,9 +261,24 @@ var ExternalLinkButton = function ExternalLinkButton(_ref) {
222
261
  case 'Tr2000':
223
262
  icon = /*#__PURE__*/React__default["default"].createElement(TR2000.ReactComponent, null);
224
263
  break;
264
+
265
+ case 'Notification':
266
+ icon = /*#__PURE__*/React__default["default"].createElement(Notification.ReactComponent, null);
267
+ break;
268
+
269
+ case 'WorkOrder':
270
+ icon = /*#__PURE__*/React__default["default"].createElement(WorkOrder.ReactComponent, null);
271
+ break;
225
272
  }
226
273
 
227
- return buttonStyle === exports.ExternalLinkButtonStyle.Rounded ? /*#__PURE__*/React__default["default"].createElement(edsCoreReact.Tooltip, {
274
+ return isRoundedButtonStyle ? /*#__PURE__*/React__default["default"].createElement("div", {
275
+ className: externalLinkButton_module["default"].roundedButtonWrapper
276
+ }, isAsyncButton && isLoading && /*#__PURE__*/React__default["default"].createElement(iconButtonSpinner.IconButtonSpinner, {
277
+ size: 24,
278
+ customClassNames: {
279
+ container: externalLinkButton_module["default"].asyncButtonSpinner
280
+ }
281
+ }), /*#__PURE__*/React__default["default"].createElement(edsCoreReact.Tooltip, {
228
282
  placement: "bottom",
229
283
  title: hoverText !== null && hoverText !== void 0 ? hoverText : buttonName
230
284
  }, /*#__PURE__*/React__default["default"].createElement(edsCoreReact.Button, {
@@ -234,7 +288,7 @@ var ExternalLinkButton = function ExternalLinkButton(_ref) {
234
288
  goToLink(event);
235
289
  },
236
290
  disabled: disabledButton
237
- }, icon)) : /*#__PURE__*/React__default["default"].createElement("button", {
291
+ }, icon))) : /*#__PURE__*/React__default["default"].createElement("button", {
238
292
  className: "".concat(externalLinkButton_module["default"].echoButton, " ").concat(disabledColor ? externalLinkButton_module["default"].echoButtonDisabled : ''),
239
293
  onClick: function onClick(event) {
240
294
  goToLink(event);
@@ -244,4 +298,5 @@ var ExternalLinkButton = function ExternalLinkButton(_ref) {
244
298
  }, icon, !hideText && /*#__PURE__*/React__default["default"].createElement("span", null, buttonName));
245
299
  };
246
300
 
301
+ exports.ExternalLinkButton = ExternalLinkButton;
247
302
  exports["default"] = ExternalLinkButton;
@@ -6,12 +6,15 @@ Object.defineProperty(exports, '__esModule', {
6
6
 
7
7
  var styleInject_es = require('../../../node_modules/style-inject/dist/style-inject.es.js');
8
8
 
9
- var css_248z = ".externalLinkButton-module_echoButton__J9As0{display:inline-block;padding:16px;position:relative;width:90px}.externalLinkButton-module_echoButtonDisabled__6kYFw{padding-bottom:0}.externalLinkButton-module_echoButtonRounded__moamZ{display:inline-block;position:relative}@media screen and (min-width:420px){.externalLinkButton-module_echoButtonDisabled__6kYFw,.externalLinkButton-module_echoButton__J9As0{width:96px}}.externalLinkButton-module_echoButton__J9As0 svg{display:inline-block;height:48px;margin:0 8px 8px;width:48px}.externalLinkButton-module_echoButtonRounded__moamZ svg{display:inline-block;height:24px;margin:0 8px;width:24px}.externalLinkButton-module_echoButton__J9As0 span{color:#007079;display:inline-block;font-size:14px;font-weight:500;line-height:16px;width:64px}.externalLinkButton-module_echoButton__J9As0:hover svg{fill:#004f55}.externalLinkButton-module_echoButton__J9As0:hover span{color:#004f55}.externalLinkButton-module_echoButtonDisabled__6kYFw span{color:var(--disabledColor)}.externalLinkButton-module_echoButtonDisabled__6kYFw:hover svg{fill:var(--disabledColor)}.externalLinkButton-module_echoButtonDisabled__6kYFw:hover span{color:var(--disabledColor)}.externalLinkButton-module_buttonIconAsImage__JL6p6{height:30px;justify-self:center;width:30px}.externalLinkButton-module_toolTip__ywPoc{background-color:#233746;border-radius:8px;box-shadow:0 0 4px rgba(0,0,0,.05),0 4px 4px rgba(0,0,0,.05);color:#fff;display:block;padding:8px 16px;position:absolute;z-index:1}.externalLinkButton-module_toolTipContainer__n1YIl{display:inline-flex;justify-content:center}.externalLinkButton-module_stidIcon__XoFaL{height:auto!important}";
9
+ var css_248z = ".externalLinkButton-module_echoButton__J9As0{display:inline-block;padding:16px;position:relative;width:90px}.externalLinkButton-module_echoButtonDisabled__6kYFw{padding-bottom:0}.externalLinkButton-module_echoButtonRounded__moamZ,.externalLinkButton-module_roundedButtonWrapper__x5h3U{display:inline-block;position:relative}.externalLinkButton-module_asyncButtonSpinner__-oNeC{opacity:.75;position:absolute;z-index:10}@media screen and (min-width:420px){.externalLinkButton-module_echoButtonDisabled__6kYFw,.externalLinkButton-module_echoButton__J9As0{width:96px}}.externalLinkButton-module_echoButton__J9As0 svg{display:inline-block;height:48px;margin:0 8px 8px;width:48px}.externalLinkButton-module_echoButtonRounded__moamZ svg{display:inline-block;height:24px;margin:0 8px;width:24px}.externalLinkButton-module_echoButton__J9As0 span{color:#007079;display:inline-block;font-size:14px;font-weight:500;line-height:16px;width:64px}.externalLinkButton-module_echoButton__J9As0:hover svg{fill:#004f55}.externalLinkButton-module_echoButton__J9As0:hover span{color:#004f55}.externalLinkButton-module_echoButtonDisabled__6kYFw span{color:var(--disabledColor)}.externalLinkButton-module_echoButtonDisabled__6kYFw:hover svg{fill:var(--disabledColor)}.externalLinkButton-module_echoButtonDisabled__6kYFw:hover span{color:var(--disabledColor)}.externalLinkButton-module_roundedButtonIconAsImage__ZBmFg{height:30px;justify-self:center;width:30px}.externalLinkButton-module_largeButtonIconAsImage__PF38e{height:auto;justify-self:center;width:100%}.externalLinkButton-module_toolTip__ywPoc{background-color:#233746;border-radius:8px;box-shadow:0 0 4px rgba(0,0,0,.05),0 4px 4px rgba(0,0,0,.05);color:#fff;display:block;padding:8px 16px;position:absolute;z-index:1}.externalLinkButton-module_toolTipContainer__n1YIl{display:inline-flex;justify-content:center}.externalLinkButton-module_stidIcon__XoFaL{height:auto!important}";
10
10
  var style = {
11
11
  "echoButton": "externalLinkButton-module_echoButton__J9As0",
12
12
  "echoButtonDisabled": "externalLinkButton-module_echoButtonDisabled__6kYFw",
13
13
  "echoButtonRounded": "externalLinkButton-module_echoButtonRounded__moamZ",
14
- "buttonIconAsImage": "externalLinkButton-module_buttonIconAsImage__JL6p6",
14
+ "roundedButtonWrapper": "externalLinkButton-module_roundedButtonWrapper__x5h3U",
15
+ "asyncButtonSpinner": "externalLinkButton-module_asyncButtonSpinner__-oNeC",
16
+ "roundedButtonIconAsImage": "externalLinkButton-module_roundedButtonIconAsImage__ZBmFg",
17
+ "largeButtonIconAsImage": "externalLinkButton-module_largeButtonIconAsImage__PF38e",
15
18
  "toolTip": "externalLinkButton-module_toolTip__ywPoc",
16
19
  "toolTipContainer": "externalLinkButton-module_toolTipContainer__n1YIl",
17
20
  "stidIcon": "externalLinkButton-module_stidIcon__XoFaL"
@@ -6,11 +6,12 @@ Object.defineProperty(exports, '__esModule', {
6
6
 
7
7
  var styleInject_es = require('../../../../../node_modules/style-inject/dist/style-inject.es.js');
8
8
 
9
- var css_248z = ".IMSConnector-module_wrapper__CvKvm{align-items:center;display:grid;gap:1rem;grid-row:1fr;grid-template-columns:1fr 1fr;justify-items:center;margin-top:1rem}.IMSConnector-module_experimentalWarning__7Vv3z{grid-template-columns:auto 1fr;margin-top:0}.IMSConnector-module_message__w8j1M{margin-top:1rem;width:100%}";
9
+ var css_248z = ".IMSConnector-module_wrapper__CvKvm{align-items:center;display:grid;gap:1rem;grid-row:1fr;grid-template-columns:1fr 1fr;justify-items:center;margin-top:1rem}.IMSConnector-module_experimentalWarning__7Vv3z{grid-template-columns:auto 1fr;margin-top:0}.IMSConnector-module_message__w8j1M{margin-top:1rem;width:100%}.IMSConnector-module_requestAccess__YDOu9{margin-bottom:1rem}";
10
10
  var style = {
11
11
  "wrapper": "IMSConnector-module_wrapper__CvKvm",
12
12
  "experimentalWarning": "IMSConnector-module_experimentalWarning__7Vv3z IMSConnector-module_wrapper__CvKvm",
13
- "message": "IMSConnector-module_message__w8j1M"
13
+ "message": "IMSConnector-module_message__w8j1M",
14
+ "requestAccess": "IMSConnector-module_requestAccess__YDOu9"
14
15
  };
15
16
  styleInject_es["default"](css_248z);
16
17
  exports["default"] = style;
@@ -51,7 +51,8 @@ function RealTimeConnectorForIMSTag(_ref) {
51
51
  present = _useRealTimeHub$useRe.present,
52
52
  status = _useRealTimeHub$useRe.status,
53
53
  message = _useRealTimeHub$useRe.message,
54
- loading = _useRealTimeHub$useRe.loading;
54
+ loading = _useRealTimeHub$useRe.loading,
55
+ statusCode = _useRealTimeHub$useRe.statusCode;
55
56
 
56
57
  var _React$useMemo = React.useMemo(function () {
57
58
  if (present && metadata) {
@@ -66,6 +67,8 @@ function RealTimeConnectorForIMSTag(_ref) {
66
67
 
67
68
  if (status === 'error') {
68
69
  return /*#__PURE__*/React__default["default"].createElement(ErrorMessage, {
70
+ instCode: instCode,
71
+ statusCode: statusCode,
69
72
  message: message
70
73
  });
71
74
  }
@@ -90,21 +93,43 @@ function SensorValueProps(_ref2) {
90
93
  var value = _ref2.value,
91
94
  unit = _ref2.unit;
92
95
 
93
- if (!value || !unit) {
96
+ if (value === undefined || value === null) {
94
97
  return null;
95
- }
98
+ } // If Value exists and unit is null
99
+ // it usually means the value is related to open/closed, true/false
100
+ // but i'm not sure how to tell which one.
101
+
96
102
 
97
- return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("span", null, value), " ", /*#__PURE__*/React__default["default"].createElement("b", null, unit));
103
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("span", null, value), " ", unit && /*#__PURE__*/React__default["default"].createElement("b", null, unit));
98
104
  }
99
105
 
100
106
  function ErrorMessage(_ref3) {
101
- var message = _ref3.message;
107
+ var instCode = _ref3.instCode,
108
+ statusCode = _ref3.statusCode,
109
+ message = _ref3.message;
102
110
  return /*#__PURE__*/React__default["default"].createElement("div", {
103
111
  className: IMSConnector_module["default"].message
104
- }, /*#__PURE__*/React__default["default"].createElement(edsCoreReact.Typography, {
112
+ }, statusCode && statusCode === 403 ? /*#__PURE__*/React__default["default"].createElement(RequestAccessMessage, {
113
+ instCode: instCode
114
+ }) : /*#__PURE__*/React__default["default"].createElement(edsCoreReact.Typography, {
105
115
  variant: "body_short",
106
- color: echoComponents.themeConst.voided
116
+ color: echoComponents.themeConst.echoText
107
117
  }, message !== null && message !== void 0 ? message : 'Something went wrong with RTD connection.'));
108
118
  }
109
119
 
120
+ function RequestAccessMessage(_ref4) {
121
+ var instCode = _ref4.instCode;
122
+ var url = new URL('https://accessit.equinor.com');
123
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
124
+ className: IMSConnector_module["default"].requestAccess
125
+ }, /*#__PURE__*/React__default["default"].createElement(edsCoreReact.Typography, {
126
+ variant: "body_short",
127
+ color: echoComponents.themeConst.echoText
128
+ }, "You need access to:"), /*#__PURE__*/React__default["default"].createElement(edsCoreReact.List, null, /*#__PURE__*/React__default["default"].createElement(edsCoreReact.List.Item, null, "Omnia Plant Timeseries Read"), /*#__PURE__*/React__default["default"].createElement(edsCoreReact.List.Item, null, "PI vision"), instCode !== 'JSV' && /*#__PURE__*/React__default["default"].createElement(edsCoreReact.List.Item, null, "AspenOne Process Explorer"))), /*#__PURE__*/React__default["default"].createElement(edsCoreReact.Button, {
129
+ as: "a",
130
+ href: url.href,
131
+ variant: "outlined"
132
+ }, "Go to AccessIT"));
133
+ }
134
+
110
135
  exports.RealTimeConnectorForIMSTag = RealTimeConnectorForIMSTag;
@@ -76,7 +76,7 @@ function useSignalR(hubUrl) {
76
76
  var _this = this;
77
77
 
78
78
  var _React$useState = React.useState({
79
- status: '',
79
+ status: 'ok',
80
80
  loading: false
81
81
  }),
82
82
  _React$useState2 = _slicedToArray(_React$useState, 2),
@@ -89,7 +89,8 @@ function useSignalR(hubUrl) {
89
89
  setState(function (state) {
90
90
  return Object.assign(Object.assign({}, state), {
91
91
  loading: false,
92
- status: 'ok'
92
+ status: 'ok',
93
+ statusCode: status
93
94
  });
94
95
  });
95
96
  } else {
@@ -97,6 +98,7 @@ function useSignalR(hubUrl) {
97
98
  return Object.assign(Object.assign({}, state), {
98
99
  loading: false,
99
100
  status: 'error',
101
+ statusCode: status,
100
102
  message: typeof payload === 'string' ? payload : ''
101
103
  });
102
104
  });