diff --git a/locale/defaultMessages.json b/locale/defaultMessages.json index 13fb9f884..ce8015f6f 100644 --- a/locale/defaultMessages.json +++ b/locale/defaultMessages.json @@ -1400,23 +1400,15 @@ "context": "section header", "string": "App Status" }, - "src_dot_components_dot_AssignCategoryDialog_dot_1305061437": { - "string": "Search Categories" - }, - "src_dot_components_dot_AssignCategoryDialog_dot_190977792": { + "src_dot_components_dot_AssignCategoryDialog_dot_3125506097": { "context": "dialog header", - "string": "Assign Categories" + "string": "Assign Category" }, "src_dot_components_dot_AssignCategoryDialog_dot_3690273268": { "string": "Search by category name, etc..." }, - "src_dot_components_dot_AssignCategoryDialog_dot_3973677075": { - "context": "button", - "string": "Assign categories" - }, - "src_dot_components_dot_AssignCollectionDialog_dot_1035511604": { - "context": "button", - "string": "Assign collections" + "src_dot_components_dot_AssignCategoryDialog_dot_3841025483": { + "string": "Search Category" }, "src_dot_components_dot_AssignCollectionDialog_dot_2605414502": { "string": "Search by collection name, etc..." @@ -1428,6 +1420,10 @@ "src_dot_components_dot_AssignCollectionDialog_dot_4057224233": { "string": "Search Collection" }, + "src_dot_components_dot_AssignContainerDialog_dot_1731102929": { + "context": "button", + "string": "Assign" + }, "src_dot_components_dot_AssignProductDialog_dot_2100305525": { "context": "button", "string": "Assign products" diff --git a/src/components/AssignCategoryDialog/AssignCategoryDialog.tsx b/src/components/AssignCategoryDialog/AssignCategoryDialog.tsx index 4008e4472..f0077a198 100644 --- a/src/components/AssignCategoryDialog/AssignCategoryDialog.tsx +++ b/src/components/AssignCategoryDialog/AssignCategoryDialog.tsx @@ -1,213 +1,41 @@ -import Button from "@material-ui/core/Button"; -import CircularProgress from "@material-ui/core/CircularProgress"; -import Dialog from "@material-ui/core/Dialog"; -import DialogActions from "@material-ui/core/DialogActions"; -import DialogContent from "@material-ui/core/DialogContent"; -import DialogTitle from "@material-ui/core/DialogTitle"; -import { makeStyles } from "@material-ui/core/styles"; -import TableBody from "@material-ui/core/TableBody"; -import TableCell from "@material-ui/core/TableCell"; -import TableRow from "@material-ui/core/TableRow"; -import TextField from "@material-ui/core/TextField"; -import ConfirmButton, { - ConfirmButtonTransitionState -} from "@saleor/components/ConfirmButton"; -import FormSpacer from "@saleor/components/FormSpacer"; -import ResponsiveTable from "@saleor/components/ResponsiveTable"; -import useSearchQuery from "@saleor/hooks/useSearchQuery"; -import { buttonMessages } from "@saleor/intl"; import { SearchCategories_search_edges_node } from "@saleor/searches/types/SearchCategories"; -import useScrollableDialogStyle from "@saleor/styles/useScrollableDialogStyle"; -import { FetchMoreProps } from "@saleor/types"; import React from "react"; -import InfiniteScroll from "react-infinite-scroller"; -import { FormattedMessage, useIntl } from "react-intl"; +import { useIntl } from "react-intl"; -import Checkbox from "../Checkbox"; +import AssignContainerDialog, { + AssignContainerDialogProps +} from "../AssignContainerDialog"; -export interface FormData { +interface AssignCategoryDialogProps + extends Omit { categories: SearchCategories_search_edges_node[]; - query: string; } -const useStyles = makeStyles( - { - avatar: { - "&:first-child": { - paddingLeft: 0 - } - }, - checkboxCell: { - paddingLeft: 0 - }, - wideCell: { - width: "100%" - } - }, - { name: "AssignCategoryDialog" } -); - -interface AssignCategoriesDialogProps extends FetchMoreProps { - categories: SearchCategories_search_edges_node[]; - confirmButtonState: ConfirmButtonTransitionState; - open: boolean; - loading: boolean; - onClose: () => void; - onFetch: (value: string) => void; - onSubmit: (data: SearchCategories_search_edges_node[]) => void; -} - -function handleCategoryAssign( - product: SearchCategories_search_edges_node, - isSelected: boolean, - selectedCategories: SearchCategories_search_edges_node[], - setSelectedCategories: (data: SearchCategories_search_edges_node[]) => void -) { - if (isSelected) { - setSelectedCategories( - selectedCategories.filter( - selectedProduct => selectedProduct.id !== product.id - ) - ); - } else { - setSelectedCategories([...selectedCategories, product]); - } -} - -const AssignCategoriesDialog: React.FC = props => { - const { - confirmButtonState, - open, - loading, - categories: categories, - hasMore, - onClose, - onFetch, - onFetchMore, - onSubmit - } = props; - const classes = useStyles(props); - const scrollableDialogClasses = useScrollableDialogStyle({}); - +const AssignCategoryDialog: React.FC = ({ + categories, + ...rest +}) => { const intl = useIntl(); - const [query, onQueryChange] = useSearchQuery(onFetch); - const [selectedCategories, setSelectedCategories] = React.useState< - SearchCategories_search_edges_node[] - >([]); - const container = React.useRef(); - - const handleSubmit = () => onSubmit(selectedCategories); - - const containerHeight = container.current?.scrollHeight - 130; return ( - - - - - - - }} - /> - -
- - -
- } - threshold={10} - > - - - {categories && - categories.map(category => { - const isSelected = !!selectedCategories.find( - selectedCategories => - selectedCategories.id === category.id - ); - - return ( - - - - handleCategoryAssign( - category, - isSelected, - selectedCategories, - setSelectedCategories - ) - } - /> - - - {category.name} - - - ); - })} - - - - -
- - - - - - -
+ ); }; -AssignCategoriesDialog.displayName = "AssignCategoriesDialog"; -export default AssignCategoriesDialog; + +AssignCategoryDialog.displayName = "AssignCategoryDialog"; +export default AssignCategoryDialog; diff --git a/src/components/AssignCollectionDialog/AssignCollectionDialog.tsx b/src/components/AssignCollectionDialog/AssignCollectionDialog.tsx index 99266f934..0ee4d7146 100644 --- a/src/components/AssignCollectionDialog/AssignCollectionDialog.tsx +++ b/src/components/AssignCollectionDialog/AssignCollectionDialog.tsx @@ -1,213 +1,41 @@ -import Button from "@material-ui/core/Button"; -import CircularProgress from "@material-ui/core/CircularProgress"; -import Dialog from "@material-ui/core/Dialog"; -import DialogActions from "@material-ui/core/DialogActions"; -import DialogContent from "@material-ui/core/DialogContent"; -import DialogTitle from "@material-ui/core/DialogTitle"; -import { makeStyles } from "@material-ui/core/styles"; -import TableBody from "@material-ui/core/TableBody"; -import TableCell from "@material-ui/core/TableCell"; -import TableRow from "@material-ui/core/TableRow"; -import TextField from "@material-ui/core/TextField"; -import ResponsiveTable from "@saleor/components/ResponsiveTable"; -import useSearchQuery from "@saleor/hooks/useSearchQuery"; -import { buttonMessages } from "@saleor/intl"; import { SearchCollections_search_edges_node } from "@saleor/searches/types/SearchCollections"; -import useScrollableDialogStyle from "@saleor/styles/useScrollableDialogStyle"; -import { FetchMoreProps } from "@saleor/types"; import React from "react"; -import InfiniteScroll from "react-infinite-scroller"; -import { FormattedMessage, useIntl } from "react-intl"; +import { useIntl } from "react-intl"; -import Checkbox from "../Checkbox"; -import ConfirmButton, { - ConfirmButtonTransitionState -} from "../ConfirmButton/ConfirmButton"; -import FormSpacer from "../FormSpacer"; +import AssignContainerDialog, { + AssignContainerDialogProps +} from "../AssignContainerDialog"; -export interface FormData { +interface AssignCollectionDialogProps + extends Omit { collections: SearchCollections_search_edges_node[]; - query: string; } -const useStyles = makeStyles( - { - avatar: { - "&:first-child": { - paddingLeft: 0 - } - }, - checkboxCell: { - paddingLeft: 0 - }, - wideCell: { - width: "100%" - } - }, - { name: "AssignCollectionDialog" } -); - -interface AssignCollectionDialogProps extends FetchMoreProps { - collections: SearchCollections_search_edges_node[]; - confirmButtonState: ConfirmButtonTransitionState; - open: boolean; - loading: boolean; - onClose: () => void; - onFetch: (value: string) => void; - onSubmit: (data: SearchCollections_search_edges_node[]) => void; -} - -function handleCollectionAssign( - product: SearchCollections_search_edges_node, - isSelected: boolean, - selectedCollections: SearchCollections_search_edges_node[], - setSelectedCollections: (data: SearchCollections_search_edges_node[]) => void -) { - if (isSelected) { - setSelectedCollections( - selectedCollections.filter( - selectedProduct => selectedProduct.id !== product.id - ) - ); - } else { - setSelectedCollections([...selectedCollections, product]); - } -} - -const AssignCollectionDialog: React.FC = props => { - const { - confirmButtonState, - hasMore, - open, - loading, - collections, - onClose, - onFetch, - onFetchMore, - onSubmit - } = props; - const classes = useStyles(props); - const scrollableDialogClasses = useScrollableDialogStyle({}); - +const AssignCollectionDialog: React.FC = ({ + collections, + ...rest +}) => { const intl = useIntl(); - const [query, onQueryChange] = useSearchQuery(onFetch); - const [selectedCollections, setSelectedCollections] = React.useState< - SearchCollections_search_edges_node[] - >([]); - const container = React.useRef(); - - const handleSubmit = () => onSubmit(selectedCollections); - - const containerHeight = container.current?.scrollHeight - 130; return ( - - - - - - - }} - /> - -
- - -
- } - threshold={10} - > - - - {collections && - collections.map(collection => { - const isSelected = !!selectedCollections.find( - selectedCollection => - selectedCollection.id === collection.id - ); - - return ( - - - - handleCollectionAssign( - collection, - isSelected, - selectedCollections, - setSelectedCollections - ) - } - /> - - - {collection.name} - - - ); - })} - - - - -
- - - - - - -
+ ); }; + AssignCollectionDialog.displayName = "AssignCollectionDialog"; export default AssignCollectionDialog; diff --git a/src/components/AssignContainerDialog/AssignContainerDialog.tsx b/src/components/AssignContainerDialog/AssignContainerDialog.tsx new file mode 100644 index 000000000..23b3e29b4 --- /dev/null +++ b/src/components/AssignContainerDialog/AssignContainerDialog.tsx @@ -0,0 +1,204 @@ +import Button from "@material-ui/core/Button"; +import CircularProgress from "@material-ui/core/CircularProgress"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import { makeStyles } from "@material-ui/core/styles"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableRow from "@material-ui/core/TableRow"; +import TextField from "@material-ui/core/TextField"; +import ResponsiveTable from "@saleor/components/ResponsiveTable"; +import useSearchQuery from "@saleor/hooks/useSearchQuery"; +import { buttonMessages } from "@saleor/intl"; +import useScrollableDialogStyle from "@saleor/styles/useScrollableDialogStyle"; +import { FetchMoreProps, Node } from "@saleor/types"; +import React from "react"; +import InfiniteScroll from "react-infinite-scroller"; +import { FormattedMessage } from "react-intl"; + +import Checkbox from "../Checkbox"; +import ConfirmButton, { + ConfirmButtonTransitionState +} from "../ConfirmButton/ConfirmButton"; +import FormSpacer from "../FormSpacer"; + +export interface FormData { + containers: string[]; + query: string; +} + +const useStyles = makeStyles( + { + avatar: { + "&:first-child": { + paddingLeft: 0 + } + }, + checkboxCell: { + paddingLeft: 0 + }, + wideCell: { + width: "100%" + } + }, + { name: "AssignContainerDialog" } +); + +interface Container extends Node { + name: string; +} +export interface AssignContainerDialogProps extends FetchMoreProps { + confirmButtonState: ConfirmButtonTransitionState; + containers: Container[]; + loading: boolean; + open: boolean; + search: Record<"label" | "placeholder", string>; + title: string; + onClose: () => void; + onFetch: (value: string) => void; + onSubmit: (data: string[]) => void; +} + +function handleContainerAssign( + containerId: string, + isSelected: boolean, + selectedContainers: string[], + setSelectedContainers: (data: string[]) => void +) { + if (isSelected) { + setSelectedContainers( + selectedContainers.filter( + selectedContainer => selectedContainer !== containerId + ) + ); + } else { + setSelectedContainers([...selectedContainers, containerId]); + } +} + +const AssignContainerDialog: React.FC = props => { + const { + confirmButtonState, + containers, + hasMore, + loading, + open, + search, + title, + onClose, + onFetch, + onFetchMore, + onSubmit + } = props; + const classes = useStyles(props); + const scrollableDialogClasses = useScrollableDialogStyle({}); + + const [query, onQueryChange] = useSearchQuery(onFetch); + const [selectedContainers, setSelectedContainers] = React.useState( + [] + ); + const container = React.useRef(); + + const handleSubmit = () => onSubmit(selectedContainers); + + const containerHeight = container.current?.scrollHeight - 130; + + return ( + + {title} + + + }} + /> + +
+ + +
+ } + threshold={10} + > + + + {containers?.map(container => { + const isSelected = !!selectedContainers.find( + selectedContainer => selectedContainer === container.id + ); + + return ( + + + + handleContainerAssign( + container.id, + isSelected, + selectedContainers, + setSelectedContainers + ) + } + /> + + + {container.name} + + + ); + })} + + + + +
+ + + + + + +
+ ); +}; +AssignContainerDialog.displayName = "AssignContainerDialog"; +export default AssignContainerDialog; diff --git a/src/components/AssignContainerDialog/index.ts b/src/components/AssignContainerDialog/index.ts new file mode 100644 index 000000000..523a573e8 --- /dev/null +++ b/src/components/AssignContainerDialog/index.ts @@ -0,0 +1,2 @@ +export * from "./AssignContainerDialog"; +export { default } from "./AssignContainerDialog"; diff --git a/src/discounts/views/SaleDetails.tsx b/src/discounts/views/SaleDetails.tsx index e24a32de0..8660a2878 100644 --- a/src/discounts/views/SaleDetails.tsx +++ b/src/discounts/views/SaleDetails.tsx @@ -382,9 +382,7 @@ export const SaleDetails: React.FC = ({ id, params }) => { ...paginationState, id, input: { - categories: categories.map( - product => product.id - ) + categories } } }) @@ -414,9 +412,7 @@ export const SaleDetails: React.FC = ({ id, params }) => { ...paginationState, id, input: { - collections: collections.map( - product => product.id - ) + collections } } }) diff --git a/src/discounts/views/VoucherDetails.tsx b/src/discounts/views/VoucherDetails.tsx index d86aa1844..e286ddd83 100644 --- a/src/discounts/views/VoucherDetails.tsx +++ b/src/discounts/views/VoucherDetails.tsx @@ -428,9 +428,7 @@ export const VoucherDetails: React.FC = ({ ...paginationState, id, input: { - categories: categories.map( - product => product.id - ) + categories } } }) @@ -462,9 +460,7 @@ export const VoucherDetails: React.FC = ({ ...paginationState, id, input: { - collections: collections.map( - product => product.id - ) + collections } } })