pgkiln 0.81.0 → 0.82.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.
Files changed (73) hide show
  1. package/db/migrations/147_condition_types.sql +80 -0
  2. package/db/migrations/148_validation_types.sql +44 -0
  3. package/db/migrations/149_dynamic_action_events.sql +45 -0
  4. package/db/migrations/150_process_types.sql +23 -0
  5. package/db/migrations/151_item_types.sql +16 -0
  6. package/db/migrations/152_workflow_diagram_region.sql +10 -0
  7. package/docs/apex-feature-parity.md +10 -8
  8. package/docs/guide/02-concepts.md +3 -3
  9. package/docs/guide/04-pages-and-regions.md +17 -3
  10. package/docs/guide/05-items.md +5 -0
  11. package/docs/guide/06-processing.md +104 -17
  12. package/docs/guide/07-dynamic-actions.md +16 -1
  13. package/docs/guide/11-from-apex.md +7 -0
  14. package/examples/hr/hr_79_condition_types.sql +17 -0
  15. package/package.json +1 -1
  16. package/public/app.css +12 -0
  17. package/public/app.js +157 -9
  18. package/src/appfiles.ts +4 -4
  19. package/src/builder/advisor.ts +43 -7
  20. package/src/builder/code-editor.ts +14 -10
  21. package/src/builder/components.ts +51 -21
  22. package/src/builder/conditions.ts +64 -0
  23. package/src/builder/designer.ts +9 -1
  24. package/src/builder/i18n/de.ts +35 -0
  25. package/src/builder/i18n/en.ts +35 -0
  26. package/src/builder/i18n/es.ts +35 -0
  27. package/src/builder/i18n/fr.ts +35 -0
  28. package/src/builder/i18n/it.ts +35 -0
  29. package/src/builder/i18n/ja.ts +35 -0
  30. package/src/builder/i18n/ko.ts +35 -0
  31. package/src/builder/i18n/nl.ts +35 -0
  32. package/src/builder/i18n/pt.ts +35 -0
  33. package/src/builder/i18n/zh-cn.ts +35 -0
  34. package/src/builder/i18n/zh-tw.ts +35 -0
  35. package/src/builder/region-help.ts +3 -1
  36. package/src/builder/region-settings.ts +30 -5
  37. package/src/i18n/ar.ts +5 -0
  38. package/src/i18n/cs.ts +5 -0
  39. package/src/i18n/da.ts +5 -0
  40. package/src/i18n/de.ts +5 -0
  41. package/src/i18n/el.ts +5 -0
  42. package/src/i18n/es.ts +5 -0
  43. package/src/i18n/fi.ts +5 -0
  44. package/src/i18n/fr.ts +5 -0
  45. package/src/i18n/he.ts +5 -0
  46. package/src/i18n/it.ts +5 -0
  47. package/src/i18n/ja.ts +5 -0
  48. package/src/i18n/ko.ts +5 -0
  49. package/src/i18n/nb.ts +5 -0
  50. package/src/i18n/pl.ts +5 -0
  51. package/src/i18n/pt.ts +5 -0
  52. package/src/i18n/ru.ts +5 -0
  53. package/src/i18n/sv.ts +5 -0
  54. package/src/i18n/tr.ts +5 -0
  55. package/src/i18n/uk.ts +5 -0
  56. package/src/i18n/zh.ts +5 -0
  57. package/src/i18n.ts +10 -0
  58. package/src/metadata.ts +72 -9
  59. package/src/runtime/authz.ts +9 -5
  60. package/src/runtime/context.ts +4 -0
  61. package/src/runtime/da-styles.ts +37 -0
  62. package/src/runtime/documents.ts +3 -2
  63. package/src/runtime/engine.ts +95 -13
  64. package/src/runtime/items.ts +33 -0
  65. package/src/runtime/logic.ts +79 -8
  66. package/src/runtime/maps.ts +50 -4
  67. package/src/runtime/process-types.ts +139 -0
  68. package/src/runtime/processes.ts +2 -0
  69. package/src/runtime/regions.ts +4 -0
  70. package/src/runtime/render.ts +13 -2
  71. package/src/runtime/routes.ts +2 -2
  72. package/src/runtime/workflow-diagram.ts +45 -0
  73. package/src/workflow.ts +10 -2
@@ -2387,4 +2387,39 @@ export const fr: BuilderMessages = {
2387
2387
  'dbu.changed_since_drop': 'Les instructions ont changé depuis votre vérification : vérifiez-les à nouveau.',
2388
2388
  'dbu.tick_box': 'Cochez la case pour supprimer les objets que possède {name}, ou réattribuez-les.',
2389
2389
  'dbu.dropped': 'Rôle {name} supprimé.',
2390
+ // ------------------------------------------------------------ server-side conditions in words (sprint 154)
2391
+ 'cond.sql': 'Lorsque l\'expression SQL est vraie',
2392
+ 'cond.exists': 'Lorsque la requête renvoie une ligne',
2393
+ 'cond.not_exists': 'Lorsque la requête ne renvoie aucune ligne',
2394
+ 'cond.function_body': 'Lorsque le corps de fonction renvoie true',
2395
+ 'cond.item_null': 'Lorsque {item} est vide',
2396
+ 'cond.item_not_null': 'Lorsque {item} n\'est pas vide',
2397
+ 'cond.item_zero': 'Lorsque {item} vaut zéro',
2398
+ 'cond.item_not_zero': 'Lorsque {item} ne vaut pas zéro',
2399
+ 'cond.item_null_or_zero': 'Lorsque {item} est vide ou vaut zéro',
2400
+ 'cond.item_not_null_or_zero': 'Lorsque {item} n\'est ni vide ni zéro',
2401
+ 'cond.item_equals': 'Lorsque {item} vaut {value}',
2402
+ 'cond.item_not_equals': 'Lorsque {item} ne vaut pas {value}',
2403
+ 'cond.item_equals_item': 'Lorsque {item} est égal à {value}',
2404
+ 'cond.item_not_equals_item': 'Lorsque {item} diffère de {value}',
2405
+ 'cond.item_in_list': 'Lorsque {item} est l\'un de {value}',
2406
+ 'cond.item_not_in_list': 'Lorsque {item} n\'est aucun de {value}',
2407
+ 'cond.request_in': 'Lorsque la requête est {value}',
2408
+ 'cond.request_not_in': 'Lorsque la requête n\'est pas {value}',
2409
+ 'cond.page_in': 'Sur la page {value}',
2410
+ 'cond.page_not_in': 'Hors de la page {value}',
2411
+ 'cond.page_is_dialog': 'Lorsque la page est une boîte de dialogue modale',
2412
+ 'cond.page_is_not_dialog': 'Lorsque la page n\'est pas une boîte de dialogue modale',
2413
+ 'cond.user_signed_in': 'Lorsque l\'utilisateur est connecté',
2414
+ 'cond.user_public': 'Lorsque l\'utilisateur n\'est pas connecté',
2415
+ 'cond.language_in': 'Lorsque la langue est {value}',
2416
+ 'cond.language_not_in': 'Lorsque la langue n\'est pas {value}',
2417
+ 'cond.always': 'Toujours',
2418
+ 'cond.never': 'Jamais',
2419
+ // ------------------------------------------------------------ gallery: sprint 158 and 160 types
2420
+ 'gallery.region.workflow_diagram': 'Diagramme de workflow',
2421
+ 'gallery.item.image_upload': 'Téléchargement d\'image',
2422
+ 'gallery.item.autocomplete': 'Champ de texte avec saisie semi-automatique',
2423
+ 'gallery.item.percent_graph': 'Graphique de pourcentage',
2424
+ 'gallery.item.display_map': 'Afficher la carte',
2390
2425
  };
@@ -2387,4 +2387,39 @@ export const it: BuilderMessages = {
2387
2387
  'dbu.changed_since_drop': 'Le istruzioni sono cambiate da quando le hai riviste: rivedile di nuovo.',
2388
2388
  'dbu.tick_box': 'Spunta la casella per eliminare gli oggetti posseduti da {name}, oppure riassegnali.',
2389
2389
  'dbu.dropped': 'Eliminato il ruolo {name}.',
2390
+ // ------------------------------------------------------------ server-side conditions in words (sprint 154)
2391
+ 'cond.sql': 'Quando l\'espressione SQL è vera',
2392
+ 'cond.exists': 'Quando la query restituisce una riga',
2393
+ 'cond.not_exists': 'Quando la query non restituisce righe',
2394
+ 'cond.function_body': 'Quando il corpo della funzione restituisce true',
2395
+ 'cond.item_null': 'Quando {item} è vuoto',
2396
+ 'cond.item_not_null': 'Quando {item} non è vuoto',
2397
+ 'cond.item_zero': 'Quando {item} è zero',
2398
+ 'cond.item_not_zero': 'Quando {item} non è zero',
2399
+ 'cond.item_null_or_zero': 'Quando {item} è vuoto o zero',
2400
+ 'cond.item_not_null_or_zero': 'Quando {item} non è né vuoto né zero',
2401
+ 'cond.item_equals': 'Quando {item} è {value}',
2402
+ 'cond.item_not_equals': 'Quando {item} non è {value}',
2403
+ 'cond.item_equals_item': 'Quando {item} è uguale a {value}',
2404
+ 'cond.item_not_equals_item': 'Quando {item} è diverso da {value}',
2405
+ 'cond.item_in_list': 'Quando {item} è uno tra {value}',
2406
+ 'cond.item_not_in_list': 'Quando {item} non è nessuno tra {value}',
2407
+ 'cond.request_in': 'Quando la richiesta è {value}',
2408
+ 'cond.request_not_in': 'Quando la richiesta non è {value}',
2409
+ 'cond.page_in': 'Nella pagina {value}',
2410
+ 'cond.page_not_in': 'Non nella pagina {value}',
2411
+ 'cond.page_is_dialog': 'Quando la pagina è una finestra di dialogo modale',
2412
+ 'cond.page_is_not_dialog': 'Quando la pagina non è una finestra di dialogo modale',
2413
+ 'cond.user_signed_in': 'Quando l\'utente ha eseguito l\'accesso',
2414
+ 'cond.user_public': 'Quando l\'utente non ha eseguito l\'accesso',
2415
+ 'cond.language_in': 'Quando la lingua è {value}',
2416
+ 'cond.language_not_in': 'Quando la lingua non è {value}',
2417
+ 'cond.always': 'Sempre',
2418
+ 'cond.never': 'Mai',
2419
+ // ------------------------------------------------------------ gallery: sprint 158 and 160 types
2420
+ 'gallery.region.workflow_diagram': 'Diagramma del flusso di lavoro',
2421
+ 'gallery.item.image_upload': 'Caricamento immagine',
2422
+ 'gallery.item.autocomplete': 'Campo di testo con completamento automatico',
2423
+ 'gallery.item.percent_graph': 'Grafico percentuale',
2424
+ 'gallery.item.display_map': 'Mostra mappa',
2390
2425
  };
@@ -2387,4 +2387,39 @@ export const ja: BuilderMessages = {
2387
2387
  'dbu.changed_since_drop': '確認後に文が変わりました。もう一度確認してください。',
2388
2388
  'dbu.tick_box': '{name} が所有するオブジェクトを削除するにはボックスにチェックを入れるか、再割当てしてください。',
2389
2389
  'dbu.dropped': 'ロール {name} を削除しました。',
2390
+ // ------------------------------------------------------------ server-side conditions in words (sprint 154)
2391
+ 'cond.sql': 'SQL 式が真の場合',
2392
+ 'cond.exists': '問合せが行を返す場合',
2393
+ 'cond.not_exists': '問合せが行を返さない場合',
2394
+ 'cond.function_body': 'ファンクション本体が true を返す場合',
2395
+ 'cond.item_null': '{item} が空の場合',
2396
+ 'cond.item_not_null': '{item} が空でない場合',
2397
+ 'cond.item_zero': '{item} がゼロの場合',
2398
+ 'cond.item_not_zero': '{item} がゼロでない場合',
2399
+ 'cond.item_null_or_zero': '{item} が空またはゼロの場合',
2400
+ 'cond.item_not_null_or_zero': '{item} が空でもゼロでもない場合',
2401
+ 'cond.item_equals': '{item} が {value} の場合',
2402
+ 'cond.item_not_equals': '{item} が {value} でない場合',
2403
+ 'cond.item_equals_item': '{item} が {value} と等しい場合',
2404
+ 'cond.item_not_equals_item': '{item} が {value} と異なる場合',
2405
+ 'cond.item_in_list': '{item} が {value} のいずれかの場合',
2406
+ 'cond.item_not_in_list': '{item} が {value} のいずれでもない場合',
2407
+ 'cond.request_in': 'リクエストが {value} の場合',
2408
+ 'cond.request_not_in': 'リクエストが {value} でない場合',
2409
+ 'cond.page_in': 'ページ {value} の場合',
2410
+ 'cond.page_not_in': 'ページ {value} 以外の場合',
2411
+ 'cond.page_is_dialog': 'ページがモーダル・ダイアログの場合',
2412
+ 'cond.page_is_not_dialog': 'ページがモーダル・ダイアログでない場合',
2413
+ 'cond.user_signed_in': 'ユーザーがサインインしている場合',
2414
+ 'cond.user_public': 'ユーザーがサインインしていない場合',
2415
+ 'cond.language_in': '言語が {value} の場合',
2416
+ 'cond.language_not_in': '言語が {value} でない場合',
2417
+ 'cond.always': '常に',
2418
+ 'cond.never': 'なし',
2419
+ // ------------------------------------------------------------ gallery: sprint 158 and 160 types
2420
+ 'gallery.region.workflow_diagram': 'ワークフロー図',
2421
+ 'gallery.item.image_upload': '画像アップロード',
2422
+ 'gallery.item.autocomplete': 'オートコンプリート付きテキスト・フィールド',
2423
+ 'gallery.item.percent_graph': 'パーセント・グラフ',
2424
+ 'gallery.item.display_map': 'マップの表示',
2390
2425
  };
@@ -2387,4 +2387,39 @@ export const ko: BuilderMessages = {
2387
2387
  'dbu.changed_since_drop': '검토한 뒤 문이 바뀌었습니다: 다시 검토하세요.',
2388
2388
  'dbu.tick_box': '{name}이(가) 소유한 객체를 삭제하려면 상자에 체크하거나 다시 할당하세요.',
2389
2389
  'dbu.dropped': '역할 {name}을(를) 삭제했습니다.',
2390
+ // ------------------------------------------------------------ server-side conditions in words (sprint 154)
2391
+ 'cond.sql': 'SQL 식이 참인 경우',
2392
+ 'cond.exists': '쿼리가 행을 반환하는 경우',
2393
+ 'cond.not_exists': '쿼리가 행을 반환하지 않는 경우',
2394
+ 'cond.function_body': '함수 본문이 true를 반환하는 경우',
2395
+ 'cond.item_null': '{item}이(가) 비어 있는 경우',
2396
+ 'cond.item_not_null': '{item}이(가) 비어 있지 않은 경우',
2397
+ 'cond.item_zero': '{item}이(가) 0인 경우',
2398
+ 'cond.item_not_zero': '{item}이(가) 0이 아닌 경우',
2399
+ 'cond.item_null_or_zero': '{item}이(가) 비어 있거나 0인 경우',
2400
+ 'cond.item_not_null_or_zero': '{item}이(가) 비어 있지 않고 0도 아닌 경우',
2401
+ 'cond.item_equals': '{item}이(가) {value}인 경우',
2402
+ 'cond.item_not_equals': '{item}이(가) {value}이(가) 아닌 경우',
2403
+ 'cond.item_equals_item': '{item}이(가) {value}와(과) 같은 경우',
2404
+ 'cond.item_not_equals_item': '{item}이(가) {value}와(과) 다른 경우',
2405
+ 'cond.item_in_list': '{item}이(가) {value} 중 하나인 경우',
2406
+ 'cond.item_not_in_list': '{item}이(가) {value} 중 어느 것도 아닌 경우',
2407
+ 'cond.request_in': '요청이 {value}인 경우',
2408
+ 'cond.request_not_in': '요청이 {value}이(가) 아닌 경우',
2409
+ 'cond.page_in': '페이지 {value}에서',
2410
+ 'cond.page_not_in': '페이지 {value}이(가) 아닌 경우',
2411
+ 'cond.page_is_dialog': '페이지가 모달 대화상자인 경우',
2412
+ 'cond.page_is_not_dialog': '페이지가 모달 대화상자가 아닌 경우',
2413
+ 'cond.user_signed_in': '사용자가 로그인한 경우',
2414
+ 'cond.user_public': '사용자가 로그인하지 않은 경우',
2415
+ 'cond.language_in': '언어가 {value}인 경우',
2416
+ 'cond.language_not_in': '언어가 {value}이(가) 아닌 경우',
2417
+ 'cond.always': '항상',
2418
+ 'cond.never': '안 함',
2419
+ // ------------------------------------------------------------ gallery: sprint 158 and 160 types
2420
+ 'gallery.region.workflow_diagram': '워크플로 다이어그램',
2421
+ 'gallery.item.image_upload': '이미지 업로드',
2422
+ 'gallery.item.autocomplete': '자동 완성 텍스트 필드',
2423
+ 'gallery.item.percent_graph': '백분율 그래프',
2424
+ 'gallery.item.display_map': '지도 표시',
2390
2425
  };
@@ -2387,4 +2387,39 @@ export const nl: BuilderMessages = {
2387
2387
  'dbu.changed_since_drop': 'De statements zijn veranderd sinds u ze controleerde: controleer ze opnieuw.',
2388
2388
  'dbu.tick_box': 'Vink het vakje aan om de objecten van {name} te verwijderen, of wijs ze toe.',
2389
2389
  'dbu.dropped': 'Rol {name} verwijderd.',
2390
+ // ------------------------------------------------------------ server-side conditions in words (sprint 154)
2391
+ 'cond.sql': 'Als de SQL-expressie waar is',
2392
+ 'cond.exists': 'Als de query een rij oplevert',
2393
+ 'cond.not_exists': 'Als de query geen rijen oplevert',
2394
+ 'cond.function_body': 'Als de functiebody true teruggeeft',
2395
+ 'cond.item_null': 'Als {item} leeg is',
2396
+ 'cond.item_not_null': 'Als {item} niet leeg is',
2397
+ 'cond.item_zero': 'Als {item} nul is',
2398
+ 'cond.item_not_zero': 'Als {item} niet nul is',
2399
+ 'cond.item_null_or_zero': 'Als {item} leeg of nul is',
2400
+ 'cond.item_not_null_or_zero': 'Als {item} niet leeg en niet nul is',
2401
+ 'cond.item_equals': 'Als {item} gelijk is aan {value}',
2402
+ 'cond.item_not_equals': 'Als {item} niet gelijk is aan {value}',
2403
+ 'cond.item_equals_item': 'Als {item} gelijk is aan {value}',
2404
+ 'cond.item_not_equals_item': 'Als {item} verschilt van {value}',
2405
+ 'cond.item_in_list': 'Als {item} een van {value} is',
2406
+ 'cond.item_not_in_list': 'Als {item} geen van {value} is',
2407
+ 'cond.request_in': 'Als de request {value} is',
2408
+ 'cond.request_not_in': 'Als de request niet {value} is',
2409
+ 'cond.page_in': 'Op pagina {value}',
2410
+ 'cond.page_not_in': 'Niet op pagina {value}',
2411
+ 'cond.page_is_dialog': 'Als de pagina een modaal dialoogvenster is',
2412
+ 'cond.page_is_not_dialog': 'Als de pagina geen modaal dialoogvenster is',
2413
+ 'cond.user_signed_in': 'Als de gebruiker is aangemeld',
2414
+ 'cond.user_public': 'Als de gebruiker niet is aangemeld',
2415
+ 'cond.language_in': 'Als de taal {value} is',
2416
+ 'cond.language_not_in': 'Als de taal niet {value} is',
2417
+ 'cond.always': 'Altijd',
2418
+ 'cond.never': 'Nooit',
2419
+ // ------------------------------------------------------------ gallery: sprint 158 and 160 types
2420
+ 'gallery.region.workflow_diagram': 'Workflowdiagram',
2421
+ 'gallery.item.image_upload': 'Afbeelding uploaden',
2422
+ 'gallery.item.autocomplete': 'Tekstveld met automatisch aanvullen',
2423
+ 'gallery.item.percent_graph': 'Percentagegrafiek',
2424
+ 'gallery.item.display_map': 'Kaart weergeven',
2390
2425
  };
@@ -2387,4 +2387,39 @@ export const pt: BuilderMessages = {
2387
2387
  'dbu.changed_since_drop': 'As instruções mudaram desde que você as revisou: revise-as de novo.',
2388
2388
  'dbu.tick_box': 'Marque a caixa para excluir os objetos que {name} possui, ou reatribua-os.',
2389
2389
  'dbu.dropped': 'Função {name} excluída.',
2390
+ // ------------------------------------------------------------ server-side conditions in words (sprint 154)
2391
+ 'cond.sql': 'Quando a expressão SQL é verdadeira',
2392
+ 'cond.exists': 'Quando a consulta retorna uma linha',
2393
+ 'cond.not_exists': 'Quando a consulta não retorna linhas',
2394
+ 'cond.function_body': 'Quando o corpo da função retorna true',
2395
+ 'cond.item_null': 'Quando {item} está vazio',
2396
+ 'cond.item_not_null': 'Quando {item} não está vazio',
2397
+ 'cond.item_zero': 'Quando {item} é zero',
2398
+ 'cond.item_not_zero': 'Quando {item} não é zero',
2399
+ 'cond.item_null_or_zero': 'Quando {item} está vazio ou é zero',
2400
+ 'cond.item_not_null_or_zero': 'Quando {item} não está vazio nem é zero',
2401
+ 'cond.item_equals': 'Quando {item} é {value}',
2402
+ 'cond.item_not_equals': 'Quando {item} não é {value}',
2403
+ 'cond.item_equals_item': 'Quando {item} é igual a {value}',
2404
+ 'cond.item_not_equals_item': 'Quando {item} é diferente de {value}',
2405
+ 'cond.item_in_list': 'Quando {item} é um de {value}',
2406
+ 'cond.item_not_in_list': 'Quando {item} não é nenhum de {value}',
2407
+ 'cond.request_in': 'Quando a solicitação é {value}',
2408
+ 'cond.request_not_in': 'Quando a solicitação não é {value}',
2409
+ 'cond.page_in': 'Na página {value}',
2410
+ 'cond.page_not_in': 'Fora da página {value}',
2411
+ 'cond.page_is_dialog': 'Quando a página é uma caixa de diálogo modal',
2412
+ 'cond.page_is_not_dialog': 'Quando a página não é uma caixa de diálogo modal',
2413
+ 'cond.user_signed_in': 'Quando o usuário está conectado',
2414
+ 'cond.user_public': 'Quando o usuário não está conectado',
2415
+ 'cond.language_in': 'Quando o idioma é {value}',
2416
+ 'cond.language_not_in': 'Quando o idioma não é {value}',
2417
+ 'cond.always': 'Sempre',
2418
+ 'cond.never': 'Nunca',
2419
+ // ------------------------------------------------------------ gallery: sprint 158 and 160 types
2420
+ 'gallery.region.workflow_diagram': 'Diagrama de fluxo de trabalho',
2421
+ 'gallery.item.image_upload': 'Carregamento de imagem',
2422
+ 'gallery.item.autocomplete': 'Campo de texto com preenchimento automático',
2423
+ 'gallery.item.percent_graph': 'Gráfico de percentagem',
2424
+ 'gallery.item.display_map': 'Mostrar mapa',
2390
2425
  };
@@ -2387,4 +2387,39 @@ export const zhCN: BuilderMessages = {
2387
2387
  'dbu.changed_since_drop': '自您审核以来语句已更改:请再次审核。',
2388
2388
  'dbu.tick_box': '勾选此框以删除 {name} 拥有的对象,或重新分配它们。',
2389
2389
  'dbu.dropped': '已删除角色 {name}。',
2390
+ // ------------------------------------------------------------ server-side conditions in words (sprint 154)
2391
+ 'cond.sql': '当 SQL 表达式为真时',
2392
+ 'cond.exists': '当查询返回行时',
2393
+ 'cond.not_exists': '当查询不返回行时',
2394
+ 'cond.function_body': '当函数体返回 true 时',
2395
+ 'cond.item_null': '当 {item} 为空时',
2396
+ 'cond.item_not_null': '当 {item} 不为空时',
2397
+ 'cond.item_zero': '当 {item} 为零时',
2398
+ 'cond.item_not_zero': '当 {item} 不为零时',
2399
+ 'cond.item_null_or_zero': '当 {item} 为空或为零时',
2400
+ 'cond.item_not_null_or_zero': '当 {item} 既不为空也不为零时',
2401
+ 'cond.item_equals': '当 {item} 等于 {value} 时',
2402
+ 'cond.item_not_equals': '当 {item} 不等于 {value} 时',
2403
+ 'cond.item_equals_item': '当 {item} 等于 {value} 时',
2404
+ 'cond.item_not_equals_item': '当 {item} 不同于 {value} 时',
2405
+ 'cond.item_in_list': '当 {item} 是 {value} 之一时',
2406
+ 'cond.item_not_in_list': '当 {item} 不是 {value} 中的任何一个时',
2407
+ 'cond.request_in': '当请求为 {value} 时',
2408
+ 'cond.request_not_in': '当请求不是 {value} 时',
2409
+ 'cond.page_in': '在页面 {value} 上',
2410
+ 'cond.page_not_in': '不在页面 {value} 上',
2411
+ 'cond.page_is_dialog': '当页面为模式对话框时',
2412
+ 'cond.page_is_not_dialog': '当页面不是模式对话框时',
2413
+ 'cond.user_signed_in': '当用户已登录时',
2414
+ 'cond.user_public': '当用户未登录时',
2415
+ 'cond.language_in': '当语言为 {value} 时',
2416
+ 'cond.language_not_in': '当语言不是 {value} 时',
2417
+ 'cond.always': '始终',
2418
+ 'cond.never': '从不',
2419
+ // ------------------------------------------------------------ gallery: sprint 158 and 160 types
2420
+ 'gallery.region.workflow_diagram': '工作流图',
2421
+ 'gallery.item.image_upload': '图像上传',
2422
+ 'gallery.item.autocomplete': '带自动完成的文本字段',
2423
+ 'gallery.item.percent_graph': '百分比图',
2424
+ 'gallery.item.display_map': '显示地图',
2390
2425
  };
@@ -2387,4 +2387,39 @@ export const zhTW: BuilderMessages = {
2387
2387
  'dbu.changed_since_drop': '自您審核以來陳述式已變更:請再次審核。',
2388
2388
  'dbu.tick_box': '勾選此方塊以捨棄 {name} 擁有的物件,或重新指派它們。',
2389
2389
  'dbu.dropped': '已捨棄角色 {name}。',
2390
+ // ------------------------------------------------------------ server-side conditions in words (sprint 154)
2391
+ 'cond.sql': '當 SQL 運算式為真時',
2392
+ 'cond.exists': '當查詢傳回列時',
2393
+ 'cond.not_exists': '當查詢未傳回列時',
2394
+ 'cond.function_body': '當函數主體傳回 true 時',
2395
+ 'cond.item_null': '當 {item} 為空時',
2396
+ 'cond.item_not_null': '當 {item} 不為空時',
2397
+ 'cond.item_zero': '當 {item} 為零時',
2398
+ 'cond.item_not_zero': '當 {item} 不為零時',
2399
+ 'cond.item_null_or_zero': '當 {item} 為空或為零時',
2400
+ 'cond.item_not_null_or_zero': '當 {item} 既不為空也不為零時',
2401
+ 'cond.item_equals': '當 {item} 等於 {value} 時',
2402
+ 'cond.item_not_equals': '當 {item} 不等於 {value} 時',
2403
+ 'cond.item_equals_item': '當 {item} 等於 {value} 時',
2404
+ 'cond.item_not_equals_item': '當 {item} 不同於 {value} 時',
2405
+ 'cond.item_in_list': '當 {item} 是 {value} 之一時',
2406
+ 'cond.item_not_in_list': '當 {item} 不是 {value} 中的任何一個時',
2407
+ 'cond.request_in': '當要求為 {value} 時',
2408
+ 'cond.request_not_in': '當要求不是 {value} 時',
2409
+ 'cond.page_in': '在頁面 {value} 上',
2410
+ 'cond.page_not_in': '不在頁面 {value} 上',
2411
+ 'cond.page_is_dialog': '當頁面為強制回應對話方塊時',
2412
+ 'cond.page_is_not_dialog': '當頁面不是強制回應對話方塊時',
2413
+ 'cond.user_signed_in': '當使用者已登入時',
2414
+ 'cond.user_public': '當使用者未登入時',
2415
+ 'cond.language_in': '當語言為 {value} 時',
2416
+ 'cond.language_not_in': '當語言不是 {value} 時',
2417
+ 'cond.always': '永遠',
2418
+ 'cond.never': '永不',
2419
+ // ------------------------------------------------------------ gallery: sprint 158 and 160 types
2420
+ 'gallery.region.workflow_diagram': '工作流程圖',
2421
+ 'gallery.item.image_upload': '影像上傳',
2422
+ 'gallery.item.autocomplete': '具自動完成的文字欄位',
2423
+ 'gallery.item.percent_graph': '百分比圖',
2424
+ 'gallery.item.display_map': '顯示地圖',
2390
2425
  };
@@ -7,6 +7,7 @@
7
7
  const GUIDE = 'https://pgkiln.vargar.eu/docs';
8
8
 
9
9
  export const REGION_CONFIG_HELP: [string[], string][] = [
10
+ [['workflow_diagram'], '{"instance_item": "P9_WORKFLOW_ID"}: the item holding the workflow instance to draw (only instances the user started or administers; sprint 160)'],
10
11
  [['report'], '{"page_size":15,"pagination":"range" (rows X–Y without a total),"keyset":["id"] (with range: Next/Previous seek on these unique columns),"max_rows":10000,"searchable":true,"sortable":true,"interactive":true,"mobile":"reflow"|"scroll","hidden":["col"],"headings":{"col":"Label"},"link":{"column":"id","page":3,"items":{"P3_ID":"#id#"}},"empty":"No rows","pdf":{"layout":"NAME","columns":["col"],"widths":{"col":40},"align":{"col":"right"}}} (pdf widths in mm; layouts under Shared Components → Report layouts)'],
11
12
  [['report', 'classic_report', 'grid', 'cards'], '{"formats":{"sal":"FML999G990D00","hiredate":"DD-MON-YYYY"}} (number or date format masks per column)'],
12
13
  [['chart'], '{"kind":"bar"|"column"|"line"|"area"|"donut","max_rows":1000,"format_mask":"FML999G990"}'],
@@ -59,6 +60,7 @@ const ANCHORS: Record<string, string> = {
59
60
  plugin: 'plug-ins-with-their-own-code',
60
61
  tasks: 'approvals-and-the-task-list',
61
62
  workflows: 'workflows',
63
+ workflow_diagram: 'workflow-diagram-region',
62
64
  login: 'the-login-page',
63
65
  classic_report: 'classic_report-classic-report',
64
66
  breadcrumb: 'breadcrumb-and-help_text',
@@ -73,7 +75,7 @@ export function regionConfigHelp(type: string | null | undefined): { text: strin
73
75
  if (!type) return { text: ALL_REGION_CONFIG_HELP, url: null };
74
76
  const own = REGION_CONFIG_HELP.filter(([types]) => types.includes(type)).map(([, text]) => text);
75
77
  const any = REGION_CONFIG_HELP.filter(([types]) => types.includes('*')).map(([, text]) => `any region: ${text}`);
76
- const chapter = type === 'tasks' || type === 'workflows' ? 'processing' : type === 'login' ? 'security' : 'pages-and-regions';
78
+ const chapter = type === 'tasks' || type === 'workflows' || type === 'workflow_diagram' ? 'processing' : type === 'login' ? 'security' : 'pages-and-regions';
77
79
  return {
78
80
  text: [...own, ...any].join(' · ') || 'No attributes of its own.',
79
81
  url: ANCHORS[type] ? `${GUIDE}/${chapter}#${ANCHORS[type]}` : null,
@@ -1,3 +1,4 @@
1
+ import { shapeStyle } from '../runtime/maps.ts';
1
2
  import type { FastifyInstance } from 'fastify';
2
3
  import { aiFilterSettingsForm, assistantSettingsForm } from './assistant.ts';
3
4
  import { designSql } from './websources.ts';
@@ -398,6 +399,25 @@ export function mergeWorkflowsSettings(config: Config, b: Body): Config {
398
399
  return out;
399
400
  }
400
401
 
402
+ // (159, CD-6) a map layer's kind and the style of a lines / polygons / extruded layer
403
+ const LAYER_KINDS = new Set(['heat', 'lines', 'polygons', 'extruded']);
404
+ function mergeStyle(b: Body, p: string): Config | undefined {
405
+ const s = shapeStyle({ fill_color: b[`${p}_fill_color`]?.trim() || undefined, stroke_color: b[`${p}_stroke_color`]?.trim() || undefined,
406
+ stroke_width: b[`${p}_stroke_width`]?.trim() ? Number(b[`${p}_stroke_width`]) : undefined, opacity: b[`${p}_opacity`]?.trim() ? Number(b[`${p}_opacity`]) : undefined });
407
+ return Object.keys(s).length ? (s as Config) : undefined;
408
+ }
409
+ function styleFields(id: (n: string) => string, p: string, st: Config | undefined) {
410
+ const s = (st ?? {}) as Config;
411
+ return html`<div class="field"><label class="label" for="${id(`${p}_fill_color`)}">Fill colour (lines / polygons)</label>
412
+ <input id="${id(`${p}_fill_color`)}" name="${p}_fill_color" value="${s.fill_color ?? ''}" placeholder="#2e5c8a" pattern="#[0-9a-fA-F]{6}"></div>
413
+ <div class="field"><label class="label" for="${id(`${p}_stroke_color`)}">Line colour</label>
414
+ <input id="${id(`${p}_stroke_color`)}" name="${p}_stroke_color" value="${s.stroke_color ?? ''}" placeholder="#1b2230" pattern="#[0-9a-fA-F]{6}"></div>
415
+ <div class="field"><label class="label" for="${id(`${p}_stroke_width`)}">Line width</label>
416
+ <input id="${id(`${p}_stroke_width`)}" name="${p}_stroke_width" type="number" min="0" max="20" step="0.5" value="${s.stroke_width ?? ''}"></div>
417
+ <div class="field"><label class="label" for="${id(`${p}_opacity`)}">Opacity (0–1)</label>
418
+ <input id="${id(`${p}_opacity`)}" name="${p}_opacity" type="number" min="0" max="1" step="0.05" value="${s.opacity ?? ''}"></div>`;
419
+ }
420
+
401
421
  export function mergeMapSettings(config: Config, b: Body, a: Allowed): Config {
402
422
  const out = { ...config };
403
423
  const set = setter(out);
@@ -406,8 +426,9 @@ export function mergeMapSettings(config: Config, b: Body, a: Allowed): Config {
406
426
  set('zoom', b.zoom && Number.isInteger(zoom) && zoom >= 1 && zoom <= 19 ? zoom : undefined);
407
427
  set('empty', b.empty?.trim() || undefined);
408
428
  set('link', mergeLink(b, a.pages));
409
- set('layer', b.layer === 'heat' ? 'heat' : undefined);
410
- set('cluster', b.cluster === 'true' && b.layer !== 'heat' && b.load !== 'tiles' ? true : undefined);
429
+ set('layer', LAYER_KINDS.has(b.layer ?? '') ? b.layer : undefined);
430
+ set('cluster', b.cluster === 'true' && !b.layer && b.load !== 'tiles' ? true : undefined);
431
+ set('style', mergeStyle(b, 'style'));
411
432
  set('name', b.name?.trim().slice(0, 60) || undefined);
412
433
  set('visible_area', b.load === 'area' ? true : undefined);
413
434
  set('tiles', b.load === 'tiles' ? true : undefined);
@@ -422,8 +443,10 @@ export function mergeMapSettings(config: Config, b: Body, a: Allowed): Config {
422
443
  if (!source) continue;
423
444
  const layer: Config = { name: b[`layer${i}_name`]?.trim().slice(0, 60) || `Layer ${layers.length + 2}`, source };
424
445
  const load = b[`layer${i}_load`];
425
- if (b[`layer${i}_layer`] === 'heat') layer.layer = 'heat';
446
+ if (LAYER_KINDS.has(b[`layer${i}_layer`] ?? '')) layer.layer = b[`layer${i}_layer`];
426
447
  else if (b[`layer${i}_cluster`] === 'true' && load !== 'tiles') layer.cluster = true;
448
+ const style = mergeStyle(b, `layer${i}`);
449
+ if (style) layer.style = style;
427
450
  if (b[`layer${i}_hidden`] === 'true') layer.hidden = true;
428
451
  if (load === 'area') layer.visible_area = true;
429
452
  else if (load === 'tiles') layer.tiles = true;
@@ -572,7 +595,8 @@ async function mapLayersFieldsets(cfg: Config, appId: number, allPages: { page_n
572
595
  <div class="field"><label class="label" for="${id(`${p}_name`)}">Name (legend)</label>
573
596
  <input id="${id(`${p}_name`)}" name="${p}_name" value="${l.name ?? ''}" maxlength="60"></div>
574
597
  <div class="field"><label class="label" for="${id(`${p}_layer`)}">Show places as</label>
575
- <select id="${id(`${p}_layer`)}" name="${p}_layer">${opt('', 'Markers', l.layer)}${opt('heat', 'Heat map', l.layer)}</select></div>
598
+ <select id="${id(`${p}_layer`)}" name="${p}_layer">${opt('', 'Markers', l.layer)}${opt('heat', 'Heat map', l.layer)}${opt('lines', 'Lines', l.layer)}${opt('polygons', 'Polygons', l.layer)}${opt('extruded', 'Extruded polygons (shaded by height)', l.layer)}</select></div>
599
+ ${styleFields(id, p, l.style)}
576
600
  ${loadField(id, `${p}_load`, l)}
577
601
  ${check(`${p}_cluster`, 'Group close markers', l.cluster === true)}
578
602
  ${check(`${p}_hidden`, 'Off at first', l.hidden === true)}
@@ -822,7 +846,8 @@ export async function regionSettingsForm(pageId: number, appId: number, r: Regio
822
846
  <p class="muted u-mt0">Each row is a marker at <code>lat</code>, <code>lng</code> (or <code>location</code> as "lat,lng"), with <code>title</code> and <code>body</code> in its popup; a <code>geojson</code> column draws lines and areas (with PostGIS installed, a <code>geometry</code> or <code>geography</code> column in WGS 84 works too). A heat map weighs each place by a <code>weight</code> column.</p>
823
847
  <fieldset class="prop-group"><legend>Appearance</legend><div class="form-grid">
824
848
  <div class="field"><label class="label" for="${id('layer')}">Show places as</label>
825
- <select id="${id('layer')}" name="layer">${opt('', 'Markers', cfg.layer)}${opt('heat', 'Heat map', cfg.layer)}</select></div>
849
+ <select id="${id('layer')}" name="layer">${opt('', 'Markers', cfg.layer)}${opt('heat', 'Heat map', cfg.layer)}${opt('lines', 'Lines', cfg.layer)}${opt('polygons', 'Polygons', cfg.layer)}${opt('extruded', 'Extruded polygons (shaded by height)', cfg.layer)}</select></div>
850
+ ${styleFields(id, 'style', cfg.style)}
826
851
  <div class="field"><label class="label" for="${id('name')}">Layer name (legend)</label>
827
852
  <input id="${id('name')}" name="name" value="${cfg.name ?? ''}" maxlength="60" placeholder="the region title"></div>
828
853
  <div class="field"><label class="label" for="${id('height')}">Height</label>
package/src/i18n/ar.ts CHANGED
@@ -676,6 +676,11 @@ export const ar: Record<MessageKey, string> = {
676
676
  'process.queued': "بدأ في الخلفية (المهمة {id}).",
677
677
  'process.background_type': "لا يمكن تشغيل العملية «{name}» ({type}) في الخلفية.",
678
678
  'workflow.started': "بدأ مسار العمل {id}.",
679
+ 'process.no_geocoder': 'لم يُعدّ أي محدِّد مواقع جغرافية لهذا التثبيت.',
680
+ 'process.address_not_found': 'لم يُعثر على مكان لـ "{address}".',
681
+ 'process.task_created': 'تم إنشاء المهمة {id}.',
682
+ 'item.map_of': 'خريطة {position}',
683
+ 'process.no_task': 'لا توجد مهمة للتعامل معها.',
679
684
  'workflow.terminated': "أُنهي مسار العمل {id}.",
680
685
  'workflow.retried': "يعمل مسار العمل {id} من جديد.",
681
686
  'workflow.no_instance': "لم يُحدد أي مسار عمل.",
package/src/i18n/cs.ts CHANGED
@@ -676,6 +676,11 @@ export const cs: Record<MessageKey, string> = {
676
676
  'process.queued': "Spuštěno na pozadí (úloha {id}).",
677
677
  'process.background_type': "Proces „{name}“ ({type}) nemůže běžet na pozadí.",
678
678
  'workflow.started': "Pracovní postup {id} byl spuštěn.",
679
+ 'process.no_geocoder': 'Tato instalace nemá nastavený geokodér.',
680
+ 'process.address_not_found': 'Pro „{address}“ nebylo nalezeno žádné místo.',
681
+ 'process.task_created': 'Úkol {id} byl vytvořen.',
682
+ 'item.map_of': 'Mapa: {position}',
683
+ 'process.no_task': 'Žádný úkol ke zpracování.',
679
684
  'workflow.terminated': "Pracovní postup {id} byl ukončen.",
680
685
  'workflow.retried': "Pracovní postup {id} běží znovu.",
681
686
  'workflow.no_instance': "Není vybrán žádný pracovní postup.",
package/src/i18n/da.ts CHANGED
@@ -676,6 +676,11 @@ export const da: Record<MessageKey, string> = {
676
676
  'process.queued': "Startet i baggrunden (job {id}).",
677
677
  'process.background_type': "Processen “{name}” ({type}) kan ikke køre i baggrunden.",
678
678
  'workflow.started': "Arbejdsgang {id} er startet.",
679
+ 'process.no_geocoder': 'Denne installation har ingen geokoder.',
680
+ 'process.address_not_found': 'Intet sted fundet for "{address}".',
681
+ 'process.task_created': 'Opgave {id} er oprettet.',
682
+ 'item.map_of': 'Kort over {position}',
683
+ 'process.no_task': 'Ingen opgave at behandle.',
679
684
  'workflow.terminated': "Arbejdsgang {id} er afsluttet.",
680
685
  'workflow.retried': "Arbejdsgang {id} kører igen.",
681
686
  'workflow.no_instance': "Ingen arbejdsgang er valgt.",
package/src/i18n/de.ts CHANGED
@@ -686,6 +686,11 @@ export const de: Record<MessageKey, string> = {
686
686
  'process.queued': 'Im Hintergrund gestartet (Job {id}).',
687
687
  'process.background_type': 'Der Prozess "{name}" ({type}) kann nicht im Hintergrund laufen.',
688
688
  'workflow.started': 'Workflow {id} gestartet.',
689
+ 'process.no_geocoder': 'Für diese Installation ist kein Geocoder eingerichtet.',
690
+ 'process.address_not_found': 'Kein Ort für „{address}“ gefunden.',
691
+ 'process.task_created': 'Aufgabe {id} wurde erstellt.',
692
+ 'item.map_of': 'Karte von {position}',
693
+ 'process.no_task': 'Keine Aufgabe zum Bearbeiten.',
689
694
  'workflow.terminated': 'Workflow {id} beendet.',
690
695
  'workflow.retried': 'Workflow {id} läuft wieder.',
691
696
  'workflow.no_instance': 'Es ist kein Workflow ausgewählt.',
package/src/i18n/el.ts CHANGED
@@ -676,6 +676,11 @@ export const el: Record<MessageKey, string> = {
676
676
  'process.queued': "Ξεκίνησε στο παρασκήνιο (εργασία {id}).",
677
677
  'process.background_type': "Η διαδικασία «{name}» ({type}) δεν μπορεί να εκτελεστεί στο παρασκήνιο.",
678
678
  'workflow.started': "Η ροή εργασίας {id} ξεκίνησε.",
679
+ 'process.no_geocoder': 'Δεν έχει ρυθμιστεί γεωκωδικοποιητής για αυτή την εγκατάσταση.',
680
+ 'process.address_not_found': 'Δεν βρέθηκε τοποθεσία για «{address}».',
681
+ 'process.task_created': 'Η εργασία {id} δημιουργήθηκε.',
682
+ 'item.map_of': 'Χάρτης του {position}',
683
+ 'process.no_task': 'Δεν υπάρχει εργασία για ενέργεια.',
679
684
  'workflow.terminated': "Η ροή εργασίας {id} τερματίστηκε.",
680
685
  'workflow.retried': "Η ροή εργασίας {id} εκτελείται ξανά.",
681
686
  'workflow.no_instance': "Δεν έχει επιλεγεί ροή εργασίας.",
package/src/i18n/es.ts CHANGED
@@ -686,6 +686,11 @@ export const es: Record<MessageKey, string> = {
686
686
  'process.queued': 'Iniciado en segundo plano (trabajo {id}).',
687
687
  'process.background_type': 'El proceso "{name}" ({type}) no se puede ejecutar en segundo plano.',
688
688
  'workflow.started': 'Flujo de trabajo {id} iniciado.',
689
+ 'process.no_geocoder': 'Esta instalación no tiene un geocodificador configurado.',
690
+ 'process.address_not_found': 'No se encontró ningún lugar para "{address}".',
691
+ 'process.task_created': 'Tarea {id} creada.',
692
+ 'item.map_of': 'Mapa de {position}',
693
+ 'process.no_task': 'No hay ninguna tarea sobre la que actuar.',
689
694
  'workflow.terminated': 'Flujo de trabajo {id} terminado.',
690
695
  'workflow.retried': 'El flujo de trabajo {id} se está ejecutando de nuevo.',
691
696
  'workflow.no_instance': 'No hay ningún flujo de trabajo seleccionado.',
package/src/i18n/fi.ts CHANGED
@@ -676,6 +676,11 @@ export const fi: Record<MessageKey, string> = {
676
676
  'process.queued': "Käynnistetty taustalla (työ {id}).",
677
677
  'process.background_type': "Prosessia ”{name}” ({type}) ei voi suorittaa taustalla.",
678
678
  'workflow.started': "Työnkulku {id} käynnistetty.",
679
+ 'process.no_geocoder': 'Tälle asennukselle ei ole määritetty geokoodaajaa.',
680
+ 'process.address_not_found': 'Paikkaa ei löytynyt haulle "{address}".',
681
+ 'process.task_created': 'Tehtävä {id} luotiin.',
682
+ 'item.map_of': 'Kartta: {position}',
683
+ 'process.no_task': 'Ei käsiteltävää tehtävää.',
679
684
  'workflow.terminated': "Työnkulku {id} lopetettu.",
680
685
  'workflow.retried': "Työnkulku {id} on taas käynnissä.",
681
686
  'workflow.no_instance': "Työnkulkua ei ole valittu.",
package/src/i18n/fr.ts CHANGED
@@ -686,6 +686,11 @@ export const fr: Record<MessageKey, string> = {
686
686
  'process.queued': 'Démarré en arrière-plan (tâche {id}).',
687
687
  'process.background_type': 'Le processus « {name} » ({type}) ne peut pas s’exécuter en arrière-plan.',
688
688
  'workflow.started': 'Workflow {id} démarré.',
689
+ 'process.no_geocoder': 'Aucun géocodeur n\'est configuré pour cette installation.',
690
+ 'process.address_not_found': 'Aucun lieu trouvé pour « {address} ».',
691
+ 'process.task_created': 'Tâche {id} créée.',
692
+ 'item.map_of': 'Carte de {position}',
693
+ 'process.no_task': 'Aucune tâche à traiter.',
689
694
  'workflow.terminated': 'Workflow {id} arrêté.',
690
695
  'workflow.retried': 'Workflow {id} relancé.',
691
696
  'workflow.no_instance': 'Aucun workflow n’est sélectionné.',
package/src/i18n/he.ts CHANGED
@@ -676,6 +676,11 @@ export const he: Record<MessageKey, string> = {
676
676
  'process.queued': "הופעל ברקע (עבודה {id}).",
677
677
  'process.background_type': "התהליך \"{name}\" ({type}) אינו יכול לפעול ברקע.",
678
678
  'workflow.started': "תהליך העבודה {id} הופעל.",
679
+ 'process.no_geocoder': 'לא הוגדר מקודד גאוגרפי בהתקנה זו.',
680
+ 'process.address_not_found': 'לא נמצא מקום עבור "{address}".',
681
+ 'process.task_created': 'המשימה {id} נוצרה.',
682
+ 'item.map_of': 'מפה של {position}',
683
+ 'process.no_task': 'אין משימה לטיפול.',
679
684
  'workflow.terminated': "תהליך העבודה {id} הופסק.",
680
685
  'workflow.retried': "תהליך העבודה {id} פועל שוב.",
681
686
  'workflow.no_instance': "לא נבחר תהליך עבודה.",
package/src/i18n/it.ts CHANGED
@@ -676,6 +676,11 @@ export const it: Record<MessageKey, string> = {
676
676
  'process.queued': "Avviato in background (job {id}).",
677
677
  'process.background_type': "Il processo “{name}” ({type}) non può essere eseguito in background.",
678
678
  'workflow.started': "Workflow {id} avviato.",
679
+ 'process.no_geocoder': 'Nessun geocodificatore configurato per questa installazione.',
680
+ 'process.address_not_found': 'Nessun luogo trovato per "{address}".',
681
+ 'process.task_created': 'Attività {id} creata.',
682
+ 'item.map_of': 'Mappa di {position}',
683
+ 'process.no_task': 'Nessuna attività da gestire.',
679
684
  'workflow.terminated': "Workflow {id} terminato.",
680
685
  'workflow.retried': "Il workflow {id} è di nuovo in esecuzione.",
681
686
  'workflow.no_instance': "Nessun workflow selezionato.",
package/src/i18n/ja.ts CHANGED
@@ -676,6 +676,11 @@ export const ja: Record<MessageKey, string> = {
676
676
  'process.queued': "バックグラウンドで開始しました (ジョブ {id})。",
677
677
  'process.background_type': "プロセス「{name}」({type}) はバックグラウンドで実行できません。",
678
678
  'workflow.started': "ワークフロー {id} を開始しました。",
679
+ 'process.no_geocoder': 'このインストールにはジオコーダーが設定されていません。',
680
+ 'process.address_not_found': '「{address}」の場所が見つかりません。',
681
+ 'process.task_created': 'タスク {id} を作成しました。',
682
+ 'item.map_of': '{position} の地図',
683
+ 'process.no_task': '処理するタスクがありません。',
679
684
  'workflow.terminated': "ワークフロー {id} を終了しました。",
680
685
  'workflow.retried': "ワークフロー {id} を再実行しています。",
681
686
  'workflow.no_instance': "ワークフローが選択されていません。",
package/src/i18n/ko.ts CHANGED
@@ -676,6 +676,11 @@ export const ko: Record<MessageKey, string> = {
676
676
  'process.queued': "백그라운드에서 시작했습니다(작업 {id}).",
677
677
  'process.background_type': "프로세스 '{name}'({type})은(는) 백그라운드에서 실행할 수 없습니다.",
678
678
  'workflow.started': "워크플로 {id}을(를) 시작했습니다.",
679
+ 'process.no_geocoder': '이 설치에는 지오코더가 설정되어 있지 않습니다.',
680
+ 'process.address_not_found': '"{address}"에 대한 장소를 찾을 수 없습니다.',
681
+ 'process.task_created': '작업 {id}이(가) 생성되었습니다.',
682
+ 'item.map_of': '{position} 지도',
683
+ 'process.no_task': '처리할 작업이 없습니다.',
679
684
  'workflow.terminated': "워크플로 {id}을(를) 종료했습니다.",
680
685
  'workflow.retried': "워크플로 {id}이(가) 다시 실행 중입니다.",
681
686
  'workflow.no_instance': "선택한 워크플로가 없습니다.",
package/src/i18n/nb.ts CHANGED
@@ -676,6 +676,11 @@ export const nb: Record<MessageKey, string> = {
676
676
  'process.queued': "Startet i bakgrunnen (jobb {id}).",
677
677
  'process.background_type': "Prosessen «{name}» ({type}) kan ikke kjøre i bakgrunnen.",
678
678
  'workflow.started': "Arbeidsflyt {id} er startet.",
679
+ 'process.no_geocoder': 'Denne installasjonen har ingen geokoder.',
680
+ 'process.address_not_found': 'Fant ikke noe sted for «{address}».',
681
+ 'process.task_created': 'Oppgave {id} er opprettet.',
682
+ 'item.map_of': 'Kart over {position}',
683
+ 'process.no_task': 'Ingen oppgave å behandle.',
679
684
  'workflow.terminated': "Arbeidsflyt {id} er avsluttet.",
680
685
  'workflow.retried': "Arbeidsflyt {id} kjører igjen.",
681
686
  'workflow.no_instance': "Ingen arbeidsflyt er valgt.",