@abtnode/ux 1.8.26 → 1.8.28

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 (88) hide show
  1. package/lib/actions.js +109 -0
  2. package/lib/blocklet/actions.js +437 -0
  3. package/lib/blocklet/audit-logs.js +194 -0
  4. package/lib/blocklet/avatar.js +96 -0
  5. package/lib/blocklet/blocklet-source.js +56 -0
  6. package/lib/blocklet/component/configuration.js +124 -0
  7. package/lib/blocklet/component/delete.js +115 -0
  8. package/lib/blocklet/component/environment.js +277 -0
  9. package/lib/blocklet/component/index.js +742 -0
  10. package/lib/blocklet/component/setting.js +135 -0
  11. package/lib/blocklet/configuration.js +463 -0
  12. package/lib/blocklet/disk-info.js +89 -0
  13. package/lib/blocklet/icons.js +26 -0
  14. package/lib/blocklet/log.js +55 -0
  15. package/lib/blocklet/mode.js +33 -0
  16. package/lib/blocklet/overview.js +184 -0
  17. package/lib/blocklet/runtime-info.js +85 -0
  18. package/lib/blocklet/status.js +103 -0
  19. package/lib/blocklet/util.js +119 -0
  20. package/lib/blocklet/version.js +178 -0
  21. package/lib/card-selector.js +9 -22
  22. package/lib/click-to-copy.js +36 -0
  23. package/lib/confirm.js +149 -0
  24. package/lib/contexts/audit-log.js +141 -0
  25. package/lib/contexts/deleting-blocklets.js +78 -0
  26. package/lib/contexts/node.js +28 -0
  27. package/lib/contexts/session.js +20 -0
  28. package/lib/contexts/team.js +19 -0
  29. package/lib/did-address.js +75 -0
  30. package/lib/dot.js +18 -0
  31. package/lib/form/form-text-input.js +12 -38
  32. package/lib/form/form-wrapper.js +0 -7
  33. package/lib/form/required.js +0 -6
  34. package/lib/hooks/mobile-width.js +19 -0
  35. package/lib/hooks/use-passport-id.js +0 -5
  36. package/lib/icons/long-arrow.svg +5 -0
  37. package/lib/index.js +0 -3
  38. package/lib/invitation/invitation-app.js +3 -21
  39. package/lib/invitation/invitation-passport.js +2 -16
  40. package/lib/invitation/invitation-receive.js +2 -19
  41. package/lib/invitation/invitation-user.js +0 -16
  42. package/lib/invitation/invitation.js +0 -23
  43. package/lib/issue-passport.js +2 -31
  44. package/lib/launch-blocklet/content-layout.js +3 -19
  45. package/lib/launch-blocklet/page-header.js +0 -9
  46. package/lib/layout/addon.js +0 -24
  47. package/lib/locales/en.js +1046 -38
  48. package/lib/locales/index.js +0 -3
  49. package/lib/locales/zh.js +1049 -36
  50. package/lib/logs/clock.js +19 -0
  51. package/lib/logs/log-terminal.js +172 -0
  52. package/lib/lost-passport.js +6 -51
  53. package/lib/nav-logo.js +12 -33
  54. package/lib/passport-tag.js +41 -0
  55. package/lib/permission.js +68 -0
  56. package/lib/relative-time.js +61 -0
  57. package/lib/schema-form/color-input.js +2 -15
  58. package/lib/schema-form/common-prop-types.js +0 -3
  59. package/lib/schema-form/index.js +8 -45
  60. package/lib/schema-form/passport-input.js +6 -24
  61. package/lib/schema-form/text-input.js +9 -26
  62. package/lib/table-icons.js +42 -0
  63. package/lib/table.js +13 -0
  64. package/lib/tag.js +35 -0
  65. package/lib/team/members/actions.js +99 -0
  66. package/lib/team/members/index.js +476 -0
  67. package/lib/team/members/invitations.js +196 -0
  68. package/lib/team/members/invite-member.js +212 -0
  69. package/lib/team/members/issue-passport.js +155 -0
  70. package/lib/team/members/member.js +294 -0
  71. package/lib/team/members/passport-issuances.js +154 -0
  72. package/lib/team/members/passports.js +329 -0
  73. package/lib/team/members/toggle-user-approval.js +128 -0
  74. package/lib/team/members/transfer-node.js +262 -0
  75. package/lib/team/members/util.js +20 -0
  76. package/lib/team/passports/detail.js +261 -0
  77. package/lib/team/passports/index.js +220 -0
  78. package/lib/team/passports/mutate-role.js +204 -0
  79. package/lib/team/passports/trusted-issuer.js +295 -0
  80. package/lib/team/passports/trusted-issuers.js +238 -0
  81. package/lib/team/search-input.js +36 -0
  82. package/lib/team/styles/dialog.js +13 -0
  83. package/lib/team/styles/list-header.js +13 -0
  84. package/lib/toast.js +4 -19
  85. package/lib/util/index.js +504 -38
  86. package/lib/who-can-access/config.js +0 -6
  87. package/lib/wrap-locale.js +0 -7
  88. package/package.json +43 -20
package/lib/actions.js ADDED
@@ -0,0 +1,109 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = Actions;
7
+ var _react = require("react");
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _styled = _interopRequireDefault(require("@emotion/styled"));
10
+ var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
11
+ var _Menu = _interopRequireDefault(require("@mui/material/Menu"));
12
+ var _MenuItem = _interopRequireDefault(require("@mui/material/MenuItem"));
13
+ var _MoreHoriz = _interopRequireDefault(require("@mui/icons-material/MoreHoriz"));
14
+ var _ListItemIcon = _interopRequireDefault(require("@mui/material/ListItemIcon"));
15
+ var _ListItemText = _interopRequireDefault(require("@mui/material/ListItemText"));
16
+ var _jsxRuntime = require("react/jsx-runtime");
17
+ var _templateObject;
18
+ const _excluded = ["actions"],
19
+ _excluded2 = ["icon", "text", "onClick", "disabled"];
20
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
21
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
22
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
23
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
24
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
25
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
26
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
27
+ function Actions(_ref) {
28
+ let {
29
+ actions
30
+ } = _ref,
31
+ props = _objectWithoutProperties(_ref, _excluded);
32
+ const [anchorEl, setAnchorEl] = (0, _react.useState)(null);
33
+ const open = Boolean(anchorEl);
34
+ const onOpen = e => {
35
+ try {
36
+ e.stopPropagation();
37
+ e.preventDefault();
38
+ // eslint-disable-next-line no-empty
39
+ } catch (_unused) {}
40
+ setAnchorEl(e.currentTarget);
41
+ };
42
+ const onClose = e => {
43
+ try {
44
+ e.stopPropagation();
45
+ e.preventDefault();
46
+ // eslint-disable-next-line no-empty
47
+ } catch (_unused2) {}
48
+ setAnchorEl(null);
49
+ };
50
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Div, _objectSpread(_objectSpread({}, props), {}, {
51
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
52
+ "aria-label": "more",
53
+ "aria-controls": "actions-menu",
54
+ "aria-haspopup": "true",
55
+ "data-cy": "actions-menu-icon",
56
+ onClick: onOpen,
57
+ size: "large",
58
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MoreHoriz.default, {})
59
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Menu.default, {
60
+ id: "actions-menu",
61
+ "data-cy": "actions-menu",
62
+ anchorEl: anchorEl,
63
+ keepMounted: true,
64
+ open: open,
65
+ onClose: onClose,
66
+ PaperProps: {},
67
+ children: actions.map((action, index) => {
68
+ if (typeof action === 'function') {
69
+ return action({
70
+ close: onClose
71
+ });
72
+ }
73
+ const {
74
+ icon,
75
+ text,
76
+ onClick: _onClick,
77
+ disabled = false
78
+ } = action,
79
+ opts = _objectWithoutProperties(action, _excluded2);
80
+ return /*#__PURE__*/(0, _react.createElement)(_MenuItem.default, _objectSpread(_objectSpread({}, opts), {}, {
81
+ disabled: disabled,
82
+ dense: true,
83
+ onClick: e => {
84
+ onClose();
85
+ _onClick(e);
86
+ }
87
+ // eslint-disable-next-line react/no-array-index-key
88
+ ,
89
+ key: index
90
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ListItemIcon.default, {
91
+ style: {
92
+ minWidth: 24,
93
+ marginRight: 8
94
+ },
95
+ children: icon
96
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ListItemText.default, {
97
+ primary: text
98
+ }));
99
+ })
100
+ })]
101
+ }));
102
+ }
103
+ Actions.propTypes = {
104
+ actions: _propTypes.default.array
105
+ };
106
+ Actions.defaultProps = {
107
+ actions: []
108
+ };
109
+ const Div = _styled.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral([""])));
@@ -0,0 +1,437 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.default = BlockletActions;
7
+ var _react = require("react");
8
+ var _propTypes = _interopRequireDefault(require("prop-types"));
9
+ var _styled = _interopRequireDefault(require("@emotion/styled"));
10
+ var _reactRouterDom = require("react-router-dom");
11
+ var _useLocalStorage = _interopRequireDefault(require("react-use/lib/useLocalStorage"));
12
+ var _IconButton = _interopRequireDefault(require("@mui/material/IconButton"));
13
+ var _Menu = _interopRequireDefault(require("@mui/material/Menu"));
14
+ var _Divider = _interopRequireDefault(require("@mui/material/Divider"));
15
+ var _ButtonGroup = _interopRequireDefault(require("@mui/material/ButtonGroup"));
16
+ var _Spinner = _interopRequireDefault(require("@arcblock/ux/lib/Spinner"));
17
+ var _MenuItem = _interopRequireDefault(require("@mui/material/MenuItem"));
18
+ var _MoreVert = _interopRequireDefault(require("@mui/icons-material/MoreVert"));
19
+ var _ListItemIcon = _interopRequireDefault(require("@mui/material/ListItemIcon"));
20
+ var _ListItemText = _interopRequireDefault(require("@mui/material/ListItemText"));
21
+ var _Typography = _interopRequireDefault(require("@mui/material/Typography"));
22
+ var _Radio = _interopRequireDefault(require("@mui/material/Radio"));
23
+ var _RadioGroup = _interopRequireDefault(require("@mui/material/RadioGroup"));
24
+ var _FormControlLabel = _interopRequireDefault(require("@mui/material/FormControlLabel"));
25
+ var _Alert = _interopRequireDefault(require("@mui/material/Alert"));
26
+ var _Button = _interopRequireDefault(require("@arcblock/ux/lib/Button"));
27
+ var _util = require("@blocklet/meta/lib/util");
28
+ var _context = require("@arcblock/ux/lib/Locale/context");
29
+ var _constant = require("@blocklet/constant");
30
+ var _toast = _interopRequireDefault(require("../toast"));
31
+ var _util2 = require("../util");
32
+ var _util3 = require("./util");
33
+ var _node = require("../contexts/node");
34
+ var _confirm = _interopRequireDefault(require("../confirm"));
35
+ var _icons = _interopRequireDefault(require("./icons"));
36
+ var _jsxRuntime = require("react/jsx-runtime");
37
+ var _templateObject;
38
+ const _excluded = ["blocklet", "onStart", "onComplete", "variant", "hasPermission", "useBlockletUrlEvaluation"];
39
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
40
+ function _taggedTemplateLiteral(strings, raw) { if (!raw) { raw = strings.slice(0); } return Object.freeze(Object.defineProperties(strings, { raw: { value: Object.freeze(raw) } })); }
41
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
42
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
43
+ function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
44
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
45
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
46
+ function BlockletActions(_ref) {
47
+ let {
48
+ blocklet,
49
+ onStart,
50
+ onComplete,
51
+ variant,
52
+ hasPermission,
53
+ useBlockletUrlEvaluation
54
+ } = _ref,
55
+ rest = _objectWithoutProperties(_ref, _excluded);
56
+ const navigate = (0, _reactRouterDom.useNavigate)();
57
+ const node = (0, _node.useNodeContext)();
58
+ const [anchorEl, setAnchorEl] = (0, _react.useState)(null);
59
+ const [currentAction, setCurrentAction] = (0, _react.useState)(null);
60
+ const [loading, setLoading] = (0, _react.useState)(false);
61
+ const [confirmSetting, setConfirmSetting] = (0, _react.useState)(null);
62
+ const {
63
+ t
64
+ } = (0, _react.useContext)(_context.LocaleContext);
65
+ const [skipSetup] = (0, _useLocalStorage.default)('skip-blocklet-setup', false);
66
+ const {
67
+ loading: recommendedUrlLoading,
68
+ recommendedUrl
69
+ } = useBlockletUrlEvaluation(blocklet);
70
+ const inProgress = (0, _util2.isInProgress)(blocklet.status);
71
+ const {
72
+ inService
73
+ } = node;
74
+ const createHandler = function createHandler(action, fn) {
75
+ let requireUserConfirm = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
76
+ return async () => {
77
+ const onConfirm = async params => {
78
+ onStart({
79
+ action,
80
+ blocklet
81
+ });
82
+ setLoading(true);
83
+ setCurrentAction(action);
84
+ setConfirmSetting(null);
85
+ let isRemoved = false;
86
+ try {
87
+ var _blocklet$settings;
88
+ const input = {
89
+ did: blocklet.meta.did
90
+ };
91
+ if (action === 'remove') {
92
+ input.keepData = params.removeType === 'keepData';
93
+ }
94
+ if (action === 'start' && !inService && !skipSetup && !((_blocklet$settings = blocklet.settings) !== null && _blocklet$settings !== void 0 && _blocklet$settings.initialized)) {
95
+ // 启动 blocklet 并跳转到 setup 流程界面时携带 serverUrl 查询参数
96
+ const {
97
+ serverUrl
98
+ } = (0, _util3.getLaunchURL)(blocklet, node.info);
99
+ const url = new URL(recommendedUrl);
100
+ url.searchParams.set('serverUrl', serverUrl);
101
+ window.open(url.href);
102
+ onComplete({
103
+ action,
104
+ blocklet
105
+ });
106
+ return;
107
+ }
108
+ await fn({
109
+ input
110
+ });
111
+ if (action === 'remove') {
112
+ isRemoved = true; // Deleted send request and succeeded
113
+ } else {
114
+ await (0, _util2.sleep)(1000); // just avoid user feeling so fast
115
+ }
116
+
117
+ if (action === 'reload') {
118
+ _toast.default.success(t('blocklet.reloadSuccess'));
119
+ }
120
+ onComplete({
121
+ action,
122
+ blocklet
123
+ });
124
+ } catch (err) {
125
+ const errMsg = "Blocklet ".concat(action, " failed: ").concat((0, _util2.formatError)(err));
126
+ onComplete({
127
+ action,
128
+ blocklet,
129
+ error: new Error(errMsg)
130
+ });
131
+ } finally {
132
+ if (!isRemoved) {
133
+ setLoading(false);
134
+ }
135
+ }
136
+ };
137
+ const onCancel = () => {
138
+ setLoading(false);
139
+ setConfirmSetting(null);
140
+ };
141
+ const name = (0, _util.getDisplayName)(blocklet, true);
142
+ const removeSetting = blocklet.source === (0, _constant.fromBlockletSource)(_constant.BlockletSource.custom) ? {
143
+ description: () => /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
144
+ component: "div",
145
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
146
+ gutterBottom: true,
147
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)("b", {
148
+ children: t('blocklet.action.forceRemoveDescription')
149
+ })
150
+ })
151
+ }),
152
+ params: {
153
+ removeType: 'complete'
154
+ }
155
+ } : {
156
+ description: (params, setParams) => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Typography.default, {
157
+ component: "div",
158
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Typography.default, {
159
+ gutterBottom: true,
160
+ children: t('blocklet.action.removeDescription')
161
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_RadioGroup.default, {
162
+ name: "removeType",
163
+ value: params.removeType,
164
+ onChange: e => setParams(_objectSpread(_objectSpread({}, params), {}, {
165
+ removeType: e.target.value
166
+ })),
167
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_FormControlLabel.default, {
168
+ value: "keepData",
169
+ control: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Radio.default, {}),
170
+ label: t('blocklet.action.removeKeepData')
171
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_FormControlLabel.default, {
172
+ value: "complete",
173
+ control: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Radio.default, {}),
174
+ label: t('blocklet.action.removeComplete')
175
+ })]
176
+ })]
177
+ }),
178
+ params: {
179
+ removeType: 'keepData'
180
+ }
181
+ };
182
+ const confirmSettings = {
183
+ stop: {
184
+ title: "".concat(t('common.stop'), " ").concat(name),
185
+ description: t('blocklet.action.stopDescription'),
186
+ confirm: t('blocklet.action.confirmStop'),
187
+ cancel: t('common.cancel'),
188
+ onConfirm,
189
+ onCancel
190
+ },
191
+ restart: {
192
+ title: "".concat(t('common.restart'), " ").concat(name),
193
+ description: t('blocklet.action.restartDescription'),
194
+ confirm: t('blocklet.action.confirmRestart'),
195
+ cancel: t('common.cancel'),
196
+ onConfirm,
197
+ onCancel
198
+ },
199
+ remove: _objectSpread({
200
+ title: "".concat(t('common.remove'), " ").concat(name),
201
+ confirm: t('blocklet.action.confirmRemove'),
202
+ cancel: t('common.cancel'),
203
+ onConfirm,
204
+ onCancel
205
+ }, removeSetting),
206
+ cancelDownload: {
207
+ title: "".concat(t('common.cancel')),
208
+ description: t('blocklet.action.cancelDownloadDescription', {
209
+ name
210
+ }),
211
+ confirm: t('common.confirm'),
212
+ cancel: t('common.cancel'),
213
+ onConfirm,
214
+ onCancel
215
+ }
216
+ };
217
+ if (requireUserConfirm) {
218
+ setConfirmSetting(confirmSettings[action]);
219
+ } else {
220
+ await onConfirm();
221
+ }
222
+ };
223
+ };
224
+ const open = Boolean(anchorEl);
225
+ const onOpen = e => {
226
+ try {
227
+ e.stopPropagation();
228
+ e.preventDefault();
229
+ // eslint-disable-next-line no-empty
230
+ } catch (_unused) {}
231
+ setAnchorEl(e.currentTarget);
232
+ };
233
+ const onClose = e => {
234
+ try {
235
+ e.stopPropagation();
236
+ e.preventDefault();
237
+ // eslint-disable-next-line no-empty
238
+ } catch (_unused2) {}
239
+ setAnchorEl(null);
240
+ };
241
+ const onAction = async (action, e) => {
242
+ try {
243
+ e.stopPropagation();
244
+ e.preventDefault();
245
+ // eslint-disable-next-line no-empty
246
+ } catch (_unused3) {}
247
+ setAnchorEl(null);
248
+ if (typeof action.handler === 'function') {
249
+ try {
250
+ setLoading(true);
251
+ setCurrentAction(action.action);
252
+ await action.handler();
253
+ } catch (err) {
254
+ // eslint-disable-next-line no-console
255
+ console.error("Blocklet ".concat(action.name, " failed: "), err);
256
+ } finally {
257
+ setLoading(false);
258
+ }
259
+ }
260
+ };
261
+ const removeAction = !inService && (0, _util.isDeletableBlocklet)(blocklet) ? {
262
+ action: 'remove',
263
+ icon: _icons.default.Remove,
264
+ name: t('common.remove'),
265
+ handler: createHandler('remove', node.api.deleteBlocklet, true),
266
+ disabled: inProgress
267
+ } : null;
268
+ const cancelDownloadAction = !inService ? {
269
+ action: 'remove',
270
+ icon: _icons.default.Remove,
271
+ name: t('common.cancel'),
272
+ handler: createHandler('cancelDownload', node.api.cancelDownloadBlocklet, true)
273
+ } : null;
274
+ const missingRequiredConfigs = (0, _util.getAppMissingConfigs)(blocklet);
275
+ const actions = [{
276
+ action: 'start',
277
+ icon: _icons.default.Start,
278
+ name: t('common.start'),
279
+ handler: createHandler('start', node.api.startBlocklet),
280
+ disabled: !(0, _util.hasRunnableComponent)(blocklet) || blocklet.status === 'running' || blocklet.status === 'corrupted' || missingRequiredConfigs.length > 0 || (0, _util2.isDownloading)(blocklet.status) || blocklet.mode === _constant.BLOCKLET_MODES.DEVELOPMENT || recommendedUrlLoading || inProgress
281
+ }, {
282
+ action: 'stop',
283
+ icon: _icons.default.Stop,
284
+ name: t('common.stop'),
285
+ handler: createHandler('stop', node.api.stopBlocklet, true),
286
+ disabled: !['running', 'starting'].includes(blocklet.status) || blocklet.mode === _constant.BLOCKLET_MODES.DEVELOPMENT
287
+ }, {
288
+ action: 'restart',
289
+ icon: _icons.default.Restart,
290
+ name: t('common.restart'),
291
+ handler: createHandler('restart', node.api.restartBlocklet, true),
292
+ disabled: blocklet.status !== 'running' || blocklet.mode === _constant.BLOCKLET_MODES.DEVELOPMENT
293
+ }, {
294
+ action: 'reload',
295
+ icon: _icons.default.Reload,
296
+ name: t('common.reload'),
297
+ handler: createHandler('reload', node.api.reloadBlocklet),
298
+ disabled: blocklet.status !== 'running' || blocklet.mode === _constant.BLOCKLET_MODES.DEVELOPMENT
299
+ }, (0, _util2.isDownloading)(blocklet.status) ? cancelDownloadAction : removeAction, {
300
+ separator: true
301
+ }, {
302
+ onlyInMenu: true,
303
+ action: 'config',
304
+ icon: _icons.default.Config,
305
+ name: t('common.config'),
306
+ handler: () => {
307
+ navigate("/blocklets/".concat(blocklet.meta.did, "/configuration"));
308
+ },
309
+ disabled: (0, _util2.isDownloading)(blocklet.status)
310
+ }, {
311
+ onlyInMenu: true,
312
+ action: 'team',
313
+ icon: _icons.default.Group,
314
+ name: t('common.manageTeam'),
315
+ handler: () => {
316
+ navigate("/blocklets/".concat(blocklet.meta.did, "/members"));
317
+ },
318
+ disabled: (0, _util2.isDownloading)(blocklet.status)
319
+ }, {
320
+ onlyInMenu: true,
321
+ action: 'log',
322
+ icon: _icons.default.Log,
323
+ name: t('common.log'),
324
+ handler: () => {
325
+ navigate("/logs/blocklet-".concat(blocklet.meta.did));
326
+ },
327
+ disabled: (0, _util2.isDownloading)(blocklet.status)
328
+ }].filter(Boolean);
329
+ if (variant === 'menu') {
330
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Div, {
331
+ "data-cy": "blocklet-actions",
332
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
333
+ "aria-label": "more",
334
+ "aria-controls": "actions-menu",
335
+ "aria-haspopup": "true",
336
+ "data-cy": "trigger-blocklet-actions",
337
+ "actions-blocklet-did": blocklet.meta.did,
338
+ onClick: onOpen,
339
+ size: "small",
340
+ disabled: !hasPermission || !(0, _util2.isDownloading)(blocklet.status) && loading,
341
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MoreVert.default, {})
342
+ }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Menu.default, {
343
+ id: "actions-menu",
344
+ anchorEl: anchorEl,
345
+ keepMounted: true,
346
+ open: open,
347
+ onClose: onClose,
348
+ PaperProps: {},
349
+ children: [missingRequiredConfigs.length > 0 && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Alert.default, {
350
+ style: {
351
+ maxWidth: '400px'
352
+ },
353
+ severity: "error",
354
+ children: [t('blocklet.config.missingRequired'), /*#__PURE__*/(0, _jsxRuntime.jsx)("br", {}), /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactRouterDom.Link, {
355
+ to: "/blocklets/".concat(blocklet.meta.did, "/components"),
356
+ children: t('blocklet.config.gotoFix')
357
+ })]
358
+ }), actions.map((action, i) => {
359
+ if (action.separator) {
360
+ // eslint-disable-next-line react/no-array-index-key
361
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Divider.default, {}, "separator-".concat(i));
362
+ }
363
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_MenuItem.default, {
364
+ dense: true,
365
+ onClick: e => onAction(action, e),
366
+ disabled: action.disabled,
367
+ "data-cy": "".concat(action.action, "-blocklet"),
368
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_ListItemIcon.default, {
369
+ style: {
370
+ minWidth: 24
371
+ },
372
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(action.icon, {
373
+ fontSize: "small"
374
+ })
375
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ListItemText.default, {
376
+ primary: action.name
377
+ })]
378
+ }, action.name);
379
+ })]
380
+ }), confirmSetting && /*#__PURE__*/(0, _jsxRuntime.jsx)(_confirm.default, {
381
+ title: confirmSetting.title,
382
+ description: confirmSetting.description,
383
+ confirm: confirmSetting.confirm,
384
+ cancel: confirmSetting.cancel,
385
+ params: confirmSetting.params,
386
+ onConfirm: confirmSetting.onConfirm,
387
+ onCancel: confirmSetting.onCancel
388
+ })]
389
+ });
390
+ }
391
+ return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Div, _objectSpread(_objectSpread({
392
+ "data-cy": "blocklet-actions"
393
+ }, rest), {}, {
394
+ children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_ButtonGroup.default, {
395
+ children: actions.filter(x => !x.separator && !x.onlyInMenu).map(action => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Button.default, {
396
+ title: action.name,
397
+ "data-cy": "".concat(action.action, "-blocklet"),
398
+ onClick: () => onAction(action),
399
+ disabled: Boolean(action.disabled) || loading,
400
+ children: [currentAction === action.action && loading && inProgress ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Spinner.default, {
401
+ size: [16, 10]
402
+ }) : /*#__PURE__*/(0, _jsxRuntime.jsx)(action.icon, {}), /*#__PURE__*/(0, _jsxRuntime.jsx)("span", {
403
+ className: "blocklet-action-text",
404
+ children: action.name
405
+ })]
406
+ }, action.name))
407
+ }), confirmSetting && /*#__PURE__*/(0, _jsxRuntime.jsx)(_confirm.default, {
408
+ title: confirmSetting.title,
409
+ description: confirmSetting.description,
410
+ confirm: confirmSetting.confirm,
411
+ cancel: confirmSetting.cancel,
412
+ params: confirmSetting.params,
413
+ onConfirm: confirmSetting.onConfirm,
414
+ onCancel: confirmSetting.onCancel
415
+ })]
416
+ }));
417
+ }
418
+ BlockletActions.propTypes = {
419
+ blocklet: _propTypes.default.object.isRequired,
420
+ onStart: _propTypes.default.func.isRequired,
421
+ onComplete: _propTypes.default.func.isRequired,
422
+ variant: _propTypes.default.oneOf(['menu', 'group']),
423
+ hasPermission: _propTypes.default.bool,
424
+ useBlockletUrlEvaluation: _propTypes.default.func
425
+ };
426
+ BlockletActions.defaultProps = {
427
+ variant: 'menu',
428
+ hasPermission: false,
429
+ useBlockletUrlEvaluation: () => {
430
+ var _window, _window$location;
431
+ return {
432
+ loading: false,
433
+ recommendedUrl: (_window = window) === null || _window === void 0 ? void 0 : (_window$location = _window.location) === null || _window$location === void 0 ? void 0 : _window$location.href
434
+ };
435
+ }
436
+ };
437
+ const Div = _styled.default.div(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n display: flex;\n align-items: center;\n\n @media (max-width: ", "px) {\n .MuiButton-root {\n padding: 4px;\n font-size: 10px;\n }\n }\n"])), props => props.theme.breakpoints.values.sm);