From fa0ec7d739559e286ed29c9293fdaaa8b5a848ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pawe=C5=82=20Chy=C5=82a?= <chyla1988@gmail.com> Date: Tue, 13 Aug 2024 12:52:42 +0200 Subject: [PATCH] Migrate rest of dialogs (#5097) * Replace Dialog in OrderCustomerChangeDialog * Replace Dialog in OrderProductAddDialog * Replace Dialog in OrderFulfillmentTrackingDialog * Replace Dialog in OrderInvoiceEmailSendDialog * Replace Dialog in OrderCannotCancelOrderDialog and fix showing two dialogs * Replace Dialog in OrderFulfillmentApproveDialog * Replace Dialog in ProductVariantDeleteDialog * Replace Dialog in ProductExternalMediaDialog * Replace Dialog in ProductExportSteps * Replace Dialog in ProductVariantMediaSelectDialog * Replace Dialog in DiscountCountrySelectDialog * Replace Dialog in PluginSecretFieldDialog * Replace Dialog in ShippingZonePostalCodeRangeDialog * Replace Dialog in ShippingZoneCountriesAssignDialog * Replace Dialog in ShippingZoneCountriesAssignDialog * Replace Dialog in gift card export dialog * Replace Dialog in GiftCardBulkCreateSuccessDialog * Remove not used delete category dialog * Replace Dialog in SaveFilterTabDialog * Replace Dialog in MenuCreateDialog * Replace Dialog in TokenCreateDialog * Replace Dialog in ExitFormDialog * Replace Dialog in DevModePanel * Add Xl modal size * Replace Dialog in AppPermissionsDialog * Replace Dialog in DryRun * Add modal size MD * Replace Dialog in AttributeValueEditDialog * Replace Dialog in AssignMembersDialog * Replace Dialog in AssignVariantDialog * Replace Dialog in AssignProductDialog * Replace Dialog in AssignContainerDialog * Replace Dialog in AssignAttributeDialog * Add todo comment * Extract messages * Add missing test ids * Add changeset * Add Modal sizes * Update sizing * Small improvements after QA * Fix full width modals * Fix ActionDialog size --- .changeset/forty-bananas-burn.md | 5 + locale/defaultMessages.json | 4 - .../AppDeleteDialog/AppDeleteDialog.tsx | 1 - src/apps/components/AppDialog/AppDialog.tsx | 4 +- .../AppPermissionsDialog.tsx | 12 +- .../AppPermissionsDialogConfirmation.tsx | 31 +- .../AppPermissionsDialogPermissionPicker.tsx | 20 +- .../AttributeValueEditDialog.tsx | 84 ++--- .../CategoryDeleteDialog.tsx | 69 ---- .../components/CategoryDeleteDialog/index.ts | 2 - src/components/ActionDialog/ActionDialog.tsx | 13 +- src/components/ActionDialog/types.ts | 2 - .../AssignAttributeDialog.tsx | 209 +++++----- .../AssignContainerDialog.tsx | 142 ++++--- .../AssignProductDialog.tsx | 163 ++++---- .../AssignVariantDialog.tsx | 225 ++++++----- src/components/DevModePanel/DevModePanel.tsx | 27 +- src/components/DryRun/DryRun.tsx | 51 +-- src/components/Form/ExitFormDialog.test.tsx | 2 +- src/components/Form/ExitFormDialog.tsx | 62 +-- src/components/Modal/Content.tsx | 18 +- src/components/Modal/Grid.tsx | 10 + src/components/Modal/index.ts | 7 +- .../NavigatorSearch/NavigatorSearch.tsx | 4 +- .../SaveFilterTabDialog.tsx | 66 ++-- .../TokenCreateDialog/TokenCreateDialog.tsx | 98 ++--- .../CustomerAddressDialog.tsx | 110 +++--- .../DiscountCountrySelectDialog.tsx | 172 +++++---- .../DiscountDeleteModal.tsx | 2 +- .../RuleDeleteModal/RuleDeleteModal.tsx | 12 +- .../componenets/RuleForm/RuleForm.tsx | 2 +- .../RuleFormModal/RuleFormModal.tsx | 2 +- .../VoucherCodesDeleteDialog.tsx | 2 +- .../VoucherCodesGenerateDialog.tsx | 2 +- .../VoucherCodesManualDialog.tsx | 2 +- .../GiftCardBulkCreateDialog.tsx | 2 +- .../GiftCardBulkCreateSuccessDialog.tsx | 39 +- .../GiftCardCreateDialogContent.tsx | 8 +- .../GiftCardExportDialogContent.tsx | 61 +-- .../GiftCardResendCodeDialog.tsx | 1 - .../GiftCardUpdateBalanceDialog.tsx | 1 - .../GiftCardListDialogsProvider.tsx | 5 +- .../MenuCreateDialog/MenuCreateDialog.tsx | 56 +-- .../MenuItemDialog/MenuItemDialog.tsx | 1 + .../OrderCancelDialog/OrderCancelDialog.tsx | 4 +- .../OrderCannotCancelOrderDialog.tsx | 61 ++- .../OrderChangeWarehouseDialog.tsx | 107 +++--- .../OrderCustomerAddressesEditDialog.tsx | 356 +++++++++--------- .../OrderCustomerChangeDialog.tsx | 52 ++- .../OrderFulfillStockExceededDialog.tsx | 1 - .../OrderFulfillmentApproveDialog.tsx | 109 +++--- .../OrderFulfillmentCancelDialog.tsx | 4 +- .../OrderFulfillmentTrackingDialog.tsx | 75 ++-- .../OrderInvoiceEmailSendDialog.tsx | 54 ++- .../OrderManualTransactionDialog.tsx | 2 +- .../OrderMarkAsPaidDialog.tsx | 1 - .../OrderMetadataDialog.tsx | 8 +- .../OrderPaymentDialog/OrderPaymentDialog.tsx | 4 +- .../OrderPaymentVoidDialog.tsx | 4 +- .../OrderProductAddDialog.tsx | 327 ++++++++-------- .../OrderProductAddDialog/styles.ts | 28 -- .../OrderRefundDialog/OrderRefundDialog.tsx | 2 +- .../OrderShippingMethodEditDialog.tsx | 2 +- .../OrderTransactionActionDialog.tsx | 2 +- .../OrderTransactionReasonModal.tsx | 2 +- .../OrderDetails/OrderNormalDetails/index.tsx | 13 +- .../OrderUnconfirmedDetails/index.tsx | 13 +- .../PageTypePickerDialog.tsx | 2 +- .../AssignMembersDialog.tsx | 232 ++++++------ .../PluginSecretFieldDialog.tsx | 82 ++-- .../ExportDialogSettings.tsx | 16 +- .../ProductExportDialog.tsx | 85 +++-- .../ProductExportDialogInfo.tsx | 2 +- .../ProductExternalMediaDialog.tsx | 48 +-- .../ProductVariantDeleteDialog.tsx | 71 ++-- .../ProductVariantMediaSelectDialog.tsx | 101 +++-- .../ProductVariantImageSelectDialog/styles.ts | 43 --- .../ShippingMethodProductsAddDialog.tsx | 110 +++--- .../ShippingWeightUnitDialog.tsx | 2 +- .../ShippingZoneAddWarehouseDialog.tsx | 4 +- .../ShippingZoneCountriesAssignDialog.tsx | 154 ++++---- .../handlers.ts | 2 +- .../ShippingZonePostalCodeRangeDialog.tsx | 84 ++--- src/shipping/handlers.ts | 25 +- .../StaffAddMemberDialog.tsx | 4 +- .../StaffPasswordResetDialog.tsx | 4 +- src/styles/useScrollableDialogStyle.ts | 2 +- .../TaxCountryDialog/TaxCountryDialog.tsx | 4 +- src/utils/errors/order.ts | 5 +- 89 files changed, 1912 insertions(+), 2212 deletions(-) create mode 100644 .changeset/forty-bananas-burn.md delete mode 100644 src/categories/components/CategoryDeleteDialog/CategoryDeleteDialog.tsx delete mode 100644 src/categories/components/CategoryDeleteDialog/index.ts create mode 100644 src/components/Modal/Grid.tsx delete mode 100644 src/products/components/ProductVariantImageSelectDialog/styles.ts diff --git a/.changeset/forty-bananas-burn.md b/.changeset/forty-bananas-burn.md new file mode 100644 index 00000000000..250162ef96e --- /dev/null +++ b/.changeset/forty-bananas-burn.md @@ -0,0 +1,5 @@ +--- +"saleor-dashboard": patch +--- + +Legacy Dialog component is no longer used diff --git a/locale/defaultMessages.json b/locale/defaultMessages.json index 0e6afd6fc7c..3eacd3a21e5 100644 --- a/locale/defaultMessages.json +++ b/locale/defaultMessages.json @@ -6361,10 +6361,6 @@ "dHAwu8": { "string": "Code already exists" }, - "dJQxHt": { - "context": "delete category", - "string": "Are you sure you want to delete {categoryName}?" - }, "dJVXIb": { "context": "vat included in order price", "string": "VAT included" diff --git a/src/apps/components/AppDeleteDialog/AppDeleteDialog.tsx b/src/apps/components/AppDeleteDialog/AppDeleteDialog.tsx index fa636c19aea..9bc75946db8 100644 --- a/src/apps/components/AppDeleteDialog/AppDeleteDialog.tsx +++ b/src/apps/components/AppDeleteDialog/AppDeleteDialog.tsx @@ -55,7 +55,6 @@ const AppDeleteDialog: React.FC<AppDeleteDialogProps> = ({ onConfirm={onConfirm} title={intl.formatMessage(msgs.deleteAppTitle)} variant="delete" - size="lg" > <Box data-test-id="dialog-content"> <Box diff --git a/src/apps/components/AppDialog/AppDialog.tsx b/src/apps/components/AppDialog/AppDialog.tsx index c2c2862ebdf..c79af3ad4b5 100644 --- a/src/apps/components/AppDialog/AppDialog.tsx +++ b/src/apps/components/AppDialog/AppDialog.tsx @@ -11,7 +11,7 @@ interface AppDialogProps { export const AppDialog: React.FC<AppDialogProps> = ({ children, title, onClose, ...props }) => { return ( <DashboardModal aria-labelledby="extension app dialog" {...props} onChange={onClose}> - <DashboardModal.Content> + <DashboardModal.Content size="lg"> <DashboardModal.Title display="flex" justifyContent="space-between" @@ -21,7 +21,7 @@ export const AppDialog: React.FC<AppDialogProps> = ({ children, title, onClose, {title} <DashboardModal.Close onClose={onClose}></DashboardModal.Close> </DashboardModal.Title> - <Box __width={600} __height={600}> + <Box width="100%" __height={600}> {children} </Box> </DashboardModal.Content> diff --git a/src/apps/components/AppPermissionsDialog/AppPermissionsDialog.tsx b/src/apps/components/AppPermissionsDialog/AppPermissionsDialog.tsx index 88bc2b9b978..ae22228eb7c 100644 --- a/src/apps/components/AppPermissionsDialog/AppPermissionsDialog.tsx +++ b/src/apps/components/AppPermissionsDialog/AppPermissionsDialog.tsx @@ -3,9 +3,9 @@ import { AppPermissionsDialogPermissionPicker } from "@dashboard/apps/components import { useAppPermissionsDialogState } from "@dashboard/apps/components/AppPermissionsDialog/AppPermissionsDialogState"; import { AppPermissionsDialogMessages } from "@dashboard/apps/components/AppPermissionsDialog/messages"; import { useGetAvailableAppPermissions } from "@dashboard/apps/hooks/useGetAvailableAppPermissions"; +import { DashboardModal } from "@dashboard/components/Modal"; import { PermissionEnum, useAppQuery, useAppUpdatePermissionsMutation } from "@dashboard/graphql"; import useNotifier from "@dashboard/hooks/useNotifier"; -import { Dialog, DialogContent, DialogTitle } from "@material-ui/core"; import { Box, Skeleton, Text } from "@saleor/macaw-ui-next"; import React, { useEffect } from "react"; import { useIntl } from "react-intl"; @@ -109,9 +109,9 @@ export const AppPermissionsDialog = ({ }; return ( - <Dialog open={true} onClose={onClose} fullWidth maxWidth={"sm"}> - <DialogTitle disableTypography>{formatMessage(messages.heading)}</DialogTitle> - <DialogContent> + <DashboardModal open={true} onChange={onClose}> + <DashboardModal.Content size="sm"> + <DashboardModal.Title>{formatMessage(messages.heading)}</DashboardModal.Title> <Box display={"grid"} gridAutoFlow={"row"}> <Text as={"p"}>{formatMessage(messages.info)}</Text> <Box @@ -129,7 +129,7 @@ export const AppPermissionsDialog = ({ </Box> {renderDialogContent()} </Box> - </DialogContent> - </Dialog> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/apps/components/AppPermissionsDialog/AppPermissionsDialogConfirmation.tsx b/src/apps/components/AppPermissionsDialog/AppPermissionsDialogConfirmation.tsx index cc2bc5ea002..35647953c1d 100644 --- a/src/apps/components/AppPermissionsDialog/AppPermissionsDialogConfirmation.tsx +++ b/src/apps/components/AppPermissionsDialog/AppPermissionsDialogConfirmation.tsx @@ -1,7 +1,10 @@ import { AppPermissionsDialogMessages } from "@dashboard/apps/components/AppPermissionsDialog/messages"; import { useGetAvailableAppPermissions } from "@dashboard/apps/hooks/useGetAvailableAppPermissions"; +import BackButton from "@dashboard/components/BackButton"; +import { ConfirmButton } from "@dashboard/components/ConfirmButton"; +import { DashboardModal } from "@dashboard/components/Modal"; import { PermissionEnum } from "@dashboard/graphql"; -import { Box, Button, Text } from "@saleor/macaw-ui-next"; +import { Box, Text } from "@saleor/macaw-ui-next"; import React from "react"; import { useIntl } from "react-intl"; @@ -30,6 +33,7 @@ export const AppPermissionsDialogConfirmation = ({ <Text marginBottom={2} as={"p"}> {intl.formatMessage(messages.summaryText)} </Text> + {isPermissionsRemoved && ( <Box marginBottom={4}> <Text size={4} fontWeight="bold"> @@ -42,6 +46,7 @@ export const AppPermissionsDialogConfirmation = ({ ))} </Box> )} + {isPermissionsAdded && ( <Box> <Text size={4} fontWeight="bold"> @@ -54,23 +59,15 @@ export const AppPermissionsDialogConfirmation = ({ ))} </Box> )} - <Box display={"flex"} justifyContent={"flex-end"} gap={2} marginTop={6}> - <Button - variant={"tertiary"} - onClick={() => { - onBack(); - }} - > - {intl.formatMessage(messages.backButton)} - </Button> - <Button - onClick={() => { - onApprove(); - }} - > + + <Box marginBottom={6} /> + + <DashboardModal.Actions> + <BackButton onClick={onBack}>{intl.formatMessage(messages.backButton)}</BackButton> + <ConfirmButton data-test-id="submit" transitionState="default" onClick={onApprove}> {intl.formatMessage(messages.confirmButton)} - </Button> - </Box> + </ConfirmButton> + </DashboardModal.Actions> </Box> ); }; diff --git a/src/apps/components/AppPermissionsDialog/AppPermissionsDialogPermissionPicker.tsx b/src/apps/components/AppPermissionsDialog/AppPermissionsDialogPermissionPicker.tsx index 1fc132be2d2..a717cdd422b 100644 --- a/src/apps/components/AppPermissionsDialog/AppPermissionsDialogPermissionPicker.tsx +++ b/src/apps/components/AppPermissionsDialog/AppPermissionsDialogPermissionPicker.tsx @@ -1,7 +1,10 @@ import { AppPermissionsDialogMessages } from "@dashboard/apps/components/AppPermissionsDialog/messages"; import { AppPermission } from "@dashboard/apps/components/AppPermissionsDialog/types"; +import BackButton from "@dashboard/components/BackButton"; +import { ConfirmButton } from "@dashboard/components/ConfirmButton"; +import { DashboardModal } from "@dashboard/components/Modal"; import { PermissionEnum } from "@dashboard/graphql"; -import { Box, Button, Checkbox, List, Text } from "@saleor/macaw-ui-next"; +import { Box, Checkbox, List, Text } from "@saleor/macaw-ui-next"; import React from "react"; import { useIntl } from "react-intl"; @@ -44,7 +47,7 @@ export const AppPermissionsDialogPermissionPicker = ({ onChange(values); }} > - <Box overflow={"scroll"} __maxHeight={LIST_MAX_HEIGHT}> + <Box overflow={"scroll"} __maxHeight={LIST_MAX_HEIGHT} marginBottom={6}> <List> {allPermissions.map(perm => { const isAssigned = Boolean(selected.find(p => p === perm.code)); @@ -66,12 +69,13 @@ export const AppPermissionsDialogPermissionPicker = ({ })} </List> </Box> - <Box display={"flex"} justifyContent={"flex-end"} gap={2} marginTop={2}> - <Button onClick={onClose} type={"button"} variant={"tertiary"}> - {intl.formatMessage(messages.closeButton)} - </Button> - <Button type={"submit"}>{intl.formatMessage(messages.saveButton)}</Button> - </Box> + + <DashboardModal.Actions> + <BackButton onClick={onClose}>{intl.formatMessage(messages.closeButton)}</BackButton> + <ConfirmButton data-test-id="submit" transitionState="default" type="submit"> + {intl.formatMessage(messages.saveButton)} + </ConfirmButton> + </DashboardModal.Actions> </form> ); }; diff --git a/src/attributes/components/AttributeValueEditDialog/AttributeValueEditDialog.tsx b/src/attributes/components/AttributeValueEditDialog/AttributeValueEditDialog.tsx index 7006c4b8028..d15683b48c9 100644 --- a/src/attributes/components/AttributeValueEditDialog/AttributeValueEditDialog.tsx +++ b/src/attributes/components/AttributeValueEditDialog/AttributeValueEditDialog.tsx @@ -2,11 +2,12 @@ import { getAttributeValueErrorMessage } from "@dashboard/attributes/errors"; import BackButton from "@dashboard/components/BackButton"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import Form from "@dashboard/components/Form"; +import { DashboardModal } from "@dashboard/components/Modal"; import { AttributeErrorFragment, AttributeInputTypeEnum } from "@dashboard/graphql"; import useModalDialogErrors from "@dashboard/hooks/useModalDialogErrors"; import { buttonMessages } from "@dashboard/intl"; import { getFormErrors } from "@dashboard/utils/errors"; -import { Dialog, DialogActions, DialogContent, DialogTitle, TextField } from "@material-ui/core"; +import { TextField } from "@material-ui/core"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -46,32 +47,27 @@ const AttributeValueEditDialog: React.FC<AttributeValueEditDialogProps> = ({ const formErrors = getFormErrors(["name"], errors); return ( - <Dialog - onClose={onClose} - open={open} - fullWidth - maxWidth="sm" - data-test-id="edit-attribute-value-dialog" - > - <DialogTitle disableTypography> - {attributeValue === null ? ( - <FormattedMessage - id="PqMbma" - defaultMessage="Add Value" - description="add attribute value" - /> - ) : ( - <FormattedMessage - id="XYhE8p" - defaultMessage="Edit Value" - description="edit attribute value" - /> - )} - </DialogTitle> - <Form initial={initialForm} onSubmit={onSubmit}> - {({ errors, set, change, clearErrors, setError, data, submit }) => ( - <> - <DialogContent> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="sm" data-test-id="edit-attribute-value-dialog"> + <Form initial={initialForm} onSubmit={onSubmit}> + {({ errors, set, change, clearErrors, setError, data, submit }) => ( + <DashboardModal.Grid> + <DashboardModal.Title> + {attributeValue === null ? ( + <FormattedMessage + id="PqMbma" + defaultMessage="Add Value" + description="add attribute value" + /> + ) : ( + <FormattedMessage + id="XYhE8p" + defaultMessage="Edit Value" + description="edit attribute value" + /> + )} + </DashboardModal.Title> + <TextField data-test-id="value-name" autoFocus @@ -88,6 +84,7 @@ const AttributeValueEditDialog: React.FC<AttributeValueEditDialogProps> = ({ value={data.name} onChange={change} /> + {isSwatch && ( <AttributeSwatchField data={data} @@ -97,22 +94,23 @@ const AttributeValueEditDialog: React.FC<AttributeValueEditDialogProps> = ({ set={set} /> )} - </DialogContent> - <DialogActions> - <BackButton onClick={onClose} /> - <ConfirmButton - data-test-id="submit" - transitionState={confirmButtonState} - disabled={data.name === ""} - onClick={submit} - > - <FormattedMessage {...buttonMessages.save} /> - </ConfirmButton> - </DialogActions> - </> - )} - </Form> - </Dialog> + + <DashboardModal.Actions> + <BackButton onClick={onClose} /> + <ConfirmButton + data-test-id="submit" + transitionState={confirmButtonState} + disabled={data.name === ""} + onClick={submit} + > + <FormattedMessage {...buttonMessages.save} /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Grid> + )} + </Form> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/categories/components/CategoryDeleteDialog/CategoryDeleteDialog.tsx b/src/categories/components/CategoryDeleteDialog/CategoryDeleteDialog.tsx deleted file mode 100644 index d7bc2be1da5..00000000000 --- a/src/categories/components/CategoryDeleteDialog/CategoryDeleteDialog.tsx +++ /dev/null @@ -1,69 +0,0 @@ -import BackButton from "@dashboard/components/BackButton"; -import { Button } from "@dashboard/components/Button"; -import { buttonMessages } from "@dashboard/intl"; -import { - Dialog, - DialogActions, - DialogContent, - DialogContentText, - DialogTitle, -} from "@material-ui/core"; -import { makeStyles } from "@saleor/macaw-ui"; -import React from "react"; -import { FormattedMessage } from "react-intl"; - -const useStyles = makeStyles( - theme => ({ - deleteButton: { - "&:hover": { - backgroundColor: theme.palette.error.main, - }, - backgroundColor: theme.palette.error.main, - color: theme.palette.error.contrastText, - }, - }), - { - name: "CategoryDeleteDialog", - }, -); - -export interface CategoryDeleteDialogProps { - open: boolean; - name: string; - onClose: () => any; - onConfirm: () => any; -} - -const CategoryDeleteDialog: React.FC<CategoryDeleteDialogProps> = props => { - const { name, open, onConfirm, onClose } = props; - const classes = useStyles(props); - - return ( - <Dialog onClose={onClose} open={open}> - <DialogTitle disableTypography> - <FormattedMessage id="xo5UIb" defaultMessage="Delete category" description="dialog title" /> - </DialogTitle> - <DialogContent> - <DialogContentText> - <FormattedMessage - id="dJQxHt" - defaultMessage="Are you sure you want to delete {categoryName}?" - description="delete category" - values={{ - categoryName: <strong>{name}</strong>, - }} - /> - </DialogContentText> - </DialogContent> - <DialogActions> - <BackButton onClick={onClose} /> - <Button className={classes.deleteButton} variant="primary" onClick={onConfirm}> - <FormattedMessage {...buttonMessages.save} /> - </Button> - </DialogActions> - </Dialog> - ); -}; - -CategoryDeleteDialog.displayName = "CategoryDeleteDialog"; -export default CategoryDeleteDialog; diff --git a/src/categories/components/CategoryDeleteDialog/index.ts b/src/categories/components/CategoryDeleteDialog/index.ts deleted file mode 100644 index 31957694a07..00000000000 --- a/src/categories/components/CategoryDeleteDialog/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default } from "./CategoryDeleteDialog"; -export * from "./CategoryDeleteDialog"; diff --git a/src/components/ActionDialog/ActionDialog.tsx b/src/components/ActionDialog/ActionDialog.tsx index f62be979097..396ff400014 100644 --- a/src/components/ActionDialog/ActionDialog.tsx +++ b/src/components/ActionDialog/ActionDialog.tsx @@ -6,8 +6,8 @@ import React from "react"; import { useIntl } from "react-intl"; import BackButton from "../BackButton"; -import { DASHBOARD_MODAL_WIDTH, DASHBOARD_MODAL_WIDTH_SMALL, DashboardModal } from "../Modal"; -import { ActionDialogSize, ActionDialogVariant } from "./types"; +import { DashboardModal, DashboardModalContentSize } from "../Modal"; +import { ActionDialogVariant } from "./types"; export interface ActionDialogProps extends DialogProps { children?: React.ReactNode; @@ -18,14 +18,9 @@ export interface ActionDialogProps extends DialogProps { variant?: ActionDialogVariant; backButtonText?: string; onConfirm: () => any; - size?: ActionDialogSize; + size?: DashboardModalContentSize; } -const ACTION_DIALOG_SIZE: Record<ActionDialogSize, number> = { - sm: DASHBOARD_MODAL_WIDTH_SMALL, - lg: DASHBOARD_MODAL_WIDTH, -}; - const ActionDialog = ({ children, open, @@ -43,7 +38,7 @@ const ActionDialog = ({ return ( <DashboardModal onChange={onClose} open={open}> - <DashboardModal.Content __maxWidth={ACTION_DIALOG_SIZE[size]} width="100%" overflow="hidden"> + <DashboardModal.Content size={size}> <DashboardModal.Title>{title}</DashboardModal.Title> <Box fontSize={3}>{children}</Box> <DashboardModal.Actions> diff --git a/src/components/ActionDialog/types.ts b/src/components/ActionDialog/types.ts index bbe2c281200..2fcce1ea665 100644 --- a/src/components/ActionDialog/types.ts +++ b/src/components/ActionDialog/types.ts @@ -1,3 +1 @@ export type ActionDialogVariant = "default" | "delete" | "info"; - -export type ActionDialogSize = "sm" | "lg"; diff --git a/src/components/AssignAttributeDialog/AssignAttributeDialog.tsx b/src/components/AssignAttributeDialog/AssignAttributeDialog.tsx index 77d8e9d9f7a..68d52fac640 100644 --- a/src/components/AssignAttributeDialog/AssignAttributeDialog.tsx +++ b/src/components/AssignAttributeDialog/AssignAttributeDialog.tsx @@ -1,29 +1,18 @@ // @ts-strict-ignore import Checkbox from "@dashboard/components/Checkbox"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; +import { DashboardModal } from "@dashboard/components/Modal"; import ResponsiveTable from "@dashboard/components/ResponsiveTable"; import TableRowLink from "@dashboard/components/TableRowLink"; import { AvailableAttributeFragment } from "@dashboard/graphql"; -import useElementScroll, { isScrolledToBottom } from "@dashboard/hooks/useElementScroll"; import useModalDialogErrors from "@dashboard/hooks/useModalDialogErrors"; import useModalDialogOpen from "@dashboard/hooks/useModalDialogOpen"; import useSearchQuery from "@dashboard/hooks/useSearchQuery"; import { maybe, renderCollection } from "@dashboard/misc"; import { FetchMoreProps } from "@dashboard/types"; -import { - CircularProgress, - Dialog, - DialogActions, - DialogContent, - DialogContentText, - DialogTitle, - TableBody, - TableCell, - TextField, -} from "@material-ui/core"; +import { CircularProgress, TableBody, TableCell, TextField } from "@material-ui/core"; import { makeStyles } from "@saleor/macaw-ui"; -import { Text } from "@saleor/macaw-ui-next"; -import clsx from "clsx"; +import { Box, Text } from "@saleor/macaw-ui-next"; import React from "react"; import InfiniteScroll from "react-infinite-scroll-component"; import { FormattedMessage, useIntl } from "react-intl"; @@ -33,18 +22,9 @@ import { messages } from "./messages"; const useStyles = makeStyles( theme => ({ - actions: { - boxShadow: "0px 4px 4px rgba(0, 0, 0, 0.25)", - }, checkboxCell: { paddingLeft: 0, }, - dialogPaper: { - overflow: "hidden", - }, - dropShadow: { - boxShadow: `0px -5px 10px 0px ${theme.palette.divider}`, - }, loadMoreLoaderContainer: { alignItems: "center", display: "flex", @@ -52,17 +32,6 @@ const useStyles = makeStyles( height: theme.spacing(3), justifyContent: "center", }, - searchArea: { - marginBottom: theme.spacing(3), - overflowY: "hidden", - paddingBottom: theme.spacing(6), - }, - scrollArea: { - maxHeight: 700, - overflowY: "scroll", - paddingTop: 0, - marginBottom: theme.spacing(3), - }, wideCell: { width: "100%", }, @@ -104,7 +73,6 @@ const AssignAttributeDialog: React.FC<AssignAttributeDialogProps> = ({ const [query, onQueryChange, resetQuery] = useSearchQuery(onFetch); const errors = useModalDialogErrors(apiErrors, open); const anchor = React.useRef(null); - const position = useElementScroll(anchor); useModalDialogOpen(open, { onClose: resetQuery, @@ -112,19 +80,12 @@ const AssignAttributeDialog: React.FC<AssignAttributeDialogProps> = ({ }); return ( - <Dialog - onClose={onClose} - open={open} - fullWidth - maxWidth="sm" - classes={{ - paper: classes.dialogPaper, - }} - > - <DialogTitle disableTypography> - <FormattedMessage {...messages.title} /> - </DialogTitle> - <DialogContent className={classes.searchArea}> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="sm" __gridTemplateRows="auto auto 1fr auto auto"> + <DashboardModal.Title> + <FormattedMessage {...messages.title} /> + </DashboardModal.Title> + <TextField data-test-id="attribute-search-input" name="query" @@ -138,85 +99,83 @@ const AssignAttributeDialog: React.FC<AssignAttributeDialogProps> = ({ endAdornment: loading && <CircularProgress size={16} />, }} /> - </DialogContent> - <DialogContent className={classes.scrollArea} ref={anchor} id={scrollableTargetId}> - <InfiniteScroll - dataLength={attributes?.length || 0} - next={onFetchMore} - hasMore={hasMore} - scrollThreshold="100px" - loader={ - <div className={classes.loadMoreLoaderContainer}> - <CircularProgress size={16} /> - </div> - } - scrollableTarget={scrollableTargetId} - > - <ResponsiveTable key="table"> - <TableBody data-test-id="attributes-list"> - {renderCollection( - attributes, - attribute => { - if (!attribute) { - return null; - } - const isChecked = !!selected.find( - selectedAttribute => selectedAttribute === attribute.id, - ); + <Box id={scrollableTargetId} ref={anchor} overflowY="auto"> + <InfiniteScroll + dataLength={attributes?.length || 0} + next={onFetchMore} + hasMore={hasMore} + scrollThreshold="100px" + loader={ + <div className={classes.loadMoreLoaderContainer}> + <CircularProgress size={16} /> + </div> + } + scrollableTarget={scrollableTargetId} + > + <ResponsiveTable key="table"> + <TableBody data-test-id="attributes-list"> + {renderCollection( + attributes, + attribute => { + if (!attribute) { + return null; + } + + const isChecked = !!selected.find( + selectedAttribute => selectedAttribute === attribute.id, + ); + + return ( + <TableRowLink key={maybe(() => attribute.id)}> + <TableCell padding="checkbox" className={classes.checkboxCell}> + <Checkbox checked={isChecked} onChange={() => onToggle(attribute.id)} /> + </TableCell> + <TableCell className={classes.wideCell}> + {attribute.name} + <Text size={2} fontWeight="light" display="block"> + {attribute.slug} + </Text> + </TableCell> + </TableRowLink> + ); + }, + () => + !loading && ( + <TableRowLink> + <TableCell colSpan={2}> + <FormattedMessage {...messages.noMembersFound} /> + </TableCell> + </TableRowLink> + ), + )} + </TableBody> + </ResponsiveTable> + </InfiniteScroll> + </Box> + + <Box> + {errors.length > 0 && + errors.map((error, errorIndex) => ( + <Text display="block" color="critical1" key={errorIndex}> + {error} + </Text> + ))} + </Box> - return ( - <TableRowLink key={maybe(() => attribute.id)}> - <TableCell padding="checkbox" className={classes.checkboxCell}> - <Checkbox checked={isChecked} onChange={() => onToggle(attribute.id)} /> - </TableCell> - <TableCell className={classes.wideCell}> - {attribute.name} - <Text size={2} fontWeight="light" display="block"> - {attribute.slug} - </Text> - </TableCell> - </TableRowLink> - ); - }, - () => - !loading && ( - <TableRowLink> - <TableCell colSpan={2}> - <FormattedMessage {...messages.noMembersFound} /> - </TableCell> - </TableRowLink> - ), - )} - </TableBody> - </ResponsiveTable> - </InfiniteScroll> - </DialogContent> - {errors.length > 0 && ( - <DialogContent> - {errors.map((error, errorIndex) => ( - <DialogContentText color="error" key={errorIndex}> - {error} - </DialogContentText> - ))} - </DialogContent> - )} - <DialogActions - className={clsx(classes.actions, { - [classes.dropShadow]: !isScrolledToBottom(anchor, position), - })} - > - <BackButton onClick={onClose} /> - <ConfirmButton - transitionState={confirmButtonState} - type="submit" - onClick={onSubmit} - data-test-id="assign-and-save-button" - > - <FormattedMessage {...messages.assignButton} /> - </ConfirmButton> - </DialogActions> - </Dialog> + <DashboardModal.Actions> + <BackButton onClick={onClose} /> + <ConfirmButton + transitionState={confirmButtonState} + type="submit" + onClick={onSubmit} + data-test-id="assign-and-save-button" + > + <FormattedMessage {...messages.assignButton} /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/components/AssignContainerDialog/AssignContainerDialog.tsx b/src/components/AssignContainerDialog/AssignContainerDialog.tsx index 63065afbd32..5915a0fa8ac 100644 --- a/src/components/AssignContainerDialog/AssignContainerDialog.tsx +++ b/src/components/AssignContainerDialog/AssignContainerDialog.tsx @@ -1,19 +1,12 @@ import { ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; +import { DashboardModal } from "@dashboard/components/Modal"; import ResponsiveTable from "@dashboard/components/ResponsiveTable"; import TableRowLink from "@dashboard/components/TableRowLink"; import useSearchQuery from "@dashboard/hooks/useSearchQuery"; import useScrollableDialogStyle from "@dashboard/styles/useScrollableDialogStyle"; import { DialogProps, FetchMoreProps, Node } from "@dashboard/types"; -import { - CircularProgress, - Dialog, - DialogActions, - DialogContent, - DialogTitle, - TableBody, - TableCell, - TextField, -} from "@material-ui/core"; +import { CircularProgress, TableBody, TableCell, TextField } from "@material-ui/core"; +import { Box } from "@saleor/macaw-ui-next"; import React from "react"; import InfiniteScroll from "react-infinite-scroll-component"; @@ -80,15 +73,10 @@ const AssignContainerDialog: React.FC<AssignContainerDialogProps> = props => { }; return ( - <Dialog - onClose={handleClose} - open={open} - classes={{ paper: scrollableDialogClasses.dialog }} - fullWidth - maxWidth="sm" - > - <DialogTitle disableTypography>{labels.title}</DialogTitle> - <DialogContent> + <DashboardModal onChange={handleClose} open={open}> + <DashboardModal.Content size="sm" __gridTemplateRows="auto auto 1fr auto"> + <DashboardModal.Title>{labels.title}</DashboardModal.Title> + <TextField name="query" value={query} @@ -101,64 +89,66 @@ const AssignContainerDialog: React.FC<AssignContainerDialogProps> = props => { endAdornment: loading && <CircularProgress size={16} />, }} /> - </DialogContent> - <DialogContent className={scrollableDialogClasses.scrollArea} id={scrollableTargetId}> - <InfiniteScroll - dataLength={containers?.length} - next={onFetchMore} - hasMore={hasMore} - scrollThreshold="100px" - loader={ - <div className={scrollableDialogClasses.loadMoreLoaderContainer}> - <CircularProgress size={16} /> - </div> - } - scrollableTarget={scrollableTargetId} - > - <ResponsiveTable> - <TableBody> - {containers?.map(container => { - const isSelected = !!selectedContainers.find( - selectedContainer => selectedContainer.id === container.id, - ); - return ( - <TableRowLink key={container.id} data-test-id="dialog-row"> - <TableCell padding="checkbox" className={classes.checkboxCell}> - <Checkbox - checked={isSelected} - onChange={() => - handleContainerAssign( - container, - isSelected, - selectedContainers, - setSelectedContainers, - ) - } - /> - </TableCell> - <TableCell className={classes.wideCell} data-test-id={container.name}> - {container.name} - </TableCell> - </TableRowLink> - ); - })} - </TableBody> - </ResponsiveTable> - </InfiniteScroll> - </DialogContent> - <DialogActions> - <BackButton onClick={onClose} /> - <ConfirmButton - data-test-id="assign-and-save-button" - transitionState={confirmButtonState} - type="submit" - onClick={handleSubmit} - > - {labels.confirmBtn} - </ConfirmButton> - </DialogActions> - </Dialog> + <Box className={scrollableDialogClasses.scrollArea} id={scrollableTargetId}> + <InfiniteScroll + dataLength={containers?.length} + next={onFetchMore} + hasMore={hasMore} + scrollThreshold="100px" + loader={ + <div className={scrollableDialogClasses.loadMoreLoaderContainer}> + <CircularProgress size={16} /> + </div> + } + scrollableTarget={scrollableTargetId} + > + <ResponsiveTable> + <TableBody> + {containers?.map(container => { + const isSelected = !!selectedContainers.find( + selectedContainer => selectedContainer.id === container.id, + ); + + return ( + <TableRowLink key={container.id} data-test-id="dialog-row"> + <TableCell padding="checkbox" className={classes.checkboxCell}> + <Checkbox + checked={isSelected} + onChange={() => + handleContainerAssign( + container, + isSelected, + selectedContainers, + setSelectedContainers, + ) + } + /> + </TableCell> + <TableCell className={classes.wideCell} data-test-id={container.name}> + {container.name} + </TableCell> + </TableRowLink> + ); + })} + </TableBody> + </ResponsiveTable> + </InfiniteScroll> + </Box> + + <DashboardModal.Actions> + <BackButton onClick={onClose} /> + <ConfirmButton + data-test-id="assign-and-save-button" + transitionState={confirmButtonState} + type="submit" + onClick={handleSubmit} + > + {labels.confirmBtn} + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/components/AssignProductDialog/AssignProductDialog.tsx b/src/components/AssignProductDialog/AssignProductDialog.tsx index 35cf33ea3dc..967a55f2bb0 100644 --- a/src/components/AssignProductDialog/AssignProductDialog.tsx +++ b/src/components/AssignProductDialog/AssignProductDialog.tsx @@ -1,5 +1,6 @@ // @ts-strict-ignore import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; +import { DashboardModal } from "@dashboard/components/Modal"; import ResponsiveTable from "@dashboard/components/ResponsiveTable"; import TableCellAvatar from "@dashboard/components/TableCellAvatar"; import TableRowLink from "@dashboard/components/TableRowLink"; @@ -8,17 +9,8 @@ import useSearchQuery from "@dashboard/hooks/useSearchQuery"; import { maybe } from "@dashboard/misc"; import useScrollableDialogStyle from "@dashboard/styles/useScrollableDialogStyle"; import { DialogProps, FetchMoreProps } from "@dashboard/types"; -import { - CircularProgress, - Dialog, - DialogActions, - DialogContent, - DialogTitle, - TableBody, - TableCell, - TextField, -} from "@material-ui/core"; -import { Text } from "@saleor/macaw-ui-next"; +import { CircularProgress, TableBody, TableCell, TextField } from "@material-ui/core"; +import { Box, Text } from "@saleor/macaw-ui-next"; import React, { useEffect } from "react"; import InfiniteScroll from "react-infinite-scroll-component"; import { FormattedMessage, useIntl } from "react-intl"; @@ -113,17 +105,12 @@ const AssignProductDialog: React.FC<AssignProductDialogProps> = props => { }; return ( - <Dialog - onClose={handleClose} - open={open} - classes={{ paper: scrollableDialogClasses.dialog }} - fullWidth - maxWidth="sm" - > - <DialogTitle disableTypography> - <FormattedMessage {...messages.assignVariantDialogHeader} /> - </DialogTitle> - <DialogContent> + <DashboardModal onChange={handleClose} open={open}> + <DashboardModal.Content size="sm" __gridTemplateRows="auto auto 1fr auto"> + <DashboardModal.Title> + <FormattedMessage {...messages.assignVariantDialogHeader} /> + </DashboardModal.Title> + <TextField name="query" value={query} @@ -136,73 +123,75 @@ const AssignProductDialog: React.FC<AssignProductDialogProps> = props => { endAdornment: loading && <CircularProgress size={16} />, }} /> - </DialogContent> - <DialogContent className={scrollableDialogClasses.scrollArea} id={scrollableTargetId}> - <InfiniteScroll - dataLength={products?.length ?? 0} - next={onFetchMore} - hasMore={hasMore} - scrollThreshold="100px" - loader={ - <div className={scrollableDialogClasses.loadMoreLoaderContainer}> - <CircularProgress size={16} /> - </div> - } - scrollableTarget={scrollableTargetId} - > - <ResponsiveTable key="table"> - <TableBody> - {products && - products.map(product => { - const isSelected = productsDict[product.id] || false; - const isProductAvailable = isProductAvailableInVoucherChannels( - product.channelListings, - selectedChannels, - ); - return ( - <TableRowLink key={product.id} data-test-id="assign-product-table-row"> - <TableCell padding="checkbox" className={classes.checkboxCell}> - <Checkbox - checked={isSelected} - disabled={!isProductAvailable} - onChange={() => handleChange(product.id)} + <Box className={scrollableDialogClasses.scrollArea} id={scrollableTargetId}> + <InfiniteScroll + dataLength={products?.length ?? 0} + next={onFetchMore} + hasMore={hasMore} + scrollThreshold="100px" + loader={ + <div className={scrollableDialogClasses.loadMoreLoaderContainer}> + <CircularProgress size={16} /> + </div> + } + scrollableTarget={scrollableTargetId} + > + <ResponsiveTable key="table"> + <TableBody> + {products && + products.map(product => { + const isSelected = productsDict[product.id] || false; + const isProductAvailable = isProductAvailableInVoucherChannels( + product.channelListings, + selectedChannels, + ); + + return ( + <TableRowLink key={product.id} data-test-id="assign-product-table-row"> + <TableCell padding="checkbox" className={classes.checkboxCell}> + <Checkbox + checked={isSelected} + disabled={!isProductAvailable} + onChange={() => handleChange(product.id)} + /> + </TableCell> + <TableCellAvatar + className={classes.avatar} + thumbnail={maybe(() => product.thumbnail.url)} + style={{ + opacity: !isProductAvailable ? 0.5 : 1, + }} /> - </TableCell> - <TableCellAvatar - className={classes.avatar} - thumbnail={maybe(() => product.thumbnail.url)} - style={{ - opacity: !isProductAvailable ? 0.5 : 1, - }} - /> - <TableCell className={classes.colName}> - {product.name} - {!isProductAvailable && productUnavailableText && ( - <Text display="block" size={1} color="default2"> - {productUnavailableText} - </Text> - )} - </TableCell> - </TableRowLink> - ); - })} - </TableBody> - </ResponsiveTable> - </InfiniteScroll> - </DialogContent> - <DialogActions> - <BackButton onClick={onClose} /> - <ConfirmButton - data-test-id="submit" - transitionState={confirmButtonState} - type="submit" - onClick={handleSubmit} - > - <FormattedMessage {...messages.assignProductDialogButton} /> - </ConfirmButton> - </DialogActions> - </Dialog> + <TableCell className={classes.colName}> + {product.name} + {!isProductAvailable && productUnavailableText && ( + <Text display="block" size={1} color="default2"> + {productUnavailableText} + </Text> + )} + </TableCell> + </TableRowLink> + ); + })} + </TableBody> + </ResponsiveTable> + </InfiniteScroll> + </Box> + + <DashboardModal.Actions> + <BackButton onClick={onClose} /> + <ConfirmButton + data-test-id="submit" + transitionState={confirmButtonState} + type="submit" + onClick={handleSubmit} + > + <FormattedMessage {...messages.assignProductDialogButton} /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/components/AssignVariantDialog/AssignVariantDialog.tsx b/src/components/AssignVariantDialog/AssignVariantDialog.tsx index e3f7102b43c..16b6583a26d 100644 --- a/src/components/AssignVariantDialog/AssignVariantDialog.tsx +++ b/src/components/AssignVariantDialog/AssignVariantDialog.tsx @@ -1,5 +1,6 @@ // @ts-strict-ignore import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; +import { DashboardModal } from "@dashboard/components/Modal"; import Money from "@dashboard/components/Money"; import ResponsiveTable from "@dashboard/components/ResponsiveTable"; import TableCellAvatar from "@dashboard/components/TableCellAvatar"; @@ -9,17 +10,8 @@ import useSearchQuery from "@dashboard/hooks/useSearchQuery"; import { maybe, renderCollection } from "@dashboard/misc"; import useScrollableDialogStyle from "@dashboard/styles/useScrollableDialogStyle"; import { DialogProps, FetchMoreProps, RelayToFlat } from "@dashboard/types"; -import { - CircularProgress, - Dialog, - DialogActions, - DialogContent, - DialogTitle, - TableBody, - TableCell, - TextField, -} from "@material-ui/core"; -import { Text } from "@saleor/macaw-ui-next"; +import { CircularProgress, TableBody, TableCell, TextField } from "@material-ui/core"; +import { Box, Text } from "@saleor/macaw-ui-next"; import React from "react"; import InfiniteScroll from "react-infinite-scroll-component"; import { FormattedMessage, useIntl } from "react-intl"; @@ -90,17 +82,12 @@ const AssignVariantDialog: React.FC<AssignVariantDialogProps> = props => { }; return ( - <Dialog - onClose={handleClose} - open={open} - classes={{ paper: scrollableDialogClasses.dialog }} - fullWidth - maxWidth="sm" - > - <DialogTitle disableTypography> - <FormattedMessage {...messages.assignVariantDialogHeader} /> - </DialogTitle> - <DialogContent> + <DashboardModal onChange={handleClose} open={open}> + <DashboardModal.Content size="sm" __gridTemplateRows="auto auto 1fr auto"> + <DashboardModal.Title> + <FormattedMessage {...messages.assignVariantDialogHeader} /> + </DashboardModal.Title> + <TextField name="query" value={query} @@ -113,115 +100,117 @@ const AssignVariantDialog: React.FC<AssignVariantDialogProps> = props => { endAdornment: loading && <CircularProgress size={16} />, }} /> - </DialogContent> - <DialogContent className={scrollableDialogClasses.scrollArea} id={scrollableTargetId}> - <InfiniteScroll - dataLength={variants?.length} - next={onFetchMore} - hasMore={hasMore} - scrollThreshold="100px" - loader={ - <div className={scrollableDialogClasses.loadMoreLoaderContainer}> - <CircularProgress size={16} /> - </div> - } - scrollableTarget={scrollableTargetId} - > - <ResponsiveTable key="table"> - <TableBody> - {renderCollection( - productChoices, - (product, productIndex) => ( - <React.Fragment key={product ? product.id : "skeleton"}> - <TableRowLink> - <TableCell padding="checkbox" className={classes.productCheckboxCell}> - <Checkbox - checked={productsWithAllVariantsSelected[productIndex]} - disabled={loading} - onChange={() => - handleProductAssign( - product, - productIndex, - productsWithAllVariantsSelected, - variants, - setVariants, - ) - } - /> - </TableCell> - <TableCellAvatar - className={classes.avatar} - thumbnail={maybe(() => product.thumbnail.url)} - /> - <TableCell className={classes.colName} colSpan={2}> - {maybe(() => product.name)} - </TableCell> - </TableRowLink> - {maybe(() => product.variants, []).map((variant, variantIndex) => ( - <TableRowLink key={variant.id} data-test-id="assign-variant-table-row"> - <TableCell /> - <TableCell className={classes.colVariantCheckbox}> + + <Box className={scrollableDialogClasses.scrollArea} id={scrollableTargetId}> + <InfiniteScroll + dataLength={variants?.length} + next={onFetchMore} + hasMore={hasMore} + scrollThreshold="100px" + loader={ + <div className={scrollableDialogClasses.loadMoreLoaderContainer}> + <CircularProgress size={16} /> + </div> + } + scrollableTarget={scrollableTargetId} + > + <ResponsiveTable key="table"> + <TableBody> + {renderCollection( + productChoices, + (product, productIndex) => ( + <React.Fragment key={product ? product.id : "skeleton"}> + <TableRowLink> + <TableCell padding="checkbox" className={classes.productCheckboxCell}> <Checkbox - className={classes.variantCheckbox} - checked={selectedVariantsToProductsMap[productIndex][variantIndex]} + checked={productsWithAllVariantsSelected[productIndex]} disabled={loading} onChange={() => - handleVariantAssign( - variant, + handleProductAssign( product, - variantIndex, productIndex, + productsWithAllVariantsSelected, variants, - selectedVariantsToProductsMap, setVariants, ) } /> </TableCell> - <TableCell className={classes.colName}> - <div>{variant.name}</div> - <div className={classes.grayText}> - <FormattedMessage - {...messages.assignVariantDialogSKU} - values={{ - sku: variant.sku, - }} - /> - </div> - </TableCell> - <TableCell className={classes.textRight}> - {variant?.channelListings[0]?.price && ( - <Money money={variant.channelListings[0].price} /> - )} + <TableCellAvatar + className={classes.avatar} + thumbnail={maybe(() => product.thumbnail.url)} + /> + <TableCell className={classes.colName} colSpan={2}> + {maybe(() => product.name)} </TableCell> </TableRowLink> - ))} - </React.Fragment> - ), - () => ( - <Text className={classes.noContentText}> - {query - ? intl.formatMessage(messages.noProductsInQuery) - : intl.formatMessage(messages.noProductsInChannel)} - </Text> - ), - )} - </TableBody> - </ResponsiveTable> - </InfiniteScroll> - </DialogContent> - <DialogActions> - <BackButton onClick={onClose} /> - <ConfirmButton - data-test-id="submit" - transitionState={confirmButtonState} - type="submit" - onClick={handleSubmit} - > - <FormattedMessage {...messages.assignVariantDialogButton} /> - </ConfirmButton> - </DialogActions> - </Dialog> + {maybe(() => product.variants, []).map((variant, variantIndex) => ( + <TableRowLink key={variant.id} data-test-id="assign-variant-table-row"> + <TableCell /> + <TableCell className={classes.colVariantCheckbox}> + <Checkbox + className={classes.variantCheckbox} + checked={selectedVariantsToProductsMap[productIndex][variantIndex]} + disabled={loading} + onChange={() => + handleVariantAssign( + variant, + product, + variantIndex, + productIndex, + variants, + selectedVariantsToProductsMap, + setVariants, + ) + } + /> + </TableCell> + <TableCell className={classes.colName}> + <div>{variant.name}</div> + <div className={classes.grayText}> + <FormattedMessage + {...messages.assignVariantDialogSKU} + values={{ + sku: variant.sku, + }} + /> + </div> + </TableCell> + <TableCell className={classes.textRight}> + {variant?.channelListings[0]?.price && ( + <Money money={variant.channelListings[0].price} /> + )} + </TableCell> + </TableRowLink> + ))} + </React.Fragment> + ), + () => ( + <Text className={classes.noContentText}> + {query + ? intl.formatMessage(messages.noProductsInQuery) + : intl.formatMessage(messages.noProductsInChannel)} + </Text> + ), + )} + </TableBody> + </ResponsiveTable> + </InfiniteScroll> + </Box> + + <DashboardModal.Actions> + <BackButton onClick={onClose} /> + <ConfirmButton + data-test-id="submit" + transitionState={confirmButtonState} + type="submit" + onClick={handleSubmit} + > + <FormattedMessage {...messages.assignVariantDialogButton} /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/components/DevModePanel/DevModePanel.tsx b/src/components/DevModePanel/DevModePanel.tsx index 67f7e1c0a52..3bf057ddb73 100644 --- a/src/components/DevModePanel/DevModePanel.tsx +++ b/src/components/DevModePanel/DevModePanel.tsx @@ -1,8 +1,7 @@ // @ts-strict-ignore import { useDashboardTheme } from "@dashboard/components/GraphiQL/styles"; +import { DashboardModal } from "@dashboard/components/Modal"; import { createGraphiQLFetcher } from "@graphiql/toolkit"; -import { Dialog, DialogContent } from "@material-ui/core"; -import { DialogHeader } from "@saleor/macaw-ui"; import { createFetch } from "@saleor/sdk"; import React from "react"; import { useIntl } from "react-intl"; @@ -34,20 +33,16 @@ export const DevModePanel: React.FC = () => { }; return ( - <Dialog - maxWidth="xl" - fullWidth - open={isDevModeVisible} - style={{ zIndex: 5 }} - PaperProps={{ style: { height: "100%" } }} - > - <style dangerouslySetInnerHTML={overwriteCodeMirrorCSSVariables}></style> - <DialogHeader onClose={() => setDevModeVisibility(false)}> - {intl.formatMessage(messages.title)} - </DialogHeader> - <DialogContent style={{ padding: 0, margin: 1, overflowY: "auto" }}> + <DashboardModal open={isDevModeVisible} onChange={() => setDevModeVisibility(false)}> + <DashboardModal.Content size="xl" __gridTemplateRows="auto 1fr" height="100%"> + <style dangerouslySetInnerHTML={overwriteCodeMirrorCSSVariables}></style> + <DashboardModal.Title display="flex" justifyContent="space-between"> + {intl.formatMessage(messages.title)} + <DashboardModal.Close onClose={() => setDevModeVisibility(false)} /> + </DashboardModal.Title> + <PlainGraphiQL query={devModeContent} variables={variables} fetcher={fetcher} /> - </DialogContent> - </Dialog> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/components/DryRun/DryRun.tsx b/src/components/DryRun/DryRun.tsx index 531281d259d..f3965f02d8c 100644 --- a/src/components/DryRun/DryRun.tsx +++ b/src/components/DryRun/DryRun.tsx @@ -1,18 +1,12 @@ // @ts-strict-ignore import Grid from "@dashboard/components/Grid"; +import { DashboardModal } from "@dashboard/components/Modal"; import { useStyles } from "@dashboard/custom-apps/components/WebhookEvents/styles"; import { useTriggerWebhookDryRunMutation, WebhookEventTypeSyncEnum } from "@dashboard/graphql"; -import { - capitalize, - Dialog, - DialogActions, - DialogContent, - DialogContentText, -} from "@material-ui/core"; +import { capitalize } from "@material-ui/core"; import { Alert, Button, - DialogHeader, List, ListBody, ListHeader, @@ -73,22 +67,30 @@ const DryRun: React.FC<DryRunProps> = ({ if (syncEvents.length > 0) { return ( - <Dialog open={showDialog} fullWidth maxWidth="md" data-test-id="dry-run"> - <DialogHeader onClose={closeDialog}>{intl.formatMessage(messages.header)}</DialogHeader> - <DialogContent style={{ overflow: "scroll" }}> + <DashboardModal onChange={closeDialog} open={showDialog}> + <DashboardModal.Content size="lg" data-test-id="dry-run"> + <DashboardModal.Title display="flex" justifyContent="space-between"> + {intl.formatMessage(messages.header)} + <DashboardModal.Close onClose={closeDialog} /> + </DashboardModal.Title> + <Alert variant="error" close={false}> <Text>{intl.formatMessage(messages.unavailableSyncEvents)}</Text> </Alert> - </DialogContent> - </Dialog> + </DashboardModal.Content> + </DashboardModal> ); } return ( - <Dialog open={showDialog} fullWidth maxWidth="md" data-test-id="dry-run"> - <DialogHeader onClose={closeDialog}>{intl.formatMessage(messages.header)}</DialogHeader> - <DialogContent style={{ overflow: "scroll" }}> - <DialogContentText>{intl.formatMessage(messages.selectObject)}</DialogContentText> + <DashboardModal onChange={closeDialog} open={showDialog}> + <DashboardModal.Content size="lg" data-test-id="dry-run"> + <DashboardModal.Title display="flex" justifyContent="space-between"> + {intl.formatMessage(messages.header)} + <DashboardModal.Close onClose={closeDialog} /> + </DashboardModal.Title> + + <Text>{intl.formatMessage(messages.selectObject)}</Text> {!!unavailableObjects.length && ( <Alert variant="warning" close={false} className="remove-icon-background"> @@ -147,13 +149,14 @@ const DryRun: React.FC<DryRunProps> = ({ )} </div> </Grid> - </DialogContent> - <DialogActions> - <Button color="primary" variant="primary" onClick={dryRun} disabled={!object}> - {intl.formatMessage(messages.run)} - </Button> - </DialogActions> - </Dialog> + + <DashboardModal.Actions> + <Button color="primary" variant="primary" onClick={dryRun} disabled={!object}> + {intl.formatMessage(messages.run)} + </Button> + </DashboardModal.Actions> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/components/Form/ExitFormDialog.test.tsx b/src/components/Form/ExitFormDialog.test.tsx index 8a2b8a80a25..0cf12f1846f 100644 --- a/src/components/Form/ExitFormDialog.test.tsx +++ b/src/components/Form/ExitFormDialog.test.tsx @@ -43,7 +43,7 @@ describe("ExitFormDialog", () => { // Act const { getByTestId } = render(<ExitFormDialog {...props} />); - await user.click(getByTestId("keep-editing")); + await user.click(getByTestId("back")); // Assert expect(props.onClose).toHaveBeenCalled(); }); diff --git a/src/components/Form/ExitFormDialog.tsx b/src/components/Form/ExitFormDialog.tsx index b9589edc42f..1589fc605b5 100644 --- a/src/components/Form/ExitFormDialog.tsx +++ b/src/components/Form/ExitFormDialog.tsx @@ -1,34 +1,11 @@ -import HorizontalSpacer from "@dashboard/components/HorizontalSpacer"; -import { Button, Dialog, DialogContent, makeStyles } from "@material-ui/core"; -import { DialogHeader } from "@saleor/macaw-ui"; +import BackButton from "@dashboard/components/BackButton"; +import { DashboardModal } from "@dashboard/components/Modal"; +import { Button } from "@saleor/macaw-ui-next"; import React from "react"; import { useIntl } from "react-intl"; import { exitFormPromptMessages as messages } from "./messages"; -const useStyles = makeStyles( - () => ({ - container: { - width: "100vw", - height: "100vh", - display: "flex", - justifyContent: "center", - alignItems: "center", - }, - buttonsContainer: { - display: "flex", - justifyContent: "flex-end", - }, - dialogContent: { - "@media (min-width: 800px)": { - minWidth: 500, - }, - paddingTop: 0, - }, - }), - { name: "ExitFormPrompt" }, -); - interface ExitFormDialogProps { onClose: () => void; onLeave: () => void; @@ -36,31 +13,24 @@ interface ExitFormDialogProps { } const ExitFormDialog: React.FC<ExitFormDialogProps> = ({ onLeave, onClose, isOpen }) => { - const classes = useStyles(); const intl = useIntl(); return ( - <Dialog className={classes.container} open={isOpen} onClose={onClose}> - <DialogHeader onClose={onClose}> - {intl.formatMessage(messages.unableToSaveTitle)} - </DialogHeader> - <DialogContent className={classes.dialogContent}> - <div className={classes.buttonsContainer}> - <Button onClick={onClose} data-test-id="keep-editing"> - {intl.formatMessage(messages.keepEditing)} - </Button> - <HorizontalSpacer /> - <Button - variant="contained" - color="primary" - onClick={onLeave} - data-test-id="ignore-changes" - > + <DashboardModal open={isOpen} onChange={onClose}> + <DashboardModal.Content size="sm"> + <DashboardModal.Title display="flex" justifyContent="space-between"> + {intl.formatMessage(messages.unableToSaveTitle)} + <DashboardModal.Close onClose={onClose} /> + </DashboardModal.Title> + + <DashboardModal.Actions> + <BackButton onClick={onClose}>{intl.formatMessage(messages.keepEditing)}</BackButton> + <Button variant="primary" onClick={onLeave} data-test-id="ignore-changes"> {intl.formatMessage(messages.ignoreChanges)} </Button> - </div> - </DialogContent> - </Dialog> + </DashboardModal.Actions> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/components/Modal/Content.tsx b/src/components/Modal/Content.tsx index cbc455b4a18..964b682dda5 100644 --- a/src/components/Modal/Content.tsx +++ b/src/components/Modal/Content.tsx @@ -1,12 +1,23 @@ import { Box, Modal, PropsWithBox } from "@saleor/macaw-ui-next"; import React, { ReactNode } from "react"; +export type ContentSize = "xs" | "sm" | "md" | "lg" | "xl"; + type ContentProps = PropsWithBox<{ children: ReactNode; disableAutofocus?: boolean; + size: ContentSize; }>; -export const Content = ({ children, disableAutofocus, ...rest }: ContentProps) => { +const sizes: Record<ContentSize, number> = { + xs: 444, + sm: 600, + md: 960, + lg: 1280, + xl: 1920, +}; + +export const Content = ({ children, disableAutofocus, size, ...rest }: ContentProps) => { return ( <Modal.Content disableAutofocus={disableAutofocus}> <Box @@ -21,9 +32,12 @@ export const Content = ({ children, disableAutofocus, ...rest }: ContentProps) = borderWidth={1} borderColor="default1" padding={6} + __maxHeight="calc(100vh - 100px)" + __width="calc(100% - 64px)" display="grid" gap={6} - __maxHeight="calc(100vh - 100px)" + __maxWidth={sizes[size]} + overflowX="hidden" overflowY="auto" {...rest} > diff --git a/src/components/Modal/Grid.tsx b/src/components/Modal/Grid.tsx new file mode 100644 index 00000000000..c44999468e8 --- /dev/null +++ b/src/components/Modal/Grid.tsx @@ -0,0 +1,10 @@ +import { Box, PropsWithBox } from "@saleor/macaw-ui-next"; +import React from "react"; + +export const Grid = ({ children, ...rest }: PropsWithBox<{ children: React.ReactNode }>) => { + return ( + <Box display="grid" gap={6} width="100%" __maxHeight="calc(100vh - 150px)" {...rest}> + {children} + </Box> + ); +}; diff --git a/src/components/Modal/index.ts b/src/components/Modal/index.ts index eabccc6a813..fbcb28fd223 100644 --- a/src/components/Modal/index.ts +++ b/src/components/Modal/index.ts @@ -1,15 +1,16 @@ import { Actions } from "./Actions"; import { Close } from "./Close"; -import { Content } from "./Content"; +import { Content, ContentSize } from "./Content"; +import { Grid } from "./Grid"; import { Root } from "./Root"; import { Title } from "./Title"; -export const DASHBOARD_MODAL_WIDTH = 600; -export const DASHBOARD_MODAL_WIDTH_SMALL = 444; +export type DashboardModalContentSize = ContentSize; export const DashboardModal = Object.assign(Root, { Title, Content, Actions, Close, + Grid, }); diff --git a/src/components/NavigatorSearch/NavigatorSearch.tsx b/src/components/NavigatorSearch/NavigatorSearch.tsx index 3d21b627a77..d68594e456d 100644 --- a/src/components/NavigatorSearch/NavigatorSearch.tsx +++ b/src/components/NavigatorSearch/NavigatorSearch.tsx @@ -140,8 +140,8 @@ const NavigatorSearch: React.FC = () => { return ( <DashboardModal open={isNavigatorVisible} onChange={setNavigatorVisibility}> - <DashboardModal.Content backgroundColor="default1" padding={0}> - <Box __height="500px" __width="640px"> + <DashboardModal.Content size="sm" backgroundColor="default1" padding={0}> + <Box __height="500px" width="100%"> <Downshift itemToString={(item: QuickSearchAction) => (item ? item.label : "")} onSelect={(item: QuickSearchAction) => { diff --git a/src/components/SaveFilterTabDialog/SaveFilterTabDialog.tsx b/src/components/SaveFilterTabDialog/SaveFilterTabDialog.tsx index 017be3867c6..10ad42860ce 100644 --- a/src/components/SaveFilterTabDialog/SaveFilterTabDialog.tsx +++ b/src/components/SaveFilterTabDialog/SaveFilterTabDialog.tsx @@ -1,7 +1,7 @@ -// @ts-strict-ignore import { ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; +import { DashboardModal } from "@dashboard/components/Modal"; import { buttonMessages } from "@dashboard/intl"; -import { Dialog, DialogActions, DialogContent, DialogTitle, TextField } from "@material-ui/core"; +import { TextField } from "@material-ui/core"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -32,7 +32,7 @@ const SaveFilterTabDialog: React.FC<SaveFilterTabDialogProps> = ({ }) => { const intl = useIntl(); const [errors, setErrors] = React.useState(false); - const handleErrors = data => { + const handleErrors = (data: SaveFilterTabDialogFormData) => { if (data.name.trim().length) { onSubmit(data); setErrors(false); @@ -42,18 +42,19 @@ const SaveFilterTabDialog: React.FC<SaveFilterTabDialogProps> = ({ }; return ( - <Dialog onClose={onClose} open={open} fullWidth maxWidth="sm"> - <DialogTitle disableTypography> - <FormattedMessage - id="P9YktI" - defaultMessage="Save view preset" - description="save preset, header" - /> - </DialogTitle> - <Form initial={initialForm} onSubmit={handleErrors}> - {({ change, data, submit }) => ( - <> - <DialogContent> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="xs"> + <Form initial={initialForm} onSubmit={handleErrors}> + {({ change, data, submit }) => ( + <DashboardModal.Grid> + <DashboardModal.Title> + <FormattedMessage + id="P9YktI" + defaultMessage="Save view preset" + description="save preset, header" + /> + </DashboardModal.Title> + <TextField autoFocus fullWidth @@ -69,23 +70,24 @@ const SaveFilterTabDialog: React.FC<SaveFilterTabDialogProps> = ({ data-test-id="preset-name-text-field" helperText={errors ? "This field is required" : null} /> - </DialogContent> - <DialogActions> - <BackButton onClick={onClose} data-test-id="cancel-preset-button"> - <FormattedMessage {...buttonMessages.cancel} /> - </BackButton> - <ConfirmButton - transitionState={confirmButtonState} - onClick={submit} - data-test-id="save-preset-button" - > - <FormattedMessage {...buttonMessages.save} /> - </ConfirmButton> - </DialogActions> - </> - )} - </Form> - </Dialog> + + <DashboardModal.Actions> + <BackButton onClick={onClose} data-test-id="cancel-preset-button"> + <FormattedMessage {...buttonMessages.cancel} /> + </BackButton> + <ConfirmButton + transitionState={confirmButtonState} + onClick={submit} + data-test-id="save-preset-button" + > + <FormattedMessage {...buttonMessages.save} /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Grid> + )} + </Form> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/custom-apps/components/TokenCreateDialog/TokenCreateDialog.tsx b/src/custom-apps/components/TokenCreateDialog/TokenCreateDialog.tsx index 6a894956eb6..6990828d6e3 100644 --- a/src/custom-apps/components/TokenCreateDialog/TokenCreateDialog.tsx +++ b/src/custom-apps/components/TokenCreateDialog/TokenCreateDialog.tsx @@ -1,14 +1,12 @@ -// @ts-strict-ignore import BackButton from "@dashboard/components/BackButton"; -import CardSpacer from "@dashboard/components/CardSpacer"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import Form from "@dashboard/components/Form"; -import FormSpacer from "@dashboard/components/FormSpacer"; +import { DashboardModal } from "@dashboard/components/Modal"; import { getApiUrl } from "@dashboard/config"; import { SubmitPromise } from "@dashboard/hooks/useForm"; import useModalDialogOpen from "@dashboard/hooks/useModalDialogOpen"; import { buttonMessages } from "@dashboard/intl"; -import { Dialog, DialogActions, DialogContent, DialogTitle, TextField } from "@material-ui/core"; +import { TextField } from "@material-ui/core"; import { Box, Button, Text } from "@saleor/macaw-ui-next"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -37,11 +35,12 @@ const tokenPaperStyles = { } as const; const createHeadersString = (token: string) => `{\n "authorization": "Bearer ${token}"\n}`; + const TokenCreateDialog: React.FC<TokenCreateDialogProps> = props => { const { confirmButtonState, open, token, onClose, onCreate } = props; const [step, setStep] = React.useState<TokenCreateStep>("form"); const intl = useIntl(); - const headers = createHeadersString(token); + const headers = createHeadersString(token ?? ""); React.useEffect(() => { if (token !== undefined) { @@ -57,14 +56,15 @@ const TokenCreateDialog: React.FC<TokenCreateDialogProps> = props => { }; return ( - <Dialog open={open} fullWidth maxWidth="sm"> - <Form initial={{ name: "" }} onSubmit={data => onCreate(data.name)}> - {({ change, data, submit }) => ( - <> - <DialogTitle disableTypography> - <FormattedMessage id="T5nU7u" defaultMessage="Create Token" description="header" /> - </DialogTitle> - <DialogContent> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="sm"> + <Form initial={{ name: "" }} onSubmit={data => onCreate(data.name)}> + {({ change, data, submit }) => ( + <DashboardModal.Grid> + <DashboardModal.Title> + <FormattedMessage id="T5nU7u" defaultMessage="Create Token" description="header" /> + </DashboardModal.Title> + {step === "form" ? ( <> <Text> @@ -73,7 +73,7 @@ const TokenCreateDialog: React.FC<TokenCreateDialogProps> = props => { defaultMessage="Access token is used to authenticate service accounts" /> </Text> - <FormSpacer /> + <TextField label={intl.formatMessage({ id: "0DRBjg", @@ -93,15 +93,21 @@ const TokenCreateDialog: React.FC<TokenCreateDialogProps> = props => { defaultMessage="Make sure to save token, you won’t be able to see it again." /> </Text> - <CardSpacer /> + <Box {...tokenPaperStyles}> <Text size={4} fontWeight="medium"> <FormattedMessage id="5ZxAiY" defaultMessage="Token" /> </Text> + <Text data-test-id="generated-token" display="block"> <Mono>{token}</Mono> </Text> - <Button variant="secondary" marginTop={2} onClick={() => handleCopy(token)}> + + <Button + variant="secondary" + marginTop={2} + onClick={() => handleCopy(token ?? "")} + > <FormattedMessage id="HVFq//" defaultMessage="Copy token" @@ -109,14 +115,16 @@ const TokenCreateDialog: React.FC<TokenCreateDialogProps> = props => { /> </Button> </Box> - <CardSpacer /> + <Box {...tokenPaperStyles}> <Text size={4} fontWeight="medium"> <FormattedMessage id="Wm+KUd" defaultMessage="Headers" /> </Text> + <Text data-test-id="generated-headers" display="block"> <Mono>{headers}</Mono> </Text> + <Box display="flex" flexDirection="row" @@ -140,36 +148,36 @@ const TokenCreateDialog: React.FC<TokenCreateDialogProps> = props => { </Button> </Box> </Box> - <CardSpacer /> </> )} - </DialogContent> - <DialogActions> - {step === "form" ? ( - <> - <BackButton marginRight={1} onClick={onClose} /> - <ConfirmButton - data-test-id="submit" - transitionState={confirmButtonState} - onClick={submit} - > - <FormattedMessage - id="isM94c" - defaultMessage="Create" - description="create service token, button" - /> - </ConfirmButton> - </> - ) : ( - <Button variant="primary" onClick={onClose} data-test-id="done"> - <FormattedMessage {...buttonMessages.done} /> - </Button> - )} - </DialogActions> - </> - )} - </Form> - </Dialog> + + <DashboardModal.Actions> + {step === "form" ? ( + <> + <BackButton onClick={onClose} /> + <ConfirmButton + data-test-id="submit" + transitionState={confirmButtonState} + onClick={submit} + > + <FormattedMessage + id="isM94c" + defaultMessage="Create" + description="create service token, button" + /> + </ConfirmButton> + </> + ) : ( + <Button variant="primary" onClick={onClose} data-test-id="done"> + <FormattedMessage {...buttonMessages.done} /> + </Button> + )} + </DashboardModal.Actions> + </DashboardModal.Grid> + )} + </Form> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/customers/components/CustomerAddressDialog/CustomerAddressDialog.tsx b/src/customers/components/CustomerAddressDialog/CustomerAddressDialog.tsx index 354951bdf72..da5eb20ef81 100644 --- a/src/customers/components/CustomerAddressDialog/CustomerAddressDialog.tsx +++ b/src/customers/components/CustomerAddressDialog/CustomerAddressDialog.tsx @@ -3,7 +3,7 @@ import { createCountryHandler } from "@dashboard/components/AddressEdit/createCo import BackButton from "@dashboard/components/BackButton"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import Form from "@dashboard/components/Form"; -import { DASHBOARD_MODAL_WIDTH, DashboardModal } from "@dashboard/components/Modal"; +import { DashboardModal } from "@dashboard/components/Modal"; import { AccountErrorFragment, AddressFragment, @@ -64,62 +64,64 @@ const CustomerAddressDialog: React.FC<CustomerAddressDialogProps> = ({ return ( <DashboardModal onChange={onClose} open={open}> - <Form - initial={initialForm} - onSubmit={data => { - setCountryDisplayName(""); - handleSubmit(data); - }} - > - {({ change, set, data, submit }) => { - const countrySelect = createSingleAutocompleteSelectHandler( - change, - setCountryDisplayName, - countryChoices, - ); - const handleCountrySelect = createCountryHandler(countrySelect, set); + <DashboardModal.Content size="sm"> + <Form + initial={initialForm} + onSubmit={data => { + setCountryDisplayName(""); + handleSubmit(data); + }} + > + {({ change, set, data, submit }) => { + const countrySelect = createSingleAutocompleteSelectHandler( + change, + setCountryDisplayName, + countryChoices, + ); + const handleCountrySelect = createCountryHandler(countrySelect, set); - return ( - <DashboardModal.Content __maxWidth={DASHBOARD_MODAL_WIDTH} width="100%"> - <DashboardModal.Title> - {variant === "create" ? ( - <FormattedMessage - id="W0kQd+" - defaultMessage="Add Address" - description="dialog title" - /> - ) : ( - <FormattedMessage - id="gQGUsN" - defaultMessage="Edit Address" - description="dialog title" - /> - )} - </DashboardModal.Title> + return ( + <DashboardModal.Grid> + <DashboardModal.Title> + {variant === "create" ? ( + <FormattedMessage + id="W0kQd+" + defaultMessage="Add Address" + description="dialog title" + /> + ) : ( + <FormattedMessage + id="gQGUsN" + defaultMessage="Edit Address" + description="dialog title" + /> + )} + </DashboardModal.Title> - <AddressEdit - countries={countryChoices} - data={data} - countryDisplayValue={countryDisplayName} - errors={dialogErrors} - onChange={change} - onCountryChange={handleCountrySelect} - /> + <AddressEdit + countries={countryChoices} + data={data} + countryDisplayValue={countryDisplayName} + errors={dialogErrors} + onChange={change} + onCountryChange={handleCountrySelect} + /> - <DashboardModal.Actions> - <BackButton onClick={onClose} /> - <ConfirmButton - transitionState={confirmButtonState} - onClick={submit} - data-test-id="submit" - > - <FormattedMessage {...buttonMessages.save} /> - </ConfirmButton> - </DashboardModal.Actions> - </DashboardModal.Content> - ); - }} - </Form> + <DashboardModal.Actions> + <BackButton onClick={onClose} /> + <ConfirmButton + transitionState={confirmButtonState} + onClick={submit} + data-test-id="submit" + > + <FormattedMessage {...buttonMessages.save} /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Grid> + ); + }} + </Form> + </DashboardModal.Content> </DashboardModal> ); }; diff --git a/src/discounts/components/DiscountCountrySelectDialog/DiscountCountrySelectDialog.tsx b/src/discounts/components/DiscountCountrySelectDialog/DiscountCountrySelectDialog.tsx index 0d6814fa04c..4897486b9ce 100644 --- a/src/discounts/components/DiscountCountrySelectDialog/DiscountCountrySelectDialog.tsx +++ b/src/discounts/components/DiscountCountrySelectDialog/DiscountCountrySelectDialog.tsx @@ -1,26 +1,16 @@ -// @ts-strict-ignore import BackButton from "@dashboard/components/BackButton"; import Checkbox from "@dashboard/components/Checkbox"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import Form from "@dashboard/components/Form"; -import FormSpacer from "@dashboard/components/FormSpacer"; import Hr from "@dashboard/components/Hr"; +import { DashboardModal } from "@dashboard/components/Modal"; import ResponsiveTable from "@dashboard/components/ResponsiveTable"; import TableRowLink from "@dashboard/components/TableRowLink"; import { CountryWithCodeFragment } from "@dashboard/graphql"; import { SubmitPromise } from "@dashboard/hooks/useForm"; import { fuzzySearch } from "@dashboard/misc"; -import useScrollableDialogStyle from "@dashboard/styles/useScrollableDialogStyle"; -import { - Dialog, - DialogActions, - DialogContent, - DialogTitle, - TableBody, - TableCell, - TextField, -} from "@material-ui/core"; -import { Text } from "@saleor/macaw-ui-next"; +import { TableBody, TableCell, TextField } from "@material-ui/core"; +import { Box, Text } from "@saleor/macaw-ui-next"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -44,7 +34,6 @@ export interface DiscountCountrySelectDialogProps { const DiscountCountrySelectDialog: React.FC<DiscountCountrySelectDialogProps> = props => { const { confirmButtonState, onClose, countries, open, initial, onConfirm } = props; const classes = useStyles(props); - const scrollableDialogClasses = useScrollableDialogStyle(); const intl = useIntl(); const initialForm: FormData = { allCountries: true, @@ -53,34 +42,41 @@ const DiscountCountrySelectDialog: React.FC<DiscountCountrySelectDialogProps> = }; return ( - <Dialog onClose={onClose} open={open} fullWidth maxWidth="sm"> - <Form initial={initialForm} onSubmit={onConfirm} className={scrollableDialogClasses.form}> - {({ data, change }) => { - const countrySelectionMap = countries.reduce((acc, country) => { - acc[country.code] = !!data.countries.find( - selectedCountries => selectedCountries === country.code, + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="sm"> + <Form initial={initialForm} onSubmit={onConfirm}> + {({ data, change }) => { + const countrySelectionMap = countries.reduce( + (acc, country) => { + acc[country.code] = !!data.countries.find( + selectedCountries => selectedCountries === country.code, + ); + + return acc; + }, + {} as Record<string, boolean>, ); - return acc; - }, {}); + return ( + <DashboardModal.Grid + __gridTemplateRows="auto auto auto auto auto 1fr auto" + height="100%" + > + <DashboardModal.Title> + <FormattedMessage + id="cvVIV/" + defaultMessage="Assign Countries" + description="dialog header" + /> + </DashboardModal.Title> - return ( - <> - <DialogTitle disableTypography> - <FormattedMessage - id="cvVIV/" - defaultMessage="Assign Countries" - description="dialog header" - /> - </DialogTitle> - <DialogContent> <Text> <FormattedMessage id="dWK/Ck" defaultMessage="Choose countries, you want voucher to be limited to, from the list below" /> </Text> - <FormSpacer /> + <TextField name="query" value={data.query} @@ -97,9 +93,9 @@ const DiscountCountrySelectDialog: React.FC<DiscountCountrySelectDialogProps> = })} fullWidth /> - <FormSpacer /> + <Hr /> - <FormSpacer /> + <Text fontSize={3}> <FormattedMessage id="wgA48T" @@ -107,59 +103,61 @@ const DiscountCountrySelectDialog: React.FC<DiscountCountrySelectDialogProps> = description="country selection" /> </Text> - </DialogContent> - <DialogContent className={scrollableDialogClasses.scrollArea}> - <ResponsiveTable> - <TableBody> - {fuzzySearch(countries, data.query, ["country"]).map(country => { - const isChecked = countrySelectionMap[country.code]; - return ( - <TableRowLink key={country.code}> - <TableCell className={classes.wideCell}>{country.country}</TableCell> - <TableCell padding="checkbox" className={classes.checkboxCell}> - <Checkbox - checked={isChecked} - onChange={() => - isChecked - ? change({ - target: { - name: "countries" as keyof FormData, - value: data.countries.filter( - selectedCountries => selectedCountries !== country.code, - ), - }, - } as any) - : change({ - target: { - name: "countries" as keyof FormData, - value: [...data.countries, country.code], - }, - } as any) - } - /> - </TableCell> - </TableRowLink> - ); - })} - </TableBody> - </ResponsiveTable> - </DialogContent> - <DialogActions> - <BackButton onClick={onClose} /> - <ConfirmButton transitionState={confirmButtonState} type="submit"> - <FormattedMessage - id="zZCCqz" - defaultMessage="Assign countries" - description="button" - /> - </ConfirmButton> - </DialogActions> - </> - ); - }} - </Form> - </Dialog> + <Box height="100%" overflowY="auto"> + <ResponsiveTable> + <TableBody> + {fuzzySearch(countries, data.query, ["country"]).map(country => { + const isChecked = countrySelectionMap[country.code]; + + return ( + <TableRowLink key={country.code}> + <TableCell className={classes.wideCell}>{country.country}</TableCell> + <TableCell padding="checkbox" className={classes.checkboxCell}> + <Checkbox + checked={!!isChecked} + onChange={() => + isChecked + ? change({ + target: { + name: "countries" as keyof FormData, + value: data.countries.filter( + selectedCountries => selectedCountries !== country.code, + ), + }, + } as any) + : change({ + target: { + name: "countries" as keyof FormData, + value: [...data.countries, country.code], + }, + } as any) + } + /> + </TableCell> + </TableRowLink> + ); + })} + </TableBody> + </ResponsiveTable> + </Box> + + <DashboardModal.Actions> + <BackButton onClick={onClose} /> + <ConfirmButton transitionState={confirmButtonState} type="submit"> + <FormattedMessage + id="zZCCqz" + defaultMessage="Assign countries" + description="button" + /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Grid> + ); + }} + </Form> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/discounts/components/DiscountDeleteModal/DiscountDeleteModal.tsx b/src/discounts/components/DiscountDeleteModal/DiscountDeleteModal.tsx index 9767b9d69d7..52663812c6a 100644 --- a/src/discounts/components/DiscountDeleteModal/DiscountDeleteModal.tsx +++ b/src/discounts/components/DiscountDeleteModal/DiscountDeleteModal.tsx @@ -20,7 +20,7 @@ export const DiscountDeleteModal = ({ }: DiscountDeleteModalProps) => { return ( <DashboardModal open={open} onChange={onChange}> - <DashboardModal.Content __minWidth={490}> + <DashboardModal.Content size="xs"> <DashboardModal.Title> <FormattedMessage defaultMessage="Delete discount" id="ZrIt1W" /> </DashboardModal.Title> diff --git a/src/discounts/components/DiscountRules/componenets/RuleDeleteModal/RuleDeleteModal.tsx b/src/discounts/components/DiscountRules/componenets/RuleDeleteModal/RuleDeleteModal.tsx index f7a41613452..012abd8fd4f 100644 --- a/src/discounts/components/DiscountRules/componenets/RuleDeleteModal/RuleDeleteModal.tsx +++ b/src/discounts/components/DiscountRules/componenets/RuleDeleteModal/RuleDeleteModal.tsx @@ -1,7 +1,7 @@ import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import { DashboardModal } from "@dashboard/components/Modal"; import { buttonMessages } from "@dashboard/intl"; -import { Box, Button, Text } from "@saleor/macaw-ui-next"; +import { Button, Text } from "@saleor/macaw-ui-next"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -24,17 +24,15 @@ export const RuleDeleteModal = ({ return ( <DashboardModal open={open} onChange={onClose}> - <DashboardModal.Content data-test-id="delete-rule-dialog"> + <DashboardModal.Content size="xs" data-test-id="delete-rule-dialog"> <DashboardModal.Title display="flex" justifyContent="space-between" alignItems="center"> {intl.formatMessage(messages.deleteRule)} <DashboardModal.Close onClose={onClose} /> </DashboardModal.Title> - <Box __width={390}> - <Text> - <FormattedMessage {...messages.deleteRuleDescription} /> - </Text> - </Box> + <Text> + <FormattedMessage {...messages.deleteRuleDescription} /> + </Text> <DashboardModal.Actions> <Button onClick={onClose} variant="secondary" data-test-id="cancel-delete-rule-button"> diff --git a/src/discounts/components/DiscountRules/componenets/RuleForm/RuleForm.tsx b/src/discounts/components/DiscountRules/componenets/RuleForm/RuleForm.tsx index 3e774c16e68..fe4ae11ad2d 100644 --- a/src/discounts/components/DiscountRules/componenets/RuleForm/RuleForm.tsx +++ b/src/discounts/components/DiscountRules/componenets/RuleForm/RuleForm.tsx @@ -81,7 +81,7 @@ export const RuleForm = <ErrorCode,>({ errors, openPlayground }: RuleFormProps<E return ( <RichTextContext.Provider value={richText}> - <Box __width={650} __minHeight={515} __maxHeight="75vh" overflowY="auto"> + <Box width="100%" __minHeight={515} __maxHeight="75vh" overflowY="auto"> <Box display="flex" flexDirection="column" gap={4} marginTop={4}> <Box display="grid" __gridTemplateColumns="315px 1fr" gap={2}> <RuleInputWrapper> diff --git a/src/discounts/components/DiscountRules/componenets/RuleFormModal/RuleFormModal.tsx b/src/discounts/components/DiscountRules/componenets/RuleFormModal/RuleFormModal.tsx index cd8ec62222c..31d3d501e42 100644 --- a/src/discounts/components/DiscountRules/componenets/RuleFormModal/RuleFormModal.tsx +++ b/src/discounts/components/DiscountRules/componenets/RuleFormModal/RuleFormModal.tsx @@ -38,7 +38,7 @@ export const RuleFormModal = ({ return ( <DashboardModal open={true} onChange={onClose}> - <DashboardModal.Content data-test-id="add-rule-dialog"> + <DashboardModal.Content size="sm" data-test-id="add-rule-dialog"> <DashboardModal.Title display="flex" justifyContent="space-between" alignItems="center"> <FormattedMessage {...(initialFormValues ? messages.editRule : messages.addRule)} /> <DashboardModal.Close onClose={onClose} /> diff --git a/src/discounts/components/VoucherCodesDeleteDialog/VoucherCodesDeleteDialog.tsx b/src/discounts/components/VoucherCodesDeleteDialog/VoucherCodesDeleteDialog.tsx index d2579c895e7..58f42296cb8 100644 --- a/src/discounts/components/VoucherCodesDeleteDialog/VoucherCodesDeleteDialog.tsx +++ b/src/discounts/components/VoucherCodesDeleteDialog/VoucherCodesDeleteDialog.tsx @@ -23,7 +23,7 @@ export const VoucherCodesDeleteDialog = ({ return ( <DashboardModal open={open} onChange={onClose}> - <DashboardModal.Content> + <DashboardModal.Content size="xs"> <DashboardModal.Title> <FormattedMessage id="WMN0q+" defaultMessage="Delete voucher codes" /> </DashboardModal.Title> diff --git a/src/discounts/components/VoucherCodesGenerateDialog/VoucherCodesGenerateDialog.tsx b/src/discounts/components/VoucherCodesGenerateDialog/VoucherCodesGenerateDialog.tsx index 451a93d6747..785b55b1fe6 100644 --- a/src/discounts/components/VoucherCodesGenerateDialog/VoucherCodesGenerateDialog.tsx +++ b/src/discounts/components/VoucherCodesGenerateDialog/VoucherCodesGenerateDialog.tsx @@ -56,7 +56,7 @@ export const VoucherCodesGenerateDialog = ({ return ( <DashboardModal open={open} onChange={handleModalClose}> - <DashboardModal.Content> + <DashboardModal.Content size="xs"> <DashboardModal.Title>{intl.formatMessage(messages.title)}</DashboardModal.Title> <Box display="grid" gap={3} __width={390}> <Input diff --git a/src/discounts/components/VoucherCodesManualDialog/VoucherCodesManualDialog.tsx b/src/discounts/components/VoucherCodesManualDialog/VoucherCodesManualDialog.tsx index 3672be35a27..9c845512285 100644 --- a/src/discounts/components/VoucherCodesManualDialog/VoucherCodesManualDialog.tsx +++ b/src/discounts/components/VoucherCodesManualDialog/VoucherCodesManualDialog.tsx @@ -44,7 +44,7 @@ export const VoucherCodesManualDialog = ({ return ( <DashboardModal open={open} onChange={handleModalClose}> - <DashboardModal.Content> + <DashboardModal.Content size="xs"> <DashboardModal.Title> <FormattedMessage defaultMessage="Enter Voucher Code" id="giVGCH" /> </DashboardModal.Title> diff --git a/src/giftCards/GiftCardBulkCreateDialog/GiftCardBulkCreateDialog.tsx b/src/giftCards/GiftCardBulkCreateDialog/GiftCardBulkCreateDialog.tsx index a142223148b..c2645dab02f 100644 --- a/src/giftCards/GiftCardBulkCreateDialog/GiftCardBulkCreateDialog.tsx +++ b/src/giftCards/GiftCardBulkCreateDialog/GiftCardBulkCreateDialog.tsx @@ -108,7 +108,7 @@ const GiftCardBulkCreateDialog: React.FC<DialogProps> = ({ onClose, open }) => { return ( <> <DashboardModal open={open} onChange={onClose}> - <DashboardModal.Content __maxWidth={600} __width="calc(100% - 64px)"> + <DashboardModal.Content size="sm"> <DashboardModal.Title>{intl.formatMessage(messages.title)}</DashboardModal.Title> <ContentWithProgress> {!loadingChannelCurrencies && ( diff --git a/src/giftCards/GiftCardCreateDialog/GiftCardBulkCreateSuccessDialog.tsx b/src/giftCards/GiftCardCreateDialog/GiftCardBulkCreateSuccessDialog.tsx index 65ceac00332..a8f0f7185e0 100644 --- a/src/giftCards/GiftCardCreateDialog/GiftCardBulkCreateSuccessDialog.tsx +++ b/src/giftCards/GiftCardCreateDialog/GiftCardBulkCreateSuccessDialog.tsx @@ -1,6 +1,6 @@ import { Button } from "@dashboard/components/Button"; +import { DashboardModal } from "@dashboard/components/Modal"; import { DialogProps } from "@dashboard/types"; -import { Dialog, DialogActions, DialogContent, DialogTitle } from "@material-ui/core"; import { Text } from "@saleor/macaw-ui-next"; import React, { useState } from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -26,25 +26,28 @@ const GiftCardBulkCreateSuccessDialog: React.FC<GiftCardBulkCreateSuccessDialogP return ( <> - <Dialog open={open} maxWidth="sm"> - <DialogTitle disableTypography> - {intl.formatMessage(messages.bulkCreateIssuedTitle)} - </DialogTitle> - <DialogContent> + <DashboardModal open={open} onChange={onClose}> + <DashboardModal.Content size="sm"> + <DashboardModal.Title> + {intl.formatMessage(messages.bulkCreateIssuedTitle)} + </DashboardModal.Title> + <Text>{intl.formatMessage(messages.bulkCreateIssuedExplanation)}</Text> - </DialogContent> - <DialogActions> - <Button variant="secondary" onClick={() => setOpenEmailExport(true)}> - <FormattedMessage {...messages.bulkCreateIssuedExportToEmail} /> - </Button> - <Button variant="primary" onClick={onClose}> - <FormattedMessage {...messages.bulkCreateIssuedAccept} /> - </Button> - </DialogActions> - </Dialog> - <Dialog open={openEmailExport} maxWidth="sm"> + + <DashboardModal.Actions> + <Button variant="secondary" onClick={() => setOpenEmailExport(true)}> + <FormattedMessage {...messages.bulkCreateIssuedExportToEmail} /> + </Button> + <Button variant="primary" onClick={onClose}> + <FormattedMessage {...messages.bulkCreateIssuedAccept} /> + </Button> + </DashboardModal.Actions> + </DashboardModal.Content> + </DashboardModal> + + <DashboardModal onChange={onExportDialogClose} open={openEmailExport}> <GiftCardExportDialogContent idsToExport={idsToExport} onClose={onExportDialogClose} /> - </Dialog> + </DashboardModal> </> ); }; diff --git a/src/giftCards/GiftCardCreateDialog/GiftCardCreateDialogContent.tsx b/src/giftCards/GiftCardCreateDialog/GiftCardCreateDialogContent.tsx index b2c56e2179d..9398f2d2ab3 100644 --- a/src/giftCards/GiftCardCreateDialog/GiftCardCreateDialogContent.tsx +++ b/src/giftCards/GiftCardCreateDialog/GiftCardCreateDialogContent.tsx @@ -1,5 +1,5 @@ // @ts-strict-ignore -import { DASHBOARD_MODAL_WIDTH, DashboardModal } from "@dashboard/components/Modal"; +import { DashboardModal } from "@dashboard/components/Modal"; import { GiftCardCreateInput, useGiftCardCreateMutation } from "@dashboard/graphql"; import useCurrentDate from "@dashboard/hooks/useCurrentDate"; import useNotifier from "@dashboard/hooks/useNotifier"; @@ -76,11 +76,7 @@ const GiftCardCreateDialogContent: React.FC<GiftCardCreateDialogContentProps> = }; return ( - <DashboardModal.Content - __maxWidth={DASHBOARD_MODAL_WIDTH} - width="100%" - data-test-id="gift-card-dialog" - > + <DashboardModal.Content size="sm" data-test-id="gift-card-dialog"> <DashboardModal.Title>{intl.formatMessage(messages.title)}</DashboardModal.Title> {cardCode ? ( <GiftCardCreateDialogCodeContent cardCode={cardCode} onClose={handleClose} /> diff --git a/src/giftCards/GiftCardExportDialogContent/GiftCardExportDialogContent.tsx b/src/giftCards/GiftCardExportDialogContent/GiftCardExportDialogContent.tsx index d03992a7732..8c0c4ad2297 100644 --- a/src/giftCards/GiftCardExportDialogContent/GiftCardExportDialogContent.tsx +++ b/src/giftCards/GiftCardExportDialogContent/GiftCardExportDialogContent.tsx @@ -1,4 +1,5 @@ import { ConfirmButton } from "@dashboard/components/ConfirmButton"; +import { DashboardModal } from "@dashboard/components/Modal"; import { Task } from "@dashboard/containers/BackgroundTasks/types"; import { useExportGiftCardsMutation, useGiftCardTotalCountQuery } from "@dashboard/graphql"; import useBackgroundTask from "@dashboard/hooks/useBackgroundTask"; @@ -11,7 +12,6 @@ import { exportSettingsInitialFormDataWithIds, } from "@dashboard/products/components/ProductExportDialog/types"; import { DialogProps } from "@dashboard/types"; -import { DialogActions, DialogContent, DialogTitle } from "@material-ui/core"; import { Text } from "@saleor/macaw-ui-next"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -98,34 +98,35 @@ const GiftCardExportDialog: React.FC< }; return ( - <> - <DialogTitle disableTypography> + <DashboardModal.Content size="sm"> + <DashboardModal.Title> <FormattedMessage {...messages.title} /> - </DialogTitle> - <DialogContent> - <ContentWithProgress> - {!loading && ( - <> - <ExportDialogSettings - errors={exportGiftCardsOpts?.data?.exportGiftCards?.errors ?? []} - onChange={change} - selectedItems={selectedIds?.length} - data={data} - exportScopeLabels={exportScopeLabels} - allowScopeSelection={!hasIdsToExport} - itemsQuantity={{ - filter: filteredGiftCardsCount, - all: allGiftCardsCount, - }} - /> - <Text className={classes.note} fontSize={3}> - {intl.formatMessage(messages.exportNote)} - </Text> - </> - )} - </ContentWithProgress> - </DialogContent> - <DialogActions> + </DashboardModal.Title> + + <ContentWithProgress> + {!loading && ( + <> + <ExportDialogSettings + errors={exportGiftCardsOpts?.data?.exportGiftCards?.errors ?? []} + onChange={change} + selectedItems={selectedIds?.length} + data={data} + exportScopeLabels={exportScopeLabels} + allowScopeSelection={!hasIdsToExport} + itemsQuantity={{ + filter: filteredGiftCardsCount, + all: allGiftCardsCount, + }} + /> + + <Text className={classes.note} fontSize={3}> + {intl.formatMessage(messages.exportNote)} + </Text> + </> + )} + </ContentWithProgress> + + <DashboardModal.Actions> <ConfirmButton transitionState={exportGiftCardsOpts.status} variant="primary" @@ -135,8 +136,8 @@ const GiftCardExportDialog: React.FC< > <FormattedMessage {...messages.confirmButtonLabel} /> </ConfirmButton> - </DialogActions> - </> + </DashboardModal.Actions> + </DashboardModal.Content> ); }; diff --git a/src/giftCards/GiftCardUpdate/GiftCardResendCodeDialog/GiftCardResendCodeDialog.tsx b/src/giftCards/GiftCardUpdate/GiftCardResendCodeDialog/GiftCardResendCodeDialog.tsx index ea7cb8ee5e8..ace1b84766e 100644 --- a/src/giftCards/GiftCardUpdate/GiftCardResendCodeDialog/GiftCardResendCodeDialog.tsx +++ b/src/giftCards/GiftCardUpdate/GiftCardResendCodeDialog/GiftCardResendCodeDialog.tsx @@ -106,7 +106,6 @@ const GiftCardResendCodeDialog: React.FC<DialogProps> = ({ open, onClose }) => { title={intl.formatMessage(messages.title)} confirmButtonState={status} disabled={loading} - size="lg" > {loadingChannels ? ( <div className={progressClasses.progressContainer}> diff --git a/src/giftCards/GiftCardUpdate/GiftCardUpdateBalanceDialog/GiftCardUpdateBalanceDialog.tsx b/src/giftCards/GiftCardUpdate/GiftCardUpdateBalanceDialog/GiftCardUpdateBalanceDialog.tsx index 2386f2c9788..2f5c6d83a1e 100644 --- a/src/giftCards/GiftCardUpdate/GiftCardUpdateBalanceDialog/GiftCardUpdateBalanceDialog.tsx +++ b/src/giftCards/GiftCardUpdate/GiftCardUpdateBalanceDialog/GiftCardUpdateBalanceDialog.tsx @@ -89,7 +89,6 @@ const GiftCardUpdateBalanceDialog: React.FC<DialogProps> = ({ open, onClose }) = title={intl.formatMessage(messages.title)} confirmButtonState={status} disabled={loading} - size="lg" > <Text>{intl.formatMessage(messages.subtitle)}</Text> <CardSpacer /> diff --git a/src/giftCards/GiftCardsList/providers/GiftCardListDialogsProvider/GiftCardListDialogsProvider.tsx b/src/giftCards/GiftCardsList/providers/GiftCardListDialogsProvider/GiftCardListDialogsProvider.tsx index e19dd8a300b..7671df2410a 100644 --- a/src/giftCards/GiftCardsList/providers/GiftCardListDialogsProvider/GiftCardListDialogsProvider.tsx +++ b/src/giftCards/GiftCardsList/providers/GiftCardListDialogsProvider/GiftCardListDialogsProvider.tsx @@ -6,7 +6,6 @@ import GiftCardExportDialogContent from "@dashboard/giftCards/GiftCardExportDial import { giftCardListUrl } from "@dashboard/giftCards/urls"; import useNavigator from "@dashboard/hooks/useNavigator"; import createDialogActionHandlers from "@dashboard/utils/handlers/dialogActionHandlers"; -import { Dialog } from "@material-ui/core"; import React, { createContext, useContext } from "react"; import { GIFT_CARD_LIST_QUERY } from "../../queries"; @@ -78,9 +77,9 @@ const GiftCardListDialogsProvider: React.FC<GiftCardListDialogsProviderProps> = <GiftCardCreateDialogContent onClose={onClose} refetchQueries={[GIFT_CARD_LIST_QUERY]} /> </DashboardModal> <GiftCardListPageDeleteDialog open={isDialogOpen(DELETE)} onClose={onClose} /> - <Dialog open={isDialogOpen(EXPORT)} maxWidth="sm" onClose={onClose} fullWidth> + <DashboardModal open={isDialogOpen(EXPORT)} onChange={onClose}> <GiftCardExportDialogContent onClose={onClose} /> - </Dialog> + </DashboardModal> <GiftCardBulkCreateDialog open={isDialogOpen(BULK_CREATE)} onClose={onClose} /> </GiftCardListDialogsContext.Provider> ); diff --git a/src/navigation/components/MenuCreateDialog/MenuCreateDialog.tsx b/src/navigation/components/MenuCreateDialog/MenuCreateDialog.tsx index f75ed4b4c38..17421a42c50 100644 --- a/src/navigation/components/MenuCreateDialog/MenuCreateDialog.tsx +++ b/src/navigation/components/MenuCreateDialog/MenuCreateDialog.tsx @@ -1,11 +1,13 @@ import BackButton from "@dashboard/components/BackButton"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import Form from "@dashboard/components/Form"; +import { DashboardModal } from "@dashboard/components/Modal"; import { MenuErrorFragment } from "@dashboard/graphql"; import { buttonMessages } from "@dashboard/intl"; import { getFormErrors } from "@dashboard/utils/errors"; import getMenuErrorMessage from "@dashboard/utils/errors/menu"; -import { Dialog, DialogActions, DialogContent, DialogTitle, TextField } from "@material-ui/core"; +import { TextField } from "@material-ui/core"; +import { Box } from "@saleor/macaw-ui-next"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -37,14 +39,19 @@ const MenuCreateDialog: React.FC<MenuCreateDialogProps> = ({ const formErrors = getFormErrors(["name"], errors); return ( - <Dialog onClose={onClose} maxWidth="sm" fullWidth open={open}> - <DialogTitle disableTypography data-test-id="create-menu-dialog-title"> - <FormattedMessage id="0OtaXa" defaultMessage="Create Menu" description="dialog header" /> - </DialogTitle> - <Form initial={initialForm} onSubmit={onConfirm}> - {({ change, data, submit }) => ( - <> - <DialogContent> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="sm"> + <Form initial={initialForm} onSubmit={onConfirm}> + {({ change, data, submit }) => ( + <Box display="grid" gap={6}> + <DashboardModal.Title data-test-id="create-menu-dialog-title"> + <FormattedMessage + id="0OtaXa" + defaultMessage="Create Menu" + description="dialog header" + /> + </DashboardModal.Title> + <TextField data-test-id="menu-name-input" disabled={disabled} @@ -59,21 +66,22 @@ const MenuCreateDialog: React.FC<MenuCreateDialogProps> = ({ value={data.name} onChange={change} /> - </DialogContent> - <DialogActions> - <BackButton onClick={onClose} /> - <ConfirmButton - transitionState={confirmButtonState} - onClick={submit} - data-test-id="submit" - > - <FormattedMessage {...buttonMessages.save} /> - </ConfirmButton> - </DialogActions> - </> - )} - </Form> - </Dialog> + + <DashboardModal.Actions> + <BackButton onClick={onClose} /> + <ConfirmButton + transitionState={confirmButtonState} + onClick={submit} + data-test-id="submit" + > + <FormattedMessage {...buttonMessages.save} /> + </ConfirmButton> + </DashboardModal.Actions> + </Box> + )} + </Form> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/navigation/components/MenuItemDialog/MenuItemDialog.tsx b/src/navigation/components/MenuItemDialog/MenuItemDialog.tsx index 94c7c25ad01..e2ee5e48586 100644 --- a/src/navigation/components/MenuItemDialog/MenuItemDialog.tsx +++ b/src/navigation/components/MenuItemDialog/MenuItemDialog.tsx @@ -207,6 +207,7 @@ const MenuItemDialog: React.FC<MenuItemDialogProps> = ({ const handleSubmit = () => onSubmit(data); return ( + // TODO: MERX-813 Replace Dialog and AutocompleteSelectMenu <Dialog onClose={onClose} open={open} diff --git a/src/orders/components/OrderCancelDialog/OrderCancelDialog.tsx b/src/orders/components/OrderCancelDialog/OrderCancelDialog.tsx index 6b23317f186..b570201cb71 100644 --- a/src/orders/components/OrderCancelDialog/OrderCancelDialog.tsx +++ b/src/orders/components/OrderCancelDialog/OrderCancelDialog.tsx @@ -33,7 +33,7 @@ export const OrderCancelDialog: React.FC<OrderCancelDialogProps> = props => { return ( <DashboardModal onChange={onClose} open={open}> - <DashboardModal.Content> + <DashboardModal.Content size="sm"> <DashboardModal.Title data-test-id="dialog-title"> <FormattedMessage {...cancelOrderDialogMessages.dialogTitle} values={{ orderNumber }} /> </DashboardModal.Title> @@ -47,7 +47,7 @@ export const OrderCancelDialog: React.FC<OrderCancelDialogProps> = props => { </Text> {errors.length > 0 && errors.map((err, index) => ( - <Text color="critical1" key={index} data-test-id="dialog-error"> + <Text display="block" color="critical1" key={index} data-test-id="dialog-error"> {getOrderErrorMessage(err, intl)} </Text> ))} diff --git a/src/orders/components/OrderCannotCancelOrderDialog/OrderCannotCancelOrderDialog.tsx b/src/orders/components/OrderCannotCancelOrderDialog/OrderCannotCancelOrderDialog.tsx index c35830277eb..5734cc952f0 100644 --- a/src/orders/components/OrderCannotCancelOrderDialog/OrderCannotCancelOrderDialog.tsx +++ b/src/orders/components/OrderCannotCancelOrderDialog/OrderCannotCancelOrderDialog.tsx @@ -1,53 +1,36 @@ -import { Button } from "@dashboard/components/Button"; +import { DashboardModal } from "@dashboard/components/Modal"; import { buttonMessages } from "@dashboard/intl"; import { DialogProps } from "@dashboard/types"; -import { - Dialog, - DialogActions, - DialogContent, - DialogContentText, - DialogTitle, -} from "@material-ui/core"; -import { makeStyles } from "@saleor/macaw-ui"; +import { Button, Text } from "@saleor/macaw-ui-next"; import React from "react"; import { FormattedMessage } from "react-intl"; -const useStyles = makeStyles( - theme => ({ - button: { - backgroundColor: theme.palette.error.main, - }, - }), - { - name: "OrderCannotCancelOrderDialog", - }, -); const OrderCannotCancelOrderDialog: React.FC<DialogProps> = ({ open, onClose }) => { - const classes = useStyles({}); - return ( - <Dialog onClose={onClose} open={open} maxWidth="sm"> - <DialogTitle disableTypography> - <FormattedMessage - id="NhQboB" - defaultMessage="Saleor couldn’t cancel order" - description="dialog header" - /> - </DialogTitle> - <DialogContent> - <DialogContentText> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="sm"> + <DashboardModal.Title> + <FormattedMessage + id="NhQboB" + defaultMessage="Saleor couldn’t cancel order" + description="dialog header" + /> + </DashboardModal.Title> + + <Text> <FormattedMessage id="b+jcaN" defaultMessage="There are still fulfillments created for this order. Cancel the fulfillments first before you cancel the order." /> - </DialogContentText> - </DialogContent> - <DialogActions> - <Button variant="primary" className={classes.button} onClick={onClose}> - <FormattedMessage {...buttonMessages.ok} /> - </Button> - </DialogActions> - </Dialog> + </Text> + + <DashboardModal.Actions> + <Button variant="error" onClick={onClose}> + <FormattedMessage {...buttonMessages.ok} /> + </Button> + </DashboardModal.Actions> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/orders/components/OrderChangeWarehouseDialog/OrderChangeWarehouseDialog.tsx b/src/orders/components/OrderChangeWarehouseDialog/OrderChangeWarehouseDialog.tsx index 09279f6ec95..b53aee503a7 100644 --- a/src/orders/components/OrderChangeWarehouseDialog/OrderChangeWarehouseDialog.tsx +++ b/src/orders/components/OrderChangeWarehouseDialog/OrderChangeWarehouseDialog.tsx @@ -1,6 +1,6 @@ // @ts-strict-ignore import Debounce from "@dashboard/components/Debounce"; -import { DASHBOARD_MODAL_WIDTH, DashboardModal } from "@dashboard/components/Modal"; +import { DashboardModal } from "@dashboard/components/Modal"; import TableRowLink from "@dashboard/components/TableRowLink"; import { OrderFulfillLineFragment, WarehouseFragment } from "@dashboard/graphql"; import { buttonMessages } from "@dashboard/intl"; @@ -13,16 +13,11 @@ import { InputAdornment, Radio, RadioGroup, + Table, TableCell, TextField, } from "@material-ui/core"; -import { - Button, - DialogTable, - isScrolledToBottom, - SearchIcon, - useElementScroll, -} from "@saleor/macaw-ui"; +import { Button, isScrolledToBottom, SearchIcon, useElementScroll } from "@saleor/macaw-ui"; import { Box, Skeleton, Text } from "@saleor/macaw-ui-next"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -88,7 +83,7 @@ export const OrderChangeWarehouseDialog: React.FC<OrderChangeWarehouseDialogProp return ( <DashboardModal open={open} onChange={onClose}> - <DashboardModal.Content __width={DASHBOARD_MODAL_WIDTH}> + <DashboardModal.Content size="sm" __gridTemplateRows="auto auto auto auto 1fr"> <DashboardModal.Title> <Box display="flex" justifyContent="space-between"> <FormattedMessage {...messages.dialogTitle} /> @@ -138,53 +133,55 @@ export const OrderChangeWarehouseDialog: React.FC<OrderChangeWarehouseDialogProp <FormattedMessage {...messages.warehouseListLabel} /> </Text> - <DialogTable ref={setAnchor}> - {filteredWarehouses ? ( - <RadioGroup - value={selectedWarehouseId} - onChange={handleChange} - className={classes.tableBody} - > - {filteredWarehouses.map(warehouse => { - const lineQuantityInWarehouse = getLineAvailableQuantityInWarehouse( - line, - warehouse, - ); + <Box ref={setAnchor} overflowY="auto"> + <Table> + {filteredWarehouses ? ( + <RadioGroup + value={selectedWarehouseId} + onChange={handleChange} + className={classes.tableBody} + > + {filteredWarehouses.map(warehouse => { + const lineQuantityInWarehouse = getLineAvailableQuantityInWarehouse( + line, + warehouse, + ); - return ( - <TableRowLink key={warehouse.id}> - <TableCell className={classes.tableCell}> - <FormControlLabel - value={warehouse.id} - control={<Radio color="primary" />} - label={ - <div className={classes.radioLabelContainer}> - <span className={classes.warehouseName}>{warehouse.name}</span> - <Text> - <FormattedMessage - {...messages.productAvailability} - values={{ - productCount: lineQuantityInWarehouse, - }} - /> - </Text> - </div> - } - /> - {currentWarehouseId === warehouse?.id && ( - <Text display="inline-block" fontSize={3}> - <FormattedMessage {...messages.currentSelection} /> - </Text> - )} - </TableCell> - </TableRowLink> - ); - })} - </RadioGroup> - ) : ( - <Skeleton /> - )} - </DialogTable> + return ( + <TableRowLink key={warehouse.id}> + <TableCell className={classes.tableCell}> + <FormControlLabel + value={warehouse.id} + control={<Radio color="primary" />} + label={ + <div className={classes.radioLabelContainer}> + <span className={classes.warehouseName}>{warehouse.name}</span> + <Text> + <FormattedMessage + {...messages.productAvailability} + values={{ + productCount: lineQuantityInWarehouse, + }} + /> + </Text> + </div> + } + /> + {currentWarehouseId === warehouse?.id && ( + <Text display="inline-block" fontSize={3}> + <FormattedMessage {...messages.currentSelection} /> + </Text> + )} + </TableCell> + </TableRowLink> + ); + })} + </RadioGroup> + ) : ( + <Skeleton /> + )} + </Table> + </Box> <DashboardModal.Actions> <Button diff --git a/src/orders/components/OrderCustomerAddressesEditDialog/OrderCustomerAddressesEditDialog.tsx b/src/orders/components/OrderCustomerAddressesEditDialog/OrderCustomerAddressesEditDialog.tsx index 68a5b9bf497..6dc3c0a1d3f 100644 --- a/src/orders/components/OrderCustomerAddressesEditDialog/OrderCustomerAddressesEditDialog.tsx +++ b/src/orders/components/OrderCustomerAddressesEditDialog/OrderCustomerAddressesEditDialog.tsx @@ -2,7 +2,7 @@ import Checkbox from "@dashboard/components/Checkbox"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import FormSpacer from "@dashboard/components/FormSpacer"; -import { DASHBOARD_MODAL_WIDTH, DashboardModal } from "@dashboard/components/Modal"; +import { DashboardModal } from "@dashboard/components/Modal"; import { AddressTypeInput } from "@dashboard/customers/types"; import { AddressFragment, @@ -218,188 +218,190 @@ const OrderCustomerAddressesEditDialog: React.FC<OrderCustomerAddressesEditDialo return ( <DashboardModal onChange={exitModal} open={open}> - <OrderCustomerAddressesEditForm - countryChoices={countryChoices} - countries={countries} - defaultShippingAddress={validatedDefaultShippingAddress} - defaultBillingAddress={validatedDefaultBillingAddress} - defaultCloneAddress={hasCustomerChanged} - initial={{ - shippingAddress: orderShippingAddress, - billingAddress: orderBillingAddress, - }} - onSubmit={handleContinue} - > - {({ change, data, handlers, submit }) => { - const shippingAddressEditProps = getAddressEditProps( - "shipping", - data, - handlers, - change, - dialogErrors, - setAddressSearchState, - addressEditCommonProps, - ); - const billingAddressEditProps = getAddressEditProps( - "billing", - data, - handlers, - change, - dialogErrors, - setAddressSearchState, - addressEditCommonProps, - ); + <DashboardModal.Content size="sm"> + <OrderCustomerAddressesEditForm + countryChoices={countryChoices} + countries={countries} + defaultShippingAddress={validatedDefaultShippingAddress} + defaultBillingAddress={validatedDefaultBillingAddress} + defaultCloneAddress={hasCustomerChanged} + initial={{ + shippingAddress: orderShippingAddress, + billingAddress: orderBillingAddress, + }} + onSubmit={handleContinue} + > + {({ change, data, handlers, submit }) => { + const shippingAddressEditProps = getAddressEditProps( + "shipping", + data, + handlers, + change, + dialogErrors, + setAddressSearchState, + addressEditCommonProps, + ); + const billingAddressEditProps = getAddressEditProps( + "billing", + data, + handlers, + change, + dialogErrors, + setAddressSearchState, + addressEditCommonProps, + ); - return ( - <DashboardModal.Content __maxWidth={DASHBOARD_MODAL_WIDTH} width="100%"> - <DashboardModal.Title> - <FormattedMessage {...getDialogTitle()} /> - </DashboardModal.Title> + return ( + <DashboardModal.Grid> + <DashboardModal.Title> + <FormattedMessage {...getDialogTitle()} /> + </DashboardModal.Title> - {addressSearchState.open ? ( - <OrderCustomerAddressesSearch - openFromCustomerChange={hasCustomerChanged} - type={addressSearchState?.type} - cloneAddress={data.cloneAddress} - formChange={change} - transitionState={confirmButtonState} - customerAddresses={customerAddresses} - selectedCustomerAddressId={ - addressSearchState.type === AddressTypeEnum.SHIPPING - ? data.customerShippingAddress?.id - : data.customerBillingAddress?.id - } - onChangeCustomerShippingAddress={customerAddress => - handlers.changeCustomerAddress(customerAddress, "customerShippingAddress") - } - onChangeCustomerBillingAddress={customerAddress => - handlers.changeCustomerAddress(customerAddress, "customerBillingAddress") - } - exitSearch={() => setAddressSearchState(defaultSearchState)} - /> - ) : ( - <> - <Text> - <FormattedMessage {...getDialogDescription()} /> - </Text> + {addressSearchState.open ? ( + <OrderCustomerAddressesSearch + openFromCustomerChange={hasCustomerChanged} + type={addressSearchState?.type} + cloneAddress={data.cloneAddress} + formChange={change} + transitionState={confirmButtonState} + customerAddresses={customerAddresses} + selectedCustomerAddressId={ + addressSearchState.type === AddressTypeEnum.SHIPPING + ? data.customerShippingAddress?.id + : data.customerBillingAddress?.id + } + onChangeCustomerShippingAddress={customerAddress => + handlers.changeCustomerAddress(customerAddress, "customerShippingAddress") + } + onChangeCustomerBillingAddress={customerAddress => + handlers.changeCustomerAddress(customerAddress, "customerBillingAddress") + } + exitSearch={() => setAddressSearchState(defaultSearchState)} + /> + ) : ( + <> + <Text> + <FormattedMessage {...getDialogDescription()} /> + </Text> - {hasCustomerChanged && ( - <> - <OrderCustomerAddressEdit {...shippingAddressEditProps} /> - <Divider /> - <FormControlLabel - control={ - <Checkbox - checked={data.cloneAddress} - name="billingSameAsShipping" - onChange={() => - change({ - target: { - name: "cloneAddress", - value: !data.cloneAddress, - }, - }) - } - data-test-id="billing-same-as-shipping" - /> - } - label={intl.formatMessage(dialogMessages.billingSameAsShipping)} - /> - {!data.cloneAddress && ( - <> - <Text> - {customerAddresses.length > 0 ? ( - <FormattedMessage - {...dialogMessages.customerChangeBillingDescription} - /> - ) : ( - <FormattedMessage {...dialogMessages.noAddressBillingDescription} /> - )} - </Text> - <OrderCustomerAddressEdit {...billingAddressEditProps} /> - </> - )} - </> - )} + {hasCustomerChanged && ( + <> + <OrderCustomerAddressEdit {...shippingAddressEditProps} /> + <Divider /> + <FormControlLabel + control={ + <Checkbox + checked={data.cloneAddress} + name="billingSameAsShipping" + onChange={() => + change({ + target: { + name: "cloneAddress", + value: !data.cloneAddress, + }, + }) + } + data-test-id="billing-same-as-shipping" + /> + } + label={intl.formatMessage(dialogMessages.billingSameAsShipping)} + /> + {!data.cloneAddress && ( + <> + <Text> + {customerAddresses.length > 0 ? ( + <FormattedMessage + {...dialogMessages.customerChangeBillingDescription} + /> + ) : ( + <FormattedMessage {...dialogMessages.noAddressBillingDescription} /> + )} + </Text> + <OrderCustomerAddressEdit {...billingAddressEditProps} /> + </> + )} + </> + )} - {variant === AddressEditDialogVariant.CHANGE_SHIPPING_ADDRESS && ( - <> - <OrderCustomerAddressEdit {...shippingAddressEditProps} /> - {data.shippingAddressInputOption === AddressInputOptionEnum.NEW_ADDRESS && ( - <> - <FormControlLabel - control={ - <Checkbox - checked={data.cloneAddress} - name="billingSameAsShipping" - onChange={() => - change({ - target: { - name: "cloneAddress", - value: !data.cloneAddress, - }, - }) - } - data-test-id="billing-same-as-shipping" - /> - } - label={intl.formatMessage(dialogMessages.billingSameAsShipping)} - /> - </> - )} - </> - )} + {variant === AddressEditDialogVariant.CHANGE_SHIPPING_ADDRESS && ( + <> + <OrderCustomerAddressEdit {...shippingAddressEditProps} /> + {data.shippingAddressInputOption === AddressInputOptionEnum.NEW_ADDRESS && ( + <> + <FormControlLabel + control={ + <Checkbox + checked={data.cloneAddress} + name="billingSameAsShipping" + onChange={() => + change({ + target: { + name: "cloneAddress", + value: !data.cloneAddress, + }, + }) + } + data-test-id="billing-same-as-shipping" + /> + } + label={intl.formatMessage(dialogMessages.billingSameAsShipping)} + /> + </> + )} + </> + )} - {variant === AddressEditDialogVariant.CHANGE_BILLING_ADDRESS && ( - <> - <OrderCustomerAddressEdit {...billingAddressEditProps} /> - {data.shippingAddressInputOption === AddressInputOptionEnum.NEW_ADDRESS && ( - <> - <FormSpacer /> - <Divider /> - <FormControlLabel - control={ - <Checkbox - checked={data.cloneAddress} - name="shippingSameAsBilling" - onChange={() => - change({ - target: { - name: "cloneAddress", - value: !data.cloneAddress, - }, - }) - } - data-test-id="billing-same-as-shipping" - /> - } - label={intl.formatMessage(dialogMessages.shippingSameAsBilling)} - /> - </> - )} - </> - )} + {variant === AddressEditDialogVariant.CHANGE_BILLING_ADDRESS && ( + <> + <OrderCustomerAddressEdit {...billingAddressEditProps} /> + {data.shippingAddressInputOption === AddressInputOptionEnum.NEW_ADDRESS && ( + <> + <FormSpacer /> + <Divider /> + <FormControlLabel + control={ + <Checkbox + checked={data.cloneAddress} + name="shippingSameAsBilling" + onChange={() => + change({ + target: { + name: "cloneAddress", + value: !data.cloneAddress, + }, + }) + } + data-test-id="billing-same-as-shipping" + /> + } + label={intl.formatMessage(dialogMessages.shippingSameAsBilling)} + /> + </> + )} + </> + )} - <DashboardModal.Actions> - <ConfirmButton - transitionState={confirmButtonState} - variant="primary" - onClick={submit} - data-test-id="submit" - > - <FormattedMessage - {...(continueToSearchAddressesState(data) - ? buttonMessages.continue - : buttonMessages.save)} - /> - </ConfirmButton> - </DashboardModal.Actions> - </> - )} - </DashboardModal.Content> - ); - }} - </OrderCustomerAddressesEditForm> + <DashboardModal.Actions> + <ConfirmButton + transitionState={confirmButtonState} + variant="primary" + onClick={submit} + data-test-id="submit" + > + <FormattedMessage + {...(continueToSearchAddressesState(data) + ? buttonMessages.continue + : buttonMessages.save)} + /> + </ConfirmButton> + </DashboardModal.Actions> + </> + )} + </DashboardModal.Grid> + ); + }} + </OrderCustomerAddressesEditForm> + </DashboardModal.Content> </DashboardModal> ); }; diff --git a/src/orders/components/OrderCustomerChangeDialog/OrderCustomerChangeDialog.tsx b/src/orders/components/OrderCustomerChangeDialog/OrderCustomerChangeDialog.tsx index 5a42c753f2c..5f917d3cef0 100644 --- a/src/orders/components/OrderCustomerChangeDialog/OrderCustomerChangeDialog.tsx +++ b/src/orders/components/OrderCustomerChangeDialog/OrderCustomerChangeDialog.tsx @@ -1,17 +1,8 @@ -// @ts-strict-ignore import { ConfirmButton } from "@dashboard/components/ConfirmButton"; -import FormSpacer from "@dashboard/components/FormSpacer"; +import { DashboardModal } from "@dashboard/components/Modal"; import { buttonMessages } from "@dashboard/intl"; -import { - Dialog, - DialogActions, - DialogContent, - DialogTitle, - FormControlLabel, - Radio, - RadioGroup, -} from "@material-ui/core"; -import { Text } from "@saleor/macaw-ui-next"; +import { FormControlLabel, Radio, RadioGroup } from "@material-ui/core"; +import { Box, Text } from "@saleor/macaw-ui-next"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -31,18 +22,17 @@ const OrderCustomerChangeDialog: React.FC<OrderCustomerChangeDialogProps> = prop const intl = useIntl(); return ( - <Dialog onClose={onClose} open={open}> - <OrderCustomerChangeForm onSubmit={onConfirm}> - {({ change, data }) => ( - <> - <DialogTitle disableTypography> - <FormattedMessage {...messages.title} /> - </DialogTitle> - <DialogContent className={classes.overflow}> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="sm"> + <OrderCustomerChangeForm onSubmit={onConfirm}> + {({ change, data }) => ( + <Box display="grid" gap={6}> + <DashboardModal.Title> + <FormattedMessage {...messages.title} /> + </DashboardModal.Title> <Text> <FormattedMessage {...messages.description} /> </Text> - <FormSpacer /> <RadioGroup className={classes.container} value={data.changeActionOption} @@ -62,16 +52,16 @@ const OrderCustomerChangeDialog: React.FC<OrderCustomerChangeDialogProps> = prop className={classes.optionLabel} /> </RadioGroup> - </DialogContent> - <DialogActions> - <ConfirmButton transitionState="default" type="submit"> - <FormattedMessage {...buttonMessages.continue} /> - </ConfirmButton> - </DialogActions> - </> - )} - </OrderCustomerChangeForm> - </Dialog> + <DashboardModal.Actions> + <ConfirmButton transitionState="default" type="submit"> + <FormattedMessage {...buttonMessages.continue} /> + </ConfirmButton> + </DashboardModal.Actions> + </Box> + )} + </OrderCustomerChangeForm> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/orders/components/OrderFulfillStockExceededDialog/OrderFulfillStockExceededDialog.tsx b/src/orders/components/OrderFulfillStockExceededDialog/OrderFulfillStockExceededDialog.tsx index de77a7f8998..d60d4135977 100644 --- a/src/orders/components/OrderFulfillStockExceededDialog/OrderFulfillStockExceededDialog.tsx +++ b/src/orders/components/OrderFulfillStockExceededDialog/OrderFulfillStockExceededDialog.tsx @@ -52,7 +52,6 @@ const OrderFulfillStockExceededDialog: React.FC<OrderFulfillStockExceededDialogP onClose={onClose} confirmButtonState={confirmButtonState} confirmButtonLabel={intl.formatMessage(messages.fulfillButton)} - size="lg" > <Text>{intl.formatMessage(messages.infoLabel)}</Text> <CardSpacer /> diff --git a/src/orders/components/OrderFulfillmentApproveDialog/OrderFulfillmentApproveDialog.tsx b/src/orders/components/OrderFulfillmentApproveDialog/OrderFulfillmentApproveDialog.tsx index c6331e0c144..d3c18068202 100644 --- a/src/orders/components/OrderFulfillmentApproveDialog/OrderFulfillmentApproveDialog.tsx +++ b/src/orders/components/OrderFulfillmentApproveDialog/OrderFulfillmentApproveDialog.tsx @@ -3,16 +3,11 @@ import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/componen import ControlledCheckbox from "@dashboard/components/ControlledCheckbox"; import Form from "@dashboard/components/Form"; import FormSpacer from "@dashboard/components/FormSpacer"; +import { DashboardModal } from "@dashboard/components/Modal"; import { OrderErrorFragment } from "@dashboard/graphql"; import { buttonMessages } from "@dashboard/intl"; import getOrderErrorMessage from "@dashboard/utils/errors/order"; -import { - Dialog, - DialogActions, - DialogContent, - DialogContentText, - DialogTitle, -} from "@material-ui/core"; +import { Box, Text } from "@saleor/macaw-ui-next"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -30,58 +25,64 @@ export interface OrderFulfillmentAcceptDialogProps { onConfirm: (data: OrderFulfillmentAcceptDialogFormData) => void; } -const OrderFulfillmentAcceptDialog: React.FC<OrderFulfillmentAcceptDialogProps> = props => { +const OrderFulfillmentApproveDialog: React.FC<OrderFulfillmentAcceptDialogProps> = props => { const { confirmButtonState, errors, open, onConfirm, onClose } = props; const intl = useIntl(); return ( - <Dialog onClose={onClose} open={open} fullWidth maxWidth="sm"> - <Form initial={{ notifyCustomer: true }} onSubmit={onConfirm}> - {({ change, data, submit }) => ( - <> - <DialogTitle disableTypography> - <FormattedMessage {...messages.title} /> - </DialogTitle> - <DialogContent> - <DialogContentText> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="sm"> + <Form initial={{ notifyCustomer: true }} onSubmit={onConfirm}> + {({ change, data, submit }) => ( + <DashboardModal.Grid> + <DashboardModal.Title> + <FormattedMessage {...messages.title} /> + </DashboardModal.Title> + + <Text> <FormattedMessage {...messages.description} /> - </DialogContentText> - <ControlledCheckbox - data-test-id="notify-customer" - name={"notifyCustomer" as keyof OrderFulfillmentAcceptDialogFormData} - label={intl.formatMessage(messages.notifyCustomer)} - checked={data.notifyCustomer} - onChange={change} - /> - {errors.length > 0 && ( - <> - <FormSpacer /> - {errors.map((err, index) => ( - <DialogContentText color="error" key={index}> - {getOrderErrorMessage(err, intl)} - </DialogContentText> - ))} - </> - )} - </DialogContent> - <DialogActions> - <Button onClick={onClose}> - <FormattedMessage {...buttonMessages.cancel} /> - </Button> - <ConfirmButton - data-test-id="submit" - transitionState={confirmButtonState} - onClick={submit} - > - <FormattedMessage {...buttonMessages.approve} /> - </ConfirmButton> - </DialogActions> - </> - )} - </Form> - </Dialog> + </Text> + + <Box> + <ControlledCheckbox + data-test-id="notify-customer" + name={"notifyCustomer" as keyof OrderFulfillmentAcceptDialogFormData} + label={intl.formatMessage(messages.notifyCustomer)} + checked={data.notifyCustomer} + onChange={change} + /> + + {errors.length > 0 && ( + <> + <FormSpacer /> + {errors.map((err, index) => ( + <Text display="block" color="critical1" key={index}> + {getOrderErrorMessage(err, intl)} + </Text> + ))} + </> + )} + </Box> + + <DashboardModal.Actions> + <Button onClick={onClose}> + <FormattedMessage {...buttonMessages.cancel} /> + </Button> + <ConfirmButton + data-test-id="submit" + transitionState={confirmButtonState} + onClick={submit} + > + <FormattedMessage {...buttonMessages.approve} /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Grid> + )} + </Form> + </DashboardModal.Content> + </DashboardModal> ); }; -OrderFulfillmentAcceptDialog.displayName = "OrderFulfillmentAcceptDialog"; -export default OrderFulfillmentAcceptDialog; +OrderFulfillmentApproveDialog.displayName = "OrderFulfillmentApproveDialog"; +export default OrderFulfillmentApproveDialog; diff --git a/src/orders/components/OrderFulfillmentCancelDialog/OrderFulfillmentCancelDialog.tsx b/src/orders/components/OrderFulfillmentCancelDialog/OrderFulfillmentCancelDialog.tsx index 7599f36789a..03639f2777f 100644 --- a/src/orders/components/OrderFulfillmentCancelDialog/OrderFulfillmentCancelDialog.tsx +++ b/src/orders/components/OrderFulfillmentCancelDialog/OrderFulfillmentCancelDialog.tsx @@ -3,7 +3,7 @@ import BackButton from "@dashboard/components/BackButton"; import { Combobox } from "@dashboard/components/Combobox"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import Form from "@dashboard/components/Form"; -import { DASHBOARD_MODAL_WIDTH, DashboardModal } from "@dashboard/components/Modal"; +import { DashboardModal } from "@dashboard/components/Modal"; import { OrderErrorFragment, WarehouseFragment } from "@dashboard/graphql"; import { buttonMessages } from "@dashboard/intl"; import getOrderErrorMessage from "@dashboard/utils/errors/order"; @@ -62,7 +62,7 @@ const OrderFulfillmentCancelDialog: React.FC<OrderFulfillmentCancelDialogProps> ); return ( - <DashboardModal.Content __maxWidth={DASHBOARD_MODAL_WIDTH} width="100%"> + <DashboardModal.Content size="sm"> <DashboardModal.Title> <FormattedMessage id="bb4nSp" diff --git a/src/orders/components/OrderFulfillmentTrackingDialog/OrderFulfillmentTrackingDialog.tsx b/src/orders/components/OrderFulfillmentTrackingDialog/OrderFulfillmentTrackingDialog.tsx index 4442b1c3175..0a1211edaf7 100644 --- a/src/orders/components/OrderFulfillmentTrackingDialog/OrderFulfillmentTrackingDialog.tsx +++ b/src/orders/components/OrderFulfillmentTrackingDialog/OrderFulfillmentTrackingDialog.tsx @@ -1,21 +1,15 @@ -// @ts-strict-ignore import BackButton from "@dashboard/components/BackButton"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import Form from "@dashboard/components/Form"; import FormSpacer from "@dashboard/components/FormSpacer"; +import { DashboardModal } from "@dashboard/components/Modal"; import { OrderErrorFragment } from "@dashboard/graphql"; import useModalDialogErrors from "@dashboard/hooks/useModalDialogErrors"; import { buttonMessages } from "@dashboard/intl"; import { getFormErrors } from "@dashboard/utils/errors"; import getOrderErrorMessage from "@dashboard/utils/errors/order"; -import { - Dialog, - DialogActions, - DialogContent, - DialogContentText, - DialogTitle, - TextField, -} from "@material-ui/core"; +import { TextField } from "@material-ui/core"; +import { Text } from "@saleor/macaw-ui-next"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -49,18 +43,19 @@ const OrderFulfillmentTrackingDialog: React.FC<OrderFulfillmentTrackingDialogPro }; return ( - <Dialog onClose={onClose} open={open} fullWidth maxWidth="xs"> - <Form initial={initialData} onSubmit={onConfirm}> - {({ change, data, submit }) => ( - <> - <DialogTitle disableTypography> - <FormattedMessage - id="/BJQIq" - defaultMessage="Add Tracking Code" - description="dialog header" - /> - </DialogTitle> - <DialogContent> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="xs"> + <Form initial={initialData} onSubmit={onConfirm}> + {({ change, data, submit }) => ( + <DashboardModal.Grid> + <DashboardModal.Title> + <FormattedMessage + id="/BJQIq" + defaultMessage="Add Tracking Code" + description="dialog header" + /> + </DashboardModal.Title> + <TextField error={!!formErrors.trackingNumber} helperText={getOrderErrorMessage(formErrors.trackingNumber, intl)} @@ -74,33 +69,35 @@ const OrderFulfillmentTrackingDialog: React.FC<OrderFulfillmentTrackingDialogPro fullWidth data-test-id="tracking-number-input" /> + {errors.length > 0 && ( <> <FormSpacer /> {errors - .filter(err => !formFields.includes(err.field)) + .filter(err => err.field && !formFields.includes(err.field)) .map((err, index) => ( - <DialogContentText color="error" key={index}> + <Text display="block" color="critical1" key={index}> {getOrderErrorMessage(err, intl)} - </DialogContentText> + </Text> ))} </> )} - </DialogContent> - <DialogActions> - <BackButton onClick={onClose} /> - <ConfirmButton - data-test-id="confirm-tracking-number-button" - transitionState={confirmButtonState} - onClick={submit} - > - <FormattedMessage {...buttonMessages.confirm} /> - </ConfirmButton> - </DialogActions> - </> - )} - </Form> - </Dialog> + + <DashboardModal.Actions> + <BackButton onClick={onClose} /> + <ConfirmButton + data-test-id="confirm-tracking-number-button" + transitionState={confirmButtonState} + onClick={submit} + > + <FormattedMessage {...buttonMessages.confirm} /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Grid> + )} + </Form> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/orders/components/OrderInvoiceEmailSendDialog/OrderInvoiceEmailSendDialog.tsx b/src/orders/components/OrderInvoiceEmailSendDialog/OrderInvoiceEmailSendDialog.tsx index 1d5addf6122..85a7d380e20 100644 --- a/src/orders/components/OrderInvoiceEmailSendDialog/OrderInvoiceEmailSendDialog.tsx +++ b/src/orders/components/OrderInvoiceEmailSendDialog/OrderInvoiceEmailSendDialog.tsx @@ -1,17 +1,12 @@ import BackButton from "@dashboard/components/BackButton"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import FormSpacer from "@dashboard/components/FormSpacer"; +import { DashboardModal } from "@dashboard/components/Modal"; import { InvoiceErrorFragment, InvoiceFragment } from "@dashboard/graphql"; import { buttonMessages } from "@dashboard/intl"; import { DialogProps } from "@dashboard/types"; import getInvoiceErrorMessage from "@dashboard/utils/errors/invoice"; -import { - Dialog, - DialogActions, - DialogContent, - DialogContentText, - DialogTitle, -} from "@material-ui/core"; +import { Text } from "@saleor/macaw-ui-next"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -33,16 +28,17 @@ const OrderInvoiceEmailSendDialog: React.FC<OrderInvoiceEmailSendDialogProps> = const intl = useIntl(); return ( - <Dialog onClose={onClose} open={open} fullWidth maxWidth="xs"> - <DialogTitle disableTypography> - {intl.formatMessage({ - id: "5JT4v2", - defaultMessage: "Send Invoice", - description: "dialog header", - })} - </DialogTitle> - <DialogContent> - <DialogContentText> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="sm"> + <DashboardModal.Title> + {intl.formatMessage({ + id: "5JT4v2", + defaultMessage: "Send Invoice", + description: "dialog header", + })} + </DashboardModal.Title> + + <Text> <FormattedMessage id="MPfyne" defaultMessage="Are you sure you want to send this invoice: {invoiceNumber} to the customer?" @@ -50,25 +46,27 @@ const OrderInvoiceEmailSendDialog: React.FC<OrderInvoiceEmailSendDialogProps> = invoiceNumber: <strong>{invoice?.number}</strong>, }} /> - </DialogContentText> + </Text> + {errors.length > 0 && ( <> <FormSpacer /> {errors.map((err, idx) => ( - <DialogContentText key={idx} color="error"> + <Text key={idx} display="block" color="critical1"> {getInvoiceErrorMessage(err, intl)} - </DialogContentText> + </Text> ))} </> )} - </DialogContent> - <DialogActions> - <BackButton onClick={onClose} /> - <ConfirmButton transitionState={confirmButtonState} onClick={onSend}> - <FormattedMessage {...buttonMessages.send} /> - </ConfirmButton> - </DialogActions> - </Dialog> + + <DashboardModal.Actions> + <BackButton onClick={onClose} /> + <ConfirmButton transitionState={confirmButtonState} onClick={onSend}> + <FormattedMessage {...buttonMessages.send} /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/orders/components/OrderManualTransactionDialog/OrderManualTransactionDialog.tsx b/src/orders/components/OrderManualTransactionDialog/OrderManualTransactionDialog.tsx index 856073dd5a6..cc135991c2f 100644 --- a/src/orders/components/OrderManualTransactionDialog/OrderManualTransactionDialog.tsx +++ b/src/orders/components/OrderManualTransactionDialog/OrderManualTransactionDialog.tsx @@ -26,7 +26,7 @@ export const OrderManualTransactionDialog: React.FC<OrderManualTransactionDialog return ( <OrderManualTransactionForm {...props}> <DashboardModal {...dialogProps}> - <DashboardModal.Content __width={"400px"}> + <DashboardModal.Content size="xs"> <DashboardModal.Title display="flex" justifyContent="space-between" alignItems="center"> <FormattedMessage {...manualTransactionMessages.dialogTitle} /> <DashboardModal.Close onClose={onClose} /> diff --git a/src/orders/components/OrderMarkAsPaidDialog/OrderMarkAsPaidDialog.tsx b/src/orders/components/OrderMarkAsPaidDialog/OrderMarkAsPaidDialog.tsx index fa5fb7a4f1e..0ae144e8a67 100644 --- a/src/orders/components/OrderMarkAsPaidDialog/OrderMarkAsPaidDialog.tsx +++ b/src/orders/components/OrderMarkAsPaidDialog/OrderMarkAsPaidDialog.tsx @@ -41,7 +41,6 @@ const OrderMarkAsPaidDialog: React.FC<OrderMarkAsPaidDialogProps> = ({ })} onClose={onClose} onConfirm={onConfirm} - size="lg" > <Box display="grid" gap={4}> <FormattedMessage id="sfEbeB" defaultMessage="You're going to mark this order as paid." /> diff --git a/src/orders/components/OrderMetadataDialog/OrderMetadataDialog.tsx b/src/orders/components/OrderMetadataDialog/OrderMetadataDialog.tsx index 11dd0143a2e..03d5ef4b251 100644 --- a/src/orders/components/OrderMetadataDialog/OrderMetadataDialog.tsx +++ b/src/orders/components/OrderMetadataDialog/OrderMetadataDialog.tsx @@ -15,13 +15,7 @@ interface OrderMetadataDialogProps { export const OrderMetadataDialog = ({ onClose, open, data }: OrderMetadataDialogProps) => { return ( <DashboardModal open={open} onChange={onClose}> - <DashboardModal.Content - __maxHeight="90vh" - __width="min(850px, 90vw)" - overflowY="auto" - gap={0} - paddingX={0} - > + <DashboardModal.Content size="md"> <DashboardModal.Title paddingX={6}> <FormattedMessage {...commonMessages.metadata} />: {data?.productName ?? ""} </DashboardModal.Title> diff --git a/src/orders/components/OrderPaymentDialog/OrderPaymentDialog.tsx b/src/orders/components/OrderPaymentDialog/OrderPaymentDialog.tsx index 1c20db12570..5f4ca645f56 100644 --- a/src/orders/components/OrderPaymentDialog/OrderPaymentDialog.tsx +++ b/src/orders/components/OrderPaymentDialog/OrderPaymentDialog.tsx @@ -3,7 +3,7 @@ import BackButton from "@dashboard/components/BackButton"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import Form from "@dashboard/components/Form"; import FormSpacer from "@dashboard/components/FormSpacer"; -import { DASHBOARD_MODAL_WIDTH, DashboardModal } from "@dashboard/components/Modal"; +import { DashboardModal } from "@dashboard/components/Modal"; import { OrderErrorFragment } from "@dashboard/graphql"; import { buttonMessages } from "@dashboard/intl"; import { getFormErrors } from "@dashboard/utils/errors"; @@ -47,7 +47,7 @@ const OrderPaymentDialog: React.FC<OrderPaymentDialogProps> = ({ onSubmit={onSubmit} > {({ data, change, submit }) => ( - <DashboardModal.Content __width={DASHBOARD_MODAL_WIDTH}> + <DashboardModal.Content size="sm"> <DashboardModal.Title> {intl.formatMessage({ id: "+PbHKD", diff --git a/src/orders/components/OrderPaymentVoidDialog/OrderPaymentVoidDialog.tsx b/src/orders/components/OrderPaymentVoidDialog/OrderPaymentVoidDialog.tsx index 7472c16def7..6ef0214df8e 100644 --- a/src/orders/components/OrderPaymentVoidDialog/OrderPaymentVoidDialog.tsx +++ b/src/orders/components/OrderPaymentVoidDialog/OrderPaymentVoidDialog.tsx @@ -2,7 +2,7 @@ import BackButton from "@dashboard/components/BackButton"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import FormSpacer from "@dashboard/components/FormSpacer"; -import { DASHBOARD_MODAL_WIDTH, DashboardModal } from "@dashboard/components/Modal"; +import { DashboardModal } from "@dashboard/components/Modal"; import { OrderErrorFragment } from "@dashboard/graphql"; import { buttonMessages } from "@dashboard/intl"; import getOrderErrorMessage from "@dashboard/utils/errors/order"; @@ -29,7 +29,7 @@ const OrderPaymentVoidDialog: React.FC<OrderPaymentVoidDialogProps> = ({ return ( <DashboardModal onChange={onClose} open={open}> - <DashboardModal.Content __width={DASHBOARD_MODAL_WIDTH}> + <DashboardModal.Content size="sm"> <DashboardModal.Title> <FormattedMessage id="KszPFx" defaultMessage="Void Payment" description="dialog header" /> </DashboardModal.Title> diff --git a/src/orders/components/OrderProductAddDialog/OrderProductAddDialog.tsx b/src/orders/components/OrderProductAddDialog/OrderProductAddDialog.tsx index 2fdb97f5a57..63e5649d6b7 100644 --- a/src/orders/components/OrderProductAddDialog/OrderProductAddDialog.tsx +++ b/src/orders/components/OrderProductAddDialog/OrderProductAddDialog.tsx @@ -3,6 +3,7 @@ import BackButton from "@dashboard/components/BackButton"; import Checkbox from "@dashboard/components/Checkbox"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import FormSpacer from "@dashboard/components/FormSpacer"; +import { DashboardModal } from "@dashboard/components/Modal"; import ResponsiveTable from "@dashboard/components/ResponsiveTable"; import TableCellAvatar from "@dashboard/components/TableCellAvatar"; import TableRowLink from "@dashboard/components/TableRowLink"; @@ -14,18 +15,8 @@ import { buttonMessages } from "@dashboard/intl"; import { maybe, renderCollection } from "@dashboard/misc"; import { FetchMoreProps, RelayToFlat } from "@dashboard/types"; import getOrderErrorMessage from "@dashboard/utils/errors/order"; -import { - CircularProgress, - Dialog, - DialogActions, - DialogContent, - DialogContentText, - DialogTitle, - TableBody, - TableCell, - TextField, -} from "@material-ui/core"; -import { Text } from "@saleor/macaw-ui-next"; +import { CircularProgress, TableBody, TableCell, TextField } from "@material-ui/core"; +import { Box, Text } from "@saleor/macaw-ui-next"; import React from "react"; import InfiniteScroll from "react-infinite-scroll-component"; import { FormattedMessage, useIntl } from "react-intl"; @@ -97,164 +88,168 @@ const OrderProductAddDialog: React.FC<OrderProductAddDialogProps> = props => { ); return ( - <Dialog - onClose={onClose} - open={open} - classes={{ paper: classes.overflow }} - fullWidth - maxWidth="sm" - > - <DialogTitle disableTypography> - <FormattedMessage - {...messages.title} - values={{ - channelName, - }} - /> - </DialogTitle> - <DialogContent className={classes.subtitle}> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="sm" __gridTemplateRows="auto auto auto 1fr"> + <DashboardModal.Title> + <FormattedMessage + {...messages.title} + values={{ + channelName, + }} + /> + </DashboardModal.Title> + <Text size={2} color="default2"> <FormattedMessage {...messages.subtitle} /> </Text> - </DialogContent> - <DialogContent data-test-id="search-query"> - <TextField - name="query" - value={query} - onChange={onQueryChange} - label={intl.formatMessage(messages.search)} - placeholder={intl.formatMessage(messages.searchPlaceholder)} - fullWidth - InputProps={{ - autoComplete: "off", - endAdornment: loading && <CircularProgress size={16} />, - }} - /> - </DialogContent> - <DialogContent className={classes.content} id={scrollableTargetId}> - <InfiniteScroll - dataLength={productChoicesWithValidVariants?.length} - next={onFetchMore} - hasMore={hasMore} - scrollThreshold="100px" - loader={ - <div className={classes.loadMoreLoaderContainer}> - <CircularProgress size={16} /> - </div> - } - scrollableTarget={scrollableTargetId} - > - <ResponsiveTable key="table"> - <TableBody data-test-id="add-products-table"> - {renderCollection( - productChoicesWithValidVariants, - (product, productIndex) => ( - <React.Fragment key={product ? product.id : "skeleton"}> - <TableRowLink data-test-id="product"> - <TableCell padding="checkbox" className={classes.productCheckboxCell}> - <Checkbox - checked={productsWithAllVariantsSelected[productIndex]} - disabled={loading} - onChange={() => - onProductAdd( - product, - productIndex, - productsWithAllVariantsSelected, - variants, - setVariants, - ) - } + + <Box data-test-id="search-query"> + <TextField + name="query" + value={query} + onChange={onQueryChange} + label={intl.formatMessage(messages.search)} + placeholder={intl.formatMessage(messages.searchPlaceholder)} + fullWidth + InputProps={{ + autoComplete: "off", + endAdornment: loading && <CircularProgress size={16} />, + }} + /> + </Box> + + <Box overflowY="auto" id={scrollableTargetId}> + <InfiniteScroll + dataLength={productChoicesWithValidVariants?.length} + next={onFetchMore} + hasMore={hasMore} + scrollThreshold="100px" + loader={ + <Box + display="flex" + alignItems="center" + height={6} + justifyContent="center" + marginTop={3} + > + <CircularProgress size={16} /> + </Box> + } + scrollableTarget={scrollableTargetId} + > + <ResponsiveTable key="table"> + <TableBody data-test-id="add-products-table"> + {renderCollection( + productChoicesWithValidVariants, + (product, productIndex) => ( + <React.Fragment key={product ? product.id : "skeleton"}> + <TableRowLink data-test-id="product"> + <TableCell padding="checkbox" className={classes.productCheckboxCell}> + <Checkbox + checked={productsWithAllVariantsSelected[productIndex]} + disabled={loading} + onChange={() => + onProductAdd( + product, + productIndex, + productsWithAllVariantsSelected, + variants, + setVariants, + ) + } + /> + </TableCell> + <TableCellAvatar + className={classes.avatar} + thumbnail={maybe(() => product.thumbnail.url)} /> - </TableCell> - <TableCellAvatar - className={classes.avatar} - thumbnail={maybe(() => product.thumbnail.url)} - /> - <TableCell - className={classes.colName} - colSpan={2} - data-test-id="product-name" - > - {maybe(() => product.name)} - </TableCell> - </TableRowLink> - {maybe(() => product.variants, []) - .filter(isValidVariant) - .map((variant, variantIndex) => ( - <TableRowLink key={variant.id} data-test-id="variant"> - <TableCell /> - <TableCell className={classes.colVariantCheckbox}> - <Checkbox - className={classes.variantCheckbox} - checked={selectedVariantsToProductsMap[productIndex][variantIndex]} - disabled={loading} - onChange={() => - onVariantAdd( - variant, - variantIndex, - productIndex, - variants, - selectedVariantsToProductsMap, - setVariants, - ) - } - /> - </TableCell> - <TableCell className={classes.colName}> - <div>{variant.name}</div> - {variant.sku && ( - <div className={classes.grayText}> - <FormattedMessage - {...messages.sku} - values={{ - sku: variant.sku, - }} - /> - </div> - )} - </TableCell> - <TableCell className={classes.textRight} data-test-id="variant-price"> - <OrderPriceLabel pricing={variant.pricing} /> - </TableCell> - </TableRowLink> - ))} - </React.Fragment> - ), - () => ( - <Text className={classes.noContentText}> - {query - ? intl.formatMessage(messages.noProductsInQuery) - : intl.formatMessage(messages.noProductsInChannel)} - </Text> - ), - )} - </TableBody> - </ResponsiveTable> - </InfiniteScroll> - {errors.length > 0 && ( - <> - <FormSpacer /> - {errors.map((err, index) => ( - <DialogContentText color="error" key={index}> - {getOrderErrorMessage(err, intl)} - </DialogContentText> - ))} - </> - )} - </DialogContent> - <DialogActions> - <BackButton onClick={onClose} data-test-id="back-button" /> - <ConfirmButton - transitionState={confirmButtonState} - type="submit" - data-test-id="confirm-button" - onClick={handleSubmit} - disabled={variants.length === 0} - > - <FormattedMessage {...buttonMessages.confirm} /> - </ConfirmButton> - </DialogActions> - </Dialog> + <TableCell + className={classes.colName} + colSpan={2} + data-test-id="product-name" + > + {maybe(() => product.name)} + </TableCell> + </TableRowLink> + {maybe(() => product.variants, []) + .filter(isValidVariant) + .map((variant, variantIndex) => ( + <TableRowLink key={variant.id} data-test-id="variant"> + <TableCell /> + <TableCell className={classes.colVariantCheckbox}> + <Checkbox + className={classes.variantCheckbox} + checked={selectedVariantsToProductsMap[productIndex][variantIndex]} + disabled={loading} + onChange={() => + onVariantAdd( + variant, + variantIndex, + productIndex, + variants, + selectedVariantsToProductsMap, + setVariants, + ) + } + /> + </TableCell> + <TableCell className={classes.colName}> + <div>{variant.name}</div> + {variant.sku && ( + <Box color="default2"> + <FormattedMessage + {...messages.sku} + values={{ + sku: variant.sku, + }} + /> + </Box> + )} + </TableCell> + <TableCell className={classes.textRight} data-test-id="variant-price"> + <OrderPriceLabel pricing={variant.pricing} /> + </TableCell> + </TableRowLink> + ))} + </React.Fragment> + ), + () => ( + <Text marginBottom={3}> + {query + ? intl.formatMessage(messages.noProductsInQuery) + : intl.formatMessage(messages.noProductsInChannel)} + </Text> + ), + )} + </TableBody> + </ResponsiveTable> + </InfiniteScroll> + {errors.length > 0 && ( + <> + <FormSpacer /> + {errors.map((err, index) => ( + <Text display="block" color="critical1" key={index}> + {getOrderErrorMessage(err, intl)} + </Text> + ))} + </> + )} + </Box> + + <DashboardModal.Actions> + <BackButton onClick={onClose} data-test-id="back-button" /> + <ConfirmButton + transitionState={confirmButtonState} + type="submit" + data-test-id="confirm-button" + onClick={handleSubmit} + disabled={variants.length === 0} + > + <FormattedMessage {...buttonMessages.confirm} /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/orders/components/OrderProductAddDialog/styles.ts b/src/orders/components/OrderProductAddDialog/styles.ts index f466f4b1b5c..97268258ce6 100644 --- a/src/orders/components/OrderProductAddDialog/styles.ts +++ b/src/orders/components/OrderProductAddDialog/styles.ts @@ -12,31 +12,6 @@ export const useStyles = makeStyles( colVariantCheckbox: { padding: 0, }, - noContentText: { - marginBottom: theme.spacing(3), - }, - content: { - overflowY: "auto", - paddingTop: 0, - maxHeight: "75vh", - marginBottom: theme.spacing(3), - }, - subtitle: { - padding: 0, - }, - grayText: { - color: theme.palette.text.disabled, - }, - loadMoreLoaderContainer: { - alignItems: "center", - display: "flex", - height: theme.spacing(3), - justifyContent: "center", - marginTop: theme.spacing(3), - }, - overflow: { - overflowY: "hidden", - }, productCheckboxCell: { "&:first-child": { paddingLeft: 0, @@ -50,9 +25,6 @@ export const useStyles = makeStyles( left: theme.spacing(), position: "relative", }, - wideCell: { - width: "100%", - }, }), { name: "OrderProductAddDialog" }, ); diff --git a/src/orders/components/OrderRefundDialog/OrderRefundDialog.tsx b/src/orders/components/OrderRefundDialog/OrderRefundDialog.tsx index c58681dca07..a9834fe48bd 100644 --- a/src/orders/components/OrderRefundDialog/OrderRefundDialog.tsx +++ b/src/orders/components/OrderRefundDialog/OrderRefundDialog.tsx @@ -27,7 +27,7 @@ export const OrderRefundDialog = ({ return ( <DashboardModal open={open} onChange={onClose}> - <DashboardModal.Content __width="400px" data-test-id="order-refund-dialog"> + <DashboardModal.Content size="xs" data-test-id="order-refund-dialog"> <DashboardModal.Title> {intl.formatMessage(orderRefundDialogMesages.title)} </DashboardModal.Title> diff --git a/src/orders/components/OrderShippingMethodEditDialog/OrderShippingMethodEditDialog.tsx b/src/orders/components/OrderShippingMethodEditDialog/OrderShippingMethodEditDialog.tsx index a5aec122912..b80f1eac399 100644 --- a/src/orders/components/OrderShippingMethodEditDialog/OrderShippingMethodEditDialog.tsx +++ b/src/orders/components/OrderShippingMethodEditDialog/OrderShippingMethodEditDialog.tsx @@ -78,7 +78,7 @@ const OrderShippingMethodEditDialog: React.FC<OrderShippingMethodEditDialogProps <Form initial={initialForm} onSubmit={onSubmit}> {({ change, data, submit }) => ( <> - <DashboardModal.Content __width={600}> + <DashboardModal.Content size="sm"> <DashboardModal.Title> <FormattedMessage id="V/YxJa" diff --git a/src/orders/components/OrderTransactionActionDialog/OrderTransactionActionDialog.tsx b/src/orders/components/OrderTransactionActionDialog/OrderTransactionActionDialog.tsx index 2961b07e860..447d5f29966 100644 --- a/src/orders/components/OrderTransactionActionDialog/OrderTransactionActionDialog.tsx +++ b/src/orders/components/OrderTransactionActionDialog/OrderTransactionActionDialog.tsx @@ -31,7 +31,7 @@ export const OrderTransactionActionDialog: React.FC<OrderTransactionActionDialog return ( <DashboardModal open={open} onChange={onClose}> - <DashboardModal.Content> + <DashboardModal.Content size="sm"> <DashboardModal.Title> <FormattedMessage {...messages.title} diff --git a/src/orders/components/OrderTransactionRefundPage/components/OrderTransactionReasonModal/OrderTransactionReasonModal.tsx b/src/orders/components/OrderTransactionRefundPage/components/OrderTransactionReasonModal/OrderTransactionReasonModal.tsx index 972a868925d..05e970a8d90 100644 --- a/src/orders/components/OrderTransactionRefundPage/components/OrderTransactionReasonModal/OrderTransactionReasonModal.tsx +++ b/src/orders/components/OrderTransactionRefundPage/components/OrderTransactionReasonModal/OrderTransactionReasonModal.tsx @@ -27,7 +27,7 @@ export const OrderTransactionReasonModal = ({ return ( <DashboardModal open={open} onChange={onClose}> - <DashboardModal.Content data-test-id="refund-reason-dialog" __minWidth="400px"> + <DashboardModal.Content data-test-id="refund-reason-dialog" size="xs"> <DashboardModal.Title display="flex" justifyContent="space-between" alignItems="center"> <FormattedMessage {...(reason ? refundTableMessages.editReason : refundTableMessages.addReason)} diff --git a/src/orders/views/OrderDetails/OrderNormalDetails/index.tsx b/src/orders/views/OrderDetails/OrderNormalDetails/index.tsx index a123f55da96..01bd6122b21 100644 --- a/src/orders/views/OrderDetails/OrderNormalDetails/index.tsx +++ b/src/orders/views/OrderDetails/OrderNormalDetails/index.tsx @@ -165,6 +165,10 @@ export const OrderNormalDetails: React.FC<OrderNormalDetailsProps> = ({ const errors = orderUpdate.opts.data?.orderUpdate.errors || []; + const hasOrderFulfillmentsFulfilled = order?.fulfillments.some( + fulfillment => fulfillment.status === FulfillmentStatus.FULFILLED, + ); + return ( <> <WindowTitle @@ -265,18 +269,13 @@ export const OrderNormalDetails: React.FC<OrderNormalDetailsProps> = ({ /> <OrderCannotCancelOrderDialog onClose={closeModal} - open={ - params.action === "cancel" && - order?.fulfillments.some( - fulfillment => fulfillment.status === FulfillmentStatus.FULFILLED, - ) - } + open={params.action === "cancel" && hasOrderFulfillmentsFulfilled} /> <OrderCancelDialog confirmButtonState={orderCancel.opts.status} errors={orderCancel.opts.data?.orderCancel.errors || []} number={order?.number} - open={params.action === "cancel"} + open={params.action === "cancel" && !hasOrderFulfillmentsFulfilled} onClose={closeModal} onSubmit={() => orderCancel.mutate({ diff --git a/src/orders/views/OrderDetails/OrderUnconfirmedDetails/index.tsx b/src/orders/views/OrderDetails/OrderUnconfirmedDetails/index.tsx index 17b3c4d8192..0a2eac80465 100644 --- a/src/orders/views/OrderDetails/OrderUnconfirmedDetails/index.tsx +++ b/src/orders/views/OrderDetails/OrderUnconfirmedDetails/index.tsx @@ -156,6 +156,10 @@ export const OrderUnconfirmedDetails: React.FC<OrderUnconfirmedDetailsProps> = ( const [transactionReference, setTransactionReference] = React.useState(""); const errors = orderUpdate.opts.data?.orderUpdate.errors || []; + const hasOrderFulfillmentsFulFilled = order?.fulfillments.some( + fulfillment => fulfillment.status === FulfillmentStatus.FULFILLED, + ); + return ( <> <WindowTitle @@ -269,18 +273,13 @@ export const OrderUnconfirmedDetails: React.FC<OrderUnconfirmedDetailsProps> = ( </OrderDiscountProvider> <OrderCannotCancelOrderDialog onClose={closeModal} - open={ - params.action === "cancel" && - order?.fulfillments.some( - fulfillment => fulfillment.status === FulfillmentStatus.FULFILLED, - ) - } + open={params.action === "cancel" && hasOrderFulfillmentsFulFilled} /> <OrderCancelDialog confirmButtonState={orderCancel.opts.status} errors={orderCancel.opts.data?.orderCancel.errors || []} number={order?.number} - open={params.action === "cancel"} + open={params.action === "cancel" && !hasOrderFulfillmentsFulFilled} onClose={closeModal} onSubmit={() => orderCancel.mutate({ diff --git a/src/pages/components/PageTypePickerDialog/PageTypePickerDialog.tsx b/src/pages/components/PageTypePickerDialog/PageTypePickerDialog.tsx index 651e068ebe1..63c2d95e565 100644 --- a/src/pages/components/PageTypePickerDialog/PageTypePickerDialog.tsx +++ b/src/pages/components/PageTypePickerDialog/PageTypePickerDialog.tsx @@ -42,7 +42,7 @@ const PageTypePickerDialog: React.FC<PageTypePickerDialogProps> = ({ return ( <DashboardModal open={open} onChange={onClose}> - <DashboardModal.Content __width="480px" disableAutofocus> + <DashboardModal.Content size="xs" disableAutofocus> <DashboardModal.Title> <FormattedMessage {...messages.selectPageType} /> </DashboardModal.Title> diff --git a/src/permissionGroups/components/AssignMembersDialog/AssignMembersDialog.tsx b/src/permissionGroups/components/AssignMembersDialog/AssignMembersDialog.tsx index 051f47cc2aa..80c84f39046 100644 --- a/src/permissionGroups/components/AssignMembersDialog/AssignMembersDialog.tsx +++ b/src/permissionGroups/components/AssignMembersDialog/AssignMembersDialog.tsx @@ -2,29 +2,18 @@ import BackButton from "@dashboard/components/BackButton"; import CardSpacer from "@dashboard/components/CardSpacer"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; +import { DashboardModal } from "@dashboard/components/Modal"; import ResponsiveTable from "@dashboard/components/ResponsiveTable"; import TableRowLink from "@dashboard/components/TableRowLink"; import { UserAvatar } from "@dashboard/components/UserAvatar"; import { SearchStaffMembersQuery } from "@dashboard/graphql"; -import useElementScroll, { isScrolledToBottom } from "@dashboard/hooks/useElementScroll"; import useSearchQuery from "@dashboard/hooks/useSearchQuery"; import { buttonMessages } from "@dashboard/intl"; import { getUserInitials, getUserName, renderCollection } from "@dashboard/misc"; import { DialogProps, FetchMoreProps, RelayToFlat, SearchPageProps } from "@dashboard/types"; -import { - Checkbox, - CircularProgress, - Dialog, - DialogActions, - DialogContent, - DialogTitle, - TableBody, - TableCell, - TextField, -} from "@material-ui/core"; +import { Checkbox, CircularProgress, TableBody, TableCell, TextField } from "@material-ui/core"; import { makeStyles } from "@saleor/macaw-ui"; import { Box, Skeleton, Text } from "@saleor/macaw-ui-next"; -import clsx from "clsx"; import React from "react"; import InfiniteScroll from "react-infinite-scroll-component"; import { FormattedMessage, useIntl } from "react-intl"; @@ -116,6 +105,8 @@ function handleStaffMemberAssign( } } +const scrollableTargetId = "assignMemberScrollableDialog"; + const AssignMembersDialog: React.FC<AssignMembersDialogProps> = ({ confirmButtonState, disabled, @@ -134,24 +125,14 @@ const AssignMembersDialog: React.FC<AssignMembersDialogProps> = ({ const [selectedMembers, setSelectedMembers] = React.useState< RelayToFlat<SearchStaffMembersQuery["search"]> >([]); - const anchor = React.useRef<HTMLDivElement>(); - const scrollPosition = useElementScroll(anchor); - const dropShadow = !isScrolledToBottom(anchor, scrollPosition); return ( - <Dialog - onClose={onClose} - open={open} - maxWidth="sm" - fullWidth - classes={{ - paper: classes.dialogPaper, - }} - > - <DialogTitle disableTypography> - <FormattedMessage {...messages.title} /> - </DialogTitle> - <DialogContent className={classes.inputContainer}> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="sm" __gridTemplateRows="auto auto 1fr"> + <DashboardModal.Title> + <FormattedMessage {...messages.title} /> + </DashboardModal.Title> + <TextField data-test-id="search-members-input" name="query" @@ -166,105 +147,106 @@ const AssignMembersDialog: React.FC<AssignMembersDialogProps> = ({ }} disabled={disabled} /> - </DialogContent> - <DialogContent ref={anchor}> - <InfiniteScroll - dataLength={staffMembers?.length || 0} - next={onFetchMore} - hasMore={hasMore} - scrollThreshold="100px" - loader={ - <> - {staffMembers?.length > 0 && <CardSpacer />} - <div className={classes.loadMoreLoaderContainer}> - <CircularProgress size={24} /> - </div> - </> - } - height={400} - > - <ResponsiveTable className={classes.table}> - <TableBody data-test-id="search-results"> - {renderCollection( - staffMembers, - member => { - if (!member) { - return null; - } - const isSelected = selectedMembers.some( - selectedMember => selectedMember.id === member.id, - ); + <Box id={scrollableTargetId} overflowY="auto"> + <InfiniteScroll + dataLength={staffMembers?.length || 0} + next={onFetchMore} + hasMore={hasMore} + scrollThreshold="100px" + scrollableTarget={scrollableTargetId} + loader={ + <> + {staffMembers?.length > 0 && <CardSpacer />} + <div className={classes.loadMoreLoaderContainer}> + <CircularProgress size={24} /> + </div> + </> + } + > + <ResponsiveTable className={classes.table}> + <TableBody data-test-id="search-results"> + {renderCollection( + staffMembers, + member => { + if (!member) { + return null; + } - return ( - <TableRowLink key={member.id} data-test-id="user-row"> - <TableCell padding="checkbox" className={classes.checkboxCell}> - <Checkbox - color="primary" - checked={isSelected} - onChange={() => - handleStaffMemberAssign( - member, - isSelected, - selectedMembers, - setSelectedMembers, - ) - } - /> - </TableCell> - <TableCell className={classes.avatarCell}> - <UserAvatar url={member?.avatar?.url} initials={getUserInitials(member)} /> - </TableCell> - <TableCell className={classes.colName}> - <Box display="flex" flexDirection="column" justifyContent="center"> - <Text>{getUserName(member) || <Skeleton />}</Text> - <Text size={2} color="default2"> - {member ? ( - member.isActive ? ( - intl.formatMessage(messages.staffActive) - ) : ( - intl.formatMessage(messages.staffInactive) + const isSelected = selectedMembers.some( + selectedMember => selectedMember.id === member.id, + ); + + return ( + <TableRowLink key={member.id} data-test-id="user-row"> + <TableCell padding="checkbox" className={classes.checkboxCell}> + <Checkbox + color="primary" + checked={isSelected} + onChange={() => + handleStaffMemberAssign( + member, + isSelected, + selectedMembers, + setSelectedMembers, ) - ) : ( - <Skeleton /> - )} - </Text> - </Box> - </TableCell> - </TableRowLink> - ); - }, - () => - !loading && ( - <TableRowLink> - <TableCell colSpan={2}> - <FormattedMessage {...messages.noMembersFound} /> - </TableCell> - </TableRowLink> - ), - )} - </TableBody> - </ResponsiveTable> - </InfiniteScroll> - </DialogContent> - <DialogActions - className={clsx({ - [classes.dropShadow]: dropShadow, - })} - > - <BackButton onClick={onClose} /> - <ConfirmButton - data-test-id="submit" - type="submit" - transitionState={confirmButtonState} - onClick={() => { - onSubmit(selectedMembers); - }} - > - <FormattedMessage {...buttonMessages.assign} /> - </ConfirmButton> - </DialogActions> - </Dialog> + } + /> + </TableCell> + <TableCell className={classes.avatarCell}> + <UserAvatar + url={member?.avatar?.url} + initials={getUserInitials(member)} + /> + </TableCell> + <TableCell className={classes.colName}> + <Box display="flex" flexDirection="column" justifyContent="center"> + <Text>{getUserName(member) || <Skeleton />}</Text> + <Text size={2} color="default2"> + {member ? ( + member.isActive ? ( + intl.formatMessage(messages.staffActive) + ) : ( + intl.formatMessage(messages.staffInactive) + ) + ) : ( + <Skeleton /> + )} + </Text> + </Box> + </TableCell> + </TableRowLink> + ); + }, + () => + !loading && ( + <TableRowLink> + <TableCell colSpan={2}> + <FormattedMessage {...messages.noMembersFound} /> + </TableCell> + </TableRowLink> + ), + )} + </TableBody> + </ResponsiveTable> + </InfiniteScroll> + </Box> + + <DashboardModal.Actions> + <BackButton onClick={onClose} /> + <ConfirmButton + data-test-id="submit" + type="submit" + transitionState={confirmButtonState} + onClick={() => { + onSubmit(selectedMembers); + }} + > + <FormattedMessage {...buttonMessages.assign} /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/plugins/components/PluginSecretFieldDialog/PluginSecretFieldDialog.tsx b/src/plugins/components/PluginSecretFieldDialog/PluginSecretFieldDialog.tsx index 62ae2067ba7..285f75222bf 100644 --- a/src/plugins/components/PluginSecretFieldDialog/PluginSecretFieldDialog.tsx +++ b/src/plugins/components/PluginSecretFieldDialog/PluginSecretFieldDialog.tsx @@ -1,12 +1,12 @@ -// @ts-strict-ignore import BackButton from "@dashboard/components/BackButton"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import Form from "@dashboard/components/Form"; +import { DashboardModal } from "@dashboard/components/Modal"; import { ConfigurationItemFragment, ConfigurationTypeFieldEnum } from "@dashboard/graphql"; import { buttonMessages } from "@dashboard/intl"; import { maybe } from "@dashboard/misc"; import { DialogProps } from "@dashboard/types"; -import { Dialog, DialogActions, DialogContent, DialogTitle, TextField } from "@material-ui/core"; +import { TextField } from "@material-ui/core"; import { Skeleton } from "@saleor/macaw-ui-next"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -33,51 +33,57 @@ const PluginSecretFieldDialog: React.FC<PluginSecretFieldDialogProps> = ({ }; return ( - <Dialog fullWidth onClose={onClose} open={open} maxWidth="sm"> - <DialogTitle disableTypography> - {field ? ( - field.value === null ? ( - intl.formatMessage({ - id: "qCH2eZ", - defaultMessage: "Add Value to Authorization Field", - description: "header", - }) - ) : ( - intl.formatMessage({ - id: "Xy2T+y", - defaultMessage: "Edit Authorization Field", - description: "header", - }) - ) - ) : ( - <Skeleton /> - )} - </DialogTitle> - <Form initial={initialForm} onSubmit={onConfirm}> - {({ change, data, submit }) => ( - <> - <DialogContent> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="sm"> + <Form initial={initialForm} onSubmit={onConfirm}> + {({ change, data, submit }) => ( + <DashboardModal.Grid> + <DashboardModal.Title> + {field ? ( + field.value === null ? ( + intl.formatMessage({ + id: "qCH2eZ", + defaultMessage: "Add Value to Authorization Field", + description: "header", + }) + ) : ( + intl.formatMessage({ + id: "Xy2T+y", + defaultMessage: "Edit Authorization Field", + description: "header", + }) + ) + ) : ( + <Skeleton /> + )} + </DashboardModal.Title> + <TextField multiline={field?.type === ConfigurationTypeFieldEnum.SECRETMULTILINE} autoComplete="off" fullWidth label={field && field.label} name="value" - type={maybe(() => field.type) === ConfigurationTypeFieldEnum.PASSWORD && "password"} + type={ + maybe(() => field.type) === ConfigurationTypeFieldEnum.PASSWORD + ? "password" + : "text" + } value={data.value || ""} onChange={change} /> - </DialogContent> - <DialogActions> - <BackButton onClick={onClose} /> - <ConfirmButton transitionState={confirmButtonState} onClick={submit}> - <FormattedMessage {...buttonMessages.confirm} /> - </ConfirmButton> - </DialogActions> - </> - )} - </Form> - </Dialog> + + <DashboardModal.Actions> + <BackButton onClick={onClose} /> + <ConfirmButton transitionState={confirmButtonState} onClick={submit}> + <FormattedMessage {...buttonMessages.confirm} /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Grid> + )} + </Form> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/products/components/ProductExportDialog/ExportDialogSettings.tsx b/src/products/components/ProductExportDialog/ExportDialogSettings.tsx index f6d5d2a34bc..672dcedd685 100644 --- a/src/products/components/ProductExportDialog/ExportDialogSettings.tsx +++ b/src/products/components/ProductExportDialog/ExportDialogSettings.tsx @@ -9,24 +9,11 @@ import { import { ChangeEvent } from "@dashboard/hooks/useForm"; import { getFormErrors } from "@dashboard/utils/errors"; import getExportErrorMessage from "@dashboard/utils/errors/export"; -import { makeStyles } from "@saleor/macaw-ui"; import React from "react"; import { useIntl } from "react-intl"; import { ExportSettingsInput } from "./types"; -const useStyles = makeStyles( - theme => ({ - hr: { - marginBottom: theme.spacing(3), - marginTop: theme.spacing(3), - }, - }), - { - name: "ExportDialogSettings", - }, -); - export type ExportItemsQuantity = Record<"all" | "filter", number>; export interface ExportScopeLabels { @@ -54,7 +41,6 @@ const ExportDialogSettings: React.FC<ExportDialogSettingsProps> = ({ exportScopeLabels, allowScopeSelection = true, }) => { - const classes = useStyles({}); const intl = useIntl(); const formErrors = getFormErrors(formFields, errors); const productExportTypeChoices: Array<RadioGroupFieldChoice<FileTypesEnum>> = [ @@ -117,7 +103,7 @@ const ExportDialogSettings: React.FC<ExportDialogSettingsProps> = ({ onChange={onChange} value={data.scope} /> - <Hr className={classes.hr} /> + <Hr /> </> )} <RadioGroupField diff --git a/src/products/components/ProductExportDialog/ProductExportDialog.tsx b/src/products/components/ProductExportDialog/ProductExportDialog.tsx index bd74e6046c4..f3c0f55cbdc 100644 --- a/src/products/components/ProductExportDialog/ProductExportDialog.tsx +++ b/src/products/components/ProductExportDialog/ProductExportDialog.tsx @@ -2,6 +2,7 @@ import { Button } from "@dashboard/components/Button"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import makeCreatorSteps, { Step } from "@dashboard/components/CreatorSteps"; +import { DashboardModal } from "@dashboard/components/Modal"; import { ChannelFragment, ExportErrorFragment, @@ -18,8 +19,7 @@ import { DialogProps, FetchMoreProps, RelayToFlat } from "@dashboard/types"; import getExportErrorMessage from "@dashboard/utils/errors/export"; import { toggle } from "@dashboard/utils/lists"; import { mapNodeToChoice } from "@dashboard/utils/maps"; -import { Dialog, DialogActions, DialogContent, DialogTitle } from "@material-ui/core"; -import { Option, Text } from "@saleor/macaw-ui-next"; +import { Box, Option, Text } from "@saleor/macaw-ui-next"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -211,53 +211,52 @@ const ProductExportDialog: React.FC<ProductExportDialogProps> = ({ }; return ( - <Dialog onClose={onClose} open={open} maxWidth="sm" fullWidth> - <> - <DialogTitle disableTypography> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="sm"> + <DashboardModal.Title> <FormattedMessage {...messages.title} /> - </DialogTitle> - <DialogContent> - <ProductExportSteps currentStep={step} steps={steps} onStepClick={setStep} /> - {step === ProductExportStep.INFO && ( - <ProductExportDialogInfo - attributes={attributeChoices} - channels={channels} - data={data} - selectedChannels={selectedChannels} - selectedAttributes={selectedAttributes} - onAttrtibuteSelect={handleAttributeSelect} - onWarehouseSelect={handleWarehouseSelect} - onChange={change} - warehouses={warehouseChoices} - onChannelSelect={handleChannelSelect} - onSelectAllChannels={handleToggleAllChannels} - onSelectAllWarehouses={handleToggleAllWarehouses} - {...fetchMoreProps} - /> - )} - {step === ProductExportStep.SETTINGS && ( - <ExportDialogSettings - data={data} - errors={dialogErrors} - onChange={change} - itemsQuantity={productQuantity} - selectedItems={selectedProducts} - exportScopeLabels={exportScopeLabels} - /> - )} - </DialogContent> + </DashboardModal.Title> + + <ProductExportSteps currentStep={step} steps={steps} onStepClick={setStep} /> + {step === ProductExportStep.INFO && ( + <ProductExportDialogInfo + attributes={attributeChoices} + channels={channels} + data={data} + selectedChannels={selectedChannels} + selectedAttributes={selectedAttributes} + onAttrtibuteSelect={handleAttributeSelect} + onWarehouseSelect={handleWarehouseSelect} + onChange={change} + warehouses={warehouseChoices} + onChannelSelect={handleChannelSelect} + onSelectAllChannels={handleToggleAllChannels} + onSelectAllWarehouses={handleToggleAllWarehouses} + {...fetchMoreProps} + /> + )} + {step === ProductExportStep.SETTINGS && ( + <ExportDialogSettings + data={data} + errors={dialogErrors} + onChange={change} + itemsQuantity={productQuantity} + selectedItems={selectedProducts} + exportScopeLabels={exportScopeLabels} + /> + )} {notFormErrors.length > 0 && ( - <DialogContent> + <Box> {notFormErrors.map(err => ( - <Text color="critical1" key={err.field + err.code}> + <Text display="block" color="critical1" key={err.field + err.code}> {getExportErrorMessage(err, intl)} </Text> ))} - </DialogContent> + </Box> )} - <DialogActions> + <DashboardModal.Actions> {step === ProductExportStep.INFO && ( <Button variant="secondary" color="text" onClick={onClose} data-test-id="cancel"> <FormattedMessage {...buttonMessages.cancel} /> @@ -283,9 +282,9 @@ const ProductExportDialog: React.FC<ProductExportDialogProps> = ({ <FormattedMessage {...messages.confirmButtonLabel} /> </ConfirmButton> )} - </DialogActions> - </> - </Dialog> + </DashboardModal.Actions> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/products/components/ProductExportDialog/ProductExportDialogInfo.tsx b/src/products/components/ProductExportDialog/ProductExportDialogInfo.tsx index 64fe4d0eddc..b6dd2cebfee 100644 --- a/src/products/components/ProductExportDialog/ProductExportDialogInfo.tsx +++ b/src/products/components/ProductExportDialog/ProductExportDialogInfo.tsx @@ -89,7 +89,7 @@ const useStyles = makeStyles( marginBottom: theme.spacing(2), }, scrollArea: { - maxHeight: "calc(100vh - 350px)", + maxHeight: "calc(100vh - 390px)", minHeight: "auto", "@media (min-height: 800px)": { minHeight: 440, diff --git a/src/products/components/ProductExternalMediaDialog/ProductExternalMediaDialog.tsx b/src/products/components/ProductExternalMediaDialog/ProductExternalMediaDialog.tsx index 7d335459033..e241b920609 100644 --- a/src/products/components/ProductExternalMediaDialog/ProductExternalMediaDialog.tsx +++ b/src/products/components/ProductExternalMediaDialog/ProductExternalMediaDialog.tsx @@ -1,9 +1,8 @@ import Form from "@dashboard/components/Form"; -import FormSpacer from "@dashboard/components/FormSpacer"; +import { DashboardModal } from "@dashboard/components/Modal"; import { ProductFragment } from "@dashboard/graphql"; import { SubmitPromise } from "@dashboard/hooks/useForm"; import { buttonMessages } from "@dashboard/intl"; -import { Dialog, DialogActions, DialogContent, DialogTitle } from "@material-ui/core"; import { Button, Input, Text } from "@saleor/macaw-ui-next"; import React from "react"; import { defineMessages, FormattedMessage, useIntl } from "react-intl"; @@ -41,16 +40,17 @@ const ProductExternalMediaDialog: React.FC<ProductExternalMediaDialogProps> = ({ }; return ( - <Dialog onClose={onClose} open={open}> - <DialogTitle disableTypography> - <Text size={5} fontWeight="bold"> - {intl.formatMessage(messages.buttonMessage)} - </Text> - </DialogTitle> - <Form initial={initialValues} onSubmit={handleOnSubmit}> - {({ change, data, submit }) => ( - <> - <DialogContent> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="sm"> + <Form initial={initialValues} onSubmit={handleOnSubmit}> + {({ change, data, submit }) => ( + <DashboardModal.Grid> + <DashboardModal.Title> + <Text size={5} fontWeight="bold"> + {intl.formatMessage(messages.buttonMessage)} + </Text> + </DashboardModal.Title> + <Text size={2}> <FormattedMessage id="zDvDnG" @@ -58,7 +58,7 @@ const ProductExternalMediaDialog: React.FC<ProductExternalMediaDialogProps> = ({ description="modal header" /> </Text> - <FormSpacer /> + <Input label="URL" value={data.mediaUrl} @@ -68,18 +68,18 @@ const ProductExternalMediaDialog: React.FC<ProductExternalMediaDialogProps> = ({ autoFocus size="medium" /> - </DialogContent> - <DialogActions> - <Button variant="secondary" onClick={onClose}> - <FormattedMessage {...buttonMessages.back} /> - </Button> - <Button onClick={submit}>{intl.formatMessage(messages.buttonMessage)}</Button> - </DialogActions> - </> - )} - </Form> - </Dialog> + <DashboardModal.Actions> + <Button variant="secondary" onClick={onClose}> + <FormattedMessage {...buttonMessages.back} /> + </Button> + <Button onClick={submit}>{intl.formatMessage(messages.buttonMessage)}</Button> + </DashboardModal.Actions> + </DashboardModal.Grid> + )} + </Form> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/products/components/ProductVariantDeleteDialog/ProductVariantDeleteDialog.tsx b/src/products/components/ProductVariantDeleteDialog/ProductVariantDeleteDialog.tsx index a9367700087..f606c2f4884 100644 --- a/src/products/components/ProductVariantDeleteDialog/ProductVariantDeleteDialog.tsx +++ b/src/products/components/ProductVariantDeleteDialog/ProductVariantDeleteDialog.tsx @@ -1,30 +1,10 @@ -// @ts-strict-ignore import BackButton from "@dashboard/components/BackButton"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; -import { - Dialog, - DialogActions, - DialogContent, - DialogContentText, - DialogTitle, -} from "@material-ui/core"; -import { makeStyles } from "@saleor/macaw-ui"; +import { DashboardModal } from "@dashboard/components/Modal"; +import { Text } from "@saleor/macaw-ui-next"; import React from "react"; import { FormattedMessage } from "react-intl"; -const useStyles = makeStyles( - theme => ({ - deleteButton: { - "&:hover": { - backgroundColor: theme.palette.error.main, - }, - backgroundColor: theme.palette.error.main, - color: theme.palette.error.contrastText, - }, - }), - { name: "ProductVariantDeleteDialog" }, -); - export interface ProductVariantDeleteDialogProps { confirmButtonState: ConfirmButtonTransitionState; open: boolean; @@ -35,15 +15,19 @@ export interface ProductVariantDeleteDialogProps { const ProductVariantDeleteDialog: React.FC<ProductVariantDeleteDialogProps> = props => { const { confirmButtonState, name, open, onConfirm, onClose } = props; - const classes = useStyles(props); return ( - <Dialog onClose={onClose} open={open}> - <DialogTitle disableTypography> - <FormattedMessage id="GFJabu" defaultMessage="Delete Variant" description="dialog header" /> - </DialogTitle> - <DialogContent> - <DialogContentText> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="sm"> + <DashboardModal.Title> + <FormattedMessage + id="GFJabu" + defaultMessage="Delete Variant" + description="dialog header" + /> + </DashboardModal.Title> + + <Text> <FormattedMessage id="WwNtFn" defaultMessage="Are you sure you want to delete {name}?" @@ -52,20 +36,21 @@ const ProductVariantDeleteDialog: React.FC<ProductVariantDeleteDialogProps> = pr name, }} /> - </DialogContentText> - </DialogContent> - <DialogActions> - <BackButton onClick={onClose} /> - <ConfirmButton - transitionState={confirmButtonState} - className={classes.deleteButton} - onClick={onConfirm} - data-test-id="delete-variant-button" - > - <FormattedMessage id="rbkmfG" defaultMessage="Delete variant" description="button" /> - </ConfirmButton> - </DialogActions> - </Dialog> + </Text> + + <DashboardModal.Actions> + <BackButton onClick={onClose} /> + <ConfirmButton + transitionState={confirmButtonState} + variant="error" + onClick={onConfirm} + data-test-id="delete-variant-button" + > + <FormattedMessage id="rbkmfG" defaultMessage="Delete variant" description="button" /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/products/components/ProductVariantImageSelectDialog/ProductVariantMediaSelectDialog.tsx b/src/products/components/ProductVariantImageSelectDialog/ProductVariantMediaSelectDialog.tsx index 6a6ec0c978b..751fa2fdc77 100644 --- a/src/products/components/ProductVariantImageSelectDialog/ProductVariantMediaSelectDialog.tsx +++ b/src/products/components/ProductVariantImageSelectDialog/ProductVariantMediaSelectDialog.tsx @@ -1,16 +1,13 @@ -// @ts-strict-ignore import BackButton from "@dashboard/components/BackButton"; import { ConfirmButton } from "@dashboard/components/ConfirmButton"; +import { DashboardModal } from "@dashboard/components/Modal"; import { ProductMediaFragment } from "@dashboard/graphql"; import useModalDialogOpen from "@dashboard/hooks/useModalDialogOpen"; import { buttonMessages } from "@dashboard/intl"; -import { Dialog, DialogActions, DialogContent, DialogTitle } from "@material-ui/core"; -import clsx from "clsx"; +import { Box } from "@saleor/macaw-ui-next"; import React, { useState } from "react"; import { FormattedMessage } from "react-intl"; -import { useStyles } from "./styles"; - interface ProductVariantImageSelectDialogProps { media?: ProductMediaFragment[]; selectedMedia?: string[]; @@ -21,7 +18,6 @@ interface ProductVariantImageSelectDialogProps { const ProductVariantMediaSelectDialog: React.FC<ProductVariantImageSelectDialogProps> = props => { const { media, open, selectedMedia: initialMedia, onClose, onConfirm } = props; - const classes = useStyles(props); const [selectedMedia, setSelectedMedia] = useState(initialMedia); useModalDialogOpen(open, { @@ -30,60 +26,87 @@ const ProductVariantMediaSelectDialog: React.FC<ProductVariantImageSelectDialogP }); const handleMediaSelect = (id: string) => { - const isMediaAssigned = selectedMedia.includes(id); + const isMediaAssigned = selectedMedia?.includes(id); if (isMediaAssigned) { - setSelectedMedia(selectedMedia => selectedMedia.filter(mediaId => mediaId !== id)); + setSelectedMedia(selectedMedia => selectedMedia?.filter(mediaId => mediaId !== id)); } else { - setSelectedMedia(selectedMedia => [...selectedMedia, id]); + setSelectedMedia(selectedMedia => [...(selectedMedia ?? []), id]); } }; const handleConfirm = () => { - onConfirm(selectedMedia); + onConfirm(selectedMedia ?? []); onClose(); }; return ( - <Dialog onClose={onClose} open={open}> - <DialogTitle disableTypography> - <FormattedMessage - id="iPk640" - defaultMessage="Media Selection" - description="dialog header" - /> - </DialogTitle> - <DialogContent className={classes.content}> - <div className={classes.root}> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="md" __gridTemplateRows="auto 1fr"> + <DashboardModal.Title> + <FormattedMessage + id="iPk640" + defaultMessage="Media Selection" + description="dialog header" + /> + </DashboardModal.Title> + + <Box + overflowY="auto" + display="grid" + gap={2} + gridTemplateColumns={{ + desktop: 4, + tablet: 3, + mobile: 2, + }} + width="100%" + > {media - .sort((prev, next) => (prev.sortOrder > next.sortOrder ? 1 : -1)) + ?.sort((prev, next) => (prev.sortOrder! > next.sortOrder! ? 1 : -1)) .map(mediaObj => { const parsedMediaOembedData = JSON.parse(mediaObj?.oembedData); const mediaUrl = parsedMediaOembedData?.thumbnail_url || mediaObj.url; + const isSelected = selectedMedia?.includes(mediaObj.id); return ( - <div - className={clsx([ - classes.imageContainer, - { - [classes.selectedImageContainer]: selectedMedia.includes(mediaObj.id), - }, - ])} + <Box + backgroundColor="transparent" + borderStyle="solid" + __borderWidth={isSelected ? 2 : 1} + borderColor={isSelected ? "info1" : "default1"} + cursor="pointer" + __height={140} + overflow="hidden" + padding={3} + position="relative" + borderRadius={2} onClick={() => handleMediaSelect(mediaObj.id)} key={mediaObj.id} > - <img className={classes.image} src={mediaUrl} alt={mediaObj.alt} /> - </div> + <Box + width="100%" + height="100%" + objectFit="contain" + as="img" + src={mediaUrl} + alt={mediaObj.alt} + style={{ + userSelect: "none", + }} + /> + </Box> ); })} - </div> - </DialogContent> - <DialogActions> - <BackButton onClick={onClose} /> - <ConfirmButton transitionState="default" onClick={handleConfirm} data-test-id="submit"> - <FormattedMessage {...buttonMessages.confirm} /> - </ConfirmButton> - </DialogActions> - </Dialog> + </Box> + + <DashboardModal.Actions> + <BackButton onClick={onClose} /> + <ConfirmButton transitionState="default" onClick={handleConfirm} data-test-id="submit"> + <FormattedMessage {...buttonMessages.confirm} /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/products/components/ProductVariantImageSelectDialog/styles.ts b/src/products/components/ProductVariantImageSelectDialog/styles.ts deleted file mode 100644 index f057cfb730f..00000000000 --- a/src/products/components/ProductVariantImageSelectDialog/styles.ts +++ /dev/null @@ -1,43 +0,0 @@ -import { makeStyles } from "@saleor/macaw-ui"; -import { vars } from "@saleor/macaw-ui-next"; - -export const useStyles = makeStyles( - theme => ({ - image: { - height: "100%", - objectFit: "contain", - userSelect: "none", - width: "100%", - }, - imageContainer: { - background: "transparent", - border: `1px solid ${vars.colors.border.default1}`, - borderRadius: theme.spacing(), - cursor: "pointer", - height: theme.spacing(21.5), - overflow: "hidden", - padding: theme.spacing(2), - position: "relative", - transitionDuration: theme.transitions.duration.standard + "ms", - }, - content: { - overflowY: "scroll", - }, - root: { - display: "grid", - gridColumnGap: theme.spacing(2), - gridRowGap: theme.spacing(2), - gridTemplateColumns: "repeat(3, 1fr)", - maxWidth: "100%", - width: theme.breakpoints.values.lg, - [theme.breakpoints.down("sm")]: { - gridTemplateColumns: "repeat(2, 1fr)", - }, - }, - selectedImageContainer: { - borderColor: theme.palette.primary.main, - borderWidth: "2px", - }, - }), - { name: "ProductVariantImageSelectDialog" }, -); diff --git a/src/shipping/components/ShippingMethodProductsAddDialog/ShippingMethodProductsAddDialog.tsx b/src/shipping/components/ShippingMethodProductsAddDialog/ShippingMethodProductsAddDialog.tsx index 5edeb8a18dc..a097ed9a636 100644 --- a/src/shipping/components/ShippingMethodProductsAddDialog/ShippingMethodProductsAddDialog.tsx +++ b/src/shipping/components/ShippingMethodProductsAddDialog/ShippingMethodProductsAddDialog.tsx @@ -4,6 +4,7 @@ import { Channel, isAvailableInChannel } from "@dashboard/channels/utils"; import BackButton from "@dashboard/components/BackButton"; import Checkbox from "@dashboard/components/Checkbox"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; +import { DashboardModal } from "@dashboard/components/Modal"; import ResponsiveTable from "@dashboard/components/ResponsiveTable"; import TableCellAvatar from "@dashboard/components/TableCellAvatar"; import TableRowLink from "@dashboard/components/TableRowLink"; @@ -11,24 +12,15 @@ import { SearchProductsQuery, ShippingPriceExcludeProductMutation } from "@dashb import useSearchQuery from "@dashboard/hooks/useSearchQuery"; import { renderCollection } from "@dashboard/misc"; import { FetchMoreProps, RelayToFlat } from "@dashboard/types"; -import { - CircularProgress, - Dialog, - DialogActions, - DialogContent, - DialogTitle, - TableBody, - TableCell, - TextField, -} from "@material-ui/core"; +import { CircularProgress, TableBody, TableCell, TextField } from "@material-ui/core"; import { makeStyles } from "@saleor/macaw-ui"; -import { Skeleton, Text } from "@saleor/macaw-ui-next"; +import { Box, Skeleton, Text } from "@saleor/macaw-ui-next"; import React from "react"; import InfiniteScroll from "react-infinite-scroll-component"; import { FormattedMessage, useIntl } from "react-intl"; const useStyles = makeStyles( - theme => ({ + () => ({ avatar: { paddingLeft: 0, width: 64, @@ -36,19 +28,6 @@ const useStyles = makeStyles( colName: { paddingLeft: 0, }, - searchBar: { - marginBottom: theme.spacing(3), - }, - loadMoreLoaderContainer: { - alignItems: "center", - display: "flex", - height: theme.spacing(3), - justifyContent: "center", - marginTop: theme.spacing(3), - }, - overflow: { - overflowY: "visible", - }, productCheckboxCell: { "&:first-child": { paddingLeft: 0, @@ -83,6 +62,9 @@ const handleProductAssign = ( setSelectedProducts([...selectedProducts, product]); } }; + +const scrollableTargetId = "shippingMethodProductsAddScrollableDialog"; + const ShippingMethodProductsAddDialog: React.FC<ShippingMethodProductsAddDialogProps> = ({ confirmButtonState, open, @@ -114,16 +96,17 @@ const ShippingMethodProductsAddDialog: React.FC<ShippingMethodProductsAddDialogP }; return ( - <Dialog onClose={handleClose} open={open} fullWidth maxWidth="sm"> - <DialogTitle disableTypography> - <FormattedMessage - id="xZhxBJ" - defaultMessage="Assign Products" - description="dialog header" - /> - </DialogTitle> - <DialogContent> - <div data-test-id="assign-products-dialog-content" className={classes.searchBar}> + <DashboardModal onChange={handleClose} open={open}> + <DashboardModal.Content size="sm" __gridTemplateRows="auto auto 1fr"> + <DashboardModal.Title> + <FormattedMessage + id="xZhxBJ" + defaultMessage="Assign Products" + description="dialog header" + /> + </DashboardModal.Title> + + <Box data-test-id="assign-products-dialog-content"> <TextField data-test-id="search-bar" name="query" @@ -143,19 +126,27 @@ const ShippingMethodProductsAddDialog: React.FC<ShippingMethodProductsAddDialogP endAdornment: loading && <CircularProgress size={16} />, }} /> - </div> - <div> + </Box> + + <Box id={scrollableTargetId} overflowY="auto"> <InfiniteScroll dataLength={products?.length ?? 0} next={onFetchMore} hasMore={hasMore} scrollThreshold="100px" + scrollableTarget={scrollableTargetId} loader={ - <div key="loader" className={classes.loadMoreLoaderContainer}> + <Box + alignItems="center" + display="flex" + height={5} + justifyContent="center" + marginTop={5} + key="loader" + > <CircularProgress size={16} /> - </div> + </Box> } - height={450} > <ResponsiveTable key="table"> <TableBody data-test-id="assign-product-list"> @@ -228,25 +219,26 @@ const ShippingMethodProductsAddDialog: React.FC<ShippingMethodProductsAddDialogP </TableBody> </ResponsiveTable> </InfiniteScroll> - </div> - </DialogContent> - <DialogActions> - <BackButton onClick={handleClose} /> - <ConfirmButton - data-test-id="assign-and-save-button" - transitionState={confirmButtonState} - type="submit" - disabled={loading || !selectedProducts?.length} - onClick={handleSubmit} - > - <FormattedMessage - id="FzEew9" - defaultMessage="Assign and save" - description="assign products to shipping rate and save, button" - /> - </ConfirmButton> - </DialogActions> - </Dialog> + </Box> + + <DashboardModal.Actions> + <BackButton onClick={handleClose} /> + <ConfirmButton + data-test-id="assign-and-save-button" + transitionState={confirmButtonState} + type="submit" + disabled={loading || !selectedProducts?.length} + onClick={handleSubmit} + > + <FormattedMessage + id="FzEew9" + defaultMessage="Assign and save" + description="assign products to shipping rate and save, button" + /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/shipping/components/ShippingWeightUnitDialog/ShippingWeightUnitDialog.tsx b/src/shipping/components/ShippingWeightUnitDialog/ShippingWeightUnitDialog.tsx index d05980a8a4f..c26021889f8 100644 --- a/src/shipping/components/ShippingWeightUnitDialog/ShippingWeightUnitDialog.tsx +++ b/src/shipping/components/ShippingWeightUnitDialog/ShippingWeightUnitDialog.tsx @@ -24,7 +24,7 @@ export const ShippingWeightUnitDialog: React.FC<ShippingWeightUnitDialogProps> = }) => { return ( <DashboardModal open={open} onChange={onClose}> - <DashboardModal.Content> + <DashboardModal.Content size="sm"> <Box alignItems="center" display="flex" gap={3} justifyContent="space-between"> <DashboardModal.Title> <FormattedMessage diff --git a/src/shipping/components/ShippingZoneAddWarehouseDialog/ShippingZoneAddWarehouseDialog.tsx b/src/shipping/components/ShippingZoneAddWarehouseDialog/ShippingZoneAddWarehouseDialog.tsx index 8919c534665..a86949b1d08 100644 --- a/src/shipping/components/ShippingZoneAddWarehouseDialog/ShippingZoneAddWarehouseDialog.tsx +++ b/src/shipping/components/ShippingZoneAddWarehouseDialog/ShippingZoneAddWarehouseDialog.tsx @@ -3,7 +3,7 @@ import CompanyAddressForm from "@dashboard/components/CompanyAddressInput/Compan import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import Form from "@dashboard/components/Form"; import Hr from "@dashboard/components/Hr"; -import { DASHBOARD_MODAL_WIDTH, DashboardModal } from "@dashboard/components/Modal"; +import { DashboardModal } from "@dashboard/components/Modal"; import { AddressTypeInput } from "@dashboard/customers/types"; import { CountryWithCodeFragment, WarehouseErrorFragment } from "@dashboard/graphql"; import useAddressValidation from "@dashboard/hooks/useAddressValidation"; @@ -74,7 +74,7 @@ const ShippingZoneAddWarehouseDialog: React.FC<ShippingZoneAddWarehouseDialogPro ); return ( - <DashboardModal.Content __maxWidth={DASHBOARD_MODAL_WIDTH} width="100%"> + <DashboardModal.Content size="sm"> <DashboardModal.Title> <FormattedMessage id="yzYXW/" diff --git a/src/shipping/components/ShippingZoneCountriesAssignDialog/ShippingZoneCountriesAssignDialog.tsx b/src/shipping/components/ShippingZoneCountriesAssignDialog/ShippingZoneCountriesAssignDialog.tsx index 169c5a65b2f..5fd1e4c16ea 100644 --- a/src/shipping/components/ShippingZoneCountriesAssignDialog/ShippingZoneCountriesAssignDialog.tsx +++ b/src/shipping/components/ShippingZoneCountriesAssignDialog/ShippingZoneCountriesAssignDialog.tsx @@ -1,26 +1,16 @@ -// @ts-strict-ignore import BackButton from "@dashboard/components/BackButton"; import Checkbox from "@dashboard/components/Checkbox"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import Form from "@dashboard/components/Form"; -import FormSpacer from "@dashboard/components/FormSpacer"; import Hr from "@dashboard/components/Hr"; +import { DashboardModal } from "@dashboard/components/Modal"; import ResponsiveTable from "@dashboard/components/ResponsiveTable"; import TableRowLink from "@dashboard/components/TableRowLink"; import { CountryWithCodeFragment } from "@dashboard/graphql"; import { fuzzySearch } from "@dashboard/misc"; import { getCountrySelectionMap, isRestWorldCountriesSelected } from "@dashboard/shipping/handlers"; -import useScrollableDialogStyle from "@dashboard/styles/useScrollableDialogStyle"; -import { - Dialog, - DialogActions, - DialogContent, - DialogTitle, - TableBody, - TableCell, - TextField, -} from "@material-ui/core"; -import { Text } from "@saleor/macaw-ui-next"; +import { TableBody, TableCell, TextField } from "@material-ui/core"; +import { Box, Text } from "@saleor/macaw-ui-next"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -49,7 +39,6 @@ const ShippingZoneCountriesAssignDialog: React.FC< const { confirmButtonState, onClose, countries, restWorldCountries, open, initial, onConfirm } = props; const classes = useStyles(props); - const scrollableDialogClasses = useScrollableDialogStyle(); const intl = useIntl(); const initialForm: FormData = { countries: initial, @@ -57,33 +46,34 @@ const ShippingZoneCountriesAssignDialog: React.FC< }; return ( - <Dialog onClose={onClose} open={open} fullWidth maxWidth="sm"> - <Form initial={initialForm} onSubmit={onConfirm} className={scrollableDialogClasses.form}> - {({ data, change }) => { - const countrySelectionMap = getCountrySelectionMap(countries, data.countries); - const isRestOfTheWorldSelected = isRestWorldCountriesSelected( - restWorldCountries, - countrySelectionMap, - ); - const handleCountryChange = createCountryChangeHandler(data.countries, change); - const handleRestOfTheWorldChange = createRestOfTheWorldChangeHandler( - countrySelectionMap, - data.countries, - restWorldCountries, - change, - ); - const displayCountries = fuzzySearch(countries, data.query, ["country"]); - - return ( - <> - <DialogTitle disableTypography> - <FormattedMessage {...messages.assignCountriesTitle} /> - </DialogTitle> - <DialogContent> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="sm"> + <Form initial={initialForm} onSubmit={onConfirm}> + {({ data, change }) => { + const countrySelectionMap = getCountrySelectionMap(countries, data.countries); + const isRestOfTheWorldSelected = isRestWorldCountriesSelected( + restWorldCountries, + countrySelectionMap, + ); + const handleCountryChange = createCountryChangeHandler(data.countries, change); + const handleRestOfTheWorldChange = createRestOfTheWorldChangeHandler( + countrySelectionMap, + data.countries, + restWorldCountries, + change, + ); + const displayCountries = fuzzySearch(countries, data.query, ["country"]); + + return ( + <DashboardModal.Grid> + <DashboardModal.Title> + <FormattedMessage {...messages.assignCountriesTitle} /> + </DashboardModal.Title> + <Text> <FormattedMessage {...messages.assignCountriesDescription} /> </Text> - <FormSpacer /> + <TextField name="query" data-test-id="search-country-input" @@ -93,15 +83,15 @@ const ShippingZoneCountriesAssignDialog: React.FC< placeholder={intl.formatMessage(messages.searchCountriesPlaceholder)} fullWidth /> - <FormSpacer /> + <Hr /> - <FormSpacer /> + {restWorldCountries.length > 0 && ( <> <Text fontSize={3}> <FormattedMessage {...messages.quickPickSubtitle} /> </Text> - <FormSpacer /> + <ResponsiveTable className={classes.table}> <TableBody> <TableRowLink @@ -121,51 +111,53 @@ const ShippingZoneCountriesAssignDialog: React.FC< </TableRowLink> </TableBody> </ResponsiveTable> - <FormSpacer /> </> )} + <Text fontSize={3}> <FormattedMessage {...messages.countriesSubtitle} /> </Text> - </DialogContent> - <DialogContent className={scrollableDialogClasses.scrollArea}> - <ResponsiveTable className={classes.table}> - <TableBody> - {displayCountries.map(country => { - const isChecked = countrySelectionMap[country.code]; - - return ( - <TableRowLink - data-test-id="country-row" - className={classes.clickableRow} - onClick={() => handleCountryChange(country.code, !isChecked)} - key={country.code} - > - <TableCell className={classes.wideCell}>{country.country}</TableCell> - <TableCell padding="checkbox" className={classes.checkboxCell}> - <Checkbox checked={isChecked} /> - </TableCell> - </TableRowLink> - ); - })} - </TableBody> - </ResponsiveTable> - </DialogContent> - <DialogActions> - <BackButton onClick={onClose} data-test-id="back-button" /> - <ConfirmButton - transitionState={confirmButtonState} - type="submit" - data-test-id="assign-and-save-button" - > - <FormattedMessage {...messages.assignCountriesButton} /> - </ConfirmButton> - </DialogActions> - </> - ); - }} - </Form> - </Dialog> + + <Box overflowY="auto" __maxHeight="calc(100vh - 580px)"> + <ResponsiveTable className={classes.table}> + <TableBody> + {displayCountries.map(country => { + const isChecked = countrySelectionMap[country.code]; + + return ( + <TableRowLink + data-test-id="country-row" + className={classes.clickableRow} + onClick={() => handleCountryChange(country.code, !isChecked)} + key={country.code} + > + <TableCell className={classes.wideCell}>{country.country}</TableCell> + <TableCell padding="checkbox" className={classes.checkboxCell}> + <Checkbox checked={isChecked} /> + </TableCell> + </TableRowLink> + ); + })} + </TableBody> + </ResponsiveTable> + </Box> + + <DashboardModal.Actions> + <BackButton onClick={onClose} data-test-id="back-button" /> + <ConfirmButton + transitionState={confirmButtonState} + type="submit" + data-test-id="assign-and-save-button" + > + <FormattedMessage {...messages.assignCountriesButton} /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Grid> + ); + }} + </Form> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/shipping/components/ShippingZoneCountriesAssignDialog/handlers.ts b/src/shipping/components/ShippingZoneCountriesAssignDialog/handlers.ts index 3fd1a4cc646..e8dee90ad14 100644 --- a/src/shipping/components/ShippingZoneCountriesAssignDialog/handlers.ts +++ b/src/shipping/components/ShippingZoneCountriesAssignDialog/handlers.ts @@ -17,7 +17,7 @@ export function createCountryChangeHandler(selectedCountries: string[], change: } export function createRestOfTheWorldChangeHandler( - countrySelectionMap: Map<string, boolean>, + countrySelectionMap: Record<string, boolean>, selectedCountries: string[], restWorldCountries: string[], change: FormChange, diff --git a/src/shipping/components/ShippingZonePostalCodeRangeDialog/ShippingZonePostalCodeRangeDialog.tsx b/src/shipping/components/ShippingZonePostalCodeRangeDialog/ShippingZonePostalCodeRangeDialog.tsx index 9d5330d786e..d7809373dee 100644 --- a/src/shipping/components/ShippingZonePostalCodeRangeDialog/ShippingZonePostalCodeRangeDialog.tsx +++ b/src/shipping/components/ShippingZonePostalCodeRangeDialog/ShippingZonePostalCodeRangeDialog.tsx @@ -2,10 +2,10 @@ import BackButton from "@dashboard/components/BackButton"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import Form from "@dashboard/components/Form"; import Grid from "@dashboard/components/Grid"; +import { DashboardModal } from "@dashboard/components/Modal"; import { commonMessages } from "@dashboard/intl"; import { DialogProps, MinMax } from "@dashboard/types"; -import { Dialog, DialogActions, DialogContent, DialogTitle, TextField } from "@material-ui/core"; -import { makeStyles } from "@saleor/macaw-ui"; +import { TextField } from "@material-ui/core"; import { Text } from "@saleor/macaw-ui-next"; import React from "react"; import { FormattedMessage, useIntl } from "react-intl"; @@ -15,23 +15,12 @@ export interface ShippingZonePostalCodeRangeDialogProps extends DialogProps { onSubmit: (range: MinMax) => void; } -const useStyles = makeStyles( - theme => ({ - info: { - marginBottom: theme.spacing(2), - }, - }), - { - name: "ShippingZonePostalCodeRangeDialog", - }, -); const ShippingZonePostalCodeRangeDialog: React.FC<ShippingZonePostalCodeRangeDialogProps> = ({ confirmButtonState, open, onClose, onSubmit, }) => { - const classes = useStyles({}); const intl = useIntl(); const initial: MinMax = { max: "", @@ -39,24 +28,26 @@ const ShippingZonePostalCodeRangeDialog: React.FC<ShippingZonePostalCodeRangeDia }; return ( - <Dialog open={open}> - <DialogTitle disableTypography> - <FormattedMessage - id="2Xt+sw" - defaultMessage="Add postal codes" - description="dialog header" - /> - </DialogTitle> - <Form initial={initial} onSubmit={onSubmit}> - {({ change, data }) => ( - <> - <DialogContent> - <Text className={classes.info}> + <DashboardModal onChange={onClose} open={open}> + <DashboardModal.Content size="sm"> + <Form initial={initial} onSubmit={onSubmit}> + {({ change, data }) => ( + <DashboardModal.Grid> + <DashboardModal.Title> + <FormattedMessage + id="2Xt+sw" + defaultMessage="Add postal codes" + description="dialog header" + /> + </DashboardModal.Title> + + <Text> <FormattedMessage id="8InCjD" defaultMessage="Please provide range of postal codes you want to add to the include/exclude list." /> </Text> + <Grid variant="uniform"> <TextField data-test-id="zip-code-starts-with-input" @@ -82,26 +73,27 @@ const ShippingZonePostalCodeRangeDialog: React.FC<ShippingZonePostalCodeRangeDia onChange={change} /> </Grid> - </DialogContent> - <DialogActions> - <BackButton onClick={onClose} /> - <ConfirmButton - disabled={!data.min} - transitionState={confirmButtonState} - type="submit" - data-test-id="submit" - > - <FormattedMessage - id="DM/Ha1" - defaultMessage="Add" - description="add postal code range, button" - /> - </ConfirmButton> - </DialogActions> - </> - )} - </Form> - </Dialog> + + <DashboardModal.Actions> + <BackButton onClick={onClose} /> + <ConfirmButton + disabled={!data.min} + transitionState={confirmButtonState} + type="submit" + data-test-id="submit" + > + <FormattedMessage + id="DM/Ha1" + defaultMessage="Add" + description="add postal code range, button" + /> + </ConfirmButton> + </DashboardModal.Actions> + </DashboardModal.Grid> + )} + </Form> + </DashboardModal.Content> + </DashboardModal> ); }; diff --git a/src/shipping/handlers.ts b/src/shipping/handlers.ts index acf5e43c4fd..ef593cba9d8 100644 --- a/src/shipping/handlers.ts +++ b/src/shipping/handlers.ts @@ -279,24 +279,25 @@ export function getCountrySelectionMap( countries?: CountryFragment[], countriesSelected?: string[], ) { - return ( - countriesSelected && - countries?.reduce( - (acc, country) => { - acc[country.code] = !!countriesSelected.find( - selectedCountries => selectedCountries === country.code, - ); + if (!countriesSelected || !countries) { + return {} as Record<string, boolean>; + } - return acc; - }, - {} as Map<string, boolean>, - ) + return countries.reduce( + (acc, country) => { + acc[country.code] = !!countriesSelected.find( + selectedCountries => selectedCountries === country.code, + ); + + return acc; + }, + {} as Record<string, boolean>, ); } export function isRestWorldCountriesSelected( restWorldCountries?: string[], - countrySelectionMap?: Map<string, boolean>, + countrySelectionMap?: Record<string, boolean>, ) { return ( countrySelectionMap && diff --git a/src/staff/components/StaffAddMemberDialog/StaffAddMemberDialog.tsx b/src/staff/components/StaffAddMemberDialog/StaffAddMemberDialog.tsx index 7acf925fe20..cae269e0ad3 100644 --- a/src/staff/components/StaffAddMemberDialog/StaffAddMemberDialog.tsx +++ b/src/staff/components/StaffAddMemberDialog/StaffAddMemberDialog.tsx @@ -62,7 +62,7 @@ const StaffAddMemberDialog: React.FC<StaffAddMemberDialogProps> = props => { onSubmit={onConfirm} > {({ change, data: formData, submit }) => ( - <DashboardModal.Content __width={400} overflow="hidden"> + <DashboardModal.Content size="sm"> <DashboardModal.Title> <FormattedMessage id="23g7PY" @@ -78,6 +78,7 @@ const StaffAddMemberDialog: React.FC<StaffAddMemberDialogProps> = props => { type="text" value={formData.firstName} onChange={change} + fullWidth /> <TextField data-test-id="last-name-input" @@ -85,6 +86,7 @@ const StaffAddMemberDialog: React.FC<StaffAddMemberDialogProps> = props => { type="text" value={formData.lastName} onChange={change} + fullWidth /> </Box> diff --git a/src/staff/components/StaffPasswordResetDialog/StaffPasswordResetDialog.tsx b/src/staff/components/StaffPasswordResetDialog/StaffPasswordResetDialog.tsx index 8faec70f099..e5e802a8696 100644 --- a/src/staff/components/StaffPasswordResetDialog/StaffPasswordResetDialog.tsx +++ b/src/staff/components/StaffPasswordResetDialog/StaffPasswordResetDialog.tsx @@ -2,7 +2,7 @@ import BackButton from "@dashboard/components/BackButton"; import { ConfirmButton, ConfirmButtonTransitionState } from "@dashboard/components/ConfirmButton"; import Form from "@dashboard/components/Form"; -import { DASHBOARD_MODAL_WIDTH, DashboardModal } from "@dashboard/components/Modal"; +import { DashboardModal } from "@dashboard/components/Modal"; import { AccountErrorFragment } from "@dashboard/graphql"; import { SubmitPromise } from "@dashboard/hooks/useForm"; import useModalDialogErrors from "@dashboard/hooks/useModalDialogErrors"; @@ -43,7 +43,7 @@ const StaffPasswordResetDialog: React.FC<StaffPasswordResetDialogProps> = ({ <DashboardModal onChange={onClose} open={open}> <Form initial={initialForm} onSubmit={onSubmit}> {({ change, data }) => ( - <DashboardModal.Content __width={DASHBOARD_MODAL_WIDTH}> + <DashboardModal.Content size="sm"> <DashboardModal.Title> <FormattedMessage id="+kb2lM" diff --git a/src/styles/useScrollableDialogStyle.ts b/src/styles/useScrollableDialogStyle.ts index 429185f92fa..3ff990e4436 100644 --- a/src/styles/useScrollableDialogStyle.ts +++ b/src/styles/useScrollableDialogStyle.ts @@ -20,7 +20,7 @@ const useScrollableDialogStyle = makeStyles( marginTop: theme.spacing(3), }, scrollArea: { - overflowY: "scroll", + overflowY: "auto", paddingTop: 0, height: "inherit", marginBottom: theme.spacing(3), diff --git a/src/taxes/components/TaxCountryDialog/TaxCountryDialog.tsx b/src/taxes/components/TaxCountryDialog/TaxCountryDialog.tsx index da104cd60c3..18c1b1f49ec 100644 --- a/src/taxes/components/TaxCountryDialog/TaxCountryDialog.tsx +++ b/src/taxes/components/TaxCountryDialog/TaxCountryDialog.tsx @@ -1,5 +1,5 @@ // @ts-strict-ignore -import { DASHBOARD_MODAL_WIDTH, DashboardModal } from "@dashboard/components/Modal"; +import { DashboardModal } from "@dashboard/components/Modal"; import { CountryFragment } from "@dashboard/graphql"; import { useLocalSearch } from "@dashboard/hooks/useLocalSearch"; import useModalDialogOpen from "@dashboard/hooks/useModalDialogOpen"; @@ -45,7 +45,7 @@ export const TaxCountryDialog: React.FC<TaxCountryDialogProps> = ({ return ( <DashboardModal open={open} onChange={onClose}> - <DashboardModal.Content __width={DASHBOARD_MODAL_WIDTH}> + <DashboardModal.Content size="sm"> <DashboardModal.Title display="flex" justifyContent="space-between" alignItems="center"> <FormattedMessage {...taxesMessages.chooseCountryDialogTitle} /> <DashboardModal.Close onClose={onClose} /> diff --git a/src/utils/errors/order.ts b/src/utils/errors/order.ts index 9be0853e59b..a43df24fbfe 100644 --- a/src/utils/errors/order.ts +++ b/src/utils/errors/order.ts @@ -75,7 +75,10 @@ const messages = defineMessages({ }, }); -function getOrderErrorMessage(err: OrderErrorFragment, intl: IntlShape): string | undefined { +function getOrderErrorMessage( + err: OrderErrorFragment | undefined, + intl: IntlShape, +): string | undefined { if (err) { switch (err.code) { case OrderErrorCode.BILLING_ADDRESS_NOT_SET: