@bigbinary/neeto-molecules 1.0.1 → 1.0.3

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
@@ -19,6 +19,7 @@ A package of reusable molecular components for neeto products.
19
19
  - [NeetoWidget](./docs/components.md#neetowidget)
20
20
  - [PublishBlock](./docs/components.md#publishblock)
21
21
  - [Schedule](./docs/components.md#schedule)
22
+ - [ShareViaEmail](./docs/components.md#shareviaemail)
22
23
  - [ShareViaLink](./docs/components.md#sharevialink)
23
24
  - [Sidebar](./docs/components.md#sidebar)
24
25
 
@@ -3,8 +3,9 @@
3
3
  var React = require('react');
4
4
  var initializers = require('@bigbinary/neeto-commons-frontend/initializers');
5
5
  var neetoui = require('@bigbinary/neetoui');
6
- var reactI18next = require('react-i18next');
7
6
  var dayjs = require('dayjs');
7
+ var ramda = require('ramda');
8
+ var reactI18next = require('react-i18next');
8
9
  var i18next = require('i18next');
9
10
 
10
11
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -79,6 +80,10 @@ var defaultTimePeriodOptions = function defaultTimePeriodOptions() {
79
80
  var thisQuarterEnd = dayjs__default["default"]().endOf("quarter");
80
81
  var lastQuarterStart = dayjs__default["default"]().subtract(1, "quarter").startOf("quarter");
81
82
  var lastQuarterEnd = dayjs__default["default"]().subtract(1, "quarter").endOf("quarter");
83
+ var startOfLastYear = dayjs__default["default"]().subtract(1, "year").startOf("year");
84
+ var endOfLastYear = dayjs__default["default"]().subtract(1, "year").endOf("year");
85
+ var startOfYear = dayjs__default["default"]().startOf("year");
86
+ var endOfYear = dayjs__default["default"]().endOf("year");
82
87
  var startOf24Hours = dayjs__default["default"]().subtract(24, "hour");
83
88
  var now = dayjs__default["default"]();
84
89
  var startOfLast7Days = dayjs__default["default"]().subtract(7, "day");
@@ -141,6 +146,20 @@ var defaultTimePeriodOptions = function defaultTimePeriodOptions() {
141
146
  endDate: lastMonthEnd,
142
147
  rangeType: "month"
143
148
  }
149
+ }, {
150
+ label: i18next.t("neetoMolecules.dateRangeFilter.timePeriodOptions.thisYear"),
151
+ value: {
152
+ startDate: startOfYear,
153
+ endDate: endOfYear,
154
+ rangeType: "year"
155
+ }
156
+ }, {
157
+ label: i18next.t("neetoMolecules.dateRangeFilter.timePeriodOptions.lastYear"),
158
+ value: {
159
+ startDate: startOfLastYear,
160
+ endDate: endOfLastYear,
161
+ rangeType: "year"
162
+ }
144
163
  }, {
145
164
  label: i18next.t("neetoMolecules.dateRangeFilter.timePeriodOptions.thisQuarter"),
146
165
  value: {
@@ -162,7 +181,7 @@ var defaultTimePeriodOptions = function defaultTimePeriodOptions() {
162
181
  };
163
182
 
164
183
  var DateRangeFilter = function DateRangeFilter(_ref) {
165
- var _globalProps$user;
184
+ var _timePeriod$value, _timePeriod$value2, _globalProps$user;
166
185
  var timePeriodOptions = _ref.timePeriodOptions,
167
186
  timePeriod = _ref.timePeriod,
168
187
  setTimePeriod = _ref.setTimePeriod;
@@ -170,6 +189,8 @@ var DateRangeFilter = function DateRangeFilter(_ref) {
170
189
  t = _useTranslation.t;
171
190
  var customDurationLabel = t("neetoMolecules.dateRangeFilter.timePeriodOptions.customDuration");
172
191
  var isCustom = timePeriod.label === customDurationLabel;
192
+ var startDate = (_timePeriod$value = timePeriod.value) === null || _timePeriod$value === void 0 ? void 0 : _timePeriod$value.startDate;
193
+ var endDate = (_timePeriod$value2 = timePeriod.value) === null || _timePeriod$value2 === void 0 ? void 0 : _timePeriod$value2.endDate;
173
194
  return /*#__PURE__*/React__default["default"].createElement("div", {
174
195
  className: "flex pr-2",
175
196
  "data-testid": "date-range-filter"
@@ -177,10 +198,7 @@ var DateRangeFilter = function DateRangeFilter(_ref) {
177
198
  className: "w-40"
178
199
  }, /*#__PURE__*/React__default["default"].createElement(neetoui.Select, {
179
200
  required: true,
180
- getOptionValue: function getOptionValue(_ref2) {
181
- var label = _ref2.label;
182
- return label;
183
- },
201
+ getOptionValue: ramda.prop("label"),
184
202
  options: timePeriodOptions || defaultTimePeriodOptions(),
185
203
  value: timePeriod,
186
204
  onChange: function onChange(option) {
@@ -193,12 +211,13 @@ var DateRangeFilter = function DateRangeFilter(_ref) {
193
211
  autoFocus: true,
194
212
  className: "ml-3 w-full",
195
213
  dateFormat: initializers.globalProps === null || initializers.globalProps === void 0 ? void 0 : (_globalProps$user = initializers.globalProps.user) === null || _globalProps$user === void 0 ? void 0 : _globalProps$user.dateFormat,
214
+ defaultValue: [dayjs__default["default"](startDate), dayjs__default["default"](endDate)],
196
215
  picker: "date",
197
216
  type: "range",
198
- onChange: function onChange(_, _ref3) {
199
- var _ref4 = _slicedToArray(_ref3, 2),
200
- startDate = _ref4[0],
201
- endDate = _ref4[1];
217
+ onChange: function onChange(_, _ref2) {
218
+ var _ref3 = _slicedToArray(_ref2, 2),
219
+ startDate = _ref3[0],
220
+ endDate = _ref3[1];
202
221
  setTimePeriod({
203
222
  label: customDurationLabel,
204
223
  value: {
@@ -1,8 +1,9 @@
1
1
  import React from 'react';
2
2
  import { globalProps } from '@bigbinary/neeto-commons-frontend/initializers';
3
3
  import { Select, DatePicker } from '@bigbinary/neetoui';
4
- import { useTranslation } from 'react-i18next';
5
4
  import dayjs from 'dayjs';
5
+ import { prop } from 'ramda';
6
+ import { useTranslation } from 'react-i18next';
6
7
  import { t } from 'i18next';
7
8
 
8
9
  function _arrayWithHoles(arr) {
@@ -72,6 +73,10 @@ var defaultTimePeriodOptions = function defaultTimePeriodOptions() {
72
73
  var thisQuarterEnd = dayjs().endOf("quarter");
73
74
  var lastQuarterStart = dayjs().subtract(1, "quarter").startOf("quarter");
74
75
  var lastQuarterEnd = dayjs().subtract(1, "quarter").endOf("quarter");
76
+ var startOfLastYear = dayjs().subtract(1, "year").startOf("year");
77
+ var endOfLastYear = dayjs().subtract(1, "year").endOf("year");
78
+ var startOfYear = dayjs().startOf("year");
79
+ var endOfYear = dayjs().endOf("year");
75
80
  var startOf24Hours = dayjs().subtract(24, "hour");
76
81
  var now = dayjs();
77
82
  var startOfLast7Days = dayjs().subtract(7, "day");
@@ -134,6 +139,20 @@ var defaultTimePeriodOptions = function defaultTimePeriodOptions() {
134
139
  endDate: lastMonthEnd,
135
140
  rangeType: "month"
136
141
  }
142
+ }, {
143
+ label: t("neetoMolecules.dateRangeFilter.timePeriodOptions.thisYear"),
144
+ value: {
145
+ startDate: startOfYear,
146
+ endDate: endOfYear,
147
+ rangeType: "year"
148
+ }
149
+ }, {
150
+ label: t("neetoMolecules.dateRangeFilter.timePeriodOptions.lastYear"),
151
+ value: {
152
+ startDate: startOfLastYear,
153
+ endDate: endOfLastYear,
154
+ rangeType: "year"
155
+ }
137
156
  }, {
138
157
  label: t("neetoMolecules.dateRangeFilter.timePeriodOptions.thisQuarter"),
139
158
  value: {
@@ -155,7 +174,7 @@ var defaultTimePeriodOptions = function defaultTimePeriodOptions() {
155
174
  };
156
175
 
157
176
  var DateRangeFilter = function DateRangeFilter(_ref) {
158
- var _globalProps$user;
177
+ var _timePeriod$value, _timePeriod$value2, _globalProps$user;
159
178
  var timePeriodOptions = _ref.timePeriodOptions,
160
179
  timePeriod = _ref.timePeriod,
161
180
  setTimePeriod = _ref.setTimePeriod;
@@ -163,6 +182,8 @@ var DateRangeFilter = function DateRangeFilter(_ref) {
163
182
  t = _useTranslation.t;
164
183
  var customDurationLabel = t("neetoMolecules.dateRangeFilter.timePeriodOptions.customDuration");
165
184
  var isCustom = timePeriod.label === customDurationLabel;
185
+ var startDate = (_timePeriod$value = timePeriod.value) === null || _timePeriod$value === void 0 ? void 0 : _timePeriod$value.startDate;
186
+ var endDate = (_timePeriod$value2 = timePeriod.value) === null || _timePeriod$value2 === void 0 ? void 0 : _timePeriod$value2.endDate;
166
187
  return /*#__PURE__*/React.createElement("div", {
167
188
  className: "flex pr-2",
168
189
  "data-testid": "date-range-filter"
@@ -170,10 +191,7 @@ var DateRangeFilter = function DateRangeFilter(_ref) {
170
191
  className: "w-40"
171
192
  }, /*#__PURE__*/React.createElement(Select, {
172
193
  required: true,
173
- getOptionValue: function getOptionValue(_ref2) {
174
- var label = _ref2.label;
175
- return label;
176
- },
194
+ getOptionValue: prop("label"),
177
195
  options: timePeriodOptions || defaultTimePeriodOptions(),
178
196
  value: timePeriod,
179
197
  onChange: function onChange(option) {
@@ -186,12 +204,13 @@ var DateRangeFilter = function DateRangeFilter(_ref) {
186
204
  autoFocus: true,
187
205
  className: "ml-3 w-full",
188
206
  dateFormat: globalProps === null || globalProps === void 0 ? void 0 : (_globalProps$user = globalProps.user) === null || _globalProps$user === void 0 ? void 0 : _globalProps$user.dateFormat,
207
+ defaultValue: [dayjs(startDate), dayjs(endDate)],
189
208
  picker: "date",
190
209
  type: "range",
191
- onChange: function onChange(_, _ref3) {
192
- var _ref4 = _slicedToArray(_ref3, 2),
193
- startDate = _ref4[0],
194
- endDate = _ref4[1];
210
+ onChange: function onChange(_, _ref2) {
211
+ var _ref3 = _slicedToArray(_ref2, 2),
212
+ startDate = _ref3[0],
213
+ endDate = _ref3[1];
195
214
  setTimePeriod({
196
215
  label: customDurationLabel,
197
216
  value: {
@@ -32372,7 +32372,7 @@ var EmailPreview = function EmailPreview(_ref) {
32372
32372
  className: "neeto-ui-text-gray-800",
32373
32373
  lineHeight: "normal",
32374
32374
  style: "body2"
32375
- }, subject || /*#__PURE__*/y__default["default"].createElement("div", {
32375
+ }, subject || /*#__PURE__*/y__default["default"].createElement("span", {
32376
32376
  className: "neeto-ui-bg-gray-300 h-2 w-40 rounded-full"
32377
32377
  })))), /*#__PURE__*/y__default["default"].createElement("div", {
32378
32378
  className: "neeto-ui-text-gray-800 flex flex-1 flex-col justify-between space-y-6 p-6 pr-10 text-base leading-relaxed"
@@ -32346,7 +32346,7 @@ var EmailPreview = function EmailPreview(_ref) {
32346
32346
  className: "neeto-ui-text-gray-800",
32347
32347
  lineHeight: "normal",
32348
32348
  style: "body2"
32349
- }, subject || /*#__PURE__*/y__default.createElement("div", {
32349
+ }, subject || /*#__PURE__*/y__default.createElement("span", {
32350
32350
  className: "neeto-ui-bg-gray-300 h-2 w-40 rounded-full"
32351
32351
  })))), /*#__PURE__*/y__default.createElement("div", {
32352
32352
  className: "neeto-ui-text-gray-800 flex flex-1 flex-col justify-between space-y-6 p-6 pr-10 text-base leading-relaxed"
@@ -30,6 +30,45 @@ function _interopNamespace(e) {
30
30
  var React__namespace = /*#__PURE__*/_interopNamespace(React);
31
31
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
32
32
 
33
+ function shallow(objA, objB) {
34
+ if (Object.is(objA, objB)) {
35
+ return true;
36
+ }
37
+ if (typeof objA !== "object" || objA === null || typeof objB !== "object" || objB === null) {
38
+ return false;
39
+ }
40
+ if (objA instanceof Map && objB instanceof Map) {
41
+ if (objA.size !== objB.size)
42
+ return false;
43
+ for (const [key, value] of objA) {
44
+ if (!Object.is(value, objB.get(key))) {
45
+ return false;
46
+ }
47
+ }
48
+ return true;
49
+ }
50
+ if (objA instanceof Set && objB instanceof Set) {
51
+ if (objA.size !== objB.size)
52
+ return false;
53
+ for (const value of objA) {
54
+ if (!objB.has(value)) {
55
+ return false;
56
+ }
57
+ }
58
+ return true;
59
+ }
60
+ const keysA = Object.keys(objA);
61
+ if (keysA.length !== Object.keys(objB).length) {
62
+ return false;
63
+ }
64
+ for (let i = 0; i < keysA.length; i++) {
65
+ if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !Object.is(objA[keysA[i]], objB[keysA[i]])) {
66
+ return false;
67
+ }
68
+ }
69
+ return true;
70
+ }
71
+
33
72
  var _path$2, _path2$2;
34
73
  function _extends$2() { _extends$2 = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$2.apply(this, arguments); }
35
74
  var SvgInternalServerError = function SvgInternalServerError(props) {
@@ -103,14 +142,29 @@ var ErrorPage = function ErrorPage(_ref) {
103
142
  var _ref$homeUrl = _ref.homeUrl,
104
143
  homeUrl = _ref$homeUrl === void 0 ? "/" : _ref$homeUrl,
105
144
  status = _ref.status;
106
- var storeStatusCode = reactUtils.useErrorDisplayStore(ramda.prop("statusCode"));
107
- status = status || storeStatusCode;
108
145
  var _useTranslation = reactI18next.useTranslation(),
109
146
  t = _useTranslation.t;
147
+ var _useErrorDisplayStore = reactUtils.useErrorDisplayStore(ramda.pick(["statusCode", "showErrorPage"]), shallow),
148
+ storeStatusCode = _useErrorDisplayStore.statusCode,
149
+ showErrorPage = _useErrorDisplayStore.showErrorPage;
150
+ status = status || storeStatusCode;
110
151
  var _ref2 = ERRORS[status] || ERRORS[404],
111
152
  Image = _ref2.Image,
112
153
  errorKey = _ref2.errorKey,
113
154
  titleKey = _ref2.titleKey;
155
+ React.useEffect(function () {
156
+ var onBackButtonPress = function onBackButtonPress() {
157
+ if (showErrorPage) {
158
+ reactUtils.useErrorDisplayStore.setState({
159
+ showErrorPage: false
160
+ });
161
+ }
162
+ };
163
+ window.addEventListener("popstate", onBackButtonPress);
164
+ return function () {
165
+ window.removeEventListener("popstate", onBackButtonPress);
166
+ };
167
+ }, []);
114
168
  return /*#__PURE__*/React__default["default"].createElement("div", {
115
169
  className: "flex min-h-screen w-full flex-col items-center justify-center",
116
170
  "data-cy": "error-page-container"
package/dist/ErrorPage.js CHANGED
@@ -1,11 +1,50 @@
1
1
  import * as React from 'react';
2
- import React__default from 'react';
2
+ import React__default, { useEffect } from 'react';
3
3
  import { useErrorDisplayStore } from '@bigbinary/neeto-commons-frontend/react-utils';
4
4
  import { Typography, Button } from '@bigbinary/neetoui';
5
- import { prop } from 'ramda';
5
+ import { pick } from 'ramda';
6
6
  import { Helmet } from 'react-helmet';
7
7
  import { useTranslation, Trans } from 'react-i18next';
8
8
 
9
+ function shallow(objA, objB) {
10
+ if (Object.is(objA, objB)) {
11
+ return true;
12
+ }
13
+ if (typeof objA !== "object" || objA === null || typeof objB !== "object" || objB === null) {
14
+ return false;
15
+ }
16
+ if (objA instanceof Map && objB instanceof Map) {
17
+ if (objA.size !== objB.size)
18
+ return false;
19
+ for (const [key, value] of objA) {
20
+ if (!Object.is(value, objB.get(key))) {
21
+ return false;
22
+ }
23
+ }
24
+ return true;
25
+ }
26
+ if (objA instanceof Set && objB instanceof Set) {
27
+ if (objA.size !== objB.size)
28
+ return false;
29
+ for (const value of objA) {
30
+ if (!objB.has(value)) {
31
+ return false;
32
+ }
33
+ }
34
+ return true;
35
+ }
36
+ const keysA = Object.keys(objA);
37
+ if (keysA.length !== Object.keys(objB).length) {
38
+ return false;
39
+ }
40
+ for (let i = 0; i < keysA.length; i++) {
41
+ if (!Object.prototype.hasOwnProperty.call(objB, keysA[i]) || !Object.is(objA[keysA[i]], objB[keysA[i]])) {
42
+ return false;
43
+ }
44
+ }
45
+ return true;
46
+ }
47
+
9
48
  var _path$2, _path2$2;
10
49
  function _extends$2() { _extends$2 = Object.assign ? Object.assign.bind() : function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends$2.apply(this, arguments); }
11
50
  var SvgInternalServerError = function SvgInternalServerError(props) {
@@ -79,14 +118,29 @@ var ErrorPage = function ErrorPage(_ref) {
79
118
  var _ref$homeUrl = _ref.homeUrl,
80
119
  homeUrl = _ref$homeUrl === void 0 ? "/" : _ref$homeUrl,
81
120
  status = _ref.status;
82
- var storeStatusCode = useErrorDisplayStore(prop("statusCode"));
83
- status = status || storeStatusCode;
84
121
  var _useTranslation = useTranslation(),
85
122
  t = _useTranslation.t;
123
+ var _useErrorDisplayStore = useErrorDisplayStore(pick(["statusCode", "showErrorPage"]), shallow),
124
+ storeStatusCode = _useErrorDisplayStore.statusCode,
125
+ showErrorPage = _useErrorDisplayStore.showErrorPage;
126
+ status = status || storeStatusCode;
86
127
  var _ref2 = ERRORS[status] || ERRORS[404],
87
128
  Image = _ref2.Image,
88
129
  errorKey = _ref2.errorKey,
89
130
  titleKey = _ref2.titleKey;
131
+ useEffect(function () {
132
+ var onBackButtonPress = function onBackButtonPress() {
133
+ if (showErrorPage) {
134
+ useErrorDisplayStore.setState({
135
+ showErrorPage: false
136
+ });
137
+ }
138
+ };
139
+ window.addEventListener("popstate", onBackButtonPress);
140
+ return function () {
141
+ window.removeEventListener("popstate", onBackButtonPress);
142
+ };
143
+ }, []);
90
144
  return /*#__PURE__*/React__default.createElement("div", {
91
145
  className: "flex min-h-screen w-full flex-col items-center justify-center",
92
146
  "data-cy": "error-page-container"
@@ -750,30 +750,23 @@ var classnames$1 = {exports: {}};
750
750
 
751
751
  var classnames = classnames$1.exports;
752
752
 
753
- var DisplayHotKey = function DisplayHotKey(_ref) {
754
- var hotkey = _ref.hotkey;
755
- var isSequentialHotkey = hotkey.includes(" ");
756
- var isSimultaneousHotkey = hotkey.includes("+");
757
- var isSingleKeyHotkey = !isSequentialHotkey && !isSimultaneousHotkey;
758
- var sequences = [];
759
- if (isSingleKeyHotkey) return /*#__PURE__*/React__default["default"].createElement(neetoui.Kbd, {
760
- keyName: hotkey
761
- });
762
- if (isSequentialHotkey) {
763
- sequences = hotkey.split(" ");
764
- } else if (isSimultaneousHotkey) {
765
- sequences = hotkey.split("+");
766
- }
767
- return sequences.map(function (keyName, idx) {
768
- return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, {
769
- key: idx
770
- }, /*#__PURE__*/React__default["default"].createElement(neetoui.Kbd, {
771
- keyName: keyName
772
- }), isSequentialHotkey && idx + 1 !== sequences.length && /*#__PURE__*/React__default["default"].createElement(neetoui.Kbd, {
773
- keyName: "then"
774
- }));
775
- });
753
+ var KEY_SHORTFORM_MAP = {
754
+ command: "cmd",
755
+ escape: "esc",
756
+ control: "ctrl",
757
+ option: "opt"
758
+ };
759
+ var MAC_TO_WINDOWS_KEYS_MAP = {
760
+ option: "alt",
761
+ command: "ctrl",
762
+ "return": "enter",
763
+ "delete": "backspace"
764
+ };
765
+ var OS = {
766
+ mac: "OS X",
767
+ windows: "Windows"
776
768
  };
769
+ var FULL_SHORTCUTS_LINK_PROP_NAME = "fullShortcutsLink";
777
770
 
778
771
  function _typeof(obj) {
779
772
  "@babel/helpers - typeof";
@@ -2062,46 +2055,34 @@ var platform$1 = {exports: {}};
2062
2055
 
2063
2056
  var platform = platform$1.exports;
2064
2057
 
2065
- var KEY_SHORTFORM_MAP = {
2066
- command: "cmd",
2067
- escape: "esc",
2068
- control: "ctrl",
2069
- option: "opt"
2070
- };
2071
- var MAC_TO_WINDOWS_KEYS_MAP = {
2072
- option: "alt",
2073
- command: "ctrl",
2074
- "return": "enter",
2075
- "delete": "backspace"
2076
- };
2077
- var OS = {
2078
- mac: "OS X",
2079
- windows: "Windows"
2080
- };
2081
-
2082
- var shortenHotKey = function shortenHotKey(hotkey) {
2083
- var result = hotkey;
2084
- Object.entries(KEY_SHORTFORM_MAP).forEach(function (_ref) {
2058
+ var convertHotKeyToWindows = function convertHotKeyToWindows(hotkey) {
2059
+ ramda.toPairs(MAC_TO_WINDOWS_KEYS_MAP).forEach(function (_ref) {
2085
2060
  var _ref2 = _slicedToArray(_ref, 2),
2086
- longform = _ref2[0],
2087
- shortform = _ref2[1];
2088
- result = result.replaceAll(longform, shortform);
2061
+ macKey = _ref2[0],
2062
+ windowsKey = _ref2[1];
2063
+ hotkey = hotkey.replaceAll(macKey, windowsKey);
2089
2064
  });
2090
- return result;
2065
+ return hotkey;
2066
+ };
2067
+ var replaceDeleteKeyWithBackspace = function replaceDeleteKeyWithBackspace(hotkey) {
2068
+ return hotkey.replaceAll("delete", "backspace");
2091
2069
  };
2092
2070
  var convertHotkeyToUsersPlatform = function convertHotkeyToUsersPlatform(hotkey) {
2093
2071
  var _platformInfo$os, _platformInfo$os$fami;
2094
2072
  var platformInfo = platform.parse(navigator.userAgent);
2095
2073
  var isOSX = (_platformInfo$os = platformInfo.os) === null || _platformInfo$os === void 0 ? void 0 : (_platformInfo$os$fami = _platformInfo$os.family) === null || _platformInfo$os$fami === void 0 ? void 0 : _platformInfo$os$fami.includes(OS.mac);
2096
- if (isOSX) return hotkey;
2097
- var hotkeyForWindows = hotkey;
2098
- ramda.toPairs(MAC_TO_WINDOWS_KEYS_MAP).forEach(function (_ref3) {
2074
+ if (isOSX) return replaceDeleteKeyWithBackspace(hotkey);
2075
+ return convertHotKeyToWindows(hotkey);
2076
+ };
2077
+ var shortenHotKey = function shortenHotKey(hotkey) {
2078
+ var result = hotkey;
2079
+ Object.entries(KEY_SHORTFORM_MAP).forEach(function (_ref3) {
2099
2080
  var _ref4 = _slicedToArray(_ref3, 2),
2100
- macKey = _ref4[0],
2101
- windowsKey = _ref4[1];
2102
- hotkeyForWindows = hotkeyForWindows.replaceAll(macKey, windowsKey);
2081
+ longform = _ref4[0],
2082
+ shortform = _ref4[1];
2083
+ result = result.replaceAll(longform, shortform);
2103
2084
  });
2104
- return hotkeyForWindows;
2085
+ return result;
2105
2086
  };
2106
2087
  var getGlobalShortcuts = function getGlobalShortcuts() {
2107
2088
  return _defineProperty({}, i18next__default["default"].t("neetoMolecules.keyboardShortcuts.global.categoryName"), {
@@ -2116,35 +2097,71 @@ var getGlobalShortcuts = function getGlobalShortcuts() {
2116
2097
  });
2117
2098
  };
2118
2099
 
2100
+ var HotKey = function HotKey(_ref) {
2101
+ var description = _ref.description,
2102
+ sequence = _ref.sequence;
2103
+ var hotkey = shortenHotKey(convertHotkeyToUsersPlatform(sequence));
2104
+ var isSequentialHotkey = hotkey.includes(" ");
2105
+ var isSimultaneousHotkey = hotkey.includes("+");
2106
+ var isSingleKeyHotkey = !isSequentialHotkey && !isSimultaneousHotkey;
2107
+ var sequences = [];
2108
+ if (isSingleKeyHotkey) {
2109
+ sequences = [hotkey];
2110
+ } else if (isSequentialHotkey) {
2111
+ sequences = hotkey.split(" ");
2112
+ } else if (isSimultaneousHotkey) {
2113
+ sequences = hotkey.split("+");
2114
+ }
2115
+ return /*#__PURE__*/React__default["default"].createElement("div", {
2116
+ className: "my-3 px-4"
2117
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
2118
+ className: "flex items-center justify-between gap-3",
2119
+ "data-testid": "hotkey-item"
2120
+ }, /*#__PURE__*/React__default["default"].createElement(neetoui.Typography, {
2121
+ className: "neeto-ui-text-gray-800",
2122
+ lineHeight: "normal",
2123
+ style: "body2"
2124
+ }, description), /*#__PURE__*/React__default["default"].createElement("div", {
2125
+ className: "flex items-center gap-1"
2126
+ }, sequences.map(function (keyName, idx) {
2127
+ return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, {
2128
+ key: idx
2129
+ }, /*#__PURE__*/React__default["default"].createElement(neetoui.Kbd, {
2130
+ keyName: keyName
2131
+ }), isSequentialHotkey && idx + 1 !== sequences.length && /*#__PURE__*/React__default["default"].createElement(neetoui.Kbd, {
2132
+ keyName: "then"
2133
+ }));
2134
+ }))));
2135
+ };
2136
+
2119
2137
  var HotKeyList = function HotKeyList(_ref) {
2120
2138
  var hotkeys = _ref.hotkeys;
2139
+ var _useTranslation = reactI18next.useTranslation(),
2140
+ t = _useTranslation.t;
2121
2141
  return Object.keys(hotkeys).map(function (categoryName) {
2142
+ var categoryValues = hotkeys[categoryName];
2143
+ var fullShortcutsLink = categoryValues[FULL_SHORTCUTS_LINK_PROP_NAME];
2122
2144
  return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, {
2123
2145
  key: categoryName
2124
2146
  }, /*#__PURE__*/React__default["default"].createElement(neetoui.Typography, {
2125
2147
  className: "neeto-ui-text-gray-800 mt-4 px-4 text-xs font-bold",
2126
2148
  lineHeight: "normal",
2127
2149
  style: "body2"
2128
- }, categoryName), Object.entries(hotkeys[categoryName]).map(function (_ref2) {
2150
+ }, categoryName), Object.entries(categoryValues).map(function (_ref2) {
2129
2151
  var _ref3 = _slicedToArray(_ref2, 2),
2130
2152
  _ref3$ = _ref3[1],
2131
2153
  sequence = _ref3$.sequence,
2132
2154
  description = _ref3$.description;
2133
- return /*#__PURE__*/React__default["default"].createElement("div", {
2134
- className: "my-3 px-4",
2135
- key: sequence
2136
- }, /*#__PURE__*/React__default["default"].createElement("div", {
2137
- className: "flex items-center justify-between gap-3",
2138
- "data-testid": "hotkey-item"
2139
- }, /*#__PURE__*/React__default["default"].createElement(neetoui.Typography, {
2140
- className: "neeto-ui-text-gray-800",
2141
- lineHeight: "normal",
2142
- style: "body2"
2143
- }, description), /*#__PURE__*/React__default["default"].createElement("div", {
2144
- className: "flex items-center gap-1"
2145
- }, /*#__PURE__*/React__default["default"].createElement(DisplayHotKey, {
2146
- hotkey: shortenHotKey(convertHotkeyToUsersPlatform(sequence))
2147
- }))));
2155
+ return sequence && /*#__PURE__*/React__default["default"].createElement(HotKey, {
2156
+ description: description,
2157
+ key: sequence,
2158
+ sequence: sequence
2159
+ });
2160
+ }), fullShortcutsLink && /*#__PURE__*/React__default["default"].createElement(neetoui.Button, {
2161
+ className: "pl-4 mb-3",
2162
+ href: fullShortcutsLink,
2163
+ style: "link",
2164
+ label: t("neetoMolecules.keyboardShortcuts.viewFullListOfShortcuts")
2148
2165
  }));
2149
2166
  });
2150
2167
  };
@@ -2170,13 +2187,9 @@ var KeyboardShortcutsPane = function KeyboardShortcutsPane(_ref) {
2170
2187
  return setIsOpen(function (prevIsOpen) {
2171
2188
  return !prevIsOpen;
2172
2189
  });
2173
- }, {
2174
- mode: "global"
2175
2190
  });
2176
2191
  reactUtils.useHotKeys(shortcuts.close.sequence, function () {
2177
2192
  return setIsOpen(false);
2178
- }, {
2179
- mode: "global"
2180
2193
  });
2181
2194
  return /*#__PURE__*/React__default["default"].createElement("div", {
2182
2195
  className: classnames("neeto-commons-keyboard-shortcuts-pane neeto-ui-border-gray-300 transition-width ml-auto min-h-screen border-l bg-white duration-300 ease-in-out overflow-y-scroll", {