pgkiln 0.89.0 → 0.90.0

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.
@@ -411,7 +411,6 @@ export const en = {
411
411
  'pd.not_found': 'Component not found.',
412
412
  'pd.save_page': 'Save page',
413
413
  'pd.delete_page': 'Delete page',
414
- 'pd.delete_page_confirm': 'Delete page {n} and all its components?',
415
414
  'pd.filter_label': 'Filter properties',
416
415
  'pd.filter': 'Filter',
417
416
  'pd.help_hint': 'Select a property to see its help here.',
@@ -1431,7 +1430,6 @@ export const en = {
1431
1430
  'st.ts_format': 'Date and time format',
1432
1431
  'st.ts_format_ph': 'e.g. DD-MM-YYYY HH24:MI',
1433
1432
  'st.save_settings': 'Save settings',
1434
- 'st.delete_confirm': 'Delete application {app} and all its pages?',
1435
1433
  'st.delete': 'Delete application',
1436
1434
  'st.error_fn': 'Error handling function',
1437
1435
  'st.error_fn_ph': 'e.g. sales.error_message',
@@ -1478,8 +1476,8 @@ export const en = {
1478
1476
  'us.signin': 'Sign-in',
1479
1477
  'us.status': 'Status',
1480
1478
  'us.none': 'none',
1481
- 'us.password': 'password',
1482
- 'us.no_password': 'no password',
1479
+ 'us.password': 'Password',
1480
+ 'us.no_password': 'No password',
1483
1481
  'us.active': 'active',
1484
1482
  'us.inactive': 'inactive',
1485
1483
  'us.last': 'last {at}',
@@ -1849,8 +1847,8 @@ export const en = {
1849
1847
  'mfa.locked_out': 'Lost your phone, key and codes? Ask an administrator to reset your two-factor sign-in.',
1850
1848
  'mfa.wrong': 'That code is not right, or was already used.',
1851
1849
  'mfa.column': 'Two-factor',
1852
- 'mfa.on': 'on',
1853
- 'mfa.off': 'off',
1850
+ 'mfa.on': 'On',
1851
+ 'mfa.off': 'Off',
1854
1852
  'mfa.reset': 'Reset',
1855
1853
  'mfa.reason': 'Reason',
1856
1854
  'mfa.reset_help': 'Removes the apps and recovery codes of {user} and signs them out. Logged; the administrators are told by mail.',
@@ -7542,4 +7540,19 @@ export const en = {
7542
7540
  'wu.sec.instance': 'Instance',
7543
7541
  // ------------------------------------------------------------ Workspace home: needs attention (UX-13)
7544
7542
  'wh.attention': 'Needs attention',
7543
+ // ------------------------------------------------------------ Delete with a typed confirmation (UX-6)
7544
+ 'st.danger_zone': 'Danger zone',
7545
+ 'st.delete_text': 'Deleting {app} removes its pages, shared components, working copies and its backups too; it can\'t be undone. Export it first if you may need it again.',
7546
+ 'st.delete_type': 'Type the alias {alias} to confirm',
7547
+ 'st.delete_mismatch': 'Type the application\'s alias, {alias}, to delete it.',
7548
+ 'pd.delete_type': 'Type the page number {n} to confirm',
7549
+ 'pd.delete_mismatch': 'Type the page number, {n}, to delete the page.',
7550
+ // ------------------------------------------------------------ Create application: name first, a sticky footer (UX-7)
7551
+ 'aw.data_and_pages': 'Data and pages',
7552
+ 'aw.sign_in': 'Sign-in',
7553
+ 'aw.sum_on': '{n} pages on {schema}',
7554
+ 'aw.sum_on_1': '{n} page on {schema}',
7555
+ 'aw.sum_new': 'A new application with its own schema',
7556
+ // ------------------------------------------------------------ A side drawer's Close (UX-8)
7557
+ 'common.close': 'Close',
7545
7558
  } as const;
@@ -408,7 +408,6 @@ export const es: BuilderMessages = {
408
408
  'pd.not_found': 'Componente no encontrado.',
409
409
  'pd.save_page': 'Guardar página',
410
410
  'pd.delete_page': 'Eliminar página',
411
- 'pd.delete_page_confirm': '¿Eliminar la página {n} y todos sus componentes?',
412
411
  'pd.filter_label': 'Filtrar propiedades',
413
412
  'pd.filter': 'Filtrar',
414
413
  'pd.help_hint': 'Seleccione una propiedad para ver aquí su ayuda.',
@@ -1427,7 +1426,6 @@ export const es: BuilderMessages = {
1427
1426
  'st.ts_format': 'Formato de fecha y hora',
1428
1427
  'st.ts_format_ph': 'p. ej. DD-MM-YYYY HH24:MI',
1429
1428
  'st.save_settings': 'Guardar ajustes',
1430
- 'st.delete_confirm': '¿Eliminar la aplicación {app} y todas sus páginas?',
1431
1429
  'st.delete': 'Eliminar aplicación',
1432
1430
  'st.error_fn': 'Función de gestión de errores',
1433
1431
  'st.error_fn_ph': 'p. ej. sales.error_message',
@@ -1474,8 +1472,8 @@ export const es: BuilderMessages = {
1474
1472
  'us.signin': 'Inicio de sesión',
1475
1473
  'us.status': 'Estado',
1476
1474
  'us.none': 'ninguna',
1477
- 'us.password': 'contraseña',
1478
- 'us.no_password': 'sin contraseña',
1475
+ 'us.password': 'Contraseña',
1476
+ 'us.no_password': 'Sin contraseña',
1479
1477
  'us.active': 'activa',
1480
1478
  'us.inactive': 'inactiva',
1481
1479
  'us.last': 'último {at}',
@@ -1845,8 +1843,8 @@ export const es: BuilderMessages = {
1845
1843
  'mfa.locked_out': '¿Perdió el teléfono, la llave y los códigos? Pida a un administrador que restablezca su inicio de sesión en dos pasos.',
1846
1844
  'mfa.wrong': 'Ese código no es correcto o ya se usó.',
1847
1845
  'mfa.column': 'Dos pasos',
1848
- 'mfa.on': 'activado',
1849
- 'mfa.off': 'desactivado',
1846
+ 'mfa.on': 'Activado',
1847
+ 'mfa.off': 'Desactivado',
1850
1848
  'mfa.reset': 'Restablecer',
1851
1849
  'mfa.reason': 'Motivo',
1852
1850
  'mfa.reset_help': 'Quita las aplicaciones y los códigos de recuperación de {user} y cierra su sesión. Se registra; los administradores reciben un correo.',
@@ -7538,4 +7536,19 @@ export const es: BuilderMessages = {
7538
7536
  'wu.sec.instance': 'Instancia',
7539
7537
  // ------------------------------------------------------------ Workspace home: needs attention (UX-13)
7540
7538
  'wh.attention': 'Requiere atención',
7539
+ // ------------------------------------------------------------ Delete with a typed confirmation (UX-6)
7540
+ 'st.danger_zone': 'Zona de peligro',
7541
+ 'st.delete_text': 'Eliminar {app} borra sus páginas, componentes compartidos, copias de trabajo y también sus copias de seguridad; no se puede deshacer. Expórtela antes si puede volver a necesitarla.',
7542
+ 'st.delete_type': 'Escriba el alias {alias} para confirmar',
7543
+ 'st.delete_mismatch': 'Escriba el alias de la aplicación, {alias}, para eliminarla.',
7544
+ 'pd.delete_type': 'Escriba el número de página {n} para confirmar',
7545
+ 'pd.delete_mismatch': 'Escriba el número de página, {n}, para eliminar la página.',
7546
+ // ------------------------------------------------------------ Create application: name first, a sticky footer (UX-7)
7547
+ 'aw.data_and_pages': 'Datos y páginas',
7548
+ 'aw.sign_in': 'Inicio de sesión',
7549
+ 'aw.sum_on': '{n} páginas sobre {schema}',
7550
+ 'aw.sum_on_1': '{n} página sobre {schema}',
7551
+ 'aw.sum_new': 'Una aplicación nueva con su propio esquema',
7552
+ // ------------------------------------------------------------ A side drawer's Close (UX-8)
7553
+ 'common.close': 'Cerrar',
7541
7554
  };
@@ -408,7 +408,6 @@ export const fr: BuilderMessages = {
408
408
  'pd.not_found': 'Composant introuvable.',
409
409
  'pd.save_page': 'Enregistrer la page',
410
410
  'pd.delete_page': 'Supprimer la page',
411
- 'pd.delete_page_confirm': 'Supprimer la page {n} et tous ses composants ?',
412
411
  'pd.filter_label': 'Filtrer les propriétés',
413
412
  'pd.filter': 'Filtrer',
414
413
  'pd.help_hint': 'Sélectionnez une propriété pour afficher son aide ici.',
@@ -1427,7 +1426,6 @@ export const fr: BuilderMessages = {
1427
1426
  'st.ts_format': 'Format de date et heure',
1428
1427
  'st.ts_format_ph': 'p. ex. DD-MM-YYYY HH24:MI',
1429
1428
  'st.save_settings': 'Enregistrer les paramètres',
1430
- 'st.delete_confirm': 'Supprimer l’application {app} et toutes ses pages ?',
1431
1429
  'st.delete': 'Supprimer l’application',
1432
1430
  'st.error_fn': 'Fonction de gestion des erreurs',
1433
1431
  'st.error_fn_ph': 'p. ex. sales.error_message',
@@ -1474,8 +1472,8 @@ export const fr: BuilderMessages = {
1474
1472
  'us.signin': 'Connexion',
1475
1473
  'us.status': 'Statut',
1476
1474
  'us.none': 'aucune',
1477
- 'us.password': 'mot de passe',
1478
- 'us.no_password': 'pas de mot de passe',
1475
+ 'us.password': 'Mot de passe',
1476
+ 'us.no_password': 'Pas de mot de passe',
1479
1477
  'us.active': 'actif',
1480
1478
  'us.inactive': 'inactif',
1481
1479
  'us.last': 'dernier {at}',
@@ -1845,8 +1843,8 @@ export const fr: BuilderMessages = {
1845
1843
  'mfa.locked_out': 'Téléphone, clé et codes perdus ? Demandez à un administrateur de réinitialiser votre connexion à deux facteurs.',
1846
1844
  'mfa.wrong': 'Ce code est incorrect ou a déjà été utilisé.',
1847
1845
  'mfa.column': 'Deux facteurs',
1848
- 'mfa.on': 'activée',
1849
- 'mfa.off': 'désactivée',
1846
+ 'mfa.on': 'Activée',
1847
+ 'mfa.off': 'Désactivée',
1850
1848
  'mfa.reset': 'Réinitialiser',
1851
1849
  'mfa.reason': 'Motif',
1852
1850
  'mfa.reset_help': 'Supprime les applications et codes de récupération de {user} et le déconnecte. Journalisé ; les administrateurs sont prévenus par e-mail.',
@@ -7538,4 +7536,19 @@ export const fr: BuilderMessages = {
7538
7536
  'wu.sec.instance': 'Instance',
7539
7537
  // ------------------------------------------------------------ Workspace home: needs attention (UX-13)
7540
7538
  'wh.attention': 'À traiter',
7539
+ // ------------------------------------------------------------ Delete with a typed confirmation (UX-6)
7540
+ 'st.danger_zone': 'Zone de danger',
7541
+ 'st.delete_text': 'Supprimer {app} retire ses pages, ses composants partagés, ses copies de travail et aussi ses sauvegardes ; c’est irréversible. Exportez-la d’abord si vous pourriez en avoir besoin.',
7542
+ 'st.delete_type': 'Tapez l’alias {alias} pour confirmer',
7543
+ 'st.delete_mismatch': 'Tapez l’alias de l’application, {alias}, pour la supprimer.',
7544
+ 'pd.delete_type': 'Tapez le numéro de page {n} pour confirmer',
7545
+ 'pd.delete_mismatch': 'Tapez le numéro de page, {n}, pour supprimer la page.',
7546
+ // ------------------------------------------------------------ Create application: name first, a sticky footer (UX-7)
7547
+ 'aw.data_and_pages': 'Données et pages',
7548
+ 'aw.sign_in': 'Connexion',
7549
+ 'aw.sum_on': '{n} pages sur {schema}',
7550
+ 'aw.sum_on_1': '{n} page sur {schema}',
7551
+ 'aw.sum_new': 'Une nouvelle application avec son propre schéma',
7552
+ // ------------------------------------------------------------ A side drawer's Close (UX-8)
7553
+ 'common.close': 'Fermer',
7541
7554
  };
@@ -408,7 +408,6 @@ export const it: BuilderMessages = {
408
408
  'pd.not_found': 'Componente non trovato.',
409
409
  'pd.save_page': 'Salva pagina',
410
410
  'pd.delete_page': 'Elimina pagina',
411
- 'pd.delete_page_confirm': 'Eliminare la pagina {n} e tutti i suoi componenti?',
412
411
  'pd.filter_label': 'Filtra proprietà',
413
412
  'pd.filter': 'Filtro',
414
413
  'pd.help_hint': 'Selezionare una proprietà per visualizzarne qui la guida.',
@@ -1427,7 +1426,6 @@ export const it: BuilderMessages = {
1427
1426
  'st.ts_format': 'Formato data e ora',
1428
1427
  'st.ts_format_ph': 'ad es. DD-MM-YYYY HH24:MI',
1429
1428
  'st.save_settings': 'Salva impostazioni',
1430
- 'st.delete_confirm': 'Eliminare l’applicazione {app} e tutte le sue pagine?',
1431
1429
  'st.delete': 'Elimina applicazione',
1432
1430
  'st.error_fn': 'Funzione di gestione degli errori',
1433
1431
  'st.error_fn_ph': 'ad es. sales.error_message',
@@ -1474,8 +1472,8 @@ export const it: BuilderMessages = {
1474
1472
  'us.signin': 'Accesso',
1475
1473
  'us.status': 'Stato',
1476
1474
  'us.none': 'nessuna',
1477
- 'us.password': 'password',
1478
- 'us.no_password': 'nessuna password',
1475
+ 'us.password': 'Password',
1476
+ 'us.no_password': 'Nessuna password',
1479
1477
  'us.active': 'attivo',
1480
1478
  'us.inactive': 'non attivo',
1481
1479
  'us.last': 'ultimo {at}',
@@ -1845,8 +1843,8 @@ export const it: BuilderMessages = {
1845
1843
  'mfa.locked_out': 'Smarriti telefono, chiave e codici? Chiedere a un amministratore di reimpostare l’accesso a due fattori.',
1846
1844
  'mfa.wrong': 'Il codice non è corretto oppure è già stato usato.',
1847
1845
  'mfa.column': 'Due fattori',
1848
- 'mfa.on': 'attivo',
1849
- 'mfa.off': 'non attivo',
1846
+ 'mfa.on': 'Attivo',
1847
+ 'mfa.off': 'Non attivo',
1850
1848
  'mfa.reset': 'Reimposta',
1851
1849
  'mfa.reason': 'Motivo',
1852
1850
  'mfa.reset_help': 'Rimuove le app e i codici di recupero di {user} e lo disconnette. Viene registrato; gli amministratori vengono avvisati via e-mail.',
@@ -7538,4 +7536,19 @@ export const it: BuilderMessages = {
7538
7536
  'wu.sec.instance': 'Istanza',
7539
7537
  // ------------------------------------------------------------ Workspace home: needs attention (UX-13)
7540
7538
  'wh.attention': 'Richiede attenzione',
7539
+ // ------------------------------------------------------------ Delete with a typed confirmation (UX-6)
7540
+ 'st.danger_zone': 'Zona pericolosa',
7541
+ 'st.delete_text': 'L’eliminazione di {app} rimuove pagine, componenti condivisi, copie di lavoro e anche i backup; non si può annullare. Esportala prima se potrebbe servirti ancora.',
7542
+ 'st.delete_type': 'Digita l’alias {alias} per confermare',
7543
+ 'st.delete_mismatch': 'Digita l’alias dell’applicazione, {alias}, per eliminarla.',
7544
+ 'pd.delete_type': 'Digita il numero di pagina {n} per confermare',
7545
+ 'pd.delete_mismatch': 'Digita il numero di pagina, {n}, per eliminare la pagina.',
7546
+ // ------------------------------------------------------------ Create application: name first, a sticky footer (UX-7)
7547
+ 'aw.data_and_pages': 'Dati e pagine',
7548
+ 'aw.sign_in': 'Accesso',
7549
+ 'aw.sum_on': '{n} pagine su {schema}',
7550
+ 'aw.sum_on_1': '{n} pagina su {schema}',
7551
+ 'aw.sum_new': 'Una nuova applicazione con il proprio schema',
7552
+ // ------------------------------------------------------------ A side drawer's Close (UX-8)
7553
+ 'common.close': 'Chiudi',
7541
7554
  };
@@ -408,7 +408,6 @@ export const ja: BuilderMessages = {
408
408
  'pd.not_found': 'コンポーネントが見つかりません。',
409
409
  'pd.save_page': 'ページの保存',
410
410
  'pd.delete_page': 'ページの削除',
411
- 'pd.delete_page_confirm': 'ページ {n} とそのすべてのコンポーネントを削除しますか。',
412
411
  'pd.filter_label': 'プロパティのフィルタ',
413
412
  'pd.filter': 'フィルタ',
414
413
  'pd.help_hint': 'プロパティを選択すると、ここにヘルプが表示されます。',
@@ -1427,7 +1426,6 @@ export const ja: BuilderMessages = {
1427
1426
  'st.ts_format': '日時書式',
1428
1427
  'st.ts_format_ph': '例: DD-MM-YYYY HH24:MI',
1429
1428
  'st.save_settings': '設定の保存',
1430
- 'st.delete_confirm': 'アプリケーション {app} とそのすべてのページを削除しますか。',
1431
1429
  'st.delete': 'アプリケーションの削除',
1432
1430
  'st.error_fn': 'エラー処理関数',
1433
1431
  'st.error_fn_ph': '例: sales.error_message',
@@ -7538,4 +7536,19 @@ export const ja: BuilderMessages = {
7538
7536
  'wu.sec.instance': 'インスタンス',
7539
7537
  // ------------------------------------------------------------ Workspace home: needs attention (UX-13)
7540
7538
  'wh.attention': '要対応',
7539
+ // ------------------------------------------------------------ Delete with a typed confirmation (UX-6)
7540
+ 'st.danger_zone': '危険な操作',
7541
+ 'st.delete_text': '{app} を削除すると、ページ、共有コンポーネント、作業コピー、バックアップも削除され、元に戻せません。再び必要になる可能性がある場合は、先にエクスポートしてください。',
7542
+ 'st.delete_type': '確認のため別名 {alias} を入力してください',
7543
+ 'st.delete_mismatch': '削除するには、アプリケーションの別名 {alias} を入力してください。',
7544
+ 'pd.delete_type': '確認のためページ番号 {n} を入力してください',
7545
+ 'pd.delete_mismatch': 'ページを削除するには、ページ番号 {n} を入力してください。',
7546
+ // ------------------------------------------------------------ Create application: name first, a sticky footer (UX-7)
7547
+ 'aw.data_and_pages': 'データとページ',
7548
+ 'aw.sign_in': 'サインイン',
7549
+ 'aw.sum_on': '{schema} の {n} ページ',
7550
+ 'aw.sum_on_1': '{schema} の {n} ページ',
7551
+ 'aw.sum_new': '独自のスキーマを持つ新しいアプリケーション',
7552
+ // ------------------------------------------------------------ A side drawer's Close (UX-8)
7553
+ 'common.close': '閉じる',
7541
7554
  };
@@ -408,7 +408,6 @@ export const ko: BuilderMessages = {
408
408
  'pd.not_found': '구성요소를 찾을 수 없습니다.',
409
409
  'pd.save_page': '페이지 저장',
410
410
  'pd.delete_page': '페이지 삭제',
411
- 'pd.delete_page_confirm': '페이지 {n}과(와) 모든 구성요소를 삭제하시겠습니까?',
412
411
  'pd.filter_label': '속성 필터',
413
412
  'pd.filter': '필터',
414
413
  'pd.help_hint': '속성을 선택하면 여기에 도움말이 표시됩니다.',
@@ -1427,7 +1426,6 @@ export const ko: BuilderMessages = {
1427
1426
  'st.ts_format': '날짜 및 시간 형식',
1428
1427
  'st.ts_format_ph': '예: DD-MM-YYYY HH24:MI',
1429
1428
  'st.save_settings': '설정 저장',
1430
- 'st.delete_confirm': '애플리케이션 {app}과(와) 모든 페이지를 삭제하시겠습니까?',
1431
1429
  'st.delete': '애플리케이션 삭제',
1432
1430
  'st.error_fn': '오류 처리 함수',
1433
1431
  'st.error_fn_ph': '예: sales.error_message',
@@ -7538,4 +7536,19 @@ export const ko: BuilderMessages = {
7538
7536
  'wu.sec.instance': '인스턴스',
7539
7537
  // ------------------------------------------------------------ Workspace home: needs attention (UX-13)
7540
7538
  'wh.attention': '주의 필요',
7539
+ // ------------------------------------------------------------ Delete with a typed confirmation (UX-6)
7540
+ 'st.danger_zone': '위험 구역',
7541
+ 'st.delete_text': '{app}을(를) 삭제하면 페이지, 공유 구성 요소, 작업 사본과 백업도 함께 삭제되며 되돌릴 수 없습니다. 다시 필요할 수 있다면 먼저 내보내십시오.',
7542
+ 'st.delete_type': '확인하려면 별칭 {alias}을(를) 입력하십시오',
7543
+ 'st.delete_mismatch': '삭제하려면 애플리케이션의 별칭 {alias}을(를) 입력하십시오.',
7544
+ 'pd.delete_type': '확인하려면 페이지 번호 {n}을(를) 입력하십시오',
7545
+ 'pd.delete_mismatch': '페이지를 삭제하려면 페이지 번호 {n}을(를) 입력하십시오.',
7546
+ // ------------------------------------------------------------ Create application: name first, a sticky footer (UX-7)
7547
+ 'aw.data_and_pages': '데이터와 페이지',
7548
+ 'aw.sign_in': '로그인',
7549
+ 'aw.sum_on': '{schema}의 페이지 {n}개',
7550
+ 'aw.sum_on_1': '{schema}의 페이지 {n}개',
7551
+ 'aw.sum_new': '자체 스키마를 가진 새 애플리케이션',
7552
+ // ------------------------------------------------------------ A side drawer's Close (UX-8)
7553
+ 'common.close': '닫기',
7541
7554
  };
@@ -408,7 +408,6 @@ export const nl: BuilderMessages = {
408
408
  'pd.not_found': 'Component niet gevonden.',
409
409
  'pd.save_page': 'Pagina opslaan',
410
410
  'pd.delete_page': 'Pagina verwijderen',
411
- 'pd.delete_page_confirm': 'Pagina {n} en al haar componenten verwijderen?',
412
411
  'pd.filter_label': 'Eigenschappen filteren',
413
412
  'pd.filter': 'Filteren',
414
413
  'pd.help_hint': 'Selecteer een eigenschap om hier de help ervan te zien.',
@@ -1427,7 +1426,6 @@ export const nl: BuilderMessages = {
1427
1426
  'st.ts_format': 'Notatie van datum en tijd',
1428
1427
  'st.ts_format_ph': 'bijv. DD-MM-YYYY HH24:MI',
1429
1428
  'st.save_settings': 'Instellingen opslaan',
1430
- 'st.delete_confirm': 'Applicatie {app} met al haar pagina’s verwijderen?',
1431
1429
  'st.delete': 'Applicatie verwijderen',
1432
1430
  'st.error_fn': 'Functie voor foutafhandeling',
1433
1431
  'st.error_fn_ph': 'bijv. sales.error_message',
@@ -1474,8 +1472,8 @@ export const nl: BuilderMessages = {
1474
1472
  'us.signin': 'Aanmelden',
1475
1473
  'us.status': 'Status',
1476
1474
  'us.none': 'geen',
1477
- 'us.password': 'wachtwoord',
1478
- 'us.no_password': 'geen wachtwoord',
1475
+ 'us.password': 'Wachtwoord',
1476
+ 'us.no_password': 'Geen wachtwoord',
1479
1477
  'us.active': 'actief',
1480
1478
  'us.inactive': 'inactief',
1481
1479
  'us.last': 'laatst {at}',
@@ -1845,8 +1843,8 @@ export const nl: BuilderMessages = {
1845
1843
  'mfa.locked_out': 'Telefoon, sleutel en codes kwijt? Vraag een beheerder uw aanmelden in twee stappen te resetten.',
1846
1844
  'mfa.wrong': 'Die code klopt niet of is al gebruikt.',
1847
1845
  'mfa.column': 'Twee stappen',
1848
- 'mfa.on': 'aan',
1849
- 'mfa.off': 'uit',
1846
+ 'mfa.on': 'Aan',
1847
+ 'mfa.off': 'Uit',
1850
1848
  'mfa.reset': 'Resetten',
1851
1849
  'mfa.reason': 'Reden',
1852
1850
  'mfa.reset_help': 'Verwijdert de apps en herstelcodes van {user} en meldt deze af. Wordt gelogd; de beheerders krijgen een e-mail.',
@@ -7538,4 +7536,19 @@ export const nl: BuilderMessages = {
7538
7536
  'wu.sec.instance': 'Instantie',
7539
7537
  // ------------------------------------------------------------ Workspace home: needs attention (UX-13)
7540
7538
  'wh.attention': 'Vraagt aandacht',
7539
+ // ------------------------------------------------------------ Delete with a typed confirmation (UX-6)
7540
+ 'st.danger_zone': 'Gevarenzone',
7541
+ 'st.delete_text': 'Verwijderen van {app} verwijdert de pagina\'s, gedeelde componenten, werkkopieën en ook de back-ups; dat kan niet ongedaan worden gemaakt. Exporteer de applicatie eerst als u haar nog nodig kunt hebben.',
7542
+ 'st.delete_type': 'Typ de alias {alias} ter bevestiging',
7543
+ 'st.delete_mismatch': 'Typ de alias van de applicatie, {alias}, om haar te verwijderen.',
7544
+ 'pd.delete_type': 'Typ het paginanummer {n} ter bevestiging',
7545
+ 'pd.delete_mismatch': 'Typ het paginanummer, {n}, om de pagina te verwijderen.',
7546
+ // ------------------------------------------------------------ Create application: name first, a sticky footer (UX-7)
7547
+ 'aw.data_and_pages': 'Gegevens en pagina\'s',
7548
+ 'aw.sign_in': 'Aanmelden',
7549
+ 'aw.sum_on': '{n} pagina\'s op {schema}',
7550
+ 'aw.sum_on_1': '{n} pagina op {schema}',
7551
+ 'aw.sum_new': 'Een nieuwe applicatie met een eigen schema',
7552
+ // ------------------------------------------------------------ A side drawer's Close (UX-8)
7553
+ 'common.close': 'Sluiten',
7541
7554
  };
@@ -408,7 +408,6 @@ export const pt: BuilderMessages = {
408
408
  'pd.not_found': 'Componente não encontrado.',
409
409
  'pd.save_page': 'Salvar página',
410
410
  'pd.delete_page': 'Excluir página',
411
- 'pd.delete_page_confirm': 'Excluir a página {n} e todos os seus componentes?',
412
411
  'pd.filter_label': 'Filtrar propriedades',
413
412
  'pd.filter': 'Filtrar',
414
413
  'pd.help_hint': 'Selecione uma propriedade para ver a ajuda dela aqui.',
@@ -1427,7 +1426,6 @@ export const pt: BuilderMessages = {
1427
1426
  'st.ts_format': 'Formato de data e hora',
1428
1427
  'st.ts_format_ph': 'por exemplo DD-MM-YYYY HH24:MI',
1429
1428
  'st.save_settings': 'Salvar configurações',
1430
- 'st.delete_confirm': 'Excluir a aplicação {app} e todas as suas páginas?',
1431
1429
  'st.delete': 'Excluir aplicação',
1432
1430
  'st.error_fn': 'Função de tratamento de erros',
1433
1431
  'st.error_fn_ph': 'por exemplo sales.error_message',
@@ -1474,8 +1472,8 @@ export const pt: BuilderMessages = {
1474
1472
  'us.signin': 'Login',
1475
1473
  'us.status': 'Status',
1476
1474
  'us.none': 'nenhuma',
1477
- 'us.password': 'senha',
1478
- 'us.no_password': 'sem senha',
1475
+ 'us.password': 'Senha',
1476
+ 'us.no_password': 'Sem senha',
1479
1477
  'us.active': 'ativa',
1480
1478
  'us.inactive': 'inativa',
1481
1479
  'us.last': 'último {at}',
@@ -1845,8 +1843,8 @@ export const pt: BuilderMessages = {
1845
1843
  'mfa.locked_out': 'Perdeu o telefone, a chave e os códigos? Peça a um administrador para redefinir seu login em duas etapas.',
1846
1844
  'mfa.wrong': 'Esse código não está certo ou já foi usado.',
1847
1845
  'mfa.column': 'Duas etapas',
1848
- 'mfa.on': 'ativado',
1849
- 'mfa.off': 'desativado',
1846
+ 'mfa.on': 'Ativado',
1847
+ 'mfa.off': 'Desativado',
1850
1848
  'mfa.reset': 'Redefinir',
1851
1849
  'mfa.reason': 'Motivo',
1852
1850
  'mfa.reset_help': 'Remove os aplicativos e códigos de recuperação de {user} e encerra a sessão. Fica registrado; os administradores recebem um e-mail.',
@@ -7538,4 +7536,19 @@ export const pt: BuilderMessages = {
7538
7536
  'wu.sec.instance': 'Instância',
7539
7537
  // ------------------------------------------------------------ Workspace home: needs attention (UX-13)
7540
7538
  'wh.attention': 'Requer atenção',
7539
+ // ------------------------------------------------------------ Delete with a typed confirmation (UX-6)
7540
+ 'st.danger_zone': 'Zona de perigo',
7541
+ 'st.delete_text': 'Excluir {app} remove suas páginas, componentes compartilhados, cópias de trabalho e também seus backups; não pode ser desfeito. Exporte-a antes se puder precisar dela novamente.',
7542
+ 'st.delete_type': 'Digite o alias {alias} para confirmar',
7543
+ 'st.delete_mismatch': 'Digite o alias do aplicativo, {alias}, para excluí-lo.',
7544
+ 'pd.delete_type': 'Digite o número da página {n} para confirmar',
7545
+ 'pd.delete_mismatch': 'Digite o número da página, {n}, para excluir a página.',
7546
+ // ------------------------------------------------------------ Create application: name first, a sticky footer (UX-7)
7547
+ 'aw.data_and_pages': 'Dados e páginas',
7548
+ 'aw.sign_in': 'Início de sessão',
7549
+ 'aw.sum_on': '{n} páginas sobre {schema}',
7550
+ 'aw.sum_on_1': '{n} página sobre {schema}',
7551
+ 'aw.sum_new': 'Uma nova aplicação com o seu próprio esquema',
7552
+ // ------------------------------------------------------------ A side drawer's Close (UX-8)
7553
+ 'common.close': 'Fechar',
7541
7554
  };
@@ -408,7 +408,6 @@ export const zhCN: BuilderMessages = {
408
408
  'pd.not_found': '未找到组件。',
409
409
  'pd.save_page': '保存页面',
410
410
  'pd.delete_page': '删除页面',
411
- 'pd.delete_page_confirm': '删除页面 {n} 及其所有组件?',
412
411
  'pd.filter_label': '筛选属性',
413
412
  'pd.filter': '筛选',
414
413
  'pd.help_hint': '选择一个属性以在此处查看其帮助。',
@@ -1427,7 +1426,6 @@ export const zhCN: BuilderMessages = {
1427
1426
  'st.ts_format': '日期和时间格式',
1428
1427
  'st.ts_format_ph': '例如 DD-MM-YYYY HH24:MI',
1429
1428
  'st.save_settings': '保存设置',
1430
- 'st.delete_confirm': '删除应用程序 {app} 及其所有页面?',
1431
1429
  'st.delete': '删除应用程序',
1432
1430
  'st.error_fn': '错误处理函数',
1433
1431
  'st.error_fn_ph': '例如 sales.error_message',
@@ -7538,4 +7536,19 @@ export const zhCN: BuilderMessages = {
7538
7536
  'wu.sec.instance': '实例',
7539
7537
  // ------------------------------------------------------------ Workspace home: needs attention (UX-13)
7540
7538
  'wh.attention': '需要注意',
7539
+ // ------------------------------------------------------------ Delete with a typed confirmation (UX-6)
7540
+ 'st.danger_zone': '危险区域',
7541
+ 'st.delete_text': '删除 {app} 会移除其页面、共享组件、工作副本以及备份;此操作无法撤销。如果以后可能还需要,请先导出。',
7542
+ 'st.delete_type': '输入别名 {alias} 以确认',
7543
+ 'st.delete_mismatch': '输入应用程序的别名 {alias} 才能删除它。',
7544
+ 'pd.delete_type': '输入页码 {n} 以确认',
7545
+ 'pd.delete_mismatch': '输入页码 {n} 才能删除该页面。',
7546
+ // ------------------------------------------------------------ Create application: name first, a sticky footer (UX-7)
7547
+ 'aw.data_and_pages': '数据和页面',
7548
+ 'aw.sign_in': '登录',
7549
+ 'aw.sum_on': '{schema} 上的 {n} 个页面',
7550
+ 'aw.sum_on_1': '{schema} 上的 {n} 个页面',
7551
+ 'aw.sum_new': '一个拥有自己模式的新应用程序',
7552
+ // ------------------------------------------------------------ A side drawer's Close (UX-8)
7553
+ 'common.close': '关闭',
7541
7554
  };
@@ -408,7 +408,6 @@ export const zhTW: BuilderMessages = {
408
408
  'pd.not_found': '找不到元件。',
409
409
  'pd.save_page': '儲存頁面',
410
410
  'pd.delete_page': '刪除頁面',
411
- 'pd.delete_page_confirm': '要刪除頁面 {n} 及其所有元件嗎?',
412
411
  'pd.filter_label': '篩選屬性',
413
412
  'pd.filter': '篩選',
414
413
  'pd.help_hint': '選取屬性即可在此查看其說明。',
@@ -1427,7 +1426,6 @@ export const zhTW: BuilderMessages = {
1427
1426
  'st.ts_format': '日期與時間格式',
1428
1427
  'st.ts_format_ph': '例如 DD-MM-YYYY HH24:MI',
1429
1428
  'st.save_settings': '儲存設定',
1430
- 'st.delete_confirm': '要刪除應用程式 {app} 及其所有頁面嗎?',
1431
1429
  'st.delete': '刪除應用程式',
1432
1430
  'st.error_fn': '錯誤處理函數',
1433
1431
  'st.error_fn_ph': '例如 sales.error_message',
@@ -7538,4 +7536,19 @@ export const zhTW: BuilderMessages = {
7538
7536
  'wu.sec.instance': '執行個體',
7539
7537
  // ------------------------------------------------------------ Workspace home: needs attention (UX-13)
7540
7538
  'wh.attention': '需要注意',
7539
+ // ------------------------------------------------------------ Delete with a typed confirmation (UX-6)
7540
+ 'st.danger_zone': '危險區域',
7541
+ 'st.delete_text': '刪除 {app} 會移除其頁面、共用元件、工作副本以及備份;此動作無法復原。如果日後可能還需要,請先匯出。',
7542
+ 'st.delete_type': '輸入別名 {alias} 以確認',
7543
+ 'st.delete_mismatch': '輸入應用程式的別名 {alias} 才能刪除它。',
7544
+ 'pd.delete_type': '輸入頁碼 {n} 以確認',
7545
+ 'pd.delete_mismatch': '輸入頁碼 {n} 才能刪除該頁面。',
7546
+ // ------------------------------------------------------------ Create application: name first, a sticky footer (UX-7)
7547
+ 'aw.data_and_pages': '資料和頁面',
7548
+ 'aw.sign_in': '登入',
7549
+ 'aw.sum_on': '{schema} 上的 {n} 個頁面',
7550
+ 'aw.sum_on_1': '{schema} 上的 {n} 個頁面',
7551
+ 'aw.sum_new': '一個擁有自己結構描述的新應用程式',
7552
+ // ------------------------------------------------------------ A side drawer's Close (UX-8)
7553
+ 'common.close': '關閉',
7541
7554
  };
@@ -658,6 +658,8 @@ export async function builderRoutes(app: FastifyInstance) {
658
658
  // (089) page groups: a column and a filter (?group=name, or "-" for pages without one)
659
659
  const groups = (await owner.query<{ name: string }>('select name from meta.page_group where app_id = $1 order by name', [a.id])).rows.map((g) => g.name);
660
660
  const grouped = groups.length > 0 || pages.rows.some((p) => p.page_group);
661
+ // (UX-9) the property editor's words for a page's mode
662
+ const modeLabel = (m: string) => (m === 'modal' ? tx('pdz.modal_dialog') : tx('pdz.normal'));
661
663
  const groupFilter = typeof req.query?.group === 'string' ? req.query.group : '';
662
664
  // (sprint 74) search by name or number, and a report or icon view (APEX: the application home)
663
665
  const q = typeof req.query?.q === 'string' ? req.query.q.trim().slice(0, 100) : '';
@@ -688,11 +690,11 @@ export async function builderRoutes(app: FastifyInstance) {
688
690
  <select id="f_group" name="group">${[['', tx('app.all_pages')], ...groups.map((g) => [g, g]), ['-', tx('app.no_group')]].map(([v, l]) => html`<option value="${v}"${v === groupFilter ? raw(' selected') : ''}>${l}</option>`)}</select></div>
689
691
  <button class="btn u-selfend">${tx('common.show')}</button></form>`
690
692
  : ''}${icons
691
- ? html`<ul class="page-icons" id="pages-rows">${shownPages.map((p) => html`<li><a href="${designerUrl(a.id, p.page_no)}" class="page-icon"><span class="page-icon-no">${p.page_no}</span><b>${p.name}</b><small class="muted">${p.mode}, ${tx(p.regions === 1 ? 'app.regions_one' : 'app.regions', { n: p.regions })}</small></a></li>`)}</ul>`
693
+ ? html`<ul class="page-icons" id="pages-rows">${shownPages.map((p) => html`<li><a href="${designerUrl(a.id, p.page_no)}" class="page-icon"><span class="page-icon-no">${p.page_no}</span><b>${p.name}</b><small class="muted">${modeLabel(p.mode)}, ${tx(p.regions === 1 ? 'app.regions_one' : 'app.regions', { n: p.regions })}</small></a></li>`)}</ul>`
692
694
  : html`<div class="table-wrap"><table class="report">
693
695
  <thead><tr><th class="num">${tx('app.col.page')}</th><th>${tx('ab.col.name')}</th>${grouped ? html`<th>${tx('app.col.group')}</th>` : ''}<th>${tx('app.col.mode')}</th><th class="num">${tx('app.col.regions')}</th><th class="num">${tx('app.col.items')}</th><th class="num">${tx('app.col.das')}</th><th class="num">${tx('app.col.processes')}</th><th>${tx('app.col.authz')}</th><th>${tx('app.col.protection')}</th><th>${tx('app.col.lock')}</th><th></th></tr></thead>
694
696
  <tbody id="pages-rows">${shownPages.map((p) => html`<tr>
695
- <td class="num">${p.page_no}</td><td><a href="${designerUrl(a.id, p.page_no)}">${p.name}</a>${commentsPerPage.get(p.page_no) ? html` <span class="tag" title="${tx('app.dev_comments')}">${tx(commentsPerPage.get(p.page_no) === 1 ? 'app.comments_one' : 'app.comments', { n: commentsPerPage.get(p.page_no) })}</span>` : ''}${issues.tag(p.page_no)}</td>${grouped ? html`<td>${p.page_group ?? '—'}</td>` : ''}<td>${p.mode}</td>
697
+ <td class="num">${p.page_no}</td><td><a href="${designerUrl(a.id, p.page_no)}">${p.name}</a>${commentsPerPage.get(p.page_no) ? html` <span class="tag" title="${tx('app.dev_comments')}">${tx(commentsPerPage.get(p.page_no) === 1 ? 'app.comments_one' : 'app.comments', { n: commentsPerPage.get(p.page_no) })}</span>` : ''}${issues.tag(p.page_no)}</td>${grouped ? html`<td>${p.page_group ?? ''}</td>` : ''}<td>${modeLabel(p.mode)}</td>
696
698
  <td class="num">${p.regions}</td><td class="num">${p.items}</td><td class="num">${p.das}</td><td class="num">${p.processes}</td>
697
699
  <td>${p.requires_auth ? (p.authz ?? '—') : tx('app.public')}</td><td>${p.protection}</td>
698
700
  <td>${((l) => (l ? html`<span class="lock-tag" title="${lockText(l)}">${icon('key')}<span>${l.locked_by === s.username ? tx('app.you') : l.locked_by}</span></span>` : '—'))(locks.get(p.page_no))}</td>
@@ -716,7 +718,7 @@ export async function builderRoutes(app: FastifyInstance) {
716
718
  <div class="form-grid">
717
719
  ${input('page_no', tx('app.page_number'), nextPage, { type: 'number', required: true })}
718
720
  ${input('name', tx('ab.col.name'), '', { required: true })}
719
- ${select('mode', tx('app.col.mode'), 'normal', ['normal', 'modal'])}
721
+ ${select('mode', tx('app.col.mode'), 'normal', [['normal', tx('pdz.normal')], ['modal', tx('pdz.modal_dialog')]])}
720
722
  ${input('parent_page', tx('app.parent'), a.home_page, { type: 'number' })}
721
723
  </div>
722
724
  <div class="buttons"><button class="btn">${tx('app.create_page')}</button></div>
@@ -906,9 +908,13 @@ export async function builderRoutes(app: FastifyInstance) {
906
908
  ${await timeZoneSettings(a)}`)}${end}
907
909
  <div class="buttons settings-save"${['errors', 'pwa'].includes(tab) ? raw(' hidden') : ''}><button class="btn btn-hot">${tx('st.save_settings')}</button></div>
908
910
  </form>
909
- ${panel('definition')}<form method="post" action="${BASE}/apps/${a.id}/delete" class="danger-zone">${csrf(s)}
910
- <button class="btn btn-danger" data-confirm="${tx('st.delete_confirm', { app: a.name })}">${tx('st.delete')}</button>
911
- </form>${end}
911
+ ${panel('definition')}<section class="danger-zone danger-box" aria-labelledby="st-danger"><h2 id="st-danger">${tx('st.danger_zone')}</h2>
912
+ <p>${tx('st.delete_text', { app: a.name })} <a href="${BASE}/apps/${a.id}/export">${tx('app.head.export')}</a></p>
913
+ <!-- (UX-6) the alias typed to confirm, checked on the server too -->
914
+ <form method="post" action="${BASE}/apps/${a.id}/delete" class="danger-form">${csrf(s)}
915
+ <label class="field"><span class="label">${tx('st.delete_type', { alias: a.alias })}</span><input name="confirm" autocomplete="off" required spellcheck="false" pattern="${a.alias.replace(/[.*+?^${}()|[\]\\]/g, '\\$&')}"></label>
916
+ <button class="btn btn-danger">${icon('trash')} ${tx('st.delete')}</button>
917
+ </form></section>${end}
912
918
  ${panel('errors')}${region(tx('st.tab.errors'), html`<form method="post" action="${BASE}/apps/${a.id}/settings/behaviour">${csrf(s)}
913
919
  <div class="form-grid">
914
920
  ${input('error_function', tx('st.error_fn'), a.error_function ?? '', { placeholder: tx('st.error_fn_ph'),
@@ -1019,6 +1025,13 @@ export async function builderRoutes(app: FastifyInstance) {
1019
1025
  app.post(`${BASE}/apps/:id/delete`, async (req: Req, reply) => {
1020
1026
  const s = await developer(req, reply);
1021
1027
  if (!s) return;
1028
+ // (UX-6) only with the application's alias typed
1029
+ const target = await owner.one<{ alias: string }>('select alias from meta.app where id = $1', [Number(req.params.id) || 0]);
1030
+ if (!target) return reply.code(404).send('Not found');
1031
+ if (String(req.body?.confirm ?? '').trim() !== target.alias) {
1032
+ flash(s, tr(s)('st.delete_mismatch', { alias: target.alias }), 'error');
1033
+ return back(reply, s, `${BASE}/apps/${req.params.id}/settings?tab=definition`);
1034
+ }
1022
1035
  await owner.query('delete from meta.app where id = $1', [req.params.id]);
1023
1036
  flash(s, tr(s)('st.app_deleted'));
1024
1037
  return back(reply, s, BASE);
@@ -121,35 +121,37 @@ export async function usersRoutes(app: FastifyInstance) {
121
121
  ).rows;
122
122
  const cfg = await accountSettings();
123
123
  const main = html`
124
- <div class="title-row"><h1>${tx('us.title')}</h1><div class="buttons"><a class="btn" href="${BASE}/users/providers">${tx('us.providers_btn')}</a> <a class="btn" href="${BASE}/users/directories">${tx('us.ldap_btn')}</a></div></div>
124
+ <div class="title-row"><h1>${tx('us.title')}</h1><div class="buttons"><a class="btn" href="${BASE}/users/providers">${tx('us.providers_btn')}</a> <a class="btn" href="${BASE}/users/directories">${tx('us.ldap_btn')}</a>
125
+ <!-- (UX-8) Create account in a side drawer, so the accounts get the page's width (a details element: works without script) -->
126
+ <details class="drawer" id="us-create"><summary class="btn btn-hot">${icon('plus')} ${tx('us.create')}</summary>
127
+ <div class="drawer-panel" role="dialog" aria-labelledby="us-create-title"><div class="drawer-head"><h2 id="us-create-title">${tx('us.create')}</h2><button type="button" class="btn btn-sm" data-drawer-close>${tx('common.close')}</button></div>
128
+ <form method="post" action="${BASE}/users">${csrf(s)}
129
+ ${input('username', tx('us.username'), '', { required: true, help: tx('us.username_help') })}
130
+ ${input('display_name', tx('us.name'), '')}
131
+ ${input('email', tx('us.email'), '', { type: 'email' })}
132
+ ${input('password', tx('us.password_label'), '', { type: 'password', auto: 'new-password', help: tx('us.password_help') })}
133
+ <div class="field"><label class="check"><input type="checkbox" name="must_change" value="true" checked> ${tx('us.must_change')}</label></div>
134
+ <div class="buttons"><button class="btn btn-hot">${tx('us.create')}</button></div>
135
+ </form></div></details></div></div>
125
136
  <p class="muted u-mt0">${tx.rich('us.intro', { where: html`<b>${tx('us.access_path')}</b>` })}</p>
126
- <div class="columns wide-left">
137
+ <div class="us-page">
127
138
  ${region(tx('us.accounts'), html`
128
139
  <form method="get" class="search u-mb075 u-mwnone" role="search">
129
140
  <input type="search" name="q" value="${q}" placeholder="${tx('us.search_ph')}" aria-label="${tx('us.search_label')}"><button class="btn">${tx('us.search')}</button>
130
141
  </form>
131
- <div class="table-wrap"><table class="report report-reflow">
142
+ <div class="table-wrap rep-fit"><table class="report report-reflow">
132
143
  <thead><tr><th>${tx('us.username')}</th><th>${tx('us.name')}</th><th>${tx('us.apps_roles')}</th><th>${tx('us.signin')}</th><th>${tx('mfa.column')}</th><th>${tx('us.status')}</th></tr></thead>
133
144
  <tbody>${users.length
134
145
  ? users.map((u) => html`<tr>
135
146
  <td data-label="${tx('us.username')}"><a href="${BASE}/users/${u.id}">${u.username}</a></td>
136
147
  <td data-label="${tx('us.name')}">${u.display_name ?? ''}${u.email ? html`<div class="muted">${u.email}</div>` : ''}</td>
137
- <td data-label="${tx('us.applications')}">${u.apps.length ? u.apps.map((x: any) => html`<span class="chip">${x.alias}${x.roles.length ? `: ${x.roles.join(', ')}` : ''}</span> `) : html`<span class="muted">${tx('us.none')}</span>`}</td>
148
+ <td class="col-wrap" data-label="${tx('us.applications')}">${u.apps.length ? u.apps.map((x: any) => html`<span class="chip">${x.alias}${x.roles.length ? `: ${x.roles.join(', ')}` : ''}</span> `) : html`<span class="muted">${tx('us.none')}</span>`}</td>
138
149
  <td data-label="${tx('us.signin')}">${u.password_hash ? tx('us.password') : html`<span class="muted">${tx('us.no_password')}</span>`}</td>
139
150
  <td data-label="${tx('mfa.column')}">${u.mfa ? html`${icon('lock')} ${tx('mfa.on')}` : html`<span class="muted">${tx('mfa.off')}</span>`}</td>
140
151
  <td data-label="${tx('us.status')}">${u.active ? tx('us.active') : html`<b>${tx('us.inactive')}</b>`}${u.last_login_at ? html`<div class="muted">${tx('us.last', { at: String(u.last_login_at).slice(0, 16) })}</div>` : ''}</td>
141
152
  </tr>`)
142
153
  : html`<tr><td colspan="6" class="empty">${tx('us.no_accounts')}</td></tr>`}</tbody>
143
154
  </table></div>`)}
144
- ${region(tx('us.create'), html`
145
- <form method="post" action="${BASE}/users">${csrf(s)}
146
- ${input('username', tx('us.username'), '', { required: true, help: tx('us.username_help') })}
147
- ${input('display_name', tx('us.name'), '')}
148
- ${input('email', tx('us.email'), '', { type: 'email' })}
149
- ${input('password', tx('us.password_label'), '', { type: 'password', auto: 'new-password', help: tx('us.password_help') })}
150
- <div class="field"><label class="check"><input type="checkbox" name="must_change" value="true" checked> ${tx('us.must_change')}</label></div>
151
- <div class="buttons"><button class="btn btn-hot">${tx('us.create')}</button></div>
152
- </form>`)}
153
155
  ${region(tx('us.settings'), html`
154
156
  <form method="post" action="${BASE}/users/settings">${csrf(s)}
155
157
  <div class="form-grid">