From 55255cf9f40d81dbf5486850bcaca2b26e51bf6c Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Thu, 30 Mar 2023 15:11:23 -0400 Subject: [PATCH 01/54] Change use of 'user'/'users'/'number of users'/etc when referring to license seats to use 'seat'/'seats'/'number of seats'/etc. --- .../enterprise_edition/enterprise_edition_left_panel.tsx | 4 ++-- .../analytics/system_analytics/system_analytics.tsx | 2 +- webapp/channels/src/components/pricing_modal/content.tsx | 2 +- .../src/components/pricing_modal/self_hosted_content.tsx | 2 +- .../src/components/purchase_modal/purchase_modal.tsx | 2 +- webapp/channels/src/components/seats_calculator/index.tsx | 4 ++-- .../self_hosted_purchase_modal/self_hosted_card.tsx | 2 +- webapp/channels/src/i18n/de.json | 4 ---- webapp/channels/src/i18n/en.json | 8 ++++---- webapp/channels/src/i18n/en_AU.json | 8 ++++---- webapp/channels/src/i18n/es.json | 1 - webapp/channels/src/i18n/fa.json | 1 - webapp/channels/src/i18n/hu.json | 1 - webapp/channels/src/i18n/ja.json | 4 ---- webapp/channels/src/i18n/nl.json | 4 ---- webapp/channels/src/i18n/pl.json | 4 ---- webapp/channels/src/i18n/ru.json | 4 ---- webapp/channels/src/i18n/sv.json | 4 ---- webapp/channels/src/i18n/tr.json | 4 ---- 19 files changed, 17 insertions(+), 48 deletions(-) diff --git a/webapp/channels/src/components/admin_console/license_settings/enterprise_edition/enterprise_edition_left_panel.tsx b/webapp/channels/src/components/admin_console/license_settings/enterprise_edition/enterprise_edition_left_panel.tsx index c3f37bfd93..790272b3a5 100644 --- a/webapp/channels/src/components/admin_console/license_settings/enterprise_edition/enterprise_edition_left_panel.tsx +++ b/webapp/channels/src/components/admin_console/license_settings/enterprise_edition/enterprise_edition_left_panel.tsx @@ -160,7 +160,7 @@ const EnterpriseEditionLeftPanel = ({ ); }; -type LegendValues = 'START DATE:' | 'EXPIRES:' | 'USERS:' | 'ACTIVE USERS:' | 'EDITION:' | 'LICENSE ISSUED:' | 'NAME:' | 'COMPANY / ORG:' +type LegendValues = 'START DATE:' | 'EXPIRES:' | 'LICENSED SEATS:' | 'ACTIVE USERS:' | 'EDITION:' | 'LICENSE ISSUED:' | 'NAME:' | 'COMPANY / ORG:' const renderLicenseValues = (activeUsers: number, seatsPurchased: number) => ({legend, value}: {legend: LegendValues; value: string | JSX.Element | null}, index: number): React.ReactNode => { if (legend === 'ACTIVE USERS:') { @@ -236,7 +236,7 @@ const renderLicenseContent = ( }> = [ {legend: 'START DATE:', value: startsAt}, {legend: 'EXPIRES:', value: expiresAt}, - {legend: 'USERS:', value: users}, + {legend: 'LICENSED SEATS:', value: users}, {legend: 'ACTIVE USERS:', value: activeUsers}, {legend: 'EDITION:', value: sku}, {legend: 'LICENSE ISSUED:', value: issued}, diff --git a/webapp/channels/src/components/analytics/system_analytics/system_analytics.tsx b/webapp/channels/src/components/analytics/system_analytics/system_analytics.tsx index b760279651..151941ee2a 100644 --- a/webapp/channels/src/components/analytics/system_analytics/system_analytics.tsx +++ b/webapp/channels/src/components/analytics/system_analytics/system_analytics.tsx @@ -348,7 +348,7 @@ export default class SystemAnalytics extends React.PureComponent { title={ } icon='fa-users' diff --git a/webapp/channels/src/components/pricing_modal/content.tsx b/webapp/channels/src/components/pricing_modal/content.tsx index e0f55999fe..b4712ec50f 100644 --- a/webapp/channels/src/components/pricing_modal/content.tsx +++ b/webapp/channels/src/components/pricing_modal/content.tsx @@ -396,7 +396,7 @@ function Content(props: ContentProps) { plan='Professional' planSummary={formatMessage({id: 'pricing_modal.planSummary.professional', defaultMessage: 'Scalable solutions for growing teams'})} price={`$${professionalPrice}`} - rate={formatMessage({id: 'pricing_modal.rate.userPerMonth', defaultMessage: 'USD per user/month {br}(billed annually)'}, { + rate={formatMessage({id: 'pricing_modal.rate.seatPerMonth', defaultMessage: 'USD per seat/month {br}(billed annually)'}, { br:
, b: (chunks: React.ReactNode | React.ReactNodeArray) => ( diff --git a/webapp/channels/src/components/pricing_modal/self_hosted_content.tsx b/webapp/channels/src/components/pricing_modal/self_hosted_content.tsx index 9edb86d824..67c1f8e69a 100644 --- a/webapp/channels/src/components/pricing_modal/self_hosted_content.tsx +++ b/webapp/channels/src/components/pricing_modal/self_hosted_content.tsx @@ -211,7 +211,7 @@ function SelfHostedContent(props: ContentProps) { plan='Professional' planSummary={formatMessage({id: 'pricing_modal.planSummary.professional', defaultMessage: 'Scalable solutions for growing teams'})} price={professionalPrice} - rate={formatMessage({id: 'pricing_modal.rate.userPerMonth', defaultMessage: 'USD per user/month {br}(billed annually)'}, { + rate={formatMessage({id: 'pricing_modal.rate.seatPerMonth', defaultMessage: 'USD per seat/month {br}(billed annually)'}, { br:
, b: (chunks: React.ReactNode | React.ReactNodeArray) => ( diff --git a/webapp/channels/src/components/purchase_modal/purchase_modal.tsx b/webapp/channels/src/components/purchase_modal/purchase_modal.tsx index 3fdfe6f319..41b67d198c 100644 --- a/webapp/channels/src/components/purchase_modal/purchase_modal.tsx +++ b/webapp/channels/src/components/purchase_modal/purchase_modal.tsx @@ -730,7 +730,7 @@ class PurchaseModal extends React.PureComponent { this.state.selectedProduct ? this.state.selectedProduct.name : '', )} price={yearlyProductMonthlyPrice} - rate={formatMessage({id: 'pricing_modal.rate.userPerMonth', defaultMessage: 'USD per user/month {br}(billed annually)'}, { + rate={formatMessage({id: 'pricing_modal.rate.seatPerMonth', defaultMessage: 'USD per seat/month {br}(billed annually)'}, { br:
, b: (chunks: React.ReactNode | React.ReactNodeArray) => ( diff --git a/webapp/channels/src/components/seats_calculator/index.tsx b/webapp/channels/src/components/seats_calculator/index.tsx index 57c3436576..9776868d71 100644 --- a/webapp/channels/src/components/seats_calculator/index.tsx +++ b/webapp/channels/src/components/seats_calculator/index.tsx @@ -167,7 +167,7 @@ export default function SeatsCalculator(props: Props) { type='text' value={props.seats.quantity} onChange={onChange} - placeholder={intl.formatMessage({id: 'self_hosted_signup.seats', defaultMessage: 'User seats'})} + placeholder={intl.formatMessage({id: 'self_hosted_signup.seats', defaultMessage: 'Seats'})} wrapperClassName='user_seats' inputClassName='user_seats' maxLength={maxSeats.toString().length + 1} @@ -197,7 +197,7 @@ export default function SeatsCalculator(props: Props) {
(billed annually)'}, { + rate={intl.formatMessage({id: 'pricing_modal.rate.seatPerMonth', defaultMessage: 'USD per seat/month {br}(billed annually)'}, { br:
, b: (chunks: React.ReactNode | React.ReactNodeArray) => ( diff --git a/webapp/channels/src/i18n/de.json b/webapp/channels/src/i18n/de.json index 01990e3010..cd3fbe5c63 100644 --- a/webapp/channels/src/i18n/de.json +++ b/webapp/channels/src/i18n/de.json @@ -2576,7 +2576,6 @@ "analytics.system.postTypes": "Nachrichten, Dateien und Hashtags", "analytics.system.privateGroups": "Private Kanäle", "analytics.system.publicChannels": "Öffentliche Kanäle", - "analytics.system.seatsPurchased": "Total bezahlte Nutzer", "analytics.system.skippedIntensiveQueries": "Um die Performance zu maximieren, sind einige Statistiken deaktiviert. Du kannst sie in der config.json reaktivieren.", "analytics.system.textPosts": "Nur-Text Beiträge", "analytics.system.title": "Systemstatistiken", @@ -4577,7 +4576,6 @@ "pricing_modal.planSummary.professional": "Skalierbare Lösungen für wachsende Teams", "pricing_modal.plan_label_trialDays": "{days} TAGE, DIE IM TEST VERBLEIBEN", "pricing_modal.price.freeForever": "Kostenlos für immer", - "pricing_modal.rate.userPerMonth": "USD pro Benutzer/Monat {br}(jährliche Abrechnung)", "pricing_modal.reviewDeploymentOptions": "Prüfe deine Bereitstellungsoptionen", "pricing_modal.start_trial.disclaimer": "Durch Auswahl von 30 Tage lang kostenlos testen, stimme ich dem Mattermost Software und Services License Agreement, der Datenschutz-Richtlinie und dem Erhalt von Produkt-E-Mails zu.", "pricing_modal.subtitle": "Wähle einen Plan um loszulegen", @@ -4720,7 +4718,6 @@ "self_hosted_signup.failed_export.subtitle": "Wir werden die Dinge von unserer Seite aus überprüfen und uns innerhalb von 3 Tagen bei dir melden, sobald deine Lizenz genehmigt ist. In der Zwischenzeit kannst du gerne die kostenlose Version unseres Produkts weiter nutzen.", "self_hosted_signup.failed_export.title": "Deine Transaktion wird überprüft", "self_hosted_signup.license_applied": "Deine {planName} Lizenz wurde jetzt angewendet. {planName} Funktionen sind jetzt verfügbar und einsatzbereit.", - "self_hosted_signup.line_item_subtotal": "{num} Nutzer × 12 Mo.", "self_hosted_signup.organization": "Name der Organisation", "self_hosted_signup.progress_step.applying_license": "Übertrage deine {planName} Lizenz auf deine Mattermost-Instanz", "self_hosted_signup.progress_step.submitting_payment": "Übermittlung von Zahlungsinformationen", @@ -4733,7 +4730,6 @@ "self_hosted_signup.retry": "Erneut versuchen", "self_hosted_signup.screening_description": "Wir werden die Dinge von unserer Seite aus überprüfen und uns innerhalb von 3 Tagen bei dir melden, sobald deine Lizenz genehmigt ist. In der Zwischenzeit kannst du gerne die kostenlose Version unseres Produkts weiter nutzen.", "self_hosted_signup.screening_title": "Deine Transaktion wird überprüft", - "self_hosted_signup.seats": "Benutzerplätze", "self_hosted_signup.signup_consequences": "Du erhältst eine Rechnung von heute. Deine Lizenz wird automatisch angewendet. Sieh, wie die Abrechnung funktioniert.", "self_hosted_signup.total": "Summe", "setting_item_max.cancel": "Abbrechen", diff --git a/webapp/channels/src/i18n/en.json b/webapp/channels/src/i18n/en.json index 6f147fa4ee..6061ac68d6 100644 --- a/webapp/channels/src/i18n/en.json +++ b/webapp/channels/src/i18n/en.json @@ -2575,7 +2575,7 @@ "analytics.system.postTypes": "Posts, Files and Hashtags", "analytics.system.privateGroups": "Private Channels", "analytics.system.publicChannels": "Public Channels", - "analytics.system.seatsPurchased": "Total paid users", + "analytics.system.seatsPurchased": "Licensed Seats", "analytics.system.skippedIntensiveQueries": "To maximize performance, some statistics are disabled. You can re-enable them in config.json.", "analytics.system.textPosts": "Posts with Text-only", "analytics.system.title": "System Statistics", @@ -4569,7 +4569,7 @@ "pricing_modal.planSummary.free": "Increased productivity for small teams", "pricing_modal.planSummary.professional": "Scalable solutions for growing teams", "pricing_modal.price.freeForever": "Free forever", - "pricing_modal.rate.userPerMonth": "USD per user/month {br}(billed annually)", + "pricing_modal.rate.seatPerMonth": "USD per seat/month {br}(billed annually)", "pricing_modal.reviewDeploymentOptions": "Review deployment options", "pricing_modal.start_trial.disclaimer": "By selecting Try free for 30 days, I agree to the Mattermost Software and Services License Agreement, Privacy Policy, and receiving product emails.", "pricing_modal.subtitle": "Choose a plan to get started", @@ -4712,7 +4712,7 @@ "self_hosted_signup.failed_export.subtitle": "We will check things on our side and get back to you within 3 days once your license is approved. In the meantime, please feel free to continue using the free version of our product.", "self_hosted_signup.failed_export.title": "Your transaction is being reviewed", "self_hosted_signup.license_applied": "Your {planName} license has now been applied. {planName} features are now available and ready to use.", - "self_hosted_signup.line_item_subtotal": "{num} users × 12 mo.", + "self_hosted_signup.line_item_subtotal": "{num} seats × 12 mo.", "self_hosted_signup.organization": "Organization Name", "self_hosted_signup.progress_step.applying_license": "Applying your {planName} license to your Mattermost instance", "self_hosted_signup.progress_step.submitting_payment": "Submitting payment information", @@ -4725,7 +4725,7 @@ "self_hosted_signup.retry": "Try again", "self_hosted_signup.screening_description": "We will check things on our side and get back to you within 3 days once your license is approved. In the meantime, please feel free to continue using the free version of our product.", "self_hosted_signup.screening_title": "Your transaction is being reviewed", - "self_hosted_signup.seats": "User seats", + "self_hosted_signup.seats": "Seats", "self_hosted_signup.signup_consequences": "You will be billed today. Your license will be applied automatically. See how billing works.", "self_hosted_signup.total": "Total", "setting_item_max.cancel": "Cancel", diff --git a/webapp/channels/src/i18n/en_AU.json b/webapp/channels/src/i18n/en_AU.json index a8a38f34e8..b8c9128aae 100644 --- a/webapp/channels/src/i18n/en_AU.json +++ b/webapp/channels/src/i18n/en_AU.json @@ -2572,7 +2572,7 @@ "analytics.system.postTypes": "Posts, Files and Hashtags", "analytics.system.privateGroups": "Private Channels", "analytics.system.publicChannels": "Public Channels", - "analytics.system.seatsPurchased": "Total paid users", + "analytics.system.seatsPurchased": "Licensed Seats", "analytics.system.skippedIntensiveQueries": "To maximise performance, some statistics are disabled. You can re-enable them in config.json.", "analytics.system.textPosts": "Posts with Text-only", "analytics.system.title": "System Statistics", @@ -4540,7 +4540,7 @@ "pricing_modal.planSummary.professional": "Scalable solutions for growing teams", "pricing_modal.plan_label_trialDays": "{days} DAYS LEFT ON TRIAL", "pricing_modal.price.freeForever": "Free forever", - "pricing_modal.rate.userPerMonth": "USD per user/month {br}(billed annually)", + "pricing_modal.rate.seatPerMonth": "USD per seat/month {br}(billed annually)", "pricing_modal.reviewDeploymentOptions": "Review deployment options", "pricing_modal.start_trial.disclaimer": "By selecting Try free for 30 days, I agree to the Mattermost Software and Services Licence Agreement, Privacy Policy and receiving product emails.", "pricing_modal.subtitle": "Choose a plan to get started", @@ -4683,7 +4683,7 @@ "self_hosted_signup.failed_export.subtitle": "You will receive an email within 3 days to confirm the approval of your licence. In the meantime, please feel free to continue using the free version of our product.", "self_hosted_signup.failed_export.title": "Your transaction is being reviewed", "self_hosted_signup.license_applied": "Your {planName} licence has now been applied. {planName} features are now available and ready to use.", - "self_hosted_signup.line_item_subtotal": "{num} users × 12 months.", + "self_hosted_signup.line_item_subtotal": "{num} seats × 12 months.", "self_hosted_signup.organization": "Organisation Name", "self_hosted_signup.progress_step.applying_license": "Applying your {planName} licence to your Mattermost instance", "self_hosted_signup.progress_step.submitting_payment": "Submitting payment information", @@ -4696,7 +4696,7 @@ "self_hosted_signup.retry": "Try again", "self_hosted_signup.screening_description": "You will receive an email within 3 days to confirm the approval of your licence. In the meantime, please feel free to continue using the free version of our product.", "self_hosted_signup.screening_title": "Your transaction is being reviewed", - "self_hosted_signup.seats": "User seats", + "self_hosted_signup.seats": "Seats", "self_hosted_signup.signup_consequences": "You will be billed today. Your licence will be applied automatically. See how billing works.", "self_hosted_signup.total": "Total", "setting_item_max.cancel": "Cancel", diff --git a/webapp/channels/src/i18n/es.json b/webapp/channels/src/i18n/es.json index 28de93f5e2..2730763abe 100644 --- a/webapp/channels/src/i18n/es.json +++ b/webapp/channels/src/i18n/es.json @@ -4176,7 +4176,6 @@ "pricing_modal.planSummary.enterprise": "Administración, seguridad y cumplimiento para grandes equipos", "pricing_modal.plan_label_trialDays": "{days} DÍAS RESTANTES DE LA PRUEBA", "pricing_modal.price.freeForever": "Libre por siempre", - "pricing_modal.rate.userPerMonth": "/usuario/mes", "pricing_modal.subtitle": "Elige un plan para empezar", "promote_to_user_modal.desc": "Esta acción promueve al huésped {username} a miembro. Esto permitirá que el usuario se pueda unir a canales públicos y pueda interactuar con usuarios fuera de los canales de los cuales es miembro actualmente. ¿Está seguro que desea promover al huésped {username} a miembro?", "promote_to_user_modal.promote": "Promover", diff --git a/webapp/channels/src/i18n/fa.json b/webapp/channels/src/i18n/fa.json index 90132c93a1..86af91132c 100644 --- a/webapp/channels/src/i18n/fa.json +++ b/webapp/channels/src/i18n/fa.json @@ -4089,7 +4089,6 @@ "self_hosted_signup.organization": "نام سازمان", "self_hosted_signup.purchase_in_progress.reset": "شروع دوباره خرید", "self_hosted_signup.retry": "تلاش دوباره", - "self_hosted_signup.seats": "نشست‌های کاربران", "self_hosted_signup.total": "جمع", "setting_item_max.cancel": "انصراف", "setting_item_min.edit": "ویرایش کنید", diff --git a/webapp/channels/src/i18n/hu.json b/webapp/channels/src/i18n/hu.json index cf69f79c4c..aa0bfebfb6 100644 --- a/webapp/channels/src/i18n/hu.json +++ b/webapp/channels/src/i18n/hu.json @@ -4238,7 +4238,6 @@ "pricing_modal.planSummary.professional": "Skálázható megoldások növekvő csapatok számára", "pricing_modal.plan_label_trialDays": "{days} NAP VAN HÁTRA A PRÓBAIDŐSZAKBÓL", "pricing_modal.price.freeForever": "Örökké ingyenes", - "pricing_modal.rate.userPerMonth": "/felhasználó/hónap", "pricing_modal.reviewDeploymentOptions": "A telepítési lehetőségek áttekintése", "pricing_modal.subtitle": "Válasszon egy csomagot az induláshoz", "pricing_modal.title": "Válasszon csomagot", diff --git a/webapp/channels/src/i18n/ja.json b/webapp/channels/src/i18n/ja.json index fee7cc2e97..f2804b5e0d 100644 --- a/webapp/channels/src/i18n/ja.json +++ b/webapp/channels/src/i18n/ja.json @@ -2576,7 +2576,6 @@ "analytics.system.postTypes": "投稿、ファイル、ハッシュタグ", "analytics.system.privateGroups": "非公開チャンネル", "analytics.system.publicChannels": "公開チャンネル", - "analytics.system.seatsPurchased": "有償ユーザー数", "analytics.system.skippedIntensiveQueries": "パフォーマンスを最大化するため無効化された統計情報があります。 config.jsonから、それらを再度有効にすることができます。", "analytics.system.textPosts": "テキストのみの投稿数", "analytics.system.title": "システムの使用統計", @@ -4577,7 +4576,6 @@ "pricing_modal.planSummary.professional": "成長するチームのためのスケーラブルなソリューション", "pricing_modal.plan_label_trialDays": "トライアル残り日数 {days}", "pricing_modal.price.freeForever": "永久無料", - "pricing_modal.rate.userPerMonth": "USD ユーザー/月 {br}(年間請求)", "pricing_modal.reviewDeploymentOptions": "デプロイオプションを確認する", "pricing_modal.start_trial.disclaimer": "30日間のトライアルを開始するを選択すると、Mattermost Software and Services License Agreementプライバシーポリシー に同意したことになり、製品に関する電子メールを受信するようになります。", "pricing_modal.subtitle": "プランを選んで開始", @@ -4720,7 +4718,6 @@ "self_hosted_signup.failed_export.subtitle": "あなたのライセンスが承認され次第、弊社側で確認を行い、3日以内に返信いたします。それまでの間は、Free版の製品を引き続きご利用ください。", "self_hosted_signup.failed_export.title": "取引きは審査中です", "self_hosted_signup.license_applied": "{planName} ライセンスが適用されました。{planName} の機能が利用可能になり、今すぐ使用することができます。", - "self_hosted_signup.line_item_subtotal": "{num} ユーザー x 12ヶ月。", "self_hosted_signup.organization": "組織名", "self_hosted_signup.progress_step.applying_license": "Mattermostインスタンスに {planName} ライセンスを適用しています", "self_hosted_signup.progress_step.submitting_payment": "支払い情報を提出する", @@ -4733,7 +4730,6 @@ "self_hosted_signup.retry": "際実行", "self_hosted_signup.screening_description": "あなたのライセンスが承認され次第、弊社側で確認を行い、3日以内に返信いたします。それまでの間は、Free版の製品を引き続きご利用ください。", "self_hosted_signup.screening_title": "取引きは審査中です", - "self_hosted_signup.seats": "ユーザーシート", "self_hosted_signup.signup_consequences": "本日課金されます。あなたのライセンスは自動で適用されます。課金の仕組みについてはこちらを参照してください。", "self_hosted_signup.total": "合計", "setting_item_max.cancel": "キャンセル", diff --git a/webapp/channels/src/i18n/nl.json b/webapp/channels/src/i18n/nl.json index 2b0c2deccf..d643a8523c 100644 --- a/webapp/channels/src/i18n/nl.json +++ b/webapp/channels/src/i18n/nl.json @@ -2574,7 +2574,6 @@ "analytics.system.postTypes": "Berichten, bestanden en hashtags", "analytics.system.privateGroups": "Privé-kanalen", "analytics.system.publicChannels": "Publieke kanalen", - "analytics.system.seatsPurchased": "Totaal aantal betaalde gebruikers", "analytics.system.skippedIntensiveQueries": "Om de prestaties te maximaliseren, zijn sommige statistieken uitgeschakeld. Je kan deze opnieuw inschakelen in config.json .", "analytics.system.textPosts": "Berichten met enkel tekst", "analytics.system.title": "Systeem-statistieken", @@ -4562,7 +4561,6 @@ "pricing_modal.planSummary.professional": "Schaalbare oplossingen voor groeiende teams", "pricing_modal.plan_label_trialDays": "{days} DAGEN OVER VAN PROEFPERIODE", "pricing_modal.price.freeForever": "Voor altijd gratis", - "pricing_modal.rate.userPerMonth": "USD per gebruiker/maand{br}(Jaarlijks gefactureerd)", "pricing_modal.reviewDeploymentOptions": "Bekijk de installatiemogelijkheden", "pricing_modal.start_trial.disclaimer": "Door Gratis 30 dagen proberen, te selecteren ga ik akkoord met de Mattermost Software Evaluatie Overeenkomst, Privacy Beleid, en het ontvangen van product emails.", "pricing_modal.subtitle": "Kies een plan om te beginnen", @@ -4705,7 +4703,6 @@ "self_hosted_signup.failed_export.subtitle": "Wij controleren de zaken aan onze kant en nemen binnen 3 dagen contact met jou op zodra jouuw licentie is goedgekeurd. In de tussentijd kan je gerust de gratis versie van ons product blijven gebruiken.", "self_hosted_signup.failed_export.title": "Jouw transactie wordt bekeken", "self_hosted_signup.license_applied": "Jouw {planName} licentie is nu toegepast. {planName} functies zijn nu beschikbaar en klaar voor gebruik.", - "self_hosted_signup.line_item_subtotal": "{num} gebruikers × 12 maanden.", "self_hosted_signup.organization": "Naam organisatie", "self_hosted_signup.progress_step.applying_license": "Jouw {planName} licentie toepassen op jouw Mattermost instantie", "self_hosted_signup.progress_step.submitting_payment": "Betalingsinformatie indienen", @@ -4718,7 +4715,6 @@ "self_hosted_signup.retry": "Probeer opnieuw", "self_hosted_signup.screening_description": "Wij controleren de zaken aan onze kant en nemen binnen 3 dagen contact met jou op zodra jouuw licentie is goedgekeurd. In de tussentijd kan je gerust de gratis versie van ons product blijven gebruiken.", "self_hosted_signup.screening_title": "Jouw transactie wordt bekeken", - "self_hosted_signup.seats": "Gebruikersstoelen", "self_hosted_signup.signup_consequences": "Je wordt gefactureerd op *today*. Jouw licentie wordt automatisch toegepast. Zie hoe facturering werkt.", "self_hosted_signup.total": "Totaal", "setting_item_max.cancel": "Annuleren", diff --git a/webapp/channels/src/i18n/pl.json b/webapp/channels/src/i18n/pl.json index 96eda0f3b4..be3310220a 100644 --- a/webapp/channels/src/i18n/pl.json +++ b/webapp/channels/src/i18n/pl.json @@ -2576,7 +2576,6 @@ "analytics.system.postTypes": "Wiadomości, Pliki i Hashtagi", "analytics.system.privateGroups": "Kanały prywatne", "analytics.system.publicChannels": "Kanały publiczne", - "analytics.system.seatsPurchased": "Całkowita liczba użytkowników płatnych", "analytics.system.skippedIntensiveQueries": "Aby zmaksymalizować wydajność, niektóre statystyki są wyłączone. Możesz ponownie je włączyć w config.json.", "analytics.system.textPosts": "Wiadomości z samym tekstem", "analytics.system.title": "Statystyki systemu", @@ -4577,7 +4576,6 @@ "pricing_modal.planSummary.professional": "Skalowalne rozwiązania dla rozwijających się zespołów", "pricing_modal.plan_label_trialDays": "{days} POZOSTAŁO DNI TESTOWYCH", "pricing_modal.price.freeForever": "Bezpłatny na zawsze", - "pricing_modal.rate.userPerMonth": "USD za użytkownika/miesiąc {br}(rozliczane rocznie)", "pricing_modal.reviewDeploymentOptions": "Zapoznaj się z opcjami rozmieszczania", "pricing_modal.start_trial.disclaimer": "Wybierając opcję Wypróbuj przez 30 dni, wyrażam zgodę na Mattermost Software and Services License Agreement, Privacy Policy oraz na otrzymywanie wiadomości e-mail dotyczących produktu.", "pricing_modal.subtitle": "Wybierz plan, aby rozpocząć pracę", @@ -4720,7 +4718,6 @@ "self_hosted_signup.failed_export.subtitle": "Sprawdzimy wszystko po naszej stronie i skontaktujemy się z Tobą w ciągu 3 dni po zatwierdzeniu licencji. W międzyczasie prosimy o dalsze korzystanie z darmowej wersji naszego produktu.", "self_hosted_signup.failed_export.title": "Twoja transakcja jest sprawdzana", "self_hosted_signup.license_applied": "Twoja licencja {planName} została zastosowana. Funkcje {planName} są teraz dostępne i gotowe do użycia.", - "self_hosted_signup.line_item_subtotal": "{num} użytkownicy × 12-cy.", "self_hosted_signup.organization": "Nazwa organizacji", "self_hosted_signup.progress_step.applying_license": "Zastosowanie licencji {planName} do instancji Mattermost", "self_hosted_signup.progress_step.submitting_payment": "Przekazanie informacji o płatności", @@ -4733,7 +4730,6 @@ "self_hosted_signup.retry": "Spróbuj ponownie", "self_hosted_signup.screening_description": "Sprawdzimy wszystko po naszej stronie i skontaktujemy się z Tobą w ciągu 3 dni po zatwierdzeniu licencji. W międzyczasie prosimy o dalsze korzystanie z darmowej wersji naszego produktu.", "self_hosted_signup.screening_title": "Twoja transakcja jest sprawdzana", - "self_hosted_signup.seats": "Miejsca dla użytkowników", "self_hosted_signup.signup_consequences": "Zostaniesz rozliczony dzisiaj. Twoja licencja zostanie zastosowana automatycznie. Zobacz jak działa rozliczenie.", "self_hosted_signup.total": "Ogółem", "setting_item_max.cancel": "Anuluj", diff --git a/webapp/channels/src/i18n/ru.json b/webapp/channels/src/i18n/ru.json index bfca5442bf..6490e1b2b9 100644 --- a/webapp/channels/src/i18n/ru.json +++ b/webapp/channels/src/i18n/ru.json @@ -2576,7 +2576,6 @@ "analytics.system.postTypes": "Сообщения, файлы и хештэги", "analytics.system.privateGroups": "Приватные каналы", "analytics.system.publicChannels": "Публичные каналы", - "analytics.system.seatsPurchased": "Всего платных пользователей", "analytics.system.skippedIntensiveQueries": "Для обеспечения максимальной производительности некоторые статистические данные отключены. Вы можете повторно включить их в config.json.", "analytics.system.textPosts": "Только текстовые сообщения", "analytics.system.title": "Статистика системы", @@ -4564,7 +4563,6 @@ "pricing_modal.planSummary.professional": "Масштабируемые решения для растущих команд", "pricing_modal.plan_label_trialDays": "ОСТАЛОСЬ {days} ДНЕЙ НА ПРОБНУЮ ВЕРСИЮ", "pricing_modal.price.freeForever": "Бесплатно навсегда", - "pricing_modal.rate.userPerMonth": "USD за пользователя/месяц {br}(счет ежегодно)", "pricing_modal.reviewDeploymentOptions": "Обзор вариантов развертывания", "pricing_modal.start_trial.disclaimer": "Выбирая Попробовать бесплатно в течение 30 дней, я соглашаюсь с лицензионным соглашением на программное обеспечение и услуги Mattermost, политикой конфиденциальности, а также с получением электронных сообщений о продукте.", "pricing_modal.subtitle": "Выберите план, чтобы начать работу", @@ -4707,7 +4705,6 @@ "self_hosted_signup.failed_export.subtitle": "Мы проверим ситуацию на нашей стороне и свяжемся с вами в течение 3 дней, когда ваша лицензия будет одобрена. Тем временем, пожалуйста, продолжайте пользоваться бесплатной версией нашего продукта.", "self_hosted_signup.failed_export.title": "Ваша транзакция находится на рассмотрении", "self_hosted_signup.license_applied": "Ваша лицензия {planName} была применена. Функции {planName} теперь доступны и готовы к использованию.", - "self_hosted_signup.line_item_subtotal": "{num} пользователи × 12 мес.", "self_hosted_signup.organization": "Название организации", "self_hosted_signup.progress_step.applying_license": "Применение лицензии {planName} к экземпляру Mattermost", "self_hosted_signup.progress_step.submitting_payment": "Предоставление платежной информации", @@ -4720,7 +4717,6 @@ "self_hosted_signup.retry": "Попробовать снова", "self_hosted_signup.screening_description": "Мы проверим ситуацию на нашей стороне и свяжемся с вами в течение 3 дней, когда ваша лицензия будет одобрена. Тем временем, пожалуйста, продолжайте пользоваться бесплатной версией нашего продукта.", "self_hosted_signup.screening_title": "Ваша транзакция находится на рассмотрении", - "self_hosted_signup.seats": "Пользовательские места", "self_hosted_signup.signup_consequences": "Сегодня Вам будет выставлен счет. Ваша лицензия будет применена автоматически. Узнайте, как происходит выставление счетов.", "self_hosted_signup.total": "Всего", "setting_item_max.cancel": "Отмена", diff --git a/webapp/channels/src/i18n/sv.json b/webapp/channels/src/i18n/sv.json index 9ed2615d87..c52f96f039 100644 --- a/webapp/channels/src/i18n/sv.json +++ b/webapp/channels/src/i18n/sv.json @@ -2576,7 +2576,6 @@ "analytics.system.postTypes": "Meddelanden, filer och hashtags", "analytics.system.privateGroups": "Privat kanal", "analytics.system.publicChannels": "Publika kanaler", - "analytics.system.seatsPurchased": "Totala betalande användare", "analytics.system.skippedIntensiveQueries": "För att maximera prestanda så är viss statistik inaktiverad. Du kan aktivera dem i config.json.", "analytics.system.textPosts": "Meddelanden med endast text", "analytics.system.title": "Site statistik", @@ -4564,7 +4563,6 @@ "pricing_modal.planSummary.professional": "Skalbara lösningar för växande team", "pricing_modal.plan_label_trialDays": "{days} DAGAR KVAR AV PROVA-PÅ-PERIODEN", "pricing_modal.price.freeForever": "Gratis för alltid", - "pricing_modal.rate.userPerMonth": "USD per användare/månad {br}(faktureras årligen)", "pricing_modal.reviewDeploymentOptions": "Granska dina utrullningsalternativ", "pricing_modal.start_trial.disclaimer": "Genom att välja Testa gratis i 30 dagar, godkänner jag Mattermost Software and Services License Agreement, Privacy Policy och att få mejl med produktinformation.", "pricing_modal.subtitle": "Välj ett abonnemang för att komma igång", @@ -4707,7 +4705,6 @@ "self_hosted_signup.failed_export.subtitle": "Vi kommer kontrollera några saker på vår sida och när din licens är godkänd återkommer vi till dig inom tre dagar. Under tiden kan du gärna fortsätta att använda gratisversionen av vår produkt.", "self_hosted_signup.failed_export.title": "Din transaktion granskas", "self_hosted_signup.license_applied": "Din {planName} -licens har nu tillämpats. {planName} -funktionerna är nu tillgängliga och redo att användas.", - "self_hosted_signup.line_item_subtotal": "{num} användare × 12 månader.", "self_hosted_signup.organization": "Organisationens namn", "self_hosted_signup.progress_step.applying_license": "Applicerar din {planName} -licens på din Mattermost-instans", "self_hosted_signup.progress_step.submitting_payment": "Lämna betalningsuppgifter", @@ -4720,7 +4717,6 @@ "self_hosted_signup.retry": "Försök igen", "self_hosted_signup.screening_description": "Vi kommer att kontrollera saker och ting från vår sida och återkommer till dig inom tre dagar när din licens är godkänd. Under tiden kan du gärna fortsätta att använda gratisversionen av vår produkt.", "self_hosted_signup.screening_title": "Din transaktion håller på att granskas", - "self_hosted_signup.seats": "Användarplatser", "self_hosted_signup.signup_consequences": "Du kommer att debiteras idag. Din licens tillämpas automatiskt. Se hur faktureringen fungerar.", "self_hosted_signup.total": "Summa", "setting_item_max.cancel": "Avbryt", diff --git a/webapp/channels/src/i18n/tr.json b/webapp/channels/src/i18n/tr.json index 4c4e6c1fed..588a76ce27 100644 --- a/webapp/channels/src/i18n/tr.json +++ b/webapp/channels/src/i18n/tr.json @@ -2534,7 +2534,6 @@ "analytics.system.postTypes": "İletiler, dosyalar ve hashtaglar", "analytics.system.privateGroups": "Özel kanallar", "analytics.system.publicChannels": "Herkese açık kanallar", - "analytics.system.seatsPurchased": "Ücreti ödenmiş kullanıcı sayısı", "analytics.system.skippedIntensiveQueries": "En iyi başarımı elde etmek için bazı istatistikler devre dışı bırakılmıştır. Bu istatistikleri config.json içinden etkinleştirebilirsiniz.", "analytics.system.textPosts": "Yalnızca metin içeren iletiler", "analytics.system.title": "Sistem istatistikleri", @@ -4466,7 +4465,6 @@ "pricing_modal.planSummary.professional": "Büyük ekipler için yönetim, güvenlik ve uygunluk", "pricing_modal.plan_label_trialDays": "DENEMENİN BİTMESİNE {days} GÜN KALDI", "pricing_modal.price.freeForever": "Sonsuza dek ücretsiz", - "pricing_modal.rate.userPerMonth": "USD kullanıcı/ay{br}(yıllık faturalanır)", "pricing_modal.reviewDeploymentOptions": "Dağıtım seçeneklerini gözden geçirin", "pricing_modal.start_trial.disclaimer": "30 günlük ücretsiz denemeyi başlat üzerine tıklayarak, Mattermost yazılım ve hizmet lisans sözleşmesi, Kişisel verilerin gizliliği ilkesi metinlerini ve ürün ile ilgili e-postaları almayı kabul ediyorum.", "pricing_modal.subtitle": "Başlamak için bir tarife seçin", @@ -4608,7 +4606,6 @@ "self_hosted_signup.failed_export.subtitle": "Kontrollerimizi yapacağız ve lisansınızı onaylandıktan sonra 3 gün içinde size geri döneceğiz. Bu arada, lütfen ürünümüzün ücretsiz sürümünü kullanmayı sürdürmekten çekinmeyin.", "self_hosted_signup.failed_export.title": "İşleminiz inceleniyor", "self_hosted_signup.license_applied": "{planName} lisansınız etkinleştirildi. {planName} özelliklerini kullanabilirsiniz.", - "self_hosted_signup.line_item_subtotal": "{num} kullanıcı × 12 ay.", "self_hosted_signup.organization": "Kuruluş adı", "self_hosted_signup.progress_step.applying_license": "{planName} lisansınız Mattermost kopyanıza uygulanıyor", "self_hosted_signup.progress_step.submitting_payment": "Ödeme bilgileri gönderiliyor", @@ -4621,7 +4618,6 @@ "self_hosted_signup.retry": "Yeniden dene", "self_hosted_signup.screening_description": "Kontrollerimizi yapacağız ve lisansınızı onaylandıktan sonra 3 gün içinde size geri döneceğiz. Bu arada, lütfen ürünümüzün ücretsiz sürümünü kullanmayı sürdürmekten çekinmeyin.", "self_hosted_signup.screening_title": "İşleminiz inceleniyor", - "self_hosted_signup.seats": "Kullanıcı koltuk lisansı", "self_hosted_signup.signup_consequences": "Faturanız bugün kesilecek. Lisansınız otomatik olarak etkinleştirilecek. Faturalamanın nasıl işlediğine bakın.", "self_hosted_signup.total": "Toplam", "setting_item_max.cancel": "İptal", From 9791f74602e947d4e4d73cab5e24ff0755fd9e6d Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Thu, 30 Mar 2023 15:54:03 -0400 Subject: [PATCH 02/54] more user/seat wording changes. --- .../billing/invoice_user_count.tsx | 29 +++++++++---------- .../analytics/activated_users_card/index.tsx | 2 +- webapp/channels/src/i18n/bg.json | 1 - webapp/channels/src/i18n/de.json | 5 ---- webapp/channels/src/i18n/en.json | 9 +++--- webapp/channels/src/i18n/en_AU.json | 10 +++---- webapp/channels/src/i18n/es.json | 3 -- webapp/channels/src/i18n/fa.json | 2 -- webapp/channels/src/i18n/fr.json | 4 --- webapp/channels/src/i18n/hu.json | 3 -- webapp/channels/src/i18n/it.json | 3 -- webapp/channels/src/i18n/ja.json | 5 ---- webapp/channels/src/i18n/ko.json | 4 --- webapp/channels/src/i18n/nl.json | 5 ---- webapp/channels/src/i18n/pl.json | 5 ---- webapp/channels/src/i18n/pt-BR.json | 3 -- webapp/channels/src/i18n/ro.json | 1 - webapp/channels/src/i18n/ru.json | 5 ---- webapp/channels/src/i18n/sv.json | 5 ---- webapp/channels/src/i18n/tr.json | 5 ---- webapp/channels/src/i18n/zh-CN.json | 4 --- 21 files changed, 24 insertions(+), 89 deletions(-) diff --git a/webapp/channels/src/components/admin_console/billing/invoice_user_count.tsx b/webapp/channels/src/components/admin_console/billing/invoice_user_count.tsx index 896b7f0b63..20d17c0bb1 100644 --- a/webapp/channels/src/components/admin_console/billing/invoice_user_count.tsx +++ b/webapp/channels/src/components/admin_console/billing/invoice_user_count.tsx @@ -18,10 +18,9 @@ export default function InvoiceUserCount({invoice}: {invoice: Invoice}): JSX.Ele if (onPremUsers) { return ( ); @@ -45,10 +44,10 @@ export default function InvoiceUserCount({invoice}: {invoice: Invoice}): JSX.Ele return ( ); @@ -56,11 +55,11 @@ export default function InvoiceUserCount({invoice}: {invoice: Invoice}): JSX.Ele return ( ); diff --git a/webapp/channels/src/components/analytics/activated_users_card/index.tsx b/webapp/channels/src/components/analytics/activated_users_card/index.tsx index 1f4d6c68a3..cce7ac420c 100644 --- a/webapp/channels/src/components/analytics/activated_users_card/index.tsx +++ b/webapp/channels/src/components/analytics/activated_users_card/index.tsx @@ -56,7 +56,7 @@ export const ActivatedUserCard = ({activatedUsers, seatsPurchased, isCloud}: Act /> {(text) => {text}} diff --git a/webapp/channels/src/i18n/bg.json b/webapp/channels/src/i18n/bg.json index c5331d8e9c..6aabdc38d5 100644 --- a/webapp/channels/src/i18n/bg.json +++ b/webapp/channels/src/i18n/bg.json @@ -242,7 +242,6 @@ "admin.billing.history.title": "История на плащания", "admin.billing.history.total": "Общо", "admin.billing.history.transactions": "Транзакции", - "admin.billing.history.usersAndRates": "{fullUsers} потребители на пълна тарифа, {partialUsers} потребители с частично таксуване", "admin.billing.payment_info.add": "Добави кредитна карта", "admin.billing.payment_info.billingAddress": "Адрес за фактуриране", "admin.billing.payment_info.cardBrandAndDigits": "{brand} завършва на {digits}", diff --git a/webapp/channels/src/i18n/de.json b/webapp/channels/src/i18n/de.json index cd3fbe5c63..56c0a379f1 100644 --- a/webapp/channels/src/i18n/de.json +++ b/webapp/channels/src/i18n/de.json @@ -265,10 +265,7 @@ "admin.billing.history.allPaymentsShowHere": "Alle deine Rechnungen werden hier angezeigt", "admin.billing.history.date": "Datum", "admin.billing.history.description": "Beschreibung", - "admin.billing.history.fractionalAndRatedUsers": "{fractionalUsers} gebührenpflichtige Nutzer, {fullUsers} Nutzer zum vollen Tarif, {partialUsers} Nutzer mit Teilgebühren", - "admin.billing.history.fractionalUsers": "{fractionalUsers} Benutzer", "admin.billing.history.noBillingHistory": "Hier wird in Zukunft deine Abrechnungshistorie angezeigt.", - "admin.billing.history.onPremUsers": "{num} Benutzer", "admin.billing.history.pageInfo": "{startRecord} - {endRecord} von {totalRecords}", "admin.billing.history.paid": "Bezahlt", "admin.billing.history.paymentFailed": "Zahlungsvorgang fehlgeschlagen", @@ -278,7 +275,6 @@ "admin.billing.history.title": "Abrechnungshistorie", "admin.billing.history.total": "Total", "admin.billing.history.transactions": "Transaktionen", - "admin.billing.history.usersAndRates": "{fullUsers} Nutzer auf Vollrate, {partialUsers} Nutzer auf Teilrate", "admin.billing.payment_info.add": "Kreditkarte hinzufügen", "admin.billing.payment_info.billingAddress": "Rechnungsadresse", "admin.billing.payment_info.cardBrandAndDigits": "{brand} endet mit {digits}", @@ -2595,7 +2591,6 @@ "analytics.team.activeUsers": "Aktive Benutzer mit Beiträgen", "analytics.team.newlyCreated": "Neu erstellte Benutzer", "analytics.team.noTeams": "Auf diesem Server gibt es keine Teams, für die Statistiken eingesehen werden können.", - "analytics.team.overageUsersSeats": "Dies übersteigt die Zahl der bezahlten Nutzer", "analytics.team.privateGroups": "Private Kanäle", "analytics.team.publicChannels": "Öffentliche Kanäle", "analytics.team.recentUsers": "Zuletzt aktive Benutzer", diff --git a/webapp/channels/src/i18n/en.json b/webapp/channels/src/i18n/en.json index 6061ac68d6..96ba84bfa0 100644 --- a/webapp/channels/src/i18n/en.json +++ b/webapp/channels/src/i18n/en.json @@ -265,10 +265,9 @@ "admin.billing.history.allPaymentsShowHere": "All of your invoices will be shown here", "admin.billing.history.date": "Date", "admin.billing.history.description": "Description", - "admin.billing.history.fractionalAndRatedUsers": "{fractionalUsers} metered users, {fullUsers} users at full rate, {partialUsers} users with partial charges", - "admin.billing.history.fractionalUsers": "{fractionalUsers} users", + "admin.billing.history.fractionalSeats": "{fractionalUsers} seats", "admin.billing.history.noBillingHistory": "In the future, this is where your billing history will show.", - "admin.billing.history.onPremUsers": "{num} users", + "admin.billing.history.onPremSeats": "{num} seats", "admin.billing.history.pageInfo": "{startRecord} - {endRecord} of {totalRecords}", "admin.billing.history.paid": "Paid", "admin.billing.history.paymentFailed": "Payment failed", @@ -278,7 +277,7 @@ "admin.billing.history.title": "Billing History", "admin.billing.history.total": "Total", "admin.billing.history.transactions": "Transactions", - "admin.billing.history.usersAndRates": "{fullUsers} users at full rate, {partialUsers} users with partial charges", + "admin.billing.history.seatsAndRates": "{fullUsers} seats at full rate, {partialUsers} seats with partial charges", "admin.billing.payment_info_display.allCardsAccepted": "All major credit cards are accepted.", "admin.billing.payment_info_display.noPaymentInfo": "There are currently no credit cards on file.", "admin.billing.payment_info_display.savedPaymentDetails": "Your saved payment details", @@ -2595,7 +2594,7 @@ "analytics.team.activeUsers": "Active Users With Posts", "analytics.team.newlyCreated": "Newly Created Users", "analytics.team.noTeams": "This server has no teams for which to view statistics.", - "analytics.team.overageUsersSeats": "This exceeds total paid users", + "analytics.team.overageUsersSeats": "This exceeds total paid seats", "analytics.team.privateGroups": "Private Channels", "analytics.team.publicChannels": "Public Channels", "analytics.team.recentUsers": "Recent Active Users", diff --git a/webapp/channels/src/i18n/en_AU.json b/webapp/channels/src/i18n/en_AU.json index b8c9128aae..d83fe1e0e9 100644 --- a/webapp/channels/src/i18n/en_AU.json +++ b/webapp/channels/src/i18n/en_AU.json @@ -265,10 +265,10 @@ "admin.billing.history.allPaymentsShowHere": "All of your invoices will be shown here", "admin.billing.history.date": "Date", "admin.billing.history.description": "Description", - "admin.billing.history.fractionalAndRatedUsers": "{fractionalUsers} metered users, {fullUsers} users at full rate, {partialUsers} users with partial charges", - "admin.billing.history.fractionalUsers": "{fractionalUsers} users", + "admin.billing.history.fractionalAndRatedSeats": "{fractionalSeats} metered seats, {fullSeats} seats at full rate, {partialSeats} seats with partial charges", + "admin.billing.history.fractionalSeats": "{fractionalUsers} seats", "admin.billing.history.noBillingHistory": "In the future, this is where your billing history will show.", - "admin.billing.history.onPremUsers": "{num} users", + "admin.billing.history.onPremSeats": "{num} seats", "admin.billing.history.pageInfo": "{startRecord} - {endRecord} of {totalRecords}", "admin.billing.history.paid": "Paid", "admin.billing.history.paymentFailed": "Payment failed", @@ -278,7 +278,7 @@ "admin.billing.history.title": "Billing History", "admin.billing.history.total": "Total", "admin.billing.history.transactions": "Transactions", - "admin.billing.history.usersAndRates": "{fullUsers} users at full rate, {partialUsers} users with partial charges", + "admin.billing.history.seatsAndRates": "{fullSeats} seats at full rate, {partialSeats} seats with partial charges", "admin.billing.payment_info.add": "Add a Credit Card", "admin.billing.payment_info.billingAddress": "Billing Address", "admin.billing.payment_info.cardBrandAndDigits": "{brand} ending in {digits}", @@ -2592,7 +2592,7 @@ "analytics.team.activeUsers": "Active Users With Posts", "analytics.team.newlyCreated": "Newly Created Users", "analytics.team.noTeams": "This server has no teams for which to view statistics.", - "analytics.team.overageUsersSeats": "This exceeds total paid users", + "analytics.team.overageUsersSeats": "This exceeds total paid seats", "analytics.team.privateGroups": "Private Channels", "analytics.team.publicChannels": "Public Channels", "analytics.team.recentUsers": "Recent Active Users", diff --git a/webapp/channels/src/i18n/es.json b/webapp/channels/src/i18n/es.json index 2730763abe..29c0bb0a86 100644 --- a/webapp/channels/src/i18n/es.json +++ b/webapp/channels/src/i18n/es.json @@ -259,8 +259,6 @@ "admin.billing.history.allPaymentsShowHere": "Todos sus pagos mensuales se mostrarán aquí", "admin.billing.history.date": "Fecha", "admin.billing.history.description": "Descripción", - "admin.billing.history.fractionalAndRatedUsers": "{fractionalUsers} usuarios medidos, {fullUsers} usuarios con tarifa completa, {partialUsers} usuarios con tarifa parcial", - "admin.billing.history.fractionalUsers": "{fractionalUsers} usuarios", "admin.billing.history.noBillingHistory": "En el futuro, aquí es donde se mostrará su historial de facturación.", "admin.billing.history.pageInfo": "{startRecord} - {endRecord} de {totalRecords}", "admin.billing.history.paid": "Pagado", @@ -271,7 +269,6 @@ "admin.billing.history.title": "Historial de facturación", "admin.billing.history.total": "Total", "admin.billing.history.transactions": "Transacciones", - "admin.billing.history.usersAndRates": "{fullUsers} usuarios a tarifa completa, {partialUsers} usuarios con cargos parciales", "admin.billing.payment_info.add": "Agregar tarjeta de crédito", "admin.billing.payment_info.billingAddress": "Dirección de Facturación", "admin.billing.payment_info.cardBrandAndDigits": "{brand} terminada en {digits}", diff --git a/webapp/channels/src/i18n/fa.json b/webapp/channels/src/i18n/fa.json index 86af91132c..784302be1a 100644 --- a/webapp/channels/src/i18n/fa.json +++ b/webapp/channels/src/i18n/fa.json @@ -252,9 +252,7 @@ "admin.billing.history.allPaymentsShowHere": "همه پرداخت‌های ماهانه شما در اینجا نشان داده می‌شود", "admin.billing.history.date": "تاریخ", "admin.billing.history.description": "شرح", - "admin.billing.history.fractionalUsers": "کاربران {fractionalUsers}", "admin.billing.history.noBillingHistory": "در آینده، این جایی است که سابقه صورتحساب شما نشان داده خواهد شد.", - "admin.billing.history.onPremUsers": "{num} کاربر", "admin.billing.history.pageInfo": "{startRecord} - {endRecord} از {totalRecords}", "admin.billing.history.paid": "پرداخت شده", "admin.billing.history.paymentFailed": "پرداخت ناموفق", diff --git a/webapp/channels/src/i18n/fr.json b/webapp/channels/src/i18n/fr.json index 0b4cc9471e..51356da7f1 100644 --- a/webapp/channels/src/i18n/fr.json +++ b/webapp/channels/src/i18n/fr.json @@ -258,10 +258,7 @@ "admin.billing.history.allPaymentsShowHere": "Tous vos paiements mensuels apparaîtront ici", "admin.billing.history.date": "Date", "admin.billing.history.description": "Description", - "admin.billing.history.fractionalAndRatedUsers": "{fractionalUsers} utilisateurs mesurés, {fullUsers} utilisateurs à plein tarif, {partialUsers} utilisateurs avec des frais partiels", - "admin.billing.history.fractionalUsers": "{fractionalUsers} utilisateurs", "admin.billing.history.noBillingHistory": "À l'avenir, c'est ici que votre historique de facturation apparaîtra.", - "admin.billing.history.onPremUsers": "{num} utilisateurs", "admin.billing.history.pageInfo": "{startRecord} - {endRecord} de {totalRecords}", "admin.billing.history.paid": "Payé", "admin.billing.history.paymentFailed": "Échec du paiement", @@ -271,7 +268,6 @@ "admin.billing.history.title": "Historique de facturation", "admin.billing.history.total": "Total", "admin.billing.history.transactions": "Transactions", - "admin.billing.history.usersAndRates": "{fullUsers} utilisateurs à tarif plein, {partielsUsers} utilisateurs à tarif réduit", "admin.billing.payment_info.add": "Ajouter une carte de crédit", "admin.billing.payment_info.billingAddress": "Adresse de facturation", "admin.billing.payment_info.cardBrandAndDigits": "{marque} se terminant par {chiffres}", diff --git a/webapp/channels/src/i18n/hu.json b/webapp/channels/src/i18n/hu.json index aa0bfebfb6..be4db12af4 100644 --- a/webapp/channels/src/i18n/hu.json +++ b/webapp/channels/src/i18n/hu.json @@ -251,8 +251,6 @@ "admin.billing.history.allPaymentsShowHere": "Minden havi befizetése itt jelenik meg", "admin.billing.history.date": "Dátum", "admin.billing.history.description": "Leírás", - "admin.billing.history.fractionalAndRatedUsers": "{fractionalUsers} mért felhasználó, {fullUsers} felhasználó teljes díjszabással, {partialUsers} felhasználó részleges díjszabással", - "admin.billing.history.fractionalUsers": "{fractionalUsers} felhasználó", "admin.billing.history.noBillingHistory": "A jövőben itt fognak megjelenni a számlázási előzményei.", "admin.billing.history.pageInfo": "{startRecord} - {endRecord} / {totalRecords}", "admin.billing.history.paid": "Fizetett", @@ -263,7 +261,6 @@ "admin.billing.history.title": "Számlázási előzmények", "admin.billing.history.total": "Összesen", "admin.billing.history.transactions": "Tranzakciók", - "admin.billing.history.usersAndRates": "{fullUsers} felhasználó teljes áron, {partialUsers} felhasználó részleges díjakkal", "admin.billing.payment_info.add": "Hitelkártya hozzáadása", "admin.billing.payment_info.billingAddress": "Számlázási cím", "admin.billing.payment_info.cardBrandAndDigits": "{brand} {digits} végződéssel", diff --git a/webapp/channels/src/i18n/it.json b/webapp/channels/src/i18n/it.json index b64ecd9cd4..83ad4ec4d0 100644 --- a/webapp/channels/src/i18n/it.json +++ b/webapp/channels/src/i18n/it.json @@ -250,8 +250,6 @@ "admin.billing.history.allPaymentsShowHere": "Qui vengono mostrati tutti i pagamenti mensili", "admin.billing.history.date": "Data", "admin.billing.history.description": "Descrizione", - "admin.billing.history.fractionalAndRatedUsers": "{fractionalUsers} utenti misurati, {fullUsers} utenti a tariffa piena, {partialUsers} utenti con addebiti parziali", - "admin.billing.history.fractionalUsers": "{fractionalUsers} utenti", "admin.billing.history.noBillingHistory": "Prossimamente in questa sezione verrà mostrato lo storico delle fatturazioni.", "admin.billing.history.pageInfo": "{startRecord} - {endRecord} di {totalRecords}", "admin.billing.history.paid": "Pagato", @@ -262,7 +260,6 @@ "admin.billing.history.title": "Storico delle fatture", "admin.billing.history.total": "Totale", "admin.billing.history.transactions": "Transazioni", - "admin.billing.history.usersAndRates": "{fullUsers} utenti a tariffa piena, {partialUsers} utenti con addebiti parziali", "admin.billing.payment_info.add": "Aggiungi una carta di credito", "admin.billing.payment_info.billingAddress": "Indirizzo di pagamento", "admin.billing.payment_info.cardBrandAndDigits": "{brand} finisce in {digits}", diff --git a/webapp/channels/src/i18n/ja.json b/webapp/channels/src/i18n/ja.json index f2804b5e0d..30838c9df8 100644 --- a/webapp/channels/src/i18n/ja.json +++ b/webapp/channels/src/i18n/ja.json @@ -265,10 +265,7 @@ "admin.billing.history.allPaymentsShowHere": "すべての請求書がここに表示されます", "admin.billing.history.date": "日付", "admin.billing.history.description": "説明", - "admin.billing.history.fractionalAndRatedUsers": "従量制ユーザー: {fractionalUsers}名、正規料金のユーザー: {fullUsers}名、部分料金のユーザー: {partialUsers}名", - "admin.billing.history.fractionalUsers": "{fractionalUsers}ユーザー", "admin.billing.history.noBillingHistory": "今後、ここに請求履歴が表示されます。", - "admin.billing.history.onPremUsers": "{num} ユーザー", "admin.billing.history.pageInfo": "{startRecord} - {endRecord} of {totalRecords}", "admin.billing.history.paid": "支払い済", "admin.billing.history.paymentFailed": "支払い失敗", @@ -278,7 +275,6 @@ "admin.billing.history.title": "請求履歴", "admin.billing.history.total": "合計", "admin.billing.history.transactions": "処理", - "admin.billing.history.usersAndRates": "{fullUsers} ユーザーは全額課金、{partialUsers} ユーザーは一部課金", "admin.billing.payment_info.add": "クレジットカード情報を追加する", "admin.billing.payment_info.billingAddress": "請求先住所", "admin.billing.payment_info.cardBrandAndDigits": "末尾が {digits} の {brand}", @@ -2595,7 +2591,6 @@ "analytics.team.activeUsers": "投稿実績のあるアクティブユーザー", "analytics.team.newlyCreated": "新規作成ユーザー数", "analytics.team.noTeams": "このサーバーには統計情報を閲覧可能なチームが存在しません。", - "analytics.team.overageUsersSeats": "有償ユーザー数を超えています", "analytics.team.privateGroups": "非公開チャンネル", "analytics.team.publicChannels": "公開チャンネル", "analytics.team.recentUsers": "最近のアクティブユーザー数", diff --git a/webapp/channels/src/i18n/ko.json b/webapp/channels/src/i18n/ko.json index a73022b548..b2ad76db44 100644 --- a/webapp/channels/src/i18n/ko.json +++ b/webapp/channels/src/i18n/ko.json @@ -258,10 +258,7 @@ "admin.billing.history.allPaymentsShowHere": "모든 월별 결제 금액이 여기에 표시됩니다", "admin.billing.history.date": "날짜", "admin.billing.history.description": "설명", - "admin.billing.history.fractionalAndRatedUsers": "종량제 사용자: {fractionalUsers}명, 정규 요금 사용자: {fullUsers}명, 부분 요금 사용자: {partialUsers}명", - "admin.billing.history.fractionalUsers": "{fractionalUsers} 사용자", "admin.billing.history.noBillingHistory": "앞으로, 이곳에 결제내역이 표시됩니다.", - "admin.billing.history.onPremUsers": "{num}명의 사용자", "admin.billing.history.pageInfo": "{startRecord} - {endRecord} 의 {totalRecords}", "admin.billing.history.paid": "구매 완료", "admin.billing.history.paymentFailed": "결제 실패", @@ -271,7 +268,6 @@ "admin.billing.history.title": "결제 내역", "admin.billing.history.total": "합계", "admin.billing.history.transactions": "거래 내역", - "admin.billing.history.usersAndRates": "전체 요금의 사용자 {fullUsers}명, 부분 요금의 사용자 {partialUsers}명", "admin.billing.payment_info.add": "신용 카드 추가", "admin.billing.payment_info.billingAddress": "청구 주소", "admin.billing.payment_info.cardBrandAndDigits": "{digits}로 끝나는 {brand}카드", diff --git a/webapp/channels/src/i18n/nl.json b/webapp/channels/src/i18n/nl.json index d643a8523c..f3a8aed7c4 100644 --- a/webapp/channels/src/i18n/nl.json +++ b/webapp/channels/src/i18n/nl.json @@ -265,10 +265,7 @@ "admin.billing.history.allPaymentsShowHere": "Een overzicht van al je facturen zal hier worden weergegeven", "admin.billing.history.date": "Datum", "admin.billing.history.description": "Omschrijving", - "admin.billing.history.fractionalAndRatedUsers": "{fractionalUsers} gebruikers met beperkt gebruik, {fullUsers} gebruikers tegen vol tarief, {partialUsers} gebruikers met gedeeltelijke kosten", - "admin.billing.history.fractionalUsers": "{fractionalUsers} gebruikers", "admin.billing.history.noBillingHistory": "In de toekomst zal hier je facturatiegeschiedenis getoond worden.", - "admin.billing.history.onPremUsers": "{num} gebruikers", "admin.billing.history.pageInfo": "{startRecord}-{endRecord} van {totalRecords}", "admin.billing.history.paid": "Betaald", "admin.billing.history.paymentFailed": "Betaling is mislukt", @@ -278,7 +275,6 @@ "admin.billing.history.title": "Facturatiegeschiedenis", "admin.billing.history.total": "Totaal", "admin.billing.history.transactions": "Transacties", - "admin.billing.history.usersAndRates": "{fullUsers} gebruikers aan een volledig tarief, {partialUsers} gebruikers met verminderd tarief", "admin.billing.payment_info.add": "Voeg een kredietkaart toe", "admin.billing.payment_info.billingAddress": "Facturatieadres", "admin.billing.payment_info.cardBrandAndDigits": "{brand} eindigend op {digits}", @@ -2593,7 +2589,6 @@ "analytics.team.activeUsers": "Actieve gebruikers met berichten", "analytics.team.newlyCreated": "Nieuw gemaakte gebruikers", "analytics.team.noTeams": "Deze server heeft geen teams om statistische gegevens te bekijken.", - "analytics.team.overageUsersSeats": "Dit overtreft het totale aantal betaalde gebruikers", "analytics.team.privateGroups": "Privé-kanalen", "analytics.team.publicChannels": "Publieke kanalen", "analytics.team.recentUsers": "Recent actieve gebruikers", diff --git a/webapp/channels/src/i18n/pl.json b/webapp/channels/src/i18n/pl.json index be3310220a..c4784f3d61 100644 --- a/webapp/channels/src/i18n/pl.json +++ b/webapp/channels/src/i18n/pl.json @@ -265,10 +265,7 @@ "admin.billing.history.allPaymentsShowHere": "Wszystkie Twoje faktury będą widoczne tutaj", "admin.billing.history.date": "Data", "admin.billing.history.description": "Opis", - "admin.billing.history.fractionalAndRatedUsers": "{fractionalUsers} użytkownicy z opłatą licznikową, {fullUsers} użytkownicy z pełną stawką, {partialUsers} użytkownicy z opłatą częściową", - "admin.billing.history.fractionalUsers": "Użytkownicy {fractionalUsers}", "admin.billing.history.noBillingHistory": "W przyszłości w tym miejscu będzie widoczna historia Twoich rozliczeń.", - "admin.billing.history.onPremUsers": "{num} użytkowników", "admin.billing.history.pageInfo": "{startRecord} - {endRecord} z {totalRecords}", "admin.billing.history.paid": "Płatne", "admin.billing.history.paymentFailed": "Płatność nie powiodła się", @@ -278,7 +275,6 @@ "admin.billing.history.title": "Historia rozliczeń", "admin.billing.history.total": "Ogółem", "admin.billing.history.transactions": "Transakcje", - "admin.billing.history.usersAndRates": "{fullUsers} użytkownicy z pełną stawką, {partialUsers} użytkownicy z częściową opłatą", "admin.billing.payment_info.add": "Dodaj kartę kredytową", "admin.billing.payment_info.billingAddress": "Adres rozliczeniowy", "admin.billing.payment_info.cardBrandAndDigits": "{brand} kończący na {digits}", @@ -2595,7 +2591,6 @@ "analytics.team.activeUsers": "Aktywni użytkownicy z wiadomościami", "analytics.team.newlyCreated": "Nowi użytkownicy", "analytics.team.noTeams": "Nie ma na tym serwerze zespołów dla których można zobaczyć statystyki.", - "analytics.team.overageUsersSeats": "To przekracza łączną liczbę płatnych użytkowników", "analytics.team.privateGroups": "Kanały prywatne", "analytics.team.publicChannels": "Kanały publiczne", "analytics.team.recentUsers": "Ostatnio Aktywni Użytkownicy", diff --git a/webapp/channels/src/i18n/pt-BR.json b/webapp/channels/src/i18n/pt-BR.json index 7c727fa2d3..bf21ed7ea1 100644 --- a/webapp/channels/src/i18n/pt-BR.json +++ b/webapp/channels/src/i18n/pt-BR.json @@ -245,8 +245,6 @@ "admin.billing.history.allPaymentsShowHere": "Todos os seus pagamentos mensais serão exibidos aqui", "admin.billing.history.date": "Data", "admin.billing.history.description": "Descrição", - "admin.billing.history.fractionalAndRatedUsers": "{fractionalUsers} usuários medidos, {fullUsers} usuários com taxa total, {partialUsers} usuários com cobranças parciais", - "admin.billing.history.fractionalUsers": "{fractionalUsers} usuários", "admin.billing.history.noBillingHistory": "No futuro, é aqui que seu histórico de faturamento será exibido.", "admin.billing.history.pageInfo": "{startRecord} - {endRecord} de {totalRecords}", "admin.billing.history.paid": "Pago", @@ -257,7 +255,6 @@ "admin.billing.history.title": "Histórico de Pagamento", "admin.billing.history.total": "Total", "admin.billing.history.transactions": "Transações", - "admin.billing.history.usersAndRates": "{fullUsers} usuários com taxa total, {partialUsers} usuários com taxas parciais", "admin.billing.payment_info.add": "Adicionar um Cartão de Crédito", "admin.billing.payment_info.billingAddress": "Endereço de Cobrança", "admin.billing.payment_info.cardBrandAndDigits": "{brand} terminando em {digits}", diff --git a/webapp/channels/src/i18n/ro.json b/webapp/channels/src/i18n/ro.json index 1f71d191a4..19769ccd8d 100644 --- a/webapp/channels/src/i18n/ro.json +++ b/webapp/channels/src/i18n/ro.json @@ -240,7 +240,6 @@ "admin.billing.history.title": "Istoricul facturării", "admin.billing.history.total": "Total", "admin.billing.history.transactions": "Tranzacții", - "admin.billing.history.usersAndRates": "{fullUsers} utilizatori la tarif complet, {partialUsers} utilizatori cu taxe parțiale", "admin.billing.payment_info.add": "Adăugați un card de credit", "admin.billing.payment_info.billingAddress": "Adresa De Facturare", "admin.billing.payment_info.cardBrandAndDigits": "{brand} care se termină cu {digits}", diff --git a/webapp/channels/src/i18n/ru.json b/webapp/channels/src/i18n/ru.json index 6490e1b2b9..ee870bc6a2 100644 --- a/webapp/channels/src/i18n/ru.json +++ b/webapp/channels/src/i18n/ru.json @@ -265,10 +265,7 @@ "admin.billing.history.allPaymentsShowHere": "Здесь будут отображаться все ваши счета-фактуры", "admin.billing.history.date": "Дата", "admin.billing.history.description": "Описание", - "admin.billing.history.fractionalAndRatedUsers": "{fractionalUsers} подсчитанных пользователей, {fullUsers} пользователей с полной ставкой, {partialUsers} пользователей с частичной оплатой", - "admin.billing.history.fractionalUsers": "{fractionalUsers} пользователей", "admin.billing.history.noBillingHistory": "В будущем здесь будет отображаться история ваших счетов.", - "admin.billing.history.onPremUsers": "{num} пользователи", "admin.billing.history.pageInfo": "{startRecord} - {endRecord} из {totalRecords}", "admin.billing.history.paid": "Оплачен", "admin.billing.history.paymentFailed": "Платеж не прошел", @@ -278,7 +275,6 @@ "admin.billing.history.title": "История счетов", "admin.billing.history.total": "Всего", "admin.billing.history.transactions": "Транзакции", - "admin.billing.history.usersAndRates": "{fullUsers} пользователи на полную ставку, {partialUsers} пользователи с частичной оплатой", "admin.billing.payment_info.add": "Добавить кредитную карту", "admin.billing.payment_info.billingAddress": "Адрес для выставления счета", "admin.billing.payment_info.cardBrandAndDigits": "{brand} истекает {digits}", @@ -2595,7 +2591,6 @@ "analytics.team.activeUsers": "Активные пользователи с сообщениями", "analytics.team.newlyCreated": "Новые пользователи", "analytics.team.noTeams": "На этом сервере нет команд для которых можно просмотреть статистику.", - "analytics.team.overageUsersSeats": "Это превышает общее количество платных пользователей", "analytics.team.privateGroups": "Приватные каналы", "analytics.team.publicChannels": "Публичные каналы", "analytics.team.recentUsers": "Недавние активные пользователи", diff --git a/webapp/channels/src/i18n/sv.json b/webapp/channels/src/i18n/sv.json index c52f96f039..6f2c7bc76c 100644 --- a/webapp/channels/src/i18n/sv.json +++ b/webapp/channels/src/i18n/sv.json @@ -265,10 +265,7 @@ "admin.billing.history.allPaymentsShowHere": "Alla fakturor kommer visas här", "admin.billing.history.date": "Datum", "admin.billing.history.description": "Beskrivning", - "admin.billing.history.fractionalAndRatedUsers": "{fractionalUsers} användare som mäts, {fullUsers} användare med full kostnad, {partialUsers} användare med delkostnader", - "admin.billing.history.fractionalUsers": "{fractionalUsers} användare", "admin.billing.history.noBillingHistory": "I framtiden kommer din fakturahistorik visas här.", - "admin.billing.history.onPremUsers": "{num} användare", "admin.billing.history.pageInfo": "{startRecord} - {endRecord} av {totalRecords}", "admin.billing.history.paid": "Betald", "admin.billing.history.paymentFailed": "Betalning misslyckades", @@ -278,7 +275,6 @@ "admin.billing.history.title": "Betalhistorik", "admin.billing.history.total": "Summa", "admin.billing.history.transactions": "Transaktioner", - "admin.billing.history.usersAndRates": "{fullUsers} användare till full kostnad, {partialUsers} användare med rabatterad kostnad", "admin.billing.payment_info.add": "Lägg till betalkort", "admin.billing.payment_info.billingAddress": "Fakturaadress", "admin.billing.payment_info.cardBrandAndDigits": "{brand} tar slut om {digits}", @@ -2595,7 +2591,6 @@ "analytics.team.activeUsers": "Aktiva användare med meddelanden", "analytics.team.newlyCreated": "Nyligen skapade användare", "analytics.team.noTeams": "Servern har inga team som kan visa statistik.", - "analytics.team.overageUsersSeats": "Detta överstiger det totala antalet betalande användare", "analytics.team.privateGroups": "Privat kanal", "analytics.team.publicChannels": "Publika kanaler", "analytics.team.recentUsers": "Nyligen aktiva användare", diff --git a/webapp/channels/src/i18n/tr.json b/webapp/channels/src/i18n/tr.json index 588a76ce27..d61c34f273 100644 --- a/webapp/channels/src/i18n/tr.json +++ b/webapp/channels/src/i18n/tr.json @@ -258,10 +258,7 @@ "admin.billing.history.allPaymentsShowHere": "Tüm faturalanınız burada görüntülenir", "admin.billing.history.date": "Tarih", "admin.billing.history.description": "Açıklama", - "admin.billing.history.fractionalAndRatedUsers": "Sınırlı {fractionalUsers} kullanıcı, tam ücretli {fullUsers} kullanıcı, kısmi ücretli {partialUsers} kullanıcı", - "admin.billing.history.fractionalUsers": "{fractionalUsers} kullanıcı", "admin.billing.history.noBillingHistory": "Gelecekte, fatura geçmişiniz burada görüntülenecek.", - "admin.billing.history.onPremUsers": "{num} kullanıcı", "admin.billing.history.pageInfo": "{startRecord} - {endRecord} / {totalRecords}", "admin.billing.history.paid": "Ödendi", "admin.billing.history.paymentFailed": "Ödenmedi", @@ -271,7 +268,6 @@ "admin.billing.history.title": "Faturalama geçmişi", "admin.billing.history.total": "Toplam", "admin.billing.history.transactions": "İşlemler", - "admin.billing.history.usersAndRates": "{fullUsers} kullanıcı için tam ödeme, {partialUsers} kullanıcı için kısmi ödeme", "admin.billing.payment_info.add": "Kredi kartı ekle", "admin.billing.payment_info.billingAddress": "Fatura adresi", "admin.billing.payment_info.cardBrandAndDigits": "{brand} {digits} ile biten", @@ -2553,7 +2549,6 @@ "analytics.team.activeUsers": "İleti yazmış etkin kullanıcılar", "analytics.team.newlyCreated": "Yeni eklenen kullanıcılar", "analytics.team.noTeams": "Bu sunucuda istatistikleri görüntülenebilecek bir takım yok.", - "analytics.team.overageUsersSeats": "Bu ücreti ödenmiş kullanıcı sayısını aşıyor", "analytics.team.privateGroups": "Özel kanallar", "analytics.team.publicChannels": "Herkese açık kanallar", "analytics.team.recentUsers": "Son etkin kullanıcılar", diff --git a/webapp/channels/src/i18n/zh-CN.json b/webapp/channels/src/i18n/zh-CN.json index 2db89a3255..726b018637 100644 --- a/webapp/channels/src/i18n/zh-CN.json +++ b/webapp/channels/src/i18n/zh-CN.json @@ -265,10 +265,7 @@ "admin.billing.history.allPaymentsShowHere": "您所有的发票都将显示在这里", "admin.billing.history.date": "日期", "admin.billing.history.description": "描述", - "admin.billing.history.fractionalAndRatedUsers": "{fractionalUsers} 计量用户, {fullUsers} 全款用户, {partialUsers} 部分收费用户", - "admin.billing.history.fractionalUsers": "{fractionalUsers} 位用户", "admin.billing.history.noBillingHistory": "这是您的帐单记录显示的地方。", - "admin.billing.history.onPremUsers": "{num} 用户", "admin.billing.history.pageInfo": "{startRecord} - {endRecord},共 {totalRecords} 个", "admin.billing.history.paid": "已支付", "admin.billing.history.paymentFailed": "支付失败", @@ -278,7 +275,6 @@ "admin.billing.history.title": "帐单记录", "admin.billing.history.total": "总计", "admin.billing.history.transactions": "交易", - "admin.billing.history.usersAndRates": "{fullUsers} 位用户全额收费,{partialUsers} 位用户收取部分费用", "admin.billing.payment_info.add": "添加信用卡", "admin.billing.payment_info.billingAddress": "帐单地址", "admin.billing.payment_info.cardBrandAndDigits": "{brand} 以 {digits} 结尾", From 25035a72c4de3b6e59bbae100df24920ec013a7b Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Thu, 30 Mar 2023 16:33:39 -0400 Subject: [PATCH 03/54] update a few more places with seemingly incorrect useage of 'users'. --- .../cloud/billing/yearly_subscription_spec.js | 2 +- .../self-hosted/self_hosted_purchase_spec.ts | 2 +- .../billing/billing_summary/billing_summary.tsx | 12 ++++++------ .../license_settings/modals/upload_license_modal.tsx | 2 +- .../src/components/seats_calculator/index.tsx | 6 +++--- .../self_hosted_purchase_modal/index.test.tsx | 2 +- webapp/channels/src/i18n/bg.json | 2 -- webapp/channels/src/i18n/de.json | 5 ----- webapp/channels/src/i18n/en.json | 10 +++++----- webapp/channels/src/i18n/en_AU.json | 10 +++++----- webapp/channels/src/i18n/es.json | 3 --- webapp/channels/src/i18n/fa.json | 2 -- webapp/channels/src/i18n/fr.json | 3 --- webapp/channels/src/i18n/hu.json | 3 --- webapp/channels/src/i18n/ja.json | 5 ----- webapp/channels/src/i18n/ko.json | 2 -- webapp/channels/src/i18n/nl.json | 5 ----- webapp/channels/src/i18n/pl.json | 5 ----- webapp/channels/src/i18n/pt-BR.json | 2 -- webapp/channels/src/i18n/ro.json | 2 -- webapp/channels/src/i18n/ru.json | 5 ----- webapp/channels/src/i18n/sv.json | 5 ----- webapp/channels/src/i18n/tr.json | 5 ----- webapp/channels/src/i18n/zh-CN.json | 2 -- 24 files changed, 23 insertions(+), 79 deletions(-) diff --git a/e2e-tests/cypress/tests/integration/channels/enterprise/cloud/billing/yearly_subscription_spec.js b/e2e-tests/cypress/tests/integration/channels/enterprise/cloud/billing/yearly_subscription_spec.js index 0eacc1350c..5351459903 100644 --- a/e2e-tests/cypress/tests/integration/channels/enterprise/cloud/billing/yearly_subscription_spec.js +++ b/e2e-tests/cypress/tests/integration/channels/enterprise/cloud/billing/yearly_subscription_spec.js @@ -147,7 +147,7 @@ describe('System Console - Subscriptions section', () => { // * Ensure that the yearly, monthly, and yearly saving prices match the new user seats value entered checkValues(lessThanUserCount); - cy.get('.RHS').get('.Input___customMessage').contains(`Your workspace currently has ${count} users`); + cy.get('.RHS').get('.Input___customMessage').contains(`Your workspace currently has ${count} active users`); // * Check that Upgrade button is not enabled cy.get('.RHS').find('button').should('be.disabled'); diff --git a/e2e-tests/cypress/tests/integration/channels/enterprise/self-hosted/self_hosted_purchase_spec.ts b/e2e-tests/cypress/tests/integration/channels/enterprise/self-hosted/self_hosted_purchase_spec.ts index a21f5994b1..cbbe859a82 100644 --- a/e2e-tests/cypress/tests/integration/channels/enterprise/self-hosted/self_hosted_purchase_spec.ts +++ b/e2e-tests/cypress/tests/integration/channels/enterprise/self-hosted/self_hosted_purchase_spec.ts @@ -340,7 +340,7 @@ describe('Self hosted Purchase', () => { getCurrentUsers().then((currentUsers) => { // * Verify form can not be submitted - cy.contains(`Your workspace currently has ${currentUsers} users`).should('not.be.enabled'); + cy.contains(`Your workspace currently has ${currentUsers} active users`).should('not.be.enabled'); cy.contains('Upgrade').should('not.be.enabled'); // # Fill form the same number of seats as current users diff --git a/webapp/channels/src/components/admin_console/billing/billing_summary/billing_summary.tsx b/webapp/channels/src/components/admin_console/billing/billing_summary/billing_summary.tsx index 14c9f85791..5a3c40872a 100644 --- a/webapp/channels/src/components/admin_console/billing/billing_summary/billing_summary.tsx +++ b/webapp/channels/src/components/admin_console/billing/billing_summary/billing_summary.tsx @@ -226,9 +226,9 @@ export const InvoiceInfo = ({invoice, product, fullCharges, partialCharges, hasM currency='USD' /> )} @@ -309,9 +309,9 @@ export const InvoiceInfo = ({invoice, product, fullCharges, partialCharges, hasM >
diff --git a/webapp/channels/src/components/admin_console/license_settings/modals/upload_license_modal.tsx b/webapp/channels/src/components/admin_console/license_settings/modals/upload_license_modal.tsx index 7d16824535..634b030724 100644 --- a/webapp/channels/src/components/admin_console/license_settings/modals/upload_license_modal.tsx +++ b/webapp/channels/src/components/admin_console/license_settings/modals/upload_license_modal.tsx @@ -260,7 +260,7 @@ const UploadLicenseModal = (props: Props): JSX.Element | null => {
, }} @@ -88,7 +88,7 @@ function validateSeats(seats: string, annualPricePerSeat: number, minSeats: numb {errorPrefix} , }} diff --git a/webapp/channels/src/components/self_hosted_purchase_modal/index.test.tsx b/webapp/channels/src/components/self_hosted_purchase_modal/index.test.tsx index 3ccbb74ce2..81437b3d7a 100644 --- a/webapp/channels/src/components/self_hosted_purchase_modal/index.test.tsx +++ b/webapp/channels/src/components/self_hosted_purchase_modal/index.test.tsx @@ -255,7 +255,7 @@ describe('SelfHostedPurchaseModal', () => { // check title, and some of the most prominent details and secondary actions screen.getByText('Provide your payment details'); screen.getByText('Contact Sales'); - screen.getByText('USD per user/month', {exact: false}); + screen.getByText('USD per seat/month', {exact: false}); screen.getByText('billed annually', {exact: false}); screen.getByText(productName); screen.getByText('You will be billed today. Your license will be applied automatically', {exact: false}); diff --git a/webapp/channels/src/i18n/bg.json b/webapp/channels/src/i18n/bg.json index 6aabdc38d5..b8a5507bd4 100644 --- a/webapp/channels/src/i18n/bg.json +++ b/webapp/channels/src/i18n/bg.json @@ -332,8 +332,6 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "Такси", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "Последна фактура", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "Общо", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " x {users} потребителя", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} потребителя", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "Какво представляват частичните такси?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "Потребителите, които не са били активирани през цялото време на месеца, се таксуват с пропорционална месечна ставка.", "admin.billing.subscriptions.billing_summary.noBillingHistory.description": "В бъдеще това е мястото, където ще се показва обобщение на вашите последни таксувания.", diff --git a/webapp/channels/src/i18n/de.json b/webapp/channels/src/i18n/de.json index 56c0a379f1..5a34d538a1 100644 --- a/webapp/channels/src/i18n/de.json +++ b/webapp/channels/src/i18n/de.json @@ -412,8 +412,6 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "Steuern", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "Letzte Rechnung", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "Total", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " x {users} Benutzer", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} Benutzer", "admin.billing.subscriptions.billing_summary.lastInvoice.viewInvoice": "Rechnung ansehen", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "Was sind teilweise verrechnete Gebühren?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "Benutzer, die nicht für die volle Dauer des Monats freigeschaltet waren, werden mit einem anteiligen Monatsrate berechnet.", @@ -1355,7 +1353,6 @@ "admin.license.upload-modal.file": "Datei", "admin.license.upload-modal.subtitle": "Lade eine Lizenzschlüssel für die Mattermost Enterprise Edition hoch, um den Server zu aktualisieren. ", "admin.license.upload-modal.successfulUpgrade": "Erfolgreiche Aktualisierung!", - "admin.license.upload-modal.successfulUpgradeText": "Du hast den {skuName} Plan für {licensedUsersNum, number} Benutzer aktualisiert. Diese Änderung ist aktiv vom {startsAt} bis zum {expiresAt}. ", "admin.license.upload-modal.title": "Lizenzschlüssel hochladen", "admin.license.uploadFile": "Datei hochladen", "admin.license.warn.renew": "Erneuern", @@ -4708,8 +4705,6 @@ "self_hosted_signup.cta": "Aktualisieren", "self_hosted_signup.disclaimer": "Ich habe die Enterprise Edition Abonnementbedingungen gelesen und stimme ihnen zu.", "self_hosted_signup.error_invalid_number": "Gib eine gültige Anzahl von Plätzen ein", - "self_hosted_signup.error_max_seats": " Der Lizenzkauf unterstützt nur Käufe bis zu {num} Benutzern", - "self_hosted_signup.error_min_seats": "Dein Arbeitsbereich hat derzeit {num} Benutzer", "self_hosted_signup.failed_export.subtitle": "Wir werden die Dinge von unserer Seite aus überprüfen und uns innerhalb von 3 Tagen bei dir melden, sobald deine Lizenz genehmigt ist. In der Zwischenzeit kannst du gerne die kostenlose Version unseres Produkts weiter nutzen.", "self_hosted_signup.failed_export.title": "Deine Transaktion wird überprüft", "self_hosted_signup.license_applied": "Deine {planName} Lizenz wurde jetzt angewendet. {planName} Funktionen sind jetzt verfügbar und einsatzbereit.", diff --git a/webapp/channels/src/i18n/en.json b/webapp/channels/src/i18n/en.json index 96ba84bfa0..35c493f09b 100644 --- a/webapp/channels/src/i18n/en.json +++ b/webapp/channels/src/i18n/en.json @@ -415,8 +415,8 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "Taxes", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "Last Invoice", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "Total", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " x {users} users", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} users", + "admin.billing.subscriptions.billing_summary.lastInvoice.seatCount": " x {seats} seats", + "admin.billing.subscriptions.billing_summary.lastInvoice.seatCountPartial": "{seats} seats", "admin.billing.subscriptions.billing_summary.lastInvoice.viewInvoice": "View Invoice", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "What are partial charges?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "Users who have not been enabled for the full duration of the month are charged at a prorated monthly rate.", @@ -1358,7 +1358,7 @@ "admin.license.upload-modal.file": "File", "admin.license.upload-modal.subtitle": "Upload a license key for Mattermost Enterprise Edition to upgrade this server. ", "admin.license.upload-modal.successfulUpgrade": "Successful Upgrade!", - "admin.license.upload-modal.successfulUpgradeText": "You have upgraded to the {skuName} plan for {licensedUsersNum, number} users. This is effective from {startsAt} until {expiresAt}. ", + "admin.license.upload-modal.successfulUpgradeText": "You have upgraded to the {skuName} plan for {licensedUsersNum, number} seats. This is effective from {startsAt} until {expiresAt}. ", "admin.license.upload-modal.title": "Upload a License Key", "admin.license.uploadFile": "Upload File", "admin.license.warn.renew": "Renew", @@ -4706,8 +4706,8 @@ "self_hosted_signup.cta": "Upgrade", "self_hosted_signup.disclaimer": "I have read and agree to the Enterprise Edition Subscription Terms", "self_hosted_signup.error_invalid_number": "Enter a valid number of seats", - "self_hosted_signup.error_max_seats": " license purchase only supports purchases up to {num} users", - "self_hosted_signup.error_min_seats": "Your workspace currently has {num} users", + "self_hosted_signup.error_max_seats": " license purchase only supports purchases up to {num} seats", + "self_hosted_signup.error_min_users": "Your workspace currently has {num} active users", "self_hosted_signup.failed_export.subtitle": "We will check things on our side and get back to you within 3 days once your license is approved. In the meantime, please feel free to continue using the free version of our product.", "self_hosted_signup.failed_export.title": "Your transaction is being reviewed", "self_hosted_signup.license_applied": "Your {planName} license has now been applied. {planName} features are now available and ready to use.", diff --git a/webapp/channels/src/i18n/en_AU.json b/webapp/channels/src/i18n/en_AU.json index d83fe1e0e9..16b3a1b373 100644 --- a/webapp/channels/src/i18n/en_AU.json +++ b/webapp/channels/src/i18n/en_AU.json @@ -415,8 +415,8 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "Taxes", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "Last Invoice", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "Total", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " x {users} users", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} users", + "admin.billing.subscriptions.billing_summary.lastInvoice.seatCount": " x {seats} seats", + "admin.billing.subscriptions.billing_summary.lastInvoice.seatCountPartial": "{seats} seats", "admin.billing.subscriptions.billing_summary.lastInvoice.viewInvoice": "View Invoice", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "What are partial charges?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "Users who have not been enabled for the full duration of the month are charged at a prorated monthly rate.", @@ -1357,7 +1357,7 @@ "admin.license.upload-modal.file": "File", "admin.license.upload-modal.subtitle": "Upload a licence key for Mattermost Enterprise Edition to upgrade this server. ", "admin.license.upload-modal.successfulUpgrade": "Upgrade successful!", - "admin.license.upload-modal.successfulUpgradeText": "You have upgraded to the {skuName} plan for {licensedUsersNum, number} users. This is effective from {startsAt} until {expiresAt}. ", + "admin.license.upload-modal.successfulUpgradeText": "You have upgraded to the {skuName} plan for {licensedUsersNum, number} seats. This is effective from {startsAt} until {expiresAt}. ", "admin.license.upload-modal.title": "Upload a Licence Key", "admin.license.uploadFile": "Upload File", "admin.license.warn.renew": "Renew", @@ -4678,8 +4678,8 @@ "self_hosted_signup.cta": "Upgrade", "self_hosted_signup.disclaimer": "I have read and agree to the Enterprise Edition Subscription Terms", "self_hosted_signup.error_invalid_number": "Enter a valid number of seats", - "self_hosted_signup.error_max_seats": " licence purchase only supports purchases up to {num} users", - "self_hosted_signup.error_min_seats": "Your workspace currently has {num} users", + "self_hosted_signup.error_max_seats": " licence purchase only supports purchases up to {num} seats", + "self_hosted_signup.error_min_users": "Your workspace currently has {num} active users", "self_hosted_signup.failed_export.subtitle": "You will receive an email within 3 days to confirm the approval of your licence. In the meantime, please feel free to continue using the free version of our product.", "self_hosted_signup.failed_export.title": "Your transaction is being reviewed", "self_hosted_signup.license_applied": "Your {planName} licence has now been applied. {planName} features are now available and ready to use.", diff --git a/webapp/channels/src/i18n/es.json b/webapp/channels/src/i18n/es.json index 29c0bb0a86..225319f919 100644 --- a/webapp/channels/src/i18n/es.json +++ b/webapp/channels/src/i18n/es.json @@ -384,8 +384,6 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "Impuestos", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "Última factura", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "Total", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " x {users} usuarios", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} usuarios", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "¿Qué son los cargos parciales?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "Los usuarios que no se hayan habilitado durante todo el mes se les cobrará una tarifa mensual prorrateada.", "admin.billing.subscriptions.billing_summary.noBillingHistory.description": "En el futuro, aquí es donde se mostrará su resumen de factura más reciente.", @@ -1302,7 +1300,6 @@ "admin.license.upload-modal.file": "Archivo", "admin.license.upload-modal.subtitle": "Cargar una clave de licencia para Mattermost Enterprise Edition para actualizar este servidor. ", "admin.license.upload-modal.successfulUpgrade": "¡Actualización satisfactoria!", - "admin.license.upload-modal.successfulUpgradeText": "Has actualizado al plan {skuName} para los usuarios {licensedUsersNum, number}. Esto es efectivo a partir de {startsAt} y hasta {expiresAt}. ", "admin.license.upload-modal.title": "Cargar Clave de Licencia", "admin.license.uploadFile": "Cargar Archivo", "admin.license.warn.renew": "Renovar", diff --git a/webapp/channels/src/i18n/fa.json b/webapp/channels/src/i18n/fa.json index 784302be1a..1e2233cfa5 100644 --- a/webapp/channels/src/i18n/fa.json +++ b/webapp/channels/src/i18n/fa.json @@ -362,8 +362,6 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "مالیات", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "آخرین صورت‌حساب", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "جمع", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " × {users} کاربر", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} کاربر", "admin.billing.subscriptions.billing_summary.lastInvoice.viewInvoice": "نمایش فاکتور", "admin.billing.subscriptions.billing_summary.noBillingHistory.description": "در آینده، این جایی است که آخرین خلاصه صورتحساب شما نشان داده خواهد شد.", "admin.billing.subscriptions.billing_summary.noBillingHistory.link": "ببینید صورتحساب چگونه کار می کند", diff --git a/webapp/channels/src/i18n/fr.json b/webapp/channels/src/i18n/fr.json index 51356da7f1..7f3d3343e0 100644 --- a/webapp/channels/src/i18n/fr.json +++ b/webapp/channels/src/i18n/fr.json @@ -388,8 +388,6 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "Taxes", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "Dernière facture", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "Total", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " x {users} utilisateurs", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} utilisateurs", "admin.billing.subscriptions.billing_summary.lastInvoice.viewInvoice": "Voir la facture", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "Qu'est-ce qu'un paiement partiel ?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "Les utilisateurs qui n'ont pas été activés durant toute la durée du mois sont facturés proportionnellement au taux mensuel.", @@ -1282,7 +1280,6 @@ "admin.license.upload-modal.file": "Fichier", "admin.license.upload-modal.subtitle": "Téléchargez une clé de licence pour Mattermost Enterprise Edition pour mettre à niveau ce serveur. ", "admin.license.upload-modal.successfulUpgrade": "Mise à niveau réussie !", - "admin.license.upload-modal.successfulUpgradeText": "Vous avez mis à niveau vers le plan {skuName} pour {licensedUsersNum, number} utilisateurs. Ceci est valable du {startsAt} jusqu'au {expiresAt}. ", "admin.license.upload-modal.title": "Télécharger une clé de licence", "admin.license.uploadFile": "Télécharger un fichier", "admin.license.warn.renew": "Renouveller", diff --git a/webapp/channels/src/i18n/hu.json b/webapp/channels/src/i18n/hu.json index be4db12af4..7e12d2e722 100644 --- a/webapp/channels/src/i18n/hu.json +++ b/webapp/channels/src/i18n/hu.json @@ -372,8 +372,6 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "Adók", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "Utolsó számla", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "Végösszeg", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " x {users} felhasználó", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} felhasználó", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "Mik azok a részleges díjak?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "Azoknak a felhasználóknak, akiket nem a hónap teljes időtartama alatt engedélyeztek, arányos havi díjat számítunk fel.", "admin.billing.subscriptions.billing_summary.noBillingHistory.description": "A jövőben itt fog megjelenni a legutóbbi számlázási összefoglaló.", @@ -1285,7 +1283,6 @@ "admin.license.upload-modal.file": "Fájl", "admin.license.upload-modal.subtitle": "Töltse fel a Mattermost Enterprise Edition licenckulcsát a kiszolgáló frissítéséhez. ", "admin.license.upload-modal.successfulUpgrade": "Sikeres frissítés!", - "admin.license.upload-modal.successfulUpgradeText": "Ön a {licensedUsersNum, number} felhasználóra szóló {skuName} csomagra frissített. Az érvényességi idő {startsAt}-től {expiresAt}-ig tart. ", "admin.license.upload-modal.title": "Licensz fájl feltöltése", "admin.license.uploadFile": "Fájl feltöltése", "admin.license.warn.renew": "Megújítás", diff --git a/webapp/channels/src/i18n/ja.json b/webapp/channels/src/i18n/ja.json index 30838c9df8..bd1a74c190 100644 --- a/webapp/channels/src/i18n/ja.json +++ b/webapp/channels/src/i18n/ja.json @@ -412,8 +412,6 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "税", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "最新の請求書", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "総計", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " x {users} ユーザー", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} ユーザー", "admin.billing.subscriptions.billing_summary.lastInvoice.viewInvoice": "請求書を見る", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "一部課金とは?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "月の全期間において有効でなかったユーザーは、日割り計算で課金されます。", @@ -1355,7 +1353,6 @@ "admin.license.upload-modal.file": "ファイル", "admin.license.upload-modal.subtitle": "このサーバーをアップグレードするために、Mattermost Enterprise Editionのライセンスキーをアップロードしてください。 ", "admin.license.upload-modal.successfulUpgrade": "アップグレードが成功しました!", - "admin.license.upload-modal.successfulUpgradeText": "{licensedUsersNum, number} ユーザー向けの {skuName} プランにアップグレードされました。このプランは {startsAt} から {expiresAt} まで有効です。 ", "admin.license.upload-modal.title": "ライセンスキーのアップロード", "admin.license.uploadFile": "ファイルをアップロードする", "admin.license.warn.renew": "更新", @@ -4708,8 +4705,6 @@ "self_hosted_signup.cta": "アップグレード", "self_hosted_signup.disclaimer": "Enterprise Edition Subscription Termsを確認し、同意しました", "self_hosted_signup.error_invalid_number": "有効なシート数を入力してください", - "self_hosted_signup.error_max_seats": " ライセンス購入は、{num} ユーザーまでの購入のみに対応しています", - "self_hosted_signup.error_min_seats": "ワークスペースの現在のユーザー数は {num} ユーザーです", "self_hosted_signup.failed_export.subtitle": "あなたのライセンスが承認され次第、弊社側で確認を行い、3日以内に返信いたします。それまでの間は、Free版の製品を引き続きご利用ください。", "self_hosted_signup.failed_export.title": "取引きは審査中です", "self_hosted_signup.license_applied": "{planName} ライセンスが適用されました。{planName} の機能が利用可能になり、今すぐ使用することができます。", diff --git a/webapp/channels/src/i18n/ko.json b/webapp/channels/src/i18n/ko.json index b2ad76db44..a084d1bec5 100644 --- a/webapp/channels/src/i18n/ko.json +++ b/webapp/channels/src/i18n/ko.json @@ -380,8 +380,6 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "세금", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "마지막 인보이스", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "합계", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " x {users} 사용자", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} 사용자", "admin.billing.subscriptions.billing_summary.lastInvoice.viewInvoice": "청구서 보기", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "부분 청구 란 무엇입니까?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "해당 월의 전체 기간 동안 활성화되지 않은 사용자에게는 매월 비율에 따라 요금이 청구됩니다.", diff --git a/webapp/channels/src/i18n/nl.json b/webapp/channels/src/i18n/nl.json index f3a8aed7c4..8749449bac 100644 --- a/webapp/channels/src/i18n/nl.json +++ b/webapp/channels/src/i18n/nl.json @@ -412,8 +412,6 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "Belasting", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "Laatste factuur", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "Totaal", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " x {users} gebruikers", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} gebruikers", "admin.billing.subscriptions.billing_summary.lastInvoice.viewInvoice": "Factuur bekijken", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "Wat zijn gedeeltelijke kosten?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "Gebruikers die niet voor de volledige duur van de maand zijn ingeschakeld, worden maandelijks een evenredig bedrag in rekening gebracht.", @@ -1355,7 +1353,6 @@ "admin.license.upload-modal.file": "Bestand", "admin.license.upload-modal.subtitle": "Upload een licentiesleutel voor Mattermost Enterprise Edition om deze server te upgraden. ", "admin.license.upload-modal.successfulUpgrade": "Upgrade geslaagd!", - "admin.license.upload-modal.successfulUpgradeText": "Je hebt een upgrade naar het {skuName} plan voor {licensedUsersNum, number} gebruikers. Dit is van kracht vanaf {startsAt} tot {expiresAt}. ", "admin.license.upload-modal.title": "Licentiesleutel uploaden", "admin.license.uploadFile": "Bestand uploaden", "admin.license.warn.renew": "Vernieuwen", @@ -4693,8 +4690,6 @@ "self_hosted_signup.cta": "Upgraden", "self_hosted_signup.disclaimer": "Ik heb de abonnementsvoorwaarden voorEnterprise Edition gelezen en ga ermee akkoord", "self_hosted_signup.error_invalid_number": "Voer een geldig aantal zetels in", - "self_hosted_signup.error_max_seats": " licentieaankoop ondersteunt alleen aankopen tot {num} gebruikers", - "self_hosted_signup.error_min_seats": "Jouw werkruimte heeft momenteel {num} gebruikers", "self_hosted_signup.failed_export.subtitle": "Wij controleren de zaken aan onze kant en nemen binnen 3 dagen contact met jou op zodra jouuw licentie is goedgekeurd. In de tussentijd kan je gerust de gratis versie van ons product blijven gebruiken.", "self_hosted_signup.failed_export.title": "Jouw transactie wordt bekeken", "self_hosted_signup.license_applied": "Jouw {planName} licentie is nu toegepast. {planName} functies zijn nu beschikbaar en klaar voor gebruik.", diff --git a/webapp/channels/src/i18n/pl.json b/webapp/channels/src/i18n/pl.json index c4784f3d61..b7d9d75387 100644 --- a/webapp/channels/src/i18n/pl.json +++ b/webapp/channels/src/i18n/pl.json @@ -412,8 +412,6 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "Podatki", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "Ostatnia faktura", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "Ogółem", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " x {users} użytkowników", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} użytkowników", "admin.billing.subscriptions.billing_summary.lastInvoice.viewInvoice": "Zobacz fakturę", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "Co to są opłaty częściowe?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "Użytkownicy, którzy nie byli aktywni przez cały okres miesiąca, są obciążani proporcjonalną stawką miesięczną.", @@ -1355,7 +1353,6 @@ "admin.license.upload-modal.file": "Plik", "admin.license.upload-modal.subtitle": "Prześlij klucz licencyjny dla Mattermost Enterprise Edition, aby uaktualnić ten serwer. ", "admin.license.upload-modal.successfulUpgrade": "Udana aktualizacja!", - "admin.license.upload-modal.successfulUpgradeText": "Dokonałeś aktualizacji do planu {skuName} dla użytkowników {licensedUsersNum, number}. Obowiązuje to od {startsAt} do {expiresAt}. ", "admin.license.upload-modal.title": "Prześlij klucz licencyjny", "admin.license.uploadFile": "Prześlij plik", "admin.license.warn.renew": "Ponów", @@ -4708,8 +4705,6 @@ "self_hosted_signup.cta": "Aktualizuj", "self_hosted_signup.disclaimer": "Zapoznałem się i akceptuję warunki subskrypcji Enterprise Edition.", "self_hosted_signup.error_invalid_number": "Wprowadź prawidłową liczbę miejsc", - "self_hosted_signup.error_max_seats": " zakup licencji obsługuje tylko zakupy do {num} użytkowników", - "self_hosted_signup.error_min_seats": "W Twojej przestrzeni roboczej znajduje się obecnie {num} użytkowników", "self_hosted_signup.failed_export.subtitle": "Sprawdzimy wszystko po naszej stronie i skontaktujemy się z Tobą w ciągu 3 dni po zatwierdzeniu licencji. W międzyczasie prosimy o dalsze korzystanie z darmowej wersji naszego produktu.", "self_hosted_signup.failed_export.title": "Twoja transakcja jest sprawdzana", "self_hosted_signup.license_applied": "Twoja licencja {planName} została zastosowana. Funkcje {planName} są teraz dostępne i gotowe do użycia.", diff --git a/webapp/channels/src/i18n/pt-BR.json b/webapp/channels/src/i18n/pt-BR.json index bf21ed7ea1..5e15accc5d 100644 --- a/webapp/channels/src/i18n/pt-BR.json +++ b/webapp/channels/src/i18n/pt-BR.json @@ -306,8 +306,6 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "Taxas", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "Última Fatura", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "Total", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " x {users} usuários", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} usuários", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "O que são cobranças parciais?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "Os usuários que não foram ativados durante todo o mês são cobrados a uma taxa mensal rateada.", "admin.billing.subscriptions.billing_summary.noBillingHistory.description": "No futuro, é aqui que o resumo de sua fatura mais recente será exibido.", diff --git a/webapp/channels/src/i18n/ro.json b/webapp/channels/src/i18n/ro.json index 19769ccd8d..62a0b57261 100644 --- a/webapp/channels/src/i18n/ro.json +++ b/webapp/channels/src/i18n/ro.json @@ -307,8 +307,6 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "Taxe", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "Ultima factură", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "Total", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " x {users} utilizatori", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} utilizatori", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "Ce sunt taxele parțiale?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "Utilizatorii care nu au fost activați pe toată durata lunii sunt taxați la o rată lunară proporțională.", "admin.billing.subscriptions.billing_summary.noBillingHistory.description": "În viitor, aici va apărea cel mai recent rezumat al facturii.", diff --git a/webapp/channels/src/i18n/ru.json b/webapp/channels/src/i18n/ru.json index ee870bc6a2..26a1ff7a33 100644 --- a/webapp/channels/src/i18n/ru.json +++ b/webapp/channels/src/i18n/ru.json @@ -412,8 +412,6 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "Налоги", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "Последний счёт", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "Всего", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " x {users} пользователей", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} пользователей", "admin.billing.subscriptions.billing_summary.lastInvoice.viewInvoice": "Просмотреть счет-фактуру", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "Что такое частичные оплаты?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "Пользователи, которые не были подключены в течение всего месяца, оплачиваются пропорционально по месячному тарифу.", @@ -1355,7 +1353,6 @@ "admin.license.upload-modal.file": "Файл", "admin.license.upload-modal.subtitle": "Загрузите лицензионный ключ для Mattermost Enterprise Edition, чтобы обновить этот сервер. ", "admin.license.upload-modal.successfulUpgrade": "Обновление прошло успешно!", - "admin.license.upload-modal.successfulUpgradeText": "Вы перешли на план {skuName} для {licensedUsersNum, number} пользователей. План действует с {startsAt} до {expiresAt}. ", "admin.license.upload-modal.title": "Загрузить лицензионный ключ", "admin.license.uploadFile": "Загрузить файл", "admin.license.warn.renew": "Продлить", @@ -4695,8 +4692,6 @@ "self_hosted_signup.cta": "Обновить", "self_hosted_signup.disclaimer": "Я прочитал и согласен с условиями подписки на Enterprise Edition.", "self_hosted_signup.error_invalid_number": "Введите действительное количество рабочих мест", - "self_hosted_signup.error_max_seats": " приобретение лицензий поддерживает покупку только до {num} пользователей", - "self_hosted_signup.error_min_seats": "В вашем рабочем пространстве в настоящее время {num} пользователей", "self_hosted_signup.failed_export.subtitle": "Мы проверим ситуацию на нашей стороне и свяжемся с вами в течение 3 дней, когда ваша лицензия будет одобрена. Тем временем, пожалуйста, продолжайте пользоваться бесплатной версией нашего продукта.", "self_hosted_signup.failed_export.title": "Ваша транзакция находится на рассмотрении", "self_hosted_signup.license_applied": "Ваша лицензия {planName} была применена. Функции {planName} теперь доступны и готовы к использованию.", diff --git a/webapp/channels/src/i18n/sv.json b/webapp/channels/src/i18n/sv.json index 6f2c7bc76c..2385037c1f 100644 --- a/webapp/channels/src/i18n/sv.json +++ b/webapp/channels/src/i18n/sv.json @@ -412,8 +412,6 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "Skatt", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "Senaste fakturan", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "Summa", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " x {users} användare", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} användare", "admin.billing.subscriptions.billing_summary.lastInvoice.viewInvoice": "Visa faktura", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "Vad är delbetalningar?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "Användare som inte varit aktiverade under hela månadsperioden debiteras med delbetalning.", @@ -1355,7 +1353,6 @@ "admin.license.upload-modal.file": "Fil", "admin.license.upload-modal.subtitle": "Ladda upp en licensnyckel för Mattermost Enterprise Edition för att uppgradera den här servern. ", "admin.license.upload-modal.successfulUpgrade": "Uppgraderingen lyckades!", - "admin.license.upload-modal.successfulUpgradeText": "Du har uppgraderat till planen {skuName} för {licensedUsersNum, number} användare. Detta gäller från {startsAt} till {expiresAt}. ", "admin.license.upload-modal.title": "Ladda upp en licensnyckel", "admin.license.uploadFile": "Ladda upp fil", "admin.license.warn.renew": "Förnya", @@ -4695,8 +4692,6 @@ "self_hosted_signup.cta": "Uppdatera", "self_hosted_signup.disclaimer": "Jag har läst och godkänner prenumerationsvillkoren för Enterprise Edition.", "self_hosted_signup.error_invalid_number": "Ange ett giltigt antal platser", - "self_hosted_signup.error_max_seats": " licensköp kan endast göras upp till {num} användare", - "self_hosted_signup.error_min_seats": "Din arbetsyta har just nu {num} användare", "self_hosted_signup.failed_export.subtitle": "Vi kommer kontrollera några saker på vår sida och när din licens är godkänd återkommer vi till dig inom tre dagar. Under tiden kan du gärna fortsätta att använda gratisversionen av vår produkt.", "self_hosted_signup.failed_export.title": "Din transaktion granskas", "self_hosted_signup.license_applied": "Din {planName} -licens har nu tillämpats. {planName} -funktionerna är nu tillgängliga och redo att användas.", diff --git a/webapp/channels/src/i18n/tr.json b/webapp/channels/src/i18n/tr.json index d61c34f273..3551655a41 100644 --- a/webapp/channels/src/i18n/tr.json +++ b/webapp/channels/src/i18n/tr.json @@ -389,8 +389,6 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "Vergiler", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "Son fatura", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "Toplam", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " x {users} kullanıcı", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} kullanıcı", "admin.billing.subscriptions.billing_summary.lastInvoice.viewInvoice": "Faturayı görüntüle", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "Kısmi ödemeler nedir?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "Ayın tamamı boyunca etkin olmayan kullanıcılardan aylık kullanım ile orantılı bir ödeme alınır.", @@ -1332,7 +1330,6 @@ "admin.license.upload-modal.file": "Dosya", "admin.license.upload-modal.subtitle": "Bu sunucuyu üst tarifeye geçirmek için bir Mattermost Enterprise paketi lisans anahtarı yükleyin. ", "admin.license.upload-modal.successfulUpgrade": "Üst tarifeye geçildi!", - "admin.license.upload-modal.successfulUpgradeText": "{licensedUsersNum, number} kullanıcı için {skuName} tarifesine geçtiniz. {startsAt} ile {expiresAt} tarihleri arasında geçerli olacak. ", "admin.license.upload-modal.title": "Bir lisans anahtarı yükleyin", "admin.license.uploadFile": "Dosya yükle", "admin.license.warn.renew": "Yenile", @@ -4596,8 +4593,6 @@ "self_hosted_signup.cta": "Yükselt", "self_hosted_signup.disclaimer": "Enterprise Edition abonelik koşullarını okudum ve kabul ediyorum", "self_hosted_signup.error_invalid_number": "Geçerli bir koltuk lisansı sayısı yazın", - "self_hosted_signup.error_max_seats": " yalnızca {num} kullanıcıya kadar lisans satın alımı desteklenir", - "self_hosted_signup.error_min_seats": "Çalışma alanınızda şu anda {num} kullanıcı var", "self_hosted_signup.failed_export.subtitle": "Kontrollerimizi yapacağız ve lisansınızı onaylandıktan sonra 3 gün içinde size geri döneceğiz. Bu arada, lütfen ürünümüzün ücretsiz sürümünü kullanmayı sürdürmekten çekinmeyin.", "self_hosted_signup.failed_export.title": "İşleminiz inceleniyor", "self_hosted_signup.license_applied": "{planName} lisansınız etkinleştirildi. {planName} özelliklerini kullanabilirsiniz.", diff --git a/webapp/channels/src/i18n/zh-CN.json b/webapp/channels/src/i18n/zh-CN.json index 726b018637..0cd759a140 100644 --- a/webapp/channels/src/i18n/zh-CN.json +++ b/webapp/channels/src/i18n/zh-CN.json @@ -399,8 +399,6 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "税", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "最后发票", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "总计", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCount": " x {users} 用户", - "admin.billing.subscriptions.billing_summary.lastInvoice.userCountPartial": "{users} 用户", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "什么是部分费用?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "在一个月的整个时间内未启用的用户将按比例按月计费。", "admin.billing.subscriptions.billing_summary.noBillingHistory.description": "将来,这是您最近的帐单摘要将显示的位置。", From 0807d5e3f0c4c96a566a09131406d4db26fed6da Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Thu, 30 Mar 2023 16:51:05 -0400 Subject: [PATCH 04/54] lint, i18n. --- .../src/components/admin_console/billing/invoice_user_count.tsx | 1 + webapp/channels/src/i18n/en.json | 1 + 2 files changed, 2 insertions(+) diff --git a/webapp/channels/src/components/admin_console/billing/invoice_user_count.tsx b/webapp/channels/src/components/admin_console/billing/invoice_user_count.tsx index 20d17c0bb1..e7228addf5 100644 --- a/webapp/channels/src/components/admin_console/billing/invoice_user_count.tsx +++ b/webapp/channels/src/components/admin_console/billing/invoice_user_count.tsx @@ -21,6 +21,7 @@ export default function InvoiceUserCount({invoice}: {invoice: Invoice}): JSX.Ele id='admin.billing.history.onPremSeats' defaultMessage='{num} seats' values={{ + // should always be a whole number, but truncate just in case num: Math.floor(onPremUsers), }} diff --git a/webapp/channels/src/i18n/en.json b/webapp/channels/src/i18n/en.json index 35c493f09b..a8331a1606 100644 --- a/webapp/channels/src/i18n/en.json +++ b/webapp/channels/src/i18n/en.json @@ -265,6 +265,7 @@ "admin.billing.history.allPaymentsShowHere": "All of your invoices will be shown here", "admin.billing.history.date": "Date", "admin.billing.history.description": "Description", + "admin.billing.history.fractionalAndRatedSeats": "{fractionalSeats} metered seats, {fullSeats} seats at full rate, {partialSeats} seats with partial charges", "admin.billing.history.fractionalSeats": "{fractionalUsers} seats", "admin.billing.history.noBillingHistory": "In the future, this is where your billing history will show.", "admin.billing.history.onPremSeats": "{num} seats", From d301c91ebd12b51da6ec8a3a0cb5e83da7a15d8d Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Thu, 30 Mar 2023 17:02:00 -0400 Subject: [PATCH 05/54] lint. --- .../src/components/admin_console/billing/invoice_user_count.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/channels/src/components/admin_console/billing/invoice_user_count.tsx b/webapp/channels/src/components/admin_console/billing/invoice_user_count.tsx index e7228addf5..c93be8af8e 100644 --- a/webapp/channels/src/components/admin_console/billing/invoice_user_count.tsx +++ b/webapp/channels/src/components/admin_console/billing/invoice_user_count.tsx @@ -21,7 +21,7 @@ export default function InvoiceUserCount({invoice}: {invoice: Invoice}): JSX.Ele id='admin.billing.history.onPremSeats' defaultMessage='{num} seats' values={{ - + // should always be a whole number, but truncate just in case num: Math.floor(onPremUsers), }} From 5ddec36ea54ef0495083d942eb95df97ddeaaea7 Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Thu, 30 Mar 2023 17:04:25 -0400 Subject: [PATCH 06/54] i18n fix. --- webapp/channels/src/i18n/en.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/webapp/channels/src/i18n/en.json b/webapp/channels/src/i18n/en.json index a8331a1606..50d3e787dd 100644 --- a/webapp/channels/src/i18n/en.json +++ b/webapp/channels/src/i18n/en.json @@ -273,12 +273,12 @@ "admin.billing.history.paid": "Paid", "admin.billing.history.paymentFailed": "Payment failed", "admin.billing.history.pending": "Pending", + "admin.billing.history.seatsAndRates": "{fullUsers} seats at full rate, {partialUsers} seats with partial charges", "admin.billing.history.seeHowBillingWorks": "See how billing works", "admin.billing.history.status": "Status", "admin.billing.history.title": "Billing History", "admin.billing.history.total": "Total", "admin.billing.history.transactions": "Transactions", - "admin.billing.history.seatsAndRates": "{fullUsers} seats at full rate, {partialUsers} seats with partial charges", "admin.billing.payment_info_display.allCardsAccepted": "All major credit cards are accepted.", "admin.billing.payment_info_display.noPaymentInfo": "There are currently no credit cards on file.", "admin.billing.payment_info_display.savedPaymentDetails": "Your saved payment details", @@ -412,12 +412,12 @@ "admin.billing.subscriptions.billing_summary.lastInvoice.paid": "Paid", "admin.billing.subscriptions.billing_summary.lastInvoice.partialCharges": "Partial charges", "admin.billing.subscriptions.billing_summary.lastInvoice.pending": "Pending", + "admin.billing.subscriptions.billing_summary.lastInvoice.seatCount": " x {seats} seats", + "admin.billing.subscriptions.billing_summary.lastInvoice.seatCountPartial": "{seats} seats", "admin.billing.subscriptions.billing_summary.lastInvoice.seeBillingHistory": "See Billing History", "admin.billing.subscriptions.billing_summary.lastInvoice.taxes": "Taxes", "admin.billing.subscriptions.billing_summary.lastInvoice.title": "Last Invoice", "admin.billing.subscriptions.billing_summary.lastInvoice.total": "Total", - "admin.billing.subscriptions.billing_summary.lastInvoice.seatCount": " x {seats} seats", - "admin.billing.subscriptions.billing_summary.lastInvoice.seatCountPartial": "{seats} seats", "admin.billing.subscriptions.billing_summary.lastInvoice.viewInvoice": "View Invoice", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges": "What are partial charges?", "admin.billing.subscriptions.billing_summary.lastInvoice.whatArePartialCharges.message": "Users who have not been enabled for the full duration of the month are charged at a prorated monthly rate.", From 87abaca763a12a09fc040892c9a777fa68fc0134 Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Fri, 31 Mar 2023 09:09:02 -0400 Subject: [PATCH 07/54] fix tests. --- .../billing/invoice_user_count.test.tsx | 16 ++++++++-------- .../enterprise_edition_left_panel.test.tsx | 2 +- .../self_hosted_purchase_modal/index.test.tsx | 2 +- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/webapp/channels/src/components/admin_console/billing/invoice_user_count.test.tsx b/webapp/channels/src/components/admin_console/billing/invoice_user_count.test.tsx index b65bc918e6..cdaf54db11 100644 --- a/webapp/channels/src/components/admin_console/billing/invoice_user_count.test.tsx +++ b/webapp/channels/src/components/admin_console/billing/invoice_user_count.test.tsx @@ -51,28 +51,28 @@ describe('InvoiceUserCount', () => { [1, InvoiceLineItemType.Full], [1, InvoiceLineItemType.Partial], ), - expected: '1 metered users, 1 users at full rate, 1 users with partial charges', + expected: '1 metered seats, 1 seats at full rate, 1 seats with partial charges', }, { name: 'Supports cloud invoices with only metered line items', invoice: makeInvoice( [12.34, InvoiceLineItemType.Metered], ), - expected: '12.34 users', + expected: '12.34 seats', }, { name: 'Shows minimum decimal necessary', invoice: makeInvoice( [12.499, InvoiceLineItemType.Metered], ), - expected: '12.5 users', + expected: '12.5 seats', }, { name: 'hides insignificant decimals', invoice: makeInvoice( [12.002, InvoiceLineItemType.Metered], ), - expected: '12 users', + expected: '12 seats', }, { name: 'Supports cloud invoices with only non-metered line items', @@ -80,7 +80,7 @@ describe('InvoiceUserCount', () => { [1, InvoiceLineItemType.Full], [249, InvoiceLineItemType.Partial], ), - expected: '1 users at full rate, 249 users with partial charges', + expected: '1 seat at full rate, 249 users with partial charges', }, { name: 'Shows default of 0 full users, 0 partial users when there are no users', @@ -89,19 +89,19 @@ describe('InvoiceUserCount', () => { [0, InvoiceLineItemType.Full], [0, InvoiceLineItemType.Partial], ), - expected: '0 users at full rate, 0 users with partial charges', + expected: '0 seats at full rate, 0 seats with partial charges', }, { name: 'Shows default of 0 full users, 0 partial users when there are no line items in invoice', invoice: makeInvoice(), - expected: '0 users at full rate, 0 users with partial charges', + expected: '0 seats at full rate, 0 seats with partial charges', }, { name: 'Shows 3 full userswhen there are on prem users', invoice: makeInvoice( [3, InvoiceLineItemType.OnPremise], ), - expected: '3 users', + expected: '3 seats', }, ]; diff --git a/webapp/channels/src/components/admin_console/license_settings/enterprise_edition/enterprise_edition_left_panel.test.tsx b/webapp/channels/src/components/admin_console/license_settings/enterprise_edition/enterprise_edition_left_panel.test.tsx index ef6a3d387f..603aa6807b 100644 --- a/webapp/channels/src/components/admin_console/license_settings/enterprise_edition/enterprise_edition_left_panel.test.tsx +++ b/webapp/channels/src/components/admin_console/license_settings/enterprise_edition/enterprise_edition_left_panel.test.tsx @@ -82,7 +82,7 @@ describe('components/admin_console/license_settings/enterprise_edition/enterpris return n.children().length === 2 && n.childAt(0).type() === 'span' && !n.childAt(0).text().includes('ACTIVE') && - n.childAt(0).text().includes('USERS'); + n.childAt(0).text().includes('LICENSED SEATS'); }); expect(item.text()).toContain('1,000,000'); diff --git a/webapp/channels/src/components/self_hosted_purchase_modal/index.test.tsx b/webapp/channels/src/components/self_hosted_purchase_modal/index.test.tsx index 81437b3d7a..0101b979c4 100644 --- a/webapp/channels/src/components/self_hosted_purchase_modal/index.test.tsx +++ b/webapp/channels/src/components/self_hosted_purchase_modal/index.test.tsx @@ -275,7 +275,7 @@ describe('SelfHostedPurchaseModal', () => { const tooFewSeats = existingUsers - 1; fireEvent.change(screen.getByTestId('selfHostedPurchaseSeatsInput'), valueEvent(tooFewSeats.toString())); expect(screen.getByText('Upgrade')).toBeDisabled(); - screen.getByText('Your workspace currently has 10 users', {exact: false}); + screen.getByText('Your workspace currently has 10 seats', {exact: false}); }); it('happy path submit shows success screen', async () => { From 2eda7f24c985b979951742c56dbc7b054ca8108d Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Fri, 31 Mar 2023 10:14:01 -0400 Subject: [PATCH 08/54] revert changes to one translation. --- webapp/channels/src/components/seats_calculator/index.tsx | 4 ++-- .../src/components/self_hosted_purchase_modal/index.test.tsx | 2 +- webapp/channels/src/i18n/de.json | 1 + webapp/channels/src/i18n/en.json | 2 +- webapp/channels/src/i18n/en_AU.json | 2 +- webapp/channels/src/i18n/ja.json | 1 + webapp/channels/src/i18n/nl.json | 1 + webapp/channels/src/i18n/pl.json | 1 + webapp/channels/src/i18n/ru.json | 1 + webapp/channels/src/i18n/sv.json | 1 + webapp/channels/src/i18n/tr.json | 1 + 11 files changed, 12 insertions(+), 5 deletions(-) diff --git a/webapp/channels/src/components/seats_calculator/index.tsx b/webapp/channels/src/components/seats_calculator/index.tsx index e5bd5edcaf..fe2b9259a2 100644 --- a/webapp/channels/src/components/seats_calculator/index.tsx +++ b/webapp/channels/src/components/seats_calculator/index.tsx @@ -61,8 +61,8 @@ function validateSeats(seats: string, annualPricePerSeat: number, minSeats: numb const maxSeats = calculateMaxUsers(annualPricePerSeat); const tooFewUsersErrorMessage = ( , }} diff --git a/webapp/channels/src/components/self_hosted_purchase_modal/index.test.tsx b/webapp/channels/src/components/self_hosted_purchase_modal/index.test.tsx index 0101b979c4..f9c57ac38d 100644 --- a/webapp/channels/src/components/self_hosted_purchase_modal/index.test.tsx +++ b/webapp/channels/src/components/self_hosted_purchase_modal/index.test.tsx @@ -275,7 +275,7 @@ describe('SelfHostedPurchaseModal', () => { const tooFewSeats = existingUsers - 1; fireEvent.change(screen.getByTestId('selfHostedPurchaseSeatsInput'), valueEvent(tooFewSeats.toString())); expect(screen.getByText('Upgrade')).toBeDisabled(); - screen.getByText('Your workspace currently has 10 seats', {exact: false}); + screen.getByText('Your workspace currently has 10 active users', {exact: false}); }); it('happy path submit shows success screen', async () => { diff --git a/webapp/channels/src/i18n/de.json b/webapp/channels/src/i18n/de.json index 5a34d538a1..51a3b6bae5 100644 --- a/webapp/channels/src/i18n/de.json +++ b/webapp/channels/src/i18n/de.json @@ -4717,6 +4717,7 @@ "self_hosted_signup.purchase_in_progress.by_self_restart": "Wenn du der Meinung bist, dass dies ein Fehler ist, starte den Kauf erneut.", "self_hosted_signup.purchase_in_progress.reset": "Kaufvorgang erneut starten", "self_hosted_signup.purchase_in_progress.title": "Kauf in Bearbeitung", + "self_hosted_signup.error_min_seats": "Dein Arbeitsbereich hat derzeit {num} Benutzer", "self_hosted_signup.retry": "Erneut versuchen", "self_hosted_signup.screening_description": "Wir werden die Dinge von unserer Seite aus überprüfen und uns innerhalb von 3 Tagen bei dir melden, sobald deine Lizenz genehmigt ist. In der Zwischenzeit kannst du gerne die kostenlose Version unseres Produkts weiter nutzen.", "self_hosted_signup.screening_title": "Deine Transaktion wird überprüft", diff --git a/webapp/channels/src/i18n/en.json b/webapp/channels/src/i18n/en.json index 50d3e787dd..ef5e0dfdde 100644 --- a/webapp/channels/src/i18n/en.json +++ b/webapp/channels/src/i18n/en.json @@ -4708,7 +4708,7 @@ "self_hosted_signup.disclaimer": "I have read and agree to the Enterprise Edition Subscription Terms", "self_hosted_signup.error_invalid_number": "Enter a valid number of seats", "self_hosted_signup.error_max_seats": " license purchase only supports purchases up to {num} seats", - "self_hosted_signup.error_min_users": "Your workspace currently has {num} active users", + "self_hosted_signup.error_min_seats": "Your workspace currently has {num} users", "self_hosted_signup.failed_export.subtitle": "We will check things on our side and get back to you within 3 days once your license is approved. In the meantime, please feel free to continue using the free version of our product.", "self_hosted_signup.failed_export.title": "Your transaction is being reviewed", "self_hosted_signup.license_applied": "Your {planName} license has now been applied. {planName} features are now available and ready to use.", diff --git a/webapp/channels/src/i18n/en_AU.json b/webapp/channels/src/i18n/en_AU.json index 16b3a1b373..62c7224ba2 100644 --- a/webapp/channels/src/i18n/en_AU.json +++ b/webapp/channels/src/i18n/en_AU.json @@ -4679,7 +4679,7 @@ "self_hosted_signup.disclaimer": "I have read and agree to the Enterprise Edition Subscription Terms", "self_hosted_signup.error_invalid_number": "Enter a valid number of seats", "self_hosted_signup.error_max_seats": " licence purchase only supports purchases up to {num} seats", - "self_hosted_signup.error_min_users": "Your workspace currently has {num} active users", + "self_hosted_signup.error_min_seats": "Your workspace currently has {num} users", "self_hosted_signup.failed_export.subtitle": "You will receive an email within 3 days to confirm the approval of your licence. In the meantime, please feel free to continue using the free version of our product.", "self_hosted_signup.failed_export.title": "Your transaction is being reviewed", "self_hosted_signup.license_applied": "Your {planName} licence has now been applied. {planName} features are now available and ready to use.", diff --git a/webapp/channels/src/i18n/ja.json b/webapp/channels/src/i18n/ja.json index bd1a74c190..8036413f25 100644 --- a/webapp/channels/src/i18n/ja.json +++ b/webapp/channels/src/i18n/ja.json @@ -4717,6 +4717,7 @@ "self_hosted_signup.purchase_in_progress.by_self_restart": "間違いがある場合、購入をやり直してください。", "self_hosted_signup.purchase_in_progress.reset": "購入をやり直す", "self_hosted_signup.purchase_in_progress.title": "進行中の購入", + "self_hosted_signup.error_min_seats": "ワークスペースの現在のユーザー数は {num} ユーザーです", "self_hosted_signup.retry": "際実行", "self_hosted_signup.screening_description": "あなたのライセンスが承認され次第、弊社側で確認を行い、3日以内に返信いたします。それまでの間は、Free版の製品を引き続きご利用ください。", "self_hosted_signup.screening_title": "取引きは審査中です", diff --git a/webapp/channels/src/i18n/nl.json b/webapp/channels/src/i18n/nl.json index 8749449bac..124926d53a 100644 --- a/webapp/channels/src/i18n/nl.json +++ b/webapp/channels/src/i18n/nl.json @@ -4702,6 +4702,7 @@ "self_hosted_signup.purchase_in_progress.by_self_restart": "Als je denkt dat dit een vergissing is, start jouw aankoop opnieuw.", "self_hosted_signup.purchase_in_progress.reset": "Aankoop opnieuw starten", "self_hosted_signup.purchase_in_progress.title": "Aankoop in uitvoering", + "self_hosted_signup.error_min_seats": "Jouw werkruimte heeft momenteel {num} gebruikers", "self_hosted_signup.retry": "Probeer opnieuw", "self_hosted_signup.screening_description": "Wij controleren de zaken aan onze kant en nemen binnen 3 dagen contact met jou op zodra jouuw licentie is goedgekeurd. In de tussentijd kan je gerust de gratis versie van ons product blijven gebruiken.", "self_hosted_signup.screening_title": "Jouw transactie wordt bekeken", diff --git a/webapp/channels/src/i18n/pl.json b/webapp/channels/src/i18n/pl.json index b7d9d75387..74d6a982f9 100644 --- a/webapp/channels/src/i18n/pl.json +++ b/webapp/channels/src/i18n/pl.json @@ -4717,6 +4717,7 @@ "self_hosted_signup.purchase_in_progress.by_self_restart": "Jeśli uważasz, że to błąd, zrestartuj swój zakup.", "self_hosted_signup.purchase_in_progress.reset": "Ponowne uruchomienie zakupu", "self_hosted_signup.purchase_in_progress.title": "Zakupy w toku", + "self_hosted_signup.error_min_seats": "W Twojej przestrzeni roboczej znajduje się obecnie {num} użytkowników", "self_hosted_signup.retry": "Spróbuj ponownie", "self_hosted_signup.screening_description": "Sprawdzimy wszystko po naszej stronie i skontaktujemy się z Tobą w ciągu 3 dni po zatwierdzeniu licencji. W międzyczasie prosimy o dalsze korzystanie z darmowej wersji naszego produktu.", "self_hosted_signup.screening_title": "Twoja transakcja jest sprawdzana", diff --git a/webapp/channels/src/i18n/ru.json b/webapp/channels/src/i18n/ru.json index 26a1ff7a33..57fb0e5d79 100644 --- a/webapp/channels/src/i18n/ru.json +++ b/webapp/channels/src/i18n/ru.json @@ -4704,6 +4704,7 @@ "self_hosted_signup.purchase_in_progress.by_self_restart": "Если вы считаете, что это ошибка, перезапустите покупку.", "self_hosted_signup.purchase_in_progress.reset": "Перезапуск покупки", "self_hosted_signup.purchase_in_progress.title": "Покупка в процессе", + "self_hosted_signup.error_min_seats": "В вашем рабочем пространстве в настоящее время {num} пользователей", "self_hosted_signup.retry": "Попробовать снова", "self_hosted_signup.screening_description": "Мы проверим ситуацию на нашей стороне и свяжемся с вами в течение 3 дней, когда ваша лицензия будет одобрена. Тем временем, пожалуйста, продолжайте пользоваться бесплатной версией нашего продукта.", "self_hosted_signup.screening_title": "Ваша транзакция находится на рассмотрении", diff --git a/webapp/channels/src/i18n/sv.json b/webapp/channels/src/i18n/sv.json index 2385037c1f..7678f8b430 100644 --- a/webapp/channels/src/i18n/sv.json +++ b/webapp/channels/src/i18n/sv.json @@ -4704,6 +4704,7 @@ "self_hosted_signup.purchase_in_progress.by_self_restart": "Om du tror att detta är ett misstag, starta om ditt köp från början igen.", "self_hosted_signup.purchase_in_progress.reset": "Börja om köpet", "self_hosted_signup.purchase_in_progress.title": "Inköp pågår", + "self_hosted_signup.error_min_seats": "Din arbetsyta har just nu {num} användare", "self_hosted_signup.retry": "Försök igen", "self_hosted_signup.screening_description": "Vi kommer att kontrollera saker och ting från vår sida och återkommer till dig inom tre dagar när din licens är godkänd. Under tiden kan du gärna fortsätta att använda gratisversionen av vår produkt.", "self_hosted_signup.screening_title": "Din transaktion håller på att granskas", diff --git a/webapp/channels/src/i18n/tr.json b/webapp/channels/src/i18n/tr.json index 3551655a41..1ba34e3b9b 100644 --- a/webapp/channels/src/i18n/tr.json +++ b/webapp/channels/src/i18n/tr.json @@ -4605,6 +4605,7 @@ "self_hosted_signup.purchase_in_progress.by_self_restart": "Bir hata olduğunu düşünüyorsanız, satın alma işleminizi yeniden başlatın.", "self_hosted_signup.purchase_in_progress.reset": "Satın almayı yeniden başlat", "self_hosted_signup.purchase_in_progress.title": "Satın alma işlemi sürüyor", + "self_hosted_signup.error_min_seats": "Çalışma alanınızda şu anda {num} kullanıcı var", "self_hosted_signup.retry": "Yeniden dene", "self_hosted_signup.screening_description": "Kontrollerimizi yapacağız ve lisansınızı onaylandıktan sonra 3 gün içinde size geri döneceğiz. Bu arada, lütfen ürünümüzün ücretsiz sürümünü kullanmayı sürdürmekten çekinmeyin.", "self_hosted_signup.screening_title": "İşleminiz inceleniyor", From a11e5357e33548e0cd389ae3b5b849556df4cbde Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Fri, 31 Mar 2023 10:14:35 -0400 Subject: [PATCH 09/54] fix tests. --- .../enterprise/cloud/billing/yearly_subscription_spec.js | 2 +- .../enterprise/self-hosted/self_hosted_purchase_spec.ts | 2 +- .../src/components/self_hosted_purchase_modal/index.test.tsx | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/e2e-tests/cypress/tests/integration/channels/enterprise/cloud/billing/yearly_subscription_spec.js b/e2e-tests/cypress/tests/integration/channels/enterprise/cloud/billing/yearly_subscription_spec.js index 5351459903..0eacc1350c 100644 --- a/e2e-tests/cypress/tests/integration/channels/enterprise/cloud/billing/yearly_subscription_spec.js +++ b/e2e-tests/cypress/tests/integration/channels/enterprise/cloud/billing/yearly_subscription_spec.js @@ -147,7 +147,7 @@ describe('System Console - Subscriptions section', () => { // * Ensure that the yearly, monthly, and yearly saving prices match the new user seats value entered checkValues(lessThanUserCount); - cy.get('.RHS').get('.Input___customMessage').contains(`Your workspace currently has ${count} active users`); + cy.get('.RHS').get('.Input___customMessage').contains(`Your workspace currently has ${count} users`); // * Check that Upgrade button is not enabled cy.get('.RHS').find('button').should('be.disabled'); diff --git a/e2e-tests/cypress/tests/integration/channels/enterprise/self-hosted/self_hosted_purchase_spec.ts b/e2e-tests/cypress/tests/integration/channels/enterprise/self-hosted/self_hosted_purchase_spec.ts index cbbe859a82..a21f5994b1 100644 --- a/e2e-tests/cypress/tests/integration/channels/enterprise/self-hosted/self_hosted_purchase_spec.ts +++ b/e2e-tests/cypress/tests/integration/channels/enterprise/self-hosted/self_hosted_purchase_spec.ts @@ -340,7 +340,7 @@ describe('Self hosted Purchase', () => { getCurrentUsers().then((currentUsers) => { // * Verify form can not be submitted - cy.contains(`Your workspace currently has ${currentUsers} active users`).should('not.be.enabled'); + cy.contains(`Your workspace currently has ${currentUsers} users`).should('not.be.enabled'); cy.contains('Upgrade').should('not.be.enabled'); // # Fill form the same number of seats as current users diff --git a/webapp/channels/src/components/self_hosted_purchase_modal/index.test.tsx b/webapp/channels/src/components/self_hosted_purchase_modal/index.test.tsx index f9c57ac38d..81437b3d7a 100644 --- a/webapp/channels/src/components/self_hosted_purchase_modal/index.test.tsx +++ b/webapp/channels/src/components/self_hosted_purchase_modal/index.test.tsx @@ -275,7 +275,7 @@ describe('SelfHostedPurchaseModal', () => { const tooFewSeats = existingUsers - 1; fireEvent.change(screen.getByTestId('selfHostedPurchaseSeatsInput'), valueEvent(tooFewSeats.toString())); expect(screen.getByText('Upgrade')).toBeDisabled(); - screen.getByText('Your workspace currently has 10 active users', {exact: false}); + screen.getByText('Your workspace currently has 10 users', {exact: false}); }); it('happy path submit shows success screen', async () => { From bc788ce9e31375846dd117751a47bccb511ea78f Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Fri, 31 Mar 2023 13:21:39 -0400 Subject: [PATCH 10/54] fix tests. --- .../admin_console/billing/invoice_user_count.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/channels/src/components/admin_console/billing/invoice_user_count.test.tsx b/webapp/channels/src/components/admin_console/billing/invoice_user_count.test.tsx index cdaf54db11..e4f6e098f4 100644 --- a/webapp/channels/src/components/admin_console/billing/invoice_user_count.test.tsx +++ b/webapp/channels/src/components/admin_console/billing/invoice_user_count.test.tsx @@ -80,7 +80,7 @@ describe('InvoiceUserCount', () => { [1, InvoiceLineItemType.Full], [249, InvoiceLineItemType.Partial], ), - expected: '1 seat at full rate, 249 users with partial charges', + expected: '1 seats at full rate, 249 seats with partial charges', }, { name: 'Shows default of 0 full users, 0 partial users when there are no users', From 262645f75a56c3bedde102bd97f8f1cd80dfe70f Mon Sep 17 00:00:00 2001 From: Caleb Roseland Date: Mon, 3 Apr 2023 11:43:49 -0500 Subject: [PATCH 11/54] fix: empty number is valid --- webapp/boards/src/properties/number/number.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/boards/src/properties/number/number.tsx b/webapp/boards/src/properties/number/number.tsx index cfcf50bcf1..4dc175009d 100644 --- a/webapp/boards/src/properties/number/number.tsx +++ b/webapp/boards/src/properties/number/number.tsx @@ -10,7 +10,7 @@ const Number = (props: PropertyProps): JSX.Element => { return ( !isNaN(parseInt(props.propertyValue as string, 10))} + validator={() => props.propertyValue === '' || !isNaN(parseInt(props.propertyValue as string, 10))} /> ) } From bccb35a11dfe05e53e493cf31573856cd1566e26 Mon Sep 17 00:00:00 2001 From: Caleb Roseland Date: Mon, 3 Apr 2023 12:38:10 -0500 Subject: [PATCH 12/54] test: number property empty and change event --- .../number/__snapshots__/number.test.tsx.snap | 13 ++++ .../src/properties/number/number.test.tsx | 74 +++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 webapp/boards/src/properties/number/__snapshots__/number.test.tsx.snap create mode 100644 webapp/boards/src/properties/number/number.test.tsx diff --git a/webapp/boards/src/properties/number/__snapshots__/number.test.tsx.snap b/webapp/boards/src/properties/number/__snapshots__/number.test.tsx.snap new file mode 100644 index 0000000000..0bef96e78e --- /dev/null +++ b/webapp/boards/src/properties/number/__snapshots__/number.test.tsx.snap @@ -0,0 +1,13 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`properties/link should match snapshot for number with empty value 1`] = ` +
+ +
+`; diff --git a/webapp/boards/src/properties/number/number.test.tsx b/webapp/boards/src/properties/number/number.test.tsx new file mode 100644 index 0000000000..bb4dac9612 --- /dev/null +++ b/webapp/boards/src/properties/number/number.test.tsx @@ -0,0 +1,74 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import React, {ComponentProps} from 'react' +import {screen} from '@testing-library/react' +import {mocked} from 'jest-mock' + +import {setup, wrapIntl} from 'src/testUtils' +import {TestBlockFactory} from 'src/test/testBlockFactory' +import mutator from 'src/mutator' + +import {Board, IPropertyTemplate} from 'src/blocks/board' +import {Card} from 'src/blocks/card' + +import NumberProperty from './property' +import NumberEditor from './number' + +jest.mock('src/components/flashMessages') +jest.mock('src/mutator') + +const mockedMutator = mocked(mutator) + +describe('properties/link', () => { + + let board: Board + let card: Card + let propertyTemplate: IPropertyTemplate + let baseProps: ComponentProps + + beforeEach(() => { + + board = TestBlockFactory.createBoard() + card = TestBlockFactory.createCard() + propertyTemplate = board.cardProperties[0] + + baseProps = { + property: new NumberProperty(), + card, + board, + propertyTemplate, + propertyValue: '', + readOnly: false, + showEmptyPlaceholder: false, + } + }) + + + + it('should match snapshot for number with empty value', () => { + const {container} = setup( + wrapIntl(( + + )) + ) + expect(container).toMatchSnapshot() + }) + + it('should fire change event when valid number value is entered', async () => { + const {user} = setup( + wrapIntl( + + ) + ) + const value = '42' + const input = screen.getByRole('textbox') + await user.type(input, `${value}{Enter}`) + + expect(mockedMutator.changePropertyValue).toHaveBeenCalledWith(board.id, card, propertyTemplate.id, `${value}`) + }) +}) From f2faa4cb5d75fe6d6e3d542a65cc793122b75434 Mon Sep 17 00:00:00 2001 From: Caleb Roseland Date: Tue, 4 Apr 2023 09:55:31 -0500 Subject: [PATCH 13/54] correct test name --- webapp/boards/src/properties/number/number.test.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webapp/boards/src/properties/number/number.test.tsx b/webapp/boards/src/properties/number/number.test.tsx index bb4dac9612..491a722c30 100644 --- a/webapp/boards/src/properties/number/number.test.tsx +++ b/webapp/boards/src/properties/number/number.test.tsx @@ -20,7 +20,7 @@ jest.mock('src/mutator') const mockedMutator = mocked(mutator) -describe('properties/link', () => { +describe('properties/number', () => { let board: Board let card: Card From a18573dfaab387de4ec138a90d64f11d5e5014ef Mon Sep 17 00:00:00 2001 From: Caleb Roseland Date: Tue, 4 Apr 2023 09:56:19 -0500 Subject: [PATCH 14/54] correct test whitespaces --- webapp/boards/src/properties/number/number.test.tsx | 4 ---- 1 file changed, 4 deletions(-) diff --git a/webapp/boards/src/properties/number/number.test.tsx b/webapp/boards/src/properties/number/number.test.tsx index 491a722c30..789439c73a 100644 --- a/webapp/boards/src/properties/number/number.test.tsx +++ b/webapp/boards/src/properties/number/number.test.tsx @@ -21,14 +21,12 @@ jest.mock('src/mutator') const mockedMutator = mocked(mutator) describe('properties/number', () => { - let board: Board let card: Card let propertyTemplate: IPropertyTemplate let baseProps: ComponentProps beforeEach(() => { - board = TestBlockFactory.createBoard() card = TestBlockFactory.createCard() propertyTemplate = board.cardProperties[0] @@ -43,8 +41,6 @@ describe('properties/number', () => { showEmptyPlaceholder: false, } }) - - it('should match snapshot for number with empty value', () => { const {container} = setup( From f218c105ec9f8e59b532e255d860b1fae78c5132 Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Tue, 4 Apr 2023 11:26:12 -0400 Subject: [PATCH 15/54] replace external link with a button. --- .../billing/delete_workspace/delete_workspace_cta.tsx | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/webapp/channels/src/components/admin_console/billing/delete_workspace/delete_workspace_cta.tsx b/webapp/channels/src/components/admin_console/billing/delete_workspace/delete_workspace_cta.tsx index ef8ec25dad..22821eaf60 100644 --- a/webapp/channels/src/components/admin_console/billing/delete_workspace/delete_workspace_cta.tsx +++ b/webapp/channels/src/components/admin_console/billing/delete_workspace/delete_workspace_cta.tsx @@ -80,17 +80,15 @@ export default function DeleteWorkspaceCTA() { }} />
- - +
); From 2c69315bc8095734e024315ecd9a1431a74e17d2 Mon Sep 17 00:00:00 2001 From: Conor Macpherson Date: Tue, 4 Apr 2023 11:45:02 -0400 Subject: [PATCH 16/54] lint. --- .../billing/delete_workspace/delete_workspace_cta.tsx | 2 -- 1 file changed, 2 deletions(-) diff --git a/webapp/channels/src/components/admin_console/billing/delete_workspace/delete_workspace_cta.tsx b/webapp/channels/src/components/admin_console/billing/delete_workspace/delete_workspace_cta.tsx index 22821eaf60..ccdf364756 100644 --- a/webapp/channels/src/components/admin_console/billing/delete_workspace/delete_workspace_cta.tsx +++ b/webapp/channels/src/components/admin_console/billing/delete_workspace/delete_workspace_cta.tsx @@ -15,8 +15,6 @@ import {isCloudLicense} from 'utils/license_utils'; import {getCloudSubscription, getSubscriptionProduct} from 'mattermost-redux/selectors/entities/cloud'; -import ExternalLink from 'components/external_link'; - import DeleteWorkspaceModal from './delete_workspace_modal'; export default function DeleteWorkspaceCTA() { From 6919761122d2409e805d0279169a7925c6e5687d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pablo=20Andr=C3=A9s=20V=C3=A9lez=20Vidal?= Date: Tue, 4 Apr 2023 18:04:06 +0200 Subject: [PATCH 17/54] MM-49862 - remove no longer needed webapp calls to action and pulsating dots (#22699) * MM-49862 - remove no longer needed webapp calls to action and pulsating dots * fix snapshots * improve function logic based on pr comments * fix unit tests --------- Co-authored-by: Mattermost Build --- .../__snapshots__/actions_menu.test.tsx.snap | 3 - .../actions_menu/actions_menu.test.tsx | 5 - .../components/actions_menu/actions_menu.tsx | 23 -- .../actions_menu/actions_menu_empty.test.tsx | 5 - .../actions_menu/actions_menu_mobile.test.tsx | 5 - .../__snapshots__/dot_menu.test.tsx.snap | 214 ------------------ .../src/components/dot_menu/dot_menu.test.tsx | 27 --- .../src/components/dot_menu/dot_menu.tsx | 31 +-- .../dot_menu/dot_menu_empty.test.tsx | 1 - .../dot_menu/dot_menu_mobile.test.tsx | 1 - .../channels/src/components/dot_menu/index.ts | 4 - webapp/channels/src/components/post/index.tsx | 8 +- .../src/components/post/post_component.tsx | 2 - .../src/components/post/post_options.tsx | 37 +-- .../thread_viewer_row.tsx | 1 - .../virtualized_thread_viewer.tsx | 1 - .../src/selectors/views/custom_status.test.ts | 29 +++ .../src/selectors/views/custom_status.ts | 7 +- webapp/channels/src/utils/utils.tsx | 51 ++++- 19 files changed, 94 insertions(+), 361 deletions(-) diff --git a/webapp/channels/src/components/actions_menu/__snapshots__/actions_menu.test.tsx.snap b/webapp/channels/src/components/actions_menu/__snapshots__/actions_menu.test.tsx.snap index 60367b08bf..26709a01ad 100644 --- a/webapp/channels/src/components/actions_menu/__snapshots__/actions_menu.test.tsx.snap +++ b/webapp/channels/src/components/actions_menu/__snapshots__/actions_menu.test.tsx.snap @@ -39,7 +39,6 @@ exports[`components/actions_menu/ActionsMenu has actions - marketplace disabled className="post-menu__item post-menu__item--active" id="center_actions_button_post_id_1" key="more-actions-button" - onClick={[Function]} type="button" > { isSysAdmin: true, pluginMenuItems: [], post: TestHelper.getPostMock({id: 'post_id_1', is_pinned: false, type: '' as PostType}), - showTutorialTip: false, components: {}, - handleOpenTip: jest.fn(), - handleNextTip: jest.fn(), - handleDismissTip: jest.fn(), - showPulsatingDot: false, location: 'center', canOpenMarketplace: false, actions: { diff --git a/webapp/channels/src/components/actions_menu/actions_menu.tsx b/webapp/channels/src/components/actions_menu/actions_menu.tsx index e20023c77b..d141f1f121 100644 --- a/webapp/channels/src/components/actions_menu/actions_menu.tsx +++ b/webapp/channels/src/components/actions_menu/actions_menu.tsx @@ -17,7 +17,6 @@ import {AppCallResponseTypes} from 'mattermost-redux/constants/apps'; import {HandleBindingClick, PostEphemeralCallResponseForPost, OpenAppsModal} from 'types/apps'; import {Locations, Constants, ModalIdentifiers} from 'utils/constants'; import Permissions from 'mattermost-redux/constants/permissions'; -import {ActionsTutorialTip} from 'components/actions_menu/actions_menu_tutorial_tip'; import {ModalData} from 'types/actions'; import MarketplaceModal, {OpenedFromType} from 'components/plugin_marketplace/marketplace_modal'; import OverlayTrigger from 'components/overlay_trigger'; @@ -44,11 +43,6 @@ export type Props = { pluginMenuItems?: PluginComponent[]; post: Post; teamId: string; - handleOpenTip: () => void; - handleNextTip: (e: React.MouseEvent) => void; - handleDismissTip: () => void; - showPulsatingDot?: boolean; - showTutorialTip: boolean; canOpenMarketplace: boolean; /** @@ -236,14 +230,6 @@ export class ActionMenuClass extends React.PureComponent { ); } - handleActionsIconClick = (e: React.MouseEvent) => { - if (this.props.showPulsatingDot || this.props.showTutorialTip) { - this.props.handleOpenTip(); - e.preventDefault(); - e.stopPropagation(); - } - }; - renderDivider = (suffix: string): React.ReactNode => { return (
  • { })} type='button' aria-expanded='false' - onClick={this.handleActionsIconClick} > - {this.props.showPulsatingDot && - - } { }, appBindings: [], pluginMenuItems: [], - handleOpenTip: jest.fn(), - handleNextTip: jest.fn(), - handleDismissTip: jest.fn(), - showPulsatingDot: false, - showTutorialTip: false, appsEnabled: false, isSysAdmin: true, canOpenMarketplace: false, diff --git a/webapp/channels/src/components/actions_menu/actions_menu_mobile.test.tsx b/webapp/channels/src/components/actions_menu/actions_menu_mobile.test.tsx index 3f4f3c3534..cdd71a8390 100644 --- a/webapp/channels/src/components/actions_menu/actions_menu_mobile.test.tsx +++ b/webapp/channels/src/components/actions_menu/actions_menu_mobile.test.tsx @@ -37,11 +37,6 @@ describe('components/actions_menu/ActionsMenu on mobile view', () => { }, appBindings: [], pluginMenuItems: [], - handleOpenTip: jest.fn(), - handleNextTip: jest.fn(), - handleDismissTip: jest.fn(), - showPulsatingDot: false, - showTutorialTip: false, appsEnabled: false, isSysAdmin: true, canOpenMarketplace: false, diff --git a/webapp/channels/src/components/dot_menu/__snapshots__/dot_menu.test.tsx.snap b/webapp/channels/src/components/dot_menu/__snapshots__/dot_menu.test.tsx.snap index 9970088867..490e16e2da 100644 --- a/webapp/channels/src/components/dot_menu/__snapshots__/dot_menu.test.tsx.snap +++ b/webapp/channels/src/components/dot_menu/__snapshots__/dot_menu.test.tsx.snap @@ -107,113 +107,6 @@ Object { } `; -exports[`components/dot_menu/DotMenu should match snapshot, hide "New" badge on forward post 1`] = ` -Object { - "asFragment": [Function], - "baseElement": -
    - -
    - , - "container":
    - -
    , - "debug": [Function], - "findAllByAltText": [Function], - "findAllByDisplayValue": [Function], - "findAllByLabelText": [Function], - "findAllByPlaceholderText": [Function], - "findAllByRole": [Function], - "findAllByTestId": [Function], - "findAllByText": [Function], - "findAllByTitle": [Function], - "findByAltText": [Function], - "findByDisplayValue": [Function], - "findByLabelText": [Function], - "findByPlaceholderText": [Function], - "findByRole": [Function], - "findByTestId": [Function], - "findByText": [Function], - "findByTitle": [Function], - "getAllByAltText": [Function], - "getAllByDisplayValue": [Function], - "getAllByLabelText": [Function], - "getAllByPlaceholderText": [Function], - "getAllByRole": [Function], - "getAllByTestId": [Function], - "getAllByText": [Function], - "getAllByTitle": [Function], - "getByAltText": [Function], - "getByDisplayValue": [Function], - "getByLabelText": [Function], - "getByPlaceholderText": [Function], - "getByRole": [Function], - "getByTestId": [Function], - "getByText": [Function], - "getByTitle": [Function], - "queryAllByAltText": [Function], - "queryAllByDisplayValue": [Function], - "queryAllByLabelText": [Function], - "queryAllByPlaceholderText": [Function], - "queryAllByRole": [Function], - "queryAllByTestId": [Function], - "queryAllByText": [Function], - "queryAllByTitle": [Function], - "queryByAltText": [Function], - "queryByDisplayValue": [Function], - "queryByLabelText": [Function], - "queryByPlaceholderText": [Function], - "queryByRole": [Function], - "queryByTestId": [Function], - "queryByText": [Function], - "queryByTitle": [Function], - "rerender": [Function], - "unmount": [Function], -} -`; - exports[`components/dot_menu/DotMenu should match snapshot, on Center 1`] = ` `; - -exports[`components/dot_menu/DotMenu should match snapshot, show "New" badge on forward post 1`] = ` -Object { - "asFragment": [Function], - "baseElement": -
    - -
    - , - "container":
    - -
    , - "debug": [Function], - "findAllByAltText": [Function], - "findAllByDisplayValue": [Function], - "findAllByLabelText": [Function], - "findAllByPlaceholderText": [Function], - "findAllByRole": [Function], - "findAllByTestId": [Function], - "findAllByText": [Function], - "findAllByTitle": [Function], - "findByAltText": [Function], - "findByDisplayValue": [Function], - "findByLabelText": [Function], - "findByPlaceholderText": [Function], - "findByRole": [Function], - "findByTestId": [Function], - "findByText": [Function], - "findByTitle": [Function], - "getAllByAltText": [Function], - "getAllByDisplayValue": [Function], - "getAllByLabelText": [Function], - "getAllByPlaceholderText": [Function], - "getAllByRole": [Function], - "getAllByTestId": [Function], - "getAllByText": [Function], - "getAllByTitle": [Function], - "getByAltText": [Function], - "getByDisplayValue": [Function], - "getByLabelText": [Function], - "getByPlaceholderText": [Function], - "getByRole": [Function], - "getByTestId": [Function], - "getByText": [Function], - "getByTitle": [Function], - "queryAllByAltText": [Function], - "queryAllByDisplayValue": [Function], - "queryAllByLabelText": [Function], - "queryAllByPlaceholderText": [Function], - "queryAllByRole": [Function], - "queryAllByTestId": [Function], - "queryAllByText": [Function], - "queryAllByTitle": [Function], - "queryByAltText": [Function], - "queryByDisplayValue": [Function], - "queryByLabelText": [Function], - "queryByPlaceholderText": [Function], - "queryByRole": [Function], - "queryByTestId": [Function], - "queryByText": [Function], - "queryByTitle": [Function], - "rerender": [Function], - "unmount": [Function], -} -`; diff --git a/webapp/channels/src/components/dot_menu/dot_menu.test.tsx b/webapp/channels/src/components/dot_menu/dot_menu.test.tsx index e807940ead..402cf954b1 100644 --- a/webapp/channels/src/components/dot_menu/dot_menu.test.tsx +++ b/webapp/channels/src/components/dot_menu/dot_menu.test.tsx @@ -146,7 +146,6 @@ describe('components/dot_menu/DotMenu', () => { threadReplyCount: 0, userId: 'user_id_1', isMilitaryTime: false, - showForwardPostNewLabel: false, }; test('should match snapshot, on Center', () => { @@ -181,32 +180,6 @@ describe('components/dot_menu/DotMenu', () => { expect(wrapper).toMatchSnapshot(); }); - test('should match snapshot, show "New" badge on forward post', () => { - const props = { - ...baseProps, - showForwardPostNewLabel: true, - }; - const wrapper = renderWithIntlAndStore( - , - initialState, - ); - - expect(wrapper).toMatchSnapshot(); - }); - - test('should match snapshot, hide "New" badge on forward post', () => { - const props = { - ...baseProps, - showForwardPostNewLabel: false, - }; - const wrapper = renderWithIntlAndStore( - , - initialState, - ); - - expect(wrapper).toMatchSnapshot(); - }); - test('should show mark as unread when channel is not archived', () => { const props = { ...baseProps, diff --git a/webapp/channels/src/components/dot_menu/dot_menu.tsx b/webapp/channels/src/components/dot_menu/dot_menu.tsx index 135fb04593..df164cf18f 100644 --- a/webapp/channels/src/components/dot_menu/dot_menu.tsx +++ b/webapp/channels/src/components/dot_menu/dot_menu.tsx @@ -25,7 +25,7 @@ import { import Permissions from 'mattermost-redux/constants/permissions'; -import {Locations, ModalIdentifiers, Constants, TELEMETRY_LABELS, Preferences} from 'utils/constants'; +import {Locations, ModalIdentifiers, Constants, TELEMETRY_LABELS} from 'utils/constants'; import DeletePostModal from 'components/delete_post_modal'; import DelayedAction from 'utils/delayed_action'; import * as PostUtils from 'utils/post_utils'; @@ -33,12 +33,10 @@ import * as Menu from 'components/menu'; import * as Utils from 'utils/utils'; import ChannelPermissionGate from 'components/permissions_gates/channel_permission_gate'; import {ModalData} from 'types/actions'; -import {PluginComponent} from 'types/store/plugins'; import {UserThread} from '@mattermost/types/threads'; import {Post} from '@mattermost/types/posts'; import ForwardPostModal from '../forward_post_modal'; -import Tag from '../widgets/tag/tag'; import {ChangeEvent, trackDotMenuEvent} from './utils'; @@ -70,20 +68,11 @@ type Props = { postEditTimeLimit?: string; // TechDebt: Made non-mandatory while converting to typescript enableEmojiPicker?: boolean; // TechDebt: Made non-mandatory while converting to typescript channelIsArchived?: boolean; // TechDebt: Made non-mandatory while converting to typescript - currentTeamUrl?: string; // TechDebt: Made non-mandatory while converting to typescript teamUrl?: string; // TechDebt: Made non-mandatory while converting to typescript isMobileView: boolean; - showForwardPostNewLabel: boolean; timezone?: string; isMilitaryTime: boolean; - /** - * Components for overriding provided by plugins - */ - components: { - [componentName: string]: PluginComponent[]; - }; - actions: { /** @@ -292,9 +281,6 @@ export class DotMenuClass extends React.PureComponent { }, }; - if (this.props.showForwardPostNewLabel) { - this.props.actions.setGlobalItem(Preferences.FORWARD_POST_VIEWED, false); - } this.props.actions.openModal(forwardPostModalData); } @@ -441,15 +427,6 @@ export class DotMenuClass extends React.PureComponent { id='forward_post_button.label' defaultMessage='Forward' /> - {this.props.showForwardPostNewLabel && ( - - )} ); @@ -519,12 +496,12 @@ export class DotMenuClass extends React.PureComponent { class: classNames('post-menu__item', { 'post-menu__item--active': this.props.isMenuOpen, }), - 'aria-label': this.props.intl.formatMessage({id: 'post_info.dot_menu.tooltip.more_actions', defaultMessage: 'Actions'}), + 'aria-label': formatMessage({id: 'post_info.dot_menu.tooltip.more_actions', defaultMessage: 'Actions'}), children: , }} menu={{ id: `${this.props.location}_dropdown_${this.props.post.id}`, - 'aria-label': this.props.intl.formatMessage({id: 'post_info.menuAriaLabel', defaultMessage: 'Post extra options'}), + 'aria-label': formatMessage({id: 'post_info.menuAriaLabel', defaultMessage: 'Post extra options'}), onKeyDown: this.onShortcutKeyDown, width: '264px', onToggle: this.handleMenuToggle, @@ -532,7 +509,7 @@ export class DotMenuClass extends React.PureComponent { }} menuButtonTooltip={{ id: `PostDotMenu-ButtonTooltip-${this.props.post.id}`, - text: this.props.intl.formatMessage({id: 'post_info.dot_menu.tooltip.more_actions', defaultMessage: 'More'}), + text: formatMessage({id: 'post_info.dot_menu.tooltip.more_actions', defaultMessage: 'More'}), class: 'hidden-xs', }} > diff --git a/webapp/channels/src/components/dot_menu/dot_menu_empty.test.tsx b/webapp/channels/src/components/dot_menu/dot_menu_empty.test.tsx index dd9b38594b..c5b2e454d1 100644 --- a/webapp/channels/src/components/dot_menu/dot_menu_empty.test.tsx +++ b/webapp/channels/src/components/dot_menu/dot_menu_empty.test.tsx @@ -59,7 +59,6 @@ describe('components/dot_menu/DotMenu returning empty ("")', () => { threadId: 'post_id_1', userId: 'user_id_1', isMilitaryTime: false, - showForwardPostNewLabel: false, }; const wrapper = shallow( diff --git a/webapp/channels/src/components/dot_menu/dot_menu_mobile.test.tsx b/webapp/channels/src/components/dot_menu/dot_menu_mobile.test.tsx index a6ecb1761c..cd3f1d23a8 100644 --- a/webapp/channels/src/components/dot_menu/dot_menu_mobile.test.tsx +++ b/webapp/channels/src/components/dot_menu/dot_menu_mobile.test.tsx @@ -59,7 +59,6 @@ describe('components/dot_menu/DotMenu on mobile view', () => { threadId: 'post_id_1', userId: 'user_id_1', isMilitaryTime: false, - showForwardPostNewLabel: false, }; const wrapper = shallow( diff --git a/webapp/channels/src/components/dot_menu/index.ts b/webapp/channels/src/components/dot_menu/index.ts index fa1623fa2c..e9d765ba59 100644 --- a/webapp/channels/src/components/dot_menu/index.ts +++ b/webapp/channels/src/components/dot_menu/index.ts @@ -44,7 +44,6 @@ import {matchUserMentionTriggersWithMessageMentions} from 'utils/post_utils'; import {Post} from '@mattermost/types/posts'; import {setGlobalItem} from '../../actions/storage'; -import {getGlobalItem} from '../../selectors/storage'; import DotMenu from './dot_menu'; @@ -110,8 +109,6 @@ function makeMapStateToProps() { } } - const showForwardPostNewLabel = getGlobalItem(state, Preferences.FORWARD_POST_VIEWED, true); - return { channelIsArchived: isArchivedChannel(channel), components: state.plugins.components, @@ -129,7 +126,6 @@ function makeMapStateToProps() { isCollapsedThreadsEnabled: collapsedThreads, threadReplyCount, isMobileView: getIsMobileView(state), - showForwardPostNewLabel, timezone: getCurrentUserTimezone(state), isMilitaryTime, }; diff --git a/webapp/channels/src/components/post/index.tsx b/webapp/channels/src/components/post/index.tsx index 2bd3324d9f..39c664736f 100644 --- a/webapp/channels/src/components/post/index.tsx +++ b/webapp/channels/src/components/post/index.tsx @@ -4,7 +4,6 @@ import {connect, ConnectedProps} from 'react-redux'; import {AnyAction, bindActionCreators, Dispatch} from 'redux'; -import {showActionsDropdownPulsatingDot} from 'selectors/actions_menu'; import {setActionsMenuInitialisationState} from 'mattermost-redux/actions/preferences'; import {getConfig} from 'mattermost-redux/selectors/entities/general'; import {getPost, makeGetCommentCountForPost, makeIsPostCommentMention, isPostAcknowledgementsEnabled, isPostPriorityEnabled, UserActivityPost} from 'mattermost-redux/selectors/entities/posts'; @@ -13,7 +12,6 @@ import { get, getBool, isCollapsedThreadsEnabled, - onboardingTourTipsEnabled, } from 'mattermost-redux/selectors/entities/preferences'; import {getCurrentTeam, getCurrentTeamId, getTeam, getTeamMemberships} from 'mattermost-redux/selectors/entities/teams'; import {getCurrentUserId, getUser} from 'mattermost-redux/selectors/entities/users'; @@ -129,8 +127,7 @@ function makeMapStateToProps() { const user = getUser(state, post.user_id); const isBot = Boolean(user && user.is_bot); const highlightedPostId = getHighlightedPostId(state); - const showActionsMenuPulsatingDot = showActionsDropdownPulsatingDot(state); - const tourTipsEnabled = onboardingTourTipsEnabled(state); + const selectedCard = getSelectedPostCard(state); let emojis: Emoji[] = []; @@ -203,8 +200,7 @@ function makeMapStateToProps() { compactDisplay: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.MESSAGE_DISPLAY, Preferences.MESSAGE_DISPLAY_DEFAULT) === Preferences.MESSAGE_DISPLAY_COMPACT, colorizeUsernames: get(state, Preferences.CATEGORY_DISPLAY_SETTINGS, Preferences.COLORIZE_USERNAMES, Preferences.COLORIZE_USERNAMES_DEFAULT) === 'true', shouldShowActionsMenu: shouldShowActionsMenu(state, post), - showActionsMenuPulsatingDot, - tourTipsEnabled, + shortcutReactToLastPostEmittedFrom, isBot, collapsedThreadsEnabled: isCollapsedThreadsEnabled(state), diff --git a/webapp/channels/src/components/post/post_component.tsx b/webapp/channels/src/components/post/post_component.tsx index 2559cc56e1..907792dcd1 100644 --- a/webapp/channels/src/components/post/post_component.tsx +++ b/webapp/channels/src/components/post/post_component.tsx @@ -114,8 +114,6 @@ export type Props = { isPostAcknowledgementsEnabled: boolean; isPostPriorityEnabled: boolean; isCardOpen?: boolean; - shouldShowDotMenu: boolean; - tourTipsEnabled: boolean; }; const PostComponent = (props: Props): JSX.Element => { diff --git a/webapp/channels/src/components/post/post_options.tsx b/webapp/channels/src/components/post/post_options.tsx index b5e12801b8..d163c8c4bd 100644 --- a/webapp/channels/src/components/post/post_options.tsx +++ b/webapp/channels/src/components/post/post_options.tsx @@ -5,7 +5,7 @@ import React, {ReactNode, useEffect, useRef, useState} from 'react'; import {FormattedMessage} from 'react-intl'; -import {Posts, Preferences} from 'mattermost-redux/constants/index'; +import {Posts} from 'mattermost-redux/constants/index'; import {isPostEphemeral} from 'mattermost-redux/utils/post_utils'; import {Locations} from 'utils/constants'; @@ -34,8 +34,6 @@ type Props = { handleDropdownOpened?: (e: boolean) => void; collapsedThreadsEnabled?: boolean; shouldShowActionsMenu?: boolean; - showActionsMenuPulsatingDot?: boolean; - tourTipsEnabled: boolean; oneClickReactionsEnabled?: boolean; recentEmojis: Emoji[]; isExpanded?: boolean; @@ -51,7 +49,6 @@ type Props = { shortcutReactToLastPostEmittedFrom?: string; isPostHeaderVisible?: boolean | null; isPostBeingEdited?: boolean; - shouldShowDotMenu: boolean; actions: { emitShortcutReactToLastPostFrom: (emittedFrom: 'CENTER' | 'RHS_ROOT' | 'NO_WHERE') => void; }; @@ -63,7 +60,6 @@ const PostOptions = (props: Props): JSX.Element => { const [showEmojiPicker, setShowEmojiPicker] = useState(false); const [showDotMenu, setShowDotMenu] = useState(false); const [showActionsMenu, setShowActionsMenu] = useState(false); - const [showActionTip, setShowActionTip] = useState(false); useEffect(() => { if (props.isLastPost && @@ -80,8 +76,6 @@ const PostOptions = (props: Props): JSX.Element => { isReadOnly, post, oneClickReactionsEnabled, - showActionsMenuPulsatingDot, - tourTipsEnabled, isMobileView, } = props; @@ -102,34 +96,14 @@ const PostOptions = (props: Props): JSX.Element => { }; const handleActionsMenuOpened = (open: boolean) => { - if (tourTipsEnabled && showActionsMenuPulsatingDot) { - setShowActionTip(true); - return; - } setShowActionsMenu(open); props.handleDropdownOpened!(open); }; - const handleActionsMenuTipOpened = () => { - setShowActionTip(true); - props.handleDropdownOpened!(true); - }; - - const handleActionsMenuGotItClick = () => { - props.setActionsMenuInitialisationState?.(({[Preferences.ACTIONS_MENU_VIEWED]: true})); - setShowActionTip(false); - props.handleDropdownOpened!(false); - }; - - const handleTipDismissed = () => { - setShowActionTip(false); - props.handleDropdownOpened!(false); - }; - const getDotMenuRef = () => dotMenuRef.current; const isPostDeleted = post && post.state === Posts.POST_DELETED; - const hoverLocal = props.hover || showEmojiPicker || showDotMenu || showActionsMenu || showActionTip; + const hoverLocal = props.hover || showEmojiPicker || showDotMenu || showActionsMenu; const showCommentIcon = isFromAutoResponder || (!systemMessage && (isMobileView || hoverLocal || (!post.root_id && Boolean(props.hasReplies)) || props.isFirstReply) && props.location === Locations.CENTER); @@ -197,11 +171,6 @@ const PostOptions = (props: Props): JSX.Element => { location={props.location} handleDropdownOpened={handleActionsMenuOpened} isMenuOpen={showActionsMenu} - showPulsatingDot={tourTipsEnabled && showActionsMenuPulsatingDot} - showTutorialTip={tourTipsEnabled && showActionTip} - handleOpenTip={handleActionsMenuTipOpened} - handleNextTip={handleActionsMenuGotItClick} - handleDismissTip={handleTipDismissed} /> ); const dotMenu = ( @@ -231,7 +200,7 @@ const PostOptions = (props: Props): JSX.Element => { ); - } else if (isPostDeleted || !props.shouldShowDotMenu) { + } else if (isPostDeleted) { options = null; } else if (props.location === Locations.SEARCH) { const hasCRTFooter = props.collapsedThreadsEnabled && !post.root_id && (post.reply_count > 0 || post.is_following); diff --git a/webapp/channels/src/components/threading/virtualized_thread_viewer/thread_viewer_row.tsx b/webapp/channels/src/components/threading/virtualized_thread_viewer/thread_viewer_row.tsx index b26051f723..4917f2fa79 100644 --- a/webapp/channels/src/components/threading/virtualized_thread_viewer/thread_viewer_row.tsx +++ b/webapp/channels/src/components/threading/virtualized_thread_viewer/thread_viewer_row.tsx @@ -27,7 +27,6 @@ type Props = { previousPostId: string; teamId: string; timestampProps?: Partial; - lastPost: Post; }; function noop() {} diff --git a/webapp/channels/src/components/threading/virtualized_thread_viewer/virtualized_thread_viewer.tsx b/webapp/channels/src/components/threading/virtualized_thread_viewer/virtualized_thread_viewer.tsx index 09fc561d00..4cafae3823 100644 --- a/webapp/channels/src/components/threading/virtualized_thread_viewer/virtualized_thread_viewer.tsx +++ b/webapp/channels/src/components/threading/virtualized_thread_viewer/virtualized_thread_viewer.tsx @@ -403,7 +403,6 @@ class ThreadViewerVirtualized extends PureComponent { previousPostId={getPreviousPostId(data, index)} teamId={this.props.teamId} timestampProps={this.props.useRelativeTimestamp ? THREADING_TIME : undefined} - lastPost={this.props.lastPost} /> ); diff --git a/webapp/channels/src/selectors/views/custom_status.test.ts b/webapp/channels/src/selectors/views/custom_status.test.ts index fdbf13af94..8642fbc0ed 100644 --- a/webapp/channels/src/selectors/views/custom_status.test.ts +++ b/webapp/channels/src/selectors/views/custom_status.test.ts @@ -11,6 +11,7 @@ import {makeGetCustomStatus, getRecentCustomStatuses, isCustomStatusEnabled, sho import {TestHelper} from 'utils/test_helper'; import {CustomStatusDuration} from '@mattermost/types/users'; +import {addTimeToTimestamp, TimeInformation} from 'utils/utils'; jest.mock('mattermost-redux/selectors/entities/users'); jest.mock('mattermost-redux/selectors/entities/general'); @@ -86,6 +87,7 @@ describe('isCustomStatusEnabled', () => { }); describe('showStatusDropdownPulsatingDot and showPostHeaderUpdateStatusButton', () => { + const user = TestHelper.getUserMock(); const preference = { myPreference: { value: '', @@ -104,4 +106,31 @@ describe('showStatusDropdownPulsatingDot and showPostHeaderUpdateStatusButton', (PreferenceSelectors.get as jest.Mock).mockReturnValue(preference.myPreference.value); expect(showPostHeaderUpdateStatusButton(store.getState())).toBeFalsy(); }); + + it('should return false if user was created less than seven days before from today', async () => { + const store = await configureStore(); + (PreferenceSelectors.get as jest.Mock).mockReturnValue(preference.myPreference.value); + const todayTimestamp = new Date().getTime(); + + // set the user create date to 6 days in the past from today + const todayMinusSixDays = addTimeToTimestamp(todayTimestamp, TimeInformation.DAYS, 6, TimeInformation.PAST); + const newUser = {...user, create_at: todayMinusSixDays}; + newUser.props.customStatus = JSON.stringify(customStatus); + (UserSelectors.getCurrentUser as jest.Mock).mockReturnValue(newUser); + expect(showStatusDropdownPulsatingDot(store.getState())).toBeFalsy(); + }); + + it('should return true if user was created more than seven days before from today', async () => { + const store = await configureStore(); + preference.myPreference.value = JSON.stringify({[Preferences.CUSTOM_STATUS_MODAL_VIEWED]: false}); + (PreferenceSelectors.get as jest.Mock).mockReturnValue(preference.myPreference.value); + const todayTimestamp = new Date().getTime(); + + // set the user create date to 8 days in the past from today + const todayMinusEightDays = addTimeToTimestamp(todayTimestamp, TimeInformation.DAYS, 8, TimeInformation.PAST); + const newUser = {...user, create_at: todayMinusEightDays}; + newUser.props.customStatus = JSON.stringify(customStatus); + (UserSelectors.getCurrentUser as jest.Mock).mockReturnValue(newUser); + expect(showStatusDropdownPulsatingDot(store.getState())).toBeTruthy(); + }); }); diff --git a/webapp/channels/src/selectors/views/custom_status.ts b/webapp/channels/src/selectors/views/custom_status.ts index 80b2a93215..6d7742ccb4 100644 --- a/webapp/channels/src/selectors/views/custom_status.ts +++ b/webapp/channels/src/selectors/views/custom_status.ts @@ -12,6 +12,8 @@ import {get} from 'mattermost-redux/selectors/entities/preferences'; import {Preferences} from 'mattermost-redux/constants'; import {CustomStatusDuration, UserCustomStatus} from '@mattermost/types/users'; +import {isDateWithinDaysRange, TimeInformation} from 'utils/utils'; + import {GlobalState} from 'types/store'; import {getCurrentUserTimezone} from 'selectors/general'; import {getCurrentMomentForTimezone} from 'utils/timezone'; @@ -56,9 +58,12 @@ export function isCustomStatusEnabled(state: GlobalState) { } function showCustomStatusPulsatingDotAndPostHeader(state: GlobalState) { + // only show this for users after the first seven days + const currentUser = getCurrentUser(state); + const hasUserCreationMoreThanSevenDays = isDateWithinDaysRange(currentUser?.create_at, 7, TimeInformation.FUTURE); const customStatusTutorialState = get(state, Preferences.CATEGORY_CUSTOM_STATUS, Preferences.NAME_CUSTOM_STATUS_TUTORIAL_STATE); const modalAlreadyViewed = customStatusTutorialState && JSON.parse(customStatusTutorialState)[Preferences.CUSTOM_STATUS_MODAL_VIEWED]; - return !modalAlreadyViewed; + return !modalAlreadyViewed && hasUserCreationMoreThanSevenDays; } export function showStatusDropdownPulsatingDot(state: GlobalState) { diff --git a/webapp/channels/src/utils/utils.tsx b/webapp/channels/src/utils/utils.tsx index 4cdc34e57c..9f71b304d5 100644 --- a/webapp/channels/src/utils/utils.tsx +++ b/webapp/channels/src/utils/utils.tsx @@ -90,6 +90,23 @@ const CLICKABLE_ELEMENTS = [ 'audio', 'video', ]; +const MS_PER_SECOND = 1000; +const MS_PER_MINUTE = 60 * MS_PER_SECOND; +const MS_PER_HOUR = 60 * MS_PER_MINUTE; +const MS_PER_DAY = 24 * MS_PER_HOUR; + +export enum TimeInformation { + MILLISECONDS = 'm', + SECONDS = 's', + MINUTES = 'x', + HOURS = 'h', + DAYS = 'd', + FUTURE = 'f', + PAST = 'p' +} + +export type TimeUnit = Exclude; +export type TimeDirection = TimeInformation.FUTURE | TimeInformation.PAST; export function isMac() { return navigator.platform.toUpperCase().indexOf('MAC') >= 0; @@ -256,7 +273,6 @@ export function getTimestamp(): number { } export function getRemainingDaysFromFutureTimestamp(timestamp?: number): number { - const MS_PER_DAY = 24 * 60 * 60 * 1000; const futureDate = new Date(timestamp as number); const utcFuture = Date.UTC(futureDate.getFullYear(), futureDate.getMonth(), futureDate.getDate()); const today = new Date(); @@ -265,6 +281,39 @@ export function getRemainingDaysFromFutureTimestamp(timestamp?: number): number return Math.floor((utcFuture - utcToday) / MS_PER_DAY); } +export function addTimeToTimestamp(timestamp: number, type: TimeUnit, diff: number, timeline: TimeDirection) { + let modifier = 1; + switch (type) { + case TimeInformation.SECONDS: + modifier = MS_PER_SECOND; + break; + case TimeInformation.MINUTES: + modifier = MS_PER_MINUTE; + break; + case TimeInformation.HOURS: + modifier = MS_PER_HOUR; + break; + case TimeInformation.DAYS: + modifier = MS_PER_DAY; + break; + } + + return timeline === TimeInformation.FUTURE ? timestamp + (diff * modifier) : timestamp - (diff * modifier); +} + +/** + * Verifies if a date is in a particular given range of days from today + * @param timestamp date you want to check is in the range of the provided number of days from today + * @param days number of days you want to check your date against to + * @param timeline 'f' represents future, 'p' represents past + * @returns boolean, true if your date is in the range of the provided number of days + */ +export function isDateWithinDaysRange(timestamp: number, days: number, timeline: TimeDirection): boolean { + const today = new Date().getTime(); + const daysSince = Math.round((today - timestamp) / MS_PER_DAY); + return timeline === TimeInformation.PAST ? daysSince <= days : daysSince >= days; +} + export function getLocaleDateFromUTC(timestamp: number, format = 'YYYY/MM/DD HH:mm:ss', userTimezone = '') { if (!timestamp) { return moment.now(); From 42ae1536cb196124c1da6000e112634091a2e225 Mon Sep 17 00:00:00 2001 From: Dismated <77165959+Dismated@users.noreply.github.com> Date: Tue, 4 Apr 2023 19:28:40 +0300 Subject: [PATCH 18/54] MM-47095 Migrate AbstractIncomingWebhook to TypeScript (#22654) Co-authored-by: Mattermost Build --- .../channel_select/channel_select.tsx | 4 +- .../abstract_incoming_hook.test.tsx.snap | 56 +++---- .../abstract_incoming_hook.test.tsx | 31 +++- ...hook.jsx => abstract_incoming_webhook.tsx} | 155 ++++++++++-------- .../src/components/spinner_button.tsx | 5 +- 5 files changed, 148 insertions(+), 103 deletions(-) rename webapp/channels/src/components/integrations/{abstract_incoming_webhook.jsx => abstract_incoming_webhook.tsx} (79%) diff --git a/webapp/channels/src/components/channel_select/channel_select.tsx b/webapp/channels/src/components/channel_select/channel_select.tsx index d6b3a8e882..b7c32449d9 100644 --- a/webapp/channels/src/components/channel_select/channel_select.tsx +++ b/webapp/channels/src/components/channel_select/channel_select.tsx @@ -1,7 +1,7 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import React from 'react'; +import React, {ChangeEventHandler} from 'react'; import {Channel} from '@mattermost/types/channels'; @@ -10,7 +10,7 @@ import * as Utils from 'utils/utils'; type Props = { channels: Channel[]; - onChange?: () => void; + onChange?: ChangeEventHandler; value?: string; selectOpen: boolean; selectPrivate: boolean; diff --git a/webapp/channels/src/components/integrations/__snapshots__/abstract_incoming_hook.test.tsx.snap b/webapp/channels/src/components/integrations/__snapshots__/abstract_incoming_hook.test.tsx.snap index 6bbb1f6e00..b8fb192a10 100644 --- a/webapp/channels/src/components/integrations/__snapshots__/abstract_incoming_hook.test.tsx.snap +++ b/webapp/channels/src/components/integrations/__snapshots__/abstract_incoming_hook.test.tsx.snap @@ -43,7 +43,7 @@ exports[`components/integrations/AbstractIncomingWebhook should call action func { - const team = {name: 'team_name'}; + const team: Team = {id: 'team_id', + create_at: 0, + update_at: 0, + delete_at: 0, + display_name: 'team_name', + name: 'team_name', + description: 'team_description', + email: 'team_email', + type: 'I', + company_name: 'team_company_name', + allowed_domains: 'team_allowed_domains', + invite_id: 'team_invite_id', + allow_open_invite: false, + scheme_id: 'team_scheme_id', + group_constrained: false, + }; const header = {id: 'header_id', defaultMessage: 'Header'}; const footer = {id: 'footer_id', defaultMessage: 'Footer'}; const loading = {id: 'loading_id', defaultMessage: 'Loading'}; @@ -16,6 +34,15 @@ describe('components/integrations/AbstractIncomingWebhook', () => { display_name: 'testIncomingWebhook', channel_id: '88cxd9wpzpbpfp8pad78xj75pr', description: 'testing', + id: 'test_id', + team_id: 'test_team_id', + create_at: 0, + update_at: 0, + delete_at: 0, + user_id: 'test_user_id', + username: '', + icon_url: '', + channel_locked: false, }; const enablePostUsernameOverride = true; const enablePostIconOverride = true; @@ -104,7 +131,7 @@ describe('components/integrations/AbstractIncomingWebhook', () => { }; const wrapper = shallow(); - wrapper.find('#channelId').simulate('change', evt); + wrapper.find(ChannelSelect).simulate('change', evt); expect(wrapper.state('channelId')).toBe(newChannelId); }); diff --git a/webapp/channels/src/components/integrations/abstract_incoming_webhook.jsx b/webapp/channels/src/components/integrations/abstract_incoming_webhook.tsx similarity index 79% rename from webapp/channels/src/components/integrations/abstract_incoming_webhook.jsx rename to webapp/channels/src/components/integrations/abstract_incoming_webhook.tsx index 498d811c99..af43262239 100644 --- a/webapp/channels/src/components/integrations/abstract_incoming_webhook.jsx +++ b/webapp/channels/src/components/integrations/abstract_incoming_webhook.tsx @@ -1,87 +1,100 @@ // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. -import PropTypes from 'prop-types'; -import React from 'react'; -import {FormattedMessage} from 'react-intl'; +import React, {ChangeEventHandler, FormEvent, MouseEvent, PureComponent} from 'react'; +import {FormattedMessage, MessageDescriptor} from 'react-intl'; import {Link} from 'react-router-dom'; import BackstageHeader from 'components/backstage/components/backstage_header'; import ChannelSelect from 'components/channel_select'; import FormError from 'components/form_error'; import SpinnerButton from 'components/spinner_button'; +import {Team} from '@mattermost/types/teams'; import {localizeMessage} from 'utils/utils'; +import {IncomingWebhook} from '@mattermost/types/integrations'; -export default class AbstractIncomingWebhook extends React.PureComponent { - static propTypes = { +interface State { + displayName: string; + description: string; + channelId: string; + channelLocked: boolean; + username: string; + iconURL: string; + saving: boolean; + serverError: string; + clientError: JSX.Element | null; +} - /** - * The current team - */ - team: PropTypes.object.isRequired, +interface Props { - /** - * The header text to render, has id and defaultMessage - */ - header: PropTypes.object.isRequired, + /** + * The current team + */ + team: Team; - /** - * The footer text to render, has id and defaultMessage - */ - footer: PropTypes.object.isRequired, + /** + * The header text to render, has id and defaultMessage + */ + header: MessageDescriptor; - /** - * The spinner loading text to render, has id and defaultMessage - */ - loading: PropTypes.object.isRequired, + /** + * The footer text to render, has id and defaultMessage + */ + footer: MessageDescriptor; - /** - * The server error text after a failed action - */ - serverError: PropTypes.string.isRequired, + /** + * The spinner loading text to render, has id and defaultMessage + */ + loading: MessageDescriptor; - /** - * The hook used to set the initial state - */ - initialHook: PropTypes.object, + /** + * The server error text after a failed action + */ + serverError: string; - /** - * Whether to allow configuration of the default post username. - */ - enablePostUsernameOverride: PropTypes.bool.isRequired, + /** + * The hook used to set the initial state + */ + initialHook?: IncomingWebhook | Record; - /** - * Whether to allow configuration of the default post icon. - */ - enablePostIconOverride: PropTypes.bool.isRequired, + /** + * Whether to allow configuration of the default post username. + */ + enablePostUsernameOverride: boolean; - /** - * The async function to run when the action button is pressed - */ - action: PropTypes.func.isRequired, - } + /** + * Whether to allow configuration of the default post icon. + */ + enablePostIconOverride: boolean; - constructor(props) { + /** + * The async function to run when the action button is pressed + */ + action: (hook: IncomingWebhook) => Promise; +} + +export default class AbstractIncomingWebhook extends PureComponent { + constructor(props: Props | Readonly) { super(props); this.state = this.getStateFromHook(this.props.initialHook || {}); } - getStateFromHook = (hook) => { + getStateFromHook = (hook: IncomingWebhook | Record) => { return { - displayName: hook.display_name || '', - description: hook.description || '', - channelId: hook.channel_id || '', - channelLocked: hook.channel_locked || false, - username: hook.username || '', - iconURL: hook.icon_url || '', + displayName: hook?.display_name || '', + description: hook?.description || '', + channelId: hook?.channel_id || '', + channelLocked: hook?.channel_locked || false, + username: hook?.username || '', + iconURL: hook?.icon_url || '', saving: false, serverError: '', clientError: null, }; } - handleSubmit = (e) => { + handleSubmit = (e: MouseEvent | FormEvent) => { e.preventDefault(); if (this.state.saving) { @@ -91,7 +104,7 @@ export default class AbstractIncomingWebhook extends React.PureComponent { this.setState({ saving: true, serverError: '', - clientError: '', + clientError: null, }); if (!this.state.channelId) { @@ -115,50 +128,56 @@ export default class AbstractIncomingWebhook extends React.PureComponent { description: this.state.description, username: this.state.username, icon_url: this.state.iconURL, + id: this.props.initialHook?.id || '', + create_at: this.props.initialHook?.create_at || 0, + update_at: this.props.initialHook?.update_at || 0, + delete_at: this.props.initialHook?.delete_at || 0, + team_id: this.props.initialHook?.team_id || '', + user_id: this.props.initialHook?.user_id || '', }; this.props.action(hook).then(() => this.setState({saving: false})); } - updateDisplayName = (e) => { + updateDisplayName: ChangeEventHandler = (e) => { this.setState({ displayName: e.target.value, }); } - updateDescription = (e) => { + updateDescription: ChangeEventHandler = (e) => { this.setState({ description: e.target.value, }); } - updateChannelId = (e) => { + updateChannelId: ChangeEventHandler = (e) => { this.setState({ channelId: e.target.value, }); } - updateChannelLocked = (e) => { + updateChannelLocked: ChangeEventHandler = (e) => { this.setState({ channelLocked: e.target.checked, }); } - updateUsername = (e) => { + updateUsername: ChangeEventHandler = (e) => { this.setState({ username: e.target.value, }); } - updateIconURL = (e) => { + updateIconURL: ChangeEventHandler = (e) => { this.setState({ iconURL: e.target.value, }); } render() { - var headerToRender = this.props.header; - var footerToRender = this.props.footer; + const headerToRender = this.props.header; + const footerToRender = this.props.footer; return (
    @@ -177,7 +196,7 @@ export default class AbstractIncomingWebhook extends React.PureComponent {
    this.handleSubmit(e)} >