@abtnode/ux 1.16.11-next-069c3537 → 1.16.11-next-3d2b39f7

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 (57) hide show
  1. package/lib/actions.js +5 -4
  2. package/lib/blocklet/access/config-access.js +3 -3
  3. package/lib/blocklet/actions.js +6 -6
  4. package/lib/blocklet/add-cert.js +3 -3
  5. package/lib/blocklet/component/add.js +2 -2
  6. package/lib/blocklet/component/delete.js +32 -7
  7. package/lib/blocklet/component/environment.js +11 -11
  8. package/lib/blocklet/component/index.js +161 -26
  9. package/lib/blocklet/component/navigation/navigation-dialog.js +4 -9
  10. package/lib/blocklet/component/setting.js +2 -2
  11. package/lib/blocklet/component/space-connector.js +4 -4
  12. package/lib/blocklet/component/space-selector.js +2 -2
  13. package/lib/blocklet/component/start.js +108 -0
  14. package/lib/blocklet/component/store-blocklet-list.js +2 -2
  15. package/lib/blocklet/config-navigation.js +10 -19
  16. package/lib/blocklet/configuration.js +7 -7
  17. package/lib/blocklet/migration.js +4 -4
  18. package/lib/blocklet/notification/email.js +4 -3
  19. package/lib/blocklet/oauth/auth0.js +4 -3
  20. package/lib/blocklet/overview.js +1 -7
  21. package/lib/blocklet/preferences/app-sk.js +3 -3
  22. package/lib/blocklet/purchase/component-purchase.js +2 -2
  23. package/lib/blocklet/router/action/add-domain-alias.js +2 -2
  24. package/lib/blocklet/router/action/add-rule.js +2 -2
  25. package/lib/blocklet/router/action/delete-domain-alias.js +2 -2
  26. package/lib/blocklet/router/action/delete-rule.js +2 -2
  27. package/lib/blocklet/router/action/update-rule.js +2 -2
  28. package/lib/blocklet/router/rule-actions.js +3 -0
  29. package/lib/blocklet/router/rule-list.js +1 -1
  30. package/lib/blocklet/storage/connect.js +2 -2
  31. package/lib/blocklet/storage/delete.js +2 -2
  32. package/lib/blocklet/storage/index.js +4 -4
  33. package/lib/blocklet/storage/switch-did-spaces.js +3 -3
  34. package/lib/blocklet/version.js +1 -8
  35. package/lib/contexts/audit-log.js +2 -2
  36. package/lib/exchange-passport.js +3 -3
  37. package/lib/hooks/blocklet.js +4 -4
  38. package/lib/hooks/use-navigation.js +1 -1
  39. package/lib/locales/en.js +24 -24
  40. package/lib/locales/zh.js +44 -44
  41. package/lib/logs/download.js +2 -2
  42. package/lib/store/delete.js +2 -2
  43. package/lib/team/members/index.js +4 -3
  44. package/lib/team/members/member.js +2 -8
  45. package/lib/team/members/passport-issuances.js +2 -8
  46. package/lib/team/members/passports.js +2 -8
  47. package/lib/team/members/toggle-user-approval.js +2 -2
  48. package/lib/team/passports/color.js +2 -2
  49. package/lib/team/passports/detail.js +4 -4
  50. package/lib/team/passports/index.js +3 -3
  51. package/lib/team/passports/trusted-factories.js +3 -3
  52. package/lib/team/passports/trusted-factory.js +3 -3
  53. package/lib/team/passports/trusted-issuer.js +3 -3
  54. package/lib/team/passports/trusted-issuers.js +4 -4
  55. package/lib/util/index.js +8 -13
  56. package/package.json +14 -15
  57. package/lib/toast.js +0 -86
package/lib/actions.js CHANGED
@@ -56,7 +56,7 @@ function Actions(_ref) {
56
56
  "aria-haspopup": "true",
57
57
  "data-cy": "actions-menu-icon",
58
58
  onClick: onOpen,
59
- size: "large",
59
+ size: "small",
60
60
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_MoreHoriz.default, {})
61
61
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Menu.default, {
62
62
  id: "actions-menu",
@@ -82,13 +82,14 @@ function Actions(_ref) {
82
82
  return /*#__PURE__*/(0, _react.createElement)(_MenuItem.default, _objectSpread(_objectSpread({}, opts), {}, {
83
83
  disabled: disabled,
84
84
  dense: true,
85
- onClick: e => {
85
+ onClick: async e => {
86
+ await _onClick(e);
86
87
  onClose();
87
- _onClick(e);
88
88
  }
89
89
  // eslint-disable-next-line react/no-array-index-key
90
90
  ,
91
- key: index
91
+ key: index,
92
+ "data-cy": "actions-menu-".concat(index)
92
93
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_ListItemIcon.default, {
93
94
  style: {
94
95
  minWidth: 24,
@@ -26,10 +26,10 @@ var _context = require("@arcblock/ux/lib/Locale/context");
26
26
  var _Dialog = _interopRequireDefault(require("@arcblock/ux/lib/Dialog"));
27
27
  var _Button = _interopRequireDefault(require("@arcblock/ux/lib/Button"));
28
28
  var _CircularProgress = _interopRequireDefault(require("@mui/material/CircularProgress"));
29
+ var _Toast = _interopRequireDefault(require("@arcblock/ux/lib/Toast"));
29
30
  var _node = require("../../contexts/node");
30
31
  var _team = require("../../contexts/team");
31
32
  var _util2 = require("../../util");
32
- var _toast = _interopRequireDefault(require("../../toast"));
33
33
  var _config = _interopRequireDefault(require("../../who-can-access/config"));
34
34
  var _jsxRuntime = require("react/jsx-runtime");
35
35
  var _templateObject, _templateObject2;
@@ -160,12 +160,12 @@ function ConfigAccess(_ref) {
160
160
  whoCanAccess: value
161
161
  }
162
162
  });
163
- _toast.default.success(t('blocklet.config.access.updatedTip'));
163
+ _Toast.default.success(t('blocklet.config.access.updatedTip'));
164
164
  onClose();
165
165
  setLoading(false);
166
166
  } catch (err) {
167
167
  setLoading(false);
168
- _toast.default.error((0, _util2.formatError)(err));
168
+ _Toast.default.error((0, _util2.formatError)(err));
169
169
  }
170
170
  };
171
171
  const disabled = loading || whoCanAccess === CONFIG_ROLE && !roles.length;
@@ -28,7 +28,7 @@ var _util = require("@blocklet/meta/lib/util");
28
28
  var _context = require("@arcblock/ux/lib/Locale/context");
29
29
  var _constant = require("@blocklet/constant");
30
30
  var _constant2 = require("@abtnode/constant");
31
- var _toast = _interopRequireDefault(require("../toast"));
31
+ var _Toast = _interopRequireDefault(require("@arcblock/ux/lib/Toast"));
32
32
  var _util2 = require("../util");
33
33
  var _util3 = require("./util");
34
34
  var _node = require("../contexts/node");
@@ -93,6 +93,10 @@ function BlockletActions(_ref) {
93
93
  await fn(params);
94
94
  } else if (action === 'start') {
95
95
  var _blocklet$settings;
96
+ if (!(0, _util.hasRunnableComponent)(blocklet)) {
97
+ _Toast.default.error(t('blocklet.noComponent'));
98
+ return;
99
+ }
96
100
  if (!inService && !skipSetup && !((_blocklet$settings = blocklet.settings) !== null && _blocklet$settings !== void 0 && _blocklet$settings.initialized)) {
97
101
  // 跳转到 setup 流程界面时携带 serverUrl 查询参数
98
102
  const serverUrl = (0, _util3.getServerUrl)(node.info);
@@ -105,10 +109,6 @@ function BlockletActions(_ref) {
105
109
  });
106
110
  return;
107
111
  }
108
- if (!(0, _util.hasRunnableComponent)(blocklet)) {
109
- _toast.default.error(t('blocklet.noComponent'));
110
- return;
111
- }
112
112
  const input = {
113
113
  did: blocklet.meta.did
114
114
  };
@@ -130,7 +130,7 @@ function BlockletActions(_ref) {
130
130
  }
131
131
 
132
132
  if (action === 'reload') {
133
- _toast.default.success(t('blocklet.reloadSuccess'));
133
+ _Toast.default.success(t('blocklet.reloadSuccess'));
134
134
  }
135
135
  onComplete({
136
136
  action,
@@ -12,7 +12,7 @@ var _CircularProgress = _interopRequireDefault(require("@mui/material/CircularPr
12
12
  var _Alert = _interopRequireDefault(require("@arcblock/ux/lib/Alert"));
13
13
  var _context = require("@arcblock/ux/lib/Locale/context");
14
14
  var _constant = require("@blocklet/constant");
15
- var _toast = _interopRequireDefault(require("../toast"));
15
+ var _Toast = _interopRequireDefault(require("@arcblock/ux/lib/Toast"));
16
16
  var _confirm = _interopRequireDefault(require("../confirm"));
17
17
  var _node = require("../contexts/node");
18
18
  var _blocklet = require("../contexts/blocklet");
@@ -68,9 +68,9 @@ function Add(props) {
68
68
  if (cert.domain === domain) {
69
69
  setIssuing(false);
70
70
  if (type === 'success') {
71
- _toast.default.success("The ".concat(cert.domain, " certificate is issued successfully"));
71
+ _Toast.default.success("The ".concat(cert.domain, " certificate is issued successfully"));
72
72
  } else if (type === 'error') {
73
- _toast.default.error("Failed to issue certificate for ".concat(cert.domain));
73
+ _Toast.default.error("Failed to issue certificate for ".concat(cert.domain));
74
74
  }
75
75
  }
76
76
  };
@@ -33,9 +33,9 @@ var _AnimationWaiter = _interopRequireDefault(require("@arcblock/ux/lib/Animatio
33
33
  var _launchResultMessage = _interopRequireDefault(require("@blocklet/launcher-layout/lib/launch-result-message"));
34
34
  var _util = require("@blocklet/meta/lib/util");
35
35
  var _urlPathFriendly = _interopRequireDefault(require("@blocklet/meta/lib/url-path-friendly"));
36
+ var _Toast = _interopRequireDefault(require("@arcblock/ux/lib/Toast"));
36
37
  var _node = require("../../contexts/node");
37
38
  var _util2 = require("../../util");
38
- var _toast = _interopRequireDefault(require("../../toast"));
39
39
  var _schemaForm = _interopRequireDefault(require("../../schema-form"));
40
40
  var _required = _interopRequireDefault(require("../../form/required"));
41
41
  var _purchase = require("../purchase");
@@ -334,7 +334,7 @@ function AddComponent(_ref2) {
334
334
  }
335
335
  } catch (err) {
336
336
  const errMsg = (0, _util2.formatError)(err);
337
- _toast.default.error(errMsg);
337
+ _Toast.default.error(errMsg);
338
338
  console.error('installComponent error: ', err);
339
339
  setInstallErrorResult(errMsg);
340
340
  } finally {
@@ -30,7 +30,10 @@ function DeleteComponent(_ref) {
30
30
  component,
31
31
  remove,
32
32
  disabled,
33
- tip
33
+ tip,
34
+ showConfirm,
35
+ hideBtn,
36
+ onCancel: _onCancel
34
37
  } = _ref;
35
38
  const {
36
39
  t
@@ -44,9 +47,8 @@ function DeleteComponent(_ref) {
44
47
  setDeleteSetting(null);
45
48
  };
46
49
  const componentDisabled = disabled || loading;
47
- const btn = /*#__PURE__*/(0, _jsxRuntime.jsx)(StyledButton, {
48
- disabled: componentDisabled,
49
- onClick: () => setDeleteSetting({
50
+ const doShowConfirm = () => {
51
+ setDeleteSetting({
50
52
  title: "".concat(t('common.delete'), " ").concat(component.meta.title || component.meta.name),
51
53
  // eslint-disable-next-line react/no-unstable-nested-components
52
54
  description: (params, setParams) => /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Typography.default, {
@@ -78,8 +80,25 @@ function DeleteComponent(_ref) {
78
80
  removeType: 'keepData'
79
81
  },
80
82
  onConfirm: deleteComponent,
81
- onCancel: () => setDeleteSetting(null)
82
- }),
83
+ onCancel: () => {
84
+ setDeleteSetting(null);
85
+ _onCancel();
86
+ }
87
+ });
88
+ };
89
+ (0, _react.useEffect)(() => {
90
+ if (showConfirm) {
91
+ doShowConfirm();
92
+ } else {
93
+ setLoading(false);
94
+ setDeleteSetting(null);
95
+ }
96
+ // eslint-disable-next-line react-hooks/exhaustive-deps
97
+ }, [showConfirm]);
98
+ const btn = /*#__PURE__*/(0, _jsxRuntime.jsx)(StyledButton, {
99
+ size: "small",
100
+ disabled: componentDisabled,
101
+ onClick: () => doShowConfirm,
83
102
  "data-cy": "delete-component-btn",
84
103
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Delete.default, {
85
104
  disabled: componentDisabled
@@ -92,7 +111,7 @@ function DeleteComponent(_ref) {
92
111
  })
93
112
  });
94
113
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
95
- children: [btnWithToolTip, deleteSetting && /*#__PURE__*/(0, _jsxRuntime.jsx)(_confirm.default, {
114
+ children: [!hideBtn && btnWithToolTip, deleteSetting && /*#__PURE__*/(0, _jsxRuntime.jsx)(_confirm.default, {
96
115
  title: deleteSetting.title,
97
116
  description: deleteSetting.description,
98
117
  confirm: deleteSetting.confirm,
@@ -106,12 +125,18 @@ function DeleteComponent(_ref) {
106
125
  DeleteComponent.propTypes = {
107
126
  component: _propTypes.default.object.isRequired,
108
127
  remove: _propTypes.default.func,
128
+ onCancel: _propTypes.default.func,
109
129
  disabled: _propTypes.default.bool,
130
+ showConfirm: _propTypes.default.bool,
131
+ hideBtn: _propTypes.default.bool,
110
132
  tip: _propTypes.default.string
111
133
  };
112
134
  DeleteComponent.defaultProps = {
113
135
  remove: async () => {},
114
136
  disabled: false,
137
+ showConfirm: false,
138
+ hideBtn: false,
139
+ onCancel: () => {},
115
140
  tip: ''
116
141
  };
117
142
  const StyledButton = (0, _styled.default)(_IconButton.default)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n &.Mui-disabled {\n opacity: 0.5;\n }\n"])));
@@ -13,8 +13,8 @@ var _Alert = _interopRequireDefault(require("@mui/material/Alert"));
13
13
  var _constant = require("@blocklet/constant");
14
14
  var _util = require("@blocklet/meta/lib/util");
15
15
  var _context = require("@arcblock/ux/lib/Locale/context");
16
+ var _Toast = _interopRequireDefault(require("@arcblock/ux/lib/Toast"));
16
17
  var _clickToCopy = _interopRequireDefault(require("../../click-to-copy"));
17
- var _toast = _interopRequireDefault(require("../../toast"));
18
18
  var _node = require("../../contexts/node");
19
19
  var _tableIcons = _interopRequireDefault(require("../../table-icons"));
20
20
  var _table = _interopRequireDefault(require("../../table"));
@@ -61,7 +61,7 @@ function ComponentEnvironment(_ref) {
61
61
  t
62
62
  } = (0, _react.useContext)(_context.LocaleContext);
63
63
  const dids = [...ancestors.map(x => x.meta.did), blocklet.meta.did];
64
- const onConfigChanged = () => _toast.default.success(t('blocklet.config.changedTip'));
64
+ const onConfigChanged = () => _Toast.default.success(t('blocklet.config.changedTip'));
65
65
  const isConfigEditable = x => x.custom;
66
66
  if ((0, _util2.isInstalling)(blocklet.status)) {
67
67
  return null;
@@ -71,11 +71,11 @@ function ComponentEnvironment(_ref) {
71
71
  }
72
72
  const onAddConfig = async data => {
73
73
  if (!data.key.trim() || !data.value.trim()) {
74
- _toast.default.error(t('blocklet.config.environment.keyValueRequired'));
74
+ _Toast.default.error(t('blocklet.config.environment.keyValueRequired'));
75
75
  return;
76
76
  }
77
77
  if (data.key.startsWith('BLOCKLET_') || data.key.startsWith('COMPONENT_')) {
78
- _toast.default.error(t('blocklet.config.environment.invalidKey'));
78
+ _Toast.default.error(t('blocklet.config.environment.invalidKey'));
79
79
  return;
80
80
  }
81
81
  data.custom = true;
@@ -92,24 +92,24 @@ function ComponentEnvironment(_ref) {
92
92
  const onEditConfig = async (newData, oldData) => {
93
93
  // only required field can't be empty
94
94
  if (newData.required && (!newData.key.trim() || !newData.value.trim())) {
95
- _toast.default.error(t('blocklet.config.environment.keyValueRequired'));
95
+ _Toast.default.error(t('blocklet.config.environment.keyValueRequired'));
96
96
  return;
97
97
  }
98
98
  if (newData.key.startsWith('BLOCKLET_') && !_constant.BLOCKLET_CONFIGURABLE_KEY[newData.key]) {
99
- _toast.default.error(t('blocklet.config.environment.invalidKey'));
99
+ _Toast.default.error(t('blocklet.config.environment.invalidKey'));
100
100
  return;
101
101
  }
102
102
  if (newData.key === _constant.BLOCKLET_CONFIGURABLE_KEY.BLOCKLET_CLUSTER_SIZE) {
103
103
  const errMessage = (0, _util2.isValidClusterSize)(newData);
104
104
  if (errMessage) {
105
- _toast.default.error(errMessage);
105
+ _Toast.default.error(errMessage);
106
106
  return;
107
107
  }
108
108
  }
109
109
  const configs = [newData];
110
110
  if (newData.key !== oldData.key) {
111
111
  if (!newData.custom) {
112
- _toast.default.error('Only key of custom env can be changed');
112
+ _Toast.default.error('Only key of custom env can be changed');
113
113
  return;
114
114
  }
115
115
  configs.push({
@@ -128,16 +128,16 @@ function ComponentEnvironment(_ref) {
128
128
  onConfigChanged(result.blocklet);
129
129
  }
130
130
  } catch (err) {
131
- _toast.default.error((0, _util2.formatError)(err));
131
+ _Toast.default.error((0, _util2.formatError)(err));
132
132
  }
133
133
  };
134
134
  const onDeleteConfig = async data => {
135
135
  if (data.required) {
136
- _toast.default.error(t('blocklet.config.environment.deleteForbidden'));
136
+ _Toast.default.error(t('blocklet.config.environment.deleteForbidden'));
137
137
  return;
138
138
  }
139
139
  if (!data.custom) {
140
- _toast.default.error('Only key of custom env can be changed');
140
+ _Toast.default.error('Only key of custom env can be changed');
141
141
  return;
142
142
  }
143
143
  const result = await node.api.configBlocklet({
@@ -26,6 +26,9 @@ var _ArrowForward = _interopRequireDefault(require("@mui/icons-material/ArrowFor
26
26
  var _ExpandMore = _interopRequireDefault(require("@mui/icons-material/ExpandMore"));
27
27
  var _ChevronRight = _interopRequireDefault(require("@mui/icons-material/ChevronRight"));
28
28
  var _Checkbox = _interopRequireDefault(require("@mui/material/Checkbox"));
29
+ var _Replay = _interopRequireDefault(require("@mui/icons-material/Replay"));
30
+ var _Autorenew = _interopRequireDefault(require("@mui/icons-material/Autorenew"));
31
+ var _Delete = _interopRequireDefault(require("@mui/icons-material/Delete"));
29
32
  var _react2 = require("@iconify/react");
30
33
  var _constant = require("@abtnode/constant");
31
34
  var _CircularProgress = _interopRequireDefault(require("@mui/material/CircularProgress"));
@@ -35,10 +38,10 @@ var _Button = _interopRequireDefault(require("@arcblock/ux/lib/Button"));
35
38
  var _Empty = _interopRequireDefault(require("@arcblock/ux/lib/Empty"));
36
39
  var _util = require("@blocklet/meta/lib/util");
37
40
  var _normalizePathPrefix = _interopRequireDefault(require("@abtnode/util/lib/normalize-path-prefix"));
41
+ var _Toast = _interopRequireDefault(require("@arcblock/ux/lib/Toast"));
38
42
  var _deletingBlocklets = require("../../contexts/deleting-blocklets");
39
43
  var _didAddress = _interopRequireDefault(require("../../did-address"));
40
44
  var _tag = _interopRequireDefault(require("../../tag"));
41
- var _toast = _interopRequireDefault(require("../../toast"));
42
45
  var _blockletSource = _interopRequireDefault(require("../blocklet-source"));
43
46
  var _status = _interopRequireDefault(require("../status"));
44
47
  var _version = _interopRequireDefault(require("../version"));
@@ -49,13 +52,15 @@ var _bundleAvatar = _interopRequireDefault(require("../bundle-avatar"));
49
52
  var _mode = _interopRequireDefault(require("../mode"));
50
53
  var _configuration = _interopRequireDefault(require("./configuration"));
51
54
  var _delete = _interopRequireDefault(require("./delete"));
55
+ var _start = _interopRequireDefault(require("./start"));
52
56
  var _line = _interopRequireDefault(require("./line"));
53
57
  var _add = _interopRequireDefault(require("./add"));
54
58
  var _addRule = _interopRequireDefault(require("../router/action/add-rule"));
55
59
  var _ruleList = _interopRequireDefault(require("../router/rule-list"));
60
+ var _actions = _interopRequireDefault(require("../../actions"));
56
61
  var _jsxRuntime = require("react/jsx-runtime");
57
62
  const _excluded = ["blocklet", "onUpdate", "getComponentUrl"];
58
- var _templateObject, _templateObject2;
63
+ var _templateObject, _templateObject2, _templateObject3;
59
64
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
60
65
  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; }
61
66
  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; }
@@ -137,6 +142,10 @@ function ComponentItem(_ref) {
137
142
  ancestors,
138
143
  depth,
139
144
  onRemove,
145
+ onStart,
146
+ onStop,
147
+ onRestart,
148
+ onReload,
140
149
  getComponentUrl,
141
150
  app
142
151
  } = _ref;
@@ -145,6 +154,8 @@ function ComponentItem(_ref) {
145
154
  } = (0, _react.useContext)(_context.LocaleContext);
146
155
  const [expand, setExpand] = (0, _react.useState)(true);
147
156
  const [componentInfo, setComponentInfo] = (0, _react.useState)();
157
+ const [showDeleteConfirm, setShowDeleteConfirm] = (0, _react.useState)(false);
158
+ const [loading, setLoading] = (0, _react.useState)(false);
148
159
  const {
149
160
  deletingBlocklets: deletingComponents
150
161
  } = (0, _deletingBlocklets.useDeletingBlockletContext)();
@@ -156,9 +167,6 @@ function ComponentItem(_ref) {
156
167
  }
157
168
  const mountPoint = "/".concat(ancestors.slice(1) // ignore mountPoint of root component
158
169
  .map(x => x.mountPoint || '/').join('/'), "/").concat(blocklet.mountPoint || '/').replace(/\/+/g, '/');
159
-
160
- // hide root's status and only display specific status
161
- const showStatus = !!ancestors.length && ['downloading', 'deleting', 'starting'].includes(status);
162
170
  const canExpand = depth > 0 && blocklet.children.length > 0;
163
171
  const expandIcon = /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
164
172
  size: "small",
@@ -203,7 +211,13 @@ function ComponentItem(_ref) {
203
211
  status: status,
204
212
  source: componentInfo.source
205
213
  })
206
- }, {
214
+ }, blocklet.status === 'running' ? {
215
+ name: t('blocklet.startedAt'),
216
+ value: (0, _util2.formatToDatetime)(blocklet.startedAt)
217
+ } : null, blocklet.status !== 'running' ? {
218
+ name: t('blocklet.stoppedAt'),
219
+ value: (0, _util2.formatToDatetime)(blocklet.stoppedAt)
220
+ } : null, {
207
221
  name: t('common.mountPoint'),
208
222
  value: mountPoint
209
223
  }, {
@@ -267,7 +281,9 @@ function ComponentItem(_ref) {
267
281
  });
268
282
  }
269
283
  }
270
- return [(depth > 0 || blocklet.meta.group !== 'gateway') && /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
284
+ const appInProgress = (0, _util.isInProgress)(root.status);
285
+ const componentInProgress = (0, _util.isInProgress)(blocklet.status);
286
+ return [(depth > 0 || blocklet.meta.group !== 'gateway') && /*#__PURE__*/(0, _jsxRuntime.jsxs)(StyledComponentRow, {
271
287
  display: "flex",
272
288
  py: 2,
273
289
  className: "component-item",
@@ -293,10 +309,8 @@ function ComponentItem(_ref) {
293
309
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
294
310
  ml: "16px",
295
311
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
296
- style: {
297
- color: '#222',
298
- fontSize: 18
299
- },
312
+ className: "component-name",
313
+ onClick: () => setComponentInfo(blocklet),
300
314
  children: (0, _util.getDisplayName)(blocklet, true)
301
315
  }), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
302
316
  display: "flex",
@@ -309,7 +323,7 @@ function ComponentItem(_ref) {
309
323
  marginLeft: 4
310
324
  },
311
325
  mode: blocklet.mode || ''
312
- }), showStatus && /*#__PURE__*/(0, _jsxRuntime.jsx)(_status.default, {
326
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_status.default, {
313
327
  style: {
314
328
  marginLeft: 4
315
329
  },
@@ -359,6 +373,8 @@ function ComponentItem(_ref) {
359
373
  })
360
374
  })
361
375
  }, mountPoint), /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
376
+ display: "flex",
377
+ alignItems: "center",
362
378
  children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Tooltip.default, {
363
379
  title: t('common.visit'),
364
380
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)("a", {
@@ -366,15 +382,10 @@ function ComponentItem(_ref) {
366
382
  href: href,
367
383
  rel: "noopener noreferrer",
368
384
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
385
+ size: "small",
369
386
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Launch.default, {})
370
387
  })
371
388
  })
372
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_Tooltip.default, {
373
- title: t('common.overview'),
374
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
375
- onClick: () => setComponentInfo(blocklet),
376
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_InfoOutlined.default, {})
377
- })
378
389
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_configuration.default, {
379
390
  blocklet: blocklet,
380
391
  ancestors: ancestors,
@@ -391,17 +402,53 @@ function ComponentItem(_ref) {
391
402
  invisible: !(0, _util.getComponentMissingConfigs)(blocklet, ancestors).length,
392
403
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_IconButton.default, {
393
404
  onClick: open,
405
+ size: "small",
394
406
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_SettingsOutlined.default, {})
395
407
  })
396
408
  })
397
409
  }, "config");
398
410
  }
399
- }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_delete.default, {
411
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_start.default, {
400
412
  blocklet: root,
401
413
  component: blocklet,
402
- remove: onRemove,
414
+ onStart: onStart,
415
+ onStop: onStop,
403
416
  disabled: !!deleteDisabledTip,
404
417
  tip: deleteDisabledTip
418
+ }), /*#__PURE__*/(0, _jsxRuntime.jsx)(_actions.default, {
419
+ "data-cy": "component-actions",
420
+ actions: [{
421
+ icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_InfoOutlined.default, {}),
422
+ text: t('common.detail'),
423
+ onClick: () => {
424
+ setComponentInfo(blocklet);
425
+ }
426
+ }, {
427
+ icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Replay.default, {}),
428
+ text: t('common.restart'),
429
+ onClick: async () => {
430
+ setLoading(true);
431
+ await onRestart(blocklet);
432
+ setLoading(false);
433
+ },
434
+ disabled: appInProgress || componentInProgress || blocklet.status !== 'running'
435
+ }, {
436
+ icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Autorenew.default, {}),
437
+ text: t('common.reload'),
438
+ onClick: async () => {
439
+ setLoading(true);
440
+ await onReload(blocklet);
441
+ setLoading(false);
442
+ },
443
+ disabled: loading || appInProgress || componentInProgress || blocklet.status !== 'running'
444
+ }, {
445
+ icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Delete.default, {}),
446
+ text: t('common.delete'),
447
+ onClick: () => {
448
+ setShowDeleteConfirm(true);
449
+ },
450
+ disabled: appInProgress || componentInProgress
451
+ }]
405
452
  })]
406
453
  }, "actions")]
407
454
  }, "group-not-gateway-box"), /*#__PURE__*/(0, _jsxRuntime.jsx)(_line.default, {
@@ -413,6 +460,10 @@ function ComponentItem(_ref) {
413
460
  ancestors: [...ancestors, blocklet],
414
461
  depth: depth + 1,
415
462
  onRemove: onRemove,
463
+ onStart: onStart,
464
+ onStop: onStop,
465
+ onRestart: onRestart,
466
+ onReload: onReload,
416
467
  getComponentUrl: getComponentUrl,
417
468
  app: app
418
469
  }, "".concat(depth + 1, "-").concat(x.meta.did)))
@@ -431,13 +482,35 @@ function ComponentItem(_ref) {
431
482
  children: renderRows(componentRows)
432
483
  })]
433
484
  }, "dialog-wrapper")
434
- }, "base-info-dialog")];
485
+ }, "base-info-dialog"), /*#__PURE__*/(0, _jsxRuntime.jsx)(_delete.default, {
486
+ blocklet: root,
487
+ component: blocklet,
488
+ remove: async function remove() {
489
+ setLoading(true);
490
+ try {
491
+ await onRemove(...arguments);
492
+ } catch (_unused) {
493
+ // ignore
494
+ }
495
+ setLoading(false);
496
+ setShowDeleteConfirm(false);
497
+ },
498
+ onCancel: () => setShowDeleteConfirm(false),
499
+ disabled: !!deleteDisabledTip,
500
+ tip: deleteDisabledTip,
501
+ hideBtn: true,
502
+ showConfirm: showDeleteConfirm
503
+ })];
435
504
  }
436
505
  ComponentItem.propTypes = {
437
506
  blocklet: _propTypes.default.object.isRequired,
438
507
  ancestors: _propTypes.default.array,
439
508
  depth: _propTypes.default.number,
440
509
  onRemove: _propTypes.default.func,
510
+ onStart: _propTypes.default.func,
511
+ onStop: _propTypes.default.func,
512
+ onRestart: _propTypes.default.func,
513
+ onReload: _propTypes.default.func,
441
514
  getComponentUrl: _propTypes.default.func,
442
515
  app: _propTypes.default.object
443
516
  };
@@ -445,10 +518,15 @@ ComponentItem.defaultProps = {
445
518
  ancestors: [],
446
519
  depth: 0,
447
520
  onRemove: () => {},
521
+ onStart: () => {},
522
+ onStop: () => {},
523
+ onRestart: () => {},
524
+ onReload: () => {},
448
525
  getComponentUrl: () => window.location.origin,
449
526
  app: null
450
527
  };
451
528
  const StyledBadge = (0, _styled.default)(_Badge.default)(_templateObject || (_templateObject = _taggedTemplateLiteral(["\n .BaseBadge-badge {\n top: ", "px;\n right: ", "px;\n }\n"])), props => props.top * 8 || 6, props => props.right * 8 || 6);
529
+ const StyledComponentRow = (0, _styled.default)(_Box.default)(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n .component-name {\n color: #222;\n font-size: 16px;\n cursor: pointer;\n }\n"])));
452
530
  function BlockletComponent(_ref4) {
453
531
  let {
454
532
  blocklet,
@@ -498,7 +576,7 @@ function BlockletComponent(_ref4) {
498
576
  })).preUpdateInfo || {};
499
577
  setLoading(false);
500
578
  if (!updateId) {
501
- _toast.default.info(t('blocklet.component.noUpdate'));
579
+ _Toast.default.info(t('blocklet.component.noUpdate'));
502
580
  return;
503
581
  }
504
582
  const list = [];
@@ -539,7 +617,7 @@ function BlockletComponent(_ref4) {
539
617
  });
540
618
  } catch (err) {
541
619
  setLoading(false);
542
- _toast.default.error((0, _util2.formatError)(err));
620
+ _Toast.default.error((0, _util2.formatError)(err));
543
621
  }
544
622
  };
545
623
  const onConfirmUpdate = async () => {
@@ -562,7 +640,7 @@ function BlockletComponent(_ref4) {
562
640
  setShowUpdateDot(null);
563
641
  } catch (error) {
564
642
  setLoading(false);
565
- _toast.default.error((0, _util2.formatError)(error));
643
+ _Toast.default.error((0, _util2.formatError)(error));
566
644
  }
567
645
  };
568
646
  const removeComponent = async (d, type) => {
@@ -577,10 +655,63 @@ function BlockletComponent(_ref4) {
577
655
  });
578
656
  await (0, _util2.sleep)(800);
579
657
  } catch (err) {
580
- _toast.default.error((0, _util2.formatError)(err));
658
+ _Toast.default.error((0, _util2.formatError)(err));
581
659
  removeDeletingDid(d.meta.did);
582
660
  }
583
661
  };
662
+ const startComponent = async d => {
663
+ try {
664
+ await api.startBlocklet({
665
+ input: {
666
+ did: blocklet.meta.did,
667
+ componentDids: [d.meta.did]
668
+ }
669
+ });
670
+ await (0, _util2.sleep)(800);
671
+ } catch (err) {
672
+ _Toast.default.error((0, _util2.formatError)(err));
673
+ }
674
+ };
675
+ const stopComponent = async d => {
676
+ try {
677
+ await api.stopBlocklet({
678
+ input: {
679
+ did: blocklet.meta.did,
680
+ componentDids: [d.meta.did]
681
+ }
682
+ });
683
+ await (0, _util2.sleep)(800);
684
+ } catch (err) {
685
+ _Toast.default.error((0, _util2.formatError)(err));
686
+ }
687
+ };
688
+ const restartComponent = async d => {
689
+ try {
690
+ await api.restartBlocklet({
691
+ input: {
692
+ did: blocklet.meta.did,
693
+ componentDids: [d.meta.did]
694
+ }
695
+ });
696
+ await (0, _util2.sleep)(800);
697
+ } catch (err) {
698
+ _Toast.default.error((0, _util2.formatError)(err));
699
+ }
700
+ };
701
+ const reloadComponent = async d => {
702
+ try {
703
+ await api.reloadBlocklet({
704
+ input: {
705
+ did: blocklet.meta.did,
706
+ componentDids: [d.meta.did]
707
+ }
708
+ });
709
+ await (0, _util2.sleep)(800);
710
+ _Toast.default.success(t('blocklet.reloadSuccess'));
711
+ } catch (err) {
712
+ _Toast.default.error((0, _util2.formatError)(err));
713
+ }
714
+ };
584
715
  const onUpdateChecksChange = (e, groupId) => {
585
716
  const {
586
717
  checked: newValue
@@ -697,6 +828,10 @@ function BlockletComponent(_ref4) {
697
828
  blocklet: blocklet,
698
829
  app: blocklet,
699
830
  onRemove: removeComponent,
831
+ onStart: startComponent,
832
+ onStop: stopComponent,
833
+ onReload: reloadComponent,
834
+ onRestart: restartComponent,
700
835
  getComponentUrl: getComponentUrl
701
836
  }, "0-".concat(blocklet.meta.did))
702
837
  }, "top-blocklet-".concat(blocklet.meta.did))] : /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
@@ -803,4 +938,4 @@ BlockletComponent.defaultProps = {
803
938
  onUpdate: () => {},
804
939
  getComponentUrl: () => window.location.origin
805
940
  };
806
- const Div = _styled.default.div(_templateObject2 || (_templateObject2 = _taggedTemplateLiteral(["\n .title {\n font-size: 1.2rem;\n font-weight: bold;\n margin-bottom: ", ";\n }\n\n @keyframes showDelay {\n 0% {\n opacity: 0;\n }\n\n 100% {\n opacity: 1;\n }\n }\n\n .component-item {\n animation: showDelay 0.75s ease 1;\n }\n"])), props => props.theme.spacing(1));
941
+ const Div = _styled.default.div(_templateObject3 || (_templateObject3 = _taggedTemplateLiteral(["\n .title {\n font-size: 1.2rem;\n font-weight: bold;\n margin-bottom: ", ";\n }\n\n @keyframes showDelay {\n 0% {\n opacity: 0;\n }\n\n 100% {\n opacity: 1;\n }\n }\n\n .component-item {\n animation: showDelay 0.75s ease 1;\n }\n"])), props => props.theme.spacing(1));