Browse Source

Translation status column. (#918)

pull/921/head
Sebastian Stehle 3 years ago
committed by GitHub
parent
commit
3621cf4833
No known key found for this signature in database GPG Key ID: 4AEE18F83AFDEB23
  1. 24
      backend/i18n/frontend_en.json
  2. 24
      backend/i18n/frontend_it.json
  3. 24
      backend/i18n/frontend_nl.json
  4. 24
      backend/i18n/frontend_zh.json
  5. 24
      backend/i18n/source/frontend_en.json
  6. 21
      backend/i18n/source/frontend_it.json
  7. 21
      backend/i18n/source/frontend_nl.json
  8. 21
      backend/i18n/source/frontend_zh.json
  9. 19
      backend/i18n/translator/Squidex.Translator/Processes/Helper.cs
  10. 5
      frontend/src/app/features/content/pages/content/references/content-references.component.html
  11. 2
      frontend/src/app/features/content/pages/contents/contents-page.component.html
  12. 8
      frontend/src/app/features/content/shared/list/content.component.html
  13. 10
      frontend/src/app/features/content/shared/list/content.component.ts
  14. 16
      frontend/src/app/features/content/shared/references/reference-item.component.html
  15. 9
      frontend/src/app/features/content/shared/references/reference-item.component.ts
  16. 1
      frontend/src/app/features/content/shared/references/references-editor.component.html
  17. 2
      frontend/src/app/features/settings/pages/plans/plans-page.component.html
  18. 16
      frontend/src/app/shared/components/contents/content-list-field.component.html
  19. 10
      frontend/src/app/shared/components/contents/content-list-field.component.ts
  20. 1
      frontend/src/app/shared/components/contents/translation-status.component.html
  21. 0
      frontend/src/app/shared/components/contents/translation-status.component.scss
  22. 54
      frontend/src/app/shared/components/contents/translation-status.component.ts
  23. 24
      frontend/src/app/shared/components/references/content-selector-item.component.html
  24. 5
      frontend/src/app/shared/components/references/content-selector-item.component.ts
  25. 1
      frontend/src/app/shared/components/references/content-selector.component.html
  26. 1
      frontend/src/app/shared/declarations.ts
  27. 4
      frontend/src/app/shared/module.ts
  28. 2
      frontend/src/app/shared/services/contents.service.ts
  29. 30
      frontend/src/app/shared/services/schemas.service.ts

24
backend/i18n/frontend_en.json

@ -85,7 +85,6 @@
"assets.fileTooBig": "Asset is too big.", "assets.fileTooBig": "Asset is too big.",
"assets.folderName": "Folder Name", "assets.folderName": "Folder Name",
"assets.folderNameHint": "The folder name is used as a display name and might not be unique.", "assets.folderNameHint": "The folder name is used as a display name and might not be unique.",
"assets.insertAssets": "Insert Assets",
"assets.linkSelected": "Link selected assets ({count})", "assets.linkSelected": "Link selected assets ({count})",
"assets.listPageTitle": "Assets", "assets.listPageTitle": "Assets",
"assets.loadFailed": "Failed to load assets. Please reload.", "assets.loadFailed": "Failed to load assets. Please reload.",
@ -265,6 +264,7 @@
"common.edit": "Edit", "common.edit": "Edit",
"common.editing": "Editing", "common.editing": "Editing",
"common.email": "Email", "common.email": "Email",
"common.empty": "No results.",
"common.enable": "Enable", "common.enable": "Enable",
"common.enabled": "Enabled", "common.enabled": "Enabled",
"common.error": "Error", "common.error": "Error",
@ -484,16 +484,6 @@
"contents.statusQueries": "Status Queries", "contents.statusQueries": "Status Queries",
"contents.stockPhotoSearch": "Search for Photos by Unsplash", "contents.stockPhotoSearch": "Search for Photos by Unsplash",
"contents.stockPhotoSearchEmpty": "Use the search bar above to find photos.", "contents.stockPhotoSearchEmpty": "Use the search bar above to find photos.",
"contents.tableHeaders.created": "Created",
"contents.tableHeaders.createdBy": "Created By",
"contents.tableHeaders.createdByShort": "By",
"contents.tableHeaders.id": "Id",
"contents.tableHeaders.lastModified": "Updated",
"contents.tableHeaders.lastModifiedBy": "Updated By",
"contents.tableHeaders.lastModifiedByShort": "By",
"contents.tableHeaders.nextStatus": "Next Status",
"contents.tableHeaders.status": "Status",
"contents.tableHeaders.version": "Version",
"contents.unpublishReferrerConfirmText": "The content is referenced by another published content item.\n\nDo you really want to unpublish this content?", "contents.unpublishReferrerConfirmText": "The content is referenced by another published content item.\n\nDo you really want to unpublish this content?",
"contents.unpublishReferrerConfirmTitle": "Unpublish content", "contents.unpublishReferrerConfirmTitle": "Unpublish content",
"contents.unsavedChangesText": "You have unsaved changes. Do you want to load them now?", "contents.unsavedChangesText": "You have unsaved changes. Do you want to load them now?",
@ -941,6 +931,18 @@
"schemas.synchronizeFailed": "Failed to synchronize schema. Please reload.", "schemas.synchronizeFailed": "Failed to synchronize schema. Please reload.",
"schemas.tabFields": "Fields", "schemas.tabFields": "Fields",
"schemas.tabJson": "Json", "schemas.tabJson": "Json",
"schemas.tableHeaders.created": "Created",
"schemas.tableHeaders.createdBy": "Created By",
"schemas.tableHeaders.createdByShort": "By",
"schemas.tableHeaders.id": "Id",
"schemas.tableHeaders.lastModified": "Updated",
"schemas.tableHeaders.lastModifiedBy": "Updated By",
"schemas.tableHeaders.lastModifiedByShort": "By",
"schemas.tableHeaders.nextStatus": "Next Status",
"schemas.tableHeaders.status": "Status",
"schemas.tableHeaders.translationStatus": "Translation Status",
"schemas.tableHeaders.translationStatusAverage": "Average Translation Status",
"schemas.tableHeaders.version": "Version",
"schemas.tabMore": "More", "schemas.tabMore": "More",
"schemas.tabScripts": "Scripts", "schemas.tabScripts": "Scripts",
"schemas.tabUI": "UI", "schemas.tabUI": "UI",

24
backend/i18n/frontend_it.json

@ -85,7 +85,6 @@
"assets.fileTooBig": "La risorsa è troppo grande.", "assets.fileTooBig": "La risorsa è troppo grande.",
"assets.folderName": "Nome della cartella", "assets.folderName": "Nome della cartella",
"assets.folderNameHint": "Il nome della cartella viene usato solo per la visualizzazione e può non essere univoco.", "assets.folderNameHint": "Il nome della cartella viene usato solo per la visualizzazione e può non essere univoco.",
"assets.insertAssets": "Inserisci le risorse",
"assets.linkSelected": "Collega le risorse selezionate ({count})", "assets.linkSelected": "Collega le risorse selezionate ({count})",
"assets.listPageTitle": "Risorse", "assets.listPageTitle": "Risorse",
"assets.loadFailed": "Non è stato possibile caricare le risorse. Per favore ricarica.", "assets.loadFailed": "Non è stato possibile caricare le risorse. Per favore ricarica.",
@ -265,6 +264,7 @@
"common.edit": "Modifica", "common.edit": "Modifica",
"common.editing": "Editing", "common.editing": "Editing",
"common.email": "Email", "common.email": "Email",
"common.empty": "No results.",
"common.enable": "Enable", "common.enable": "Enable",
"common.enabled": "Enabled", "common.enabled": "Enabled",
"common.error": "Errore", "common.error": "Errore",
@ -484,16 +484,6 @@
"contents.statusQueries": "Stato Query", "contents.statusQueries": "Stato Query",
"contents.stockPhotoSearch": "Cerca foto su Unsplash", "contents.stockPhotoSearch": "Cerca foto su Unsplash",
"contents.stockPhotoSearchEmpty": "Use the search bar above to find photos.", "contents.stockPhotoSearchEmpty": "Use the search bar above to find photos.",
"contents.tableHeaders.created": "Creato",
"contents.tableHeaders.createdBy": "Creato da",
"contents.tableHeaders.createdByShort": "Da",
"contents.tableHeaders.id": "Id",
"contents.tableHeaders.lastModified": "Modificato",
"contents.tableHeaders.lastModifiedBy": "Modificato da",
"contents.tableHeaders.lastModifiedByShort": "Da",
"contents.tableHeaders.nextStatus": "Stato successivo",
"contents.tableHeaders.status": "Stato",
"contents.tableHeaders.version": "Versione",
"contents.unpublishReferrerConfirmText": "Il contenuto è inserito come collegamento da un altro contenuto pubblicato.\n\nSei sicuro di volerlo rimuovere dalla pubblicazione?", "contents.unpublishReferrerConfirmText": "Il contenuto è inserito come collegamento da un altro contenuto pubblicato.\n\nSei sicuro di volerlo rimuovere dalla pubblicazione?",
"contents.unpublishReferrerConfirmTitle": "Rimuovi dalla pubblicazione il contenuto", "contents.unpublishReferrerConfirmTitle": "Rimuovi dalla pubblicazione il contenuto",
"contents.unsavedChangesText": "Non hai salvato le modifiche. Vuoi salvarle adesso?", "contents.unsavedChangesText": "Non hai salvato le modifiche. Vuoi salvarle adesso?",
@ -941,6 +931,18 @@
"schemas.synchronizeFailed": "Non è stato possibile sincronizzare lo schema. Per favore ricarica.", "schemas.synchronizeFailed": "Non è stato possibile sincronizzare lo schema. Per favore ricarica.",
"schemas.tabFields": "Campi", "schemas.tabFields": "Campi",
"schemas.tabJson": "Json", "schemas.tabJson": "Json",
"schemas.tableHeaders.created": "Creato",
"schemas.tableHeaders.createdBy": "Creato da",
"schemas.tableHeaders.createdByShort": "Da",
"schemas.tableHeaders.id": "Id",
"schemas.tableHeaders.lastModified": "Modificato",
"schemas.tableHeaders.lastModifiedBy": "Modificato da",
"schemas.tableHeaders.lastModifiedByShort": "Da",
"schemas.tableHeaders.nextStatus": "Stato successivo",
"schemas.tableHeaders.status": "Stato",
"schemas.tableHeaders.translationStatus": "Translation Status",
"schemas.tableHeaders.translationStatusAverage": "Average Translation Status",
"schemas.tableHeaders.version": "Versione",
"schemas.tabMore": "Altro", "schemas.tabMore": "Altro",
"schemas.tabScripts": "Script", "schemas.tabScripts": "Script",
"schemas.tabUI": "UI", "schemas.tabUI": "UI",

24
backend/i18n/frontend_nl.json

@ -85,7 +85,6 @@
"assets.fileTooBig": "Asset is te groot.", "assets.fileTooBig": "Asset is te groot.",
"assets.folderName": "Mapnaam", "assets.folderName": "Mapnaam",
"assets.folderNameHint": "De mapnaam wordt gebruikt als weergavenaam en mag niet uniek zijn.", "assets.folderNameHint": "De mapnaam wordt gebruikt als weergavenaam en mag niet uniek zijn.",
"assets.insertAssets": "Bestanden invoegen",
"assets.linkSelected": "Link geselecteerde items ({count})", "assets.linkSelected": "Link geselecteerde items ({count})",
"assets.listPageTitle": "Bestanden", "assets.listPageTitle": "Bestanden",
"assets.loadFailed": "Laden van bestanden is mislukt. Laad opnieuw.", "assets.loadFailed": "Laden van bestanden is mislukt. Laad opnieuw.",
@ -265,6 +264,7 @@
"common.edit": "Bewerken", "common.edit": "Bewerken",
"common.editing": "Bewerken", "common.editing": "Bewerken",
"common.email": "E-mail", "common.email": "E-mail",
"common.empty": "No results.",
"common.enable": "Aanzetten", "common.enable": "Aanzetten",
"common.enabled": "Aangezet", "common.enabled": "Aangezet",
"common.error": "Fout", "common.error": "Fout",
@ -484,16 +484,6 @@
"contents.statusQueries": "Statusquery's", "contents.statusQueries": "Statusquery's",
"contents.stockPhotoSearch": "Zoeken naar foto's op Unsplash", "contents.stockPhotoSearch": "Zoeken naar foto's op Unsplash",
"contents.stockPhotoSearchEmpty": "Use the search bar above to find photos.", "contents.stockPhotoSearchEmpty": "Use the search bar above to find photos.",
"contents.tableHeaders.created": "Gemaakt",
"contents.tableHeaders.createdBy": "Gemaakt door",
"contents.tableHeaders.createdByShort": "Door",
"contents.tableHeaders.id": "Id",
"contents.tableHeaders.lastModified": "Bijgewerkt",
"contents.tableHeaders.lastModifiedBy": "Bijgewerkt door",
"contents.tableHeaders.lastModifiedByShort": "Door",
"contents.tableHeaders.nextStatus": "Volgende status",
"contents.tableHeaders.status": "Status",
"contents.tableHeaders.version": "Versie",
"contents.unpublishReferrerConfirmText": "Er wordt naar de inhoud verwezen door een ander gepubliceerd inhoudsitem.\n\nWilt u de publicatie van deze inhoud echt ongedaan maken?", "contents.unpublishReferrerConfirmText": "Er wordt naar de inhoud verwezen door een ander gepubliceerd inhoudsitem.\n\nWilt u de publicatie van deze inhoud echt ongedaan maken?",
"contents.unpublishReferrerConfirmTitle": "Publicatie van inhoud ongedaan maken", "contents.unpublishReferrerConfirmTitle": "Publicatie van inhoud ongedaan maken",
"contents.unsavedChangesText": "Je hebt niet-opgeslagen wijzigingen. Wil je ze nu laden?", "contents.unsavedChangesText": "Je hebt niet-opgeslagen wijzigingen. Wil je ze nu laden?",
@ -941,6 +931,18 @@
"schemas.synchronizeFailed": "Synchroniseren van schema is mislukt. Laad opnieuw.", "schemas.synchronizeFailed": "Synchroniseren van schema is mislukt. Laad opnieuw.",
"schemas.tabFields": "Velden", "schemas.tabFields": "Velden",
"schemas.tabJson": "Json", "schemas.tabJson": "Json",
"schemas.tableHeaders.created": "Gemaakt",
"schemas.tableHeaders.createdBy": "Gemaakt door",
"schemas.tableHeaders.createdByShort": "Door",
"schemas.tableHeaders.id": "Id",
"schemas.tableHeaders.lastModified": "Bijgewerkt",
"schemas.tableHeaders.lastModifiedBy": "Bijgewerkt door",
"schemas.tableHeaders.lastModifiedByShort": "Door",
"schemas.tableHeaders.nextStatus": "Volgende status",
"schemas.tableHeaders.status": "Status",
"schemas.tableHeaders.translationStatus": "Translation Status",
"schemas.tableHeaders.translationStatusAverage": "Average Translation Status",
"schemas.tableHeaders.version": "Versie",
"schemas.tabMore": "Meer", "schemas.tabMore": "Meer",
"schemas.tabScripts": "Scripts", "schemas.tabScripts": "Scripts",
"schemas.tabUI": "UI", "schemas.tabUI": "UI",

24
backend/i18n/frontend_zh.json

@ -85,7 +85,6 @@
"assets.fileTooBig": "资源太大。", "assets.fileTooBig": "资源太大。",
"assets.folderName": "文件夹名称", "assets.folderName": "文件夹名称",
"assets.folderNameHint": "文件夹名称用作显示名称,不能唯一。", "assets.folderNameHint": "文件夹名称用作显示名称,不能唯一。",
"assets.insertAssets": "插入资源",
"assets.linkSelected": "链接选定的资源 ({count})", "assets.linkSelected": "链接选定的资源 ({count})",
"assets.listPageTitle": "资源", "assets.listPageTitle": "资源",
"assets.loadFailed": "资源加载失败,请重新加载。", "assets.loadFailed": "资源加载失败,请重新加载。",
@ -265,6 +264,7 @@
"common.edit": "编辑", "common.edit": "编辑",
"common.editing": "Editing", "common.editing": "Editing",
"common.email": "电子邮件", "common.email": "电子邮件",
"common.empty": "No results.",
"common.enable": "Enable", "common.enable": "Enable",
"common.enabled": "已启用", "common.enabled": "已启用",
"common.error": "错误", "common.error": "错误",
@ -484,16 +484,6 @@
"contents.statusQueries": "状态查询", "contents.statusQueries": "状态查询",
"contents.stockPhotoSearch": "通过 Unsplash 搜索照片", "contents.stockPhotoSearch": "通过 Unsplash 搜索照片",
"contents.stockPhotoSearchEmpty": "Use the search bar above to find photos.", "contents.stockPhotoSearchEmpty": "Use the search bar above to find photos.",
"contents.tableHeaders.created": "创建",
"contents.tableHeaders.createdBy": "创建者",
"contents.tableHeaders.createdByShort": "By",
"contents.tableHeaders.id": "Id",
"contents.tableHeaders.lastModified": "更新",
"contents.tableHeaders.lastModifiedBy": "更新者",
"contents.tableHeaders.lastModifiedByShort": "By",
"contents.tableHeaders.nextStatus": "下一个状态",
"contents.tableHeaders.status": "状态",
"contents.tableHeaders.version": "版本",
"contents.unpublishReferrerConfirmText": "该内容被另一个已发布的内容项引用。\n\n您真的要取消发布此内容吗?", "contents.unpublishReferrerConfirmText": "该内容被另一个已发布的内容项引用。\n\n您真的要取消发布此内容吗?",
"contents.unpublishReferrerConfirmTitle": "取消发布内容", "contents.unpublishReferrerConfirmTitle": "取消发布内容",
"contents.unsavedChangesText": "您有未保存的更改。要立即加载吗?", "contents.unsavedChangesText": "您有未保存的更改。要立即加载吗?",
@ -941,6 +931,18 @@
"schemas.synchronizeFailed": "同步Schemas失败。请重新加载。", "schemas.synchronizeFailed": "同步Schemas失败。请重新加载。",
"schemas.tabFields": "字段", "schemas.tabFields": "字段",
"schemas.tabJson": "Json", "schemas.tabJson": "Json",
"schemas.tableHeaders.created": "创建",
"schemas.tableHeaders.createdBy": "创建者",
"schemas.tableHeaders.createdByShort": "By",
"schemas.tableHeaders.id": "Id",
"schemas.tableHeaders.lastModified": "更新",
"schemas.tableHeaders.lastModifiedBy": "更新者",
"schemas.tableHeaders.lastModifiedByShort": "By",
"schemas.tableHeaders.nextStatus": "下一个状态",
"schemas.tableHeaders.status": "状态",
"schemas.tableHeaders.translationStatus": "Translation Status",
"schemas.tableHeaders.translationStatusAverage": "Average Translation Status",
"schemas.tableHeaders.version": "版本",
"schemas.tabMore": "More", "schemas.tabMore": "More",
"schemas.tabScripts": "Scripts", "schemas.tabScripts": "Scripts",
"schemas.tabUI": "UI", "schemas.tabUI": "UI",

24
backend/i18n/source/frontend_en.json

@ -85,7 +85,6 @@
"assets.fileTooBig": "Asset is too big.", "assets.fileTooBig": "Asset is too big.",
"assets.folderName": "Folder Name", "assets.folderName": "Folder Name",
"assets.folderNameHint": "The folder name is used as a display name and might not be unique.", "assets.folderNameHint": "The folder name is used as a display name and might not be unique.",
"assets.insertAssets": "Insert Assets",
"assets.linkSelected": "Link selected assets ({count})", "assets.linkSelected": "Link selected assets ({count})",
"assets.listPageTitle": "Assets", "assets.listPageTitle": "Assets",
"assets.loadFailed": "Failed to load assets. Please reload.", "assets.loadFailed": "Failed to load assets. Please reload.",
@ -265,6 +264,7 @@
"common.edit": "Edit", "common.edit": "Edit",
"common.editing": "Editing", "common.editing": "Editing",
"common.email": "Email", "common.email": "Email",
"common.empty": "No results.",
"common.enable": "Enable", "common.enable": "Enable",
"common.enabled": "Enabled", "common.enabled": "Enabled",
"common.error": "Error", "common.error": "Error",
@ -484,16 +484,6 @@
"contents.statusQueries": "Status Queries", "contents.statusQueries": "Status Queries",
"contents.stockPhotoSearch": "Search for Photos by Unsplash", "contents.stockPhotoSearch": "Search for Photos by Unsplash",
"contents.stockPhotoSearchEmpty": "Use the search bar above to find photos.", "contents.stockPhotoSearchEmpty": "Use the search bar above to find photos.",
"contents.tableHeaders.created": "Created",
"contents.tableHeaders.createdBy": "Created By",
"contents.tableHeaders.createdByShort": "By",
"contents.tableHeaders.id": "Id",
"contents.tableHeaders.lastModified": "Updated",
"contents.tableHeaders.lastModifiedBy": "Updated By",
"contents.tableHeaders.lastModifiedByShort": "By",
"contents.tableHeaders.nextStatus": "Next Status",
"contents.tableHeaders.status": "Status",
"contents.tableHeaders.version": "Version",
"contents.unpublishReferrerConfirmText": "The content is referenced by another published content item.\n\nDo you really want to unpublish this content?", "contents.unpublishReferrerConfirmText": "The content is referenced by another published content item.\n\nDo you really want to unpublish this content?",
"contents.unpublishReferrerConfirmTitle": "Unpublish content", "contents.unpublishReferrerConfirmTitle": "Unpublish content",
"contents.unsavedChangesText": "You have unsaved changes. Do you want to load them now?", "contents.unsavedChangesText": "You have unsaved changes. Do you want to load them now?",
@ -941,6 +931,18 @@
"schemas.synchronizeFailed": "Failed to synchronize schema. Please reload.", "schemas.synchronizeFailed": "Failed to synchronize schema. Please reload.",
"schemas.tabFields": "Fields", "schemas.tabFields": "Fields",
"schemas.tabJson": "Json", "schemas.tabJson": "Json",
"schemas.tableHeaders.created": "Created",
"schemas.tableHeaders.createdBy": "Created By",
"schemas.tableHeaders.createdByShort": "By",
"schemas.tableHeaders.id": "Id",
"schemas.tableHeaders.lastModified": "Updated",
"schemas.tableHeaders.lastModifiedBy": "Updated By",
"schemas.tableHeaders.lastModifiedByShort": "By",
"schemas.tableHeaders.nextStatus": "Next Status",
"schemas.tableHeaders.status": "Status",
"schemas.tableHeaders.translationStatus": "Translation Status",
"schemas.tableHeaders.translationStatusAverage": "Average Translation Status",
"schemas.tableHeaders.version": "Version",
"schemas.tabMore": "More", "schemas.tabMore": "More",
"schemas.tabScripts": "Scripts", "schemas.tabScripts": "Scripts",
"schemas.tabUI": "UI", "schemas.tabUI": "UI",

21
backend/i18n/source/frontend_it.json

@ -64,7 +64,6 @@
"assets.fileTooBig": "La risorsa è troppo grande.", "assets.fileTooBig": "La risorsa è troppo grande.",
"assets.folderName": "Nome della cartella", "assets.folderName": "Nome della cartella",
"assets.folderNameHint": "Il nome della cartella viene usato solo per la visualizzazione e può non essere univoco.", "assets.folderNameHint": "Il nome della cartella viene usato solo per la visualizzazione e può non essere univoco.",
"assets.insertAssets": "Inserisci le risorse",
"assets.linkSelected": "Collega le risorse selezionate ({count})", "assets.linkSelected": "Collega le risorse selezionate ({count})",
"assets.listPageTitle": "Risorse", "assets.listPageTitle": "Risorse",
"assets.loadFailed": "Non è stato possibile caricare le risorse. Per favore ricarica.", "assets.loadFailed": "Non è stato possibile caricare le risorse. Per favore ricarica.",
@ -401,16 +400,6 @@
"contents.selectionCount": "{count} elementi selezionati", "contents.selectionCount": "{count} elementi selezionati",
"contents.statusQueries": "Stato Query", "contents.statusQueries": "Stato Query",
"contents.stockPhotoSearch": "Cerca foto su Unsplash", "contents.stockPhotoSearch": "Cerca foto su Unsplash",
"contents.tableHeaders.created": "Creato",
"contents.tableHeaders.createdBy": "Creato da",
"contents.tableHeaders.createdByShort": "Da",
"contents.tableHeaders.id": "Id",
"contents.tableHeaders.lastModified": "Modificato",
"contents.tableHeaders.lastModifiedBy": "Modificato da",
"contents.tableHeaders.lastModifiedByShort": "Da",
"contents.tableHeaders.nextStatus": "Stato successivo",
"contents.tableHeaders.status": "Stato",
"contents.tableHeaders.version": "Versione",
"contents.unpublishReferrerConfirmText": "Il contenuto è inserito come collegamento da un altro contenuto pubblicato.\n\nSei sicuro di volerlo rimuovere dalla pubblicazione?", "contents.unpublishReferrerConfirmText": "Il contenuto è inserito come collegamento da un altro contenuto pubblicato.\n\nSei sicuro di volerlo rimuovere dalla pubblicazione?",
"contents.unpublishReferrerConfirmTitle": "Rimuovi dalla pubblicazione il contenuto", "contents.unpublishReferrerConfirmTitle": "Rimuovi dalla pubblicazione il contenuto",
"contents.unsavedChangesText": "Non hai salvato le modifiche. Vuoi salvarle adesso?", "contents.unsavedChangesText": "Non hai salvato le modifiche. Vuoi salvarle adesso?",
@ -779,6 +768,16 @@
"schemas.synchronizeFailed": "Non è stato possibile sincronizzare lo schema. Per favore ricarica.", "schemas.synchronizeFailed": "Non è stato possibile sincronizzare lo schema. Per favore ricarica.",
"schemas.tabFields": "Campi", "schemas.tabFields": "Campi",
"schemas.tabJson": "Json", "schemas.tabJson": "Json",
"schemas.tableHeaders.created": "Creato",
"schemas.tableHeaders.createdBy": "Creato da",
"schemas.tableHeaders.createdByShort": "Da",
"schemas.tableHeaders.id": "Id",
"schemas.tableHeaders.lastModified": "Modificato",
"schemas.tableHeaders.lastModifiedBy": "Modificato da",
"schemas.tableHeaders.lastModifiedByShort": "Da",
"schemas.tableHeaders.nextStatus": "Stato successivo",
"schemas.tableHeaders.status": "Stato",
"schemas.tableHeaders.version": "Versione",
"schemas.tabMore": "Altro", "schemas.tabMore": "Altro",
"schemas.tabScripts": "Script", "schemas.tabScripts": "Script",
"schemas.tabUI": "UI", "schemas.tabUI": "UI",

21
backend/i18n/source/frontend_nl.json

@ -82,7 +82,6 @@
"assets.fileTooBig": "Asset is te groot.", "assets.fileTooBig": "Asset is te groot.",
"assets.folderName": "Mapnaam", "assets.folderName": "Mapnaam",
"assets.folderNameHint": "De mapnaam wordt gebruikt als weergavenaam en mag niet uniek zijn.", "assets.folderNameHint": "De mapnaam wordt gebruikt als weergavenaam en mag niet uniek zijn.",
"assets.insertAssets": "Bestanden invoegen",
"assets.linkSelected": "Link geselecteerde items ({count})", "assets.linkSelected": "Link geselecteerde items ({count})",
"assets.listPageTitle": "Bestanden", "assets.listPageTitle": "Bestanden",
"assets.loadFailed": "Laden van bestanden is mislukt. Laad opnieuw.", "assets.loadFailed": "Laden van bestanden is mislukt. Laad opnieuw.",
@ -469,16 +468,6 @@
"contents.selectionCount": "{count} items geselecteerd", "contents.selectionCount": "{count} items geselecteerd",
"contents.statusQueries": "Statusquery's", "contents.statusQueries": "Statusquery's",
"contents.stockPhotoSearch": "Zoeken naar foto's op Unsplash", "contents.stockPhotoSearch": "Zoeken naar foto's op Unsplash",
"contents.tableHeaders.created": "Gemaakt",
"contents.tableHeaders.createdBy": "Gemaakt door",
"contents.tableHeaders.createdByShort": "Door",
"contents.tableHeaders.id": "Id",
"contents.tableHeaders.lastModified": "Bijgewerkt",
"contents.tableHeaders.lastModifiedBy": "Bijgewerkt door",
"contents.tableHeaders.lastModifiedByShort": "Door",
"contents.tableHeaders.nextStatus": "Volgende status",
"contents.tableHeaders.status": "Status",
"contents.tableHeaders.version": "Versie",
"contents.unpublishReferrerConfirmText": "Er wordt naar de inhoud verwezen door een ander gepubliceerd inhoudsitem.\n\nWilt u de publicatie van deze inhoud echt ongedaan maken?", "contents.unpublishReferrerConfirmText": "Er wordt naar de inhoud verwezen door een ander gepubliceerd inhoudsitem.\n\nWilt u de publicatie van deze inhoud echt ongedaan maken?",
"contents.unpublishReferrerConfirmTitle": "Publicatie van inhoud ongedaan maken", "contents.unpublishReferrerConfirmTitle": "Publicatie van inhoud ongedaan maken",
"contents.unsavedChangesText": "Je hebt niet-opgeslagen wijzigingen. Wil je ze nu laden?", "contents.unsavedChangesText": "Je hebt niet-opgeslagen wijzigingen. Wil je ze nu laden?",
@ -901,6 +890,16 @@
"schemas.synchronizeFailed": "Synchroniseren van schema is mislukt. Laad opnieuw.", "schemas.synchronizeFailed": "Synchroniseren van schema is mislukt. Laad opnieuw.",
"schemas.tabFields": "Velden", "schemas.tabFields": "Velden",
"schemas.tabJson": "Json", "schemas.tabJson": "Json",
"schemas.tableHeaders.created": "Gemaakt",
"schemas.tableHeaders.createdBy": "Gemaakt door",
"schemas.tableHeaders.createdByShort": "Door",
"schemas.tableHeaders.id": "Id",
"schemas.tableHeaders.lastModified": "Bijgewerkt",
"schemas.tableHeaders.lastModifiedBy": "Bijgewerkt door",
"schemas.tableHeaders.lastModifiedByShort": "Door",
"schemas.tableHeaders.nextStatus": "Volgende status",
"schemas.tableHeaders.status": "Status",
"schemas.tableHeaders.version": "Versie",
"schemas.tabMore": "Meer", "schemas.tabMore": "Meer",
"schemas.tabScripts": "Scripts", "schemas.tabScripts": "Scripts",
"schemas.tabUI": "UI", "schemas.tabUI": "UI",

21
backend/i18n/source/frontend_zh.json

@ -74,7 +74,6 @@
"assets.fileTooBig": "资源太大。", "assets.fileTooBig": "资源太大。",
"assets.folderName": "文件夹名称", "assets.folderName": "文件夹名称",
"assets.folderNameHint": "文件夹名称用作显示名称,不能唯一。", "assets.folderNameHint": "文件夹名称用作显示名称,不能唯一。",
"assets.insertAssets": "插入资源",
"assets.linkSelected": "链接选定的资源 ({count})", "assets.linkSelected": "链接选定的资源 ({count})",
"assets.listPageTitle": "资源", "assets.listPageTitle": "资源",
"assets.loadFailed": "资源加载失败,请重新加载。", "assets.loadFailed": "资源加载失败,请重新加载。",
@ -423,16 +422,6 @@
"contents.selectionCount": "{count} 个选定的项目", "contents.selectionCount": "{count} 个选定的项目",
"contents.statusQueries": "状态查询", "contents.statusQueries": "状态查询",
"contents.stockPhotoSearch": "通过 Unsplash 搜索照片", "contents.stockPhotoSearch": "通过 Unsplash 搜索照片",
"contents.tableHeaders.created": "创建",
"contents.tableHeaders.createdBy": "创建者",
"contents.tableHeaders.createdByShort": "By",
"contents.tableHeaders.id": "Id",
"contents.tableHeaders.lastModified": "更新",
"contents.tableHeaders.lastModifiedBy": "更新者",
"contents.tableHeaders.lastModifiedByShort": "By",
"contents.tableHeaders.nextStatus": "下一个状态",
"contents.tableHeaders.status": "状态",
"contents.tableHeaders.version": "版本",
"contents.unpublishReferrerConfirmText": "该内容被另一个已发布的内容项引用。\n\n您真的要取消发布此内容吗?", "contents.unpublishReferrerConfirmText": "该内容被另一个已发布的内容项引用。\n\n您真的要取消发布此内容吗?",
"contents.unpublishReferrerConfirmTitle": "取消发布内容", "contents.unpublishReferrerConfirmTitle": "取消发布内容",
"contents.unsavedChangesText": "您有未保存的更改。要立即加载吗?", "contents.unsavedChangesText": "您有未保存的更改。要立即加载吗?",
@ -794,6 +783,16 @@
"schemas.synchronizeFailed": "同步Schemas失败。请重新加载。", "schemas.synchronizeFailed": "同步Schemas失败。请重新加载。",
"schemas.tabFields": "字段", "schemas.tabFields": "字段",
"schemas.tabJson": "Json", "schemas.tabJson": "Json",
"schemas.tableHeaders.created": "创建",
"schemas.tableHeaders.createdBy": "创建者",
"schemas.tableHeaders.createdByShort": "By",
"schemas.tableHeaders.id": "Id",
"schemas.tableHeaders.lastModified": "更新",
"schemas.tableHeaders.lastModifiedBy": "更新者",
"schemas.tableHeaders.lastModifiedByShort": "By",
"schemas.tableHeaders.nextStatus": "下一个状态",
"schemas.tableHeaders.status": "状态",
"schemas.tableHeaders.version": "版本",
"schemas.ui": "指定的字段", "schemas.ui": "指定的字段",
"schemas.ui.unassignedFields": "未分配的字段", "schemas.ui.unassignedFields": "未分配的字段",
"schemas.unpublishFailed": "无法取消发布Schemas。请重新加载。", "schemas.unpublishFailed": "无法取消发布Schemas。请重新加载。",

19
backend/i18n/translator/Squidex.Translator/Processes/Helper.cs

@ -26,9 +26,9 @@ namespace Squidex.Translator.Processes
Console.WriteLine("----- CHECKING <{0}> -----", locale); Console.WriteLine("----- CHECKING <{0}> -----", locale);
var notTranslated = mainTranslations.Keys.Except(texts.Keys).ToList(); var notTranslated = mainTranslations.Keys.Except(texts.Keys).ToList();
var notUsed = texts.Keys.Except(mainTranslations.Keys).ToList(); var notUsing = texts.Keys.Except(mainTranslations.Keys).ToList();
if (notTranslated.Count > 0 || notUsed.Count > 0) if (notTranslated.Count > 0 || notUsing.Count > 0)
{ {
if (notTranslated.Count > 0) if (notTranslated.Count > 0)
{ {
@ -42,12 +42,12 @@ namespace Squidex.Translator.Processes
} }
} }
if (notUsed.Count > 0) if (notUsing.Count > 0)
{ {
Console.WriteLine(); Console.WriteLine();
Console.WriteLine("Translations not used:"); Console.WriteLine("Translations not used:");
foreach (var key in notUsed.OrderBy(x => x)) foreach (var key in notUsing.OrderBy(x => x))
{ {
Console.Write(" * "); Console.Write(" * ");
Console.WriteLine(key); Console.WriteLine(key);
@ -90,24 +90,25 @@ namespace Squidex.Translator.Processes
public static void CheckUnused(TranslationService service, HashSet<string> translations) public static void CheckUnused(TranslationService service, HashSet<string> translations)
{ {
var notUsed = new SortedSet<string>(); var notUsing = new SortedSet<string>();
foreach (var key in service.MainTranslations.Keys) foreach (var key in service.MainTranslations.Keys)
{ {
if (!translations.Contains(key) && if (!translations.Contains(key) &&
!key.StartsWith("common.", StringComparison.OrdinalIgnoreCase) && !key.StartsWith("common.", StringComparison.OrdinalIgnoreCase) &&
!key.StartsWith("dotnet_", StringComparison.OrdinalIgnoreCase) && !key.StartsWith("dotnet_", StringComparison.OrdinalIgnoreCase) &&
!key.StartsWith("validation.", StringComparison.OrdinalIgnoreCase)) !key.StartsWith("validation.", StringComparison.OrdinalIgnoreCase) &&
!key.StartsWith("rules.simulation.error", StringComparison.OrdinalIgnoreCase))
{ {
notUsed.Add(key); notUsing.Add(key);
} }
} }
if (notUsed.Count > 0) if (notUsing.Count > 0)
{ {
Console.WriteLine("Translations not used:"); Console.WriteLine("Translations not used:");
foreach (var key in notUsed) foreach (var key in notUsing)
{ {
Console.Write(" * "); Console.Write(" * ");
Console.WriteLine(key); Console.WriteLine(key);

5
frontend/src/app/features/content/pages/content/references/content-references.component.html

@ -7,9 +7,10 @@
[columns]="contents | sqxContentsColumns" [columns]="contents | sqxContentsColumns"
[isCompact]="false" [isCompact]="false"
[isDisabled]="false" [isDisabled]="false"
[language]="language"
[languages]="languages"
[validations]="(contentsState.validationResults | async)!" [validations]="(contentsState.validationResults | async)!"
[validityVisible]="true" [validityVisible]="true">
[language]="language">
</tbody> </tbody>
<tbody *ngIf="(contentsState.isLoaded | async) && contents.length === 0"> <tbody *ngIf="(contentsState.isLoaded | async) && contents.length === 0">

2
frontend/src/app/features/content/pages/contents/contents-page.component.html

@ -123,7 +123,9 @@
[cloneable]="contentsState.snapshot.canCreate" [cloneable]="contentsState.snapshot.canCreate"
(delete)="delete(content)" (delete)="delete(content)"
[language]="language" [language]="language"
[languages]="languages"
[link]="[content.id, 'history']" [link]="[content.id, 'history']"
[schema]="schema"
[selected]="isItemSelected(content)" [selected]="isItemSelected(content)"
(selectedChange)="selectItem(content, $event)" (selectedChange)="selectItem(content, $event)"
(statusChange)="changeStatus(content, $event)" (statusChange)="changeStatus(content, $event)"

8
frontend/src/app/features/content/shared/list/content.component.html

@ -61,12 +61,14 @@
[fields]="tableSettings" [fields]="tableSettings"
[sqxStopClick]="shouldStop(field)"> [sqxStopClick]="shouldStop(field)">
<sqx-content-list-field <sqx-content-list-field
[content]="content"
[field]="field" [field]="field"
[fields]="tableSettings" [fields]="tableSettings"
[patchForm]="patchForm?.form" [language]="language"
[languages]="languages"
[patchAllowed]="patchAllowed" [patchAllowed]="patchAllowed"
[content]="content" [patchForm]="patchForm?.form"
[language]="language"> [schema]="schema">
</sqx-content-list-field> </sqx-content-list-field>
</td> </td>

10
frontend/src/app/features/content/shared/list/content.component.ts

@ -6,12 +6,12 @@
*/ */
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, Output, QueryList, SimpleChanges, ViewChildren } from '@angular/core'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, EventEmitter, Input, OnChanges, Output, QueryList, SimpleChanges, ViewChildren } from '@angular/core';
import { AppLanguageDto, ContentDto, ContentListFieldComponent, ContentsState, ModalModel, PatchContentForm, TableField, TableSettings } from '@app/shared'; import { AppLanguageDto, ContentDto, ContentListFieldComponent, ContentsState, ModalModel, PatchContentForm, SchemaDto, TableField, TableSettings } from '@app/shared';
/* tslint:disable: component-selector */ /* tslint:disable: component-selector */
@Component({ @Component({
selector: '[sqxContent][language][tableFields][tableSettings]', selector: '[sqxContent][language][languages][tableFields][schema][tableSettings]',
styleUrls: ['./content.component.scss'], styleUrls: ['./content.component.scss'],
templateUrl: './content.component.html', templateUrl: './content.component.html',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
@ -35,6 +35,12 @@ export class ContentComponent implements OnChanges {
@Input() @Input()
public language!: AppLanguageDto; public language!: AppLanguageDto;
@Input()
public languages!: ReadonlyArray<AppLanguageDto>;
@Input()
public schema?: SchemaDto;
@Input() @Input()
public tableFields!: ReadonlyArray<TableField>; public tableFields!: ReadonlyArray<TableField>;

16
frontend/src/app/features/content/shared/references/reference-item.component.html

@ -4,7 +4,13 @@
</td> </td>
<td class="content-field" sqxContentListCell [field]="metaFields.lastModifiedByAvatar"> <td class="content-field" sqxContentListCell [field]="metaFields.lastModifiedByAvatar">
<sqx-content-list-field [field]="metaFields.lastModifiedByAvatar" [content]="content" [language]="language"></sqx-content-list-field> <sqx-content-list-field
[content]="content"
[field]="metaFields.lastModifiedByAvatar"
[language]="language"
[languages]="languages"
[schema]="undefined">
</sqx-content-list-field>
</td> </td>
<td class="cell-auto cell-content" *ngFor="let value of values"> <td class="cell-auto cell-content" *ngFor="let value of values">
@ -17,7 +23,13 @@
</td> </td>
<td sqxContentListCell [field]="metaFields.statusColor"> <td sqxContentListCell [field]="metaFields.statusColor">
<sqx-content-list-field [language]="language" [field]="metaFields.statusColor" [content]="content"></sqx-content-list-field> <sqx-content-list-field
[content]="content"
[field]="metaFields.statusColor"
[language]="language"
[languages]="languages"
[schema]="undefined">
</sqx-content-list-field>
</td> </td>
<td class="cell-label" *ngIf="!isCompact"> <td class="cell-label" *ngIf="!isCompact">

9
frontend/src/app/features/content/shared/references/reference-item.component.ts

@ -8,10 +8,10 @@
/* tslint:disable: component-selector */ /* tslint:disable: component-selector */
import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Output } from '@angular/core'; import { ChangeDetectionStrategy, Component, EventEmitter, Input, OnChanges, Output } from '@angular/core';
import { AppLanguageDto, ContentDto, getContentValue, META_FIELDS } from '@app/shared'; import { ContentDto, getContentValue, LanguageDto, META_FIELDS } from '@app/shared';
@Component({ @Component({
selector: '[sqxReferenceItem][language]', selector: '[sqxReferenceItem][language][languages]',
styleUrls: ['./reference-item.component.scss'], styleUrls: ['./reference-item.component.scss'],
templateUrl: './reference-item.component.html', templateUrl: './reference-item.component.html',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
@ -26,7 +26,10 @@ export class ReferenceItemComponent implements OnChanges {
public clone = new EventEmitter(); public clone = new EventEmitter();
@Input() @Input()
public language!: AppLanguageDto; public language!: LanguageDto;
@Input()
public languages!: ReadonlyArray<LanguageDto>;
@Input() @Input()
public canRemove?: boolean | null = true; public canRemove?: boolean | null = true;

1
frontend/src/app/features/content/shared/references/references-editor.component.html

@ -28,6 +28,7 @@
[isCompact]="snapshot.isCompact" [isCompact]="snapshot.isCompact"
[isDisabled]="snapshot.isDisabled" [isDisabled]="snapshot.isDisabled"
[language]="language" [language]="language"
[languages]="languages"
(delete)="remove(content)"> (delete)="remove(content)">
<i cdkDragHandle class="icon-drag2 drag-handle"></i> <i cdkDragHandle class="icon-drag2 drag-handle"></i>
</tbody> </tbody>

2
frontend/src/app/features/settings/pages/plans/plans-page.component.html

@ -13,7 +13,7 @@
<sqx-list-view innerWidth="60rem" [isLoading]="plansState.isLoading | async"> <sqx-list-view innerWidth="60rem" [isLoading]="plansState.isLoading | async">
<ng-container *ngIf="(plansState.isLoaded | async) && (plansState.plans | async); let plans"> <ng-container *ngIf="(plansState.isLoaded | async) && (plansState.plans | async); let plans">
<div class="alert alert-danger" *ngIf="(plansState.isOwner | async) === false"> <div class="alert alert-danger" *ngIf="(plansState.isOwner | async) === false">
{{ 'plans.notPlanOwner' | sqxTranslate }} {{ 'plans.planOwner' |sqxTranslate }}: <strong className="no-wrap">{{plansState.planOwner | async | sqxUserName}}</strong> {{ 'plans.notPlanOwner' | sqxTranslate }} {{ 'plans.planOwner' | sqxTranslate }}: <strong className="no-wrap">{{plansState.planOwner | async | sqxUserName}}</strong>
</div> </div>
<div> <div>

16
frontend/src/app/shared/components/contents/content-list-field.component.html

@ -20,6 +20,22 @@
<ng-container *ngSwitchCase="metaFields.lastModifiedByName"> <ng-container *ngSwitchCase="metaFields.lastModifiedByName">
<small class="truncate">{{content.lastModifiedBy | sqxUserNameRef}}</small> <small class="truncate">{{content.lastModifiedBy | sqxUserNameRef}}</small>
</ng-container> </ng-container>
<ng-container *ngSwitchCase="metaFields.translationStatus">
<sqx-translation-status
[data]="content.data"
[language]="language"
[languages]="languages"
[schema]="schema">
</sqx-translation-status>
</ng-container>
<ng-container *ngSwitchCase="metaFields.translationStatusAverage">
<sqx-translation-status
[data]="content.data"
[language]="undefined"
[languages]="languages"
[schema]="schema">
</sqx-translation-status>
</ng-container>
<ng-container *ngSwitchCase="metaFields.status"> <ng-container *ngSwitchCase="metaFields.status">
<ng-container *ngIf="content.newStatus; else singleStatus"> <ng-container *ngIf="content.newStatus; else singleStatus">
<div class="row g-0 status-grid"> <div class="row g-0 status-grid">

10
frontend/src/app/shared/components/contents/content-list-field.component.ts

@ -7,7 +7,7 @@
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges } from '@angular/core'; import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Input, OnChanges } from '@angular/core';
import { FormGroup } from '@angular/forms'; import { FormGroup } from '@angular/forms';
import { ContentDto, FieldValue, getContentValue, LanguageDto, META_FIELDS, StatefulComponent, TableField, TableSettings } from '@app/shared/internal'; import { ContentDto, FieldValue, getContentValue, LanguageDto, META_FIELDS, SchemaDto, StatefulComponent, TableField, TableSettings } from '@app/shared/internal';
interface State { interface State {
// The formatted value. // The formatted value.
@ -15,7 +15,7 @@ interface State {
} }
@Component({ @Component({
selector: 'sqx-content-list-field[content][field][language]', selector: 'sqx-content-list-field[content][field][language][languages][schema]',
styleUrls: ['./content-list-field.component.scss'], styleUrls: ['./content-list-field.component.scss'],
templateUrl: './content-list-field.component.html', templateUrl: './content-list-field.component.html',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
@ -38,9 +38,15 @@ export class ContentListFieldComponent extends StatefulComponent<State> implemen
@Input() @Input()
public patchForm?: FormGroup | null; public patchForm?: FormGroup | null;
@Input()
public schema?: SchemaDto;
@Input() @Input()
public language!: LanguageDto; public language!: LanguageDto;
@Input()
public languages!: ReadonlyArray<LanguageDto>;
public get isInlineEditable() { public get isInlineEditable() {
return this.field.rootField?.isInlineEditable === true; return this.field.rootField?.isInlineEditable === true;
} }

1
frontend/src/app/shared/components/contents/translation-status.component.html

@ -0,0 +1 @@
{{text}}

0
frontend/src/app/shared/components/contents/translation-status.component.scss

54
frontend/src/app/shared/components/contents/translation-status.component.ts

@ -0,0 +1,54 @@
/*
* Squidex Headless CMS
*
* @license
* Copyright (c) Squidex UG (haftungsbeschränkt). All rights reserved.
*/
import { ChangeDetectionStrategy, Component, Input } from '@angular/core';
import { contentTranslationStatus, LanguageDto, SchemaDto } from '@app/shared/internal';
@Component({
selector: 'sqx-translation-status[data][languages][schema]',
styleUrls: ['./translation-status.component.scss'],
templateUrl: './translation-status.component.html',
changeDetection: ChangeDetectionStrategy.OnPush,
})
export class TranslationStatusComponent {
@Input()
public data!: any;
@Input()
public language?: LanguageDto | null;
@Input()
public languages!: ReadonlyArray<LanguageDto>;
@Input()
public schema?: SchemaDto;
public text = 'N/A';
public ngOnChanges() {
if (!this.schema) {
this.text = 'N/A';
return;
}
const status = contentTranslationStatus(this.data, this.schema, this.languages);
let progress = 0;
if (this.language) {
progress = status[this.language.iso2Code];
} else {
for (const value of Object.values(status)) {
progress += value;
}
progress = Math.round(progress / this.languages.length);
}
this.text = `${progress || 0} %`;
}
}

24
frontend/src/app/shared/components/references/content-selector-item.component.html

@ -8,15 +8,33 @@
</td> </td>
<td sqxContentListCell [field]="metaFields.lastModifiedByAvatar"> <td sqxContentListCell [field]="metaFields.lastModifiedByAvatar">
<sqx-content-list-field [language]="language" [field]="metaFields.lastModifiedByAvatar" [content]="content"></sqx-content-list-field> <sqx-content-list-field
[content]="content"
[field]="metaFields.lastModifiedByAvatar"
[language]="language"
[languages]="languages"
[schema]="schema">
</sqx-content-list-field>
</td> </td>
<td *ngFor="let field of schema.defaultReferenceFields"> <td *ngFor="let field of schema.defaultReferenceFields">
<sqx-content-list-field [field]="field" [content]="content" [language]="language"></sqx-content-list-field> <sqx-content-list-field
[content]="content"
[field]="field"
[language]="language"
[languages]="languages"
[schema]="schema">
</sqx-content-list-field>
</td> </td>
<td sqxContentListCell [field]="metaFields.statusColor"> <td sqxContentListCell [field]="metaFields.statusColor">
<sqx-content-list-field [language]="language" [field]="metaFields.statusColor" [content]="content"></sqx-content-list-field> <sqx-content-list-field
[content]="content"
[field]="metaFields.statusColor"
[language]="language"
[languages]="languages"
[schema]="undefined">
</sqx-content-list-field>
</td> </td>
</tr> </tr>
<tr class="spacer"></tr> <tr class="spacer"></tr>

5
frontend/src/app/shared/components/references/content-selector-item.component.ts

@ -11,7 +11,7 @@ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from
import { ContentDto, LanguageDto, META_FIELDS, SchemaDto } from '@app/shared/internal'; import { ContentDto, LanguageDto, META_FIELDS, SchemaDto } from '@app/shared/internal';
@Component({ @Component({
selector: '[sqxContentSelectorItem][language][schema]', selector: '[sqxContentSelectorItem][language][languages][schema]',
styleUrls: ['./content-selector-item.component.scss'], styleUrls: ['./content-selector-item.component.scss'],
templateUrl: './content-selector-item.component.html', templateUrl: './content-selector-item.component.html',
changeDetection: ChangeDetectionStrategy.OnPush, changeDetection: ChangeDetectionStrategy.OnPush,
@ -31,6 +31,9 @@ export class ContentSelectorItemComponent {
@Input() @Input()
public language!: LanguageDto; public language!: LanguageDto;
@Input()
public languages!: ReadonlyArray<LanguageDto>;
@Input() @Input()
public schema!: SchemaDto; public schema!: SchemaDto;

1
frontend/src/app/shared/components/references/content-selector.component.html

@ -74,6 +74,7 @@
<tbody *ngFor="let content of contents; trackBy: trackByContent" <tbody *ngFor="let content of contents; trackBy: trackByContent"
[sqxContentSelectorItem]="content" [sqxContentSelectorItem]="content"
[language]="language" [language]="language"
[languages]="languages"
[schema]="schema" [schema]="schema"
[selectable]="!isItemAlreadySelected(content)" [selectable]="!isItemAlreadySelected(content)"
[selected]="isItemSelected(content)" [selected]="isItemSelected(content)"

1
frontend/src/app/shared/declarations.ts

@ -29,6 +29,7 @@ export * from './components/contents/content-list-header.component';
export * from './components/contents/content-status.component'; export * from './components/contents/content-status.component';
export * from './components/contents/content-value-editor.component'; export * from './components/contents/content-value-editor.component';
export * from './components/contents/content-value.component'; export * from './components/contents/content-value.component';
export * from './components/contents/translation-status.component';
export * from './components/forms/geolocation-editor.component'; export * from './components/forms/geolocation-editor.component';
export * from './components/forms/markdown-editor.component'; export * from './components/forms/markdown-editor.component';
export * from './components/forms/rich-editor.component'; export * from './components/forms/rich-editor.component';

4
frontend/src/app/shared/module.ts

@ -12,7 +12,7 @@ import { RouterModule } from '@angular/router';
import { MentionModule } from 'angular-mentions'; import { MentionModule } from 'angular-mentions';
import { NgxDocViewerModule } from 'ngx-doc-viewer'; import { NgxDocViewerModule } from 'ngx-doc-viewer';
import { SqxFrameworkModule } from '@app/framework'; import { SqxFrameworkModule } from '@app/framework';
import { AppFormComponent, AppLanguagesService, AppMustExistGuard, AppsService, AppsState, AssetComponent, AssetDialogComponent, AssetFolderComponent, AssetFolderDialogComponent, AssetFolderDropdownComponent, AssetFolderDropdownItemComponent, AssetHistoryComponent, AssetPathComponent, AssetPreviewUrlPipe, AssetScriptsState, AssetsListComponent, AssetsSelectorComponent, AssetsService, AssetsState, AssetTextEditorComponent, AssetUploaderComponent, AssetUploaderState, AssetUrlPipe, AuthInterceptor, AuthService, AutoSaveService, BackupsService, BackupsState, ClientsService, ClientsState, CommentComponent, CommentsComponent, CommentsService, ContentListCellDirective, ContentListCellResizeDirective, ContentListFieldComponent, ContentListHeaderComponent, ContentListWidthDirective, ContentMustExistGuard, ContentsColumnsPipe, ContentSelectorComponent, ContentSelectorItemComponent, ContentsService, ContentsState, ContentStatusComponent, ContentValueComponent, ContentValueEditorComponent, ContributorsService, ContributorsState, FileIconPipe, FilterComparisonComponent, FilterLogicalComponent, FilterNodeComponent, FilterOperatorPipe, GeolocationEditorComponent, HelpComponent, HelpMarkdownPipe, HelpService, HistoryComponent, HistoryListComponent, HistoryMessagePipe, HistoryService, ImageCropperComponent, ImageFocusPointComponent, LanguagesService, LanguagesState, LoadAppsGuard, LoadLanguagesGuard, LoadSchemasGuard, MarkdownEditorComponent, MustBeAuthenticatedGuard, MustBeNotAuthenticatedGuard, NewsService, NotifoComponent, PlansService, PlansState, PreviewableType, QueryComponent, QueryListComponent, QueryPathComponent, ReferenceInputComponent, RichEditorComponent, RolesService, RolesState, RuleEventsState, RuleMustExistGuard, RuleSimulatorState, RulesService, RulesState, SavedQueriesComponent, SchemaCategoryComponent, SchemaMustExistGuard, SchemaMustExistPublishedGuard, SchemaMustNotBeSingletonGuard, SchemasService, SchemasState, SchemaTagSource, SearchFormComponent, SearchService, SortingComponent, StockPhotoService, TableHeaderComponent, TemplatesService, TemplatesState, TranslationsService, UIService, UIState, UnsetAppGuard, UsagesService, UserDtoPicture, UserIdPicturePipe, UserNamePipe, UserNameRefPipe, UserPicturePipe, UserPictureRefPipe, UsersProviderService, UsersService, WatchingUsersComponent, WorkflowsService, WorkflowsState } from './declarations'; import { AppFormComponent, AppLanguagesService, AppMustExistGuard, AppsService, AppsState, AssetComponent, AssetDialogComponent, AssetFolderComponent, AssetFolderDialogComponent, AssetFolderDropdownComponent, AssetFolderDropdownItemComponent, AssetHistoryComponent, AssetPathComponent, AssetPreviewUrlPipe, AssetScriptsState, AssetsListComponent, AssetsSelectorComponent, AssetsService, AssetsState, AssetTextEditorComponent, AssetUploaderComponent, AssetUploaderState, AssetUrlPipe, AuthInterceptor, AuthService, AutoSaveService, BackupsService, BackupsState, ClientsService, ClientsState, CommentComponent, CommentsComponent, CommentsService, ContentListCellDirective, ContentListCellResizeDirective, ContentListFieldComponent, ContentListHeaderComponent, ContentListWidthDirective, ContentMustExistGuard, ContentsColumnsPipe, ContentSelectorComponent, ContentSelectorItemComponent, ContentsService, ContentsState, ContentStatusComponent, ContentValueComponent, ContentValueEditorComponent, ContributorsService, ContributorsState, FileIconPipe, FilterComparisonComponent, FilterLogicalComponent, FilterNodeComponent, FilterOperatorPipe, GeolocationEditorComponent, HelpComponent, HelpMarkdownPipe, HelpService, HistoryComponent, HistoryListComponent, HistoryMessagePipe, HistoryService, ImageCropperComponent, ImageFocusPointComponent, LanguagesService, LanguagesState, LoadAppsGuard, LoadLanguagesGuard, LoadSchemasGuard, MarkdownEditorComponent, MustBeAuthenticatedGuard, MustBeNotAuthenticatedGuard, NewsService, NotifoComponent, PlansService, PlansState, PreviewableType, QueryComponent, QueryListComponent, QueryPathComponent, ReferenceInputComponent, RichEditorComponent, RolesService, RolesState, RuleEventsState, RuleMustExistGuard, RuleSimulatorState, RulesService, RulesState, SavedQueriesComponent, SchemaCategoryComponent, SchemaMustExistGuard, SchemaMustExistPublishedGuard, SchemaMustNotBeSingletonGuard, SchemasService, SchemasState, SchemaTagSource, SearchFormComponent, SearchService, SortingComponent, StockPhotoService, TableHeaderComponent, TemplatesService, TemplatesState, TranslationsService, TranslationStatusComponent, UIService, UIState, UnsetAppGuard, UsagesService, UserDtoPicture, UserIdPicturePipe, UserNamePipe, UserNameRefPipe, UserPicturePipe, UserPictureRefPipe, UsersProviderService, UsersService, WatchingUsersComponent, WorkflowsService, WorkflowsState } from './declarations';
@NgModule({ @NgModule({
imports: [ imports: [
@ -77,6 +77,7 @@ import { AppFormComponent, AppLanguagesService, AppMustExistGuard, AppsService,
SearchFormComponent, SearchFormComponent,
SortingComponent, SortingComponent,
TableHeaderComponent, TableHeaderComponent,
TranslationStatusComponent,
UserDtoPicture, UserDtoPicture,
UserIdPicturePipe, UserIdPicturePipe,
UserNamePipe, UserNamePipe,
@ -130,6 +131,7 @@ import { AppFormComponent, AppLanguagesService, AppMustExistGuard, AppsService,
SchemaCategoryComponent, SchemaCategoryComponent,
SearchFormComponent, SearchFormComponent,
TableHeaderComponent, TableHeaderComponent,
TranslationStatusComponent,
UserDtoPicture, UserDtoPicture,
UserIdPicturePipe, UserIdPicturePipe,
UserNamePipe, UserNamePipe,

2
frontend/src/app/shared/services/contents.service.ts

@ -50,7 +50,7 @@ export class ContentDto {
public readonly statusColor: string, public readonly statusColor: string,
public readonly newStatus: string | undefined, public readonly newStatus: string | undefined,
public readonly newStatusColor: string | undefined, public readonly newStatusColor: string | undefined,
public readonly scheduleJob: ScheduleDto | null, public readonly scheduleJob: ScheduleDto | null | undefined,
public readonly data: ContentData, public readonly data: ContentData,
public readonly schemaName: string, public readonly schemaName: string,
public readonly schemaDisplayName: string, public readonly schemaDisplayName: string,

30
frontend/src/app/shared/services/schemas.service.ts

@ -25,47 +25,55 @@ export const META_FIELDS = {
}, },
id: { id: {
name: 'meta.id', name: 'meta.id',
label: 'i18n:contents.tableHeaders.id', label: 'i18n:schemas.tableHeaders.id',
}, },
created: { created: {
name: 'meta.created', name: 'meta.created',
label: 'i18n:contents.tableHeaders.created', label: 'i18n:schemas.tableHeaders.created',
}, },
createdByAvatar: { createdByAvatar: {
name: 'meta.createdBy.avatar', name: 'meta.createdBy.avatar',
label: 'i18n:contents.tableHeaders.createdByShort', label: 'i18n:schemas.tableHeaders.createdByShort',
}, },
createdByName: { createdByName: {
name: 'meta.createdBy.name', name: 'meta.createdBy.name',
label: 'i18n:contents.tableHeaders.createdBy', label: 'i18n:schemas.tableHeaders.createdBy',
}, },
lastModified: { lastModified: {
name: 'meta.lastModified', name: 'meta.lastModified',
label: 'i18n:contents.tableHeaders.lastModified', label: 'i18n:schemas.tableHeaders.lastModified',
}, },
lastModifiedByAvatar: { lastModifiedByAvatar: {
name: 'meta.lastModifiedBy.avatar', name: 'meta.lastModifiedBy.avatar',
label: 'i18n:contents.tableHeaders.lastModifiedByShort', label: 'i18n:schemas.tableHeaders.lastModifiedByShort',
}, },
lastModifiedByName: { lastModifiedByName: {
name: 'meta.lastModifiedBy.name', name: 'meta.lastModifiedBy.name',
label: 'i18n:contents.tableHeaders.lastModifiedBy', label: 'i18n:schemas.tableHeaders.lastModifiedBy',
}, },
status: { status: {
name: 'meta.status', name: 'meta.status',
label: 'i18n:contents.tableHeaders.status', label: 'i18n:schemas.tableHeaders.status',
}, },
statusColor: { statusColor: {
name: 'meta.status.color', name: 'meta.status.color',
label: 'i18n:contents.tableHeaders.status', label: 'i18n:schemas.tableHeaders.status',
}, },
statusNext: { statusNext: {
name: 'meta.status.next', name: 'meta.status.next',
label: 'i18n:contents.tableHeaders.nextStatus', label: 'i18n:schemas.tableHeaders.nextStatus',
}, },
version: { version: {
name: 'meta.version', name: 'meta.version',
label: 'i18n:contents.tableHeaders.version', label: 'i18n:schemas.tableHeaders.version',
},
translationStatus: {
name: 'meta.translationStatus',
label: 'i18n:schemas.tableHeaders.translationStatus',
},
translationStatusAverage: {
name: 'meta.translationStatusAverage',
label: 'i18n:schemas.tableHeaders.translationStatusAverage',
}, },
}; };

Loading…
Cancel
Save