@abtnode/ux 1.8.26 → 1.8.27

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