@open-mercato/core 0.5.1-develop.2949.009dcdd2d5 → 0.5.1-develop.2954.610bab2d08
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/helpers/integration/salesUi.js +25 -23
- package/dist/helpers/integration/salesUi.js.map +2 -2
- package/dist/modules/api_docs/frontend/docs/api/Explorer.js +24 -24
- package/dist/modules/api_docs/frontend/docs/api/Explorer.js.map +2 -2
- package/dist/modules/attachments/components/AttachmentPartitionSettings.js +15 -7
- package/dist/modules/attachments/components/AttachmentPartitionSettings.js.map +2 -2
- package/dist/modules/attachments/fields/attachment.js +4 -6
- package/dist/modules/attachments/fields/attachment.js.map +2 -2
- package/dist/modules/auth/api/users/route.js +63 -23
- package/dist/modules/auth/api/users/route.js.map +2 -2
- package/dist/modules/auth/backend/users/create/page.js +26 -26
- package/dist/modules/auth/backend/users/create/page.js.map +2 -2
- package/dist/modules/business_rules/components/ActionRow.js +36 -25
- package/dist/modules/business_rules/components/ActionRow.js.map +2 -2
- package/dist/modules/business_rules/components/ConditionGroup.js +14 -5
- package/dist/modules/business_rules/components/ConditionGroup.js.map +2 -2
- package/dist/modules/business_rules/components/ConditionRow.js +19 -10
- package/dist/modules/business_rules/components/ConditionRow.js.map +2 -2
- package/dist/modules/business_rules/components/RuleSetMembers.js +16 -10
- package/dist/modules/business_rules/components/RuleSetMembers.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js +30 -34
- package/dist/modules/catalog/backend/catalog/products/[id]/page.js.map +2 -2
- package/dist/modules/catalog/backend/catalog/products/create/page.js +220 -223
- package/dist/modules/catalog/backend/catalog/products/create/page.js.map +2 -2
- package/dist/modules/catalog/components/PriceKindSettings.js +20 -19
- package/dist/modules/catalog/components/PriceKindSettings.js.map +2 -2
- package/dist/modules/catalog/components/products/ProductUomSection.js +42 -37
- package/dist/modules/catalog/components/products/ProductUomSection.js.map +2 -2
- package/dist/modules/catalog/components/products/VariantBuilder.js +22 -18
- package/dist/modules/catalog/components/products/VariantBuilder.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js +18 -26
- package/dist/modules/customer_accounts/backend/customer_accounts/users/[id]/page.js.map +2 -2
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js +4 -6
- package/dist/modules/customer_accounts/backend/customer_accounts/users/page.js.map +2 -2
- package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js +5 -4
- package/dist/modules/customer_accounts/widgets/injection/account-status/widget.client.js.map +2 -2
- package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js +19 -7
- package/dist/modules/customers/backend/config/customers/pipeline-stages/page.js.map +2 -2
- package/dist/modules/customers/backend/customers/deals/pipeline/page.js +24 -21
- package/dist/modules/customers/backend/customers/deals/pipeline/page.js.map +2 -2
- package/dist/modules/customers/components/AddressEditor.js +24 -7
- package/dist/modules/customers/components/AddressEditor.js.map +2 -2
- package/dist/modules/customers/components/AddressFormatSettings.js +35 -25
- package/dist/modules/customers/components/AddressFormatSettings.js.map +2 -2
- package/dist/modules/customers/components/detail/ActivityForm.js +20 -12
- package/dist/modules/customers/components/detail/ActivityForm.js.map +2 -2
- package/dist/modules/customers/components/detail/AnnualRevenueField.js +2 -2
- package/dist/modules/customers/components/detail/AnnualRevenueField.js.map +2 -2
- package/dist/modules/customers/components/detail/DealForm.js +19 -14
- package/dist/modules/customers/components/detail/DealForm.js.map +2 -2
- package/dist/modules/customers/components/formConfig.js +16 -12
- package/dist/modules/customers/components/formConfig.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js +3 -2
- package/dist/modules/customers/widgets/dashboard/customer-todos/widget.client.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js +18 -10
- package/dist/modules/customers/widgets/dashboard/new-customers/widget.client.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js +3 -2
- package/dist/modules/customers/widgets/dashboard/new-deals/widget.client.js.map +2 -2
- package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js +3 -2
- package/dist/modules/customers/widgets/dashboard/next-interactions/widget.client.js.map +2 -2
- package/dist/modules/dashboards/components/WidgetVisibilityEditor.js +27 -28
- package/dist/modules/dashboards/components/WidgetVisibilityEditor.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js +14 -6
- package/dist/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js +14 -6
- package/dist/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js +3 -2
- package/dist/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js +3 -2
- package/dist/modules/dashboards/widgets/dashboard/top-customers/widget.client.js.map +2 -2
- package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js +17 -8
- package/dist/modules/dashboards/widgets/dashboard/top-products/widget.client.js.map +2 -2
- package/dist/modules/data_sync/backend/data-sync/page.js +40 -23
- package/dist/modules/data_sync/backend/data-sync/page.js.map +2 -2
- package/dist/modules/data_sync/components/IntegrationScheduleTab.js +15 -6
- package/dist/modules/data_sync/components/IntegrationScheduleTab.js.map +2 -2
- package/dist/modules/dictionaries/components/AppearanceSelector.js +4 -4
- package/dist/modules/dictionaries/components/AppearanceSelector.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js +4 -5
- package/dist/modules/dictionaries/components/DictionaryEntriesEditor.js.map +2 -2
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js +22 -14
- package/dist/modules/dictionaries/components/DictionaryEntrySelect.js.map +2 -2
- package/dist/modules/dictionaries/fields/dictionary.js +18 -13
- package/dist/modules/dictionaries/fields/dictionary.js.map +2 -2
- package/dist/modules/entities/components/EncryptionManager.js +23 -19
- package/dist/modules/entities/components/EncryptionManager.js.map +2 -2
- package/dist/modules/feature_toggles/components/formConfig.js +17 -9
- package/dist/modules/feature_toggles/components/formConfig.js.map +2 -2
- package/dist/modules/feature_toggles/components/overrideFormConfig.js +17 -9
- package/dist/modules/feature_toggles/components/overrideFormConfig.js.map +2 -2
- package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js +15 -8
- package/dist/modules/inbox_ops/backend/inbox-ops/settings/page.js.map +2 -2
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js +37 -22
- package/dist/modules/inbox_ops/components/proposals/EditActionDialog.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/[id]/page.js +22 -17
- package/dist/modules/integrations/backend/integrations/[id]/page.js.map +2 -2
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js +12 -6
- package/dist/modules/integrations/backend/integrations/bundle/[id]/page.js.map +2 -2
- package/dist/modules/planner/components/AvailabilityRulesEditor.js +19 -12
- package/dist/modules/planner/components/AvailabilityRulesEditor.js.map +2 -2
- package/dist/modules/resources/components/ResourceCrudForm.js +15 -10
- package/dist/modules/resources/components/ResourceCrudForm.js.map +3 -3
- package/dist/modules/sales/backend/sales/documents/[id]/page.js +15 -18
- package/dist/modules/sales/backend/sales/documents/[id]/page.js.map +2 -2
- package/dist/modules/sales/components/ProviderFieldInput.js +23 -20
- package/dist/modules/sales/components/ProviderFieldInput.js.map +2 -2
- package/dist/modules/sales/components/ShippingMethodsSettings.js +25 -17
- package/dist/modules/sales/components/ShippingMethodsSettings.js.map +3 -3
- package/dist/modules/sales/components/channels/ChannelOfferForm.js +35 -42
- package/dist/modules/sales/components/channels/ChannelOfferForm.js.map +2 -2
- package/dist/modules/sales/components/documents/AddressesSection.js +87 -90
- package/dist/modules/sales/components/documents/AddressesSection.js.map +2 -2
- package/dist/modules/sales/components/documents/AdjustmentDialog.js +17 -6
- package/dist/modules/sales/components/documents/AdjustmentDialog.js.map +3 -3
- package/dist/modules/sales/components/documents/LineItemDialog.js +42 -25
- package/dist/modules/sales/components/documents/LineItemDialog.js.map +2 -2
- package/dist/modules/sales/components/documents/SalesDocumentForm.js +96 -87
- package/dist/modules/sales/components/documents/SalesDocumentForm.js.map +2 -2
- package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js +20 -11
- package/dist/modules/sales/widgets/dashboard/new-orders/widget.client.js.map +2 -2
- package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js +20 -11
- package/dist/modules/sales/widgets/dashboard/new-quotes/widget.client.js.map +2 -2
- package/dist/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.js +36 -22
- package/dist/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.js.map +2 -2
- package/dist/modules/staff/components/TeamMemberForm.js +14 -9
- package/dist/modules/staff/components/TeamMemberForm.js.map +3 -3
- package/dist/modules/workflows/backend/tasks/[id]/page.js +42 -21
- package/dist/modules/workflows/backend/tasks/[id]/page.js.map +2 -2
- package/dist/modules/workflows/components/ActivitiesEditor.js +14 -6
- package/dist/modules/workflows/components/ActivitiesEditor.js.map +3 -3
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js +25 -17
- package/dist/modules/workflows/components/DefinitionTriggersEditor.js.map +3 -3
- package/dist/modules/workflows/components/EdgeEditDialog.js +48 -45
- package/dist/modules/workflows/components/EdgeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/NodeEditDialog.js +90 -90
- package/dist/modules/workflows/components/NodeEditDialog.js.map +2 -2
- package/dist/modules/workflows/components/StepsEditor.js +14 -6
- package/dist/modules/workflows/components/StepsEditor.js.map +3 -3
- package/dist/modules/workflows/components/TransitionsEditor.js +31 -26
- package/dist/modules/workflows/components/TransitionsEditor.js.map +3 -3
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js +19 -11
- package/dist/modules/workflows/components/fields/ActivityArrayEditor.js.map +3 -3
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js +12 -14
- package/dist/modules/workflows/components/fields/BusinessRuleConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js +24 -16
- package/dist/modules/workflows/components/fields/FormFieldArrayEditor.js.map +3 -3
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js +12 -13
- package/dist/modules/workflows/components/fields/StartPreConditionsEditor.js.map +2 -2
- package/dist/modules/workflows/components/mobile/MobileTaskForm.js +12 -8
- package/dist/modules/workflows/components/mobile/MobileTaskForm.js.map +2 -2
- package/dist/modules/workflows/frontend/checkout-demo/page.js +43 -46
- package/dist/modules/workflows/frontend/checkout-demo/page.js.map +2 -2
- package/package.json +3 -3
- package/src/helpers/integration/salesUi.ts +40 -30
- package/src/modules/api_docs/frontend/docs/api/Explorer.tsx +25 -19
- package/src/modules/attachments/components/AttachmentPartitionSettings.tsx +21 -11
- package/src/modules/attachments/fields/attachment.tsx +4 -6
- package/src/modules/auth/api/users/route.ts +75 -25
- package/src/modules/auth/backend/users/create/page.tsx +16 -20
- package/src/modules/business_rules/components/ActionRow.tsx +51 -32
- package/src/modules/business_rules/components/ConditionGroup.tsx +20 -9
- package/src/modules/business_rules/components/ConditionRow.tsx +24 -15
- package/src/modules/business_rules/components/RuleSetMembers.tsx +23 -13
- package/src/modules/catalog/backend/catalog/products/[id]/page.tsx +47 -53
- package/src/modules/catalog/backend/catalog/products/create/page.tsx +84 -87
- package/src/modules/catalog/components/PriceKindSettings.tsx +9 -9
- package/src/modules/catalog/components/products/ProductUomSection.tsx +85 -83
- package/src/modules/catalog/components/products/VariantBuilder.tsx +49 -33
- package/src/modules/customer_accounts/backend/customer_accounts/users/[id]/page.tsx +12 -27
- package/src/modules/customer_accounts/backend/customer_accounts/users/page.tsx +4 -6
- package/src/modules/customer_accounts/widgets/injection/account-status/widget.client.tsx +5 -4
- package/src/modules/customers/backend/config/customers/pipeline-stages/page.tsx +28 -15
- package/src/modules/customers/backend/customers/deals/pipeline/page.tsx +37 -26
- package/src/modules/customers/components/AddressEditor.tsx +30 -16
- package/src/modules/customers/components/AddressFormatSettings.tsx +25 -19
- package/src/modules/customers/components/detail/ActivityForm.tsx +35 -23
- package/src/modules/customers/components/detail/AnnualRevenueField.tsx +2 -2
- package/src/modules/customers/components/detail/DealForm.tsx +33 -20
- package/src/modules/customers/components/formConfig.tsx +25 -17
- package/src/modules/customers/widgets/dashboard/customer-todos/widget.client.tsx +3 -2
- package/src/modules/customers/widgets/dashboard/new-customers/widget.client.tsx +21 -11
- package/src/modules/customers/widgets/dashboard/new-deals/widget.client.tsx +3 -2
- package/src/modules/customers/widgets/dashboard/next-interactions/widget.client.tsx +3 -2
- package/src/modules/dashboards/components/WidgetVisibilityEditor.tsx +17 -22
- package/src/modules/dashboards/widgets/dashboard/orders-by-status/widget.client.tsx +17 -7
- package/src/modules/dashboards/widgets/dashboard/revenue-trend/widget.client.tsx +20 -10
- package/src/modules/dashboards/widgets/dashboard/sales-by-region/widget.client.tsx +3 -2
- package/src/modules/dashboards/widgets/dashboard/top-customers/widget.client.tsx +3 -2
- package/src/modules/dashboards/widgets/dashboard/top-products/widget.client.tsx +20 -9
- package/src/modules/data_sync/backend/data-sync/page.tsx +64 -38
- package/src/modules/data_sync/components/IntegrationScheduleTab.tsx +18 -7
- package/src/modules/dictionaries/components/AppearanceSelector.tsx +4 -4
- package/src/modules/dictionaries/components/DictionaryEntriesEditor.tsx +3 -4
- package/src/modules/dictionaries/components/DictionaryEntrySelect.tsx +27 -21
- package/src/modules/dictionaries/fields/dictionary.tsx +36 -23
- package/src/modules/entities/components/EncryptionManager.tsx +49 -33
- package/src/modules/feature_toggles/components/formConfig.tsx +20 -10
- package/src/modules/feature_toggles/components/overrideFormConfig.tsx +20 -10
- package/src/modules/inbox_ops/backend/inbox-ops/settings/page.tsx +19 -10
- package/src/modules/inbox_ops/components/proposals/EditActionDialog.tsx +49 -26
- package/src/modules/integrations/backend/integrations/[id]/page.tsx +20 -11
- package/src/modules/integrations/backend/integrations/bundle/[id]/page.tsx +19 -9
- package/src/modules/planner/components/AvailabilityRulesEditor.tsx +34 -21
- package/src/modules/resources/components/ResourceCrudForm.tsx +24 -15
- package/src/modules/sales/backend/sales/documents/[id]/page.tsx +12 -15
- package/src/modules/sales/components/ProviderFieldInput.tsx +26 -17
- package/src/modules/sales/components/ShippingMethodsSettings.tsx +28 -20
- package/src/modules/sales/components/channels/ChannelOfferForm.tsx +51 -46
- package/src/modules/sales/components/documents/AddressesSection.tsx +78 -76
- package/src/modules/sales/components/documents/AdjustmentDialog.tsx +27 -15
- package/src/modules/sales/components/documents/LineItemDialog.tsx +69 -51
- package/src/modules/sales/components/documents/SalesDocumentForm.tsx +98 -87
- package/src/modules/sales/widgets/dashboard/new-orders/widget.client.tsx +23 -12
- package/src/modules/sales/widgets/dashboard/new-quotes/widget.client.tsx +23 -12
- package/src/modules/shipping_carriers/lib/shipment-wizard/components/ConfigureStep.tsx +35 -19
- package/src/modules/staff/components/TeamMemberForm.tsx +23 -14
- package/src/modules/workflows/backend/tasks/[id]/page.tsx +51 -23
- package/src/modules/workflows/components/ActivitiesEditor.tsx +20 -10
- package/src/modules/workflows/components/DefinitionTriggersEditor.tsx +28 -18
- package/src/modules/workflows/components/EdgeEditDialog.tsx +51 -40
- package/src/modules/workflows/components/NodeEditDialog.tsx +81 -77
- package/src/modules/workflows/components/StepsEditor.tsx +20 -10
- package/src/modules/workflows/components/TransitionsEditor.tsx +61 -44
- package/src/modules/workflows/components/fields/ActivityArrayEditor.tsx +22 -12
- package/src/modules/workflows/components/fields/BusinessRuleConditionsEditor.tsx +9 -13
- package/src/modules/workflows/components/fields/FormFieldArrayEditor.tsx +27 -17
- package/src/modules/workflows/components/fields/StartPreConditionsEditor.tsx +9 -12
- package/src/modules/workflows/components/mobile/MobileTaskForm.tsx +19 -11
- package/src/modules/workflows/frontend/checkout-demo/page.tsx +71 -60
|
@@ -6,6 +6,13 @@ import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
|
6
6
|
import { CrudForm, type CrudField, type CrudFormGroup } from '@open-mercato/ui/backend/CrudForm'
|
|
7
7
|
import { Button } from '@open-mercato/ui/primitives/button'
|
|
8
8
|
import { IconButton } from '@open-mercato/ui/primitives/icon-button'
|
|
9
|
+
import {
|
|
10
|
+
Select,
|
|
11
|
+
SelectContent,
|
|
12
|
+
SelectItem,
|
|
13
|
+
SelectTrigger,
|
|
14
|
+
SelectValue,
|
|
15
|
+
} from '@open-mercato/ui/primitives/select'
|
|
9
16
|
import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
|
|
10
17
|
import { createCrudFormError } from '@open-mercato/ui/backend/utils/serverErrors'
|
|
11
18
|
import { DictionarySelectField } from '../formConfig'
|
|
@@ -797,20 +804,23 @@ export function DealForm({
|
|
|
797
804
|
type: 'custom',
|
|
798
805
|
layout: 'half',
|
|
799
806
|
component: ({ value, setValue }) => (
|
|
800
|
-
<
|
|
801
|
-
|
|
802
|
-
|
|
803
|
-
|
|
804
|
-
|
|
805
|
-
loadStagesForPipeline(e.target.value).catch(() => {})
|
|
807
|
+
<Select
|
|
808
|
+
value={typeof value === 'string' && value ? value : undefined}
|
|
809
|
+
onValueChange={(next) => {
|
|
810
|
+
setValue(next ?? '')
|
|
811
|
+
loadStagesForPipeline(next ?? '').catch(() => {})
|
|
806
812
|
}}
|
|
807
813
|
disabled={disabled}
|
|
808
814
|
>
|
|
809
|
-
<
|
|
810
|
-
|
|
811
|
-
|
|
812
|
-
|
|
813
|
-
|
|
815
|
+
<SelectTrigger>
|
|
816
|
+
<SelectValue placeholder={t('customers.deals.form.pipeline.placeholder', 'Select pipeline…')} />
|
|
817
|
+
</SelectTrigger>
|
|
818
|
+
<SelectContent>
|
|
819
|
+
{pipelines.map((p) => (
|
|
820
|
+
<SelectItem key={p.id} value={p.id}>{p.name}</SelectItem>
|
|
821
|
+
))}
|
|
822
|
+
</SelectContent>
|
|
823
|
+
</Select>
|
|
814
824
|
),
|
|
815
825
|
} as CrudField,
|
|
816
826
|
{
|
|
@@ -819,17 +829,20 @@ export function DealForm({
|
|
|
819
829
|
type: 'custom',
|
|
820
830
|
layout: 'half',
|
|
821
831
|
component: ({ value, setValue }) => (
|
|
822
|
-
<
|
|
823
|
-
|
|
824
|
-
|
|
825
|
-
onChange={(e) => setValue(e.target.value)}
|
|
832
|
+
<Select
|
|
833
|
+
value={typeof value === 'string' && value ? value : undefined}
|
|
834
|
+
onValueChange={(next) => setValue(next ?? '')}
|
|
826
835
|
disabled={disabled || !pipelineStages.length}
|
|
827
836
|
>
|
|
828
|
-
<
|
|
829
|
-
|
|
830
|
-
|
|
831
|
-
|
|
832
|
-
|
|
837
|
+
<SelectTrigger>
|
|
838
|
+
<SelectValue placeholder={t('customers.deals.form.pipelineStage.placeholder', 'Select stage…')} />
|
|
839
|
+
</SelectTrigger>
|
|
840
|
+
<SelectContent>
|
|
841
|
+
{pipelineStages.map((s) => (
|
|
842
|
+
<SelectItem key={s.id} value={s.id}>{s.label}</SelectItem>
|
|
843
|
+
))}
|
|
844
|
+
</SelectContent>
|
|
845
|
+
</Select>
|
|
833
846
|
),
|
|
834
847
|
} as CrudField,
|
|
835
848
|
{
|
|
@@ -7,6 +7,14 @@ import { Check, Pencil, Plus, Settings } from 'lucide-react'
|
|
|
7
7
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
8
8
|
import { useOrganizationScopeVersion } from '@open-mercato/shared/lib/frontend/useOrganizationScope'
|
|
9
9
|
import { Button } from '@open-mercato/ui/primitives/button'
|
|
10
|
+
import { Input } from '@open-mercato/ui/primitives/input'
|
|
11
|
+
import {
|
|
12
|
+
Select,
|
|
13
|
+
SelectContent,
|
|
14
|
+
SelectItem,
|
|
15
|
+
SelectTrigger,
|
|
16
|
+
SelectValue,
|
|
17
|
+
} from '@open-mercato/ui/primitives/select'
|
|
10
18
|
import { deriveDisplayName, isDerivedDisplayName } from '../lib/displayName'
|
|
11
19
|
import {
|
|
12
20
|
Dialog,
|
|
@@ -255,9 +263,8 @@ const createPrimaryEmailField = (t: Translator): CrudField => ({
|
|
|
255
263
|
|
|
256
264
|
return (
|
|
257
265
|
<div className="space-y-2">
|
|
258
|
-
<
|
|
266
|
+
<Input
|
|
259
267
|
type="email"
|
|
260
|
-
className="w-full h-9 rounded border px-2 text-sm"
|
|
261
268
|
value={inputValue}
|
|
262
269
|
onChange={(event) => {
|
|
263
270
|
const nextValue = event.target.value
|
|
@@ -561,19 +568,22 @@ export function CompanySelectField({ value, onChange, labels }: CompanySelectFie
|
|
|
561
568
|
return (
|
|
562
569
|
<div className="space-y-2">
|
|
563
570
|
<div className="flex items-center gap-2">
|
|
564
|
-
<
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
onChange={(event) => onChange(event.target.value ? event.target.value : undefined)}
|
|
571
|
+
<Select
|
|
572
|
+
value={value || undefined}
|
|
573
|
+
onValueChange={(next) => onChange(next || undefined)}
|
|
568
574
|
disabled={loading}
|
|
569
575
|
>
|
|
570
|
-
<
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
576
|
+
<SelectTrigger>
|
|
577
|
+
<SelectValue placeholder={labels.placeholder} />
|
|
578
|
+
</SelectTrigger>
|
|
579
|
+
<SelectContent>
|
|
580
|
+
{options.map((option) => (
|
|
581
|
+
<SelectItem key={option.value} value={option.value}>
|
|
582
|
+
{option.label}
|
|
583
|
+
</SelectItem>
|
|
584
|
+
))}
|
|
585
|
+
</SelectContent>
|
|
586
|
+
</Select>
|
|
577
587
|
<Dialog open={dialogOpen} onOpenChange={handleDialogChange}>
|
|
578
588
|
<DialogTrigger asChild>
|
|
579
589
|
<Button
|
|
@@ -595,8 +605,7 @@ export function CompanySelectField({ value, onChange, labels }: CompanySelectFie
|
|
|
595
605
|
<div className="space-y-4">
|
|
596
606
|
<div className="space-y-1">
|
|
597
607
|
<label className="text-sm font-medium">{labels.inputLabel}</label>
|
|
598
|
-
<
|
|
599
|
-
className="w-full rounded-md border px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
608
|
+
<Input
|
|
600
609
|
placeholder={labels.inputPlaceholder}
|
|
601
610
|
value={newCompany}
|
|
602
611
|
onChange={(event) => {
|
|
@@ -760,8 +769,7 @@ export const createDisplayNameSection = (t: Translator) =>
|
|
|
760
769
|
</div>
|
|
761
770
|
{editing ? (
|
|
762
771
|
<div className="mt-2 space-y-2">
|
|
763
|
-
<
|
|
764
|
-
className="w-full rounded-md border px-3 py-2 text-sm focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring"
|
|
772
|
+
<Input
|
|
765
773
|
value={currentValue}
|
|
766
774
|
onChange={handleChange}
|
|
767
775
|
placeholder={t('customers.people.form.displayName.placeholder')}
|
|
@@ -4,6 +4,7 @@ import * as React from 'react'
|
|
|
4
4
|
import Link from 'next/link'
|
|
5
5
|
import type { DashboardWidgetComponentProps } from '@open-mercato/shared/modules/dashboard/widgets'
|
|
6
6
|
import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
|
|
7
|
+
import { Input } from '@open-mercato/ui/primitives/input'
|
|
7
8
|
import { Spinner } from '@open-mercato/ui/primitives/spinner'
|
|
8
9
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
9
10
|
import { DEFAULT_SETTINGS, hydrateCustomerTodoSettings, type CustomerTodoWidgetSettings } from './config'
|
|
@@ -132,12 +133,12 @@ const CustomerTodosWidget: React.FC<DashboardWidgetComponentProps<CustomerTodoWi
|
|
|
132
133
|
<label htmlFor="customer-todos-page-size" className="text-xs font-semibold uppercase text-muted-foreground">
|
|
133
134
|
{t('customers.widgets.todos.settings.pageSize')}
|
|
134
135
|
</label>
|
|
135
|
-
<
|
|
136
|
+
<Input
|
|
136
137
|
id="customer-todos-page-size"
|
|
137
138
|
type="number"
|
|
138
139
|
min={1}
|
|
139
140
|
max={20}
|
|
140
|
-
className="w-24
|
|
141
|
+
className="w-24"
|
|
141
142
|
value={hydrated.pageSize}
|
|
142
143
|
onChange={(event) => {
|
|
143
144
|
const next = Number(event.target.value)
|
|
@@ -4,6 +4,14 @@ import * as React from 'react'
|
|
|
4
4
|
import Link from 'next/link'
|
|
5
5
|
import type { DashboardWidgetComponentProps } from '@open-mercato/shared/modules/dashboard/widgets'
|
|
6
6
|
import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
|
|
7
|
+
import { Input } from '@open-mercato/ui/primitives/input'
|
|
8
|
+
import {
|
|
9
|
+
Select,
|
|
10
|
+
SelectContent,
|
|
11
|
+
SelectItem,
|
|
12
|
+
SelectTrigger,
|
|
13
|
+
SelectValue,
|
|
14
|
+
} from '@open-mercato/ui/primitives/select'
|
|
7
15
|
import { Spinner } from '@open-mercato/ui/primitives/spinner'
|
|
8
16
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
9
17
|
import {
|
|
@@ -121,12 +129,12 @@ const CustomerNewCustomersWidget: React.FC<DashboardWidgetComponentProps<Custome
|
|
|
121
129
|
<label htmlFor="customer-new-customers-page-size" className="text-xs font-semibold uppercase text-muted-foreground">
|
|
122
130
|
{t('customers.widgets.newCustomers.settings.pageSize')}
|
|
123
131
|
</label>
|
|
124
|
-
<
|
|
132
|
+
<Input
|
|
125
133
|
id="customer-new-customers-page-size"
|
|
126
134
|
type="number"
|
|
127
135
|
min={1}
|
|
128
136
|
max={20}
|
|
129
|
-
className="w-24
|
|
137
|
+
className="w-24"
|
|
130
138
|
value={hydrated.pageSize}
|
|
131
139
|
onChange={(event) => {
|
|
132
140
|
const next = Number(event.target.value)
|
|
@@ -138,21 +146,23 @@ const CustomerNewCustomersWidget: React.FC<DashboardWidgetComponentProps<Custome
|
|
|
138
146
|
<label htmlFor="customer-new-customers-kind" className="text-xs font-semibold uppercase text-muted-foreground">
|
|
139
147
|
{t('customers.widgets.newCustomers.settings.kind')}
|
|
140
148
|
</label>
|
|
141
|
-
<
|
|
142
|
-
id="customer-new-customers-kind"
|
|
143
|
-
className="w-full rounded-md border px-2 py-1 text-sm focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
|
|
149
|
+
<Select
|
|
144
150
|
value={hydrated.kind}
|
|
145
|
-
|
|
146
|
-
const value = event.target.value
|
|
151
|
+
onValueChange={(value) => {
|
|
147
152
|
if (value === 'person' || value === 'company' || value === 'all') {
|
|
148
153
|
onSettingsChange({ ...hydrated, kind: value })
|
|
149
154
|
}
|
|
150
155
|
}}
|
|
151
156
|
>
|
|
152
|
-
<
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
157
|
+
<SelectTrigger id="customer-new-customers-kind" size="sm">
|
|
158
|
+
<SelectValue />
|
|
159
|
+
</SelectTrigger>
|
|
160
|
+
<SelectContent>
|
|
161
|
+
<SelectItem value="all">{t('customers.widgets.newCustomers.filters.all')}</SelectItem>
|
|
162
|
+
<SelectItem value="person">{t('customers.widgets.newCustomers.filters.person')}</SelectItem>
|
|
163
|
+
<SelectItem value="company">{t('customers.widgets.newCustomers.filters.company')}</SelectItem>
|
|
164
|
+
</SelectContent>
|
|
165
|
+
</Select>
|
|
156
166
|
</div>
|
|
157
167
|
</div>
|
|
158
168
|
)
|
|
@@ -4,6 +4,7 @@ import * as React from 'react'
|
|
|
4
4
|
import Link from 'next/link'
|
|
5
5
|
import type { DashboardWidgetComponentProps } from '@open-mercato/shared/modules/dashboard/widgets'
|
|
6
6
|
import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
|
|
7
|
+
import { Input } from '@open-mercato/ui/primitives/input'
|
|
7
8
|
import { Spinner } from '@open-mercato/ui/primitives/spinner'
|
|
8
9
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
9
10
|
import { DEFAULT_SETTINGS, hydrateNewDealsSettings, type CustomerNewDealsSettings } from './config'
|
|
@@ -104,12 +105,12 @@ const CustomerNewDealsWidget: React.FC<DashboardWidgetComponentProps<CustomerNew
|
|
|
104
105
|
<label htmlFor="customer-new-deals-page-size" className="text-xs font-semibold uppercase text-muted-foreground">
|
|
105
106
|
{t('customers.widgets.newDeals.settings.pageSize')}
|
|
106
107
|
</label>
|
|
107
|
-
<
|
|
108
|
+
<Input
|
|
108
109
|
id="customer-new-deals-page-size"
|
|
109
110
|
type="number"
|
|
110
111
|
min={1}
|
|
111
112
|
max={20}
|
|
112
|
-
className="w-24
|
|
113
|
+
className="w-24"
|
|
113
114
|
value={hydrated.pageSize}
|
|
114
115
|
onChange={(event) => {
|
|
115
116
|
const next = Number(event.target.value)
|
|
@@ -5,6 +5,7 @@ import Link from 'next/link'
|
|
|
5
5
|
import type { DashboardWidgetComponentProps } from '@open-mercato/shared/modules/dashboard/widgets'
|
|
6
6
|
import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
|
|
7
7
|
import { formatRelativeTime } from '@open-mercato/shared/lib/time'
|
|
8
|
+
import { Input } from '@open-mercato/ui/primitives/input'
|
|
8
9
|
import { Spinner } from '@open-mercato/ui/primitives/spinner'
|
|
9
10
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
10
11
|
import {
|
|
@@ -136,12 +137,12 @@ const CustomerNextInteractionsWidget: React.FC<DashboardWidgetComponentProps<Cus
|
|
|
136
137
|
<label htmlFor="customer-next-interactions-page-size" className="text-xs font-semibold uppercase text-muted-foreground">
|
|
137
138
|
{t('customers.widgets.nextInteractions.settings.pageSize')}
|
|
138
139
|
</label>
|
|
139
|
-
<
|
|
140
|
+
<Input
|
|
140
141
|
id="customer-next-interactions-page-size"
|
|
141
142
|
type="number"
|
|
142
143
|
min={1}
|
|
143
144
|
max={20}
|
|
144
|
-
className="w-24
|
|
145
|
+
className="w-24"
|
|
145
146
|
value={hydrated.pageSize}
|
|
146
147
|
onChange={(event) => {
|
|
147
148
|
const next = Number(event.target.value)
|
|
@@ -3,6 +3,8 @@
|
|
|
3
3
|
import * as React from 'react'
|
|
4
4
|
import { Button } from '@open-mercato/ui/primitives/button'
|
|
5
5
|
import { Spinner } from '@open-mercato/ui/primitives/spinner'
|
|
6
|
+
import { RadioGroup } from '@open-mercato/ui/primitives/radio'
|
|
7
|
+
import { RadioField } from '@open-mercato/ui/primitives/radio-field'
|
|
6
8
|
import { apiCallOrThrow, readApiResultOrThrow } from '@open-mercato/ui/backend/utils/apiCall'
|
|
7
9
|
import { flash } from '@open-mercato/ui/backend/FlashMessages'
|
|
8
10
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
@@ -279,28 +281,21 @@ export const WidgetVisibilityEditor = React.forwardRef<WidgetVisibilityEditorHan
|
|
|
279
281
|
)}
|
|
280
282
|
|
|
281
283
|
{kind === 'user' && (
|
|
282
|
-
<
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
value="override"
|
|
298
|
-
checked={mode === 'override'}
|
|
299
|
-
onChange={() => setMode('override')}
|
|
300
|
-
/>
|
|
301
|
-
{t('dashboards.widgets.mode.override', 'Override for this user')}
|
|
302
|
-
</label>
|
|
303
|
-
</div>
|
|
284
|
+
<RadioGroup
|
|
285
|
+
className="flex flex-row items-center gap-3 rounded-md border bg-muted/30 px-3 py-2"
|
|
286
|
+
name="widgetOverride"
|
|
287
|
+
value={mode}
|
|
288
|
+
onValueChange={(next) => setMode(next as 'inherit' | 'override')}
|
|
289
|
+
>
|
|
290
|
+
<RadioField
|
|
291
|
+
value="inherit"
|
|
292
|
+
label={t('dashboards.widgets.mode.inherit', 'Inherit from roles')}
|
|
293
|
+
/>
|
|
294
|
+
<RadioField
|
|
295
|
+
value="override"
|
|
296
|
+
label={t('dashboards.widgets.mode.override', 'Override for this user')}
|
|
297
|
+
/>
|
|
298
|
+
</RadioGroup>
|
|
304
299
|
)}
|
|
305
300
|
|
|
306
301
|
{kind === 'user' && mode === 'inherit' && (
|
|
@@ -10,6 +10,13 @@ import {
|
|
|
10
10
|
InlineDateRangeSelect,
|
|
11
11
|
type DateRangePreset,
|
|
12
12
|
} from '@open-mercato/ui/backend/date-range'
|
|
13
|
+
import {
|
|
14
|
+
Select,
|
|
15
|
+
SelectContent,
|
|
16
|
+
SelectItem,
|
|
17
|
+
SelectTrigger,
|
|
18
|
+
SelectValue,
|
|
19
|
+
} from '@open-mercato/ui/primitives/select'
|
|
13
20
|
import { DEFAULT_SETTINGS, hydrateSettings, type OrdersByStatusSettings } from './config'
|
|
14
21
|
import type { WidgetDataResponse } from '../../../services/widgetDataService'
|
|
15
22
|
|
|
@@ -115,15 +122,18 @@ const OrdersByStatusWidget: React.FC<DashboardWidgetComponentProps<OrdersByStatu
|
|
|
115
122
|
>
|
|
116
123
|
{t('dashboards.analytics.settings.chartVariant', 'Chart Style')}
|
|
117
124
|
</label>
|
|
118
|
-
<
|
|
119
|
-
id="orders-by-status-variant"
|
|
120
|
-
className="w-full rounded-md border bg-background px-2 py-1 text-sm text-foreground focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
|
|
125
|
+
<Select
|
|
121
126
|
value={hydrated.variant}
|
|
122
|
-
|
|
127
|
+
onValueChange={(value) => onSettingsChange({ ...hydrated, variant: value as 'pie' | 'donut' })}
|
|
123
128
|
>
|
|
124
|
-
<
|
|
125
|
-
|
|
126
|
-
|
|
129
|
+
<SelectTrigger id="orders-by-status-variant" size="sm">
|
|
130
|
+
<SelectValue />
|
|
131
|
+
</SelectTrigger>
|
|
132
|
+
<SelectContent>
|
|
133
|
+
<SelectItem value="donut">{t('dashboards.analytics.chartVariant.donut', 'Donut')}</SelectItem>
|
|
134
|
+
<SelectItem value="pie">{t('dashboards.analytics.chartVariant.pie', 'Pie')}</SelectItem>
|
|
135
|
+
</SelectContent>
|
|
136
|
+
</Select>
|
|
127
137
|
</div>
|
|
128
138
|
</div>
|
|
129
139
|
)
|
|
@@ -10,6 +10,13 @@ import {
|
|
|
10
10
|
InlineDateRangeSelect,
|
|
11
11
|
type DateRangePreset,
|
|
12
12
|
} from '@open-mercato/ui/backend/date-range'
|
|
13
|
+
import {
|
|
14
|
+
Select,
|
|
15
|
+
SelectContent,
|
|
16
|
+
SelectItem,
|
|
17
|
+
SelectTrigger,
|
|
18
|
+
SelectValue,
|
|
19
|
+
} from '@open-mercato/ui/primitives/select'
|
|
13
20
|
import type { DateGranularity } from '@open-mercato/shared/modules/analytics'
|
|
14
21
|
import { DEFAULT_SETTINGS, hydrateSettings, type RevenueTrendSettings } from './config'
|
|
15
22
|
import type { WidgetDataResponse } from '../../../services/widgetDataService'
|
|
@@ -163,18 +170,21 @@ const RevenueTrendWidget: React.FC<DashboardWidgetComponentProps<RevenueTrendSet
|
|
|
163
170
|
>
|
|
164
171
|
{t('dashboards.analytics.settings.granularity', 'Granularity')}
|
|
165
172
|
</label>
|
|
166
|
-
<
|
|
167
|
-
id="revenue-trend-granularity"
|
|
168
|
-
className="w-full rounded-md border bg-background px-2 py-1 text-sm text-foreground focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
|
|
173
|
+
<Select
|
|
169
174
|
value={hydrated.granularity}
|
|
170
|
-
|
|
175
|
+
onValueChange={(value) => onSettingsChange({ ...hydrated, granularity: value as DateGranularity })}
|
|
171
176
|
>
|
|
172
|
-
|
|
173
|
-
<
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
177
|
+
<SelectTrigger id="revenue-trend-granularity" size="sm">
|
|
178
|
+
<SelectValue />
|
|
179
|
+
</SelectTrigger>
|
|
180
|
+
<SelectContent>
|
|
181
|
+
{GRANULARITY_OPTIONS.map((opt) => (
|
|
182
|
+
<SelectItem key={opt.value} value={opt.value}>
|
|
183
|
+
{t(opt.labelKey, opt.value)}
|
|
184
|
+
</SelectItem>
|
|
185
|
+
))}
|
|
186
|
+
</SelectContent>
|
|
187
|
+
</Select>
|
|
178
188
|
</div>
|
|
179
189
|
<div className="space-y-1.5">
|
|
180
190
|
<label className="flex items-center gap-2 text-sm">
|
|
@@ -6,6 +6,7 @@ import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
|
|
|
6
6
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
7
7
|
import { BarChart, type BarChartDataItem } from '@open-mercato/ui/backend/charts'
|
|
8
8
|
import { DateRangeSelect, type DateRangePreset } from '@open-mercato/ui/backend/date-range'
|
|
9
|
+
import { Input } from '@open-mercato/ui/primitives/input'
|
|
9
10
|
import { DEFAULT_SETTINGS, hydrateSettings, type SalesByRegionSettings } from './config'
|
|
10
11
|
import type { WidgetDataResponse } from '../../../services/widgetDataService'
|
|
11
12
|
import { formatCurrencyCompact } from '../../../lib/formatters'
|
|
@@ -94,12 +95,12 @@ const SalesByRegionWidget: React.FC<DashboardWidgetComponentProps<SalesByRegionS
|
|
|
94
95
|
>
|
|
95
96
|
{t('dashboards.analytics.settings.limit', 'Number of items')}
|
|
96
97
|
</label>
|
|
97
|
-
<
|
|
98
|
+
<Input
|
|
98
99
|
id="sales-by-region-limit"
|
|
99
100
|
type="number"
|
|
100
101
|
min={1}
|
|
101
102
|
max={20}
|
|
102
|
-
className="w-24
|
|
103
|
+
className="w-24"
|
|
103
104
|
value={hydrated.limit}
|
|
104
105
|
onChange={(e) => {
|
|
105
106
|
const next = Number(e.target.value)
|
|
@@ -6,6 +6,7 @@ import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
|
|
|
6
6
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
7
7
|
import { TopNTable, type TopNTableColumn } from '@open-mercato/ui/backend/charts'
|
|
8
8
|
import { DateRangeSelect, type DateRangePreset } from '@open-mercato/ui/backend/date-range'
|
|
9
|
+
import { Input } from '@open-mercato/ui/primitives/input'
|
|
9
10
|
import { DEFAULT_SETTINGS, hydrateSettings, type TopCustomersSettings } from './config'
|
|
10
11
|
import type { WidgetDataResponse } from '../../../services/widgetDataService'
|
|
11
12
|
import { formatCurrencySafe } from '../../../lib/formatters'
|
|
@@ -130,12 +131,12 @@ const TopCustomersWidget: React.FC<DashboardWidgetComponentProps<TopCustomersSet
|
|
|
130
131
|
>
|
|
131
132
|
{t('dashboards.analytics.settings.limit', 'Number of items')}
|
|
132
133
|
</label>
|
|
133
|
-
<
|
|
134
|
+
<Input
|
|
134
135
|
id="top-customers-limit"
|
|
135
136
|
type="number"
|
|
136
137
|
min={1}
|
|
137
138
|
max={20}
|
|
138
|
-
className="w-24
|
|
139
|
+
className="w-24"
|
|
139
140
|
value={hydrated.limit}
|
|
140
141
|
onChange={(e) => {
|
|
141
142
|
const next = Number(e.target.value)
|
|
@@ -6,6 +6,14 @@ import { apiCall } from '@open-mercato/ui/backend/utils/apiCall'
|
|
|
6
6
|
import { useT } from '@open-mercato/shared/lib/i18n/context'
|
|
7
7
|
import { BarChart, type BarChartDataItem } from '@open-mercato/ui/backend/charts'
|
|
8
8
|
import { DateRangeSelect, InlineDateRangeSelect, type DateRangePreset } from '@open-mercato/ui/backend/date-range'
|
|
9
|
+
import { Input } from '@open-mercato/ui/primitives/input'
|
|
10
|
+
import {
|
|
11
|
+
Select,
|
|
12
|
+
SelectContent,
|
|
13
|
+
SelectItem,
|
|
14
|
+
SelectTrigger,
|
|
15
|
+
SelectValue,
|
|
16
|
+
} from '@open-mercato/ui/primitives/select'
|
|
9
17
|
import { DEFAULT_SETTINGS, hydrateSettings, type TopProductsSettings } from './config'
|
|
10
18
|
import type { WidgetDataResponse } from '../../../services/widgetDataService'
|
|
11
19
|
import { formatCurrencyCompact } from '../../../lib/formatters'
|
|
@@ -117,12 +125,12 @@ const TopProductsWidget: React.FC<DashboardWidgetComponentProps<TopProductsSetti
|
|
|
117
125
|
>
|
|
118
126
|
{t('dashboards.analytics.settings.limit', 'Number of items')}
|
|
119
127
|
</label>
|
|
120
|
-
<
|
|
128
|
+
<Input
|
|
121
129
|
id="top-products-limit"
|
|
122
130
|
type="number"
|
|
123
131
|
min={1}
|
|
124
132
|
max={20}
|
|
125
|
-
className="w-24
|
|
133
|
+
className="w-24"
|
|
126
134
|
value={hydrated.limit}
|
|
127
135
|
onChange={(e) => {
|
|
128
136
|
const next = Number(e.target.value)
|
|
@@ -137,15 +145,18 @@ const TopProductsWidget: React.FC<DashboardWidgetComponentProps<TopProductsSetti
|
|
|
137
145
|
>
|
|
138
146
|
{t('dashboards.analytics.settings.chartLayout', 'Chart Layout')}
|
|
139
147
|
</label>
|
|
140
|
-
<
|
|
141
|
-
id="top-products-layout"
|
|
142
|
-
className="w-full rounded-md border bg-background px-2 py-1 text-sm text-foreground focus-visible:border-ring focus-visible:outline-none focus-visible:ring-1 focus-visible:ring-ring"
|
|
148
|
+
<Select
|
|
143
149
|
value={hydrated.layout}
|
|
144
|
-
|
|
150
|
+
onValueChange={(value) => onSettingsChange({ ...hydrated, layout: value as 'horizontal' | 'vertical' })}
|
|
145
151
|
>
|
|
146
|
-
<
|
|
147
|
-
|
|
148
|
-
|
|
152
|
+
<SelectTrigger id="top-products-layout" size="sm">
|
|
153
|
+
<SelectValue />
|
|
154
|
+
</SelectTrigger>
|
|
155
|
+
<SelectContent>
|
|
156
|
+
<SelectItem value="horizontal">{t('dashboards.analytics.settings.horizontal', 'Horizontal')}</SelectItem>
|
|
157
|
+
<SelectItem value="vertical">{t('dashboards.analytics.settings.vertical', 'Vertical')}</SelectItem>
|
|
158
|
+
</SelectContent>
|
|
159
|
+
</Select>
|
|
149
160
|
</div>
|
|
150
161
|
</div>
|
|
151
162
|
)
|