@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.
@@ -1,17 +1,15 @@
1
1
  /* eslint-disable react/no-unstable-nested-components */
2
2
  /* eslint-disable jsx-a11y/aria-role */
3
- import { useContext, useState, useEffect } from 'react';
3
+ import { useContext, useState, useEffect, useRef } from 'react';
4
4
  import styled from '@emotion/styled';
5
5
  import isEmpty from 'lodash/isEmpty';
6
6
  import PropTypes from 'prop-types';
7
7
  import classnames from 'classnames';
8
- import Dialog from '@arcblock/ux/lib/Dialog';
9
- import Tooltip from '@mui/material/Tooltip';
10
- import Box from '@mui/material/Box';
11
- import FormControlLabel from '@mui/material/FormControlLabel';
12
- import Checkbox from '@mui/material/Checkbox';
8
+ import { Badge, IconButton, Tooltip, Checkbox, Box, FormControlLabel } from '@mui/material';
9
+ import Dialog, { useConfirm } from '@arcblock/ux/lib/Dialog';
13
10
  import AddIcon from '@mui/icons-material/Add';
14
11
  import LoopIcon from '@mui/icons-material/Loop';
12
+ import ViewListIcon from '@mui/icons-material/ViewList';
15
13
  import Avatar from '@arcblock/did-connect/lib/Avatar';
16
14
  import { LocaleContext } from '@arcblock/ux/lib/Locale/context';
17
15
  import Button from '@arcblock/ux/lib/Button';
@@ -20,11 +18,12 @@ import ExternalIssuerIcon from '@arcblock/icons/lib/ExternalIssuerIcon';
20
18
  import { getTextColor } from '@abtnode/auth/lib/util/create-passport-svg';
21
19
  import Datatable, { getDurableData } from '@arcblock/ux/lib/Datatable';
22
20
  import RelativeTime from '@arcblock/ux/lib/RelativeTime';
21
+ import Toast from '@arcblock/ux/lib/Toast';
23
22
  import { USER_TYPE } from '@abtnode/constant';
24
23
  import { TeamEvents } from '@blocklet/constant';
25
24
  import useUrlState from '@ahooksjs/use-url-state';
26
- import { useMount } from 'ahooks';
27
- import Toast from '@arcblock/ux/lib/Toast';
25
+ import { useMemoizedFn, useMount } from 'ahooks';
26
+ import { UserSessions } from '@blocklet/ui-react';
28
27
  import Tag from '../../tag';
29
28
  import DidAddress from '../../did-address';
30
29
  import { useNodeContext } from '../../contexts/node';
@@ -116,6 +115,29 @@ export default function MemberList({
116
115
  type,
117
116
  createPassportSvg
118
117
  }) {
118
+ const {
119
+ confirmApi,
120
+ confirmHolder
121
+ } = useConfirm({
122
+ sx: {
123
+ '.MuiDialog-paper': {
124
+ borderRadius: 2,
125
+ maxWidth: 1000
126
+ },
127
+ '.ux-dialog_title': {
128
+ fontWeight: 600
129
+ },
130
+ '.ux-dialog_closeButton': {
131
+ p: 1
132
+ },
133
+ '.MuiDialogActions-root': {
134
+ display: {
135
+ xs: 'none',
136
+ md: 'flex'
137
+ }
138
+ }
139
+ }
140
+ });
119
141
  const {
120
142
  appIdList = []
121
143
  } = useBlockletContext();
@@ -188,7 +210,8 @@ export default function MemberList({
188
210
  });
189
211
  const getUsers = () => {
190
212
  const query = {
191
- includeTags: true
213
+ includeTags: true,
214
+ includeUserSessions: type === 'blocklet'
192
215
  };
193
216
  if (search.hideBlocked) {
194
217
  query.approved = true;
@@ -245,6 +268,21 @@ export default function MemberList({
245
268
  useSubscription(TeamEvents.userUpdated, handleUserChange, [search]);
246
269
  useSubscription(TeamEvents.userAdded, handleUserChange, [search]);
247
270
  const isInvitationEnabled = enablePassportIssuance;
271
+ const openUserSessions = useMemoizedFn(user => {
272
+ confirmApi.open({
273
+ title: 'User Sessions',
274
+ content: /*#__PURE__*/_jsx(UserSessions, {
275
+ user: user,
276
+ showAction: false,
277
+ showUser: false
278
+ }),
279
+ onConfirm() {
280
+ confirmApi.close();
281
+ },
282
+ confirmButtonText: t('common.close'),
283
+ showCancelButton: false
284
+ });
285
+ });
248
286
  const columns = [{
249
287
  label: t('common.name'),
250
288
  name: 'fullName',
@@ -310,6 +348,32 @@ export default function MemberList({
310
348
  return providerName;
311
349
  }
312
350
  }
351
+ }, type === 'blocklet' && {
352
+ label: t('team.member.activeUserSessions'),
353
+ name: 'userSessions',
354
+ options: {
355
+ customBodyRenderLite: rowIndex => {
356
+ const user = users[rowIndex];
357
+ return /*#__PURE__*/_jsx(IconButton, {
358
+ onClick: e => {
359
+ e.stopPropagation();
360
+ openUserSessions(user);
361
+ },
362
+ children: /*#__PURE__*/_jsx(Badge, {
363
+ badgeContent: user?.userSessions?.length,
364
+ color: user?.userSessions?.length > 0 ? 'primary' : 'default',
365
+ sx: user?.userSessions?.length > 0 ? {} : {
366
+ '.MuiBadge-badge': {
367
+ backgroundColor: 'grey',
368
+ color: 'white'
369
+ }
370
+ },
371
+ showZero: true,
372
+ children: /*#__PURE__*/_jsx(ViewListIcon, {})
373
+ })
374
+ });
375
+ }
376
+ }
313
377
  }, {
314
378
  label: t('common.actions'),
315
379
  name: '',
@@ -323,16 +387,20 @@ export default function MemberList({
323
387
  permission: inService ? '' : 'mutate_team',
324
388
  role: inService ? BlockletAdminRoles : [],
325
389
  children: /*#__PURE__*/_jsx(Actions, {
390
+ type: type,
326
391
  user: x,
327
392
  onIssuePassport: () => setMemberDialog({
328
393
  ...x,
329
394
  initTab: 'issuances'
395
+ }),
396
+ onRefresh: () => handleUserChange({
397
+ teamDid
330
398
  })
331
399
  })
332
400
  });
333
401
  }
334
402
  }
335
- }];
403
+ }].filter(Boolean);
336
404
  const customButtons = [];
337
405
  if (isInvitationEnabled) {
338
406
  customButtons.push( /*#__PURE__*/_jsxs(Button, {
@@ -440,17 +508,20 @@ export default function MemberList({
440
508
  }));
441
509
  }
442
510
  };
511
+ const datatableRef = useRef(null);
443
512
  const tableOptions = {
444
513
  sort: false,
445
514
  download: false,
446
515
  filter: false,
447
516
  print: false,
448
517
  expandableRowsOnClick: true,
449
- onRowClick(e, {
518
+ onRowClick(row, {
450
519
  dataIndex
451
- }) {
452
- const x = users[dataIndex];
453
- setMemberDialog(x);
520
+ }, e) {
521
+ if (datatableRef.current?.contains(e.target)) {
522
+ const x = users[dataIndex];
523
+ setMemberDialog(x);
524
+ }
454
525
  },
455
526
  page: search.page - 1,
456
527
  rowsPerPage: search.pageSize,
@@ -458,7 +529,7 @@ export default function MemberList({
458
529
  searchDebounceTime: 600
459
530
  };
460
531
  return /*#__PURE__*/_jsxs(Div, {
461
- children: [/*#__PURE__*/_jsxs(Box, {
532
+ children: [confirmHolder, /*#__PURE__*/_jsxs(Box, {
462
533
  className: "main",
463
534
  display: "flex",
464
535
  sx: {
@@ -483,6 +554,7 @@ export default function MemberList({
483
554
  }, x.name))
484
555
  })
485
556
  }), /*#__PURE__*/_jsx("div", {
557
+ ref: datatableRef,
486
558
  className: "right",
487
559
  children: /*#__PURE__*/_jsx(Datatable, {
488
560
  className: "main-table",
package/lib/actions.js CHANGED
@@ -66,7 +66,9 @@ function Actions(_ref) {
66
66
  keepMounted: true,
67
67
  open: open,
68
68
  onClose: onClose,
69
- PaperProps: {},
69
+ slotProps: {
70
+ paper: {}
71
+ },
70
72
  children: actions.map((action, index) => {
71
73
  if (typeof action === 'function') {
72
74
  return action({
@@ -342,13 +342,17 @@ function BlockletActions(_ref) {
342
342
  name: t('common.restart'),
343
343
  handler: createHandler('restart', node.api.restartBlocklet, true),
344
344
  disabled: disableStart || blocklet.status !== 'running'
345
- }, {
346
- action: 'reload',
347
- icon: _icons.default.Reload,
348
- name: t('common.reload'),
349
- handler: createHandler('reload', node.api.reloadBlocklet),
350
- disabled: disableStart || blocklet.status !== 'running'
351
- }, (0, _util2.isDownloading)(blocklet.status) ? cancelDownloadAction : removeAction, {
345
+ },
346
+ // hidden reload: https://github.com/ArcBlock/blocklet-server/issues/8655
347
+ // {
348
+ // action: 'reload',
349
+ // icon: Icons.Reload,
350
+ // name: t('common.reload'),
351
+ // handler: createHandler('reload', node.api.reloadBlocklet),
352
+ // disabled: disableStart || blocklet.status !== 'running',
353
+ // },
354
+
355
+ (0, _util2.isDownloading)(blocklet.status) ? cancelDownloadAction : removeAction, {
352
356
  separator: true
353
357
  }, {
354
358
  onlyInMenu: true,
package/lib/locales/ar.js CHANGED
@@ -693,7 +693,9 @@ var _default = exports.default = {
693
693
  installResourceHelp: 'وثيقة المساعدة',
694
694
  componentIncluded: 'مدرج',
695
695
  componentForceRequired: 'مجبر مطلوب'
696
- }
696
+ },
697
+ titleValidationError: 'يجب أن يكون طول العنوان على الأقل 3 أحرف',
698
+ descriptionValidationError: 'يجب أن تكون طول الوصف بين 3 و 160 حرفًا'
697
699
  },
698
700
  dashboard: {
699
701
  nodeDid: 'عقدة',
@@ -1195,7 +1197,10 @@ var _default = exports.default = {
1195
1197
  url: 'عنوان URL مخصص',
1196
1198
  slack: 'خطاف سلاك',
1197
1199
  tested: 'تم إرسال رسالة تجريبية'
1198
- }
1200
+ },
1201
+ activeUserSessions: 'جلسات المستخدم النشطة',
1202
+ forceLogout: 'تسجيل الخروج القسري',
1203
+ forceLogoutDescription: 'هل تؤكد تسجيل خروج هذا المستخدم؟'
1199
1204
  },
1200
1205
  transferNode: {
1201
1206
  name: 'تحويل الملكية',
package/lib/locales/de.js CHANGED
@@ -693,7 +693,9 @@ var _default = exports.default = {
693
693
  installResourceHelp: 'Hilfe-Dokument',
694
694
  componentIncluded: 'Eingeschlossen',
695
695
  componentForceRequired: 'Erzwungen Erforderlich'
696
- }
696
+ },
697
+ titleValidationError: 'Die Länge des Titels muss mindestens 3 Zeichen betragen',
698
+ descriptionValidationError: 'Die Beschreibungslänge muss zwischen 3 und 160 Zeichen liegen'
697
699
  },
698
700
  dashboard: {
699
701
  nodeDid: 'Knoten',
@@ -1195,7 +1197,10 @@ var _default = exports.default = {
1195
1197
  url: 'Benutzerdefinierte URL',
1196
1198
  slack: 'Slack-Webhook',
1197
1199
  tested: 'Testnachricht gesendet'
1198
- }
1200
+ },
1201
+ activeUserSessions: 'Aktive Benutzersitzungen',
1202
+ forceLogout: 'Erzwungenes Abmelden',
1203
+ forceLogoutDescription: 'Bestätigen Sie die erzwungene Abmeldung dieses Benutzers?'
1199
1204
  },
1200
1205
  transferNode: {
1201
1206
  name: 'Änderung des Eigentums',
package/lib/locales/en.js CHANGED
@@ -356,6 +356,8 @@ var _default = exports.default = {
356
356
  installFromMarket: 'Install New Blocklets',
357
357
  installFromUrl: 'Install From Url',
358
358
  installFromCreate: 'Create Blocklet',
359
+ titleValidationError: 'Title length must be between 3 and 40 characters',
360
+ descriptionValidationError: 'Description length must be between 3 and 160 characters',
359
361
  installFromDiskBackup: 'Restore from this server',
360
362
  installedAt: 'Installed At',
361
363
  internal: 'Internal',
@@ -1188,7 +1190,10 @@ var _default = exports.default = {
1188
1190
  url: 'Custom URL',
1189
1191
  slack: 'Slack Webhook',
1190
1192
  tested: 'Test message sent'
1191
- }
1193
+ },
1194
+ activeUserSessions: 'Active User Sessions',
1195
+ forceLogout: 'Force logout',
1196
+ forceLogoutDescription: 'Confirm to force logout this user?'
1192
1197
  },
1193
1198
  transferNode: {
1194
1199
  name: 'Transfer Ownership',
package/lib/locales/es.js CHANGED
@@ -693,7 +693,9 @@ var _default = exports.default = {
693
693
  installResourceHelp: 'Ayuda Documento',
694
694
  componentIncluded: 'Incluido',
695
695
  componentForceRequired: 'Obligatorio Requerido'
696
- }
696
+ },
697
+ titleValidationError: 'La longitud del título debe ser de al menos 3 caracteres',
698
+ descriptionValidationError: 'La longitud de la descripción debe estar entre 3 y 160 caracteres'
697
699
  },
698
700
  dashboard: {
699
701
  nodeDid: 'Nodo',
@@ -1195,7 +1197,10 @@ var _default = exports.default = {
1195
1197
  url: 'URL personalizada',
1196
1198
  slack: 'Slack Webhook',
1197
1199
  tested: 'Mensaje de prueba enviado'
1198
- }
1200
+ },
1201
+ activeUserSessions: 'Sesiones de usuario activas',
1202
+ forceLogout: 'Cerrar sesión forzada',
1203
+ forceLogoutDescription: '¿Confirmar para forzar el cierre de sesión de este usuario?'
1199
1204
  },
1200
1205
  transferNode: {
1201
1206
  name: 'Transferir propiedad',
package/lib/locales/fr.js CHANGED
@@ -693,7 +693,9 @@ var _default = exports.default = {
693
693
  installResourceHelp: "Document d'aide",
694
694
  componentIncluded: 'Inclus',
695
695
  componentForceRequired: 'Forcé Requis'
696
- }
696
+ },
697
+ titleValidationError: "La longueur du titre doit être d'au moins 3 caractères",
698
+ descriptionValidationError: 'La longueur de la description doit être comprise entre 3 et 160 caractères'
697
699
  },
698
700
  dashboard: {
699
701
  nodeDid: 'Noeud',
@@ -1195,7 +1197,10 @@ var _default = exports.default = {
1195
1197
  url: 'URL personnalisée',
1196
1198
  slack: 'Webhook Slack',
1197
1199
  tested: 'Message de test envoyé'
1198
- }
1200
+ },
1201
+ activeUserSessions: "Sessions d'utilisateurs actives",
1202
+ forceLogout: 'Déconnexion forcée',
1203
+ forceLogoutDescription: 'Confirmez-vous la déconnexion forcée de cet utilisateur?'
1199
1204
  },
1200
1205
  transferNode: {
1201
1206
  name: 'Transfert de propriété',
package/lib/locales/hi.js CHANGED
@@ -693,7 +693,9 @@ var _default = exports.default = {
693
693
  installResourceHelp: 'सहायता दस्तावेज़',
694
694
  componentIncluded: 'शामिल',
695
695
  componentForceRequired: 'मजबूरी आवश्यक'
696
- }
696
+ },
697
+ titleValidationError: 'शीर्षक की लंबाई कम से कम 3 अक्षर होनी चाहिए',
698
+ descriptionValidationError: 'विवरण की लंबाई 3 और 160 वर्णों के बीच होनी चाहिए'
697
699
  },
698
700
  dashboard: {
699
701
  nodeDid: 'नोड',
@@ -1195,7 +1197,10 @@ var _default = exports.default = {
1195
1197
  url: 'कस्टम URL',
1196
1198
  slack: 'स्लैक वेबहुक',
1197
1199
  tested: 'परीक्षण संदेश भेजा गया'
1198
- }
1200
+ },
1201
+ activeUserSessions: 'सक्रिय उपयोगकर्ता सत्र',
1202
+ forceLogout: 'बाहर करें बल',
1203
+ forceLogoutDescription: 'क्या आप इस उपयोगकर्ता को बाहर करने के लिए पुष्टि करें?'
1199
1204
  },
1200
1205
  transferNode: {
1201
1206
  name: 'स्वामित्व स्थानांतरण',
Binary file
package/lib/locales/id.js CHANGED
@@ -693,7 +693,9 @@ var _default = exports.default = {
693
693
  installResourceHelp: 'Dokumen Bantuan',
694
694
  componentIncluded: 'Termasuk',
695
695
  componentForceRequired: 'Dipaksa Diperlukan'
696
- }
696
+ },
697
+ titleValidationError: 'Panjang judul harus setidaknya 3 karakter',
698
+ descriptionValidationError: 'Panjang deskripsi harus antara 3 dan 160 karakter.'
697
699
  },
698
700
  dashboard: {
699
701
  nodeDid: 'Node',
@@ -1195,7 +1197,10 @@ var _default = exports.default = {
1195
1197
  url: 'URL kustom',
1196
1198
  slack: 'Slack Webhook',
1197
1199
  tested: 'Pesan uji terkirim'
1198
- }
1200
+ },
1201
+ activeUserSessions: 'Sesi Pengguna Aktif',
1202
+ forceLogout: 'Keluar paksa',
1203
+ forceLogoutDescription: 'Konfirmasi untuk logout paksa pengguna ini?'
1199
1204
  },
1200
1205
  transferNode: {
1201
1206
  name: 'Pindahkan Kepemilikan',
package/lib/locales/ja.js CHANGED
@@ -693,7 +693,9 @@ var _default = exports.default = {
693
693
  installResourceHelp: 'ヘルプドキュメント',
694
694
  componentIncluded: '含まれています',
695
695
  componentForceRequired: '強制必要'
696
- }
696
+ },
697
+ titleValidationError: 'タイトルの長さは最低3文字以上である必要があります',
698
+ descriptionValidationError: '説明の長さは3から160文字の間でなければなりません'
697
699
  },
698
700
  dashboard: {
699
701
  nodeDid: 'ノード',
@@ -1195,7 +1197,10 @@ var _default = exports.default = {
1195
1197
  url: 'カスタムURL',
1196
1198
  slack: 'Slack Webhook',
1197
1199
  tested: 'テストメッセージを送信しました'
1198
- }
1200
+ },
1201
+ activeUserSessions: 'アクティブユーザーセッション',
1202
+ forceLogout: '強制ログアウト',
1203
+ forceLogoutDescription: 'このユーザーを強制的にログアウトしますか?'
1199
1204
  },
1200
1205
  transferNode: {
1201
1206
  name: '権限の移譲',
package/lib/locales/ko.js CHANGED
@@ -693,7 +693,9 @@ var _default = exports.default = {
693
693
  installResourceHelp: '도움말 문서',
694
694
  componentIncluded: '포함됨',
695
695
  componentForceRequired: '강제 필수'
696
- }
696
+ },
697
+ titleValidationError: '제목 길이는 최소 3자 이상이어야 합니다',
698
+ descriptionValidationError: '설명 길이는 3에서 160자 사이여야 합니다'
697
699
  },
698
700
  dashboard: {
699
701
  nodeDid: '노드',
@@ -1195,7 +1197,10 @@ var _default = exports.default = {
1195
1197
  url: '사용자 정의 URL',
1196
1198
  slack: 'Slack Webhook',
1197
1199
  tested: '테스트 메시지가 전송되었습니다'
1198
- }
1200
+ },
1201
+ activeUserSessions: '활성 사용자 세션',
1202
+ forceLogout: '강제 로그아웃',
1203
+ forceLogoutDescription: '이 사용자를 강제로 로그아웃하시겠습니까?'
1199
1204
  },
1200
1205
  transferNode: {
1201
1206
  name: '소유권 이전',
package/lib/locales/pt.js CHANGED
@@ -693,7 +693,9 @@ var _default = exports.default = {
693
693
  installResourceHelp: 'Documento de ajuda',
694
694
  componentIncluded: 'Incluído',
695
695
  componentForceRequired: 'Forçado Obrigatório'
696
- }
696
+ },
697
+ titleValidationError: 'O comprimento do título deve ter pelo menos 3 caracteres',
698
+ descriptionValidationError: 'O comprimento da descrição deve estar entre 3 e 160 caracteres.'
697
699
  },
698
700
  dashboard: {
699
701
  nodeDid: 'Nó',
@@ -1195,7 +1197,10 @@ var _default = exports.default = {
1195
1197
  url: 'URL personalizado',
1196
1198
  slack: 'Slack Webhook',
1197
1199
  tested: 'Mensagem de teste enviada'
1198
- }
1200
+ },
1201
+ activeUserSessions: 'Sessões de Usuários Ativos',
1202
+ forceLogout: 'Logout forçado',
1203
+ forceLogoutDescription: 'Confirmar o logout forçado deste usuário?'
1199
1204
  },
1200
1205
  transferNode: {
1201
1206
  name: 'Transferir Propriedade',
package/lib/locales/ru.js CHANGED
@@ -693,7 +693,9 @@ var _default = exports.default = {
693
693
  installResourceHelp: 'Документация помощи',
694
694
  componentIncluded: 'Включено',
695
695
  componentForceRequired: 'Принудительно Требуется'
696
- }
696
+ },
697
+ titleValidationError: 'Длина заголовка должна быть не менее 3 символов',
698
+ descriptionValidationError: 'Длина описания должна быть от 3 до 160 символов'
697
699
  },
698
700
  dashboard: {
699
701
  nodeDid: 'Узел',
@@ -1195,7 +1197,10 @@ var _default = exports.default = {
1195
1197
  url: 'Пользовательский URL',
1196
1198
  slack: 'Слэк вебхук',
1197
1199
  tested: 'Тестовое сообщение отправлено'
1198
- }
1200
+ },
1201
+ activeUserSessions: 'Активные пользовательские сессии',
1202
+ forceLogout: 'Принудительный выход',
1203
+ forceLogoutDescription: 'Подтвердить выход из системы этого пользователя?'
1199
1204
  },
1200
1205
  transferNode: {
1201
1206
  name: 'Передача собственности',
package/lib/locales/th.js CHANGED
@@ -693,7 +693,9 @@ var _default = exports.default = {
693
693
  installResourceHelp: 'เอกสารช่วยเหลือ',
694
694
  componentIncluded: 'รวมอยู่ใน',
695
695
  componentForceRequired: 'บังคับต้องการ'
696
- }
696
+ },
697
+ titleValidationError: 'ความยาวของชื่อต้องมีอย่างน้อย 3 ตัวอักษร',
698
+ descriptionValidationError: 'ความยาวคำอธิบายต้องอยู่ระหว่าง 3 ถึง 160 ตัวอักษร.'
697
699
  },
698
700
  dashboard: {
699
701
  nodeDid: 'โหนด',
@@ -1195,7 +1197,10 @@ var _default = exports.default = {
1195
1197
  url: 'URL ที่กำหนดเอง',
1196
1198
  slack: 'Slack Webhook',
1197
1199
  tested: 'ส่งข้อความทดสอบแล้ว'
1198
- }
1200
+ },
1201
+ activeUserSessions: 'เซสชันผู้ใช้ที่ใช้งานอยู่',
1202
+ forceLogout: 'ออกจากระบบบังคับ',
1203
+ forceLogoutDescription: 'ยืนยันให้ออกจากระบบผู้ใช้นี้หรือไม่?'
1199
1204
  },
1200
1205
  transferNode: {
1201
1206
  name: 'โอนสิทธิ์การเป็นเจ้าของ',
package/lib/locales/vi.js CHANGED
@@ -693,7 +693,9 @@ var _default = exports.default = {
693
693
  installResourceHelp: 'Tài liệu giúp đỡ',
694
694
  componentIncluded: 'Bao gồm',
695
695
  componentForceRequired: 'Bắt Buộc Yêu Cầu'
696
- }
696
+ },
697
+ titleValidationError: 'Độ dài tiêu đề phải ít nhất 3 ký tự',
698
+ descriptionValidationError: 'Chiều dài mô tả phải từ 3 đến 160 ký tự.'
697
699
  },
698
700
  dashboard: {
699
701
  nodeDid: 'Nút',
@@ -1195,7 +1197,10 @@ var _default = exports.default = {
1195
1197
  url: 'URL tùy chỉnh',
1196
1198
  slack: 'Slack Webhook',
1197
1199
  tested: 'Tin nhắn kiểm tra đã được gửi'
1198
- }
1200
+ },
1201
+ activeUserSessions: 'Phiên người dùng hoạt động',
1202
+ forceLogout: 'Đăng xuất bắt buộc',
1203
+ forceLogoutDescription: 'Xác nhận đăng xuất buộc người dùng này?'
1199
1204
  },
1200
1205
  transferNode: {
1201
1206
  name: 'Chuyển quyền sở hữu',
@@ -693,7 +693,9 @@ var _default = exports.default = {
693
693
  installResourceHelp: '幫助文件',
694
694
  componentIncluded: '已包含',
695
695
  componentForceRequired: '強制要求'
696
- }
696
+ },
697
+ titleValidationError: '標題長度必須至少為3到40個字符',
698
+ descriptionValidationError: '描述長度必須介於3到160個字符之間'
697
699
  },
698
700
  dashboard: {
699
701
  nodeDid: '節點',
@@ -1195,7 +1197,10 @@ var _default = exports.default = {
1195
1197
  url: '客製網址',
1196
1198
  slack: 'Slack Webhook',
1197
1199
  tested: '測試訊息已發送'
1198
- }
1200
+ },
1201
+ activeUserSessions: '活躍用戶會話',
1202
+ forceLogout: '強制登出',
1203
+ forceLogoutDescription: '確認是否強制登出此使用者?'
1199
1204
  },
1200
1205
  transferNode: {
1201
1206
  name: '轉讓所有權',
package/lib/locales/zh.js CHANGED
@@ -696,7 +696,9 @@ var _default = exports.default = {
696
696
  noDescription: '请填写 Blocklet 描述',
697
697
  noNote: '请填写 发布说明'
698
698
  }
699
- }
699
+ },
700
+ titleValidationError: '标题长度必须至少为3到40个字符',
701
+ descriptionValidationError: '描述长度必须在3到160个字符之间'
700
702
  },
701
703
  dashboard: {
702
704
  nodeDid: '节点地址',
@@ -1199,7 +1201,10 @@ var _default = exports.default = {
1199
1201
  url: '自定义 URL',
1200
1202
  slack: 'Slack 通知',
1201
1203
  tested: '测试消息已经发送'
1202
- }
1204
+ },
1205
+ activeUserSessions: '活跃用户会话',
1206
+ forceLogout: '强制注销',
1207
+ forceLogoutDescription: '确认是否强制退出此用户?'
1203
1208
  },
1204
1209
  transferNode: {
1205
1210
  name: '转移所有者',