@abtnode/ux 1.16.25-beta-e3dbef52 → 1.16.25-beta-be3a37f4

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.
@@ -8,33 +8,66 @@ var _react = require("react");
8
8
  var _propTypes = _interopRequireDefault(require("prop-types"));
9
9
  var _MenuItem = _interopRequireDefault(require("@mui/material/MenuItem"));
10
10
  var _Add = _interopRequireDefault(require("@mui/icons-material/Add"));
11
+ var _Logout = _interopRequireDefault(require("@mui/icons-material/Logout"));
11
12
  var _ListItemIcon = _interopRequireDefault(require("@mui/material/ListItemIcon"));
12
13
  var _ListItemText = _interopRequireDefault(require("@mui/material/ListItemText"));
13
14
  var _context = require("@arcblock/ux/lib/Locale/context");
14
15
  var _ForbidLoginIcon = _interopRequireDefault(require("@arcblock/icons/lib/ForbidLoginIcon"));
15
16
  var _AllowLoginIcon = _interopRequireDefault(require("@arcblock/icons/lib/AllowLoginIcon"));
16
17
  var _didUtils = require("@blocklet/meta/lib/did-utils");
18
+ var _Dialog = require("@arcblock/ux/lib/Dialog");
19
+ var _ahooks = require("ahooks");
20
+ var _pAll = _interopRequireDefault(require("p-all"));
17
21
  var _team = require("../../contexts/team");
18
22
  var _actions = _interopRequireDefault(require("../../actions"));
19
23
  var _issuePassport = _interopRequireDefault(require("./issue-passport"));
20
24
  var _toggleUserApproval = _interopRequireDefault(require("./toggle-user-approval"));
25
+ var _node = require("../../contexts/node");
21
26
  var _jsxRuntime = require("react/jsx-runtime");
22
27
  function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
23
28
  function MemberActions(_ref) {
24
29
  let {
30
+ type,
25
31
  user,
26
- onIssuePassport
32
+ onIssuePassport,
33
+ onRefresh
27
34
  } = _ref;
28
35
  const {
29
36
  teamDid,
30
37
  roles
31
38
  } = (0, _team.useTeamContext)();
39
+ const {
40
+ confirmHolder,
41
+ confirmApi
42
+ } = (0, _Dialog.useConfirm)();
32
43
  const {
33
44
  t
34
45
  } = (0, _react.useContext)(_context.LocaleContext);
35
46
  const [enablePassportIssuance, setEnablePassportIssuance] = (0, _react.useState)(false);
47
+ const {
48
+ api
49
+ } = (0, _node.useNodeContext)();
50
+ const logoutUser = (0, _ahooks.useMemoizedFn)(async () => {
51
+ const {
52
+ userSessions = []
53
+ } = user;
54
+ const list = userSessions.map(x => {
55
+ return () => api.logoutUser({
56
+ input: {
57
+ teamDid,
58
+ appPid: teamDid,
59
+ userDid: user.did,
60
+ visitorId: x.visitorId
61
+ }
62
+ });
63
+ });
64
+ await (0, _pAll.default)(list, {
65
+ concurrency: 3,
66
+ stopOnError: false
67
+ });
68
+ });
36
69
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(_jsxRuntime.Fragment, {
37
- children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_actions.default, {
70
+ children: [confirmHolder, /*#__PURE__*/(0, _jsxRuntime.jsx)(_actions.default, {
38
71
  "data-cy": "member-actions",
39
72
  actions: [{
40
73
  icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Add.default, {
@@ -78,7 +111,27 @@ function MemberActions(_ref) {
78
111
  });
79
112
  }
80
113
  }, "toggle-approval");
81
- }]
114
+ }, type === 'blocklet' && {
115
+ icon: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Logout.default, {
116
+ fontSize: "small"
117
+ }),
118
+ text: t('team.member.forceLogout'),
119
+ onClick: e => {
120
+ e.stopPropagation();
121
+ confirmApi.open({
122
+ title: t('team.member.forceLogout'),
123
+ content: t('team.member.forceLogoutDescription'),
124
+ confirmButtonText: t('common.confirm'),
125
+ cancelButtonText: t('common.cancel'),
126
+ onClick: event => event.stopPropagation(),
127
+ onConfirm: async () => {
128
+ await logoutUser();
129
+ await confirmApi.close();
130
+ onRefresh();
131
+ }
132
+ });
133
+ }
134
+ }].filter(Boolean)
82
135
  }), enablePassportIssuance && /*#__PURE__*/(0, _jsxRuntime.jsx)(_issuePassport.default, {
83
136
  teamDid: teamDid,
84
137
  ownerDid: user.did,
@@ -93,9 +146,12 @@ function MemberActions(_ref) {
93
146
  });
94
147
  }
95
148
  MemberActions.propTypes = {
149
+ type: _propTypes.default.oneOf(['server', 'blocklet']).isRequired,
96
150
  user: _propTypes.default.object.isRequired,
97
- onIssuePassport: _propTypes.default.func
151
+ onIssuePassport: _propTypes.default.func,
152
+ onRefresh: _propTypes.default.func
98
153
  };
99
154
  MemberActions.defaultProps = {
100
- onIssuePassport: () => {}
155
+ onIssuePassport: () => {},
156
+ onRefresh: () => {}
101
157
  };
@@ -9,13 +9,11 @@ var _styled = _interopRequireDefault(require("@emotion/styled"));
9
9
  var _isEmpty = _interopRequireDefault(require("lodash/isEmpty"));
10
10
  var _propTypes = _interopRequireDefault(require("prop-types"));
11
11
  var _classnames = _interopRequireDefault(require("classnames"));
12
- var _Dialog = _interopRequireDefault(require("@arcblock/ux/lib/Dialog"));
13
- var _Tooltip = _interopRequireDefault(require("@mui/material/Tooltip"));
14
- var _Box = _interopRequireDefault(require("@mui/material/Box"));
15
- var _FormControlLabel = _interopRequireDefault(require("@mui/material/FormControlLabel"));
16
- var _Checkbox = _interopRequireDefault(require("@mui/material/Checkbox"));
12
+ var _material = require("@mui/material");
13
+ var _Dialog = _interopRequireWildcard(require("@arcblock/ux/lib/Dialog"));
17
14
  var _Add = _interopRequireDefault(require("@mui/icons-material/Add"));
18
15
  var _Loop = _interopRequireDefault(require("@mui/icons-material/Loop"));
16
+ var _ViewList = _interopRequireDefault(require("@mui/icons-material/ViewList"));
19
17
  var _Avatar = _interopRequireDefault(require("@arcblock/did-connect/lib/Avatar"));
20
18
  var _context = require("@arcblock/ux/lib/Locale/context");
21
19
  var _Button = _interopRequireDefault(require("@arcblock/ux/lib/Button"));
@@ -24,11 +22,12 @@ var _ExternalIssuerIcon = _interopRequireDefault(require("@arcblock/icons/lib/Ex
24
22
  var _createPassportSvg = require("@abtnode/auth/lib/util/create-passport-svg");
25
23
  var _Datatable = _interopRequireWildcard(require("@arcblock/ux/lib/Datatable"));
26
24
  var _RelativeTime = _interopRequireDefault(require("@arcblock/ux/lib/RelativeTime"));
25
+ var _Toast = _interopRequireDefault(require("@arcblock/ux/lib/Toast"));
27
26
  var _constant = require("@abtnode/constant");
28
27
  var _constant2 = require("@blocklet/constant");
29
28
  var _useUrlState = _interopRequireDefault(require("@ahooksjs/use-url-state"));
30
29
  var _ahooks = require("ahooks");
31
- var _Toast = _interopRequireDefault(require("@arcblock/ux/lib/Toast"));
30
+ var _uiReact = require("@blocklet/ui-react");
32
31
  var _tag = _interopRequireDefault(require("../../tag"));
33
32
  var _didAddress = _interopRequireDefault(require("../../did-address"));
34
33
  var _node = require("../../contexts/node");
@@ -91,9 +90,9 @@ function SimpleInfo(_ref) {
91
90
  }
92
91
  }), !user.approved && /*#__PURE__*/(0, _jsxRuntime.jsx)("did", {
93
92
  className: "badge-block"
94
- }), user.isFromExternal && /*#__PURE__*/(0, _jsxRuntime.jsx)(_Tooltip.default, {
93
+ }), user.isFromExternal && /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
95
94
  title: t('team.passport.externalPassport'),
96
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
95
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Box, {
97
96
  ml: 1,
98
97
  className: "icon",
99
98
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ExternalIssuerIcon.default, {})
@@ -117,10 +116,10 @@ function SimpleInfo(_ref) {
117
116
  })]
118
117
  })]
119
118
  });
120
- return user.approved ? main : /*#__PURE__*/(0, _jsxRuntime.jsx)(_Box.default, {
119
+ return user.approved ? main : /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Box, {
121
120
  display: "flex",
122
121
  alignItems: "center",
123
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Tooltip.default, {
122
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Tooltip, {
124
123
  title: t('team.member.forbidLoginDescription'),
125
124
  children: main
126
125
  })
@@ -134,6 +133,29 @@ function MemberList(_ref2) {
134
133
  type,
135
134
  createPassportSvg
136
135
  } = _ref2;
136
+ const {
137
+ confirmApi,
138
+ confirmHolder
139
+ } = (0, _Dialog.useConfirm)({
140
+ sx: {
141
+ '.MuiDialog-paper': {
142
+ borderRadius: 2,
143
+ maxWidth: 1000
144
+ },
145
+ '.ux-dialog_title': {
146
+ fontWeight: 600
147
+ },
148
+ '.ux-dialog_closeButton': {
149
+ p: 1
150
+ },
151
+ '.MuiDialogActions-root': {
152
+ display: {
153
+ xs: 'none',
154
+ md: 'flex'
155
+ }
156
+ }
157
+ }
158
+ });
137
159
  const {
138
160
  appIdList = []
139
161
  } = (0, _blocklet.useBlockletContext)();
@@ -206,7 +228,8 @@ function MemberList(_ref2) {
206
228
  });
207
229
  const getUsers = () => {
208
230
  const query = {
209
- includeTags: true
231
+ includeTags: true,
232
+ includeUserSessions: type === 'blocklet'
210
233
  };
211
234
  if (search.hideBlocked) {
212
235
  query.approved = true;
@@ -263,6 +286,21 @@ function MemberList(_ref2) {
263
286
  useSubscription(_constant2.TeamEvents.userUpdated, handleUserChange, [search]);
264
287
  useSubscription(_constant2.TeamEvents.userAdded, handleUserChange, [search]);
265
288
  const isInvitationEnabled = enablePassportIssuance;
289
+ const openUserSessions = (0, _ahooks.useMemoizedFn)(user => {
290
+ confirmApi.open({
291
+ title: 'User Sessions',
292
+ content: /*#__PURE__*/(0, _jsxRuntime.jsx)(_uiReact.UserSessions, {
293
+ user: user,
294
+ showAction: false,
295
+ showUser: false
296
+ }),
297
+ onConfirm() {
298
+ confirmApi.close();
299
+ },
300
+ confirmButtonText: t('common.close'),
301
+ showCancelButton: false
302
+ });
303
+ });
266
304
  const columns = [{
267
305
  label: t('common.name'),
268
306
  name: 'fullName',
@@ -328,6 +366,33 @@ function MemberList(_ref2) {
328
366
  return providerName;
329
367
  }
330
368
  }
369
+ }, type === 'blocklet' && {
370
+ label: t('team.member.activeUserSessions'),
371
+ name: 'userSessions',
372
+ options: {
373
+ customBodyRenderLite: rowIndex => {
374
+ var _user$userSessions, _user$userSessions2, _user$userSessions3;
375
+ const user = users[rowIndex];
376
+ return /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.IconButton, {
377
+ onClick: e => {
378
+ e.stopPropagation();
379
+ openUserSessions(user);
380
+ },
381
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Badge, {
382
+ badgeContent: user === null || user === void 0 ? void 0 : (_user$userSessions = user.userSessions) === null || _user$userSessions === void 0 ? void 0 : _user$userSessions.length,
383
+ color: (user === null || user === void 0 ? void 0 : (_user$userSessions2 = user.userSessions) === null || _user$userSessions2 === void 0 ? void 0 : _user$userSessions2.length) > 0 ? 'primary' : 'default',
384
+ sx: (user === null || user === void 0 ? void 0 : (_user$userSessions3 = user.userSessions) === null || _user$userSessions3 === void 0 ? void 0 : _user$userSessions3.length) > 0 ? {} : {
385
+ '.MuiBadge-badge': {
386
+ backgroundColor: 'grey',
387
+ color: 'white'
388
+ }
389
+ },
390
+ showZero: true,
391
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_ViewList.default, {})
392
+ })
393
+ });
394
+ }
395
+ }
331
396
  }, {
332
397
  label: t('common.actions'),
333
398
  name: '',
@@ -341,15 +406,19 @@ function MemberList(_ref2) {
341
406
  permission: inService ? '' : 'mutate_team',
342
407
  role: inService ? _util.BlockletAdminRoles : [],
343
408
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_actions.default, {
409
+ type: type,
344
410
  user: x,
345
411
  onIssuePassport: () => setMemberDialog(_objectSpread(_objectSpread({}, x), {}, {
346
412
  initTab: 'issuances'
347
- }))
413
+ })),
414
+ onRefresh: () => handleUserChange({
415
+ teamDid
416
+ })
348
417
  })
349
418
  });
350
419
  }
351
420
  }
352
- }];
421
+ }].filter(Boolean);
353
422
  const customButtons = [];
354
423
  if (isInvitationEnabled) {
355
424
  customButtons.push( /*#__PURE__*/(0, _jsxRuntime.jsxs)(_Button.default, {
@@ -453,18 +522,22 @@ function MemberList(_ref2) {
453
522
  }));
454
523
  }
455
524
  };
525
+ const datatableRef = (0, _react.useRef)(null);
456
526
  const tableOptions = {
457
527
  sort: false,
458
528
  download: false,
459
529
  filter: false,
460
530
  print: false,
461
531
  expandableRowsOnClick: true,
462
- onRowClick(e, _ref4) {
532
+ onRowClick(row, _ref4, e) {
533
+ var _datatableRef$current;
463
534
  let {
464
535
  dataIndex
465
536
  } = _ref4;
466
- const x = users[dataIndex];
467
- setMemberDialog(x);
537
+ if ((_datatableRef$current = datatableRef.current) !== null && _datatableRef$current !== void 0 && _datatableRef$current.contains(e.target)) {
538
+ const x = users[dataIndex];
539
+ setMemberDialog(x);
540
+ }
468
541
  },
469
542
  page: search.page - 1,
470
543
  rowsPerPage: search.pageSize,
@@ -472,7 +545,7 @@ function MemberList(_ref2) {
472
545
  searchDebounceTime: 600
473
546
  };
474
547
  return /*#__PURE__*/(0, _jsxRuntime.jsxs)(Div, {
475
- children: [/*#__PURE__*/(0, _jsxRuntime.jsxs)(_Box.default, {
548
+ children: [confirmHolder, /*#__PURE__*/(0, _jsxRuntime.jsxs)(_material.Box, {
476
549
  className: "main",
477
550
  display: "flex",
478
551
  sx: {
@@ -497,6 +570,7 @@ function MemberList(_ref2) {
497
570
  }, x.name))
498
571
  })
499
572
  }), /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
573
+ ref: datatableRef,
500
574
  className: "right",
501
575
  children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Datatable.default, {
502
576
  className: "main-table",
@@ -506,8 +580,8 @@ function MemberList(_ref2) {
506
580
  durableKeys: ['page', 'rowsPerPage'],
507
581
  title: /*#__PURE__*/(0, _jsxRuntime.jsx)("div", {
508
582
  className: "table-toolbar-left",
509
- children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_FormControlLabel.default, {
510
- control: /*#__PURE__*/(0, _jsxRuntime.jsx)(_Checkbox.default, {
583
+ children: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.FormControlLabel, {
584
+ control: /*#__PURE__*/(0, _jsxRuntime.jsx)(_material.Checkbox, {
511
585
  sx: {
512
586
  display: 'flex !important'
513
587
  },
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@abtnode/ux",
3
- "version": "1.16.25-beta-e3dbef52",
3
+ "version": "1.16.25-beta-be3a37f4",
4
4
  "description": "UX components shared across abtnode packages",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -28,23 +28,23 @@
28
28
  "author": "linchen <linchen1987@foxmail.com> (http://github.com/linchen1987)",
29
29
  "license": "Apache-2.0",
30
30
  "dependencies": {
31
- "@abtnode/auth": "1.16.25-beta-e3dbef52",
32
- "@abtnode/constant": "1.16.25-beta-e3dbef52",
33
- "@abtnode/util": "1.16.25-beta-e3dbef52",
31
+ "@abtnode/auth": "1.16.25-beta-be3a37f4",
32
+ "@abtnode/constant": "1.16.25-beta-be3a37f4",
33
+ "@abtnode/util": "1.16.25-beta-be3a37f4",
34
34
  "@ahooksjs/use-url-state": "^3.5.1",
35
35
  "@arcblock/did": "^1.18.113",
36
- "@arcblock/did-connect": "^2.9.51",
36
+ "@arcblock/did-connect": "^2.9.54",
37
37
  "@arcblock/did-motif": "^1.1.13",
38
- "@arcblock/icons": "^2.9.51",
39
- "@arcblock/nft-display": "2.9.51",
40
- "@arcblock/react-hooks": "^2.9.51",
41
- "@arcblock/terminal": "^2.9.51",
42
- "@arcblock/ux": "^2.9.51",
43
- "@blocklet/constant": "1.16.25-beta-e3dbef52",
38
+ "@arcblock/icons": "^2.9.54",
39
+ "@arcblock/nft-display": "2.9.54",
40
+ "@arcblock/react-hooks": "^2.9.54",
41
+ "@arcblock/terminal": "^2.9.54",
42
+ "@arcblock/ux": "^2.9.54",
43
+ "@blocklet/constant": "1.16.25-beta-be3a37f4",
44
44
  "@blocklet/launcher-layout": "2.2.54",
45
45
  "@blocklet/list": "^0.12.76",
46
- "@blocklet/meta": "1.16.25-beta-e3dbef52",
47
- "@blocklet/ui-react": "^2.9.51",
46
+ "@blocklet/meta": "1.16.25-beta-be3a37f4",
47
+ "@blocklet/ui-react": "^2.9.54",
48
48
  "@blocklet/uploader": "^0.0.74",
49
49
  "@emotion/react": "^11.10.4",
50
50
  "@emotion/styled": "^11.10.4",
@@ -74,6 +74,7 @@
74
74
  "ms": "^2.1.3",
75
75
  "mui-daterange-picker": "^1.0.5",
76
76
  "notistack": "^2.0.8",
77
+ "p-all": "^5.0.0",
77
78
  "p-wait-for": "^4.1.0",
78
79
  "pretty-ms-i18n": "^1.0.3",
79
80
  "prop-types": "^15.8.1",
@@ -106,7 +107,7 @@
106
107
  "jest": "^29.7.0",
107
108
  "jest-environment-jsdom": "^29.7.0"
108
109
  },
109
- "gitHead": "a740380dd98d1677f7da1233d753f28ea50f77ce",
110
+ "gitHead": "cd99ea556cdd402ecc12e017d79f13e8e8bb83c7",
110
111
  "exports": {
111
112
  ".": {
112
113
  "import": "./es/index.js",