@micha.bigler/ui-core-micha 2.41.2 → 2.42.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.
- package/WORK_ORDERS.md +4 -3
- package/dist/components/charts/BarChart.js +11 -4
- package/dist/components/charts/ChartFrame.js +12 -3
- package/dist/components/charts/LineChart.js +11 -4
- package/dist/components/charts/ScatterChart.js +11 -4
- package/dist/components/charts/chartDefaults.js +41 -0
- package/dist/i18n/messagingTranslations.js +116 -116
- package/package.json +1 -1
- package/src/components/charts/BarChart.jsx +14 -2
- package/src/components/charts/ChartFrame.jsx +13 -2
- package/src/components/charts/LineChart.jsx +14 -2
- package/src/components/charts/ScatterChart.jsx +14 -2
- package/src/components/charts/chartDefaults.js +43 -0
- package/src/i18n/messagingTranslations.ts +116 -116
- package/tests/BarChart.test.jsx +48 -0
- package/tests/ChartFrame.test.jsx +43 -0
- package/tests/LineChart.test.jsx +46 -1
- package/tests/ScatterChart.test.jsx +38 -1
- package/tests/chartDefaults.test.js +73 -0
- package/tests/i18nAggregate.test.js +1 -4
- package/tests/messagingMsg6.test.jsx +2 -2
- package/work-orders/I18N-3.md +68 -0
- package/work-orders/UCM-CHART-8.md +147 -0
|
@@ -1,118 +1,118 @@
|
|
|
1
1
|
export const messagingTranslations = {
|
|
2
|
-
'MessagingComposer.ADD_EMOJI': { de: 'Emoji hinzufügen', en: 'Add emoji', fr: 'Ajouter un emoji' },
|
|
3
|
-
'MessagingComposer.EMOJI_PICKER': { de: 'Emoji auswählen', en: 'Choose an emoji', fr: 'Choisir un emoji' },
|
|
4
|
-
'MessagingComposer.STAGED_FILES': { de: 'Vorgemerkte Anhänge', en: 'Staged attachments', fr: 'Pièces jointes préparées' },
|
|
5
|
-
'MessagingComposer.REMOVE_ATTACHMENT': { de: '{{name}} entfernen', en: 'Remove {{name}}', fr: 'Supprimer {{name}}' },
|
|
6
|
-
'MessagingComposer.UPLOADING': { de: 'Anhänge werden hochgeladen…', en: 'Uploading attachments…', fr: 'Téléversement des pièces jointes…' },
|
|
7
|
-
'MessagingList.LABEL': { de: 'Unterhaltungen', en: 'Conversations', fr: 'Conversations' },
|
|
8
|
-
'MessagingList.EMPTY': { de: 'Noch keine Unterhaltungen.', en: 'No conversations yet.', fr: 'Aucune conversation pour le moment.' },
|
|
9
|
-
'MessagingList.NO_MESSAGES': { de: 'Noch keine Nachrichten', en: 'No messages yet', fr: 'Aucun message pour le moment' },
|
|
10
|
-
'MessagingList.UNTITLED': { de: 'Unbenannte Unterhaltung', en: 'Untitled conversation', fr: 'Conversation sans titre' },
|
|
11
|
-
'MessagingList.ACTIONS': { de: 'Aktionen für Unterhaltung', en: 'Conversation actions', fr: 'Actions de la conversation' },
|
|
12
|
-
'MessagingList.LOAD_MORE': { de: 'Mehr laden', en: 'Load more', fr: 'Charger plus' },
|
|
13
|
-
'MessagingList.LOAD_ERROR': { de: 'Unterhaltungen konnten nicht geladen werden.', en: 'Conversations could not be loaded.', fr: 'Impossible de charger les conversations.' },
|
|
14
|
-
'MessagingList.ARCHIVE': { de: 'Archivieren', en: 'Archive', fr: 'Archiver' },
|
|
15
|
-
'MessagingList.ARCHIVE_ERROR': { de: 'Unterhaltung konnte nicht archiviert werden.', en: 'Conversation could not be archived.', fr: 'Impossible d’archiver la conversation.' },
|
|
16
|
-
'MessagingList.MUTE': { de: 'Stummschalten', en: 'Mute', fr: 'Mettre en sourdine' },
|
|
17
|
-
'MessagingList.UNMUTE': { de: 'Stummschaltung aufheben', en: 'Unmute', fr: 'Réactiver le son' },
|
|
18
|
-
'MessagingList.PREFERENCES_ERROR': { de: 'Einstellungen konnten nicht gespeichert werden.', en: 'Preferences could not be saved.', fr: 'Impossible d’enregistrer les préférences.' },
|
|
19
|
-
'MessagingLaunchers.OPEN_GROUP': { de: 'Gruppenunterhaltung öffnen', en: 'Open group conversation', fr: 'Ouvrir la conversation de groupe' },
|
|
20
|
-
'MessagingLaunchers.OPEN_BROADCAST': { de: 'Ankündigungen öffnen', en: 'Open announcements', fr: 'Ouvrir les annonces' },
|
|
21
|
-
'MessagingLaunchers.OPEN_ERROR': { de: 'Unterhaltung konnte nicht geöffnet werden.', en: 'Conversation could not be opened.', fr: 'Impossible d’ouvrir la conversation.' },
|
|
22
|
-
'MessagingThread.TIMELINE': { de: 'Nachrichtenverlauf', en: 'Message timeline', fr: 'Chronologie des messages' },
|
|
23
|
-
'MessagingThread.MESSAGE': { de: 'Nachricht', en: 'Message', fr: 'Message' },
|
|
24
|
-
'MessagingThread.EMPTY': { de: 'Noch keine Nachrichten.', en: 'No messages yet.', fr: 'Aucun message pour le moment.' },
|
|
25
|
-
'MessagingThread.LOAD_OLDER': { de: 'Ältere Nachrichten laden', en: 'Load older messages', fr: 'Charger les messages plus anciens' },
|
|
26
|
-
'MessagingThread.LOAD_ERROR': { de: 'Nachrichten konnten nicht geladen werden.', en: 'Messages could not be loaded.', fr: 'Impossible de charger les messages.' },
|
|
27
|
-
'MessagingThread.REPLIES_ERROR': { de: 'Antworten konnten nicht geladen werden.', en: 'Replies could not be loaded.', fr: 'Impossible de charger les réponses.' },
|
|
28
|
-
'MessagingThread.DELETED': { de: 'Diese Nachricht wurde gelöscht.', en: 'This message was deleted.', fr: 'Ce message a été supprimé.' },
|
|
29
|
-
'MessagingThread.EDITED': { de: 'bearbeitet', en: 'edited', fr: 'modifié' },
|
|
30
|
-
'MessagingThread.REPLY': { de: 'Antworten', en: 'Reply', fr: 'Répondre' },
|
|
31
|
-
'MessagingThread.REPLY_TO': { de: 'Antwort auf {{sender}}', en: 'Reply to {{sender}}', fr: 'Réponse à {{sender}}' },
|
|
32
|
-
'MessagingThread.REPLYING_TO': { de: 'Antwort an {{sender}}', en: 'Replying to {{sender}}', fr: 'Réponse à {{sender}}' },
|
|
33
|
-
'MessagingThread.SHOW_REPLIES_one': { de: '{{count}} Antwort anzeigen', en: 'Show {{count}} reply', fr: 'Afficher {{count}} réponse' },
|
|
34
|
-
'MessagingThread.SHOW_REPLIES_other': { de: '{{count}} Antworten anzeigen', en: 'Show {{count}} replies', fr: 'Afficher {{count}} réponses' },
|
|
35
|
-
'MessagingThread.HIDE_REPLIES': { de: 'Antworten ausblenden', en: 'Hide replies', fr: 'Masquer les réponses' },
|
|
36
|
-
'MessagingThread.UNREAD_REPLIES': { de: 'Ungelesene Antworten', en: 'Unread replies', fr: 'Réponses non lues' },
|
|
37
|
-
'MessagingThread.UNKNOWN_SENDER': { de: 'Unbekannte Person', en: 'Unknown person', fr: 'Personne inconnue' },
|
|
38
|
-
'MessagingThread.QUOTE_ATTACHMENT': { de: 'Anhang', en: 'Attachment', fr: 'Pièce jointe' },
|
|
39
|
-
'MessagingActions.MENU': { de: 'Nachrichtenaktionen', en: 'Message actions', fr: 'Actions du message' },
|
|
40
|
-
'MessagingActions.EDIT': { de: 'Bearbeiten', en: 'Edit', fr: 'Modifier' },
|
|
41
|
-
'MessagingActions.SAVE': { de: 'Speichern', en: 'Save', fr: 'Enregistrer' },
|
|
42
|
-
'MessagingActions.CANCEL': { de: 'Abbrechen', en: 'Cancel', fr: 'Annuler' },
|
|
43
|
-
'MessagingActions.DELETE': { de: 'Löschen', en: 'Delete', fr: 'Supprimer' },
|
|
44
|
-
'MessagingActions.COPY': { de: 'Kopieren', en: 'Copy', fr: 'Copier' },
|
|
45
|
-
'MessagingActions.DELETE_CONFIRM_TITLE': { de: 'Nachricht löschen?', en: 'Delete message?', fr: 'Supprimer le message ?' },
|
|
46
|
-
'MessagingActions.DELETE_CONFIRM_BODY': { de: 'Diese Nachricht wird für alle entfernt.', en: 'This message will be removed for everyone.', fr: 'Ce message sera supprimé pour tout le monde.' },
|
|
47
|
-
'MessagingActions.EDIT_ERROR': { de: 'Nachricht konnte nicht bearbeitet werden: {{message}}', en: 'Message could not be edited: {{message}}', fr: 'Impossible de modifier le message : {{message}}' },
|
|
48
|
-
'MessagingActions.DELETE_ERROR': { de: 'Nachricht konnte nicht gelöscht werden: {{message}}', en: 'Message could not be deleted: {{message}}', fr: 'Impossible de supprimer le message : {{message}}' },
|
|
49
|
-
'MessagingActions.COPY_ERROR': { de: 'Nachricht konnte nicht kopiert werden: {{message}}', en: 'Message could not be copied: {{message}}', fr: 'Impossible de copier le message : {{message}}' },
|
|
50
|
-
'MessagingDirect.LAUNCH': { de: 'Direktnachricht starten', en: 'Start direct message', fr: 'Démarrer un message direct' },
|
|
51
|
-
'MessagingDirect.TITLE': { de: 'Direktnachricht starten', en: 'Start direct message', fr: 'Démarrer un message direct' },
|
|
52
|
-
'MessagingDirect.CANDIDATES': { de: 'Empfängerinnen und Empfänger', en: 'Recipients', fr: 'Destinataires' },
|
|
53
|
-
'MessagingDirect.EMPTY': { de: 'Keine Personen verfügbar.', en: 'No people are available.', fr: 'Aucune personne n’est disponible.' },
|
|
54
|
-
'MessagingDirect.START': { de: 'Starten', en: 'Start', fr: 'Démarrer' },
|
|
55
|
-
'MessagingDirect.STARTING': { de: 'Direktnachricht wird gestartet…', en: 'Starting direct message…', fr: 'Démarrage du message direct…' },
|
|
56
|
-
'MessagingDirect.CANCEL': { de: 'Abbrechen', en: 'Cancel', fr: 'Annuler' },
|
|
57
|
-
'MessagingDirect.START_ERROR': { de: 'Direktnachricht konnte nicht gestartet werden.', en: 'Direct message could not be started.', fr: 'Impossible de démarrer le message direct.' },
|
|
58
|
-
'MessagingReadTicks.ALL_READ': { de: 'Von allen gelesen', en: 'Read by everyone', fr: 'Lu par tout le monde' },
|
|
59
|
-
'MessagingReadTicks.SENT': { de: 'Gesendet', en: 'Sent', fr: 'Envoyé' },
|
|
60
|
-
'MessagingReadTicks.READ_RATIO': { de: '{{read}} von {{total}} gelesen', en: '{{read}} of {{total}} read', fr: '{{read}} sur {{total}} lu(s)' },
|
|
61
|
-
'MessagingReadTicks.RECIPIENTS': { de: 'Lesebestätigungen', en: 'Read recipients', fr: 'Destinataires lus' },
|
|
62
|
-
'MessagingComposer.LABEL': { de: 'Nachricht verfassen', en: 'Compose message', fr: 'Rédiger un message' },
|
|
63
|
-
'MessagingComposer.MESSAGE': { de: 'Nachricht', en: 'Message', fr: 'Message' },
|
|
64
|
-
'MessagingComposer.SEND': { de: 'Senden', en: 'Send', fr: 'Envoyer' },
|
|
65
|
-
'MessagingComposer.RETRY': { de: 'Erneut versuchen', en: 'Retry', fr: 'Réessayer' },
|
|
66
|
-
'MessagingComposer.ADD_ATTACHMENT': { de: 'Anhang hinzufügen', en: 'Add attachment', fr: 'Ajouter une pièce jointe' },
|
|
67
|
-
'MessagingComposer.FILES_SELECTED_one': { de: '{{count}} Anhang ausgewählt', en: '{{count}} attachment selected', fr: '{{count}} pièce jointe sélectionnée' },
|
|
68
|
-
'MessagingComposer.FILES_SELECTED_other': { de: '{{count}} Anhänge ausgewählt', en: '{{count}} attachments selected', fr: '{{count}} pièces jointes sélectionnées' },
|
|
69
|
-
'MessagingComposer.REPLYING_TO': { de: 'Antwort an {{sender}}', en: 'Replying to {{sender}}', fr: 'Réponse à {{sender}}' },
|
|
70
|
-
'MessagingComposer.SEND_ERROR': { de: 'Nachricht konnte nicht gesendet werden: {{message}}', en: 'Message could not be sent: {{message}}', fr: 'Impossible d’envoyer le message : {{message}}' },
|
|
71
|
-
'MessagingComposer.UPLOAD_ERROR': { de: 'Anhang wurde abgelehnt: {{message}}', en: 'Attachment was rejected: {{message}}', fr: 'La pièce jointe a été rejetée : {{message}}' },
|
|
72
|
-
'MessagingAttachments.LABEL': { de: 'Anhänge', en: 'Attachments', fr: 'Pièces jointes' },
|
|
73
|
-
'MessagingAttachments.DOWNLOAD': { de: '{{name}} herunterladen', en: 'Download {{name}}', fr: 'Télécharger {{name}}' },
|
|
74
|
-
'MessagingAttachments.PREVIEW': { de: '{{name}} als Vorschau öffnen', en: 'Preview {{name}}', fr: 'Prévisualiser {{name}}' },
|
|
75
|
-
'MessagingAttachments.CLOSE_PREVIEW': { de: 'Vorschau schliessen', en: 'Close preview', fr: 'Fermer l’aperçu' },
|
|
76
|
-
'MessagingAttachments.DOWNLOAD_ACTION': { de: 'Herunterladen', en: 'Download', fr: 'Télécharger' },
|
|
77
|
-
'MessagingAttachments.LOADING_PREVIEW': { de: 'Vorschau wird geladen', en: 'Loading preview', fr: 'Chargement de l’aperçu' },
|
|
78
|
-
'MessagingAttachments.PREVIEW_ERROR': { de: 'Vorschau konnte nicht geladen werden.', en: 'Preview could not be loaded.', fr: 'Impossible de charger l’aperçu.' },
|
|
79
|
-
'MessagingReactions.LABEL': { de: 'Reaktionen', en: 'Reactions', fr: 'Réactions' },
|
|
80
|
-
'MessagingReactions.ADD': { de: 'Reaktion hinzufügen', en: 'Add reaction', fr: 'Ajouter une réaction' },
|
|
81
|
-
'MessagingReactions.TOGGLE_one': { de: '{{emoji}} Reaktion mit {{count}} Stimme umschalten', en: 'Toggle {{emoji}} reaction with {{count}} vote', fr: 'Basculer la réaction {{emoji}} avec {{count}} vote' },
|
|
82
|
-
'MessagingReactions.TOGGLE_other': { de: '{{emoji}} Reaktion mit {{count}} Stimmen umschalten', en: 'Toggle {{emoji}} reaction with {{count}} votes', fr: 'Basculer la réaction {{emoji}} avec {{count}} votes' },
|
|
83
|
-
'MessagingReactions.ERROR': { de: 'Reaktion konnte nicht gespeichert werden: {{message}}', en: 'Reaction could not be saved: {{message}}', fr: 'Impossible d’enregistrer la réaction : {{message}}' },
|
|
84
|
-
'MessagingPoll.LABEL': { de: 'Umfrage', en: 'Poll', fr: 'Sondage' },
|
|
85
|
-
'MessagingPoll.CLOSE': { de: 'Umfrage schliessen', en: 'Close poll', fr: 'Clore le sondage' },
|
|
86
|
-
'MessagingPoll.CLOSED': { de: 'Geschlossen', en: 'Closed', fr: 'Clos' },
|
|
87
|
-
'MessagingPoll.OPTION_RESULT': { de: '{{count}} ({{percent}} %)', en: '{{count}} ({{percent}}%)', fr: '{{count}} ({{percent}} %)' },
|
|
88
|
-
'MessagingPoll.VOTE_ERROR': { de: 'Stimme konnte nicht gespeichert werden: {{message}}', en: 'Vote could not be saved: {{message}}', fr: 'Impossible d’enregistrer le vote : {{message}}' },
|
|
89
|
-
'MessagingPoll.CLOSE_ERROR': { de: 'Umfrage konnte nicht geschlossen werden: {{message}}', en: 'Poll could not be closed: {{message}}', fr: 'Impossible de clore le sondage : {{message}}' },
|
|
90
|
-
'MessagingPoll.CREATE': { de: 'Umfrage erstellen', en: 'Create poll', fr: 'Créer un sondage' },
|
|
91
|
-
'MessagingPoll.CREATE_ERROR': { de: 'Umfrage konnte nicht erstellt werden: {{message}}', en: 'Poll could not be created: {{message}}', fr: 'Impossible de créer le sondage : {{message}}' },
|
|
92
|
-
'MessagingPoll.CREATE_VALIDATION': { de: 'Frage und mindestens zwei Optionen sind erforderlich.', en: 'A question and at least two options are required.', fr: 'Une question et au moins deux options sont requises.' },
|
|
93
|
-
'MessagingPoll.QUESTION': { de: 'Frage', en: 'Question', fr: 'Question' },
|
|
94
|
-
'MessagingPoll.OPTION': { de: 'Option {{count}}', en: 'Option {{count}}', fr: 'Option {{count}}' },
|
|
95
|
-
'MessagingPoll.ADD_OPTION': { de: 'Option hinzufügen', en: 'Add option', fr: 'Ajouter une option' },
|
|
96
|
-
'MessagingPoll.ALLOW_MULTIPLE': { de: 'Mehrfachauswahl erlauben', en: 'Allow multiple choices', fr: 'Autoriser plusieurs choix' },
|
|
97
|
-
'MessagingPoll.CANCEL': { de: 'Abbrechen', en: 'Cancel', fr: 'Annuler' },
|
|
98
|
-
'MessagingPoll.YOU_VOTED': { de: 'von dir gewählt', en: 'voted by you', fr: 'voté par vous' },
|
|
99
|
-
'MessagingConfig.LABEL': { de: 'Nachrichten-Einstellungen', en: 'Messaging settings', fr: 'Paramètres de messagerie' },
|
|
100
|
-
'MessagingConfig.TITLE': { de: 'Nachrichten-Einstellungen', en: 'Messaging settings', fr: 'Paramètres de messagerie' },
|
|
101
|
-
'MessagingConfig.LOADING': { de: 'Einstellungen werden geladen…', en: 'Loading settings…', fr: 'Chargement des paramètres…' },
|
|
102
|
-
'MessagingConfig.LOAD_ERROR': { de: 'Einstellungen konnten nicht geladen werden: {{message}}', en: 'Settings could not be loaded: {{message}}', fr: 'Impossible de charger les paramètres : {{message}}' },
|
|
103
|
-
'MessagingConfig.SAVE_ERROR': { de: 'Einstellungen konnten nicht gespeichert werden: {{message}}', en: 'Settings could not be saved: {{message}}', fr: 'Impossible d’enregistrer les paramètres : {{message}}' },
|
|
104
|
-
'MessagingConfig.DM_POLICY': { de: 'Direktnachrichten-Regel', en: 'Direct-message policy', fr: 'Règle des messages directs' },
|
|
105
|
-
'MessagingConfig.DM_ALL': { de: 'Alle', en: 'Everyone', fr: 'Tout le monde' },
|
|
106
|
-
'MessagingConfig.DM_SHARED': { de: 'Nur gemeinsame Gruppen', en: 'Shared groups only', fr: 'Groupes communs uniquement' },
|
|
107
|
-
'MessagingConfig.DM_TEAM': { de: 'Nur Team', en: 'Team only', fr: 'Équipe uniquement' },
|
|
108
|
-
'MessagingConfig.GROUP_ENABLED': { de: 'Gruppenchat aktivieren', en: 'Enable group chat', fr: 'Activer le chat de groupe' },
|
|
109
|
-
'MessagingConfig.EVERYONE_POSTS': { de: 'Alle dürfen schreiben', en: 'Everyone can post', fr: 'Tout le monde peut publier' },
|
|
110
|
-
'MessagingAnnouncement.CREATE': { de: 'Ankündigung erstellen', en: 'Create announcement', fr: 'Créer une annonce' },
|
|
111
|
-
'MessagingAnnouncement.TITLE': { de: 'Titel', en: 'Title', fr: 'Titre' },
|
|
112
|
-
'MessagingAnnouncement.BODY': { de: 'Text', en: 'Body', fr: 'Texte' },
|
|
113
|
-
'MessagingAnnouncement.SEND': { de: 'Ankündigung senden', en: 'Send announcement', fr: 'Envoyer l’annonce' },
|
|
114
|
-
'MessagingAnnouncement.CANCEL': { de: 'Abbrechen', en: 'Cancel', fr: 'Annuler' },
|
|
115
|
-
'MessagingAnnouncement.VALIDATION': { de: 'Ein Titel ist erforderlich.', en: 'A title is required.', fr: 'Un titre est requis.' },
|
|
116
|
-
'MessagingAnnouncement.ERROR': { de: 'Ankündigung konnte nicht gesendet werden: {{message}}', en: 'Announcement could not be sent: {{message}}', fr: 'Impossible d’envoyer l’annonce : {{message}}' },
|
|
117
|
-
'MessagingAnnouncement.OPEN_LINK': { de: 'Link öffnen', en: 'Open link', fr: 'Ouvrir le lien' },
|
|
2
|
+
'MessagingComposer.ADD_EMOJI': { de: 'Emoji hinzufügen', en: 'Add emoji', fr: 'Ajouter un emoji', sw: 'Ongeza emoji' },
|
|
3
|
+
'MessagingComposer.EMOJI_PICKER': { de: 'Emoji auswählen', en: 'Choose an emoji', fr: 'Choisir un emoji', sw: 'Chagua emoji' },
|
|
4
|
+
'MessagingComposer.STAGED_FILES': { de: 'Vorgemerkte Anhänge', en: 'Staged attachments', fr: 'Pièces jointes préparées', sw: 'Viambatisho vilivyoandaliwa' },
|
|
5
|
+
'MessagingComposer.REMOVE_ATTACHMENT': { de: '{{name}} entfernen', en: 'Remove {{name}}', fr: 'Supprimer {{name}}', sw: 'Ondoa {{name}}' },
|
|
6
|
+
'MessagingComposer.UPLOADING': { de: 'Anhänge werden hochgeladen…', en: 'Uploading attachments…', fr: 'Téléversement des pièces jointes…', sw: 'Inapakia viambatisho…' },
|
|
7
|
+
'MessagingList.LABEL': { de: 'Unterhaltungen', en: 'Conversations', fr: 'Conversations', sw: 'Mazungumzo' },
|
|
8
|
+
'MessagingList.EMPTY': { de: 'Noch keine Unterhaltungen.', en: 'No conversations yet.', fr: 'Aucune conversation pour le moment.', sw: 'Bado hakuna mazungumzo.' },
|
|
9
|
+
'MessagingList.NO_MESSAGES': { de: 'Noch keine Nachrichten', en: 'No messages yet', fr: 'Aucun message pour le moment', sw: 'Bado hakuna ujumbe' },
|
|
10
|
+
'MessagingList.UNTITLED': { de: 'Unbenannte Unterhaltung', en: 'Untitled conversation', fr: 'Conversation sans titre', sw: 'Mazungumzo yasiyo na kichwa' },
|
|
11
|
+
'MessagingList.ACTIONS': { de: 'Aktionen für Unterhaltung', en: 'Conversation actions', fr: 'Actions de la conversation', sw: 'Vitendo vya mazungumzo' },
|
|
12
|
+
'MessagingList.LOAD_MORE': { de: 'Mehr laden', en: 'Load more', fr: 'Charger plus', sw: 'Pakia zaidi' },
|
|
13
|
+
'MessagingList.LOAD_ERROR': { de: 'Unterhaltungen konnten nicht geladen werden.', en: 'Conversations could not be loaded.', fr: 'Impossible de charger les conversations.', sw: 'Mazungumzo hayakuweza kupakiwa.' },
|
|
14
|
+
'MessagingList.ARCHIVE': { de: 'Archivieren', en: 'Archive', fr: 'Archiver', sw: 'Weka kwenye kumbukumbu' },
|
|
15
|
+
'MessagingList.ARCHIVE_ERROR': { de: 'Unterhaltung konnte nicht archiviert werden.', en: 'Conversation could not be archived.', fr: 'Impossible d’archiver la conversation.', sw: 'Mazungumzo hayakuweza kuwekwa kwenye kumbukumbu.' },
|
|
16
|
+
'MessagingList.MUTE': { de: 'Stummschalten', en: 'Mute', fr: 'Mettre en sourdine', sw: 'Nyamazisha' },
|
|
17
|
+
'MessagingList.UNMUTE': { de: 'Stummschaltung aufheben', en: 'Unmute', fr: 'Réactiver le son', sw: 'Ondoa unyamazishaji' },
|
|
18
|
+
'MessagingList.PREFERENCES_ERROR': { de: 'Einstellungen konnten nicht gespeichert werden.', en: 'Preferences could not be saved.', fr: 'Impossible d’enregistrer les préférences.', sw: 'Mapendeleo hayakuweza kuhifadhiwa.' },
|
|
19
|
+
'MessagingLaunchers.OPEN_GROUP': { de: 'Gruppenunterhaltung öffnen', en: 'Open group conversation', fr: 'Ouvrir la conversation de groupe', sw: 'Fungua mazungumzo ya kikundi' },
|
|
20
|
+
'MessagingLaunchers.OPEN_BROADCAST': { de: 'Ankündigungen öffnen', en: 'Open announcements', fr: 'Ouvrir les annonces', sw: 'Fungua matangazo' },
|
|
21
|
+
'MessagingLaunchers.OPEN_ERROR': { de: 'Unterhaltung konnte nicht geöffnet werden.', en: 'Conversation could not be opened.', fr: 'Impossible d’ouvrir la conversation.', sw: 'Mazungumzo hayakuweza kufunguliwa.' },
|
|
22
|
+
'MessagingThread.TIMELINE': { de: 'Nachrichtenverlauf', en: 'Message timeline', fr: 'Chronologie des messages', sw: 'Mfuatano wa ujumbe' },
|
|
23
|
+
'MessagingThread.MESSAGE': { de: 'Nachricht', en: 'Message', fr: 'Message', sw: 'Ujumbe' },
|
|
24
|
+
'MessagingThread.EMPTY': { de: 'Noch keine Nachrichten.', en: 'No messages yet.', fr: 'Aucun message pour le moment.', sw: 'Bado hakuna ujumbe.' },
|
|
25
|
+
'MessagingThread.LOAD_OLDER': { de: 'Ältere Nachrichten laden', en: 'Load older messages', fr: 'Charger les messages plus anciens', sw: 'Pakia ujumbe wa zamani' },
|
|
26
|
+
'MessagingThread.LOAD_ERROR': { de: 'Nachrichten konnten nicht geladen werden.', en: 'Messages could not be loaded.', fr: 'Impossible de charger les messages.', sw: 'Ujumbe haukuweza kupakiwa.' },
|
|
27
|
+
'MessagingThread.REPLIES_ERROR': { de: 'Antworten konnten nicht geladen werden.', en: 'Replies could not be loaded.', fr: 'Impossible de charger les réponses.', sw: 'Majibu hayakuweza kupakiwa.' },
|
|
28
|
+
'MessagingThread.DELETED': { de: 'Diese Nachricht wurde gelöscht.', en: 'This message was deleted.', fr: 'Ce message a été supprimé.', sw: 'Ujumbe huu ulifutwa.' },
|
|
29
|
+
'MessagingThread.EDITED': { de: 'bearbeitet', en: 'edited', fr: 'modifié', sw: 'umehaririwa' },
|
|
30
|
+
'MessagingThread.REPLY': { de: 'Antworten', en: 'Reply', fr: 'Répondre', sw: 'Jibu' },
|
|
31
|
+
'MessagingThread.REPLY_TO': { de: 'Antwort auf {{sender}}', en: 'Reply to {{sender}}', fr: 'Réponse à {{sender}}', sw: 'Jibu kwa {{sender}}' },
|
|
32
|
+
'MessagingThread.REPLYING_TO': { de: 'Antwort an {{sender}}', en: 'Replying to {{sender}}', fr: 'Réponse à {{sender}}', sw: 'Unamjibu {{sender}}' },
|
|
33
|
+
'MessagingThread.SHOW_REPLIES_one': { de: '{{count}} Antwort anzeigen', en: 'Show {{count}} reply', fr: 'Afficher {{count}} réponse', sw: 'Onyesha jibu {{count}}' },
|
|
34
|
+
'MessagingThread.SHOW_REPLIES_other': { de: '{{count}} Antworten anzeigen', en: 'Show {{count}} replies', fr: 'Afficher {{count}} réponses', sw: 'Onyesha majibu {{count}}' },
|
|
35
|
+
'MessagingThread.HIDE_REPLIES': { de: 'Antworten ausblenden', en: 'Hide replies', fr: 'Masquer les réponses', sw: 'Ficha majibu' },
|
|
36
|
+
'MessagingThread.UNREAD_REPLIES': { de: 'Ungelesene Antworten', en: 'Unread replies', fr: 'Réponses non lues', sw: 'Majibu ambayo hayajasomwa' },
|
|
37
|
+
'MessagingThread.UNKNOWN_SENDER': { de: 'Unbekannte Person', en: 'Unknown person', fr: 'Personne inconnue', sw: 'Mtu asiyejulikana' },
|
|
38
|
+
'MessagingThread.QUOTE_ATTACHMENT': { de: 'Anhang', en: 'Attachment', fr: 'Pièce jointe', sw: 'Kiambatisho' },
|
|
39
|
+
'MessagingActions.MENU': { de: 'Nachrichtenaktionen', en: 'Message actions', fr: 'Actions du message', sw: 'Vitendo vya ujumbe' },
|
|
40
|
+
'MessagingActions.EDIT': { de: 'Bearbeiten', en: 'Edit', fr: 'Modifier', sw: 'Hariri' },
|
|
41
|
+
'MessagingActions.SAVE': { de: 'Speichern', en: 'Save', fr: 'Enregistrer', sw: 'Hifadhi' },
|
|
42
|
+
'MessagingActions.CANCEL': { de: 'Abbrechen', en: 'Cancel', fr: 'Annuler', sw: 'Ghairi' },
|
|
43
|
+
'MessagingActions.DELETE': { de: 'Löschen', en: 'Delete', fr: 'Supprimer', sw: 'Futa' },
|
|
44
|
+
'MessagingActions.COPY': { de: 'Kopieren', en: 'Copy', fr: 'Copier', sw: 'Nakili' },
|
|
45
|
+
'MessagingActions.DELETE_CONFIRM_TITLE': { de: 'Nachricht löschen?', en: 'Delete message?', fr: 'Supprimer le message ?', sw: 'Ufute ujumbe?' },
|
|
46
|
+
'MessagingActions.DELETE_CONFIRM_BODY': { de: 'Diese Nachricht wird für alle entfernt.', en: 'This message will be removed for everyone.', fr: 'Ce message sera supprimé pour tout le monde.', sw: 'Ujumbe huu utaondolewa kwa kila mtu.' },
|
|
47
|
+
'MessagingActions.EDIT_ERROR': { de: 'Nachricht konnte nicht bearbeitet werden: {{message}}', en: 'Message could not be edited: {{message}}', fr: 'Impossible de modifier le message : {{message}}', sw: 'Ujumbe haukuweza kuhaririwa: {{message}}' },
|
|
48
|
+
'MessagingActions.DELETE_ERROR': { de: 'Nachricht konnte nicht gelöscht werden: {{message}}', en: 'Message could not be deleted: {{message}}', fr: 'Impossible de supprimer le message : {{message}}', sw: 'Ujumbe haukuweza kufutwa: {{message}}' },
|
|
49
|
+
'MessagingActions.COPY_ERROR': { de: 'Nachricht konnte nicht kopiert werden: {{message}}', en: 'Message could not be copied: {{message}}', fr: 'Impossible de copier le message : {{message}}', sw: 'Ujumbe haukuweza kunakiliwa: {{message}}' },
|
|
50
|
+
'MessagingDirect.LAUNCH': { de: 'Direktnachricht starten', en: 'Start direct message', fr: 'Démarrer un message direct', sw: 'Anza ujumbe wa moja kwa moja' },
|
|
51
|
+
'MessagingDirect.TITLE': { de: 'Direktnachricht starten', en: 'Start direct message', fr: 'Démarrer un message direct', sw: 'Anza ujumbe wa moja kwa moja' },
|
|
52
|
+
'MessagingDirect.CANDIDATES': { de: 'Empfängerinnen und Empfänger', en: 'Recipients', fr: 'Destinataires', sw: 'Wapokeaji' },
|
|
53
|
+
'MessagingDirect.EMPTY': { de: 'Keine Personen verfügbar.', en: 'No people are available.', fr: 'Aucune personne n’est disponible.', sw: 'Hakuna watu wanaopatikana.' },
|
|
54
|
+
'MessagingDirect.START': { de: 'Starten', en: 'Start', fr: 'Démarrer', sw: 'Anza' },
|
|
55
|
+
'MessagingDirect.STARTING': { de: 'Direktnachricht wird gestartet…', en: 'Starting direct message…', fr: 'Démarrage du message direct…', sw: 'Inaanzisha ujumbe wa moja kwa moja…' },
|
|
56
|
+
'MessagingDirect.CANCEL': { de: 'Abbrechen', en: 'Cancel', fr: 'Annuler', sw: 'Ghairi' },
|
|
57
|
+
'MessagingDirect.START_ERROR': { de: 'Direktnachricht konnte nicht gestartet werden.', en: 'Direct message could not be started.', fr: 'Impossible de démarrer le message direct.', sw: 'Ujumbe wa moja kwa moja haukuweza kuanzishwa.' },
|
|
58
|
+
'MessagingReadTicks.ALL_READ': { de: 'Von allen gelesen', en: 'Read by everyone', fr: 'Lu par tout le monde', sw: 'Wote wamesoma' },
|
|
59
|
+
'MessagingReadTicks.SENT': { de: 'Gesendet', en: 'Sent', fr: 'Envoyé', sw: 'Umetumwa' },
|
|
60
|
+
'MessagingReadTicks.READ_RATIO': { de: '{{read}} von {{total}} gelesen', en: '{{read}} of {{total}} read', fr: '{{read}} sur {{total}} lu(s)', sw: '{{read}} kati ya {{total}} wamesoma' },
|
|
61
|
+
'MessagingReadTicks.RECIPIENTS': { de: 'Lesebestätigungen', en: 'Read recipients', fr: 'Destinataires lus', sw: 'Wapokeaji waliosoma' },
|
|
62
|
+
'MessagingComposer.LABEL': { de: 'Nachricht verfassen', en: 'Compose message', fr: 'Rédiger un message', sw: 'Andika ujumbe' },
|
|
63
|
+
'MessagingComposer.MESSAGE': { de: 'Nachricht', en: 'Message', fr: 'Message', sw: 'Ujumbe' },
|
|
64
|
+
'MessagingComposer.SEND': { de: 'Senden', en: 'Send', fr: 'Envoyer', sw: 'Tuma' },
|
|
65
|
+
'MessagingComposer.RETRY': { de: 'Erneut versuchen', en: 'Retry', fr: 'Réessayer', sw: 'Jaribu tena' },
|
|
66
|
+
'MessagingComposer.ADD_ATTACHMENT': { de: 'Anhang hinzufügen', en: 'Add attachment', fr: 'Ajouter une pièce jointe', sw: 'Ongeza kiambatisho' },
|
|
67
|
+
'MessagingComposer.FILES_SELECTED_one': { de: '{{count}} Anhang ausgewählt', en: '{{count}} attachment selected', fr: '{{count}} pièce jointe sélectionnée', sw: 'Kiambatisho {{count}} kimechaguliwa' },
|
|
68
|
+
'MessagingComposer.FILES_SELECTED_other': { de: '{{count}} Anhänge ausgewählt', en: '{{count}} attachments selected', fr: '{{count}} pièces jointes sélectionnées', sw: 'Viambatisho {{count}} vimechaguliwa' },
|
|
69
|
+
'MessagingComposer.REPLYING_TO': { de: 'Antwort an {{sender}}', en: 'Replying to {{sender}}', fr: 'Réponse à {{sender}}', sw: 'Unamjibu {{sender}}' },
|
|
70
|
+
'MessagingComposer.SEND_ERROR': { de: 'Nachricht konnte nicht gesendet werden: {{message}}', en: 'Message could not be sent: {{message}}', fr: 'Impossible d’envoyer le message : {{message}}', sw: 'Ujumbe haukuweza kutumwa: {{message}}' },
|
|
71
|
+
'MessagingComposer.UPLOAD_ERROR': { de: 'Anhang wurde abgelehnt: {{message}}', en: 'Attachment was rejected: {{message}}', fr: 'La pièce jointe a été rejetée : {{message}}', sw: 'Kiambatisho kilikataliwa: {{message}}' },
|
|
72
|
+
'MessagingAttachments.LABEL': { de: 'Anhänge', en: 'Attachments', fr: 'Pièces jointes', sw: 'Viambatisho' },
|
|
73
|
+
'MessagingAttachments.DOWNLOAD': { de: '{{name}} herunterladen', en: 'Download {{name}}', fr: 'Télécharger {{name}}', sw: 'Pakua {{name}}' },
|
|
74
|
+
'MessagingAttachments.PREVIEW': { de: '{{name}} als Vorschau öffnen', en: 'Preview {{name}}', fr: 'Prévisualiser {{name}}', sw: 'Kagua {{name}}' },
|
|
75
|
+
'MessagingAttachments.CLOSE_PREVIEW': { de: 'Vorschau schliessen', en: 'Close preview', fr: 'Fermer l’aperçu', sw: 'Funga onyesho la kukagua' },
|
|
76
|
+
'MessagingAttachments.DOWNLOAD_ACTION': { de: 'Herunterladen', en: 'Download', fr: 'Télécharger', sw: 'Pakua' },
|
|
77
|
+
'MessagingAttachments.LOADING_PREVIEW': { de: 'Vorschau wird geladen', en: 'Loading preview', fr: 'Chargement de l’aperçu', sw: 'Inapakia onyesho la kukagua' },
|
|
78
|
+
'MessagingAttachments.PREVIEW_ERROR': { de: 'Vorschau konnte nicht geladen werden.', en: 'Preview could not be loaded.', fr: 'Impossible de charger l’aperçu.', sw: 'Onyesho la kukagua halikuweza kupakiwa.' },
|
|
79
|
+
'MessagingReactions.LABEL': { de: 'Reaktionen', en: 'Reactions', fr: 'Réactions', sw: 'Miitikio' },
|
|
80
|
+
'MessagingReactions.ADD': { de: 'Reaktion hinzufügen', en: 'Add reaction', fr: 'Ajouter une réaction', sw: 'Ongeza mwitikio' },
|
|
81
|
+
'MessagingReactions.TOGGLE_one': { de: '{{emoji}} Reaktion mit {{count}} Stimme umschalten', en: 'Toggle {{emoji}} reaction with {{count}} vote', fr: 'Basculer la réaction {{emoji}} avec {{count}} vote', sw: 'Badilisha mwitikio wa {{emoji}} wenye kura {{count}}' },
|
|
82
|
+
'MessagingReactions.TOGGLE_other': { de: '{{emoji}} Reaktion mit {{count}} Stimmen umschalten', en: 'Toggle {{emoji}} reaction with {{count}} votes', fr: 'Basculer la réaction {{emoji}} avec {{count}} votes', sw: 'Badilisha mwitikio wa {{emoji}} wenye kura {{count}}' },
|
|
83
|
+
'MessagingReactions.ERROR': { de: 'Reaktion konnte nicht gespeichert werden: {{message}}', en: 'Reaction could not be saved: {{message}}', fr: 'Impossible d’enregistrer la réaction : {{message}}', sw: 'Mwitikio haukuweza kuhifadhiwa: {{message}}' },
|
|
84
|
+
'MessagingPoll.LABEL': { de: 'Umfrage', en: 'Poll', fr: 'Sondage', sw: 'Kura ya maoni' },
|
|
85
|
+
'MessagingPoll.CLOSE': { de: 'Umfrage schliessen', en: 'Close poll', fr: 'Clore le sondage', sw: 'Funga kura ya maoni' },
|
|
86
|
+
'MessagingPoll.CLOSED': { de: 'Geschlossen', en: 'Closed', fr: 'Clos', sw: 'Imefungwa' },
|
|
87
|
+
'MessagingPoll.OPTION_RESULT': { de: '{{count}} ({{percent}} %)', en: '{{count}} ({{percent}}%)', fr: '{{count}} ({{percent}} %)', sw: '{{count}} ({{percent}}%)' },
|
|
88
|
+
'MessagingPoll.VOTE_ERROR': { de: 'Stimme konnte nicht gespeichert werden: {{message}}', en: 'Vote could not be saved: {{message}}', fr: 'Impossible d’enregistrer le vote : {{message}}', sw: 'Kura haikuweza kuhifadhiwa: {{message}}' },
|
|
89
|
+
'MessagingPoll.CLOSE_ERROR': { de: 'Umfrage konnte nicht geschlossen werden: {{message}}', en: 'Poll could not be closed: {{message}}', fr: 'Impossible de clore le sondage : {{message}}', sw: 'Kura ya maoni haikuweza kufungwa: {{message}}' },
|
|
90
|
+
'MessagingPoll.CREATE': { de: 'Umfrage erstellen', en: 'Create poll', fr: 'Créer un sondage', sw: 'Unda kura ya maoni' },
|
|
91
|
+
'MessagingPoll.CREATE_ERROR': { de: 'Umfrage konnte nicht erstellt werden: {{message}}', en: 'Poll could not be created: {{message}}', fr: 'Impossible de créer le sondage : {{message}}', sw: 'Kura ya maoni haikuweza kuundwa: {{message}}' },
|
|
92
|
+
'MessagingPoll.CREATE_VALIDATION': { de: 'Frage und mindestens zwei Optionen sind erforderlich.', en: 'A question and at least two options are required.', fr: 'Une question et au moins deux options sont requises.', sw: 'Swali na angalau chaguo mbili vinahitajika.' },
|
|
93
|
+
'MessagingPoll.QUESTION': { de: 'Frage', en: 'Question', fr: 'Question', sw: 'Swali' },
|
|
94
|
+
'MessagingPoll.OPTION': { de: 'Option {{count}}', en: 'Option {{count}}', fr: 'Option {{count}}', sw: 'Chaguo {{count}}' },
|
|
95
|
+
'MessagingPoll.ADD_OPTION': { de: 'Option hinzufügen', en: 'Add option', fr: 'Ajouter une option', sw: 'Ongeza chaguo' },
|
|
96
|
+
'MessagingPoll.ALLOW_MULTIPLE': { de: 'Mehrfachauswahl erlauben', en: 'Allow multiple choices', fr: 'Autoriser plusieurs choix', sw: 'Ruhusu chaguo nyingi' },
|
|
97
|
+
'MessagingPoll.CANCEL': { de: 'Abbrechen', en: 'Cancel', fr: 'Annuler', sw: 'Ghairi' },
|
|
98
|
+
'MessagingPoll.YOU_VOTED': { de: 'von dir gewählt', en: 'voted by you', fr: 'voté par vous', sw: 'ulichagua' },
|
|
99
|
+
'MessagingConfig.LABEL': { de: 'Nachrichten-Einstellungen', en: 'Messaging settings', fr: 'Paramètres de messagerie', sw: 'Mipangilio ya ujumbe' },
|
|
100
|
+
'MessagingConfig.TITLE': { de: 'Nachrichten-Einstellungen', en: 'Messaging settings', fr: 'Paramètres de messagerie', sw: 'Mipangilio ya ujumbe' },
|
|
101
|
+
'MessagingConfig.LOADING': { de: 'Einstellungen werden geladen…', en: 'Loading settings…', fr: 'Chargement des paramètres…', sw: 'Inapakia mipangilio…' },
|
|
102
|
+
'MessagingConfig.LOAD_ERROR': { de: 'Einstellungen konnten nicht geladen werden: {{message}}', en: 'Settings could not be loaded: {{message}}', fr: 'Impossible de charger les paramètres : {{message}}', sw: 'Mipangilio haikuweza kupakiwa: {{message}}' },
|
|
103
|
+
'MessagingConfig.SAVE_ERROR': { de: 'Einstellungen konnten nicht gespeichert werden: {{message}}', en: 'Settings could not be saved: {{message}}', fr: 'Impossible d’enregistrer les paramètres : {{message}}', sw: 'Mipangilio haikuweza kuhifadhiwa: {{message}}' },
|
|
104
|
+
'MessagingConfig.DM_POLICY': { de: 'Direktnachrichten-Regel', en: 'Direct-message policy', fr: 'Règle des messages directs', sw: 'Sera ya ujumbe wa moja kwa moja' },
|
|
105
|
+
'MessagingConfig.DM_ALL': { de: 'Alle', en: 'Everyone', fr: 'Tout le monde', sw: 'Kila mtu' },
|
|
106
|
+
'MessagingConfig.DM_SHARED': { de: 'Nur gemeinsame Gruppen', en: 'Shared groups only', fr: 'Groupes communs uniquement', sw: 'Vikundi vya pamoja pekee' },
|
|
107
|
+
'MessagingConfig.DM_TEAM': { de: 'Nur Team', en: 'Team only', fr: 'Équipe uniquement', sw: 'Timu pekee' },
|
|
108
|
+
'MessagingConfig.GROUP_ENABLED': { de: 'Gruppenchat aktivieren', en: 'Enable group chat', fr: 'Activer le chat de groupe', sw: 'Washa gumzo la kikundi' },
|
|
109
|
+
'MessagingConfig.EVERYONE_POSTS': { de: 'Alle dürfen schreiben', en: 'Everyone can post', fr: 'Tout le monde peut publier', sw: 'Kila mtu anaweza kutuma ujumbe' },
|
|
110
|
+
'MessagingAnnouncement.CREATE': { de: 'Ankündigung erstellen', en: 'Create announcement', fr: 'Créer une annonce', sw: 'Unda tangazo' },
|
|
111
|
+
'MessagingAnnouncement.TITLE': { de: 'Titel', en: 'Title', fr: 'Titre', sw: 'Kichwa' },
|
|
112
|
+
'MessagingAnnouncement.BODY': { de: 'Text', en: 'Body', fr: 'Texte', sw: 'Maandishi' },
|
|
113
|
+
'MessagingAnnouncement.SEND': { de: 'Ankündigung senden', en: 'Send announcement', fr: 'Envoyer l’annonce', sw: 'Tuma tangazo' },
|
|
114
|
+
'MessagingAnnouncement.CANCEL': { de: 'Abbrechen', en: 'Cancel', fr: 'Annuler', sw: 'Ghairi' },
|
|
115
|
+
'MessagingAnnouncement.VALIDATION': { de: 'Ein Titel ist erforderlich.', en: 'A title is required.', fr: 'Un titre est requis.', sw: 'Kichwa kinahitajika.' },
|
|
116
|
+
'MessagingAnnouncement.ERROR': { de: 'Ankündigung konnte nicht gesendet werden: {{message}}', en: 'Announcement could not be sent: {{message}}', fr: 'Impossible d’envoyer l’annonce : {{message}}', sw: 'Tangazo halikuweza kutumwa: {{message}}' },
|
|
117
|
+
'MessagingAnnouncement.OPEN_LINK': { de: 'Link öffnen', en: 'Open link', fr: 'Ouvrir le lien', sw: 'Fungua kiungo' },
|
|
118
118
|
};
|
package/package.json
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { useEffect } from 'react';
|
|
2
2
|
import { Box } from '@mui/material';
|
|
3
3
|
import { useTheme } from '@mui/material/styles';
|
|
4
4
|
import { useTranslation } from 'react-i18next';
|
|
@@ -7,8 +7,10 @@ import { useNeutralChartPalette } from './palette';
|
|
|
7
7
|
import {
|
|
8
8
|
DEFAULT_LEGEND_POSITION,
|
|
9
9
|
defaultNumericTickFormatter,
|
|
10
|
+
resolveChartHeight,
|
|
10
11
|
sizeYAxisForContent,
|
|
11
12
|
spaceForRotatedTicks,
|
|
13
|
+
warnOnHeightMismatch,
|
|
12
14
|
withAxisDefaults,
|
|
13
15
|
withChartSlotDefaults,
|
|
14
16
|
withGridDefaults,
|
|
@@ -24,6 +26,11 @@ import {
|
|
|
24
26
|
* the panel heading already names the quantity. Omitting one never suppresses
|
|
25
27
|
* a label the caller DID set (`withAxisDefaults` only ever falls back onto
|
|
26
28
|
* an axis without its own `label`).
|
|
29
|
+
*
|
|
30
|
+
* `minHeight` (CHART-8): a floor under an `aspect`-derived responsive height when `aspect` is
|
|
31
|
+
* set and `height` is not; otherwise (no `height`, no `aspect`) it sizes the chart itself. Once
|
|
32
|
+
* `height` is set, `height` sizes the chart and the wrapper never reserves more than that, even
|
|
33
|
+
* if `minHeight` is also passed and larger.
|
|
27
34
|
*/
|
|
28
35
|
export function BarChart({
|
|
29
36
|
series = [],
|
|
@@ -33,6 +40,7 @@ export function BarChart({
|
|
|
33
40
|
yAxis,
|
|
34
41
|
palette,
|
|
35
42
|
minHeight,
|
|
43
|
+
height,
|
|
36
44
|
aspect,
|
|
37
45
|
grid,
|
|
38
46
|
hideLegend = series.length <= 1,
|
|
@@ -45,6 +53,9 @@ export function BarChart({
|
|
|
45
53
|
const { i18n } = useTranslation();
|
|
46
54
|
const neutralPalette = useNeutralChartPalette();
|
|
47
55
|
|
|
56
|
+
useEffect(() => warnOnHeightMismatch('BarChart', { minHeight, height }), [minHeight, height]);
|
|
57
|
+
const { wrapperMinHeight, chartHeight } = resolveChartHeight({ minHeight, height, aspect });
|
|
58
|
+
|
|
48
59
|
const labelledXAxis = withAxisDefaults(
|
|
49
60
|
xAxis,
|
|
50
61
|
xAxisLabel,
|
|
@@ -69,9 +80,10 @@ export function BarChart({
|
|
|
69
80
|
);
|
|
70
81
|
|
|
71
82
|
return (
|
|
72
|
-
<Box data-testid="bar-chart-container" sx={{ width: '100%', minHeight, aspectRatio: aspect }}>
|
|
83
|
+
<Box data-testid="bar-chart-container" sx={{ width: '100%', minHeight: wrapperMinHeight, aspectRatio: aspect }}>
|
|
73
84
|
<MuiBarChart
|
|
74
85
|
{...chartProps}
|
|
86
|
+
height={chartHeight}
|
|
75
87
|
series={series}
|
|
76
88
|
xAxis={rotatedTickSpace.xAxis}
|
|
77
89
|
yAxis={sizedYAxis}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useId, useRef, useState } from 'react';
|
|
1
|
+
import React, { useEffect, useId, useRef, useState } from 'react';
|
|
2
2
|
import {
|
|
3
3
|
Alert,
|
|
4
4
|
Box,
|
|
@@ -11,12 +11,18 @@ import {
|
|
|
11
11
|
import { useTranslation } from 'react-i18next';
|
|
12
12
|
import { useTheme } from '@mui/material/styles';
|
|
13
13
|
import { exportChartPng, exportChartSvg } from './exportChart';
|
|
14
|
+
import { resolveChartHeight, warnOnHeightMismatch } from './chartDefaults';
|
|
14
15
|
|
|
15
16
|
export const CHART_FRAME_ROOT_SX = { p: 2 };
|
|
16
17
|
export const CHART_FRAME_ALERT_SX = { mt: 2 };
|
|
17
18
|
|
|
18
19
|
/**
|
|
19
20
|
* Chart-type-agnostic chart scaffolding. Children may be an X-Charts primitive or a bespoke SVG.
|
|
21
|
+
*
|
|
22
|
+
* `minHeight` (CHART-8): a floor under an `aspect`-derived responsive height when `aspect` is
|
|
23
|
+
* set and `height` is not; otherwise (no `height`, no `aspect`) it sizes the content box itself.
|
|
24
|
+
* Once `height` is set, `height` sizes the box and it never reserves more than that, even if
|
|
25
|
+
* `minHeight` is also passed and larger.
|
|
20
26
|
*/
|
|
21
27
|
export function ChartFrame({
|
|
22
28
|
title,
|
|
@@ -28,6 +34,7 @@ export function ChartFrame({
|
|
|
28
34
|
isEmpty = false,
|
|
29
35
|
emptyMessage,
|
|
30
36
|
minHeight,
|
|
37
|
+
height,
|
|
31
38
|
aspect,
|
|
32
39
|
exportOptions = false,
|
|
33
40
|
onExportSvg,
|
|
@@ -51,6 +58,9 @@ export function ChartFrame({
|
|
|
51
58
|
const chartLabel = ariaLabel || title;
|
|
52
59
|
const callerSx = Array.isArray(sx) ? sx : [sx];
|
|
53
60
|
|
|
61
|
+
useEffect(() => warnOnHeightMismatch('ChartFrame', { minHeight, height }), [minHeight, height]);
|
|
62
|
+
const { wrapperMinHeight, chartHeight } = resolveChartHeight({ minHeight, height, aspect });
|
|
63
|
+
|
|
54
64
|
const runExport = async (type) => {
|
|
55
65
|
setExportError(false);
|
|
56
66
|
try {
|
|
@@ -103,7 +113,8 @@ export function ChartFrame({
|
|
|
103
113
|
aria-labelledby={hasCustomAriaLabel ? undefined : titleId}
|
|
104
114
|
sx={{
|
|
105
115
|
width: '100%',
|
|
106
|
-
minHeight,
|
|
116
|
+
minHeight: wrapperMinHeight,
|
|
117
|
+
height: chartHeight,
|
|
107
118
|
aspectRatio: aspect,
|
|
108
119
|
display: 'flex',
|
|
109
120
|
alignItems: 'center',
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React from 'react';
|
|
1
|
+
import React, { useEffect } from 'react';
|
|
2
2
|
import { Box } from '@mui/material';
|
|
3
3
|
import { useTheme } from '@mui/material/styles';
|
|
4
4
|
import { useTranslation } from 'react-i18next';
|
|
@@ -10,8 +10,10 @@ import { useNeutralChartPalette } from './palette';
|
|
|
10
10
|
import {
|
|
11
11
|
DEFAULT_LEGEND_POSITION,
|
|
12
12
|
defaultNumericTickFormatter,
|
|
13
|
+
resolveChartHeight,
|
|
13
14
|
sizeYAxisForContent,
|
|
14
15
|
spaceForRotatedTicks,
|
|
16
|
+
warnOnHeightMismatch,
|
|
15
17
|
withAxisDefaults,
|
|
16
18
|
withChartSlotDefaults,
|
|
17
19
|
withGridDefaults,
|
|
@@ -41,6 +43,11 @@ function FilledMarkElement({ color, style, ...props }) {
|
|
|
41
43
|
* the quantity. Omitting one never suppresses a label the caller DID set
|
|
42
44
|
* (`withAxisDefaults` only ever falls back onto an axis without its own
|
|
43
45
|
* `label`).
|
|
46
|
+
*
|
|
47
|
+
* `minHeight` (CHART-8): a floor under an `aspect`-derived responsive height when `aspect` is
|
|
48
|
+
* set and `height` is not; otherwise (no `height`, no `aspect`) it sizes the chart itself. Once
|
|
49
|
+
* `height` is set, `height` sizes the chart and the wrapper never reserves more than that, even
|
|
50
|
+
* if `minHeight` is also passed and larger.
|
|
44
51
|
*/
|
|
45
52
|
export function LineChart({
|
|
46
53
|
series = [],
|
|
@@ -50,6 +57,7 @@ export function LineChart({
|
|
|
50
57
|
yAxis,
|
|
51
58
|
palette,
|
|
52
59
|
minHeight,
|
|
60
|
+
height,
|
|
53
61
|
aspect,
|
|
54
62
|
grid,
|
|
55
63
|
hideLegend = series.length <= 1,
|
|
@@ -63,6 +71,9 @@ export function LineChart({
|
|
|
63
71
|
const { i18n } = useTranslation();
|
|
64
72
|
const neutralPalette = useNeutralChartPalette();
|
|
65
73
|
|
|
74
|
+
useEffect(() => warnOnHeightMismatch('LineChart', { minHeight, height }), [minHeight, height]);
|
|
75
|
+
const { wrapperMinHeight, chartHeight } = resolveChartHeight({ minHeight, height, aspect });
|
|
76
|
+
|
|
66
77
|
const labelledXAxis = withAxisDefaults(
|
|
67
78
|
xAxis,
|
|
68
79
|
xAxisLabel,
|
|
@@ -92,9 +103,10 @@ export function LineChart({
|
|
|
92
103
|
);
|
|
93
104
|
|
|
94
105
|
return (
|
|
95
|
-
<Box data-testid="line-chart-container" sx={{ width: '100%', minHeight, aspectRatio: aspect }}>
|
|
106
|
+
<Box data-testid="line-chart-container" sx={{ width: '100%', minHeight: wrapperMinHeight, aspectRatio: aspect }}>
|
|
96
107
|
<MuiLineChart
|
|
97
108
|
{...chartProps}
|
|
109
|
+
height={chartHeight}
|
|
98
110
|
series={defaultedSeries}
|
|
99
111
|
xAxis={rotatedTickSpace.xAxis}
|
|
100
112
|
yAxis={sizedYAxis}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import React, { useMemo } from 'react';
|
|
1
|
+
import React, { useEffect, useMemo } from 'react';
|
|
2
2
|
import { Box } from '@mui/material';
|
|
3
3
|
import { useTheme } from '@mui/material/styles';
|
|
4
4
|
import { useTranslation } from 'react-i18next';
|
|
@@ -8,7 +8,9 @@ import { useNeutralChartPalette } from './palette';
|
|
|
8
8
|
import {
|
|
9
9
|
DEFAULT_LEGEND_POSITION,
|
|
10
10
|
defaultNumericTickFormatter,
|
|
11
|
+
resolveChartHeight,
|
|
11
12
|
sizeYAxisForContent,
|
|
13
|
+
warnOnHeightMismatch,
|
|
12
14
|
withAxisDefaults,
|
|
13
15
|
withChartSlotDefaults,
|
|
14
16
|
withGridDefaults,
|
|
@@ -151,6 +153,11 @@ export function ScatterReferenceLine({
|
|
|
151
153
|
* Reference geometry (a computed curve, a straight line, either with an optional label) is
|
|
152
154
|
* composed as `children` using `ScatterReferenceCurve`/`ScatterReferenceLine` above.
|
|
153
155
|
*
|
|
156
|
+
* `minHeight` (CHART-8): a floor under an `aspect`-derived responsive height when `aspect` is
|
|
157
|
+
* set and `height` is not; otherwise (no `height`, no `aspect`) it sizes the chart itself. Once
|
|
158
|
+
* `height` is set, `height` sizes the chart and the wrapper never reserves more than that, even
|
|
159
|
+
* if `minHeight` is also passed and larger.
|
|
160
|
+
*
|
|
154
161
|
* Tested magnitude: a few hundred marks (hram's largest cloud is ~300 points). Not verified,
|
|
155
162
|
* and not implied to hold, at thousands+.
|
|
156
163
|
*
|
|
@@ -171,6 +178,7 @@ export function ScatterChart({
|
|
|
171
178
|
yAxis,
|
|
172
179
|
palette,
|
|
173
180
|
minHeight,
|
|
181
|
+
height,
|
|
174
182
|
aspect,
|
|
175
183
|
grid,
|
|
176
184
|
hideLegend = series.length <= 1,
|
|
@@ -187,6 +195,9 @@ export function ScatterChart({
|
|
|
187
195
|
const { i18n } = useTranslation();
|
|
188
196
|
const neutralPalette = useNeutralChartPalette();
|
|
189
197
|
|
|
198
|
+
useEffect(() => warnOnHeightMismatch('ScatterChart', { minHeight, height }), [minHeight, height]);
|
|
199
|
+
const { wrapperMinHeight, chartHeight } = resolveChartHeight({ minHeight, height, aspect });
|
|
200
|
+
|
|
190
201
|
const labelledXAxis = withAxisDefaults(
|
|
191
202
|
xAxis,
|
|
192
203
|
xAxisLabel,
|
|
@@ -257,9 +268,10 @@ export function ScatterChart({
|
|
|
257
268
|
);
|
|
258
269
|
|
|
259
270
|
return (
|
|
260
|
-
<Box data-testid="scatter-chart-container" sx={{ width: '100%', minHeight, aspectRatio: aspect }}>
|
|
271
|
+
<Box data-testid="scatter-chart-container" sx={{ width: '100%', minHeight: wrapperMinHeight, aspectRatio: aspect }}>
|
|
261
272
|
<MuiScatterChart
|
|
262
273
|
{...chartProps}
|
|
274
|
+
height={chartHeight}
|
|
263
275
|
series={orderedSeries.map((item) => ({ markerSize, ...item }))}
|
|
264
276
|
xAxis={labelledXAxis}
|
|
265
277
|
yAxis={sizedYAxis}
|
|
@@ -271,6 +271,49 @@ export function defaultNumericTickFormatter(locale) {
|
|
|
271
271
|
: new Intl.NumberFormat(locale).format(value));
|
|
272
272
|
}
|
|
273
273
|
|
|
274
|
+
/**
|
|
275
|
+
* CHART-8: resolves the `{minHeight, height, aspect}` trio these presets accept into what the
|
|
276
|
+
* wrapper reserves and what height (if any) sizes the chart itself. Three-way, not two-way --
|
|
277
|
+
* `aspect` changes the answer:
|
|
278
|
+
* - `height` set -> it sizes the chart; the wrapper never reserves more than that (a caller-set
|
|
279
|
+
* `minHeight` larger than `height` is capped here, closing the dead-space gap this WO exists
|
|
280
|
+
* to fix -- equal values, or no `minHeight` at all, pass through unchanged).
|
|
281
|
+
* - no `height`, `aspect` set -> unchanged from before this WO: the wrapper's own `aspectRatio`
|
|
282
|
+
* derives its height from its width, and `minHeight` stays exactly what its name says, a floor
|
|
283
|
+
* stopping it collapsing on a narrow viewport. Do not give the chart a fixed height here --
|
|
284
|
+
* that would remove the responsive behaviour four live call sites rely on.
|
|
285
|
+
* - no `height`, no `aspect` -> `minHeight` sizes the chart itself. There is no other sizing
|
|
286
|
+
* information to go on, and a caller in this shape meant the chart to have that height, not
|
|
287
|
+
* merely a wrapper floor around an unsized chart.
|
|
288
|
+
*/
|
|
289
|
+
export function resolveChartHeight({ minHeight, height, aspect }) {
|
|
290
|
+
if (height != null) {
|
|
291
|
+
const wrapperMinHeight = minHeight != null && minHeight > height ? height : minHeight;
|
|
292
|
+
return { wrapperMinHeight, chartHeight: height };
|
|
293
|
+
}
|
|
294
|
+
if (aspect != null) {
|
|
295
|
+
return { wrapperMinHeight: minHeight, chartHeight: undefined };
|
|
296
|
+
}
|
|
297
|
+
return { wrapperMinHeight: minHeight, chartHeight: minHeight };
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* CHART-8: dev-only warning when a caller passes both `minHeight` and `height` and they disagree
|
|
302
|
+
* -- the incoherent pair this WO closes. Not a throw: a shared package throwing on a prop
|
|
303
|
+
* combination in production would break a consumer's page over a layout nit. Silent on the
|
|
304
|
+
* equal-value majority and on the legitimate `minHeight` + `aspect` (no `height`) combination.
|
|
305
|
+
*/
|
|
306
|
+
export function warnOnHeightMismatch(componentName, { minHeight, height }) {
|
|
307
|
+
if (process.env.NODE_ENV === 'production') return;
|
|
308
|
+
if (minHeight == null || height == null || minHeight === height) return;
|
|
309
|
+
// eslint-disable-next-line no-console
|
|
310
|
+
console.warn(
|
|
311
|
+
`[ui-core-micha] <${componentName}> received both minHeight={${minHeight}} and height={${height}}; `
|
|
312
|
+
+ 'they disagree, so height wins and the wrapper no longer reserves the extra space below the '
|
|
313
|
+
+ 'chart. Pass only height, or drop minHeight if it should just track height.',
|
|
314
|
+
);
|
|
315
|
+
}
|
|
316
|
+
|
|
274
317
|
export function withChartSlotDefaults(slotProps, legendPosition) {
|
|
275
318
|
const position = {
|
|
276
319
|
...DEFAULT_LEGEND_POSITION,
|