@abtnode/ux 1.16.27-beta-43a3bbb2 → 1.16.27-beta-c450492a

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 (97) hide show
  1. package/es/blocklet/component/component-cell.js +0 -13
  2. package/es/blocklet/component/index.js +0 -16
  3. package/es/blocklet/configuration.js +28 -9
  4. package/es/blocklet/publish/resource.js +22 -4
  5. package/es/locales/ar.js +7 -1
  6. package/es/locales/de.js +7 -1
  7. package/es/locales/en.js +7 -1
  8. package/es/locales/es.js +7 -1
  9. package/es/locales/fr.js +7 -1
  10. package/es/locales/hi.js +7 -1
  11. package/es/locales/i18n.db +0 -0
  12. package/es/locales/id.js +7 -1
  13. package/es/locales/ja.js +7 -1
  14. package/es/locales/ko.js +7 -1
  15. package/es/locales/pt.js +7 -1
  16. package/es/locales/ru.js +7 -1
  17. package/es/locales/th.js +7 -1
  18. package/es/locales/vi.js +7 -1
  19. package/es/locales/zh-tw.js +7 -1
  20. package/es/locales/zh.js +8 -2
  21. package/es/subscription/server.js +16 -2
  22. package/lib/actions.js +1 -1
  23. package/lib/blocklet/actions.js +1 -1
  24. package/lib/blocklet/add-cert.js +1 -1
  25. package/lib/blocklet/app-avatar.js +1 -1
  26. package/lib/blocklet/bundle-avatar.js +1 -1
  27. package/lib/blocklet/component/add-component-core.js +1 -1
  28. package/lib/blocklet/component/component-cell.js +0 -13
  29. package/lib/blocklet/component/did-space/connect-to.js +1 -1
  30. package/lib/blocklet/component/did-space/item.js +1 -1
  31. package/lib/blocklet/component/domain-list.js +1 -1
  32. package/lib/blocklet/component/index.js +1 -17
  33. package/lib/blocklet/component/navigation/simple-select.js +1 -1
  34. package/lib/blocklet/component/setting.js +1 -1
  35. package/lib/blocklet/component/space-connector.js +1 -1
  36. package/lib/blocklet/component/space-selector.js +1 -1
  37. package/lib/blocklet/component/store-blocklet-list.js +1 -1
  38. package/lib/blocklet/component/switch-control.js +1 -1
  39. package/lib/blocklet/configuration.js +28 -9
  40. package/lib/blocklet/disk-info.js +1 -1
  41. package/lib/blocklet/log.js +1 -1
  42. package/lib/blocklet/mode.js +1 -1
  43. package/lib/blocklet/page-group.js +1 -1
  44. package/lib/blocklet/preferences/index.js +1 -1
  45. package/lib/blocklet/publish/resource.js +22 -4
  46. package/lib/blocklet/purchase/component-purchase.js +1 -1
  47. package/lib/blocklet/resource-type.js +1 -1
  48. package/lib/blocklet/router/add-domain.js +1 -1
  49. package/lib/blocklet/router/dns-tip.js +1 -1
  50. package/lib/blocklet/runtime-info.js +1 -1
  51. package/lib/blocklet/status.js +1 -1
  52. package/lib/blocklet/storage/action.js +1 -1
  53. package/lib/blocklet/storage/auto-check-update.js +1 -1
  54. package/lib/blocklet/storage/item.js +1 -1
  55. package/lib/blocklet/version.js +1 -1
  56. package/lib/clear-cache.js +1 -1
  57. package/lib/click-to-copy.js +1 -1
  58. package/lib/confirm.js +1 -1
  59. package/lib/did-address.js +1 -1
  60. package/lib/empty-spinner.js +1 -1
  61. package/lib/form/form-autocomplete-input.js +1 -1
  62. package/lib/form/form-select-input.js +1 -1
  63. package/lib/form/form-text-input.js +1 -1
  64. package/lib/images.js +1 -1
  65. package/lib/invitation/invitation-app.js +1 -1
  66. package/lib/launch-blocklet/content-layout.js +1 -1
  67. package/lib/locales/ar.js +7 -1
  68. package/lib/locales/de.js +7 -1
  69. package/lib/locales/en.js +7 -1
  70. package/lib/locales/es.js +7 -1
  71. package/lib/locales/fr.js +7 -1
  72. package/lib/locales/hi.js +7 -1
  73. package/lib/locales/i18n.db +0 -0
  74. package/lib/locales/id.js +7 -1
  75. package/lib/locales/ja.js +7 -1
  76. package/lib/locales/ko.js +7 -1
  77. package/lib/locales/pt.js +7 -1
  78. package/lib/locales/ru.js +7 -1
  79. package/lib/locales/th.js +7 -1
  80. package/lib/locales/vi.js +7 -1
  81. package/lib/locales/zh-tw.js +7 -1
  82. package/lib/locales/zh.js +8 -2
  83. package/lib/logs/log-terminal.js +1 -1
  84. package/lib/nav-logo.js +1 -1
  85. package/lib/notifications/tag.js +1 -1
  86. package/lib/passport-tag.js +1 -1
  87. package/lib/relative-time.js +1 -1
  88. package/lib/schema-form/passport-input.js +1 -1
  89. package/lib/schema-form/text-input.js +1 -1
  90. package/lib/store/item.js +1 -1
  91. package/lib/subscription/blocklet.js +1 -1
  92. package/lib/subscription/server.js +17 -4
  93. package/lib/tag.js +1 -1
  94. package/lib/team/members/member.js +1 -1
  95. package/lib/team/members/passport-item.js +1 -1
  96. package/lib/team/search-input.js +1 -1
  97. package/package.json +19 -19
@@ -6,7 +6,6 @@ import Badge from '@mui/material/Badge';
6
6
  import InfoOutlinedIcon from '@mui/icons-material/InfoOutlined';
7
7
  import LaunchIcon from '@mui/icons-material/Launch';
8
8
  import RestartIcon from '@mui/icons-material/Replay';
9
- import ReloadIcon from '@mui/icons-material/Autorenew';
10
9
  import IconButton from '@mui/material/IconButton';
11
10
  import DeleteIcon from '@mui/icons-material/Delete';
12
11
  import { Icon } from '@iconify/react';
@@ -52,7 +51,6 @@ export default function ComponentCell({
52
51
  onStart,
53
52
  onStop,
54
53
  onRestart,
55
- onReload,
56
54
  getComponentUrl,
57
55
  app
58
56
  }) {
@@ -258,15 +256,6 @@ export default function ComponentCell({
258
256
  onCancel: () => setConfirmSetting(null)
259
257
  });
260
258
  },
261
- disabled: appInProgress || componentInProgress || blocklet.status !== 'running'
262
- }, !isResource(blocklet) && {
263
- icon: /*#__PURE__*/_jsx(ReloadIcon, {}),
264
- text: t('common.reload'),
265
- onClick: async () => {
266
- setLoading(true);
267
- await onReload(blocklet);
268
- setLoading(false);
269
- },
270
259
  disabled: loading || appInProgress || componentInProgress || blocklet.status !== 'running'
271
260
  }, {
272
261
  icon: /*#__PURE__*/_jsx(DeleteIcon, {}),
@@ -311,7 +300,6 @@ ComponentCell.propTypes = {
311
300
  onStart: PropTypes.func,
312
301
  onStop: PropTypes.func,
313
302
  onRestart: PropTypes.func,
314
- onReload: PropTypes.func,
315
303
  getComponentUrl: PropTypes.func,
316
304
  app: PropTypes.object
317
305
  };
@@ -322,7 +310,6 @@ ComponentCell.defaultProps = {
322
310
  onStart: () => {},
323
311
  onStop: () => {},
324
312
  onRestart: () => {},
325
- onReload: () => {},
326
313
  getComponentUrl: () => window.location.origin,
327
314
  app: null
328
315
  };
@@ -210,20 +210,6 @@ export default function BlockletComponent({
210
210
  Toast.error(formatError(err));
211
211
  }
212
212
  };
213
- const reloadComponent = async d => {
214
- try {
215
- await api.reloadBlocklet({
216
- input: {
217
- did: blocklet.meta.did,
218
- componentDids: [d.meta.did]
219
- }
220
- });
221
- await sleep(800);
222
- Toast.success(t('blocklet.reloadSuccess'));
223
- } catch (err) {
224
- Toast.error(formatError(err));
225
- }
226
- };
227
213
  const onUpdateChecksChange = (e, groupId) => {
228
214
  const {
229
215
  checked: newValue
@@ -363,7 +349,6 @@ export default function BlockletComponent({
363
349
  onRemove: removeComponent,
364
350
  onStart: startComponent,
365
351
  onStop: stopComponent,
366
- onReload: reloadComponent,
367
352
  onRestart: restartComponent,
368
353
  getComponentUrl: getComponentUrl
369
354
  }, `0-${blocklet.meta.did}`), blocklet.children.map(component => {
@@ -375,7 +360,6 @@ export default function BlockletComponent({
375
360
  onRemove: removeComponent,
376
361
  onStart: startComponent,
377
362
  onStop: stopComponent,
378
- onReload: reloadComponent,
379
363
  onRestart: restartComponent,
380
364
  getComponentUrl: getComponentUrl
381
365
  }, `1-${component.meta.did}`);
@@ -10,7 +10,7 @@ import { LocaleContext } from '@arcblock/ux/lib/Locale/context';
10
10
  import Button from '@arcblock/ux/lib/Button';
11
11
  import LoopIcon from '@mui/icons-material/Loop';
12
12
  import { EVENTS } from '@abtnode/constant';
13
- import { BLOCKLET_CONFIGURABLE_KEY, SUPPORTED_LANGUAGES } from '@blocklet/constant';
13
+ import { BLOCKLET_CONFIGURABLE_KEY, BLOCKLET_TENANT_MODES, SUPPORTED_LANGUAGES } from '@blocklet/constant';
14
14
  import { getWhoCanAccess } from '@blocklet/meta/lib/util';
15
15
  import Toast from '@arcblock/ux/lib/Toast';
16
16
  import FormTextInput from '../form/form-text-input';
@@ -83,6 +83,8 @@ function BlockletEnvironment({
83
83
  const deletable = !customDelete || customDelete.value === 'yes';
84
84
  const customLanguages = blocklet.environments.find(x => x.key === BLOCKLET_CONFIGURABLE_KEY.BLOCKLET_APP_LANGUAGES);
85
85
  const customUrl = blocklet.environments.find(x => x.key === BLOCKLET_CONFIGURABLE_KEY.BLOCKLET_APP_URL);
86
+ const customTenantMode = blocklet.environments.find(x => x.key === BLOCKLET_CONFIGURABLE_KEY.BLOCKLET_APP_TENANT_MODE);
87
+ const tenantMode = customTenantMode?.value || BLOCKLET_TENANT_MODES.SINGLE;
86
88
  const copyrightOwner = blocklet.environments.find(x => x.key === BLOCKLET_CONFIGURABLE_KEY.BLOCKLET_APP_COPYRIGHT_OWNER);
87
89
  const copyrightYear = blocklet.environments.find(x => x.key === BLOCKLET_CONFIGURABLE_KEY.BLOCKLET_APP_COPYRIGHT_YEAR);
88
90
  const configurableEnvs = [{
@@ -172,7 +174,7 @@ function BlockletEnvironment({
172
174
  setLoading(false);
173
175
  }
174
176
  };
175
- const onDeletableChange = async e => {
177
+ const createBooleanConfigHandler = (key, value) => async e => {
176
178
  if (loading) {
177
179
  return;
178
180
  }
@@ -187,8 +189,8 @@ function BlockletEnvironment({
187
189
  input: {
188
190
  did: blocklet.meta.did,
189
191
  configs: [{
190
- key: BLOCKLET_CONFIGURABLE_KEY.BLOCKLET_DELETABLE,
191
- value: checked ? 'no' : 'yes'
192
+ key: BLOCKLET_CONFIGURABLE_KEY[key],
193
+ value: value(checked)
192
194
  }]
193
195
  }
194
196
  });
@@ -199,6 +201,8 @@ function BlockletEnvironment({
199
201
  setLoading(false);
200
202
  }
201
203
  };
204
+ const onDeletableChange = createBooleanConfigHandler('BLOCKLET_DELETABLE', checked => checked ? 'no' : 'yes');
205
+ const onTenantModeChange = createBooleanConfigHandler('BLOCKLET_APP_TENANT_MODE', checked => checked ? BLOCKLET_TENANT_MODES.MULTIPLE : BLOCKLET_TENANT_MODES.SINGLE);
202
206
  const onUpdateCors = async value => {
203
207
  const oldValue = site.corsAllowedOrigins || [];
204
208
  const newValue = value.split(',').map(x => x.trim()).filter(Boolean);
@@ -261,7 +265,7 @@ function BlockletEnvironment({
261
265
  style: {
262
266
  marginTop: 0
263
267
  },
264
- disabled: loading || disabled,
268
+ disabled: disabled,
265
269
  loading: loading,
266
270
  initialValue: item.value,
267
271
  onSubmit: value => onSubmitConfig(item.key, value)
@@ -356,7 +360,7 @@ function BlockletEnvironment({
356
360
  style: {
357
361
  marginTop: 0
358
362
  },
359
- disabled: loading || disabled,
363
+ disabled: disabled,
360
364
  loading: loading,
361
365
  options: languages,
362
366
  noEmpty: true,
@@ -402,7 +406,7 @@ function BlockletEnvironment({
402
406
  style: {
403
407
  marginTop: 0
404
408
  },
405
- disabled: loading || disabled,
409
+ disabled: disabled,
406
410
  loading: loading,
407
411
  initialValue: (site.corsAllowedOrigins || []).join(', '),
408
412
  onSubmit: onUpdateCors
@@ -425,7 +429,6 @@ function BlockletEnvironment({
425
429
  },
426
430
  children: [/*#__PURE__*/_jsx(Box, {
427
431
  className: "config-form",
428
- mt: 2,
429
432
  children: !inService && /*#__PURE__*/_jsxs(Box, {
430
433
  className: "config-item",
431
434
  children: [/*#__PURE__*/_jsxs(Box, {
@@ -450,7 +453,7 @@ function BlockletEnvironment({
450
453
  mb: 0,
451
454
  children: t('blocklet.config.sk')
452
455
  }), /*#__PURE__*/_jsx(AppSk, {
453
- disabled: loading || disabled,
456
+ disabled: disabled,
454
457
  loading: loading,
455
458
  initialValue: blocklet.environments.find(x => x.key === 'BLOCKLET_APP_SK').value,
456
459
  onChange: onAppSkChange
@@ -506,6 +509,22 @@ function BlockletEnvironment({
506
509
  teamDid: did
507
510
  })]
508
511
  })
512
+ }), /*#__PURE__*/_jsx(Box, {
513
+ className: "config-form",
514
+ children: /*#__PURE__*/_jsxs(Box, {
515
+ className: "config-item",
516
+ children: [/*#__PURE__*/_jsxs(Box, {
517
+ className: "config-label",
518
+ children: [t('blocklet.config.tenantMode.name'), /*#__PURE__*/_jsx(Box, {
519
+ className: "config-desc",
520
+ children: t(`blocklet.config.tenantMode.${tenantMode}`)
521
+ })]
522
+ }), /*#__PURE__*/_jsx(Switch, {
523
+ disabled: disabled,
524
+ checked: tenantMode === BLOCKLET_TENANT_MODES.MULTIPLE,
525
+ onChange: onTenantModeChange
526
+ })]
527
+ })
509
528
  })]
510
529
  })]
511
530
  });
@@ -4,6 +4,7 @@ import styled from '@emotion/styled';
4
4
  import joinUrl from 'url-join';
5
5
  import classnames from 'classnames';
6
6
  import Box from '@mui/material/Box';
7
+ import StopIcon from '@mui/icons-material/DoDisturbAlt';
7
8
  import { useLocaleContext } from '@arcblock/ux/lib/Locale/context';
8
9
  import Button from '@arcblock/ux/lib/Button';
9
10
  import Toast from '@arcblock/ux/lib/Toast';
@@ -134,13 +135,30 @@ export default function Resource({
134
135
  // eslint-disable-next-line react-hooks/exhaustive-deps
135
136
  }, [url, projectId]);
136
137
  if (component.status !== 'running') {
137
- return /*#__PURE__*/_jsx(Container, {
138
- children: /*#__PURE__*/_jsx(Box, {
139
- pt: 6,
138
+ return /*#__PURE__*/_jsxs(Container, {
139
+ sx: {
140
+ display: 'flex',
141
+ flexDirection: 'column',
142
+ justifyContent: 'center',
143
+ alignItems: 'center',
144
+ margin: '10px 0px'
145
+ },
146
+ children: [/*#__PURE__*/_jsx(StopIcon, {
147
+ sx: {
148
+ fontSize: 32,
149
+ opacity: 0.3,
150
+ mb: 2
151
+ }
152
+ }), /*#__PURE__*/_jsx(Box, {
153
+ sx: {
154
+ mb: 2,
155
+ fontSize: 'small',
156
+ color: 'action'
157
+ },
140
158
  children: t('blocklet.publish.componentNotRunning', {
141
159
  name: component.meta.title
142
160
  })
143
- })
161
+ })]
144
162
  });
145
163
  }
146
164
  return /*#__PURE__*/_jsxs(_Fragment, {
package/es/locales/ar.js CHANGED
@@ -504,6 +504,11 @@ export default {
504
504
  action: 'مسح الذاكرة المؤقتة',
505
505
  success: 'تم مسح {count} إدخالات التخزين المؤقت بنجاح',
506
506
  description: 'هل أنت متأكد أنك تريد مسح الملفات المخزنة المؤقتة في جهاز التوجيه وخدمة كتلة الحجب؟ قد يتسبب هذا الإجراء في تراجع طفيف في الأداء على المدى القصير.'
507
+ },
508
+ tenantMode: {
509
+ name: 'وضع العديد من المستأجرين',
510
+ multiple: 'يعمل هذا البلوكليت في وضع عدة مستأجرين ، يجب عزل البيانات لكل مستأجر',
511
+ single: 'تعمل هذه البرمجية النصية في وضع المستأجر الواحد ، حيث يتم مشاركة جميع البيانات.'
507
512
  }
508
513
  },
509
514
  overview: {
@@ -1745,7 +1750,8 @@ export default {
1745
1750
  error: 'انتهت صلاحية الاشتراك'
1746
1751
  },
1747
1752
  loading: 'تحميل الاشتراك...',
1748
- loadFailed: 'فشل تحميل معلومات الاشتراك ، يرجى إعادة المحاولة!'
1753
+ loadFailed: 'فشل تحميل معلومات الاشتراك ، يرجى إعادة المحاولة!',
1754
+ nextInvoice: 'الفاتورة التالية: {date}'
1749
1755
  }
1750
1756
  },
1751
1757
  analytics: {
package/es/locales/de.js CHANGED
@@ -504,6 +504,11 @@ export default {
504
504
  action: 'Cache löschen',
505
505
  success: 'Erfolgreich {count} Cache-Einträge gelöscht',
506
506
  description: 'Bist du sicher, dass du zwischengespeicherte Dateien im Router und Blocklet-Service löschen möchtest? Diese Operation kann in naher Zukunft zu einer leichten Leistungseinbuße führen.'
507
+ },
508
+ tenantMode: {
509
+ name: 'Mehrere Mandantenmodus',
510
+ multiple: 'Dieses Blocklet läuft im Mehrmandantenmodus, Daten sollten für jeden Mandanten isoliert sein',
511
+ single: 'Dieser Blocklet läuft im Einzelmandantenmodus, alle Daten werden geteilt.'
507
512
  }
508
513
  },
509
514
  overview: {
@@ -1745,7 +1750,8 @@ export default {
1745
1750
  error: 'Abonnement abgelaufen'
1746
1751
  },
1747
1752
  loading: 'Abonnement laden...',
1748
- loadFailed: 'Fehler beim Laden der Abonnementinformationen, bitte erneut versuchen!'
1753
+ loadFailed: 'Fehler beim Laden der Abonnementinformationen, bitte erneut versuchen!',
1754
+ nextInvoice: 'Nächste Rechnung: {date}'
1749
1755
  }
1750
1756
  },
1751
1757
  analytics: {
package/es/locales/en.js CHANGED
@@ -434,6 +434,11 @@ export default {
434
434
  enable: 'This blocklet can NOT currently be deleted',
435
435
  disable: 'This blocklet can currently be deleted'
436
436
  },
437
+ tenantMode: {
438
+ name: 'Multiple Tenant Mode',
439
+ multiple: 'This blocklet runs in multiple tenant mode, data should be isolated for each tenant',
440
+ single: 'This blocklet runs in single tenant mode, all data are shared'
441
+ },
437
442
  walletType: {
438
443
  name: 'Wallet Type',
439
444
  description: 'Blocklet instance wallet type, will change the derived DID'
@@ -1735,7 +1740,8 @@ export default {
1735
1740
  error: 'Subscription Expired'
1736
1741
  },
1737
1742
  loading: 'Load subscription...',
1738
- loadFailed: 'Failed to load subscription info, please retry!'
1743
+ loadFailed: 'Failed to load subscription info, please retry!',
1744
+ nextInvoice: 'Next Invoice: {date}'
1739
1745
  }
1740
1746
  },
1741
1747
  analytics: {
package/es/locales/es.js CHANGED
@@ -504,6 +504,11 @@ export default {
504
504
  action: 'Borrar caché',
505
505
  success: 'Se eliminaron correctamente {count} entradas de caché',
506
506
  description: '¿Estás seguro de que quieres borrar los archivos en caché en el router y el servicio de blocklet? Esta operación puede causar una ligera disminución en el rendimiento a corto plazo.'
507
+ },
508
+ tenantMode: {
509
+ name: 'Modo Multitenante Múltiple',
510
+ multiple: 'Este blocklet se ejecuta en modo de múltiples inquilinos, los datos deben estar aislados para cada inquilino',
511
+ single: 'Este blocklet se ejecuta en modo de inquilino único, todos los datos son compartidos'
507
512
  }
508
513
  },
509
514
  overview: {
@@ -1745,7 +1750,8 @@ export default {
1745
1750
  error: 'Suscripción vencida'
1746
1751
  },
1747
1752
  loading: 'Cargar suscripción...',
1748
- loadFailed: 'No se pudo cargar la información de la suscripción, ¡por favor intente de nuevo!'
1753
+ loadFailed: 'No se pudo cargar la información de la suscripción, ¡por favor intente de nuevo!',
1754
+ nextInvoice: 'Próxima factura: {date}'
1749
1755
  }
1750
1756
  },
1751
1757
  analytics: {
package/es/locales/fr.js CHANGED
@@ -504,6 +504,11 @@ export default {
504
504
  action: 'Effacer le cache',
505
505
  success: '{count} entrées de cache effacées avec succès',
506
506
  description: 'Êtes-vous sûr de vouloir effacer les fichiers mis en cache dans le routeur et le service de blocage? Cette opération peut entraîner une légère baisse des performances à court terme.'
507
+ },
508
+ tenantMode: {
509
+ name: 'Mode multi-locataire',
510
+ multiple: 'Ce bloclet fonctionne en mode locataire multiple, les données doivent être isolées pour chaque locataire',
511
+ single: 'Ce blocklet fonctionne en mode locataire unique, toutes les données sont partagées.'
507
512
  }
508
513
  },
509
514
  overview: {
@@ -1745,7 +1750,8 @@ export default {
1745
1750
  error: 'Abonnement expiré'
1746
1751
  },
1747
1752
  loading: "Chargement de l'abonnement...",
1748
- loadFailed: "Échec du chargement des informations d'abonnement, veuillez réessayer !"
1753
+ loadFailed: "Échec du chargement des informations d'abonnement, veuillez réessayer !",
1754
+ nextInvoice: 'Prochaine facture: {date}'
1749
1755
  }
1750
1756
  },
1751
1757
  analytics: {
package/es/locales/hi.js CHANGED
@@ -504,6 +504,11 @@ export default {
504
504
  action: 'कैश साफ़ करें',
505
505
  success: '{count} कैश एंट्री सफलतापूर्वक खाली की गईं',
506
506
  description: 'क्या आप सुनिश्चित हैं कि आप राउटर और ब्लॉकलेट सेवा में कैश की फ़ाइलें साफ़ करना चाहते हैं? यह ऑपरेशन छोटी अवधि में हल्की प्रदर्शनमाप में कमी का कारण बन सकता है।'
507
+ },
508
+ tenantMode: {
509
+ name: 'एकाधिक किराये के लोगों का मोड',
510
+ multiple: 'यह ब्लॉकलेट मल्टी-किरायेदार मोड में चलता है, प्रत्येक किरायेदार के लिए डाटा अलग होना चाहिए',
511
+ single: 'यह ब्लॉकलेट सिंगल टेनेंट मोड में चलता है, सभी डेटा साझा किए जाते हैं।'
507
512
  }
508
513
  },
509
514
  overview: {
@@ -1745,7 +1750,8 @@ export default {
1745
1750
  error: 'सदस्यता समाप्त हो गई'
1746
1751
  },
1747
1752
  loading: 'सदस्यता लोड करें...',
1748
- loadFailed: 'सदस्यता जानकारी लोड करने में विफल, कृपया पुनः प्रयास करें!'
1753
+ loadFailed: 'सदस्यता जानकारी लोड करने में विफल, कृपया पुनः प्रयास करें!',
1754
+ nextInvoice: 'अगला बिल: {date}'
1749
1755
  }
1750
1756
  },
1751
1757
  analytics: {
Binary file
package/es/locales/id.js CHANGED
@@ -504,6 +504,11 @@ export default {
504
504
  action: 'Bersihkan Cache',
505
505
  success: 'Berhasil membersihkan {count} entri cache',
506
506
  description: 'Apakah Anda yakin ingin menghapus file yang di-cache di router dan layanan blocklet? Operasi ini mungkin menyebabkan penurunan kinerja yang sedikit dalam jangka pendek.'
507
+ },
508
+ tenantMode: {
509
+ name: 'Mode Sewa Multipel',
510
+ multiple: 'Blocklet ini berjalan dalam mode penyewa ganda, data harus diisolasi untuk setiap penyewa',
511
+ single: 'Blok ini berjalan dalam mode penyewa tunggal, semua data dibagikan'
507
512
  }
508
513
  },
509
514
  overview: {
@@ -1745,7 +1750,8 @@ export default {
1745
1750
  error: 'Langganan Telah Kadaluarsa'
1746
1751
  },
1747
1752
  loading: 'Memuat langganan...',
1748
- loadFailed: 'Gagal memuat info langganan, silakan coba lagi!'
1753
+ loadFailed: 'Gagal memuat info langganan, silakan coba lagi!',
1754
+ nextInvoice: 'Faktur berikutnya: {date}'
1749
1755
  }
1750
1756
  },
1751
1757
  analytics: {
package/es/locales/ja.js CHANGED
@@ -504,6 +504,11 @@ export default {
504
504
  action: 'キャッシュをクリア',
505
505
  success: '{count}つのキャッシュエントリーを正常にクリアしました',
506
506
  description: 'ルーターとブロックレットサービスのキャッシュファイルを削除してもよろしいですか?この操作により、短期間の間に少しパフォーマンスが低下する可能性があります。'
507
+ },
508
+ tenantMode: {
509
+ name: 'マルチテナントモード',
510
+ multiple: 'このブロックレットは複数のテナントモードで実行され、各テナントごとにデータが分離される必要があります',
511
+ single: 'このブロックレットはシングルテナントモードで実行され、すべてのデータが共有されています'
507
512
  }
508
513
  },
509
514
  overview: {
@@ -1745,7 +1750,8 @@ export default {
1745
1750
  error: '定期購読が期限切れです'
1746
1751
  },
1747
1752
  loading: 'サブスクリプションをロード中...',
1748
- loadFailed: '購読情報の読み込みに失敗しました。もう一度やり直してください!'
1753
+ loadFailed: '購読情報の読み込みに失敗しました。もう一度やり直してください!',
1754
+ nextInvoice: '次の請求書: {date}'
1749
1755
  }
1750
1756
  },
1751
1757
  analytics: {
package/es/locales/ko.js CHANGED
@@ -504,6 +504,11 @@ export default {
504
504
  action: '캐시 지우기',
505
505
  success: '{count}개의 캐시 엔트리를 성공적으로 지웠습니다',
506
506
  description: '라우터와 블록렛 서비스에서 캐시 파일을 지우시겠습니까? 이 작업은 단기간 내에 약간의 성능 저하를 일으킬 수 있습니다.'
507
+ },
508
+ tenantMode: {
509
+ name: '다중 테넌트 모드',
510
+ multiple: '이 블록렛은 여러 테넌트 모드에서 실행되며 각 테넌트마다 데이터가 격리되어야 합니다',
511
+ single: '이 블록렛은 단일 테넌트 모드에서 실행되며, 모든 데이터가 공유됩니다'
507
512
  }
508
513
  },
509
514
  overview: {
@@ -1745,7 +1750,8 @@ export default {
1745
1750
  error: '구독이 만료되었습니다'
1746
1751
  },
1747
1752
  loading: '구독 불러오는 중...',
1748
- loadFailed: '구독 정보를 불러오지 못했습니다. 다시 시도해주세요!'
1753
+ loadFailed: '구독 정보를 불러오지 못했습니다. 다시 시도해주세요!',
1754
+ nextInvoice: '다음 송장: {date}'
1749
1755
  }
1750
1756
  },
1751
1757
  analytics: {
package/es/locales/pt.js CHANGED
@@ -504,6 +504,11 @@ export default {
504
504
  action: 'Limpar Cache',
505
505
  success: 'Entradas do cache {count} limpas com sucesso',
506
506
  description: 'Você tem certeza de que deseja limpar os arquivos em cache no roteador e no serviço de bloco? Essa operação pode causar uma pequena redução de desempenho a curto prazo.'
507
+ },
508
+ tenantMode: {
509
+ name: 'Modo de Vários Locatários',
510
+ multiple: 'Este bloco funciona no modo de múltiplos inquilinos, os dados devem ser isolados para cada inquilino',
511
+ single: 'Este bloco de código é executado no modo de locatário único, todos os dados são compartilhados'
507
512
  }
508
513
  },
509
514
  overview: {
@@ -1745,7 +1750,8 @@ export default {
1745
1750
  error: 'Assinatura Expirada'
1746
1751
  },
1747
1752
  loading: 'Carregar assinatura...',
1748
- loadFailed: 'Falha ao carregar as informações de inscrição, por favor tente novamente!'
1753
+ loadFailed: 'Falha ao carregar as informações de inscrição, por favor tente novamente!',
1754
+ nextInvoice: 'Próxima fatura: {date}'
1749
1755
  }
1750
1756
  },
1751
1757
  analytics: {
package/es/locales/ru.js CHANGED
@@ -504,6 +504,11 @@ export default {
504
504
  action: 'Очистить кэш',
505
505
  success: 'Успешно очищено {count} записей кэша',
506
506
  description: 'Вы уверены, что хотите очистить кэшированные файлы в маршрутизаторе и службе блокировки? Эта операция может вызвать незначительное снижение производительности в короткой перспективе.'
507
+ },
508
+ tenantMode: {
509
+ name: 'Режим нескольких арендаторов',
510
+ multiple: 'Этот блоклет работает в режиме множественных арендодателей, данные должны быть изолированы для каждого арендодателя',
511
+ single: 'Этот блоклет работает в режиме с одним арендатором, все данные общие.'
507
512
  }
508
513
  },
509
514
  overview: {
@@ -1745,7 +1750,8 @@ export default {
1745
1750
  error: 'Подписка истекла'
1746
1751
  },
1747
1752
  loading: 'Загрузка подписки...',
1748
- loadFailed: 'Не удалось загрузить информацию о подписке, попробуйте ещё раз!'
1753
+ loadFailed: 'Не удалось загрузить информацию о подписке, попробуйте ещё раз!',
1754
+ nextInvoice: 'Следующий счёт: {date}'
1749
1755
  }
1750
1756
  },
1751
1757
  analytics: {
package/es/locales/th.js CHANGED
@@ -504,6 +504,11 @@ export default {
504
504
  action: 'ล้างแคช',
505
505
  success: 'ล้าง {count} รายการแคชเรียบร้อยแล้ว',
506
506
  description: 'คุณแน่ใจไหมว่าต้องการล้างแคชไฟล์ที่เก็บไว้ในเราเตอร์และบริการบล็อกเล็ท? การดำเนินการนี้อาจทำให้ประสิทธิภาพลดลงบ้างในช่วงสั้น'
507
+ },
508
+ tenantMode: {
509
+ name: 'โหมดหลายผู้เช่า',
510
+ multiple: 'บล็อกเล็ตนี้ทำงานในโหมดผู้เช่าหลายราย เนื้อหาควรถูกแยกกันสำหรับแต่ละผู้เช่า',
511
+ single: 'บล็อกเลตนี้ทำงานในโหมดลูกค้าเดี่ยว ข้อมูลทั้งหมดถูกแชร์'
507
512
  }
508
513
  },
509
514
  overview: {
@@ -1745,7 +1750,8 @@ export default {
1745
1750
  error: 'การสมัครสมาชิกหมดอายุ'
1746
1751
  },
1747
1752
  loading: 'โหลดการสมัครสมาชิก...',
1748
- loadFailed: 'ไม่สามารถโหลดข้อมูลการสมัครสมาชิกได้ โปรดลองใหม่!'
1753
+ loadFailed: 'ไม่สามารถโหลดข้อมูลการสมัครสมาชิกได้ โปรดลองใหม่!',
1754
+ nextInvoice: 'ใบแจ้งหนี้ถัดไป: {date}'
1749
1755
  }
1750
1756
  },
1751
1757
  analytics: {
package/es/locales/vi.js CHANGED
@@ -504,6 +504,11 @@ export default {
504
504
  action: 'Xóa Cache',
505
505
  success: '{count} mục cache đã được xóa thành công',
506
506
  description: 'Bạn có chắc chắn muốn xóa các tệp được lưu trữ tạm thời trong bộ định tuyến và dịch vụ blocklet không? Thao tác này có thể làm giảm hiệu suất một chút trong thời gian ngắn.'
507
+ },
508
+ tenantMode: {
509
+ name: 'Chế độ Đa Người Thuê',
510
+ multiple: 'Blocklet này chạy trong chế độ nhiều người thuê, dữ liệu được cô lập cho mỗi người thuê',
511
+ single: 'Khối mã này chạy trong chế độ khách hàng đơn, tất cả dữ liệu được chia sẻ'
507
512
  }
508
513
  },
509
514
  overview: {
@@ -1745,7 +1750,8 @@ export default {
1745
1750
  error: 'Đã hết hạn đăng ký'
1746
1751
  },
1747
1752
  loading: 'Tải đăng ký...',
1748
- loadFailed: 'Không tải được thông tin đăng ký, vui lòng thử lại!'
1753
+ loadFailed: 'Không tải được thông tin đăng ký, vui lòng thử lại!',
1754
+ nextInvoice: 'Hóa đơn tiếp theo: {date}'
1749
1755
  }
1750
1756
  },
1751
1757
  analytics: {
@@ -504,6 +504,11 @@ export default {
504
504
  action: '清除快取',
505
505
  success: '成功清除{count}個快取項目',
506
506
  description: '你確定要清除路由器和區塊服務中的快取文件嗎?這個操作可能會導致短期內性能略微下降。'
507
+ },
508
+ tenantMode: {
509
+ name: '多租戶模式',
510
+ multiple: '該區塊以多租戶模式運行,每個租戶的數據應該是隔離的',
511
+ single: '這個 blocklet 在單租戶模式下運行,所有數據都是共享的'
507
512
  }
508
513
  },
509
514
  overview: {
@@ -1745,7 +1750,8 @@ export default {
1745
1750
  error: '訂閱已到期'
1746
1751
  },
1747
1752
  loading: '加載訂閱...',
1748
- loadFailed: '載入訂閱資訊失敗,請重試!'
1753
+ loadFailed: '載入訂閱資訊失敗,請重試!',
1754
+ nextInvoice: '下個發票:{date}'
1749
1755
  }
1750
1756
  },
1751
1757
  analytics: {
package/es/locales/zh.js CHANGED
@@ -505,6 +505,11 @@ export default {
505
505
  action: '清除缓存',
506
506
  success: '成功清除了 {count} 个缓存条目',
507
507
  description: '您确定要清除缓存在网关和服务中的文件吗?此操作可能会在短期内导致轻微的性能降低。'
508
+ },
509
+ tenantMode: {
510
+ name: '多租户模式',
511
+ multiple: '该应用在多租户模式下运行,每个租户的数据应该是隔离的',
512
+ single: '该应用运行在单租户模式下,所有数据都是共享的'
508
513
  }
509
514
  },
510
515
  overview: {
@@ -663,7 +668,7 @@ export default {
663
668
  productTitle: 'Blocklet 详情',
664
669
  versionTitle: '版本信息',
665
670
  imgTitle: '图片资源',
666
- resourceTitle: '资源型 Blocklet',
671
+ resourceTitle: '资源',
667
672
  blockletEmptyTip: '这里没有任何 Blocklet',
668
673
  createBlockletTip: '你可以使用此应用的资源,组件,配置制作新的 Blocklet',
669
674
  createBlocklet: '新建 Blocklet',
@@ -1752,7 +1757,8 @@ export default {
1752
1757
  error: '订阅已过期'
1753
1758
  },
1754
1759
  loadFailed: '加载订阅信息失败,请重试!',
1755
- loading: '加载订阅信息...'
1760
+ loading: '加载订阅信息...',
1761
+ nextInvoice: '下次账单:{date}'
1756
1762
  }
1757
1763
  },
1758
1764
  analytics: {
@@ -10,7 +10,7 @@ import { useRef } from 'react';
10
10
  import useAsyncRetry from 'react-use/lib/useAsyncRetry';
11
11
  import useSetState from 'react-use/lib/useSetState';
12
12
  import { useNodeContext } from '../contexts/node';
13
- import { formatPrettyMsLocale, getSubscriptionUrlV2 } from '../util';
13
+ import { formatPrettyMsLocale, formatToDate, getSubscriptionUrlV2 } from '../util';
14
14
  import ChipLabel from './chip-label';
15
15
  import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
16
16
  const ALERT_THRESHOLD_MS = 30 * 24 * 60 * 60 * 1000;
@@ -114,7 +114,21 @@ function SubscriptionServer({
114
114
  });
115
115
  };
116
116
  return /*#__PURE__*/_jsxs(_Fragment, {
117
- children: [/*#__PURE__*/_jsx(Chip, {
117
+ children: [asyncState.value?.launcherSession?.subscription && /*#__PURE__*/_jsx(Chip, {
118
+ label: /*#__PURE__*/_jsx(ChipLabel, {
119
+ children: t('expiration.desktop.nextInvoice', {
120
+ date: formatToDate(expirationDate, locale)
121
+ })
122
+ }),
123
+ color: "success",
124
+ variant: "outlined",
125
+ sx: {
126
+ cursor: 'pointer',
127
+ ...sx
128
+ },
129
+ ...rest,
130
+ onClick: handlePopoverClick
131
+ }), !asyncState.value?.launcherSession?.subscription && /*#__PURE__*/_jsx(Chip, {
118
132
  label: /*#__PURE__*/_jsx(ChipLabel, {
119
133
  children: t(`expiration.${typoKey}.tips.${status}`, {
120
134
  validity: prettyMs(validityMs, {
package/lib/actions.js CHANGED
@@ -25,7 +25,7 @@ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key i
25
25
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
26
26
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
27
27
  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; }
28
- 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; }
28
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } } return target; }
29
29
  function Actions(_ref) {
30
30
  let {
31
31
  actions,
@@ -50,7 +50,7 @@ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key i
50
50
  function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : i + ""; }
51
51
  function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
52
52
  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; }
53
- 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; }
53
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } } return target; }
54
54
  function BlockletActions(_ref) {
55
55
  let {
56
56
  blocklet,