From 57ceae0f14b2ede6b2f56e554fc2bc1bd206accb Mon Sep 17 00:00:00 2001 From: Jan Cizmar Date: Thu, 12 Sep 2024 08:46:50 +0200 Subject: [PATCH] fix: Billing fixes - Remove subscribe button for free plans in the UI - Throw proper error on backend - Move billing frontend to ee directory --- .../kotlin/io/tolgee/constants/Message.kt | 4 ++ e2e/cypress/support/dataCyType.d.ts | 6 +-- .../SelfHostedEeEstimatedCosts.tsx | 2 +- .../billing/BillingSection.tsx | 0 .../billing/CurrentUsage/CurrentUsage.tsx | 2 +- .../billing/CurrentUsage/PlanMetric.tsx | 0 .../billing/CustomerPortal/CustomerPortal.tsx | 4 +- .../billing/Invoices/DownloadButton.tsx | 0 .../billing/Invoices/InvoiceUsage.tsx | 2 +- .../billing/Invoices/Invoices.tsx | 0 .../Invoices/OrganizationInvoicesView.tsx | 4 +- ...OrganizationBillingTestClockHelperView.tsx | 4 +- .../billing/OrganizationBillingView.tsx | 0 .../billing/PrepareUpgradeDialog.tsx | 0 .../OrganizationSubscriptionsView.tsx | 4 +- .../Subscriptions/cloud/CloudPlanAction.tsx | 27 ++++++----- .../Subscriptions/cloud/PlansCloud.tsx | 0 .../Subscriptions/cloud/PlansCloudList.tsx | 1 + .../selfHosted/PlansSelfHosted.tsx | 0 .../selfHosted/PlansSelfHostedList.tsx | 0 .../SelfHostedEeActiveSubscription.tsx | 0 .../SelfHostedEeSubscriptionActions.tsx | 0 .../selfHosted/SelfHostedPlanAction.tsx | 0 .../AdministrationCloudPlanCreateView.tsx | 6 +-- .../AdministrationCloudPlanEditView.tsx | 6 +-- .../AdministrationCloudPlansView.tsx | 12 ++--- .../AdministrationEeLicenseView.tsx | 8 ++-- .../AdministrationEePlanCreateView.tsx | 4 +- .../AdministrationEePlanEditView.tsx | 4 +- .../AdministrationEePlansView.tsx | 12 ++--- .../components/AssignSwitchCheckbox.tsx | 46 +++++++++++++++++++ .../components/CloudPlanForm.tsx | 35 ++++---------- .../components/CloudPlanOrganizations.tsx | 16 +++++-- .../administration/components/EePlanForm.tsx | 6 +-- .../components/EePlanOrganizations.tsx | 8 ++-- .../billing/common/SubscriptionStatus.tsx | 0 .../common/usage/AppliedStripeCreditsRow.tsx | 0 .../billing/common/usage/EstimatedCosts.tsx | 0 .../billing/common/usage/ItemRow.tsx | 0 .../common/usage/PlanUsageEstimatedCosts.tsx | 0 .../common/usage/ProportionalUsageItemRow.tsx | 0 .../billing/common/usage/SubscriptionRow.tsx | 0 .../billing/common/usage/SumUsageItemRow.tsx | 0 .../billing/common/usage/TotalRow.tsx | 0 .../billing/common/usage/TotalTable.tsx | 0 .../common/usage/UsageDialogButton.tsx | 0 .../billing/common/usage/UsageTable.tsx | 0 .../billing/common/usage/UsageTableHead.tsx | 0 .../billing/useOrganizationCreditBalance.tsx | 0 .../eeLicense/ActiveEeLicense.tsx | 0 .../eeLicense/EeLicenseHint.tsx | 0 .../eeLicense/RefreshButton.tsx | 2 +- .../eeLicense/ReleaseKeyButton.tsx | 0 .../eeLicense/SetupLicenceKey.tsx | 0 .../src/service/billingApiSchema.generated.ts | 10 +++- .../translationTools/useErrorTranslation.ts | 2 + .../administration/AdministrationView.tsx | 14 +++--- .../organizations/OrganizationsRouter.tsx | 8 ++-- 58 files changed, 156 insertions(+), 103 deletions(-) rename webapp/src/{views/organizations => ee}/billing/BillingSection.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/CurrentUsage/CurrentUsage.tsx (98%) rename webapp/src/{views/organizations => ee}/billing/CurrentUsage/PlanMetric.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/CustomerPortal/CustomerPortal.tsx (96%) rename webapp/src/{views/organizations => ee}/billing/Invoices/DownloadButton.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/Invoices/InvoiceUsage.tsx (97%) rename webapp/src/{views/organizations => ee}/billing/Invoices/Invoices.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/Invoices/OrganizationInvoicesView.tsx (88%) rename webapp/src/{views/organizations => ee}/billing/OrganizationBillingTestClockHelperView.tsx (96%) rename webapp/src/{views/organizations => ee}/billing/OrganizationBillingView.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/PrepareUpgradeDialog.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/Subscriptions/OrganizationSubscriptionsView.tsx (95%) rename webapp/src/{views/organizations => ee}/billing/Subscriptions/cloud/CloudPlanAction.tsx (84%) rename webapp/src/{views/organizations => ee}/billing/Subscriptions/cloud/PlansCloud.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/Subscriptions/cloud/PlansCloudList.tsx (99%) rename webapp/src/{views/organizations => ee}/billing/Subscriptions/selfHosted/PlansSelfHosted.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/Subscriptions/selfHosted/PlansSelfHostedList.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/Subscriptions/selfHosted/SelfHostedEeActiveSubscription.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/Subscriptions/selfHosted/SelfHostedEeSubscriptionActions.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/Subscriptions/selfHosted/SelfHostedPlanAction.tsx (100%) rename webapp/src/{views => ee/billing}/administration/AdministrationCloudPlanCreateView.tsx (93%) rename webapp/src/{views => ee/billing}/administration/AdministrationCloudPlanEditView.tsx (94%) rename webapp/src/{views => ee/billing}/administration/AdministrationCloudPlansView.tsx (96%) rename webapp/src/{views => ee/billing}/administration/AdministrationEeLicenseView.tsx (82%) rename webapp/src/{views => ee/billing}/administration/AdministrationEePlanCreateView.tsx (94%) rename webapp/src/{views => ee/billing}/administration/AdministrationEePlanEditView.tsx (95%) rename webapp/src/{views => ee/billing}/administration/AdministrationEePlansView.tsx (96%) create mode 100644 webapp/src/ee/billing/administration/components/AssignSwitchCheckbox.tsx rename webapp/src/{views => ee/billing}/administration/components/CloudPlanForm.tsx (93%) rename webapp/src/{views => ee/billing}/administration/components/CloudPlanOrganizations.tsx (93%) rename webapp/src/{views => ee/billing}/administration/components/EePlanForm.tsx (100%) rename webapp/src/{views => ee/billing}/administration/components/EePlanOrganizations.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/common/SubscriptionStatus.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/common/usage/AppliedStripeCreditsRow.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/common/usage/EstimatedCosts.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/common/usage/ItemRow.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/common/usage/PlanUsageEstimatedCosts.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/common/usage/ProportionalUsageItemRow.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/common/usage/SubscriptionRow.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/common/usage/SumUsageItemRow.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/common/usage/TotalRow.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/common/usage/TotalTable.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/common/usage/UsageDialogButton.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/common/usage/UsageTable.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/common/usage/UsageTableHead.tsx (100%) rename webapp/src/{views/organizations => ee}/billing/useOrganizationCreditBalance.tsx (100%) rename webapp/src/{views/administration => ee}/eeLicense/ActiveEeLicense.tsx (100%) rename webapp/src/{views/administration => ee}/eeLicense/EeLicenseHint.tsx (100%) rename webapp/src/{views/administration => ee}/eeLicense/RefreshButton.tsx (95%) rename webapp/src/{views/administration => ee}/eeLicense/ReleaseKeyButton.tsx (100%) rename webapp/src/{views/administration => ee}/eeLicense/SetupLicenceKey.tsx (100%) diff --git a/backend/data/src/main/kotlin/io/tolgee/constants/Message.kt b/backend/data/src/main/kotlin/io/tolgee/constants/Message.kt index 0e05d76d7f..f95946ba29 100644 --- a/backend/data/src/main/kotlin/io/tolgee/constants/Message.kt +++ b/backend/data/src/main/kotlin/io/tolgee/constants/Message.kt @@ -235,6 +235,10 @@ enum class Message { SLACK_WORKSPACE_ALREADY_CONNECTED, SLACK_CONNECTION_ERROR, EMAIL_VERIFICATION_CODE_NOT_VALID, + CANNOT_SUBSCRIBE_TO_FREE_PLAN, + PLAN_AUTO_ASSIGNMENT_ONLY_FOR_FREE_PLANS, + PLAN_AUTO_ASSIGNMENT_ONLY_FOR_PRIVATE_PLANS, + PLAN_AUTO_ASSIGNMENT_ORGANIZATION_IDS_NOT_IN_FOR_ORGANIZATION_IDS, ; val code: String diff --git a/e2e/cypress/support/dataCyType.d.ts b/e2e/cypress/support/dataCyType.d.ts index 5fc6a7d47b..3a3081712e 100644 --- a/e2e/cypress/support/dataCyType.d.ts +++ b/e2e/cypress/support/dataCyType.d.ts @@ -1,5 +1,5 @@ declare namespace DataCy { - export type Value = + export type Value = "account-security-initial-password-set" | "account-security-set-password-instructions-sent" | "active-plan-license-key-input" | @@ -9,7 +9,6 @@ declare namespace DataCy { "activity-detail-dialog" | "add-box" | "administration-access-message" | - "administration-cloud-plan-field-auto-assign-to-selected" | "administration-cloud-plan-field-feature" | "administration-cloud-plan-field-free" | "administration-cloud-plan-field-included-mt-credits" | @@ -23,6 +22,7 @@ declare namespace DataCy { "administration-cloud-plan-field-stripe-product" | "administration-cloud-plan-field-type" | "administration-cloud-plan-field-type-item" | + "administration-cloud-plan-organization-assign-switch" | "administration-cloud-plan-submit-button" | "administration-cloud-plans-item" | "administration-cloud-plans-item-delete" | @@ -558,4 +558,4 @@ declare namespace DataCy { "webhooks-item-test" | "webhooks-list-item" | "webhooks-subtitle" -} +} \ No newline at end of file diff --git a/webapp/src/component/billing/ActiveSubscription/SelfHostedEeEstimatedCosts.tsx b/webapp/src/component/billing/ActiveSubscription/SelfHostedEeEstimatedCosts.tsx index 366179db8e..d18b9a9f57 100644 --- a/webapp/src/component/billing/ActiveSubscription/SelfHostedEeEstimatedCosts.tsx +++ b/webapp/src/component/billing/ActiveSubscription/SelfHostedEeEstimatedCosts.tsx @@ -1,7 +1,7 @@ import { FC } from 'react'; import { components } from 'tg.service/billingApiSchema.generated'; import { useBillingApiQuery } from 'tg.service/http/useQueryApi'; -import { PlanUsageEstimatedCosts } from 'tg.views/organizations/billing/common/usage/PlanUsageEstimatedCosts'; +import { PlanUsageEstimatedCosts } from 'tg.ee/billing/common/usage/PlanUsageEstimatedCosts'; import { useOrganization } from 'tg.views/organizations/useOrganization'; export const SelfHostedEeEstimatedCosts: FC<{ diff --git a/webapp/src/views/organizations/billing/BillingSection.tsx b/webapp/src/ee/billing/BillingSection.tsx similarity index 100% rename from webapp/src/views/organizations/billing/BillingSection.tsx rename to webapp/src/ee/billing/BillingSection.tsx diff --git a/webapp/src/views/organizations/billing/CurrentUsage/CurrentUsage.tsx b/webapp/src/ee/billing/CurrentUsage/CurrentUsage.tsx similarity index 98% rename from webapp/src/views/organizations/billing/CurrentUsage/CurrentUsage.tsx rename to webapp/src/ee/billing/CurrentUsage/CurrentUsage.tsx index 1114c848c4..b2ae2721f1 100644 --- a/webapp/src/views/organizations/billing/CurrentUsage/CurrentUsage.tsx +++ b/webapp/src/ee/billing/CurrentUsage/CurrentUsage.tsx @@ -15,7 +15,7 @@ import { PlanMetric } from './PlanMetric'; import { MtHint } from 'tg.component/billing/MtHint'; import { EstimatedCosts } from '../common/usage/EstimatedCosts'; import { useBillingApiQuery } from 'tg.service/http/useQueryApi'; -import { useOrganization } from '../../useOrganization'; +import { useOrganization } from 'tg.views/organizations/useOrganization'; import { getProgressData } from 'tg.component/billing/utils'; import { StringsHint } from 'tg.component/billing/Hints'; diff --git a/webapp/src/views/organizations/billing/CurrentUsage/PlanMetric.tsx b/webapp/src/ee/billing/CurrentUsage/PlanMetric.tsx similarity index 100% rename from webapp/src/views/organizations/billing/CurrentUsage/PlanMetric.tsx rename to webapp/src/ee/billing/CurrentUsage/PlanMetric.tsx diff --git a/webapp/src/views/organizations/billing/CustomerPortal/CustomerPortal.tsx b/webapp/src/ee/billing/CustomerPortal/CustomerPortal.tsx similarity index 96% rename from webapp/src/views/organizations/billing/CustomerPortal/CustomerPortal.tsx rename to webapp/src/ee/billing/CustomerPortal/CustomerPortal.tsx index 3f795f8e59..ad92e0e8cc 100644 --- a/webapp/src/views/organizations/billing/CustomerPortal/CustomerPortal.tsx +++ b/webapp/src/ee/billing/CustomerPortal/CustomerPortal.tsx @@ -1,12 +1,12 @@ -import { Button, styled, Typography, Box } from '@mui/material'; +import { Box, Button, styled, Typography } from '@mui/material'; import { useTranslate } from '@tolgee/react'; import { useBillingApiMutation } from 'tg.service/http/useQueryApi'; import { useOrganization } from 'tg.views/organizations/useOrganization'; import { StyledBillingSection, - StyledBillingSectionTitle, StyledBillingSectionHeader, + StyledBillingSectionTitle, } from '../BillingSection'; import StripeLogoSvg from 'tg.svgs/stripeLogo.svg?react'; diff --git a/webapp/src/views/organizations/billing/Invoices/DownloadButton.tsx b/webapp/src/ee/billing/Invoices/DownloadButton.tsx similarity index 100% rename from webapp/src/views/organizations/billing/Invoices/DownloadButton.tsx rename to webapp/src/ee/billing/Invoices/DownloadButton.tsx diff --git a/webapp/src/views/organizations/billing/Invoices/InvoiceUsage.tsx b/webapp/src/ee/billing/Invoices/InvoiceUsage.tsx similarity index 97% rename from webapp/src/views/organizations/billing/Invoices/InvoiceUsage.tsx rename to webapp/src/ee/billing/Invoices/InvoiceUsage.tsx index 039e6bc073..ff49d0d841 100644 --- a/webapp/src/views/organizations/billing/Invoices/InvoiceUsage.tsx +++ b/webapp/src/ee/billing/Invoices/InvoiceUsage.tsx @@ -11,7 +11,7 @@ import { components } from 'tg.service/billingApiSchema.generated'; import { useTranslate } from '@tolgee/react'; import { useBillingApiQuery } from 'tg.service/http/useQueryApi'; import Dialog from '@mui/material/Dialog'; -import { useOrganization } from '../../useOrganization'; +import { useOrganization } from 'tg.views/organizations/useOrganization'; import { EmptyListMessage } from 'tg.component/common/EmptyListMessage'; import { TotalTable } from '../common/usage/TotalTable'; import { UsageTable } from '../common/usage/UsageTable'; diff --git a/webapp/src/views/organizations/billing/Invoices/Invoices.tsx b/webapp/src/ee/billing/Invoices/Invoices.tsx similarity index 100% rename from webapp/src/views/organizations/billing/Invoices/Invoices.tsx rename to webapp/src/ee/billing/Invoices/Invoices.tsx diff --git a/webapp/src/views/organizations/billing/Invoices/OrganizationInvoicesView.tsx b/webapp/src/ee/billing/Invoices/OrganizationInvoicesView.tsx similarity index 88% rename from webapp/src/views/organizations/billing/Invoices/OrganizationInvoicesView.tsx rename to webapp/src/ee/billing/Invoices/OrganizationInvoicesView.tsx index 1982ab0005..8f3303279d 100644 --- a/webapp/src/views/organizations/billing/Invoices/OrganizationInvoicesView.tsx +++ b/webapp/src/ee/billing/Invoices/OrganizationInvoicesView.tsx @@ -1,9 +1,9 @@ import { FunctionComponent } from 'react'; import { useTranslate } from '@tolgee/react'; -import { BaseOrganizationSettingsView } from '../../components/BaseOrganizationSettingsView'; +import { BaseOrganizationSettingsView } from 'tg.views/organizations/components/BaseOrganizationSettingsView'; import { LINKS } from 'tg.constants/links'; -import { useOrganization } from '../../useOrganization'; +import { useOrganization } from 'tg.views/organizations/useOrganization'; import { CustomerPortal } from '../CustomerPortal/CustomerPortal'; import { Invoices } from './Invoices'; import { styled } from '@mui/material'; diff --git a/webapp/src/views/organizations/billing/OrganizationBillingTestClockHelperView.tsx b/webapp/src/ee/billing/OrganizationBillingTestClockHelperView.tsx similarity index 96% rename from webapp/src/views/organizations/billing/OrganizationBillingTestClockHelperView.tsx rename to webapp/src/ee/billing/OrganizationBillingTestClockHelperView.tsx index 7f3dae4a30..721f7373f2 100644 --- a/webapp/src/views/organizations/billing/OrganizationBillingTestClockHelperView.tsx +++ b/webapp/src/ee/billing/OrganizationBillingTestClockHelperView.tsx @@ -6,9 +6,9 @@ import { } from 'react'; import { useTranslate } from '@tolgee/react'; -import { BaseOrganizationSettingsView } from '../components/BaseOrganizationSettingsView'; +import { BaseOrganizationSettingsView } from 'tg.views/organizations/components/BaseOrganizationSettingsView'; import { LINKS } from 'tg.constants/links'; -import { useOrganization } from '../useOrganization'; +import { useOrganization } from 'tg.views/organizations/useOrganization'; import { UseQueryResult } from 'react-query'; import { useApiMutation, useApiQuery } from 'tg.service/http/useQueryApi'; import { diff --git a/webapp/src/views/organizations/billing/OrganizationBillingView.tsx b/webapp/src/ee/billing/OrganizationBillingView.tsx similarity index 100% rename from webapp/src/views/organizations/billing/OrganizationBillingView.tsx rename to webapp/src/ee/billing/OrganizationBillingView.tsx diff --git a/webapp/src/views/organizations/billing/PrepareUpgradeDialog.tsx b/webapp/src/ee/billing/PrepareUpgradeDialog.tsx similarity index 100% rename from webapp/src/views/organizations/billing/PrepareUpgradeDialog.tsx rename to webapp/src/ee/billing/PrepareUpgradeDialog.tsx diff --git a/webapp/src/views/organizations/billing/Subscriptions/OrganizationSubscriptionsView.tsx b/webapp/src/ee/billing/Subscriptions/OrganizationSubscriptionsView.tsx similarity index 95% rename from webapp/src/views/organizations/billing/Subscriptions/OrganizationSubscriptionsView.tsx rename to webapp/src/ee/billing/Subscriptions/OrganizationSubscriptionsView.tsx index 994439c829..8979407116 100644 --- a/webapp/src/views/organizations/billing/Subscriptions/OrganizationSubscriptionsView.tsx +++ b/webapp/src/ee/billing/Subscriptions/OrganizationSubscriptionsView.tsx @@ -2,9 +2,9 @@ import { FunctionComponent, useEffect } from 'react'; import { useHistory, useLocation } from 'react-router-dom'; import { T, useTranslate } from '@tolgee/react'; -import { BaseOrganizationSettingsView } from '../../components/BaseOrganizationSettingsView'; +import { BaseOrganizationSettingsView } from 'tg.views/organizations/components/BaseOrganizationSettingsView'; import { LINKS, PARAMS } from 'tg.constants/links'; -import { useOrganization } from '../../useOrganization'; +import { useOrganization } from 'tg.views/organizations/useOrganization'; import { useBillingApiMutation } from 'tg.service/http/useQueryApi'; import { useMessage } from 'tg.hooks/useSuccessMessage'; import { PlansCloud } from './cloud/PlansCloud'; diff --git a/webapp/src/views/organizations/billing/Subscriptions/cloud/CloudPlanAction.tsx b/webapp/src/ee/billing/Subscriptions/cloud/CloudPlanAction.tsx similarity index 84% rename from webapp/src/views/organizations/billing/Subscriptions/cloud/CloudPlanAction.tsx rename to webapp/src/ee/billing/Subscriptions/cloud/CloudPlanAction.tsx index 338647b486..f15bf5c0b9 100644 --- a/webapp/src/views/organizations/billing/Subscriptions/cloud/CloudPlanAction.tsx +++ b/webapp/src/ee/billing/Subscriptions/cloud/CloudPlanAction.tsx @@ -1,6 +1,6 @@ import { Box, styled } from '@mui/material'; import { T, useTranslate } from '@tolgee/react'; -import { PrepareUpgradeDialog } from 'tg.views/organizations/billing/PrepareUpgradeDialog'; +import { PrepareUpgradeDialog } from '../../PrepareUpgradeDialog'; import { usePlan } from 'tg.component/billing/Plan/usePlan'; import { confirmation } from 'tg.hooks/confirmation'; @@ -24,6 +24,7 @@ type Props = { custom?: boolean; planId: number; period: BillingPeriodType; + show?: boolean; }; export const PlanAction = ({ @@ -33,6 +34,7 @@ export const PlanAction = ({ organizationHasSomeSubscription, planId, period, + show, }: Props) => { const { cancelMutation, @@ -85,19 +87,22 @@ export const PlanAction = ({ } const { loading, onClick, label } = getLabelAndAction(); + const shouldShow = show == undefined || show; return ( - - {label} - + {shouldShow && ( + + {label} + + )} {prepareUpgradeMutation.data && ( = ({ active={isActive(plan)} ended={isEnded(plan)} custom={custom} + show={!plan.free} organizationHasSomeSubscription={ !activeSubscription.plan.free } diff --git a/webapp/src/views/organizations/billing/Subscriptions/selfHosted/PlansSelfHosted.tsx b/webapp/src/ee/billing/Subscriptions/selfHosted/PlansSelfHosted.tsx similarity index 100% rename from webapp/src/views/organizations/billing/Subscriptions/selfHosted/PlansSelfHosted.tsx rename to webapp/src/ee/billing/Subscriptions/selfHosted/PlansSelfHosted.tsx diff --git a/webapp/src/views/organizations/billing/Subscriptions/selfHosted/PlansSelfHostedList.tsx b/webapp/src/ee/billing/Subscriptions/selfHosted/PlansSelfHostedList.tsx similarity index 100% rename from webapp/src/views/organizations/billing/Subscriptions/selfHosted/PlansSelfHostedList.tsx rename to webapp/src/ee/billing/Subscriptions/selfHosted/PlansSelfHostedList.tsx diff --git a/webapp/src/views/organizations/billing/Subscriptions/selfHosted/SelfHostedEeActiveSubscription.tsx b/webapp/src/ee/billing/Subscriptions/selfHosted/SelfHostedEeActiveSubscription.tsx similarity index 100% rename from webapp/src/views/organizations/billing/Subscriptions/selfHosted/SelfHostedEeActiveSubscription.tsx rename to webapp/src/ee/billing/Subscriptions/selfHosted/SelfHostedEeActiveSubscription.tsx diff --git a/webapp/src/views/organizations/billing/Subscriptions/selfHosted/SelfHostedEeSubscriptionActions.tsx b/webapp/src/ee/billing/Subscriptions/selfHosted/SelfHostedEeSubscriptionActions.tsx similarity index 100% rename from webapp/src/views/organizations/billing/Subscriptions/selfHosted/SelfHostedEeSubscriptionActions.tsx rename to webapp/src/ee/billing/Subscriptions/selfHosted/SelfHostedEeSubscriptionActions.tsx diff --git a/webapp/src/views/organizations/billing/Subscriptions/selfHosted/SelfHostedPlanAction.tsx b/webapp/src/ee/billing/Subscriptions/selfHosted/SelfHostedPlanAction.tsx similarity index 100% rename from webapp/src/views/organizations/billing/Subscriptions/selfHosted/SelfHostedPlanAction.tsx rename to webapp/src/ee/billing/Subscriptions/selfHosted/SelfHostedPlanAction.tsx diff --git a/webapp/src/views/administration/AdministrationCloudPlanCreateView.tsx b/webapp/src/ee/billing/administration/AdministrationCloudPlanCreateView.tsx similarity index 93% rename from webapp/src/views/administration/AdministrationCloudPlanCreateView.tsx rename to webapp/src/ee/billing/administration/AdministrationCloudPlanCreateView.tsx index 6af7f5f5a1..124ca24536 100644 --- a/webapp/src/views/administration/AdministrationCloudPlanCreateView.tsx +++ b/webapp/src/ee/billing/administration/AdministrationCloudPlanCreateView.tsx @@ -1,12 +1,12 @@ import { Box, Typography } from '@mui/material'; -import { useTranslate, T } from '@tolgee/react'; +import { T, useTranslate } from '@tolgee/react'; import { useHistory } from 'react-router-dom'; import { DashboardPage } from 'tg.component/layout/DashboardPage'; import { LINKS } from 'tg.constants/links'; import { useMessage } from 'tg.hooks/useSuccessMessage'; import { useBillingApiMutation } from 'tg.service/http/useQueryApi'; -import { BaseAdministrationView } from './components/BaseAdministrationView'; +import { BaseAdministrationView } from 'tg.views/administration/components/BaseAdministrationView'; import { CloudPlanForm } from './components/CloudPlanForm'; export const AdministrationCloudPlanCreateView = () => { @@ -85,7 +85,7 @@ export const AdministrationCloudPlanCreateView = () => { public: true, forOrganizationIds: [], free: false, - autoAssign: false, + autoAssignOrganizationIds: [], }} /> diff --git a/webapp/src/views/administration/AdministrationCloudPlanEditView.tsx b/webapp/src/ee/billing/administration/AdministrationCloudPlanEditView.tsx similarity index 94% rename from webapp/src/views/administration/AdministrationCloudPlanEditView.tsx rename to webapp/src/ee/billing/administration/AdministrationCloudPlanEditView.tsx index 3df04b9bb7..5b71f57d73 100644 --- a/webapp/src/views/administration/AdministrationCloudPlanEditView.tsx +++ b/webapp/src/ee/billing/administration/AdministrationCloudPlanEditView.tsx @@ -1,5 +1,5 @@ import { Box, Typography } from '@mui/material'; -import { useTranslate, T } from '@tolgee/react'; +import { T, useTranslate } from '@tolgee/react'; import { useHistory, useRouteMatch } from 'react-router-dom'; import { SpinnerProgress } from 'tg.component/SpinnerProgress'; @@ -10,7 +10,7 @@ import { useBillingApiMutation, useBillingApiQuery, } from 'tg.service/http/useQueryApi'; -import { BaseAdministrationView } from './components/BaseAdministrationView'; +import { BaseAdministrationView } from 'tg.views/administration/components/BaseAdministrationView'; import { CloudPlanForm } from './components/CloudPlanForm'; export const AdministrationCloudPlanEditView = () => { @@ -71,7 +71,7 @@ export const AdministrationCloudPlanEditView = () => { loading={planEditLoadable.isLoading} initialData={{ ...planData, - autoAssign: false, + autoAssignOrganizationIds: [], includedUsage: { seats: planData.includedUsage.seats, mtCredits: planData.includedUsage.mtCredits, diff --git a/webapp/src/views/administration/AdministrationCloudPlansView.tsx b/webapp/src/ee/billing/administration/AdministrationCloudPlansView.tsx similarity index 96% rename from webapp/src/views/administration/AdministrationCloudPlansView.tsx rename to webapp/src/ee/billing/administration/AdministrationCloudPlansView.tsx index c3e65126fb..d5ca2fbf32 100644 --- a/webapp/src/views/administration/AdministrationCloudPlansView.tsx +++ b/webapp/src/ee/billing/administration/AdministrationCloudPlansView.tsx @@ -1,12 +1,12 @@ -import { useTranslate, T } from '@tolgee/react'; +import { T, useTranslate } from '@tolgee/react'; import { - ListItem, - ListItemText, - Paper, - Button, Box, + Button, Chip, IconButton, + ListItem, + ListItemText, + Paper, } from '@mui/material'; import { DashboardPage } from 'tg.component/layout/DashboardPage'; @@ -15,7 +15,7 @@ import { useBillingApiMutation, useBillingApiQuery, } from 'tg.service/http/useQueryApi'; -import { BaseAdministrationView } from './components/BaseAdministrationView'; +import { BaseAdministrationView } from 'tg.views/administration/components/BaseAdministrationView'; import { Link } from 'react-router-dom'; import { Delete } from '@mui/icons-material'; import { useMessage } from 'tg.hooks/useSuccessMessage'; diff --git a/webapp/src/views/administration/AdministrationEeLicenseView.tsx b/webapp/src/ee/billing/administration/AdministrationEeLicenseView.tsx similarity index 82% rename from webapp/src/views/administration/AdministrationEeLicenseView.tsx rename to webapp/src/ee/billing/administration/AdministrationEeLicenseView.tsx index 885305ffee..9c72d8b43a 100644 --- a/webapp/src/views/administration/AdministrationEeLicenseView.tsx +++ b/webapp/src/ee/billing/administration/AdministrationEeLicenseView.tsx @@ -3,11 +3,11 @@ import { Box, styled } from '@mui/material'; import { DashboardPage } from 'tg.component/layout/DashboardPage'; import { useApiQuery } from 'tg.service/http/useQueryApi'; -import { SetupLicenceKey } from './eeLicense/SetupLicenceKey'; -import { ActiveEeLicense } from './eeLicense/ActiveEeLicense'; -import { BaseAdministrationView } from './components/BaseAdministrationView'; +import { SetupLicenceKey } from '../../eeLicense/SetupLicenceKey'; +import { ActiveEeLicense } from '../../eeLicense/ActiveEeLicense'; +import { BaseAdministrationView } from 'tg.views/administration/components/BaseAdministrationView'; import { LINKS } from 'tg.constants/links'; -import { EeLicenseHint } from './eeLicense/EeLicenseHint'; +import { EeLicenseHint } from '../../eeLicense/EeLicenseHint'; const StyledWrapper = styled('div')` display: flex; diff --git a/webapp/src/views/administration/AdministrationEePlanCreateView.tsx b/webapp/src/ee/billing/administration/AdministrationEePlanCreateView.tsx similarity index 94% rename from webapp/src/views/administration/AdministrationEePlanCreateView.tsx rename to webapp/src/ee/billing/administration/AdministrationEePlanCreateView.tsx index b474dab327..37519bcd30 100644 --- a/webapp/src/views/administration/AdministrationEePlanCreateView.tsx +++ b/webapp/src/ee/billing/administration/AdministrationEePlanCreateView.tsx @@ -1,12 +1,12 @@ import { Box, Typography } from '@mui/material'; -import { useTranslate, T } from '@tolgee/react'; +import { T, useTranslate } from '@tolgee/react'; import { useHistory } from 'react-router-dom'; import { DashboardPage } from 'tg.component/layout/DashboardPage'; import { LINKS } from 'tg.constants/links'; import { useMessage } from 'tg.hooks/useSuccessMessage'; import { useBillingApiMutation } from 'tg.service/http/useQueryApi'; -import { BaseAdministrationView } from './components/BaseAdministrationView'; +import { BaseAdministrationView } from 'tg.views/administration/components/BaseAdministrationView'; import { EePlanForm } from './components/EePlanForm'; export const AdministrationEePlanCreateView = () => { diff --git a/webapp/src/views/administration/AdministrationEePlanEditView.tsx b/webapp/src/ee/billing/administration/AdministrationEePlanEditView.tsx similarity index 95% rename from webapp/src/views/administration/AdministrationEePlanEditView.tsx rename to webapp/src/ee/billing/administration/AdministrationEePlanEditView.tsx index 0850608a51..df7994583b 100644 --- a/webapp/src/views/administration/AdministrationEePlanEditView.tsx +++ b/webapp/src/ee/billing/administration/AdministrationEePlanEditView.tsx @@ -1,5 +1,5 @@ import { Box, Typography } from '@mui/material'; -import { useTranslate, T } from '@tolgee/react'; +import { T, useTranslate } from '@tolgee/react'; import { useHistory, useRouteMatch } from 'react-router-dom'; import { SpinnerProgress } from 'tg.component/SpinnerProgress'; @@ -10,7 +10,7 @@ import { useBillingApiMutation, useBillingApiQuery, } from 'tg.service/http/useQueryApi'; -import { BaseAdministrationView } from './components/BaseAdministrationView'; +import { BaseAdministrationView } from 'tg.views/administration/components/BaseAdministrationView'; import { EePlanForm } from './components/EePlanForm'; export const AdministrationEePlanEditView = () => { diff --git a/webapp/src/views/administration/AdministrationEePlansView.tsx b/webapp/src/ee/billing/administration/AdministrationEePlansView.tsx similarity index 96% rename from webapp/src/views/administration/AdministrationEePlansView.tsx rename to webapp/src/ee/billing/administration/AdministrationEePlansView.tsx index 3310e96576..bd191aa008 100644 --- a/webapp/src/views/administration/AdministrationEePlansView.tsx +++ b/webapp/src/ee/billing/administration/AdministrationEePlansView.tsx @@ -1,12 +1,12 @@ -import { useTranslate, T } from '@tolgee/react'; +import { T, useTranslate } from '@tolgee/react'; import { - ListItem, - ListItemText, - Paper, - Button, Box, + Button, Chip, IconButton, + ListItem, + ListItemText, + Paper, } from '@mui/material'; import { DashboardPage } from 'tg.component/layout/DashboardPage'; @@ -15,7 +15,7 @@ import { useBillingApiMutation, useBillingApiQuery, } from 'tg.service/http/useQueryApi'; -import { BaseAdministrationView } from './components/BaseAdministrationView'; +import { BaseAdministrationView } from 'tg.views/administration/components/BaseAdministrationView'; import { Link } from 'react-router-dom'; import { Delete } from '@mui/icons-material'; import { useMessage } from 'tg.hooks/useSuccessMessage'; diff --git a/webapp/src/ee/billing/administration/components/AssignSwitchCheckbox.tsx b/webapp/src/ee/billing/administration/components/AssignSwitchCheckbox.tsx new file mode 100644 index 0000000000..fca89de6b1 --- /dev/null +++ b/webapp/src/ee/billing/administration/components/AssignSwitchCheckbox.tsx @@ -0,0 +1,46 @@ +import { FC } from 'react'; +import { FormControlLabel, Switch } from '@mui/material'; +import { useFormikContext } from 'formik'; +import { CloudPlanFormData } from './CloudPlanForm'; +import { useTranslate } from '@tolgee/react'; + +type AssignCheckboxProps = { + organizationId: number; +}; + +export const AssignSwitchCheckbox: FC = (props) => { + const { setFieldValue, values } = useFormikContext(); + + const value = values.autoAssignOrganizationIds; + const checked = value.includes(props.organizationId); + + const { t } = useTranslate(); + + const getNewValue = (value: number[], organizationId: number) => { + if (value.includes(organizationId)) { + return value.filter((id) => id !== organizationId); + } + return [...value, organizationId]; + }; + + const isInList = values.forOrganizationIds.includes(props.organizationId); + + const onChange = () => { + const newValue = getNewValue(value, props.organizationId); + setFieldValue('autoAssignOrganizationIds', newValue); + }; + + return ( + <> + {values.free && ( + } + data-cy="administration-cloud-plan-organization-assign-switch" + label={t('administration_cloud_plan_organization_field_auto_assign')} + /> + )} + + ); +}; diff --git a/webapp/src/views/administration/components/CloudPlanForm.tsx b/webapp/src/ee/billing/administration/components/CloudPlanForm.tsx similarity index 93% rename from webapp/src/views/administration/components/CloudPlanForm.tsx rename to webapp/src/ee/billing/administration/components/CloudPlanForm.tsx index 869e8f51ae..3e1838fe13 100644 --- a/webapp/src/views/administration/components/CloudPlanForm.tsx +++ b/webapp/src/ee/billing/administration/components/CloudPlanForm.tsx @@ -1,12 +1,12 @@ import { Box, + Checkbox, FormControl, + FormControlLabel, InputLabel, MenuItem, - Typography, - Checkbox, - FormControlLabel, Switch, + Typography, } from '@mui/material'; import { useTranslate } from '@tolgee/react'; import { Field, FieldProps, Form, Formik } from 'formik'; @@ -24,7 +24,7 @@ type CloudPlanModel = components['schemas']['CloudPlanRequest']; type EnabledFeature = components['schemas']['CloudPlanRequest']['enabledFeatures'][number]; -type FormData = { +export type CloudPlanFormData = { type: CloudPlanModel['type']; name: string; prices: CloudPlanModel['prices']; @@ -34,13 +34,13 @@ type FormData = { forOrganizationIds: number[]; public: boolean; free: boolean; - autoAssign: boolean; + autoAssignOrganizationIds: CloudPlanModel['autoAssignOrganizationIds']; }; type Props = { planId?: number; - initialData: FormData; - onSubmit: (value: FormData) => void; + initialData: CloudPlanFormData; + onSubmit: (value: CloudPlanFormData) => void; loading: boolean | undefined; }; @@ -83,8 +83,8 @@ export function CloudPlanForm({ public: initialData.public, forOrganizationIds: initialData.forOrganizationIds, free: initialData.free, - autoAssign: false, - } as FormData + autoAssignOrganizationIds: initialData.autoAssignOrganizationIds, + } as CloudPlanFormData } enableReinitialize onSubmit={(values) => { @@ -323,23 +323,6 @@ export function CloudPlanForm({ {errors.forOrganizationIds} )} - - {values.free && ( - - setFieldValue('autoAssign', !values.autoAssign) - } - /> - } - data-cy="administration-cloud-plan-field-auto-assign-to-selected" - label={t( - 'administration_cloud_plan_field_auto-assign-to-selected' - )} - /> - )} )} diff --git a/webapp/src/views/administration/components/CloudPlanOrganizations.tsx b/webapp/src/ee/billing/administration/components/CloudPlanOrganizations.tsx similarity index 93% rename from webapp/src/views/administration/components/CloudPlanOrganizations.tsx rename to webapp/src/ee/billing/administration/components/CloudPlanOrganizations.tsx index 5953972300..3034e42676 100644 --- a/webapp/src/views/administration/components/CloudPlanOrganizations.tsx +++ b/webapp/src/ee/billing/administration/components/CloudPlanOrganizations.tsx @@ -1,16 +1,17 @@ import { + Box, + Checkbox, + FormControlLabel, ListItem, ListItemText, - FormControlLabel, - Checkbox, - Box, - Typography, Switch, + Typography, } from '@mui/material'; import { useTranslate } from '@tolgee/react'; import { useState } from 'react'; import { PaginatedHateoasList } from 'tg.component/common/list/PaginatedHateoasList'; import { useApiQuery, useBillingApiQuery } from 'tg.service/http/useQueryApi'; +import { AssignSwitchCheckbox } from './AssignSwitchCheckbox'; type Props = { planId?: number; @@ -114,7 +115,12 @@ export function CloudPlanOrganizations({ }} /> } - label={{label}} + label={ + + {label} + + + } /> ); diff --git a/webapp/src/views/administration/components/EePlanForm.tsx b/webapp/src/ee/billing/administration/components/EePlanForm.tsx similarity index 100% rename from webapp/src/views/administration/components/EePlanForm.tsx rename to webapp/src/ee/billing/administration/components/EePlanForm.tsx index ff39eed0e3..e1145cba1c 100644 --- a/webapp/src/views/administration/components/EePlanForm.tsx +++ b/webapp/src/ee/billing/administration/components/EePlanForm.tsx @@ -1,11 +1,11 @@ import { Box, - FormControl, - InputLabel, - Typography, Checkbox, + FormControl, FormControlLabel, + InputLabel, Switch, + Typography, } from '@mui/material'; import { useTranslate } from '@tolgee/react'; import { Field, FieldProps, Form, Formik } from 'formik'; diff --git a/webapp/src/views/administration/components/EePlanOrganizations.tsx b/webapp/src/ee/billing/administration/components/EePlanOrganizations.tsx similarity index 100% rename from webapp/src/views/administration/components/EePlanOrganizations.tsx rename to webapp/src/ee/billing/administration/components/EePlanOrganizations.tsx index f3f16d7914..a1f6851fcd 100644 --- a/webapp/src/views/administration/components/EePlanOrganizations.tsx +++ b/webapp/src/ee/billing/administration/components/EePlanOrganizations.tsx @@ -1,11 +1,11 @@ import { + Box, + Checkbox, + FormControlLabel, ListItem, ListItemText, - FormControlLabel, - Checkbox, - Box, - Typography, Switch, + Typography, } from '@mui/material'; import { useTranslate } from '@tolgee/react'; import { useState } from 'react'; diff --git a/webapp/src/views/organizations/billing/common/SubscriptionStatus.tsx b/webapp/src/ee/billing/common/SubscriptionStatus.tsx similarity index 100% rename from webapp/src/views/organizations/billing/common/SubscriptionStatus.tsx rename to webapp/src/ee/billing/common/SubscriptionStatus.tsx diff --git a/webapp/src/views/organizations/billing/common/usage/AppliedStripeCreditsRow.tsx b/webapp/src/ee/billing/common/usage/AppliedStripeCreditsRow.tsx similarity index 100% rename from webapp/src/views/organizations/billing/common/usage/AppliedStripeCreditsRow.tsx rename to webapp/src/ee/billing/common/usage/AppliedStripeCreditsRow.tsx diff --git a/webapp/src/views/organizations/billing/common/usage/EstimatedCosts.tsx b/webapp/src/ee/billing/common/usage/EstimatedCosts.tsx similarity index 100% rename from webapp/src/views/organizations/billing/common/usage/EstimatedCosts.tsx rename to webapp/src/ee/billing/common/usage/EstimatedCosts.tsx diff --git a/webapp/src/views/organizations/billing/common/usage/ItemRow.tsx b/webapp/src/ee/billing/common/usage/ItemRow.tsx similarity index 100% rename from webapp/src/views/organizations/billing/common/usage/ItemRow.tsx rename to webapp/src/ee/billing/common/usage/ItemRow.tsx diff --git a/webapp/src/views/organizations/billing/common/usage/PlanUsageEstimatedCosts.tsx b/webapp/src/ee/billing/common/usage/PlanUsageEstimatedCosts.tsx similarity index 100% rename from webapp/src/views/organizations/billing/common/usage/PlanUsageEstimatedCosts.tsx rename to webapp/src/ee/billing/common/usage/PlanUsageEstimatedCosts.tsx diff --git a/webapp/src/views/organizations/billing/common/usage/ProportionalUsageItemRow.tsx b/webapp/src/ee/billing/common/usage/ProportionalUsageItemRow.tsx similarity index 100% rename from webapp/src/views/organizations/billing/common/usage/ProportionalUsageItemRow.tsx rename to webapp/src/ee/billing/common/usage/ProportionalUsageItemRow.tsx diff --git a/webapp/src/views/organizations/billing/common/usage/SubscriptionRow.tsx b/webapp/src/ee/billing/common/usage/SubscriptionRow.tsx similarity index 100% rename from webapp/src/views/organizations/billing/common/usage/SubscriptionRow.tsx rename to webapp/src/ee/billing/common/usage/SubscriptionRow.tsx diff --git a/webapp/src/views/organizations/billing/common/usage/SumUsageItemRow.tsx b/webapp/src/ee/billing/common/usage/SumUsageItemRow.tsx similarity index 100% rename from webapp/src/views/organizations/billing/common/usage/SumUsageItemRow.tsx rename to webapp/src/ee/billing/common/usage/SumUsageItemRow.tsx diff --git a/webapp/src/views/organizations/billing/common/usage/TotalRow.tsx b/webapp/src/ee/billing/common/usage/TotalRow.tsx similarity index 100% rename from webapp/src/views/organizations/billing/common/usage/TotalRow.tsx rename to webapp/src/ee/billing/common/usage/TotalRow.tsx diff --git a/webapp/src/views/organizations/billing/common/usage/TotalTable.tsx b/webapp/src/ee/billing/common/usage/TotalTable.tsx similarity index 100% rename from webapp/src/views/organizations/billing/common/usage/TotalTable.tsx rename to webapp/src/ee/billing/common/usage/TotalTable.tsx diff --git a/webapp/src/views/organizations/billing/common/usage/UsageDialogButton.tsx b/webapp/src/ee/billing/common/usage/UsageDialogButton.tsx similarity index 100% rename from webapp/src/views/organizations/billing/common/usage/UsageDialogButton.tsx rename to webapp/src/ee/billing/common/usage/UsageDialogButton.tsx diff --git a/webapp/src/views/organizations/billing/common/usage/UsageTable.tsx b/webapp/src/ee/billing/common/usage/UsageTable.tsx similarity index 100% rename from webapp/src/views/organizations/billing/common/usage/UsageTable.tsx rename to webapp/src/ee/billing/common/usage/UsageTable.tsx diff --git a/webapp/src/views/organizations/billing/common/usage/UsageTableHead.tsx b/webapp/src/ee/billing/common/usage/UsageTableHead.tsx similarity index 100% rename from webapp/src/views/organizations/billing/common/usage/UsageTableHead.tsx rename to webapp/src/ee/billing/common/usage/UsageTableHead.tsx diff --git a/webapp/src/views/organizations/billing/useOrganizationCreditBalance.tsx b/webapp/src/ee/billing/useOrganizationCreditBalance.tsx similarity index 100% rename from webapp/src/views/organizations/billing/useOrganizationCreditBalance.tsx rename to webapp/src/ee/billing/useOrganizationCreditBalance.tsx diff --git a/webapp/src/views/administration/eeLicense/ActiveEeLicense.tsx b/webapp/src/ee/eeLicense/ActiveEeLicense.tsx similarity index 100% rename from webapp/src/views/administration/eeLicense/ActiveEeLicense.tsx rename to webapp/src/ee/eeLicense/ActiveEeLicense.tsx diff --git a/webapp/src/views/administration/eeLicense/EeLicenseHint.tsx b/webapp/src/ee/eeLicense/EeLicenseHint.tsx similarity index 100% rename from webapp/src/views/administration/eeLicense/EeLicenseHint.tsx rename to webapp/src/ee/eeLicense/EeLicenseHint.tsx diff --git a/webapp/src/views/administration/eeLicense/RefreshButton.tsx b/webapp/src/ee/eeLicense/RefreshButton.tsx similarity index 95% rename from webapp/src/views/administration/eeLicense/RefreshButton.tsx rename to webapp/src/ee/eeLicense/RefreshButton.tsx index 845413b408..c4cd652db4 100644 --- a/webapp/src/views/administration/eeLicense/RefreshButton.tsx +++ b/webapp/src/ee/eeLicense/RefreshButton.tsx @@ -1,4 +1,4 @@ -import { useTranslate, T } from '@tolgee/react'; +import { T, useTranslate } from '@tolgee/react'; import { useApiMutation } from 'tg.service/http/useQueryApi'; import { useSuccessMessage } from 'tg.hooks/useSuccessMessage'; import { Box, IconButton, Tooltip } from '@mui/material'; diff --git a/webapp/src/views/administration/eeLicense/ReleaseKeyButton.tsx b/webapp/src/ee/eeLicense/ReleaseKeyButton.tsx similarity index 100% rename from webapp/src/views/administration/eeLicense/ReleaseKeyButton.tsx rename to webapp/src/ee/eeLicense/ReleaseKeyButton.tsx diff --git a/webapp/src/views/administration/eeLicense/SetupLicenceKey.tsx b/webapp/src/ee/eeLicense/SetupLicenceKey.tsx similarity index 100% rename from webapp/src/views/administration/eeLicense/SetupLicenceKey.tsx rename to webapp/src/ee/eeLicense/SetupLicenceKey.tsx diff --git a/webapp/src/service/billingApiSchema.generated.ts b/webapp/src/service/billingApiSchema.generated.ts index 5630213536..6cd192eae7 100644 --- a/webapp/src/service/billingApiSchema.generated.ts +++ b/webapp/src/service/billingApiSchema.generated.ts @@ -139,6 +139,7 @@ export interface components { | "third_party_auth_no_email" | "third_party_auth_no_sub" | "third_party_auth_unknown_error" + | "email_already_verified" | "third_party_unauthorized" | "third_party_google_workspace_mismatch" | "username_already_exists" @@ -338,7 +339,12 @@ export interface components { | "tolgee_account_already_connected" | "slack_not_configured" | "slack_workspace_already_connected" - | "slack_connection_error"; + | "slack_connection_error" + | "email_verification_code_not_valid" + | "cannot_subscribe_to_free_plan" + | "plan_auto_assignment_only_for_free_plans" + | "plan_auto_assignment_only_for_private_plans" + | "plan_auto_assignment_organization_ids_not_in_for_organization_ids"; params?: { [key: string]: unknown }[]; }; ErrorResponseBody: { @@ -590,7 +596,7 @@ export interface components { /** Format: date-time */ usableUntil?: string; forOrganizationIds: number[]; - autoAssign: boolean; + autoAssignOrganizationIds: number[]; }; CloudPlanAdministrationModel: { /** Format: int64 */ diff --git a/webapp/src/translationTools/useErrorTranslation.ts b/webapp/src/translationTools/useErrorTranslation.ts index 3f0f3b5487..cd636d3cf0 100644 --- a/webapp/src/translationTools/useErrorTranslation.ts +++ b/webapp/src/translationTools/useErrorTranslation.ts @@ -127,6 +127,8 @@ export function useErrorTranslation() { return t('verify_email_already_verified'); case 'email_verification_code_not_valid': return t('verify_email_verification_code_not_valid'); + case 'user_is_subscribed_to_paid_plan': + return t('user_is_subscribed_to_paid_plan'); default: return code; } diff --git a/webapp/src/views/administration/AdministrationView.tsx b/webapp/src/views/administration/AdministrationView.tsx index 481448a936..4fac1b3921 100644 --- a/webapp/src/views/administration/AdministrationView.tsx +++ b/webapp/src/views/administration/AdministrationView.tsx @@ -4,13 +4,13 @@ import { PrivateRoute } from 'tg.component/common/PrivateRoute'; import { LINKS } from 'tg.constants/links'; import { AdministrationOrganizations } from './AdministrationOrganizations'; import { AdministrationUsers } from './AdministrationUsers'; -import { AdministrationEeLicenseView } from './AdministrationEeLicenseView'; -import { AdministrationCloudPlansView } from './AdministrationCloudPlansView'; -import { AdministrationCloudPlanEditView } from './AdministrationCloudPlanEditView'; -import { AdministrationCloudPlanCreateView } from './AdministrationCloudPlanCreateView'; -import { AdministrationEePlansView } from './AdministrationEePlansView'; -import { AdministrationEePlanEditView } from './AdministrationEePlanEditView'; -import { AdministrationEePlanCreateView } from './AdministrationEePlanCreateView'; +import { AdministrationEeLicenseView } from 'tg.ee/billing/administration/AdministrationEeLicenseView'; +import { AdministrationCloudPlansView } from 'tg.ee/billing/administration/AdministrationCloudPlansView'; +import { AdministrationCloudPlanEditView } from 'tg.ee/billing/administration/AdministrationCloudPlanEditView'; +import { AdministrationCloudPlanCreateView } from 'tg.ee/billing/administration/AdministrationCloudPlanCreateView'; +import { AdministrationEePlansView } from 'tg.ee/billing/administration/AdministrationEePlansView'; +import { AdministrationEePlanEditView } from 'tg.ee/billing/administration/AdministrationEePlanEditView'; +import { AdministrationEePlanCreateView } from 'tg.ee/billing/administration/AdministrationEePlanCreateView'; import { useUrlSearchState } from 'tg.hooks/useUrlSearchState'; export const AdministrationView = () => { diff --git a/webapp/src/views/organizations/OrganizationsRouter.tsx b/webapp/src/views/organizations/OrganizationsRouter.tsx index e16b684a8f..430beaa660 100644 --- a/webapp/src/views/organizations/OrganizationsRouter.tsx +++ b/webapp/src/views/organizations/OrganizationsRouter.tsx @@ -12,10 +12,10 @@ import { OrganizationMemberPrivilegesView } from './OrganizationMemberPrivileges import { OrganizationMembersView } from './members/OrganizationMembersView'; import { OrganizationProfileView } from './OrganizationProfileView'; import { useOrganization } from './useOrganization'; -import { OrganizationBillingView } from './billing/OrganizationBillingView'; -import { OrganizationInvoicesView } from './billing/Invoices/OrganizationInvoicesView'; -import { OrganizationSubscriptionsView } from './billing/Subscriptions/OrganizationSubscriptionsView'; -import { OrganizationBillingTestClockHelperView } from './billing/OrganizationBillingTestClockHelperView'; +import { OrganizationBillingView } from 'tg.ee/billing/OrganizationBillingView'; +import { OrganizationInvoicesView } from 'tg.ee/billing/Invoices/OrganizationInvoicesView'; +import { OrganizationSubscriptionsView } from 'tg.ee/billing/Subscriptions/OrganizationSubscriptionsView'; +import { OrganizationBillingTestClockHelperView } from 'tg.ee/billing/OrganizationBillingTestClockHelperView'; import { OrganizationAppsView } from './apps/OrganizationAppsView'; const SpecificOrganizationRouter = () => {