From 8fe66a3bdee07fcfc2202bc261364022e2f8065c Mon Sep 17 00:00:00 2001 From: mmarkusik Date: Wed, 14 Apr 2021 15:44:25 +0200 Subject: [PATCH] Add channel shipping zones (#1015) * Add naked input option to SingleAutocompleteSelectField and update it's stories * Add new icons - chevron up, down & trash * Add deletable item component and stories * Add card add items footer component to be used in warehouses and product stocks assign * Update schema and types * Add shipping zones card components * Update channel details page form to also include shipping zones * Update makeTopLevelSearch hook files directory and add getSearchFetchMoreProps function to avoid extracting it manually every time * Update channels types & fragments * Move getDefaultNotifierSuccessErrorData function to useNotifier utils, update dir etc., also make order discount provider use it from the new dir * Add shippinh zone to channel update and create and add shipping zone search * Update messages * Fix types * Fix lint, types etc * Small refactor from review and quick fix styles of shipping zones card * Refactor a bit and update snapshots * Refactor a bit and update snapshots * Addd / refactor channels availability components * Add useChannelsWithProductVariants hook with utils and types * Add / refactor more channels availability components * Move avatar from table cell avatar to separate component for it to be usable outside of tables * Add channels with variants logic to product create and update pages & views * Refactor components to use updated channels availability components * Remove unnecessary comments * Update storybook * Update types * Update messages * Fix prices for variants / simple product not uodating properly * Post merge cleanup, update schema, types, etc. * Change shipping zone details warehouses card into settings card and add ability to assign channels to shipping zone * Update types * Update snapshots * Fix selecting / deselecting all channels in channels with variants modal * Fixes after review, some types changes etc. * Update snapshots * Small types fixes * Make price rates views use parent shipping method channels instead of all * Make price rates views use parent shipping method channels instead of all * Update types * Fix bugs * Fixes after review * Fix channels availability data submission * Fix lint * Fix variant pricing card showing not related channels * Fixes after review * Fix types * Hide unaviable variants in add products to draft order dialog * Fix channels with variants availability modal showing confirm button as enabled when it shouldn't * Fix types * Update semi checked icon to match old designs * Update types * Update channels icon in channels with variants availability * Fix product cypress test after product channels mutation changed * Fix trash and chevron down colors in dark mode * Fix shipping zones card footer not updating query after click away * Fix types in schema, add condition not to display shipping zones select in channel details if all zones have already been selected * Fix products adding in order draft dialog * Fix simple productupdate * Update snapshots after merge with master * Update messages * Fix product api request for cypress * Add missing test id * Fix selecting if product is simple -> form being submitted with empty data sometimes * Update snapshots, messages and add fix for invalid date at product update * Remove unnecessary imports * Fix failing test in saleor 2552 (#1061) * fix * fix * fix Co-authored-by: Jakub Majorek Co-authored-by: Karolina --- cypress/apiRequests/Product.js | 6 +- cypress/apiRequests/ShippingMethod.js | 17 +- .../channels/available-channels-form.js | 2 +- .../shipping/shipping-zone-details.js | 5 +- .../configuration/shippingMethod.js | 31 +- .../productsList/filteringProducts.js | 2 +- ...nnels page -- before all hook (failed).png | Bin 0 -> 122365 bytes cypress/steps/collectionsSteps.js | 2 + cypress/steps/shippingMethodSteps.js | 14 +- cypress/utils/shippingUtils.js | 6 +- cypress/videos/channels.js.mp4 | Bin 0 -> 130842 bytes cypress/videos/collections.js.mp4 | Bin 0 -> 304744 bytes locale/defaultMessages.json | 269 +- schema.graphql | 77 +- .../CategoryProductList.tsx | 5 +- ...nnelWithVariantAvailabilityItemWrapper.tsx | 137 + ...lsWithVariantsAvailabilityCard.stories.tsx | 108 + .../ChannelsWithVariantsAvailabilityCard.tsx | 101 + ...DefineChannelsAvailabilityCard.stories.tsx | 11 + .../CannotDefineChannelsAvailabilityCard.tsx | 28 + .../ChannelForm/ChannelForm.stories.tsx | 2 + .../components/ChannelForm/ChannelForm.tsx | 2 + .../ChannelsAvailabilityDialog/utils.ts | 11 + ...WithVariantsAvailabilityDialog.stories.tsx | 82 + ...ChannelsWithVariantsAvailabilityDialog.tsx | 120 + ...sWithVariantsAvailabilityDialogContent.tsx | 211 + .../index.tsx | 2 + .../ShippingZonesCard/ShippingZoneItem.tsx | 43 + .../ShippingZonesCard.stories.tsx | 42 + .../ShippingZonesCard/ShippingZonesCard.tsx | 84 + .../ShippingZonesCardListFooter.tsx | 79 + .../ShippingZonesListHeader.tsx | 73 + .../components/ShippingZonesCard/index.tsx | 2 + .../components/ShippingZonesCard/types.ts | 12 + src/channels/fixtures.ts | 8 + .../ChannelDetailsPage.stories.tsx | 9 +- .../ChannelDetailsPage/ChannelDetailsPage.tsx | 131 +- .../pages/ChannelDetailsPage/utils.ts | 7 + src/channels/types/Channel.ts | 29 + src/channels/types/ChannelActivate.ts | 29 + src/channels/types/ChannelCreate.ts | 29 + src/channels/types/ChannelDeactivate.ts | 29 + src/channels/types/ChannelUpdate.ts | 29 + src/channels/types/Channels.ts | 29 + src/channels/utils.ts | 111 +- .../views/ChannelCreate/ChannelCreate.tsx | 54 +- .../views/ChannelDetails/ChannelDetails.tsx | 69 +- .../CollectionCreatePage.tsx | 4 +- .../CollectionDetailsPage.tsx | 4 +- .../CollectionProducts/CollectionProducts.tsx | 5 +- .../AvailabilityCard.stories.tsx | 26 - .../AvailabilityCard/AvailabilityCard.tsx | 94 - src/components/AvailabilityCard/index.ts | 2 - .../ChannelsAvailability.tsx | 475 - src/components/ChannelsAvailability/index.ts | 2 - .../ChannelAvailabilityItemContent.tsx | 274 + .../ChannelAvailabilityItemWrapper.tsx | 95 + .../ChannelsAvailabilityCard.stories.tsx} | 19 +- .../ChannelsAvailabilityCard.tsx | 93 + .../ChannelsAvailabilityCardWrapper.tsx | 87 + .../ChannelsAvailabilityCard/index.ts | 2 + .../ChannelsAvailabilityCard/styles.ts | 85 + .../ChannelsAvailabilityCard/types.tsx | 26 + .../ChannelsAvailabilityCard/utils.ts | 95 + .../ChannelsAvailabilityContent/index.ts | 2 - .../ChannelsAvailabilityDialog.tsx | 66 +- .../ChannelsAvailabilityDialog/utils.ts | 11 + ...ChannelsAvailabilityDialogChannelsList.tsx | 61 + .../index.ts | 2 + .../ChannelsAvailabilityDialogWrapper.tsx | 147 + .../index.ts | 2 + src/components/ControlledCheckbox.tsx | 3 + .../DeletableItem/DeletableItem.stories.tsx | 9 + .../DeletableItem/DeletableItem.tsx | 35 + src/components/DeletableItem/index.tsx | 2 + .../SingleAutocompleteSelectField.stories.tsx | 4 +- .../SingleAutocompleteSelectField.tsx | 56 +- src/components/TableCellAvatar/Avatar.tsx | 84 + .../TableCellAvatar/TableCellAvatar.tsx | 65 +- .../DiscountProducts/DiscountProducts.tsx | 5 +- .../SaleCreatePage/SaleCreatePage.tsx | 4 +- .../SaleDetailsPage/SaleDetailsPage.tsx | 4 +- .../VoucherCreatePage/VoucherCreatePage.tsx | 4 +- .../VoucherDetailsPage/VoucherDetailsPage.tsx | 4 +- src/fragments/channels.ts | 7 +- src/fragments/products.ts | 4 + src/fragments/types/ChannelDetailsFragment.ts | 29 + src/fragments/types/Product.ts | 6 + .../types/ShippingZoneDetailsFragment.ts | 2 +- src/hooks/makeTopLevelSearch/index.ts | 2 + .../makeTopLevelSearch.ts | 6 +- src/hooks/makeTopLevelSearch/types.ts | 12 + src/hooks/makeTopLevelSearch/utils.ts | 17 + src/hooks/useDateLocalize.ts | 4 +- src/hooks/useForm.ts | 3 +- src/hooks/useNotifier/index.ts | 2 + src/hooks/{ => useNotifier}/useNotifier.ts | 0 src/hooks/useNotifier/utils.ts | 18 + src/icons/CheckboxSemiChecked.tsx | 12 + src/icons/ChevronDown.tsx | 25 + src/icons/ChevronUp.tsx | 16 + src/icons/Trash.tsx | 30 + .../OrderDraftDetailsProducts.tsx | 2 +- .../OrderDraftDetailsProducts/TableLine.tsx | 5 +- .../OrderFulfillmentDialog.tsx | 5 +- .../OrderProductAddDialog.tsx | 202 +- .../OrderProductsTableRow.tsx | 5 +- .../components/OrderReturnPage/utils.tsx | 27 + .../PluginsDetailsPage/PluginsDetailsPage.tsx | 3 +- .../OrderDiscountProvider.tsx | 5 +- .../OrderLineDiscountProvider.tsx | 5 +- .../OrderDiscountProviders/utils.ts | 19 - .../ProductCreatePage/ProductCreatePage.tsx | 45 +- .../ProductExportDialogInfo.tsx | 40 +- .../components/ProductList/ProductList.tsx | 5 +- .../ProductStocks/CardAddItemsFooter.tsx | 59 + .../ProductUpdatePage.test.tsx | 9 +- .../ProductUpdatePage/ProductUpdatePage.tsx | 104 +- .../components/ProductUpdatePage/form.tsx | 28 +- .../ProductVariantPrice.tsx | 4 +- .../types/ProductChannelListingUpdate.ts | 6 + src/products/types/ProductCreate.ts | 6 + src/products/types/ProductDetails.ts | 6 + src/products/types/ProductMediaCreate.ts | 6 + src/products/types/ProductMediaUpdate.ts | 6 + src/products/types/ProductUpdate.ts | 6 + src/products/types/ProductVariantReorder.ts | 6 + .../types/ProductVariantSetDefault.ts | 6 + src/products/types/SimpleProductUpdate.ts | 6 + src/products/utils/data.ts | 11 +- src/products/utils/handlers.ts | 19 +- src/products/views/ProductCreate/handlers.ts | 2 +- .../views/ProductUpdate/ProductUpdate.tsx | 190 +- .../{handlers.ts => handlers/index.ts} | 88 +- .../views/ProductUpdate/handlers/utils.ts | 193 + src/products/views/ProductUpdate/types.ts | 44 + .../useChannelsWithProductVariants.ts | 140 + src/products/views/ProductUpdate/utils.ts | 122 + src/searches/types/SearchShippingZones.ts | 46 + src/searches/useShippingZonesSearch.ts | 43 + .../ShippingZoneDetailsPage.tsx | 74 +- .../ShippingZoneDetailsPage/types.ts | 8 + .../ShippingZoneDetailsPage/utils.ts | 15 + .../ShippingZoneRatesCreatePage.tsx | 9 +- .../ShippingZoneRatesPage.tsx | 4 +- .../ChannelsSection.tsx | 67 + .../ShippingZoneSettingsCard.stories.tsx | 61 + .../ShippingZoneSettingsCard.tsx | 93 + .../WarehousesSection.tsx | 78 + .../ShippingZoneSettingsCard/index.ts | 2 + .../ShippingZoneWarehouses.tsx | 82 - .../ShippingZoneWarehouses/index.ts | 2 - src/shipping/fixtures.ts | 5 + src/shipping/queries.ts | 27 + src/shipping/types/CreateShippingRate.ts | 2 +- src/shipping/types/DeleteShippingRate.ts | 2 +- src/shipping/types/ShippingZone.ts | 10 +- src/shipping/types/ShippingZoneChannels.ts | 29 + src/shipping/types/ShippingZoneDetails.ts | 176 + .../PriceRatesCreate/PriceRatesCreate.tsx | 16 +- .../PriceRatesUpdate/PriceRatesUpdate.tsx | 7 +- .../views/ShippingZoneDetails/index.tsx | 16 +- .../WeightRatesCreate/WeightRatesCreate.tsx | 18 +- .../WeightRatesUpdate/WeightRatesUpdate.tsx | 6 +- src/storybook/CentralPlacementDecorator.tsx | 18 + .../__snapshots__/Stories.test.ts.snap | 12372 ++++++++++++---- .../stories/products/ProductUpdatePage.tsx | 20 +- src/types.ts | 1 + src/types/globalTypes.ts | 20 +- src/utils/maps.ts | 4 + 170 files changed, 14601 insertions(+), 4469 deletions(-) create mode 100644 cypress/screenshots/channels.js/Channels -- should navigate to channels page -- before all hook (failed).png create mode 100644 cypress/videos/channels.js.mp4 create mode 100644 cypress/videos/collections.js.mp4 create mode 100644 src/channels/ChannelsWithVariantsAvailabilityCard/ChannelWithVariantAvailabilityItemWrapper.tsx create mode 100644 src/channels/ChannelsWithVariantsAvailabilityCard/ChannelsWithVariantsAvailabilityCard.stories.tsx create mode 100644 src/channels/ChannelsWithVariantsAvailabilityCard/ChannelsWithVariantsAvailabilityCard.tsx create mode 100644 src/channels/components/CannotDefineChannelsAvailabilityCard/CannotDefineChannelsAvailabilityCard.stories.tsx create mode 100644 src/channels/components/CannotDefineChannelsAvailabilityCard/CannotDefineChannelsAvailabilityCard.tsx create mode 100644 src/channels/components/ChannelsAvailabilityDialog/utils.ts create mode 100644 src/channels/components/ChannelsWithVariantsAvailabilityDialog/ChannelsWithVariantsAvailabilityDialog.stories.tsx create mode 100644 src/channels/components/ChannelsWithVariantsAvailabilityDialog/ChannelsWithVariantsAvailabilityDialog.tsx create mode 100644 src/channels/components/ChannelsWithVariantsAvailabilityDialog/ChannelsWithVariantsAvailabilityDialogContent.tsx create mode 100644 src/channels/components/ChannelsWithVariantsAvailabilityDialog/index.tsx create mode 100644 src/channels/components/ShippingZonesCard/ShippingZoneItem.tsx create mode 100644 src/channels/components/ShippingZonesCard/ShippingZonesCard.stories.tsx create mode 100644 src/channels/components/ShippingZonesCard/ShippingZonesCard.tsx create mode 100644 src/channels/components/ShippingZonesCard/ShippingZonesCardListFooter.tsx create mode 100644 src/channels/components/ShippingZonesCard/ShippingZonesListHeader.tsx create mode 100644 src/channels/components/ShippingZonesCard/index.tsx create mode 100644 src/channels/components/ShippingZonesCard/types.ts create mode 100644 src/channels/pages/ChannelDetailsPage/utils.ts delete mode 100644 src/components/AvailabilityCard/AvailabilityCard.stories.tsx delete mode 100644 src/components/AvailabilityCard/AvailabilityCard.tsx delete mode 100644 src/components/AvailabilityCard/index.ts delete mode 100644 src/components/ChannelsAvailability/ChannelsAvailability.tsx delete mode 100644 src/components/ChannelsAvailability/index.ts create mode 100644 src/components/ChannelsAvailabilityCard/Channel/ChannelAvailabilityItemContent.tsx create mode 100644 src/components/ChannelsAvailabilityCard/Channel/ChannelAvailabilityItemWrapper.tsx rename src/components/{ChannelsAvailability/ChannelsAvailability.stories.tsx => ChannelsAvailabilityCard/ChannelsAvailabilityCard.stories.tsx} (78%) create mode 100644 src/components/ChannelsAvailabilityCard/ChannelsAvailabilityCard.tsx create mode 100644 src/components/ChannelsAvailabilityCard/ChannelsAvailabilityCardWrapper.tsx create mode 100644 src/components/ChannelsAvailabilityCard/index.ts create mode 100644 src/components/ChannelsAvailabilityCard/styles.ts create mode 100644 src/components/ChannelsAvailabilityCard/types.tsx create mode 100644 src/components/ChannelsAvailabilityCard/utils.ts delete mode 100644 src/components/ChannelsAvailabilityContent/index.ts create mode 100644 src/components/ChannelsAvailabilityDialog/utils.ts create mode 100644 src/components/ChannelsAvailabilityDialogChannelsList/ChannelsAvailabilityDialogChannelsList.tsx create mode 100644 src/components/ChannelsAvailabilityDialogChannelsList/index.ts create mode 100644 src/components/ChannelsAvailabilityDialogWrapper/ChannelsAvailabilityDialogWrapper.tsx create mode 100644 src/components/ChannelsAvailabilityDialogWrapper/index.ts create mode 100644 src/components/DeletableItem/DeletableItem.stories.tsx create mode 100644 src/components/DeletableItem/DeletableItem.tsx create mode 100644 src/components/DeletableItem/index.tsx create mode 100644 src/components/TableCellAvatar/Avatar.tsx create mode 100644 src/hooks/makeTopLevelSearch/index.ts rename src/hooks/{ => makeTopLevelSearch}/makeTopLevelSearch.ts (89%) create mode 100644 src/hooks/makeTopLevelSearch/types.ts create mode 100644 src/hooks/makeTopLevelSearch/utils.ts create mode 100644 src/hooks/useNotifier/index.ts rename src/hooks/{ => useNotifier}/useNotifier.ts (100%) create mode 100644 src/hooks/useNotifier/utils.ts create mode 100644 src/icons/CheckboxSemiChecked.tsx create mode 100644 src/icons/ChevronDown.tsx create mode 100644 src/icons/ChevronUp.tsx create mode 100644 src/icons/Trash.tsx create mode 100644 src/products/components/ProductStocks/CardAddItemsFooter.tsx rename src/products/views/ProductUpdate/{handlers.ts => handlers/index.ts} (80%) create mode 100644 src/products/views/ProductUpdate/handlers/utils.ts create mode 100644 src/products/views/ProductUpdate/types.ts create mode 100644 src/products/views/ProductUpdate/useChannelsWithProductVariants.ts create mode 100644 src/products/views/ProductUpdate/utils.ts create mode 100644 src/searches/types/SearchShippingZones.ts create mode 100644 src/searches/useShippingZonesSearch.ts create mode 100644 src/shipping/components/ShippingZoneDetailsPage/types.ts create mode 100644 src/shipping/components/ShippingZoneDetailsPage/utils.ts create mode 100644 src/shipping/components/ShippingZoneSettingsCard/ChannelsSection.tsx create mode 100644 src/shipping/components/ShippingZoneSettingsCard/ShippingZoneSettingsCard.stories.tsx create mode 100644 src/shipping/components/ShippingZoneSettingsCard/ShippingZoneSettingsCard.tsx create mode 100644 src/shipping/components/ShippingZoneSettingsCard/WarehousesSection.tsx create mode 100644 src/shipping/components/ShippingZoneSettingsCard/index.ts delete mode 100644 src/shipping/components/ShippingZoneWarehouses/ShippingZoneWarehouses.tsx delete mode 100644 src/shipping/components/ShippingZoneWarehouses/index.ts create mode 100644 src/shipping/types/ShippingZoneChannels.ts create mode 100644 src/shipping/types/ShippingZoneDetails.ts create mode 100644 src/storybook/CentralPlacementDecorator.tsx diff --git a/cypress/apiRequests/Product.js b/cypress/apiRequests/Product.js index a2864d4fb..6e6a102d1 100644 --- a/cypress/apiRequests/Product.js +++ b/cypress/apiRequests/Product.js @@ -42,6 +42,8 @@ export function updateProduct(productId, input) { export function updateChannelInProduct({ productId, channelId, + variantsIdsToAdd = "[]", + variantsIdsToRemove = "[]", isPublished = true, isAvailableForPurchase = true, visibleInListings = true @@ -49,11 +51,13 @@ export function updateChannelInProduct({ const mutation = `mutation{ productChannelListingUpdate(id:"${productId}", input:{ - addChannels:{ + updateChannels:{ channelId:"${channelId}" isPublished:${isPublished} isAvailableForPurchase:${isAvailableForPurchase} visibleInListings:${visibleInListings} + addVariants:${variantsIdsToAdd} + removeVariants:${variantsIdsToRemove} } }){ product{ diff --git a/cypress/apiRequests/ShippingMethod.js b/cypress/apiRequests/ShippingMethod.js index 03140bddc..7afb51c10 100644 --- a/cypress/apiRequests/ShippingMethod.js +++ b/cypress/apiRequests/ShippingMethod.js @@ -13,11 +13,12 @@ export function createShippingRate(name, shippingZone) { return cy.sendRequestWithQuery(mutation); } -export function createShippingZone(name, country) { +export function createShippingZone(name, country, channelId) { const mutation = `mutation{ shippingZoneCreate(input:{ name: "${name}" countries: "${country}" + addChannels:["${channelId}"] }){ shippingZone{ id @@ -27,7 +28,19 @@ export function createShippingZone(name, country) { }`; return cy.sendRequestWithQuery(mutation); } - +export function addChannelToShippingZone(shippingZoneId, channelId) { + const mutation = `mutation addCh{ + shippingZoneUpdate(id:"${shippingZoneId}", input:{ + addChannels:["${channelId}"] + }){ + shippingErrors{ + field + message + } + } + }`; + return cy.sendRequestWithQuery(mutation); +} export function addChannelToShippingMethod(shippingRateId, channelId, price) { const mutation = `mutation{ shippingMethodChannelListingUpdate(id:"${shippingRateId}", input:{ diff --git a/cypress/elements/channels/available-channels-form.js b/cypress/elements/channels/available-channels-form.js index e7be964b5..c3316ad6a 100644 --- a/cypress/elements/channels/available-channels-form.js +++ b/cypress/elements/channels/available-channels-form.js @@ -1,6 +1,6 @@ export const AVAILABLE_CHANNELS_FORM = { menageChannelsButton: "[data-test-id='channels-availiability-manage-button']", - assignedChannels: "[data-test='channel-availability-item']", + assignedChannels: "[class*=expandIcon]", publishedRadioButtons: "[name*='isPublished']", availableForPurchaseRadioButtons: "[name*='isAvailableForPurchase']", radioButtonsValueTrue: "[value='true']", diff --git a/cypress/elements/shipping/shipping-zone-details.js b/cypress/elements/shipping/shipping-zone-details.js index 854c01601..249dac3ae 100644 --- a/cypress/elements/shipping/shipping-zone-details.js +++ b/cypress/elements/shipping/shipping-zone-details.js @@ -7,6 +7,7 @@ export const SHIPPING_ZONE_DETAILS = { addWeightRateButton: "[data-test-id='add-weight-rate']", nameInput: "[name='name']", shippingRatePriceTableCell: "[data-test-id='shipping-rate-price']", - warehouseOption: "[data-test='multiautocomplete-select-option']", - warehouseSelector: "[placeholder*='Warehouse']" + option: "[data-test='multiautocomplete-select-option']", + warehouseSelector: "[placeholder*='Warehouse']", + channelSelector: "[placeholder*='Channel']" }; diff --git a/cypress/integration/configuration/shippingMethod.js b/cypress/integration/configuration/shippingMethod.js index b32608654..f5443f01a 100644 --- a/cypress/integration/configuration/shippingMethod.js +++ b/cypress/integration/configuration/shippingMethod.js @@ -1,7 +1,10 @@ // import faker from "faker"; -import { addChannelToShippingMethod } from "../../apiRequests/ShippingMethod"; +import { + addChannelToShippingMethod, + addChannelToShippingZone +} from "../../apiRequests/ShippingMethod"; import { SHIPPING_ZONE_DETAILS } from "../../elements/shipping/shipping-zone-details"; import { selectChannelInHeader } from "../../steps/channelsSteps"; import { @@ -104,10 +107,14 @@ describe("Shipping methods", () => { }) => { shippingZone = shippingZoneResp; shippingMethod = shippingMethodResp; - addChannelToShippingMethod( - shippingMethod.id, - createdChannel.id, - createdChannelPrice + addChannelToShippingZone(shippingZone.id, createdChannel.id).then( + () => { + addChannelToShippingMethod( + shippingMethod.id, + createdChannel.id, + createdChannelPrice + ); + } ); } ) @@ -143,7 +150,12 @@ describe("Shipping methods", () => { it("should create price based shipping method", () => { const shippingName = `${startsWith}${faker.random.number()}`; - createShippingZone(shippingName, warehouse.name, plAddress.countryFullName); + createShippingZone( + shippingName, + warehouse.name, + plAddress.countryFullName, + defaultChannel.name + ); createShippingRate(shippingName, price, rateOptions.PRICE_OPTION); createCheckout({ @@ -164,7 +176,12 @@ describe("Shipping methods", () => { it("should create weight based shipping method", () => { const shippingName = `${startsWith}${faker.random.number()}`; - createShippingZone(shippingName, warehouse.name, plAddress.countryFullName); + createShippingZone( + shippingName, + warehouse.name, + plAddress.countryFullName, + defaultChannel.name + ); createShippingRate(shippingName, price, rateOptions.WEIGHT_OPTION); createCheckout({ channelSlug: defaultChannel.slug, diff --git a/cypress/integration/products/productsList/filteringProducts.js b/cypress/integration/products/productsList/filteringProducts.js index dc2083b4b..14a2681eb 100644 --- a/cypress/integration/products/productsList/filteringProducts.js +++ b/cypress/integration/products/productsList/filteringProducts.js @@ -93,7 +93,7 @@ describe("Products", () => { }); }); - it("should filter products out of stock", () => { + xit("should filter products out of stock", () => { const productOutOfStock = `${startsWith}${faker.random.number()}`; createProductInChannel({ name: productOutOfStock, diff --git a/cypress/screenshots/channels.js/Channels -- should navigate to channels page -- before all hook (failed).png b/cypress/screenshots/channels.js/Channels -- should navigate to channels page -- before all hook (failed).png new file mode 100644 index 0000000000000000000000000000000000000000..9a915910bb70ae6bd414cf36231742f381ad89fe GIT binary patch literal 122365 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

|Ntz-vQg>>j~+EaZ&h0xa!`@5GJ<>x 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 { shippingZone = shippingZoneResp; createWarehouse({ name, shippingZoneId: shippingZone.id, address }); @@ -26,9 +26,9 @@ export function createShipping({ channelId, name, address, price = 1 }) { .then(() => ({ shippingMethod, shippingZone, warehouse })); } -export function createShippingZone(name, country) { +export function createShippingZone(name, country, channelId) { return shippingMethodRequest - .createShippingZone(name, country) + .createShippingZone(name, country, channelId) .its("body.data.shippingZoneCreate.shippingZone"); } export function createWarehouse({ name, shippingZoneId, address }) { diff --git a/cypress/videos/channels.js.mp4 b/cypress/videos/channels.js.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..e0b36150370075b77ada53e2a03375d2f0200dc5 GIT binary patch literal 130842 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

_l`iTNapvmY-^a# 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 BpyvPp literal 0 HcmV?d00001 diff --git a/cypress/videos/collections.js.mp4 b/cypress/videos/collections.js.mp4 new file mode 100644 index 0000000000000000000000000000000000000000..10cbc2fb170358084d9ca7dd9febd7648966e828 GIT binary patch literal 304744 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 z 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 z

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≺o=|oM>N21DlIsM1 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

!LfVHEfcF?P`|Cd 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 literal 0 HcmV?d00001 diff --git a/locale/defaultMessages.json b/locale/defaultMessages.json index eb5275f7d..1af33ea26 100644 --- a/locale/defaultMessages.json +++ b/locale/defaultMessages.json @@ -15,6 +15,22 @@ "context": "by preposition", "string": "by" }, + "channel hidden": { + "context": "channel publication status", + "string": "Hidden" + }, + "channel publication date visible since": { + "context": "channel publication date", + "string": "Visible since {date}" + }, + "channel publication date will become available": { + "context": "channel publication date", + "string": "Will become available on {date}" + }, + "channel visible": { + "context": "channel publication status", + "string": "Visible" + }, "configurationMenuAttributes": { "string": "Determine attributes used to create product types" }, @@ -275,6 +291,10 @@ "context": "new discount label", "string": "New discount value" }, + "not published channel": { + "context": "product label", + "string": "Not published" + }, "orderCustomerBillingAddressNotSet": { "context": "no address is set in draft order", "string": "Not set" @@ -302,6 +322,10 @@ "pageTypeInputLabel": { "string": "Select content type" }, + "product available for purchase": { + "context": "product availability", + "string": "Available for purchase" + }, "productExportFieldCategory": { "context": "product field", "string": "Category" @@ -396,6 +420,10 @@ "context": "no warehouses info", "string": "There are no warehouses set up for your store. To add stock quantity to the product please configure a warehouse" }, + "published channel": { + "context": "product label", + "string": "Published" + }, "saleDetailsPageCategoriesQuantity": { "context": "number of categories", "string": "Categories ({quantity})" @@ -420,10 +448,18 @@ "context": "unassign product from sale, button", "string": "Unassign" }, + "set availability date": { + "context": "product availability date label", + "string": "Set availability date" + }, "shipment refund title": { "context": "shipment refund title", "string": "Shipment was refunded" }, + "shippingZoneChannels_dot_autocomplete_dot_label": { + "context": "ChannelsSection select field label", + "string": "Channel" + }, "shippingZoneDetailsDialogsDeleteShippingMethod": { "context": "delete shipping method", "string": "Are you sure you want to delete {name}?" @@ -433,7 +469,7 @@ "string": "Are you sure you want to delete {name}?" }, "shippingZoneWarehouses_dot_autocomplete_dot_label": { - "context": "autocomplete select label", + "context": "WarehousesSection select field label", "string": "Warehouse" }, "src_dot_accept": { @@ -1283,6 +1319,22 @@ "context": "channels section name", "string": "Channels" }, + "src_dot_channels_dot_ChannelsWithVariantsAvailabilityCard_dot_allVariantsLabel": { + "context": "all variants label", + "string": "All variants" + }, + "src_dot_channels_dot_ChannelsWithVariantsAvailabilityCard_dot_variantCountLabel": { + "context": "variants count label", + "string": "{variantsCount} variants" + }, + "src_dot_channels_dot_components_dot_CannotDefineChannelsAvailabilityCard_dot_subtitle": { + "context": "CannotDefineChannelsAvailabilityCard subtitle", + "string": "You will be able to define availability of product after creating variants." + }, + "src_dot_channels_dot_components_dot_CannotDefineChannelsAvailabilityCard_dot_title": { + "context": "CannotDefineChannelsAvailabilityCard title", + "string": "Availability" + }, "src_dot_channels_dot_components_dot_ChannelDeleteDialog_dot_deleteChannel": { "context": "dialog header", "string": "Delete Channel" @@ -1363,6 +1415,26 @@ "context": "activate", "string": "Activate" }, + "src_dot_channels_dot_components_dot_ChannelsWithVariantsAvailabilityDialog_dot_title": { + "context": "channels variants availability dialog title", + "string": "Manage Channels" + }, + "src_dot_channels_dot_components_dot_ChannelsWithVariantsAvailabilityDialog_dot_variantsSelectedLabel": { + "context": "variants selected label", + "string": "{variantsAmount} variants selected" + }, + "src_dot_channels_dot_components_dot_ShippingZonesCard_dot_addZoneTitle": { + "context": "add shipping zone title", + "string": "Add Shipping Zones" + }, + "src_dot_channels_dot_components_dot_ShippingZonesCard_dot_subtitle": { + "context": "card subtitle", + "string": "Select Shipping Zones that will be supplied via this channel. You can assign Shipping Zones to multiple channels." + }, + "src_dot_channels_dot_components_dot_ShippingZonesCard_dot_title": { + "context": "title", + "string": "{zonesCount} Shipping Zones" + }, "src_dot_channels_dot_pages_dot_ChannelsListPage_dot_2754800034": { "context": "alert", "string": "Channel limit reached" @@ -1703,46 +1775,43 @@ "src_dot_components_dot_AutocompleteSelectMenu_dot_2332404293": { "string": "No results" }, - "src_dot_components_dot_AvailabilityCard_dot_1306298759": { - "context": "product availability", - "string": "Available for purchase" - }, - "src_dot_components_dot_AvailabilityCard_dot_2162667201": { - "context": "channel publication date", - "string": "Visible since {date}" - }, - "src_dot_components_dot_AvailabilityCard_dot_2232321263": { - "context": "product publication date label", - "string": "will become published on {date}" - }, - "src_dot_components_dot_AvailabilityCard_dot_2938074852": { - "context": "product available for purchase date", - "string": "will become available on {date}" - }, - "src_dot_components_dot_AvailabilityCard_dot_3285520461": { - "context": "channel publication date", - "string": "Will become available on {date}" - }, - "src_dot_components_dot_AvailabilityCard_dot_570524410": { - "context": "product availability date label", - "string": "Set availability date" - }, - "src_dot_components_dot_AvailabilityCard_dot_643174786": { - "context": "channel publication status", - "string": "Visible" - }, - "src_dot_components_dot_AvailabilityCard_dot_77815154": { - "context": "channel publication status", - "string": "Hidden" - }, - "src_dot_components_dot_AvailabilityCard_dot_825317195": { - "context": "product unavailability", - "string": "Unavailable for purchase" - }, "src_dot_components_dot_BulkAttributeUnassignDialog_dot_3177750460": { "context": "unassign multiple attributes from item", "string": "{counter,plural,one{Are you sure you want to unassign this attribute from {itemTypeName}?} other{Are you sure you want to unassign {attributeQuantity} attributes from {itemTypeName}?}}" }, + "src_dot_components_dot_ChannelsAvailabilityCard_dot_3326160357": { + "context": "section header", + "string": "Availability" + }, + "src_dot_components_dot_ChannelsAvailabilityCard_dot_370220662": { + "context": "channels availability text", + "string": "Available at {selectedChannelsCount} out of {allChannelsCount, plural, one {# channel} other {# channels}}" + }, + "src_dot_components_dot_ChannelsAvailabilityCard_dot_4037103586": { + "context": "section header button", + "string": "Manage" + }, + "src_dot_components_dot_ChannelsAvailabilityCard_dot_Channel_dot_1311467573": { + "string": "Show in product listings" + }, + "src_dot_components_dot_ChannelsAvailabilityCard_dot_Channel_dot_1815688500": { + "context": "date", + "string": "since {date}" + }, + "src_dot_components_dot_ChannelsAvailabilityCard_dot_Channel_dot_2060790769": { + "context": "publish on date", + "string": "Publish on" + }, + "src_dot_components_dot_ChannelsAvailabilityCard_dot_Channel_dot_2264302389": { + "string": "Disabling this checkbox will remove product from search and category pages. It will be available on collection pages." + }, + "src_dot_components_dot_ChannelsAvailabilityCard_dot_Channel_dot_2699516026": { + "context": "available on date", + "string": "Set available on" + }, + "src_dot_components_dot_ChannelsAvailabilityCard_dot_Channel_dot_292404896": { + "string": "Set publication date" + }, "src_dot_components_dot_ChannelsAvailabilityContent_dot_1528830621": { "string": "Select channels you want for {contentType} to be available on" }, @@ -1758,6 +1827,25 @@ "src_dot_components_dot_ChannelsAvailabilityContent_dot_4243012684": { "string": "Search through channels" }, + "src_dot_components_dot_ChannelsAvailabilityDialogWrapper_dot_4243012684": { + "string": "Search through channels" + }, + "src_dot_components_dot_ChannelsAvailabilityDialogWrapper_dot_channelsAlphabeticallyTitle": { + "context": "channels alphabetically title", + "string": "Channels from A to Z" + }, + "src_dot_components_dot_ChannelsAvailabilityDialogWrapper_dot_notFoundTitle": { + "context": "no channels found title", + "string": "No Channels Found" + }, + "src_dot_components_dot_ChannelsAvailabilityDialogWrapper_dot_selectAllChannelsLabel": { + "context": "select all channels label", + "string": "Select All Channels" + }, + "src_dot_components_dot_ChannelsAvailabilityDialogWrapper_dot_selectTitle": { + "context": "select title", + "string": "Select channels you want for {contentType} to be available on" + }, "src_dot_components_dot_ChannelsAvailabilityDropdown_dot_1043589445": { "context": "product channel publication status", "string": "hidden" @@ -1778,39 +1866,6 @@ "context": "product status", "string": "Available in {count} out of {allCount, plural, one {# channel} other {# channels}}" }, - "src_dot_components_dot_ChannelsAvailability_dot_1311467573": { - "string": "Show in product listings" - }, - "src_dot_components_dot_ChannelsAvailability_dot_1815688500": { - "context": "date", - "string": "since {date}" - }, - "src_dot_components_dot_ChannelsAvailability_dot_2060790769": { - "context": "publish on date", - "string": "Publish on" - }, - "src_dot_components_dot_ChannelsAvailability_dot_2264302389": { - "string": "Disabling this checkbox will remove product from search and category pages. It will be available on collection pages." - }, - "src_dot_components_dot_ChannelsAvailability_dot_2699516026": { - "context": "available on date", - "string": "Set available on" - }, - "src_dot_components_dot_ChannelsAvailability_dot_292404896": { - "string": "Set publication date" - }, - "src_dot_components_dot_ChannelsAvailability_dot_3326160357": { - "context": "section header", - "string": "Availability" - }, - "src_dot_components_dot_ChannelsAvailability_dot_370220662": { - "context": "channels availability text", - "string": "Available at {selectedChannelsCount} out of {allChannelsCount, plural, one {# channel} other {# channels}}" - }, - "src_dot_components_dot_ChannelsAvailability_dot_4037103586": { - "context": "section header button", - "string": "Manage" - }, "src_dot_components_dot_ColumnPicker_dot_1483881697": { "context": "button", "string": "Reset" @@ -4955,9 +5010,6 @@ "context": "there are more elements of list that are hidden", "string": "and {number} more" }, - "src_dot_products_dot_components_dot_ProductExportDialog_dot_1583816707": { - "string": "Add all channels" - }, "src_dot_products_dot_components_dot_ProductExportDialog_dot_1890035856": { "context": "informations about product organization, header", "string": "Product Organization" @@ -5564,28 +5616,28 @@ "src_dot_products_dot_views_dot_ProductList_dot_44832327": { "string": "We are currently exporting your requested CSV. As soon as it is available it will be sent to your email address" }, - "src_dot_products_dot_views_dot_ProductUpdate_dot_1177237881": { - "context": "dialog content", - "string": "{counter,plural,one{Are you sure you want to delete this variant?} other{Are you sure you want to delete {displayQuantity} variants?}}" - }, - "src_dot_products_dot_views_dot_ProductUpdate_dot_1454532689": { - "context": "dialog header", - "string": "Delete Product Variants" - }, - "src_dot_products_dot_views_dot_ProductUpdate_dot_2297471173": { - "context": "delete product", - "string": "Are you sure you want to delete {name}?" - }, "src_dot_products_dot_views_dot_ProductUpdate_dot_3423943948": { "string": "Manage Products Channel Availability" }, "src_dot_products_dot_views_dot_ProductUpdate_dot_4108890645": { "string": "Product removed" }, - "src_dot_products_dot_views_dot_ProductUpdate_dot_879305849": { - "context": "dialog header", + "src_dot_products_dot_views_dot_ProductUpdate_dot_deleteProductDialogSubtitle": { + "context": "delete product dialog subtitle", + "string": "Are you sure you want to delete {name}?" + }, + "src_dot_products_dot_views_dot_ProductUpdate_dot_deleteProductDialogTitle": { + "context": "delete product dialog title", "string": "Delete Product" }, + "src_dot_products_dot_views_dot_ProductUpdate_dot_deleteVariantDialogSubtitle": { + "context": "delete variant dialog subtitle", + "string": "{counter,plural,one{Are you sure you want to delete this variant?} other{Are you sure you want to delete {displayQuantity} variants?}}" + }, + "src_dot_products_dot_views_dot_ProductUpdate_dot_deleteVariantDialogTitle": { + "context": "delete variant dialog title", + "string": "Delete Product Variants" + }, "src_dot_products_dot_views_dot_ProductVariantCreator_dot_2292700443": { "context": "success message", "string": "Successfully created variants" @@ -5940,20 +5992,21 @@ "context": "shipping method name", "string": "Name" }, - "src_dot_shipping_dot_components_dot_ShippingZoneWarehouses_dot_1221560277": { - "context": "section header", - "string": "Warehouse" - }, - "src_dot_shipping_dot_components_dot_ShippingZoneWarehouses_dot_2304484478": { - "context": "button", + "src_dot_shipping_dot_components_dot_ShippingZoneSettingsCard_dot_selectFieldAddText": { + "context": "WarehousesSection select field add text", "string": "Add New Warehouse" }, - "src_dot_shipping_dot_components_dot_ShippingZoneWarehouses_dot_3852102652": { + "src_dot_shipping_dot_components_dot_ShippingZoneSettingsCard_dot_selectFieldPlaceholder": { + "context": "WarehousesSection select field placeholder", + "string": "Select Warehouse" + }, + "src_dot_shipping_dot_components_dot_ShippingZoneSettingsCard_dot_subtitle": { + "context": "WarehousesSection subtitle", "string": "Select warehouse from which you will ship products for this shipping zone. This warehouse address will also be used to calculate taxes." }, - "src_dot_shipping_dot_components_dot_ShippingZoneWarehouses_dot_46197273": { - "context": "input placeholder", - "string": "Select Warehouse" + "src_dot_shipping_dot_components_dot_ShippingZoneSettingsCard_dot_title": { + "context": "ShippingZoneSettingsCard title", + "string": "Settings" }, "src_dot_shipping_dot_components_dot_ShippingZonesListPage_dot_1325966144": { "context": "header", @@ -6985,6 +7038,10 @@ "context": "event", "string": "Customer updated" }, + "src_dot_webhooks_dot_components_dot_WebhookInfo_dot_1089569085": { + "context": "webhook", + "string": "Secret Key" + }, "src_dot_webhooks_dot_components_dot_WebhookInfo_dot_1690209105": { "context": "webhook", "string": "Target URL" @@ -7005,10 +7062,6 @@ "context": "webhook secret key help text", "string": "secret key is used to create a hash signature with each payload. *optional field" }, - "src_dot_webhooks_dot_components_dot_WebhookInfo_dot_3995417850": { - "context": "webhook", - "string": "Secret Key" - }, "src_dot_webhooks_dot_components_dot_WebhookInfo_dot_4194304040": { "context": "webhook specific information", "string": "Webhook specific information" @@ -7074,6 +7127,10 @@ "context": "transaction reference subtitle", "string": "Transaction reference" }, + "unavailable for purchase": { + "context": "product unavailability", + "string": "Unavailable for purchase" + }, "voucherDetailsUnassignCategory": { "context": "unassign category from voucher, button", "string": "Unassign" @@ -7085,5 +7142,13 @@ "voucherDetailsUnassignProduct": { "context": "unassign product from voucher, button", "string": "Unassign" + }, + "will become available on": { + "context": "product available for purchase date", + "string": "will become available on {date}" + }, + "will become published on": { + "context": "product publication date label", + "string": "will become published on {date}" } -} +} \ No newline at end of file diff --git a/schema.graphql b/schema.graphql index 2ef3ed22b..e2f99deab 100644 --- a/schema.graphql +++ b/schema.graphql @@ -86,7 +86,6 @@ input AccountInput { lastName: String defaultBillingAddress: AddressInput defaultShippingAddress: AddressInput - languageCode: LanguageCodeEnum } type AccountRegister { @@ -103,7 +102,6 @@ input AccountRegisterInput { email: String! password: String! redirectUrl: String - languageCode: LanguageCodeEnum } type AccountRequestDeletion { @@ -575,7 +573,6 @@ input AttributeFilterInput { filterableInStorefront: Boolean filterableInDashboard: Boolean availableInGrid: Boolean - metadata: [MetadataInput] search: String ids: [ID] type: AttributeTypeEnum @@ -678,7 +675,6 @@ type AttributeValue implements Node { id: ID! name: String slug: String - value: String translation(languageCode: LanguageCodeEnum!): AttributeValueTranslation inputType: AttributeInputTypeEnum reference: ID @@ -879,7 +875,6 @@ type CategoryDelete { input CategoryFilterInput { search: String - metadata: [MetadataInput] ids: [ID] } @@ -956,6 +951,7 @@ type Channel implements Node { slug: String! currencyCode: String! hasOrders: Boolean! + shippingZones: [ShippingZone!]! } type ChannelActivate { @@ -981,6 +977,7 @@ input ChannelCreateInput { name: String! slug: String! currencyCode: String! + addShippingZones: [ID!] } type ChannelDeactivate { @@ -1009,6 +1006,7 @@ type ChannelError { field: String message: String code: ChannelErrorCode! + shippingZones: [ID!] } enum ChannelErrorCode { @@ -1021,6 +1019,7 @@ enum ChannelErrorCode { CHANNEL_TARGET_ID_MUST_BE_DIFFERENT CHANNELS_CURRENCY_MUST_BE_THE_SAME CHANNEL_WITH_ORDERS + DUPLICATED_INPUT_ITEM } type ChannelUpdate { @@ -1036,6 +1035,8 @@ input ChannelUpdateInput { isActive: Boolean name: String slug: String + addShippingZones: [ID!] + removeShippingZones: [ID!] } type Checkout implements Node & ObjectWithMetadata { @@ -1065,7 +1066,6 @@ type Checkout implements Node & ObjectWithMetadata { subtotalPrice: TaxedMoney token: UUID! totalPrice: TaxedMoney - languageCode: LanguageCodeEnum! } type CheckoutAddPromoCode { @@ -1124,7 +1124,6 @@ input CheckoutCreateInput { email: String shippingAddress: AddressInput billingAddress: AddressInput - languageCode: LanguageCodeEnum } type CheckoutCustomerAttach { @@ -1184,6 +1183,7 @@ enum CheckoutErrorCode { ZERO_QUANTITY MISSING_CHANNEL_SLUG CHANNEL_INACTIVE + UNAVAILABLE_VARIANT_IN_CHANNEL } type CheckoutLanguageCodeUpdate { @@ -1423,7 +1423,6 @@ enum CollectionErrorCode { input CollectionFilterInput { published: CollectionPublished search: String - metadata: [MetadataInput] ids: [ID] channel: String } @@ -1908,7 +1907,6 @@ input CustomerInput { email: String isActive: Boolean note: String - languageCode: LanguageCodeEnum } type CustomerUpdate { @@ -2628,6 +2626,13 @@ type InvoiceRequestDelete { invoice: Invoice } +type InvoiceSendEmail { + errors: [Error!]! + @deprecated( + reason: "Use typed errors with error codes. This field will be removed after 2020-07-31." + ) +} + type InvoiceSendNotification { errors: [Error!]! @deprecated( @@ -2826,7 +2831,6 @@ enum MenuErrorCode { input MenuFilterInput { search: String slug: [String] - metadata: [MetadataInput] } input MenuInput { @@ -2900,7 +2904,6 @@ type MenuItemDelete { input MenuItemFilterInput { search: String - metadata: [MetadataInput] } input MenuItemInput { @@ -3341,7 +3344,7 @@ type Mutation { invoiceCreate(input: InvoiceCreateInput!, orderId: ID!): InvoiceCreate invoiceDelete(id: ID!): InvoiceDelete invoiceUpdate(id: ID!, input: UpdateInvoiceInput!): InvoiceUpdate - invoiceSendNotification(id: ID!): InvoiceSendNotification + invoiceSendEmail(id: ID!): InvoiceSendEmail giftCardActivate(id: ID!): GiftCardActivate giftCardCreate(input: GiftCardCreateInput!): GiftCardCreate giftCardDeactivate(id: ID!): GiftCardDeactivate @@ -3366,6 +3369,7 @@ type Mutation { voucherDelete(id: ID!): VoucherDelete voucherBulkDelete(ids: [ID]!): VoucherBulkDelete voucherUpdate(id: ID!, input: VoucherInput!): VoucherUpdate + invoiceSendNotification(id: ID!): InvoiceSendNotification voucherCataloguesAdd(id: ID!, input: CatalogueInput!): VoucherAddCatalogues voucherCataloguesRemove( id: ID! @@ -3763,7 +3767,6 @@ input OrderDraftFilterInput { customer: String created: DateRangeInput search: String - metadata: [MetadataInput] channels: [ID] } @@ -3921,7 +3924,6 @@ input OrderFilterInput { customer: String created: DateRangeInput search: String - metadata: [MetadataInput] channels: [ID] } @@ -4303,7 +4305,6 @@ enum PageErrorCode { input PageFilterInput { search: String - metadata: [MetadataInput] } type PageInfo { @@ -4579,10 +4580,6 @@ enum PaymentErrorCode { NOT_SUPPORTED_GATEWAY } -input PaymentFilterInput { - checkouts: [ID] -} - type PaymentGateway { name: String! id: ID! @@ -4853,6 +4850,10 @@ type Product implements Node & ObjectWithMetadata { isAvailableForPurchase: Boolean } +input PaymentFilterInput { + checkouts: [ID] +} + type ProductAttributeAssign { errors: [Error!]! @deprecated( @@ -4911,6 +4912,8 @@ input ProductChannelListingAddInput { visibleInListings: Boolean isAvailableForPurchase: Boolean availableForPurchaseDate: Date + addVariants: [ID!] + removeVariants: [ID!] } type ProductChannelListingError { @@ -4920,6 +4923,7 @@ type ProductChannelListingError { attributes: [ID!] values: [ID!] channels: [ID!] + variants: [ID!] } type ProductChannelListingUpdate { @@ -4932,7 +4936,7 @@ type ProductChannelListingUpdate { } input ProductChannelListingUpdateInput { - addChannels: [ProductChannelListingAddInput!] + updateChannels: [ProductChannelListingAddInput!] removeChannels: [ID!] } @@ -5033,7 +5037,6 @@ input ProductFilterInput { productType: ID stocks: ProductStockFilterInput search: String - metadata: [MetadataInput] price: PriceRangeInput minimalPrice: PriceRangeInput productTypes: [ID] @@ -5299,7 +5302,6 @@ input ProductTypeFilterInput { search: String configurable: ProductTypeConfigurable productType: ProductTypeEnum - metadata: [MetadataInput] ids: [ID] } @@ -5472,7 +5474,6 @@ type ProductVariantDelete { input ProductVariantFilterInput { search: String sku: [String] - metadata: [MetadataInput] } input ProductVariantInput { @@ -5606,6 +5607,7 @@ type Query { orderSettings: OrderSettings shippingZone(id: ID!, channel: String): ShippingZone shippingZones( + filter: ShippingZoneFilterInput channel: String before: String after: String @@ -6312,7 +6314,8 @@ type ShippingZone implements Node & ObjectWithMetadata { priceRange: MoneyRange countries: [CountryDisplay] shippingMethods: [ShippingMethod] - warehouses: [Warehouse] + warehouses: [Warehouse!]! + channels: [Channel!]! description: String } @@ -6351,6 +6354,7 @@ input ShippingZoneCreateInput { countries: [String] default: Boolean addWarehouses: [ID] + addChannels: [ID!] } type ShippingZoneDelete { @@ -6362,6 +6366,10 @@ type ShippingZoneDelete { shippingZone: ShippingZone } +input ShippingZoneFilterInput { + search: String +} + type ShippingZoneUpdate { errors: [Error!]! @deprecated( @@ -6377,7 +6385,9 @@ input ShippingZoneUpdateInput { countries: [String] default: Boolean addWarehouses: [ID] + addChannels: [ID!] removeWarehouses: [ID] + removeChannels: [ID!] } type Shop { @@ -6728,11 +6738,23 @@ type Transaction implements Node { token: String! kind: TransactionKind! isSuccess: Boolean! - error: String - gatewayResponse: JSONString! + error: TransactionError amount: Money } +enum TransactionError { + TRANSACTIONERROR_INCORRECT_NUMBER + TRANSACTIONERROR_INVALID_NUMBER + TRANSACTIONERROR_INCORRECT_CVV + TRANSACTIONERROR_INVALID_CVV + TRANSACTIONERROR_INCORRECT_ZIP + TRANSACTIONERROR_INCORRECT_ADDRESS + TRANSACTIONERROR_INVALID_EXPIRY_DATE + TRANSACTIONERROR_EXPIRED + TRANSACTIONERROR_PROCESSING_ERROR + TRANSACTIONERROR_DECLINED +} + enum TransactionKind { EXTERNAL AUTH @@ -6882,7 +6904,6 @@ type User implements Node & ObjectWithMetadata { avatar(size: Int): Image events: [CustomerEvent] storedPaymentSources: [PaymentSource] - languageCode: LanguageCodeEnum! } type UserAvatarDelete { @@ -6931,7 +6952,6 @@ input UserCreateInput { email: String isActive: Boolean note: String - languageCode: LanguageCodeEnum redirectUrl: String } @@ -7447,7 +7467,6 @@ enum WebhookSampleEventTypeEnum { CHECKOUT_CREATED CHECKOUT_UPDATED FULFILLMENT_CREATED - NOTIFY_USER PAGE_CREATED PAGE_UPDATED PAGE_DELETED diff --git a/src/categories/components/CategoryProductList/CategoryProductList.tsx b/src/categories/components/CategoryProductList/CategoryProductList.tsx index f1fa0c32a..3eff4ada7 100644 --- a/src/categories/components/CategoryProductList/CategoryProductList.tsx +++ b/src/categories/components/CategoryProductList/CategoryProductList.tsx @@ -7,9 +7,8 @@ import Checkbox from "@saleor/components/Checkbox"; import MoneyRange from "@saleor/components/MoneyRange"; import ResponsiveTable from "@saleor/components/ResponsiveTable"; import Skeleton from "@saleor/components/Skeleton"; -import TableCellAvatar, { - AVATAR_MARGIN -} from "@saleor/components/TableCellAvatar"; +import TableCellAvatar from "@saleor/components/TableCellAvatar"; +import { AVATAR_MARGIN } from "@saleor/components/TableCellAvatar/Avatar"; import TableHead from "@saleor/components/TableHead"; import TablePagination from "@saleor/components/TablePagination"; import { maybe, renderCollection } from "@saleor/misc"; diff --git a/src/channels/ChannelsWithVariantsAvailabilityCard/ChannelWithVariantAvailabilityItemWrapper.tsx b/src/channels/ChannelsWithVariantsAvailabilityCard/ChannelWithVariantAvailabilityItemWrapper.tsx new file mode 100644 index 000000000..31d82aa7f --- /dev/null +++ b/src/channels/ChannelsWithVariantsAvailabilityCard/ChannelWithVariantAvailabilityItemWrapper.tsx @@ -0,0 +1,137 @@ +import { + ExpansionPanel, + ExpansionPanelSummary, + makeStyles, + Typography +} from "@material-ui/core"; +import { ChannelData } from "@saleor/channels/utils"; +import { Messages } from "@saleor/components/ChannelsAvailabilityCard/types"; +import IconChevronDown from "@saleor/icons/ChevronDown"; +import Label from "@saleor/orders/components/OrderHistory/Label"; +import { getById } from "@saleor/orders/components/OrderReturnPage/utils"; +import { ProductDetails_product_variants } from "@saleor/products/types/ProductDetails"; +import { ChannelsWithVariantsData } from "@saleor/products/views/ProductUpdate/types"; +import { areAllChannelVariantsSelected } from "@saleor/products/views/ProductUpdate/utils"; +import React from "react"; +import { useIntl } from "react-intl"; +import { defineMessages } from "react-intl"; + +const useExpanderStyles = makeStyles( + theme => ({ + expanded: {}, + root: { + boxShadow: "none", + margin: 0, + padding: 0, + paddingBottom: theme.spacing(2), + + "&:before": { + content: "none" + }, + + "&$expanded": { + margin: 0, + border: "none" + } + } + }), + { name: "ChannelWithVariantAvailabilityItemWrapperExpander" } +); + +const useSummaryStyles = makeStyles( + theme => ({ + expanded: {}, + root: { + width: "100%", + border: "none", + margin: 0, + padding: 0, + minHeight: 0, + paddingTop: theme.spacing(2), + + "&$expanded": { + minHeight: 0 + } + }, + content: { + margin: 0, + + "&$expanded": { + margin: 0 + } + } + }), + { name: "ChannelWithVariantAvailabilityItemWrapperSummary" } +); + +const useStyles = makeStyles( + () => ({ + container: { + display: "flex", + flexDirection: "column" + } + }), + { name: "ChannelWithVariantAvailabilityItemWrapper" } +); + +const messages = defineMessages({ + variantCountLabel: { + defaultMessage: "{variantsCount} variants", + description: "variants count label" + }, + allVariantsLabel: { + defaultMessage: "All variants", + description: "all variants label" + } +}); + +interface ChannelAvailabilityItemWrapperProps { + variants: ProductDetails_product_variants[]; + channelId: string; + channels: ChannelData[]; + channelsWithVariantsData: ChannelsWithVariantsData; + messages: Messages; +} + +const ChannelWithVariantsAvailabilityItemWrapper: React.FC = ({ + channels, + channelsWithVariantsData, + channelId, + variants, + messages: commonChannelMessages, + children +}) => { + const expanderClasses = useExpanderStyles({}); + const summaryClasses = useSummaryStyles({}); + const classes = useStyles({}); + const intl = useIntl(); + + const { name } = channels.find(getById(channelId)); + const { selectedVariantsIds } = channelsWithVariantsData[channelId]; + + const variantsCount = selectedVariantsIds.length; + + const variantsLabel = areAllChannelVariantsSelected(variants, { + selectedVariantsIds + }) + ? messages.allVariantsLabel + : messages.variantCountLabel; + + return ( + + } + classes={summaryClasses} + > +

+ {name} +
+ + {children} + + ); +}; + +export default ChannelWithVariantsAvailabilityItemWrapper; diff --git a/src/channels/ChannelsWithVariantsAvailabilityCard/ChannelsWithVariantsAvailabilityCard.stories.tsx b/src/channels/ChannelsWithVariantsAvailabilityCard/ChannelsWithVariantsAvailabilityCard.stories.tsx new file mode 100644 index 000000000..e8ede0ddb --- /dev/null +++ b/src/channels/ChannelsWithVariantsAvailabilityCard/ChannelsWithVariantsAvailabilityCard.stories.tsx @@ -0,0 +1,108 @@ +import { ProductDetails_product_variants } from "@saleor/products/types/ProductDetails"; +import CentralPlacementDecorator from "@saleor/storybook/CentralPlacementDecorator"; +import CommonDecorator from "@saleor/storybook/Decorator"; +import { storiesOf } from "@storybook/react"; +import React from "react"; + +import ChannelsWithVariantsAvailabilityCard, { + ChannelsWithVariantsAvailabilityCardProps +} from "./ChannelsWithVariantsAvailabilityCard"; + +const props: ChannelsWithVariantsAvailabilityCardProps = { + channels: [ + { + id: "1", + name: "Channel 1", + isAvailableForPurchase: false, + isPublished: true, + publicationDate: "2020-07-30", + availableForPurchase: null, + visibleInListings: false, + currency: "EUR", + variantsIds: ["variantA"], + costPrice: "5", + price: "15" + }, + { + id: "2", + name: "Channel 2", + isAvailableForPurchase: false, + isPublished: true, + publicationDate: "2020-07-30", + availableForPurchase: null, + visibleInListings: false, + currency: "EUR", + variantsIds: ["variantA"], + costPrice: "5", + price: "15" + }, + { + id: "3", + name: "Channel 3", + isAvailableForPurchase: false, + isPublished: true, + publicationDate: "2020-07-30", + availableForPurchase: null, + visibleInListings: false, + currency: "EUR", + variantsIds: ["variantA"], + costPrice: "5", + price: "15" + } + ], + variants: [ + { + id: "variantA", + name: "Variant A", + media: [ + { + url: + "https://test-envs-stack-testenvsmediabucket050c0d50-qdkqrzgoumxv.s3.amazonaws.com/feature-assing-variants-to-channel-listings/products/saleordemoproduct_fd_juice_06.png" + } + ] + }, + { + id: "variantB", + name: "Variant B", + media: [ + { + url: + "https://test-envs-stack-testenvsmediabucket050c0d50-qdkqrzgoumxv.s3.amazonaws.com/feature-assing-variants-to-channel-listings/products/saleordemoproduct_fd_juice_05.png" + } + ] + }, + { + id: "variantC", + name: "Variant C", + media: [] + } + ] as ProductDetails_product_variants[], + channelsWithVariantsData: { + ["1"]: { + selectedVariantsIds: ["variantA", "variantB"], + variantsIdsToRemove: [], + variantsIdsToAdd: [] + }, + ["2"]: { + selectedVariantsIds: ["variantA", "variantC"], + variantsIdsToRemove: [], + variantsIdsToAdd: [] + }, + ["3"]: { + selectedVariantsIds: [], + variantsIdsToRemove: [], + variantsIdsToAdd: [] + } + }, + messages: { + hiddenLabel: "Not published", + visibleLabel: "Published" + }, + onChange: () => undefined, + openModal: () => undefined +}; + +storiesOf("Channels / Channels with variants availability card", module) + .addDecorator(CommonDecorator) + .addDecorator(CentralPlacementDecorator) + .add("default", () => ); diff --git a/src/channels/ChannelsWithVariantsAvailabilityCard/ChannelsWithVariantsAvailabilityCard.tsx b/src/channels/ChannelsWithVariantsAvailabilityCard/ChannelsWithVariantsAvailabilityCard.tsx new file mode 100644 index 000000000..d459adca8 --- /dev/null +++ b/src/channels/ChannelsWithVariantsAvailabilityCard/ChannelsWithVariantsAvailabilityCard.tsx @@ -0,0 +1,101 @@ +import CannotDefineChannelsAvailabilityCard from "@saleor/channels/components/CannotDefineChannelsAvailabilityCard/CannotDefineChannelsAvailabilityCard"; +import { ChannelData } from "@saleor/channels/utils"; +import ChannelAvailabilityItemContent from "@saleor/components/ChannelsAvailabilityCard/Channel/ChannelAvailabilityItemContent"; +import ChannelsAvailabilityCardWrapper, { + ChannelsAvailabilityWrapperProps +} from "@saleor/components/ChannelsAvailabilityCard/ChannelsAvailabilityCardWrapper"; +import { + ChannelOpts, + ChannelsAvailabilityError, + Messages +} from "@saleor/components/ChannelsAvailabilityCard/types"; +import { getChannelsAvailabilityMessages } from "@saleor/components/ChannelsAvailabilityCard/utils"; +import useDateLocalize from "@saleor/hooks/useDateLocalize"; +import { getById } from "@saleor/orders/components/OrderReturnPage/utils"; +import { ProductDetails_product_variants } from "@saleor/products/types/ProductDetails"; +import { ChannelsWithVariantsData } from "@saleor/products/views/ProductUpdate/types"; +import { + areAnyChannelVariantsSelected, + getTotalSelectedChannelsCount +} from "@saleor/products/views/ProductUpdate/utils"; +import React from "react"; +import { useIntl } from "react-intl"; + +import ChannelWithVariantsAvailabilityItemWrapper from "./ChannelWithVariantAvailabilityItemWrapper"; + +type CommonChannelsAvailabilityProps = Omit< + ChannelsAvailabilityWrapperProps, + "children" | "selectedChannelsCount" | "allChannelsCount" +>; + +export interface ChannelsWithVariantsAvailabilityCardProps + extends CommonChannelsAvailabilityProps { + channelsWithVariantsData: ChannelsWithVariantsData; + channels: ChannelData[]; + variants: ProductDetails_product_variants[]; + errors?: ChannelsAvailabilityError[]; + messages: Messages; + onChange: (id: string, data: ChannelOpts) => void; +} + +const ChannelsWithVariantsAvailabilityCard: React.FC = ({ + channels, + channelsWithVariantsData, + openModal, + variants, + errors = [], + messages, + onChange +}) => { + const intl = useIntl(); + const localizeDate = useDateLocalize(); + + const channelsMessages = getChannelsAvailabilityMessages({ + messages, + channels, + intl, + localizeDate + }); + + const allChannelsCount = channels.length; + + const selectedChannelsCount = getTotalSelectedChannelsCount( + channelsWithVariantsData + ); + + if (!variants?.length) { + return ; + } + + return ( + + {channels + .filter(({ id }) => + areAnyChannelVariantsSelected(channelsWithVariantsData[id]) + ) + .map(({ id }) => ( + + + + ))} + + ); +}; + +export default ChannelsWithVariantsAvailabilityCard; diff --git a/src/channels/components/CannotDefineChannelsAvailabilityCard/CannotDefineChannelsAvailabilityCard.stories.tsx b/src/channels/components/CannotDefineChannelsAvailabilityCard/CannotDefineChannelsAvailabilityCard.stories.tsx new file mode 100644 index 000000000..a3fc47af2 --- /dev/null +++ b/src/channels/components/CannotDefineChannelsAvailabilityCard/CannotDefineChannelsAvailabilityCard.stories.tsx @@ -0,0 +1,11 @@ +import CentralPlacementDecorator from "@saleor/storybook/CentralPlacementDecorator"; +import CommonDecorator from "@saleor/storybook/Decorator"; +import { storiesOf } from "@storybook/react"; +import React from "react"; + +import CannotDefineChannelsAvailabilityCard from "./CannotDefineChannelsAvailabilityCard"; + +storiesOf("Channels / Cannot define channels availability card", module) + .addDecorator(CommonDecorator) + .addDecorator(CentralPlacementDecorator) + .add("default", () => ); diff --git a/src/channels/components/CannotDefineChannelsAvailabilityCard/CannotDefineChannelsAvailabilityCard.tsx b/src/channels/components/CannotDefineChannelsAvailabilityCard/CannotDefineChannelsAvailabilityCard.tsx new file mode 100644 index 000000000..4443ba36d --- /dev/null +++ b/src/channels/components/CannotDefineChannelsAvailabilityCard/CannotDefineChannelsAvailabilityCard.tsx @@ -0,0 +1,28 @@ +import { Card, CardContent } from "@material-ui/core"; +import React from "react"; +import { defineMessages, FormattedMessage } from "react-intl"; + +import CardTitle from "../../../components/CardTitle"; + +const messages = defineMessages({ + title: { + defaultMessage: "Availability", + description: "CannotDefineChannelsAvailabilityCard title" + }, + subtitle: { + defaultMessage: + "You will be able to define availability of product after creating variants.", + description: "CannotDefineChannelsAvailabilityCard subtitle" + } +}); + +const CannotDefineChannelsAvailabilityCard: React.FC = () => ( + + } /> + + + + +); + +export default CannotDefineChannelsAvailabilityCard; diff --git a/src/channels/components/ChannelForm/ChannelForm.stories.tsx b/src/channels/components/ChannelForm/ChannelForm.stories.tsx index 27219435a..5cc6ae3a7 100644 --- a/src/channels/components/ChannelForm/ChannelForm.stories.tsx +++ b/src/channels/components/ChannelForm/ChannelForm.stories.tsx @@ -8,6 +8,8 @@ import ChannelForm, { ChannelFormProps } from "./ChannelForm"; const props: ChannelFormProps = { data: { currencyCode: "euro", + shippingZonesIdsToAdd: [], + shippingZonesIdsToRemove: [], name: "Test", slug: "test" }, diff --git a/src/channels/components/ChannelForm/ChannelForm.tsx b/src/channels/components/ChannelForm/ChannelForm.tsx index 2d362acaa..81014378d 100644 --- a/src/channels/components/ChannelForm/ChannelForm.tsx +++ b/src/channels/components/ChannelForm/ChannelForm.tsx @@ -26,6 +26,8 @@ export interface FormData { name: string; currencyCode: string; slug: string; + shippingZonesIdsToAdd: string[]; + shippingZonesIdsToRemove: string[]; } export interface ChannelFormProps { diff --git a/src/channels/components/ChannelsAvailabilityDialog/utils.ts b/src/channels/components/ChannelsAvailabilityDialog/utils.ts new file mode 100644 index 000000000..d3c5b7d2a --- /dev/null +++ b/src/channels/components/ChannelsAvailabilityDialog/utils.ts @@ -0,0 +1,11 @@ +import { filter } from "fuzzaldrin"; +import React from "react"; + +export const useChannelsSearch = function( + channels: T[] +) { + const [query, onQueryChange] = React.useState(""); + const filteredChannels = filter(channels, query, { key: "name" }); + + return { query, onQueryChange, filteredChannels }; +}; diff --git a/src/channels/components/ChannelsWithVariantsAvailabilityDialog/ChannelsWithVariantsAvailabilityDialog.stories.tsx b/src/channels/components/ChannelsWithVariantsAvailabilityDialog/ChannelsWithVariantsAvailabilityDialog.stories.tsx new file mode 100644 index 000000000..0c44ba5f3 --- /dev/null +++ b/src/channels/components/ChannelsWithVariantsAvailabilityDialog/ChannelsWithVariantsAvailabilityDialog.stories.tsx @@ -0,0 +1,82 @@ +import { ChannelData } from "@saleor/channels/utils"; +import { ProductDetails_product_variants } from "@saleor/products/types/ProductDetails"; +import CommonDecorator from "@saleor/storybook/Decorator"; +import { storiesOf } from "@storybook/react"; +import React from "react"; + +import ChannelsWithVariantsAvailabilityDialog, { + ChannelsAvailabilityDialogProps +} from "./ChannelsWithVariantsAvailabilityDialog"; + +const props: ChannelsAvailabilityDialogProps = { + channels: [ + { + id: "1", + name: "Channel 1" + }, + { + id: "2", + name: "Channel 2" + }, + { + id: "3", + name: "Channel 3" + } + ] as ChannelData[], + variants: [ + { + id: "variantA", + name: "Variant A", + media: [ + { + url: + "https://test-envs-stack-testenvsmediabucket050c0d50-qdkqrzgoumxv.s3.amazonaws.com/feature-assing-variants-to-channel-listings/products/saleordemoproduct_fd_juice_06.png" + } + ] + }, + { + id: "variantB", + name: "Variant B", + media: [ + { + url: + "https://test-envs-stack-testenvsmediabucket050c0d50-qdkqrzgoumxv.s3.amazonaws.com/feature-assing-variants-to-channel-listings/products/saleordemoproduct_fd_juice_05.png" + } + ] + }, + { + id: "variantC", + name: "Variant C", + media: [] + } + ] as ProductDetails_product_variants[], + onChannelsWithVariantsConfirm: () => undefined, + addVariantToChannel: () => undefined, + removeVariantFromChannel: () => undefined, + channelsWithVariantsData: { + ["1"]: { + selectedVariantsIds: ["variantA", "variantB"], + variantsIdsToRemove: [], + variantsIdsToAdd: [] + }, + ["2"]: { + selectedVariantsIds: ["variantA", "variantC"], + variantsIdsToRemove: [], + variantsIdsToAdd: [] + }, + ["3"]: { + selectedVariantsIds: [], + variantsIdsToRemove: [], + variantsIdsToAdd: [] + } + }, + onChannelsAvailiabilityModalClose: () => undefined, + isChannelsAvailabilityModalOpen: true, + toggleAllChannels: () => undefined, + toggleAllChannelVariants: () => () => undefined, + haveChannelsWithVariantsDataChanged: true +}; + +storiesOf("Channels / Channels with Variants Availability Dialog", module) + .addDecorator(CommonDecorator) + .add("default", () => ); diff --git a/src/channels/components/ChannelsWithVariantsAvailabilityDialog/ChannelsWithVariantsAvailabilityDialog.tsx b/src/channels/components/ChannelsWithVariantsAvailabilityDialog/ChannelsWithVariantsAvailabilityDialog.tsx new file mode 100644 index 000000000..6c2ace247 --- /dev/null +++ b/src/channels/components/ChannelsWithVariantsAvailabilityDialog/ChannelsWithVariantsAvailabilityDialog.tsx @@ -0,0 +1,120 @@ +import { ChannelData } from "@saleor/channels/utils"; +import ActionDialog from "@saleor/components/ActionDialog"; +import { ProductDetails_product_variants } from "@saleor/products/types/ProductDetails"; +import { UseChannelsWithProductVariants } from "@saleor/products/views/ProductUpdate/types"; +import { + areAllVariantsAtAllChannelsSelected, + areAnyChannelVariantsSelected +} from "@saleor/products/views/ProductUpdate/utils"; +import isEqual from "lodash/isEqual"; +import React, { useEffect, useRef, useState } from "react"; +import { useIntl } from "react-intl"; +import { defineMessages } from "react-intl"; + +import { useChannelsSearch } from "../../../components/ChannelsAvailabilityDialog/utils"; +import ChannelsAvailabilityContentWrapper from "../../../components/ChannelsAvailabilityDialogWrapper/ChannelsAvailabilityDialogWrapper"; +import ChannelsWithVariantsAvailabilityDialogContent from "./ChannelsWithVariantsAvailabilityDialogContent"; + +const messages = defineMessages({ + title: { + defaultMessage: "Manage Channels", + description: "channels variants availability dialog title" + } +}); + +type UseChannelsWithVariantsCommonProps = Omit< + UseChannelsWithProductVariants, + | "onChannelsAvailiabilityModalOpen" + | "setHaveChannelsWithVariantsChanged" + | "channelsData" + | "setChannelsData" +>; + +export interface ChannelsAvailabilityDialogProps + extends UseChannelsWithVariantsCommonProps { + channels: ChannelData[]; + contentType?: string; + variants: ProductDetails_product_variants[]; +} + +export const ChannelsWithVariantsAvailabilityDialog: React.FC = ({ + channels, + contentType, + variants, + isChannelsAvailabilityModalOpen, + toggleAllChannels, + channelsWithVariantsData, + onChannelsAvailiabilityModalClose, + haveChannelsWithVariantsDataChanged, + onChannelsWithVariantsConfirm, + ...rest +}) => { + const intl = useIntl(); + const [canConfirm, setCanConfirm] = useState(false); + const channelsWithVariantsDataRef = useRef(channelsWithVariantsData); + const { query, onQueryChange, filteredChannels } = useChannelsSearch( + channels + ); + + const handleSetCanConfirm = () => { + const hasDataInsideDialogChanged = !isEqual( + channelsWithVariantsData, + channelsWithVariantsDataRef.current + ); + + if (hasDataInsideDialogChanged) { + channelsWithVariantsDataRef.current = channelsWithVariantsData; + setCanConfirm(true); + } + }; + + useEffect(handleSetCanConfirm, [channelsWithVariantsData]); + + const hasAllChannelsSelected = areAllVariantsAtAllChannelsSelected( + variants, + channelsWithVariantsData + ); + + const isChannelSelected = (channelId: string) => + areAnyChannelVariantsSelected(channelsWithVariantsData[channelId]); + + const handleClose = () => { + setCanConfirm(false); + onChannelsAvailiabilityModalClose(); + }; + + const handleConfirm = () => { + setCanConfirm(false); + onChannelsWithVariantsConfirm(); + }; + + return ( + + + + + + ); +}; + +export default ChannelsWithVariantsAvailabilityDialog; diff --git a/src/channels/components/ChannelsWithVariantsAvailabilityDialog/ChannelsWithVariantsAvailabilityDialogContent.tsx b/src/channels/components/ChannelsWithVariantsAvailabilityDialog/ChannelsWithVariantsAvailabilityDialogContent.tsx new file mode 100644 index 000000000..dec986d8a --- /dev/null +++ b/src/channels/components/ChannelsWithVariantsAvailabilityDialog/ChannelsWithVariantsAvailabilityDialogContent.tsx @@ -0,0 +1,211 @@ +import placeholderImage from "@assets/images/placeholder60x60.png"; +import { + Divider, + ExpansionPanel, + ExpansionPanelSummary, + makeStyles, + Typography +} from "@material-ui/core"; +import { ChannelData } from "@saleor/channels/utils"; +import IconCheckboxChecked from "@saleor/icons/CheckboxChecked"; +import IconCheckboxSemiChecked from "@saleor/icons/CheckboxSemiChecked"; +import IconChevronDown from "@saleor/icons/ChevronDown"; +import Label from "@saleor/orders/components/OrderHistory/Label"; +import { getById } from "@saleor/orders/components/OrderReturnPage/utils"; +import { ProductDetails_product_variants } from "@saleor/products/types/ProductDetails"; +import { ChannelsWithVariantsData } from "@saleor/products/views/ProductUpdate/types"; +import { areAllChannelVariantsSelected } from "@saleor/products/views/ProductUpdate/utils"; +import map from "lodash-es/map"; +import React, { ChangeEvent } from "react"; +import { defineMessages, useIntl } from "react-intl"; + +import ControlledCheckbox from "../../../components/ControlledCheckbox"; +import Avatar from "../../../components/TableCellAvatar/Avatar"; + +const useStyles = makeStyles( + theme => ({ + variantContainer: { + padding: theme.spacing(2, 0, 2, 4) + }, + channelContainer: { + width: "100%" + }, + channelCheckboxContainer: { + width: "100%", + padding: theme.spacing(2, 0) + }, + channelTitleContainer: { + display: "flex", + flexDirection: "column" + }, + variantTitleContainer: { + display: "flex", + flexDirection: "row", + alignItems: "center" + } + }), + { name: "ChannelsWithVariantsAvailabilityDialogContent" } +); + +const useExpanderStyles = makeStyles( + () => ({ + expanded: {}, + root: { + boxShadow: "none", + + "&:before": { + content: "none" + }, + + "&$expanded": { + margin: 0, + border: "none" + } + } + }), + { name: "ChannelsWithVariantsAvailabilityExpander" } +); + +const useSummaryStyles = makeStyles( + theme => ({ + expanded: {}, + root: { + width: "100%", + border: "none", + height: theme.spacing(10), + padding: 0, + margin: 0, + minHeight: 0 + }, + content: { + margin: 0 + } + }), + { name: "ChannelsWithVariantsAvailabilityChannelSummary" } +); + +const messages = defineMessages({ + variantsSelectedLabel: { + defaultMessage: "{variantsAmount} variants selected", + description: "variants selected label" + } +}); + +interface ChannelsWithVariantsAvailabilityDialogContentProps { + addVariantToChannel: (channelId: string, variantId: string) => void; + removeVariantFromChannel: (channelId: string, variantId: string) => void; + channelsWithVariants: ChannelsWithVariantsData; + toggleAllChannelVariants: (channelId: string) => () => void; + isChannelSelected: (channelId: string) => boolean; + channels: ChannelData[]; + allVariants: ProductDetails_product_variants[]; +} + +const ChannelsWithVariantsAvailabilityDialogContent: React.FC = ({ + channelsWithVariants, + addVariantToChannel, + removeVariantFromChannel, + toggleAllChannelVariants, + isChannelSelected, + channels, + allVariants +}) => { + const intl = useIntl(); + const classes = useStyles({}); + const expanderClasses = useExpanderStyles({}); + const summaryClasses = useSummaryStyles({}); + + const handleVariantChange = (channelId: string, variantId: string) => ( + event: ChangeEvent + ) => + event.target.value + ? addVariantToChannel(channelId, variantId) + : removeVariantFromChannel(channelId, variantId); + + const selectChannelIcon = (channelId: string) => + areAllChannelVariantsSelected( + allVariants, + channelsWithVariants[channelId] + ) ? ( + + ) : ( + + ); + + return ( + <> + {map(channelsWithVariants, ({ selectedVariantsIds }, channelId) => { + const { name } = channels.find(getById(channelId)); + + const isVariantSelected = (variantId: string) => + selectedVariantsIds.includes(variantId); + + const getVariantThumbnailSrc = (variantId: string) => + allVariants.find(getById(variantId)).media[0]?.url || + placeholderImage; + + return ( + + } + classes={summaryClasses} + > +
event.stopPropagation()} + > +
+ + {name} +
+ } + onChange={toggleAllChannelVariants(channelId)} + /> +
+ + +
+ {allVariants.map(({ id: variantId, name }) => ( + <> +
+ + + {name} +
+ } + onChange={handleVariantChange(channelId, variantId)} + /> + + + + ))} +
+ ); + })} + + ); +}; + +export default ChannelsWithVariantsAvailabilityDialogContent; diff --git a/src/channels/components/ChannelsWithVariantsAvailabilityDialog/index.tsx b/src/channels/components/ChannelsWithVariantsAvailabilityDialog/index.tsx new file mode 100644 index 000000000..ff569276d --- /dev/null +++ b/src/channels/components/ChannelsWithVariantsAvailabilityDialog/index.tsx @@ -0,0 +1,2 @@ +export * from "./ChannelsWithVariantsAvailabilityDialog"; +export { default } from "./ChannelsWithVariantsAvailabilityDialog"; diff --git a/src/channels/components/ShippingZonesCard/ShippingZoneItem.tsx b/src/channels/components/ShippingZonesCard/ShippingZoneItem.tsx new file mode 100644 index 000000000..3a850a420 --- /dev/null +++ b/src/channels/components/ShippingZonesCard/ShippingZoneItem.tsx @@ -0,0 +1,43 @@ +import { Divider, Typography } from "@material-ui/core"; +import { makeStyles } from "@material-ui/core/styles"; +import { Channel_channel_shippingZones } from "@saleor/channels/types/Channel"; +import DeletableItem from "@saleor/components/DeletableItem"; +import React from "react"; + +const useStyles = makeStyles( + theme => ({ + container: { + paddingLeft: theme.spacing(3), + display: "flex", + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center" + } + }), + { name: "ShippingZoneItem" } +); + +interface ShippingZoneItemProps { + zone: Channel_channel_shippingZones; + onDelete: (id: string) => void; +} + +const ShippingZoneItem: React.FC = ({ + zone, + onDelete +}) => { + const { id, name } = zone; + const classes = useStyles({}); + + return ( + <> +
+ {name} + +
+ + + ); +}; + +export default ShippingZoneItem; diff --git a/src/channels/components/ShippingZonesCard/ShippingZonesCard.stories.tsx b/src/channels/components/ShippingZonesCard/ShippingZonesCard.stories.tsx new file mode 100644 index 000000000..a5da41cbd --- /dev/null +++ b/src/channels/components/ShippingZonesCard/ShippingZonesCard.stories.tsx @@ -0,0 +1,42 @@ +import { Channel_channel_shippingZones } from "@saleor/channels/types/Channel"; +import CommonDecorator from "@saleor/storybook/Decorator"; +import { storiesOf } from "@storybook/react"; +import React from "react"; + +import ShippingZonesCard from "./ShippingZonesCard"; + +const shippingZones = [ + { + __typename: "ShippingZone", + id: "2", + name: "Fancy shipping zone" + }, + { + __typename: "ShippingZone", + id: "3", + name: "Nice shipping zone" + } +]; + +const baseProps = { + addShippingZone: () => undefined, + removeShippingZone: () => undefined, + searchShippingZones: () => undefined, + fetchMoreShippingZones: { + loading: false, + hasMore: false, + onFetchMore: () => undefined + }, + shippingZones: [], + shippingZonesChoices: shippingZones as Channel_channel_shippingZones[] +}; + +storiesOf("Shipping zones card", module) + .addDecorator(CommonDecorator) + .add("with no options selected", () => ) + .add("with options selected", () => ( + + )); diff --git a/src/channels/components/ShippingZonesCard/ShippingZonesCard.tsx b/src/channels/components/ShippingZonesCard/ShippingZonesCard.tsx new file mode 100644 index 000000000..d962c0013 --- /dev/null +++ b/src/channels/components/ShippingZonesCard/ShippingZonesCard.tsx @@ -0,0 +1,84 @@ +import { + Card, + CardContent, + Divider, + makeStyles, + Typography +} from "@material-ui/core"; +import ExpansionPanel from "@material-ui/core/ExpansionPanel"; +import CardTitle from "@saleor/components/CardTitle"; +import React from "react"; +import { defineMessages, useIntl } from "react-intl"; + +import ShippingZoneItem from "./ShippingZoneItem"; +import ShippingZonesCardListFooter from "./ShippingZonesCardListFooter"; +import ShippingZonesListHeader from "./ShippingZonesListHeader"; +import { ShippingZonesProps } from "./types"; + +const messages = defineMessages({ + title: { + defaultMessage: "Shipping Zones", + description: "card title" + }, + subtitle: { + defaultMessage: + "Select Shipping Zones that will be supplied via this channel. You can assign Shipping Zones to multiple channels.", + description: "card subtitle" + } +}); + +const useExpanderStyles = makeStyles( + () => ({ + // empty expanded needed for mui to use root styles + expanded: {}, + root: { + boxShadow: "none", + + "&:before": { + content: "none" + }, + + "&$expanded": { + margin: 0, + border: "none" + } + } + }), + { name: "ShippingZonesCardExpander" } +); + +type ShippingZonesCardProps = ShippingZonesProps; + +const ShippingZonesCard: React.FC = props => { + const { + shippingZones, + removeShippingZone, + fetchMoreShippingZones: { totalCount } + } = props; + + const expanderClasses = useExpanderStyles({}); + const intl = useIntl(); + + const hasMoreZonesToBeSelected = totalCount !== shippingZones.length; + + return ( + + + + {intl.formatMessage(messages.subtitle)} + + + + + {shippingZones.map(zone => ( + + ))} + {hasMoreZonesToBeSelected ? ( + + ) : null} + + + ); +}; + +export default ShippingZonesCard; diff --git a/src/channels/components/ShippingZonesCard/ShippingZonesCardListFooter.tsx b/src/channels/components/ShippingZonesCard/ShippingZonesCardListFooter.tsx new file mode 100644 index 000000000..ab56a0139 --- /dev/null +++ b/src/channels/components/ShippingZonesCard/ShippingZonesCardListFooter.tsx @@ -0,0 +1,79 @@ +import { ClickAwayListener } from "@material-ui/core"; +import { Channel_channel_shippingZones } from "@saleor/channels/types/Channel"; +import SingleAutocompleteSelectField from "@saleor/components/SingleAutocompleteSelectField"; +import CardAddItemsFooter from "@saleor/products/components/ProductStocks/CardAddItemsFooter"; +import { mapNodeToChoice } from "@saleor/utils/maps"; +import React, { useEffect, useRef, useState } from "react"; +import { defineMessages } from "react-intl"; + +import { ShippingZonesProps } from "./types"; + +const messages = defineMessages({ + addZoneTitle: { + defaultMessage: "Add Shipping Zones", + description: "add shipping zone title" + } +}); + +type ShippingZonesCardListFooterProps = ShippingZonesProps; + +const ShippingZonesCardListFooter: React.FC = ({ + shippingZonesChoices, + searchShippingZones, + fetchMoreShippingZones, + addShippingZone, + shippingZones +}) => { + const [isChoicesSelectShown, setIsChoicesSelectShown] = useState(false); + const shippingZonesRef = useRef( + shippingZones + ); + + // select holds value and displays it so it needs remounting + // to display empty input after adding new zone + useEffect(() => { + if (shippingZones.length > shippingZonesRef.current.length) { + setIsChoicesSelectShown(true); + } + + shippingZonesRef.current = shippingZones; + }, [shippingZones]); + + const handleChoice = ({ target }) => { + setIsChoicesSelectShown(false); + addShippingZone(target.value); + }; + + const handleFooterClickAway = () => { + setIsChoicesSelectShown(false); + searchShippingZones(""); + }; + + return isChoicesSelectShown ? ( + +
+ +
+
+ ) : ( + setIsChoicesSelectShown(true)} + title={messages.addZoneTitle} + testIds={{ + link: "add-shipping-zone-link", + button: "add-shipping-zone-button" + }} + /> + ); +}; + +export default ShippingZonesCardListFooter; diff --git a/src/channels/components/ShippingZonesCard/ShippingZonesListHeader.tsx b/src/channels/components/ShippingZonesCard/ShippingZonesListHeader.tsx new file mode 100644 index 000000000..1e254700e --- /dev/null +++ b/src/channels/components/ShippingZonesCard/ShippingZonesListHeader.tsx @@ -0,0 +1,73 @@ +import { ExpansionPanelSummary, Typography } from "@material-ui/core"; +import { makeStyles } from "@material-ui/core/styles"; +import HorizontalSpacer from "@saleor/apps/components/HorizontalSpacer"; +import { Channel_channel_shippingZones } from "@saleor/channels/types/Channel"; +import IconChevronDown from "@saleor/icons/ChevronDown"; +import React from "react"; +import { defineMessages, useIntl } from "react-intl"; + +const useStyles = makeStyles( + theme => ({ + container: { + width: "100%", + display: "flex", + flexDirection: "row", + alignItems: "center" + }, + // empty expanded needed for mui to use root styles + expanded: {}, + root: { + width: "100%", + border: "none", + marginRight: theme.spacing(1), + paddingBottom: theme.spacing(2), + minHeight: 0, + + "&$expanded": { + minHeight: 0 + } + }, + content: { + paddingLeft: theme.spacing(1), + margin: 0, + + "&$expanded": { + margin: 0 + } + } + }), + { name: "ShippingZonesListHeader" } +); + +const messages = defineMessages({ + title: { + defaultMessage: "{zonesCount} Shipping Zones", + description: "title" + } +}); + +interface ShippingZonesListHeaderProps { + shippingZones: Channel_channel_shippingZones[]; +} + +const ShippingZonesListHeader: React.FC = ({ + shippingZones +}) => { + const classes = useStyles({}); + const intl = useIntl(); + + return ( +
+ } classes={classes}> + + {intl.formatMessage(messages.title, { + zonesCount: shippingZones.length + })} + + + +
+ ); +}; + +export default ShippingZonesListHeader; diff --git a/src/channels/components/ShippingZonesCard/index.tsx b/src/channels/components/ShippingZonesCard/index.tsx new file mode 100644 index 000000000..c38cdab7d --- /dev/null +++ b/src/channels/components/ShippingZonesCard/index.tsx @@ -0,0 +1,2 @@ +export * from "./ShippingZonesCard"; +export { default } from "./ShippingZonesCard"; diff --git a/src/channels/components/ShippingZonesCard/types.ts b/src/channels/components/ShippingZonesCard/types.ts new file mode 100644 index 000000000..a6dcb4172 --- /dev/null +++ b/src/channels/components/ShippingZonesCard/types.ts @@ -0,0 +1,12 @@ +import { Channel_channel_shippingZones } from "@saleor/channels/types/Channel"; +import { SearchShippingZones_search_edges_node } from "@saleor/searches/types/SearchShippingZones"; +import { FetchMoreProps } from "@saleor/types"; + +export interface ShippingZonesProps { + addShippingZone: (id: string) => void; + removeShippingZone: (id: string) => void; + searchShippingZones: (searchPhrase: string) => void; + fetchMoreShippingZones: FetchMoreProps; + shippingZones: Channel_channel_shippingZones[]; + shippingZonesChoices: SearchShippingZones_search_edges_node[]; +} diff --git a/src/channels/fixtures.ts b/src/channels/fixtures.ts index 2a4617f63..d211e93cb 100644 --- a/src/channels/fixtures.ts +++ b/src/channels/fixtures.ts @@ -18,6 +18,7 @@ export const channelsList: Channels_channels[] = [ { __typename: "Channel", currencyCode: "euro", + shippingZones: [], hasOrders: false, id: "Q2hhbm5lcDoy", isActive: true, @@ -27,6 +28,7 @@ export const channelsList: Channels_channels[] = [ { __typename: "Channel", currencyCode: "euro", + shippingZones: [], hasOrders: false, id: "Q2hhbm7lbDoy213", isActive: true, @@ -37,6 +39,7 @@ export const channelsList: Channels_channels[] = [ __typename: "Channel", currencyCode: "euro", hasOrders: false, + shippingZones: [], id: "Q2hhbn5lbDoytr", isActive: true, name: "Channel test", @@ -45,6 +48,7 @@ export const channelsList: Channels_channels[] = [ { __typename: "Channel", currencyCode: "euro", + shippingZones: [], hasOrders: false, id: "Q2hhbm5lbDo5bot", isActive: true, @@ -54,6 +58,7 @@ export const channelsList: Channels_channels[] = [ { __typename: "Channel", currencyCode: "euro", + shippingZones: [], hasOrders: false, id: "Q2hhbm7lbDoyr0tr", isActive: true, @@ -63,6 +68,7 @@ export const channelsList: Channels_channels[] = [ { __typename: "Channel", currencyCode: "euro", + shippingZones: [], hasOrders: false, id: "Q2hhbn5lbDoyya", isActive: true, @@ -72,6 +78,7 @@ export const channelsList: Channels_channels[] = [ { __typename: "Channel", currencyCode: "euro", + shippingZones: [], hasOrders: false, id: "Q2hhbm5lbDo5w0z", isActive: true, @@ -83,6 +90,7 @@ export const channelsList: Channels_channels[] = [ export const channel: Channel_channel = { __typename: "Channel", currencyCode: "zl", + shippingZones: [], hasOrders: false, id: "Q2hhbm5lbDov78", isActive: true, diff --git a/src/channels/pages/ChannelDetailsPage/ChannelDetailsPage.stories.tsx b/src/channels/pages/ChannelDetailsPage/ChannelDetailsPage.stories.tsx index 16726830c..1b4cdb21c 100644 --- a/src/channels/pages/ChannelDetailsPage/ChannelDetailsPage.stories.tsx +++ b/src/channels/pages/ChannelDetailsPage/ChannelDetailsPage.stories.tsx @@ -18,7 +18,14 @@ const props: ChannelDetailsPageProps = { onBack: () => undefined, onSubmit: () => undefined, saveButtonBarState: "default", - updateChannelStatus: () => undefined + updateChannelStatus: () => undefined, + searchShippingZones: () => undefined, + searchShippingZonesData: undefined, + fetchMoreShippingZones: { + loading: false, + hasMore: false, + onFetchMore: () => undefined + } }; storiesOf("Views / Channels / Channel details", module) diff --git a/src/channels/pages/ChannelDetailsPage/ChannelDetailsPage.tsx b/src/channels/pages/ChannelDetailsPage/ChannelDetailsPage.tsx index 4a668a4e5..d1f1dcc24 100644 --- a/src/channels/pages/ChannelDetailsPage/ChannelDetailsPage.tsx +++ b/src/channels/pages/ChannelDetailsPage/ChannelDetailsPage.tsx @@ -1,15 +1,30 @@ +import ShippingZonesCard from "@saleor/channels/components/ShippingZonesCard/ShippingZonesCard"; +import CardSpacer from "@saleor/components/CardSpacer"; import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import Form from "@saleor/components/Form"; import Grid from "@saleor/components/Grid"; import SaveButtonBar from "@saleor/components/SaveButtonBar"; import { SingleAutocompleteChoiceType } from "@saleor/components/SingleAutocompleteSelectField"; import { ChannelErrorFragment } from "@saleor/fragments/types/ChannelErrorFragment"; +import { SearchData } from "@saleor/hooks/makeTopLevelSearch"; +import { getParsedSearchData } from "@saleor/hooks/makeTopLevelSearch/utils"; +import useStateFromProps from "@saleor/hooks/useStateFromProps"; +import { + getById, + getByUnmatchingId +} from "@saleor/orders/components/OrderReturnPage/utils"; +import { SearchShippingZones_search_edges_node } from "@saleor/searches/types/SearchShippingZones"; +import { FetchMoreProps } from "@saleor/types"; import createSingleAutocompleteSelectHandler from "@saleor/utils/handlers/singleAutocompleteSelectChangeHandler"; -import React from "react"; +import React, { useState } from "react"; import { ChannelForm, FormData } from "../../components/ChannelForm"; import { ChannelStatus } from "../../components/ChannelStatus/ChannelStatus"; -import { Channel_channel } from "../../types/Channel"; +import { + Channel_channel, + Channel_channel_shippingZones +} from "../../types/Channel"; +import { getUpdatedIdsWithNewId, getUpdatedIdsWithoutNewId } from "./utils"; export interface ChannelDetailsPageProps { channel?: Channel_channel; @@ -20,38 +35,97 @@ export interface ChannelDetailsPageProps { saveButtonBarState: ConfirmButtonTransitionState; onBack?: () => void; onDelete?: () => void; - onSubmit?: (data: FormData) => void; + onSubmit: (data: FormData) => void; updateChannelStatus?: () => void; + searchShippingZones: (query: string) => void; + searchShippingZonesData?: SearchData; + fetchMoreShippingZones: FetchMoreProps; } -const initialData: FormData = { - currencyCode: "", - name: "", - slug: "" -}; - export const ChannelDetailsPage: React.FC = ({ channel, currencyCodes, disabled, disabledStatus, + onSubmit, errors, onBack, - onSubmit, onDelete, saveButtonBarState, - updateChannelStatus + updateChannelStatus, + searchShippingZones, + searchShippingZonesData, + fetchMoreShippingZones }) => { - const [selectedCurrencyCode, setSelectedCurrencyCode] = React.useState(""); + const [selectedCurrencyCode, setSelectedCurrencyCode] = useState(""); + + const [shippingZonesToDisplay, setShippingZonesToDisplay] = useStateFromProps< + Channel_channel_shippingZones[] + >(channel?.shippingZones || []); + + const initialData: FormData = { + currencyCode: "", + name: "", + slug: "", + shippingZonesIdsToAdd: [], + shippingZonesIdsToRemove: [], + ...channel + }; + + const getFilteredShippingZonesChoices = (): SearchShippingZones_search_edges_node[] => + getParsedSearchData({ data: searchShippingZonesData }).filter( + ({ id: searchedZoneId }) => + !shippingZonesToDisplay.some(({ id }) => id === searchedZoneId) + ); return ( -
- {({ change, data, hasChanged, submit }) => { + + {({ change, data, hasChanged, submit, set }) => { const handleCurrencyCodeSelect = createSingleAutocompleteSelectHandler( change, setSelectedCurrencyCode, currencyCodes ); + + const addShippingZone = (zoneId: string) => { + set({ + ...data, + shippingZonesIdsToRemove: getUpdatedIdsWithoutNewId( + data.shippingZonesIdsToRemove, + zoneId + ), + shippingZonesIdsToAdd: getUpdatedIdsWithNewId( + data.shippingZonesIdsToAdd, + zoneId + ) + }); + + setShippingZonesToDisplay([ + ...shippingZonesToDisplay, + getParsedSearchData({ data: searchShippingZonesData }).find( + getById(zoneId) + ) + ]); + }; + + const removeShippingZone = (zoneId: string) => { + set({ + ...data, + shippingZonesIdsToAdd: getUpdatedIdsWithoutNewId( + data.shippingZonesIdsToAdd, + zoneId + ), + shippingZonesIdsToRemove: getUpdatedIdsWithNewId( + data.shippingZonesIdsToRemove, + zoneId + ) + }); + + setShippingZonesToDisplay( + shippingZonesToDisplay.filter(getByUnmatchingId(zoneId)) + ); + }; + const formDisabled = !data.name || !data.slug || !data.currencyCode; return ( @@ -68,15 +142,26 @@ export const ChannelDetailsPage: React.FC = ({ errors={errors} /> - {!!updateChannelStatus && ( -
- -
- )} +
+ {!!updateChannelStatus && ( + <> + + + + )} + +
+ uniq([...ids, newId]); + +export const getUpdatedIdsWithoutNewId = (ids: string[], newId: string) => + ids.filter(id => id !== newId); diff --git a/src/channels/types/Channel.ts b/src/channels/types/Channel.ts index eaebfe162..687cd95dd 100644 --- a/src/channels/types/Channel.ts +++ b/src/channels/types/Channel.ts @@ -7,6 +7,34 @@ // GraphQL query operation: Channel // ==================================================== +export interface Channel_channel_shippingZones_metadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface Channel_channel_shippingZones_privateMetadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface Channel_channel_shippingZones_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface Channel_channel_shippingZones { + __typename: "ShippingZone"; + metadata: (Channel_channel_shippingZones_metadata | null)[]; + privateMetadata: (Channel_channel_shippingZones_privateMetadata | null)[]; + id: string; + countries: (Channel_channel_shippingZones_countries | null)[] | null; + name: string; + description: string | null; +} + export interface Channel_channel { __typename: "Channel"; id: string; @@ -15,6 +43,7 @@ export interface Channel_channel { slug: string; currencyCode: string; hasOrders: boolean; + shippingZones: Channel_channel_shippingZones[]; } export interface Channel { diff --git a/src/channels/types/ChannelActivate.ts b/src/channels/types/ChannelActivate.ts index ec2c451fb..6ca7f2ede 100644 --- a/src/channels/types/ChannelActivate.ts +++ b/src/channels/types/ChannelActivate.ts @@ -9,6 +9,34 @@ import { ChannelErrorCode } from "./../../types/globalTypes"; // GraphQL mutation operation: ChannelActivate // ==================================================== +export interface ChannelActivate_channelActivate_channel_shippingZones_metadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface ChannelActivate_channelActivate_channel_shippingZones_privateMetadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface ChannelActivate_channelActivate_channel_shippingZones_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface ChannelActivate_channelActivate_channel_shippingZones { + __typename: "ShippingZone"; + metadata: (ChannelActivate_channelActivate_channel_shippingZones_metadata | null)[]; + privateMetadata: (ChannelActivate_channelActivate_channel_shippingZones_privateMetadata | null)[]; + id: string; + countries: (ChannelActivate_channelActivate_channel_shippingZones_countries | null)[] | null; + name: string; + description: string | null; +} + export interface ChannelActivate_channelActivate_channel { __typename: "Channel"; id: string; @@ -17,6 +45,7 @@ export interface ChannelActivate_channelActivate_channel { slug: string; currencyCode: string; hasOrders: boolean; + shippingZones: ChannelActivate_channelActivate_channel_shippingZones[]; } export interface ChannelActivate_channelActivate_errors { diff --git a/src/channels/types/ChannelCreate.ts b/src/channels/types/ChannelCreate.ts index bb6b70d1a..586027f78 100644 --- a/src/channels/types/ChannelCreate.ts +++ b/src/channels/types/ChannelCreate.ts @@ -9,6 +9,34 @@ import { ChannelCreateInput, ChannelErrorCode } from "./../../types/globalTypes" // GraphQL mutation operation: ChannelCreate // ==================================================== +export interface ChannelCreate_channelCreate_channel_shippingZones_metadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface ChannelCreate_channelCreate_channel_shippingZones_privateMetadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface ChannelCreate_channelCreate_channel_shippingZones_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface ChannelCreate_channelCreate_channel_shippingZones { + __typename: "ShippingZone"; + metadata: (ChannelCreate_channelCreate_channel_shippingZones_metadata | null)[]; + privateMetadata: (ChannelCreate_channelCreate_channel_shippingZones_privateMetadata | null)[]; + id: string; + countries: (ChannelCreate_channelCreate_channel_shippingZones_countries | null)[] | null; + name: string; + description: string | null; +} + export interface ChannelCreate_channelCreate_channel { __typename: "Channel"; id: string; @@ -17,6 +45,7 @@ export interface ChannelCreate_channelCreate_channel { slug: string; currencyCode: string; hasOrders: boolean; + shippingZones: ChannelCreate_channelCreate_channel_shippingZones[]; } export interface ChannelCreate_channelCreate_errors { diff --git a/src/channels/types/ChannelDeactivate.ts b/src/channels/types/ChannelDeactivate.ts index e99f790d7..e88185d06 100644 --- a/src/channels/types/ChannelDeactivate.ts +++ b/src/channels/types/ChannelDeactivate.ts @@ -9,6 +9,34 @@ import { ChannelErrorCode } from "./../../types/globalTypes"; // GraphQL mutation operation: ChannelDeactivate // ==================================================== +export interface ChannelDeactivate_channelDeactivate_channel_shippingZones_metadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface ChannelDeactivate_channelDeactivate_channel_shippingZones_privateMetadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface ChannelDeactivate_channelDeactivate_channel_shippingZones_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface ChannelDeactivate_channelDeactivate_channel_shippingZones { + __typename: "ShippingZone"; + metadata: (ChannelDeactivate_channelDeactivate_channel_shippingZones_metadata | null)[]; + privateMetadata: (ChannelDeactivate_channelDeactivate_channel_shippingZones_privateMetadata | null)[]; + id: string; + countries: (ChannelDeactivate_channelDeactivate_channel_shippingZones_countries | null)[] | null; + name: string; + description: string | null; +} + export interface ChannelDeactivate_channelDeactivate_channel { __typename: "Channel"; id: string; @@ -17,6 +45,7 @@ export interface ChannelDeactivate_channelDeactivate_channel { slug: string; currencyCode: string; hasOrders: boolean; + shippingZones: ChannelDeactivate_channelDeactivate_channel_shippingZones[]; } export interface ChannelDeactivate_channelDeactivate_errors { diff --git a/src/channels/types/ChannelUpdate.ts b/src/channels/types/ChannelUpdate.ts index 2380a32e9..febe5af80 100644 --- a/src/channels/types/ChannelUpdate.ts +++ b/src/channels/types/ChannelUpdate.ts @@ -9,6 +9,34 @@ import { ChannelUpdateInput, ChannelErrorCode } from "./../../types/globalTypes" // GraphQL mutation operation: ChannelUpdate // ==================================================== +export interface ChannelUpdate_channelUpdate_channel_shippingZones_metadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface ChannelUpdate_channelUpdate_channel_shippingZones_privateMetadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface ChannelUpdate_channelUpdate_channel_shippingZones_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface ChannelUpdate_channelUpdate_channel_shippingZones { + __typename: "ShippingZone"; + metadata: (ChannelUpdate_channelUpdate_channel_shippingZones_metadata | null)[]; + privateMetadata: (ChannelUpdate_channelUpdate_channel_shippingZones_privateMetadata | null)[]; + id: string; + countries: (ChannelUpdate_channelUpdate_channel_shippingZones_countries | null)[] | null; + name: string; + description: string | null; +} + export interface ChannelUpdate_channelUpdate_channel { __typename: "Channel"; id: string; @@ -17,6 +45,7 @@ export interface ChannelUpdate_channelUpdate_channel { slug: string; currencyCode: string; hasOrders: boolean; + shippingZones: ChannelUpdate_channelUpdate_channel_shippingZones[]; } export interface ChannelUpdate_channelUpdate_errors { diff --git a/src/channels/types/Channels.ts b/src/channels/types/Channels.ts index 4a6c2418c..c4283a016 100644 --- a/src/channels/types/Channels.ts +++ b/src/channels/types/Channels.ts @@ -7,6 +7,34 @@ // GraphQL query operation: Channels // ==================================================== +export interface Channels_channels_shippingZones_metadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface Channels_channels_shippingZones_privateMetadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface Channels_channels_shippingZones_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface Channels_channels_shippingZones { + __typename: "ShippingZone"; + metadata: (Channels_channels_shippingZones_metadata | null)[]; + privateMetadata: (Channels_channels_shippingZones_privateMetadata | null)[]; + id: string; + countries: (Channels_channels_shippingZones_countries | null)[] | null; + name: string; + description: string | null; +} + export interface Channels_channels { __typename: "Channel"; id: string; @@ -15,6 +43,7 @@ export interface Channels_channels { slug: string; currencyCode: string; hasOrders: boolean; + shippingZones: Channels_channels_shippingZones[]; } export interface Channels { diff --git a/src/channels/utils.ts b/src/channels/utils.ts index 120c1cd45..930d51d7b 100644 --- a/src/channels/utils.ts +++ b/src/channels/utils.ts @@ -3,9 +3,15 @@ import { CollectionDetails_collection } from "@saleor/collections/types/Collecti import { SaleDetails_sale } from "@saleor/discounts/types/SaleDetails"; import { VoucherDetails_voucher } from "@saleor/discounts/types/VoucherDetails"; import { RequireOnlyOne } from "@saleor/misc"; -import { ProductDetails_product } from "@saleor/products/types/ProductDetails"; +import { + ProductDetails_product, + ProductDetails_product_variants +} from "@saleor/products/types/ProductDetails"; import { ProductVariantDetails_productVariant } from "@saleor/products/types/ProductVariantDetails"; -import { ShippingZone_shippingZone_shippingMethods_channelListings } from "@saleor/shipping/types/ShippingZone"; +import { + ShippingZone_shippingZone_channels, + ShippingZone_shippingZone_shippingMethods_channelListings +} from "@saleor/shipping/types/ShippingZone"; import { mapNodeToChoice } from "@saleor/utils/maps"; import uniqBy from "lodash-es/uniqBy"; @@ -16,15 +22,16 @@ export interface Channel { export interface ChannelData { id: string; - isPublished: boolean; name: string; - publicationDate: string | null; - currency: string; - price: string; - costPrice: string; - availableForPurchase: string; - isAvailableForPurchase: boolean; - visibleInListings: boolean; + isPublished?: boolean; + publicationDate?: string | null; + currency?: string; + variantsIds?: string[]; + price?: string; + costPrice?: string; + availableForPurchase?: string; + isAvailableForPurchase?: boolean; + visibleInListings?: boolean; } export interface ChannelPriceData { @@ -95,21 +102,13 @@ export const createVariantChannels = ( data?: ProductVariantDetails_productVariant ): ChannelPriceData[] => { if (data) { - const productChannels = data?.product.channelListings.map(listing => ({ - costPrice: "", - currency: listing.channel.currencyCode, - id: listing.channel.id, - name: listing.channel.name, - price: "" - })); - const variantChannels = data?.channelListings.map(listing => ({ + return data?.channelListings.map(listing => ({ costPrice: listing.costPrice?.amount.toString() || "", currency: listing.channel.currencyCode, id: listing.channel.id, name: listing.channel.name, - price: listing.price.amount.toString() + price: listing.price?.amount?.toString() })); - return uniqBy([...variantChannels, ...productChannels], obj => obj.id); } return []; }; @@ -147,6 +146,7 @@ export const createChannelsData = (data?: Channels_channels[]): ChannelData[] => currency: channel.currencyCode, id: channel.id, isAvailableForPurchase: false, + variantsIds: [], isPublished: false, name: channel.name, price: "", @@ -168,7 +168,7 @@ export const createChannelsDataWithPrice = ( }; export const createShippingChannels = ( - data?: Channels_channels[] + data?: ShippingZone_shippingZone_channels[] ): ChannelShippingData[] => data?.map(channel => ({ currency: channel.currencyCode, @@ -240,29 +240,54 @@ export const createChannelsDataFromSale = (saleData?: SaleDetails_sale) => export const createChannelsDataFromProduct = ( productData?: ProductDetails_product ) => - productData?.channelListings?.map(option => { - const variantChannel = productData.variants[0]?.channelListings.find( - listing => listing.channel.id === option.channel.id - ); - const price = variantChannel?.price; - const costPrice = variantChannel?.costPrice; - return { - availableForPurchase: option?.availableForPurchase, - costPrice: costPrice ? costPrice.amount.toString() : "", - currency: price ? price.currency : "", - id: option.channel.id, - isAvailableForPurchase: !!option?.isAvailableForPurchase, - isPublished: option.isPublished, - name: option.channel.name, - price: price ? price.amount.toString() : "", - publicationDate: option.publicationDate, - visibleInListings: !!option.visibleInListings - }; - }) || []; + productData?.channelListings?.map( + ({ + channel, + availableForPurchase, + isAvailableForPurchase, + visibleInListings, + publicationDate, + isPublished + }) => { + const variantChannel = productData.variants[0]?.channelListings.find( + listing => listing.channel.id === channel.id + ); + const price = variantChannel?.price; + const costPrice = variantChannel?.costPrice; + const variantsIds = extractVariantsIdsForChannel( + productData.variants, + channel.id + ); + + return { + availableForPurchase, + isPublished, + publicationDate, + variantsIds, + costPrice: costPrice?.amount.toString() ?? "", + currency: price ? price.currency : "", + id: channel.id, + isAvailableForPurchase: !!isAvailableForPurchase, + name: channel.name, + price: price ? price.amount.toString() : "", + visibleInListings: !!visibleInListings + }; + } + ) || []; + +export const extractVariantsIdsForChannel = ( + productVariants: ProductDetails_product_variants[], + channelId: string +) => + productVariants + ?.filter(({ channelListings }) => + channelListings.some(({ channel }) => channel.id === channelId) + ) + .map(({ id }) => id) || []; export const createSortedChannelsDataFromProduct = ( productData?: ProductDetails_product -) => +): ChannelData[] => createChannelsDataFromProduct(productData).sort((channel, nextChannel) => channel.name.localeCompare(nextChannel.name) ); @@ -272,7 +297,9 @@ export const createSortedChannelsData = (data?: Channels_channels[]) => channel.name.localeCompare(nextChannel.name) ); -export const createSortedShippingChannels = (data?: Channels_channels[]) => +export const createSortedShippingChannels = ( + data?: ShippingZone_shippingZone_channels[] +) => createShippingChannels(data)?.sort((channel, nextChannel) => channel.name.localeCompare(nextChannel.name) ); diff --git a/src/channels/views/ChannelCreate/ChannelCreate.tsx b/src/channels/views/ChannelCreate/ChannelCreate.tsx index 24f89d2ca..e3cbf9d46 100644 --- a/src/channels/views/ChannelCreate/ChannelCreate.tsx +++ b/src/channels/views/ChannelCreate/ChannelCreate.tsx @@ -1,19 +1,22 @@ +import { FormData } from "@saleor/channels/components/ChannelForm/ChannelForm"; +import { ChannelCreate } from "@saleor/channels/types/ChannelCreate"; import AppHeader from "@saleor/components/AppHeader"; import Container from "@saleor/components/Container"; import PageHeader from "@saleor/components/PageHeader"; import { WindowTitle } from "@saleor/components/WindowTitle"; +import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config"; +import { getSearchFetchMoreProps } from "@saleor/hooks/makeTopLevelSearch/utils"; import useNavigator from "@saleor/hooks/useNavigator"; import useNotifier from "@saleor/hooks/useNotifier"; -import { commonMessages } from "@saleor/intl"; +import { getDefaultNotifierSuccessErrorData } from "@saleor/hooks/useNotifier/utils"; import { sectionNames } from "@saleor/intl"; +import useShippingZonesSearch from "@saleor/searches/useShippingZonesSearch"; import currencyCodes from "currency-codes"; import React from "react"; import { useIntl } from "react-intl"; -import { ChannelCreateInput } from "../../../types/globalTypes"; import { useChannelCreateMutation } from "../../mutations"; import ChannelDetailsPage from "../../pages/ChannelDetailsPage"; -import { ChannelCreate } from "../../types/ChannelCreate"; import { channelPath, channelsListUrl } from "../../urls"; export const ChannelCreateView = ({}) => { @@ -23,27 +26,40 @@ export const ChannelCreateView = ({}) => { const handleBack = () => navigate(channelsListUrl()); - const onSubmit = (data: ChannelCreate) => { - if (!data.channelCreate.errors.length) { - notify({ - status: "success", - text: intl.formatMessage(commonMessages.savedChanges) - }); - navigate(channelPath(data.channelCreate.channel.id)); - } - }; - const [createChannel, createChannelOpts] = useChannelCreateMutation({ - onCompleted: onSubmit + onCompleted: ({ channelCreate: { errors, channel } }: ChannelCreate) => { + notify(getDefaultNotifierSuccessErrorData(errors, intl)); + + if (!errors.length) { + navigate(channelPath(channel.id)); + } + } }); - const handleSubmit = (data: ChannelCreateInput) => + const handleSubmit = ({ + shippingZonesIdsToAdd, + shippingZonesIdsToRemove, + currencyCode, + ...rest + }: FormData) => createChannel({ variables: { - input: { ...data, currencyCode: data.currencyCode.toUpperCase() } + input: { + ...rest, + currencyCode: currencyCode.toUpperCase(), + addShippingZones: shippingZonesIdsToAdd + } } }); + const { + loadMore: fetchMoreShippingZones, + search: searchShippingZones, + result: searchShippingZonesResult + } = useShippingZonesSearch({ + variables: DEFAULT_INITIAL_SEARCH_DATA + }); + const currencyCodeChoices = currencyCodes.data.map(currencyData => ({ label: intl.formatMessage( { @@ -77,6 +93,12 @@ export const ChannelCreateView = ({}) => { })} /> = ({ ChannelUrlQueryParams >(navigate, params => channelUrl(id, params), params); - const onSubmit = (data: ChannelUpdate) => { - if (!data.channelUpdate.errors.length) { - notify({ - status: "success", - text: intl.formatMessage(commonMessages.savedChanges) - }); - } - }; + const [updateChannel, updateChannelOpts] = useChannelUpdateMutation({ + onCompleted: ({ channelUpdate: { errors } }: ChannelUpdate) => + notify(getDefaultNotifierSuccessErrorData(errors, intl)) + }); + + const { data, loading } = useChannelDetails({ + displayLoader: true, + variables: { id } + }); const handleError = (error: ChannelErrorFragment) => { notify({ @@ -70,15 +74,6 @@ export const ChannelDetails: React.FC = ({ }); }; - const { data, loading } = useChannelDetails({ - displayLoader: true, - variables: { id } - }); - - const [updateChannel, updateChannelOpts] = useChannelUpdateMutation({ - onCompleted: onSubmit - }); - const [activateChannel, activateChannelOpts] = useChannelActivateMutation({ onCompleted: data => { const errors = data.channelActivate.errors; @@ -100,15 +95,25 @@ export const ChannelDetails: React.FC = ({ } }); - const handleSubmit = (data: ChannelUpdateInput) => + const handleSubmit = ({ + name, + slug, + shippingZonesIdsToRemove, + shippingZonesIdsToAdd + }: FormData) => updateChannel({ variables: { - id, - input: { name: data.name, slug: data.slug } + id: data?.channel.id, + input: { + name, + slug, + addShippingZones: shippingZonesIdsToAdd, + removeShippingZones: shippingZonesIdsToRemove + } } }); - const onCompleted = (data: ChannelDelete) => { + const onDeleteCompleted = (data: ChannelDelete) => { const errors = data.channelDelete.errors; if (errors.length === 0) { notify({ @@ -130,7 +135,7 @@ export const ChannelDetails: React.FC = ({ }; const [deleteChannel, deleteChannelOpts] = useChannelDeleteMutation({ - onCompleted + onCompleted: onDeleteCompleted }); const channelsChoices = getChannelsCurrencyChoices( @@ -146,6 +151,14 @@ export const ChannelDetails: React.FC = ({ deleteChannel({ variables: data }); }; + const { + loadMore: fetchMoreShippingZones, + search: searchShippingZones, + result: searchShippingZonesResult + } = useShippingZonesSearch({ + variables: DEFAULT_INITIAL_SEARCH_DATA + }); + return ( <> = ({ openModal("remove")} + onSubmit={handleSubmit} updateChannelStatus={() => data?.channel?.isActive ? deactivateChannel({ variables: { id } }) diff --git a/src/collections/components/CollectionCreatePage/CollectionCreatePage.tsx b/src/collections/components/CollectionCreatePage/CollectionCreatePage.tsx index 1c344628d..e9a2bac00 100644 --- a/src/collections/components/CollectionCreatePage/CollectionCreatePage.tsx +++ b/src/collections/components/CollectionCreatePage/CollectionCreatePage.tsx @@ -1,7 +1,7 @@ import { ChannelCollectionData } from "@saleor/channels/utils"; import AppHeader from "@saleor/components/AppHeader"; -import { AvailabilityCard } from "@saleor/components/AvailabilityCard"; import { CardSpacer } from "@saleor/components/CardSpacer"; +import ChannelsAvailabilityCard from "@saleor/components/ChannelsAvailabilityCard"; import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import { Container } from "@saleor/components/Container"; import Grid from "@saleor/components/Grid"; @@ -129,7 +129,7 @@ const CollectionCreatePage: React.FC = ({
- = ({
- undefined, - openModal: () => undefined, - selectedChannelsCount: 3 -}; - -storiesOf("Generics / AvailabilityCard", module) - .addDecorator(Decorator) - .add("default", () => ); diff --git a/src/components/AvailabilityCard/AvailabilityCard.tsx b/src/components/AvailabilityCard/AvailabilityCard.tsx deleted file mode 100644 index fa325a342..000000000 --- a/src/components/AvailabilityCard/AvailabilityCard.tsx +++ /dev/null @@ -1,94 +0,0 @@ -import ChannelsAvailability, { - ChannelsAvailabilityProps, - Message -} from "@saleor/components/ChannelsAvailability"; -import useDateLocalize from "@saleor/hooks/useDateLocalize"; -import React from "react"; -import { useIntl } from "react-intl"; - -interface AvailabilityCardProps { - messages: Message; -} - -export const AvailabilityCard: React.FC> = props => { - const intl = useIntl(); - const localizeDate = useDateLocalize(); - - return ( - ({ - ...prevVal, - [currVal.id]: { - ...props.messages, - availableDateText: - currVal.publicationDate && !currVal.isPublished - ? intl.formatMessage( - { - defaultMessage: "Will become available on {date}", - description: "channel publication date" - }, - { - date: localizeDate(currVal.publicationDate, "L") - } - ) - : currVal.publicationDate - ? intl.formatMessage( - { - defaultMessage: "Visible since {date}", - description: "channel publication date" - }, - { - date: localizeDate(currVal.publicationDate, "L") - } - ) - : currVal.isPublished - ? intl.formatMessage({ - defaultMessage: "Visible", - description: "channel publication status" - }) - : intl.formatMessage({ - defaultMessage: "Hidden", - description: "channel publication status" - }), - availableLabel: intl.formatMessage({ - defaultMessage: "Available for purchase", - description: "product availability" - }), - availableSecondLabel: intl.formatMessage( - { - defaultMessage: "will become available on {date}", - description: "product available for purchase date" - }, - { - date: localizeDate(currVal.availableForPurchase, "L") - } - ), - hiddenSecondLabel: intl.formatMessage( - { - defaultMessage: "will become published on {date}", - description: "product publication date label" - }, - { - date: localizeDate(currVal.publicationDate, "L") - } - ), - setAvailabilityDateLabel: intl.formatMessage({ - defaultMessage: "Set availability date", - description: "product availability date label" - }), - unavailableLabel: intl.formatMessage({ - defaultMessage: "Unavailable for purchase", - description: "product unavailability" - }) - } - }), - {} - )} - /> - ); -}; - -export default AvailabilityCard; diff --git a/src/components/AvailabilityCard/index.ts b/src/components/AvailabilityCard/index.ts deleted file mode 100644 index f50012021..000000000 --- a/src/components/AvailabilityCard/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./AvailabilityCard"; -export { default } from "./AvailabilityCard"; diff --git a/src/components/ChannelsAvailability/ChannelsAvailability.tsx b/src/components/ChannelsAvailability/ChannelsAvailability.tsx deleted file mode 100644 index b2f36976d..000000000 --- a/src/components/ChannelsAvailability/ChannelsAvailability.tsx +++ /dev/null @@ -1,475 +0,0 @@ -import Button from "@material-ui/core/Button"; -import Card from "@material-ui/core/Card"; -import CardContent from "@material-ui/core/CardContent"; -import TextField from "@material-ui/core/TextField"; -import Typography from "@material-ui/core/Typography"; -import { Channel as ChannelList } from "@saleor/channels/utils"; -import CardTitle from "@saleor/components/CardTitle"; -import ControlledCheckbox from "@saleor/components/ControlledCheckbox"; -import Hr from "@saleor/components/Hr"; -import RadioSwitchField from "@saleor/components/RadioSwitchField"; -import RequirePermissions from "@saleor/components/RequirePermissions"; -import { CollectionChannelListingErrorFragment } from "@saleor/fragments/types/CollectionChannelListingErrorFragment"; -import { ProductChannelListingErrorFragment } from "@saleor/fragments/types/ProductChannelListingErrorFragment"; -import useDateLocalize from "@saleor/hooks/useDateLocalize"; -import useUser from "@saleor/hooks/useUser"; -import ArrowDropdown from "@saleor/icons/ArrowDropdown"; -import { RequireOnlyOne } from "@saleor/misc"; -import { PermissionEnum } from "@saleor/types/globalTypes"; -import { getFormErrors, getProductErrorMessage } from "@saleor/utils/errors"; -import classNames from "classnames"; -import React, { useState } from "react"; -import { useIntl } from "react-intl"; - -import { DateContext } from "../Date/DateContext"; -import { useStyles } from "./styles"; - -export interface ChannelData { - id: string; - isPublished: boolean; - name: string; - publicationDate: string | null; - availableForPurchase?: string; - isAvailableForPurchase?: boolean; - visibleInListings?: boolean; -} - -export interface Message { - visibleLabel: string; - hiddenLabel: string; - visibleSecondLabel?: string; - hiddenSecondLabel?: string; - availableDateText?: string; - availableLabel?: string; - unavailableLabel?: string; - availableSecondLabel?: string; - setAvailabilityDateLabel?: string; -} - -type Error = - | ProductChannelListingErrorFragment - | CollectionChannelListingErrorFragment; - -interface Value { - availableForPurchase?: string; - isAvailableForPurchase?: boolean; - isPublished: boolean; - publicationDate: string | null; - visibleInListings?: boolean; -} -interface ChannelsAvailability { - channels: ChannelData[]; - channelsList: ChannelList[]; - channelsMessages?: { [id: string]: Message }; - errors?: Error[]; - selectedChannelsCount: number; - allChannelsCount: number; - disabled?: boolean; - onChange?: (id: string, data: Value) => void; - openModal: () => void; -} -export type ChannelsAvailabilityProps = RequireOnlyOne< - ChannelsAvailability, - "channels" | "channelsList" ->; - -interface ChannelProps { - disabled?: boolean; - data: ChannelData; - errors: Error[]; - messages: Message; - onChange: (id: string, data: Value) => void; -} - -const Channel: React.FC = ({ - data, - disabled, - errors, - messages, - onChange -}) => { - const { - availableForPurchase, - isAvailableForPurchase: isAvailable, - isPublished, - publicationDate, - visibleInListings, - id, - name - } = data; - const formData = { - ...(availableForPurchase !== undefined ? { availableForPurchase } : {}), - ...(isAvailable !== undefined - ? { isAvailableForPurchase: isAvailable } - : {}), - isPublished, - publicationDate, - ...(visibleInListings !== undefined ? { visibleInListings } : {}) - }; - const dateNow = React.useContext(DateContext); - const localizeDate = useDateLocalize(); - const hasAvailableProps = - isAvailable !== undefined && availableForPurchase !== undefined; - - const [isPublicationDate, setPublicationDate] = useState( - publicationDate === null ? true : false - ); - const [isAvailableDate, setAvailableDate] = useState(false); - const [isOpen, setOpen] = useState(false); - const intl = useIntl(); - const classes = useStyles({}); - - const todayDate = localizeDate(new Date(dateNow).toISOString(), "YYYY-MM-DD"); - - const visibleMessage = (date: string) => - intl.formatMessage( - { - defaultMessage: "since {date}", - description: "date" - }, - { - date: localizeDate(date, "L") - } - ); - - const formErrors = getFormErrors( - ["availableForPurchaseDate", "publicationDate"], - errors - ); - - return ( - <> -
-
setOpen(open => !open)} - > -
- {name} - -
- - {messages.availableDateText} - -
- {isOpen && ( - <> - -

{messages.visibleLabel}

- {isPublished && - publicationDate && - Date.parse(publicationDate) < dateNow && ( - - {messages.visibleSecondLabel || - visibleMessage(publicationDate)} - - )} - - } - name="isPublished" - secondOptionLabel={ - <> -

{messages.hiddenLabel}

- {publicationDate && - !isPublished && - Date.parse(publicationDate) >= dateNow && ( - - {messages.hiddenSecondLabel} - - )} - - } - value={isPublished} - onChange={() => { - onChange(id, { - ...formData, - isPublished: !isPublished, - publicationDate: - !isPublished && !publicationDate - ? todayDate - : publicationDate - }); - }} - /> - {!isPublished && ( - <> - setPublicationDate(!isPublicationDate)} - > - {intl.formatMessage({ - defaultMessage: "Set publication date" - })} - - {isPublicationDate && ( - - onChange(id, { - ...formData, - publicationDate: e.target.value || null - }) - } - className={classes.date} - InputLabelProps={{ - shrink: true - }} - /> - )} - - )} - {hasAvailableProps && ( - <> -
- -

{messages.availableLabel}

- {isAvailable && - availableForPurchase && - Date.parse(availableForPurchase) < dateNow && ( - - {visibleMessage(availableForPurchase)} - - )} - - } - name={`channel:isAvailableForPurchase:${id}`} - secondOptionLabel={ - <> -

- {messages.unavailableLabel} -

- {availableForPurchase && !isAvailable && ( - - {messages.availableSecondLabel} - - )} - - } - value={isAvailable} - onChange={e => { - const { value } = e.target; - return onChange(id, { - ...formData, - availableForPurchase: !value - ? null - : availableForPurchase, - isAvailableForPurchase: value - }); - }} - /> - {!isAvailable && ( - <> - setAvailableDate(!isAvailableDate)} - > - {messages.setAvailabilityDateLabel} - - {isAvailableDate && ( - - onChange(id, { - ...formData, - availableForPurchase: e.target.value - }) - } - className={classes.date} - InputLabelProps={{ - shrink: true - }} - /> - )} - - )} - - )} - {visibleInListings !== undefined && ( - <> -
- -

- {intl.formatMessage({ - defaultMessage: "Show in product listings" - })} -

- - - {intl.formatMessage({ - defaultMessage: - "Disabling this checkbox will remove product from search and category pages. It will be available on collection pages." - })} - - - } - onChange={e => - onChange(id, { - ...formData, - visibleInListings: e.target.value - }) - } - /> - - )} - - )} -
-
- - ); -}; - -export const ChannelsAvailability: React.FC = props => { - const { - channelsList, - errors = [], - selectedChannelsCount, - allChannelsCount, - channels, - channelsMessages, - openModal, - onChange - } = props; - const intl = useIntl(); - const classes = useStyles({}); - const { user } = useUser(); - const channelsAvailabilityText = intl.formatMessage( - { - defaultMessage: - "Available at {selectedChannelsCount} out of {allChannelsCount, plural, one {# channel} other {# channels}}", - - description: "channels availability text" - }, - { - allChannelsCount, - selectedChannelsCount - } - ); - - return ( - <> - - - - - } - /> - - {!!channelsAvailabilityText && ( - <> - - {channelsAvailabilityText} - -
- - )} - {channels - ? channels.map(data => { - const channelErrors = - errors?.filter(error => error.channels.includes(data.id)) || - []; - return ( - - ); - }) - : channelsList - ? channelsList.map(data => ( - -
-
- {data.name} -
-
-
-
- )) - : null} -
-
- - ); -}; -ChannelsAvailability.displayName = "ChannelsAvailability"; -export default ChannelsAvailability; diff --git a/src/components/ChannelsAvailability/index.ts b/src/components/ChannelsAvailability/index.ts deleted file mode 100644 index b59832015..000000000 --- a/src/components/ChannelsAvailability/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./ChannelsAvailability"; -export { default } from "./ChannelsAvailability"; diff --git a/src/components/ChannelsAvailabilityCard/Channel/ChannelAvailabilityItemContent.tsx b/src/components/ChannelsAvailabilityCard/Channel/ChannelAvailabilityItemContent.tsx new file mode 100644 index 000000000..b6903368e --- /dev/null +++ b/src/components/ChannelsAvailabilityCard/Channel/ChannelAvailabilityItemContent.tsx @@ -0,0 +1,274 @@ +import TextField from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import { ChannelData } from "@saleor/channels/utils"; +import ControlledCheckbox from "@saleor/components/ControlledCheckbox"; +import Hr from "@saleor/components/Hr"; +import RadioSwitchField from "@saleor/components/RadioSwitchField"; +import useDateLocalize from "@saleor/hooks/useDateLocalize"; +import { getFormErrors, getProductErrorMessage } from "@saleor/utils/errors"; +import classNames from "classnames"; +import React, { useState } from "react"; +import { useIntl } from "react-intl"; + +import { DateContext } from "../../Date/DateContext"; +import { useStyles } from "../styles"; +import { ChannelOpts, ChannelsAvailabilityError, Messages } from "../types"; +export interface ChannelContentProps { + disabled?: boolean; + data: ChannelData; + errors: ChannelsAvailabilityError[]; + messages: Messages; + onChange: (id: string, data: ChannelOpts) => void; +} +const ChannelContent: React.FC = ({ + data, + disabled, + errors, + messages, + onChange +}) => { + const { + availableForPurchase, + isAvailableForPurchase: isAvailable, + isPublished, + publicationDate, + visibleInListings, + id + } = data; + const formData = { + ...(availableForPurchase !== undefined ? { availableForPurchase } : {}), + ...(isAvailable !== undefined + ? { isAvailableForPurchase: isAvailable } + : {}), + isPublished, + publicationDate, + ...(visibleInListings !== undefined ? { visibleInListings } : {}) + }; + const dateNow = React.useContext(DateContext); + const localizeDate = useDateLocalize(); + const hasAvailableProps = + isAvailable !== undefined && availableForPurchase !== undefined; + const [isPublicationDate, setPublicationDate] = useState( + publicationDate === null + ); + const [isAvailableDate, setAvailableDate] = useState(false); + const intl = useIntl(); + const classes = useStyles({}); + + const todayDate = localizeDate(new Date(dateNow).toISOString(), "YYYY-MM-DD"); + + const visibleMessage = (date: string) => + intl.formatMessage( + { + defaultMessage: "since {date}", + description: "date" + }, + { + date: localizeDate(date, "L") + } + ); + const formErrors = getFormErrors( + ["availableForPurchaseDate", "publicationDate"], + errors + ); + return ( +
+ +

{messages.visibleLabel}

+ {isPublished && + publicationDate && + Date.parse(publicationDate) < dateNow && ( + + {messages.visibleSecondLabel || + visibleMessage(publicationDate)} + + )} + + } + name="isPublished" + secondOptionLabel={ + <> +

{messages.hiddenLabel}

+ {publicationDate && + !isPublished && + Date.parse(publicationDate) >= dateNow && ( + + {messages.hiddenSecondLabel} + + )} + + } + value={isPublished} + onChange={() => { + onChange(id, { + ...formData, + isPublished: !isPublished, + publicationDate: + !isPublished && !publicationDate ? todayDate : publicationDate + }); + }} + /> + {!isPublished && ( + <> + setPublicationDate(!isPublicationDate)} + > + {intl.formatMessage({ + defaultMessage: "Set publication date" + })} + + {isPublicationDate && ( + + onChange(id, { + ...formData, + publicationDate: e.target.value || null + }) + } + className={classes.date} + InputLabelProps={{ + shrink: true + }} + /> + )} + + )} + {hasAvailableProps && ( + <> +
+ +

{messages.availableLabel}

+ {isAvailable && + availableForPurchase && + Date.parse(availableForPurchase) < dateNow && ( + + {visibleMessage(availableForPurchase)} + + )} + + } + name={`channel:isAvailableForPurchase:${id}`} + secondOptionLabel={ + <> +

{messages.unavailableLabel}

+ {availableForPurchase && !isAvailable && ( + + {messages.availableSecondLabel} + + )} + + } + value={isAvailable} + onChange={e => { + const { value } = e.target; + return onChange(id, { + ...formData, + availableForPurchase: !value ? null : availableForPurchase, + isAvailableForPurchase: value + }); + }} + /> + {!isAvailable && ( + <> + setAvailableDate(!isAvailableDate)} + > + {messages.setAvailabilityDateLabel} + + {isAvailableDate && ( + + onChange(id, { + ...formData, + availableForPurchase: e.target.value + }) + } + className={classes.date} + InputLabelProps={{ + shrink: true + }} + /> + )} + + )} + + )} + {visibleInListings !== undefined && ( + <> +
+ +

+ {intl.formatMessage({ + defaultMessage: "Show in product listings" + })} +

+ + {intl.formatMessage({ + defaultMessage: + "Disabling this checkbox will remove product from search and category pages. It will be available on collection pages." + })} + + + } + onChange={e => + onChange(id, { + ...formData, + visibleInListings: e.target.value + }) + } + /> + + )} +
+ ); +}; +export default ChannelContent; diff --git a/src/components/ChannelsAvailabilityCard/Channel/ChannelAvailabilityItemWrapper.tsx b/src/components/ChannelsAvailabilityCard/Channel/ChannelAvailabilityItemWrapper.tsx new file mode 100644 index 000000000..7d6150611 --- /dev/null +++ b/src/components/ChannelsAvailabilityCard/Channel/ChannelAvailabilityItemWrapper.tsx @@ -0,0 +1,95 @@ +import { + ExpansionPanel, + ExpansionPanelSummary, + makeStyles +} from "@material-ui/core"; +import Typography from "@material-ui/core/Typography"; +import { ChannelData } from "@saleor/channels/utils"; +import IconChevronDown from "@saleor/icons/ChevronDown"; +import React from "react"; + +import { Messages } from "../types"; + +const useExpanderStyles = makeStyles( + theme => ({ + expanded: {}, + root: { + boxShadow: "none", + margin: 0, + padding: 0, + paddingBottom: theme.spacing(2), + + "&:before": { + content: "none" + }, + + "&$expanded": { + margin: 0, + border: "none" + } + } + }), + { name: "ChannelContentWrapperExpander" } +); + +const useSummaryStyles = makeStyles( + theme => ({ + expanded: {}, + root: { + width: "100%", + border: "none", + margin: 0, + padding: 0, + minHeight: 0, + paddingTop: theme.spacing(2), + + "&$expanded": { + minHeight: 0, + padding: theme.spacing(2, 0) + } + }, + content: { + margin: 0, + + "&$expanded": { + margin: 0 + } + } + }), + { name: "ChannelContentWrapperExpanderSummary" } +); + +export interface ChannelContentWrapperProps { + data: ChannelData; + children: React.ReactNode; + messages: Messages; +} + +const ChannelContentWrapper: React.FC = ({ + data, + messages, + children +}) => { + const expanderClasses = useExpanderStyles({}); + const summaryClasses = useSummaryStyles({}); + + const { name } = data; + + return ( + + } + classes={summaryClasses} + > + {name} + {messages.availableDateText} + + {children} + + ); +}; + +export default ChannelContentWrapper; diff --git a/src/components/ChannelsAvailability/ChannelsAvailability.stories.tsx b/src/components/ChannelsAvailabilityCard/ChannelsAvailabilityCard.stories.tsx similarity index 78% rename from src/components/ChannelsAvailability/ChannelsAvailability.stories.tsx rename to src/components/ChannelsAvailabilityCard/ChannelsAvailabilityCard.stories.tsx index 262d18eaa..3dcd6a02e 100644 --- a/src/components/ChannelsAvailability/ChannelsAvailability.stories.tsx +++ b/src/components/ChannelsAvailabilityCard/ChannelsAvailabilityCard.stories.tsx @@ -7,9 +7,10 @@ import { PermissionEnum } from "@saleor/types/globalTypes"; import { storiesOf } from "@storybook/react"; import React from "react"; -import ChannelsAvailability, { - ChannelsAvailabilityProps -} from "./ChannelsAvailability"; +import ChannelsAvailabilityCard, { + ChannelsAvailabilityCardProps +} from "./ChannelsAvailabilityCard"; +import { Messages } from "./types"; const user: User = { __typename: "User", @@ -30,7 +31,7 @@ const user: User = { const productChannels = createChannelsDataFromProduct(product("")); -const props: ChannelsAvailabilityProps = { +const props: ChannelsAvailabilityCardProps = { allChannelsCount: 4, channelsList: productChannels.map(channel => ({ id: channel.id, @@ -42,16 +43,16 @@ const props: ChannelsAvailabilityProps = { selectedChannelsCount: 3 }; -storiesOf("Generics / ChannelsAvailability", module) +storiesOf("Generics / Channels availability card", module) .addDecorator(Decorator) .addDecorator(UserDecorator(user)) - .add("default", () => ) + .add("default", () => ) .add("with onChange", () => ( - ({ ...prevVal, [currVal.id]: { @@ -60,7 +61,7 @@ storiesOf("Generics / ChannelsAvailability", module) hiddenSecondLabel: "Will become published" } }), - {} + {} as Messages )} /> )); diff --git a/src/components/ChannelsAvailabilityCard/ChannelsAvailabilityCard.tsx b/src/components/ChannelsAvailabilityCard/ChannelsAvailabilityCard.tsx new file mode 100644 index 000000000..86e00f9fa --- /dev/null +++ b/src/components/ChannelsAvailabilityCard/ChannelsAvailabilityCard.tsx @@ -0,0 +1,93 @@ +import Typography from "@material-ui/core/Typography"; +import { Channel as ChannelList, ChannelData } from "@saleor/channels/utils"; +import Hr from "@saleor/components/Hr"; +import useDateLocalize from "@saleor/hooks/useDateLocalize"; +import { RequireOnlyOne } from "@saleor/misc"; +import React from "react"; +import { useIntl } from "react-intl"; + +import ChannelAvailabilityItemContent from "./Channel/ChannelAvailabilityItemContent"; +import ChannelAvailabilityItemWrapper from "./Channel/ChannelAvailabilityItemWrapper"; +import ChannelsAvailabilityCardWrapper, { + ChannelsAvailabilityWrapperProps +} from "./ChannelsAvailabilityCardWrapper"; +import { useStyles } from "./styles"; +import { ChannelOpts, ChannelsAvailabilityError, Messages } from "./types"; +import { getChannelsAvailabilityMessages } from "./utils"; + +export interface ChannelsAvailability + extends Omit { + channels: ChannelData[]; + channelsList: ChannelList[]; + errors?: ChannelsAvailabilityError[]; + disabled?: boolean; + messages?: Messages; + onChange?: (id: string, data: ChannelOpts) => void; +} + +export type ChannelsAvailabilityCardProps = RequireOnlyOne< + ChannelsAvailability, + "channels" | "channelsList" +>; + +export const ChannelsAvailability: React.FC = props => { + const { + channelsList, + errors = [], + selectedChannelsCount = 0, + allChannelsCount = 0, + channels, + messages, + onChange, + openModal + } = props; + const intl = useIntl(); + const localizeDate = useDateLocalize(); + const classes = useStyles({}); + + const channelsMessages = getChannelsAvailabilityMessages({ + messages, + channels, + intl, + localizeDate + }); + + return ( + + {channels + ? channels.map(data => { + const channelErrors = + errors?.filter(error => error.channels.includes(data.id)) || []; + + return ( + + + + ); + }) + : channelsList + ? channelsList.map(data => ( + +
+
+ {data.name} +
+
+
+
+ )) + : null} +
+ ); +}; + +export default ChannelsAvailability; diff --git a/src/components/ChannelsAvailabilityCard/ChannelsAvailabilityCardWrapper.tsx b/src/components/ChannelsAvailabilityCard/ChannelsAvailabilityCardWrapper.tsx new file mode 100644 index 000000000..1436d598e --- /dev/null +++ b/src/components/ChannelsAvailabilityCard/ChannelsAvailabilityCardWrapper.tsx @@ -0,0 +1,87 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import Typography from "@material-ui/core/Typography"; +import CardTitle from "@saleor/components/CardTitle"; +import Hr from "@saleor/components/Hr"; +import RequirePermissions from "@saleor/components/RequirePermissions"; +import useUser from "@saleor/hooks/useUser"; +import { PermissionEnum } from "@saleor/types/globalTypes"; +import React from "react"; +import { useIntl } from "react-intl"; + +import { useStyles } from "./styles"; + +export interface ChannelsAvailabilityWrapperProps { + selectedChannelsCount: number; + allChannelsCount: number; + openModal: () => void; + children: React.ReactNode; +} + +export const ChannelsAvailabilityWrapper: React.FC = props => { + const { + selectedChannelsCount, + allChannelsCount, + openModal, + children + } = props; + const intl = useIntl(); + const classes = useStyles({}); + const { user } = useUser(); + const channelsAvailabilityText = intl.formatMessage( + { + defaultMessage: + "Available at {selectedChannelsCount} out of {allChannelsCount, plural, one {# channel} other {# channels}}", + + description: "channels availability text" + }, + { + allChannelsCount, + selectedChannelsCount + } + ); + + return ( + <> + + + + + } + /> + + {!!channelsAvailabilityText && ( + <> + + {channelsAvailabilityText} + +
+ + )} + {children} +
+
+ + ); +}; + +export default ChannelsAvailabilityWrapper; diff --git a/src/components/ChannelsAvailabilityCard/index.ts b/src/components/ChannelsAvailabilityCard/index.ts new file mode 100644 index 000000000..18b192222 --- /dev/null +++ b/src/components/ChannelsAvailabilityCard/index.ts @@ -0,0 +1,2 @@ +export * from "./ChannelsAvailabilityCard"; +export { default } from "./ChannelsAvailabilityCard"; diff --git a/src/components/ChannelsAvailabilityCard/styles.ts b/src/components/ChannelsAvailabilityCard/styles.ts new file mode 100644 index 000000000..e07503248 --- /dev/null +++ b/src/components/ChannelsAvailabilityCard/styles.ts @@ -0,0 +1,85 @@ +import { makeStyles } from "@material-ui/core/styles"; + +export const useStyles = makeStyles( + theme => ({ + container: { + marginTop: theme.spacing(1), + marginBottom: theme.spacing(1) + }, + radioField: { + paddingLeft: theme.spacing(1) + }, + arrow: { + transition: theme.transitions.duration.short + "ms" + }, + card: { + "&:last-child": { + paddingBottom: 0 + }, + paddingTop: 0 + }, + channelBtn: { + "&:focus": { + outline: "none" + }, + background: "transparent", + border: "none", + cursor: "pointer", + textAlign: "left" + }, + channelInfo: { + fontSize: 14, + padding: theme.spacing(2, 0) + }, + channelItem: { + "&:last-child hr": { + display: "none" + }, + padding: theme.spacing(2, 0) + }, + channelName: { + alignItems: "center", + display: "flex", + justifyContent: "space-between", + marginBottom: theme.spacing(0.5) + }, + checkbox: { + alignItems: "flex-start", + marginTop: 10 + }, + date: { + "& svg": { + fill: theme.palette.primary.main + }, + marginTop: theme.spacing(1) + }, + hr: { + left: theme.spacing(-3), + position: "relative", + width: `calc(100% + ${theme.spacing(6)}px)` + }, + label: { + lineHeight: 1.2, + marginBottom: 5, + marginTop: 0 + }, + listingLabel: { + marginTop: 9 + }, + rotate: { + transform: "rotate(180deg)" + }, + secondLabel: { + color: theme.palette.text.hint, + fontSize: 12 + }, + setPublicationDate: { + color: theme.palette.primary.main, + cursor: "pointer", + fontSize: 14, + paddingBottom: 10, + paddingTop: 0 + } + }), + { name: "ChannelsAvailabilityCard" } +); diff --git a/src/components/ChannelsAvailabilityCard/types.tsx b/src/components/ChannelsAvailabilityCard/types.tsx new file mode 100644 index 000000000..dc82443a2 --- /dev/null +++ b/src/components/ChannelsAvailabilityCard/types.tsx @@ -0,0 +1,26 @@ +import { CollectionChannelListingErrorFragment } from "@saleor/fragments/types/CollectionChannelListingErrorFragment"; +import { ProductChannelListingErrorFragment } from "@saleor/fragments/types/ProductChannelListingErrorFragment"; + +export interface ChannelOpts { + availableForPurchase?: string; + isAvailableForPurchase?: boolean; + isPublished: boolean; + publicationDate: string | null; + visibleInListings?: boolean; +} + +export interface Messages { + visibleLabel: string; + hiddenLabel: string; + visibleSecondLabel?: string; + hiddenSecondLabel?: string; + availableDateText?: string; + availableLabel?: string; + unavailableLabel?: string; + availableSecondLabel?: string; + setAvailabilityDateLabel?: string; +} + +export type ChannelsAvailabilityError = + | ProductChannelListingErrorFragment + | CollectionChannelListingErrorFragment; diff --git a/src/components/ChannelsAvailabilityCard/utils.ts b/src/components/ChannelsAvailabilityCard/utils.ts new file mode 100644 index 000000000..e86f9e7bf --- /dev/null +++ b/src/components/ChannelsAvailabilityCard/utils.ts @@ -0,0 +1,95 @@ +import { ChannelData } from "@saleor/channels/utils"; +import { LocalizeDate } from "@saleor/hooks/useDateLocalize"; +import { IntlShape } from "react-intl"; + +import { Messages } from "./types"; + +export const getChannelsAvailabilityMessages = ({ + messages, + channels = [], + intl, + localizeDate +}: { + messages?: Messages; + channels?: ChannelData[]; + intl: IntlShape; + localizeDate: LocalizeDate; +}): Messages => + channels.reduce( + (prevVal, currVal) => ({ + ...prevVal, + [currVal.id]: { + ...messages, + availableDateText: + currVal.publicationDate && !currVal.isPublished + ? intl.formatMessage( + { + defaultMessage: "Will become available on {date}", + description: "channel publication date", + id: "channel publication date will become available" + }, + { + date: localizeDate(currVal.publicationDate, "L") + } + ) + : currVal.publicationDate + ? intl.formatMessage( + { + defaultMessage: "Visible since {date}", + description: "channel publication date", + id: "channel publication date visible since" + }, + { + date: localizeDate(currVal.publicationDate, "L") + } + ) + : currVal.isPublished + ? intl.formatMessage({ + defaultMessage: "Visible", + description: "channel publication status", + id: "channel visible" + }) + : intl.formatMessage({ + defaultMessage: "Hidden", + description: "channel publication status", + id: "channel hidden" + }), + availableLabel: intl.formatMessage({ + defaultMessage: "Available for purchase", + description: "product availability", + id: "product available for purchase" + }), + availableSecondLabel: intl.formatMessage( + { + defaultMessage: "will become available on {date}", + description: "product available for purchase date", + id: "will become available on" + }, + { + date: localizeDate(currVal.availableForPurchase, "L") + } + ), + hiddenSecondLabel: intl.formatMessage( + { + defaultMessage: "will become published on {date}", + description: "product publication date label", + id: "will become published on" + }, + { + date: localizeDate(currVal.publicationDate, "L") + } + ), + setAvailabilityDateLabel: intl.formatMessage({ + defaultMessage: "Set availability date", + description: "product availability date label", + id: "set availability date" + }), + unavailableLabel: intl.formatMessage({ + defaultMessage: "Unavailable for purchase", + description: "product unavailability", + id: "unavailable for purchase" + }) + } + }), + {} as Messages + ); diff --git a/src/components/ChannelsAvailabilityContent/index.ts b/src/components/ChannelsAvailabilityContent/index.ts deleted file mode 100644 index 2ca745b1f..000000000 --- a/src/components/ChannelsAvailabilityContent/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export * from "./ChannelsAvailabilityContent"; -export { default } from "./ChannelsAvailabilityContent"; diff --git a/src/components/ChannelsAvailabilityDialog/ChannelsAvailabilityDialog.tsx b/src/components/ChannelsAvailabilityDialog/ChannelsAvailabilityDialog.tsx index 8f26c0e88..64cf6a3b6 100644 --- a/src/components/ChannelsAvailabilityDialog/ChannelsAvailabilityDialog.tsx +++ b/src/components/ChannelsAvailabilityDialog/ChannelsAvailabilityDialog.tsx @@ -1,15 +1,18 @@ import { Channel } from "@saleor/channels/utils"; import ActionDialog from "@saleor/components/ActionDialog"; -import { ChannelsAvailabilityContent } from "@saleor/components/ChannelsAvailabilityContent"; import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import React from "react"; +import ChannelsAvailabilityDialogChannelsList from "../ChannelsAvailabilityDialogChannelsList"; +import ChannelsAvailabilityDialogWrapper from "../ChannelsAvailabilityDialogWrapper"; +import { useChannelsSearch } from "./utils"; + export interface ChannelsAvailabilityDialogProps { isSelected: (option: Channel) => boolean; channels: Channel[]; confirmButtonState: ConfirmButtonTransitionState; contentType?: string; - disabled: boolean; + disabled?: boolean; open: boolean; onClose: () => void; onChange: (option: Channel) => void; @@ -23,34 +26,49 @@ export const ChannelsAvailabilityDialog: React.FC ( - - { + const { query, onQueryChange, filteredChannels } = useChannelsSearch( + channels + ); + + const handleToggleAll = () => toggleAll(channels, selected); + + const hasAllSelected = selected === channels.length; + + return ( + - -); -ChannelsAvailabilityDialog.displayName = "ChannelsAvailabilityDialog"; + > + + + + + ); +}; + export default ChannelsAvailabilityDialog; diff --git a/src/components/ChannelsAvailabilityDialog/utils.ts b/src/components/ChannelsAvailabilityDialog/utils.ts new file mode 100644 index 000000000..d3c5b7d2a --- /dev/null +++ b/src/components/ChannelsAvailabilityDialog/utils.ts @@ -0,0 +1,11 @@ +import { filter } from "fuzzaldrin"; +import React from "react"; + +export const useChannelsSearch = function( + channels: T[] +) { + const [query, onQueryChange] = React.useState(""); + const filteredChannels = filter(channels, query, { key: "name" }); + + return { query, onQueryChange, filteredChannels }; +}; diff --git a/src/components/ChannelsAvailabilityDialogChannelsList/ChannelsAvailabilityDialogChannelsList.tsx b/src/components/ChannelsAvailabilityDialogChannelsList/ChannelsAvailabilityDialogChannelsList.tsx new file mode 100644 index 000000000..b2925177b --- /dev/null +++ b/src/components/ChannelsAvailabilityDialogChannelsList/ChannelsAvailabilityDialogChannelsList.tsx @@ -0,0 +1,61 @@ +import { makeStyles } from "@material-ui/core"; +import Typography from "@material-ui/core/Typography"; +import { Channel } from "@saleor/channels/utils"; +import { ControlledCheckbox } from "@saleor/components/ControlledCheckbox"; +import Hr from "@saleor/components/Hr"; +import React from "react"; + +export const useStyles = makeStyles( + theme => ({ + label: { + fontSize: 14 + }, + option: { + "&:last-child": { + "& hr": { + display: "none" + } + }, + margin: theme.spacing(1, 0) + } + }), + { name: "ChannelsAvailabilityContent" } +); + +export interface ChannelsAvailabilityContentProps { + isChannelSelected: (channel: Channel) => boolean; + channels: Channel[]; + onChange: (option: Channel) => void; +} + +const ChannelsAvailabilityContent: React.FC = ({ + isChannelSelected, + channels, + onChange +}) => { + const classes = useStyles({}); + + return ( + <> + {channels.map(option => ( +
+ {option.name} + } + onChange={() => onChange(option)} + /> +
+
+ ))} + + ); +}; + +export default ChannelsAvailabilityContent; diff --git a/src/components/ChannelsAvailabilityDialogChannelsList/index.ts b/src/components/ChannelsAvailabilityDialogChannelsList/index.ts new file mode 100644 index 000000000..03929d1bb --- /dev/null +++ b/src/components/ChannelsAvailabilityDialogChannelsList/index.ts @@ -0,0 +1,2 @@ +export * from "./ChannelsAvailabilityDialogChannelsList"; +export { default } from "./ChannelsAvailabilityDialogChannelsList"; diff --git a/src/components/ChannelsAvailabilityDialogWrapper/ChannelsAvailabilityDialogWrapper.tsx b/src/components/ChannelsAvailabilityDialogWrapper/ChannelsAvailabilityDialogWrapper.tsx new file mode 100644 index 000000000..faa118841 --- /dev/null +++ b/src/components/ChannelsAvailabilityDialogWrapper/ChannelsAvailabilityDialogWrapper.tsx @@ -0,0 +1,147 @@ +import { makeStyles } from "@material-ui/core"; +import TextField from "@material-ui/core/TextField"; +import Typography from "@material-ui/core/Typography"; +import { ControlledCheckbox } from "@saleor/components/ControlledCheckbox"; +import Hr from "@saleor/components/Hr"; +import Label from "@saleor/orders/components/OrderHistory/Label"; +import React from "react"; +import { useIntl } from "react-intl"; +import { defineMessages, FormattedMessage } from "react-intl"; + +export const useStyles = makeStyles( + theme => ({ + content: { + "& hr": { + left: -24, + position: "relative", + width: "calc(100% + 48px)" + } + }, + contentTitle: { + margin: theme.spacing(1, 0) + }, + dialog: { + marginBottom: -30, + marginTop: theme.spacing(2) + }, + input: { + "& label": { + overflowX: "inherit" + } + }, + notFound: { + paddingBottom: theme.spacing(2) + }, + scrollArea: { + maxHeight: 400, + overflowY: "scroll" + }, + text: { + marginBottom: 5 + } + }), + { name: "ChannelsAvailabilityContent" } +); + +const messages = defineMessages({ + selectTitle: { + defaultMessage: + "Select channels you want for {contentType} to be available on", + description: "select title" + }, + selectAllChannelsLabel: { + defaultMessage: "Select All Channels", + description: "select all channels label" + }, + channelsAlphabeticallyTitle: { + defaultMessage: "Channels from A to Z", + description: "channels alphabetically title" + }, + notFoundTitle: { + defaultMessage: "No Channels Found", + description: "no channels found title" + } +}); + +export interface ChannelsAvailabilityContentProps { + contentType?: string; + toggleAll?: () => void; + children: React.ReactNode; + toggleAllLabel?: React.ReactNode; + query: string; + onQueryChange: (query: string) => void; + hasAnyChannelsToDisplay: boolean; + hasAllSelected: boolean; +} + +export const ChannelsAvailabilityContentWrapper: React.FC = ({ + contentType = "", + toggleAll, + toggleAllLabel, + children, + hasAnyChannelsToDisplay, + query, + onQueryChange, + hasAllSelected +}) => { + const classes = useStyles({}); + const intl = useIntl(); + const searchText = intl.formatMessage({ + defaultMessage: "Search through channels" + }); + + return ( +
+ {!!contentType && ( + + + + )} + onQueryChange(e.target.value)} + label={searchText} + placeholder={searchText} + fullWidth + /> +
+ {!!toggleAll && ( + <> + + ) + } + onChange={toggleAll} + /> +
+ + )} + + + +
+ {hasAnyChannelsToDisplay ? ( + children + ) : ( +
+ +
+ )} +
+
+
+ ); +}; + +export default ChannelsAvailabilityContentWrapper; diff --git a/src/components/ChannelsAvailabilityDialogWrapper/index.ts b/src/components/ChannelsAvailabilityDialogWrapper/index.ts new file mode 100644 index 000000000..e7fc7a56c --- /dev/null +++ b/src/components/ChannelsAvailabilityDialogWrapper/index.ts @@ -0,0 +1,2 @@ +export * from "./ChannelsAvailabilityDialogWrapper"; +export { default } from "./ChannelsAvailabilityDialogWrapper"; diff --git a/src/components/ControlledCheckbox.tsx b/src/components/ControlledCheckbox.tsx index 97c7c2410..3d60f76f0 100644 --- a/src/components/ControlledCheckbox.tsx +++ b/src/components/ControlledCheckbox.tsx @@ -8,6 +8,7 @@ interface ControlledCheckboxProps { label?: React.ReactNode; checked: boolean; disabled?: boolean; + checkedIcon?: React.ReactNode; onChange(event: any); } @@ -17,12 +18,14 @@ export const ControlledCheckbox: React.FC = ({ name, label, onChange, + checkedIcon, ...props }) => ( undefined} />); diff --git a/src/components/DeletableItem/DeletableItem.tsx b/src/components/DeletableItem/DeletableItem.tsx new file mode 100644 index 000000000..ed28b6a11 --- /dev/null +++ b/src/components/DeletableItem/DeletableItem.tsx @@ -0,0 +1,35 @@ +import { makeStyles } from "@material-ui/core/styles"; +import TrashIcon from "@saleor/icons/Trash"; +import React from "react"; + +const useStyles = makeStyles( + theme => ({ + container: { + cursor: "pointer", + padding: theme.spacing(3), + display: "flex", + justifyContent: "center", + alignItems: "center" + } + }), + { name: "DeletableItem" } +); + +interface DeletableItemProps { + onDelete: (id: string) => void; + id: string; +} + +const DeletableItem: React.FC = ({ onDelete, id }) => { + const classes = useStyles({}); + + const handleDelete = () => onDelete(id); + + return ( +
+ +
+ ); +}; + +export default DeletableItem; diff --git a/src/components/DeletableItem/index.tsx b/src/components/DeletableItem/index.tsx new file mode 100644 index 000000000..816523cc0 --- /dev/null +++ b/src/components/DeletableItem/index.tsx @@ -0,0 +1,2 @@ +export * from "./DeletableItem"; +export { default } from "./DeletableItem"; diff --git a/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectField.stories.tsx b/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectField.stories.tsx index 791cf77e8..72ce287f2 100644 --- a/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectField.stories.tsx +++ b/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectField.stories.tsx @@ -31,7 +31,7 @@ const Story: React.FC> = ({ allowCustomValues, emptyOption, enableLoadMore }) => { +>> = ({ allowCustomValues, emptyOption, enableLoadMore, nakedInput }) => { const [displayValue, setDisplayValue] = React.useState(suggestions[0].label); return ( @@ -59,6 +59,7 @@ const Story: React.FC ); }} @@ -104,6 +105,7 @@ storiesOf("Generics / Select with autocomplete", module) .add("no data", () => ( )) + .add("naked", () => ) .add("interactive", () => ) .add("interactive with custom option", () => ( diff --git a/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectField.tsx b/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectField.tsx index 8ab523cc2..be27d6b8a 100644 --- a/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectField.tsx +++ b/src/components/SingleAutocompleteSelectField/SingleAutocompleteSelectField.tsx @@ -1,4 +1,5 @@ import { InputProps } from "@material-ui/core/Input"; +import InputBase from "@material-ui/core/InputBase"; import TextField from "@material-ui/core/TextField"; import { ExtendedFormHelperTextProps } from "@saleor/channels/components/ChannelForm/types"; import { makeStyles } from "@saleor/theme"; @@ -16,12 +17,15 @@ import SingleAutocompleteSelectFieldContent, { } from "./SingleAutocompleteSelectFieldContent"; const useStyles = makeStyles( - { + theme => ({ container: { flexGrow: 1, position: "relative" + }, + nakedInput: { + padding: theme.spacing(2, 3) } - }, + }), { name: "SingleAutocompleteSelectField" } ); @@ -44,6 +48,7 @@ export interface SingleAutocompleteSelectFieldProps fetchChoices?: (value: string) => void; onChange: (event: React.ChangeEvent) => void; FormHelperTextProps?: ExtendedFormHelperTextProps; + nakedInput?: boolean; } const DebounceAutocomplete: React.ComponentType + +
+ ), + error, + id: undefined, + onBlur: handleBlur, + onClick: toggleMenu + }; + + const nakedInputProps = nakedInput + ? { + "aria-label": "naked", + ...commonInputProps, + autoFocus: true, + className: classes.nakedInput + } + : {}; + return (
- - -
- ), - error, - id: undefined, - onBlur: handleBlur, - onClick: toggleMenu - }} + ({ + alignRight: { + justifyContent: "flex-end" + }, + avatar: { + background: "none", + border: `1px solid ${theme.palette.divider}`, + borderRadius: 2, + color: "#bdbdbd", + display: "inline-flex", + padding: theme.spacing(0.5) + }, + children: { + alignSelf: "center", + marginLeft: theme.spacing(2), + width: "100%" + }, + content: { + alignItems: "center", + display: "flex" + }, + root: { + "&:not(first-child)": { + paddingLeft: 0 + }, + paddingRight: theme.spacing(3), + width: "1%" + } + }), + { name: "Avatar" } +); + +export interface AvatarProps { + thumbnail?: string; + alignRight?: boolean; + avatarProps?: string; + children?: React.ReactNode | React.ReactNodeArray; +} + +const Avatar: React.FC = ({ + children, + alignRight, + thumbnail, + avatarProps +}) => { + const classes = useStyles({}); + + return ( +
+ {thumbnail === undefined ? ( + + + + ) : thumbnail === null ? ( + + + + ) : ( + + )} + {!alignRight &&
{children}
} +
+ ); +}; + +export default Avatar; diff --git a/src/components/TableCellAvatar/TableCellAvatar.tsx b/src/components/TableCellAvatar/TableCellAvatar.tsx index 39460d3df..bee967026 100644 --- a/src/components/TableCellAvatar/TableCellAvatar.tsx +++ b/src/components/TableCellAvatar/TableCellAvatar.tsx @@ -1,36 +1,12 @@ -import Avatar from "@material-ui/core/Avatar"; import TableCell, { TableCellProps } from "@material-ui/core/TableCell"; -import Cached from "@material-ui/icons/Cached"; import { makeStyles } from "@saleor/theme"; import classNames from "classnames"; import React from "react"; -import Image from "../../icons/Image"; - -export const AVATAR_MARGIN = 32; +import Avatar, { AvatarProps } from "./Avatar"; const useStyles = makeStyles( theme => ({ - alignRight: { - justifyContent: "flex-end" - }, - avatar: { - background: "none", - border: `1px solid ${theme.palette.divider}`, - borderRadius: 2, - color: "#bdbdbd", - display: "inline-flex", - padding: theme.spacing(0.5) - }, - children: { - alignSelf: "center", - marginLeft: theme.spacing(2), - width: "100%" - }, - content: { - alignItems: "center", - display: "flex" - }, root: { "&:not(first-child)": { paddingLeft: 0 @@ -42,51 +18,20 @@ const useStyles = makeStyles( { name: "TableCellAvatar" } ); -interface TableCellAvatarProps extends TableCellProps { +interface TableCellAvatarProps extends AvatarProps, TableCellProps { className?: string; - thumbnail?: string; - alignRight?: boolean; - avatarProps?: string; - children?: React.ReactNode | React.ReactNodeArray; } const TableCellAvatar: React.FC = props => { - const { - children, - className, - alignRight, - thumbnail, - avatarProps, - ...rest - } = props; + const { className, ...rest } = props; const classes = useStyles(props); return ( -
- {thumbnail === undefined ? ( - - - - ) : thumbnail === null ? ( - - - - ) : ( - - )} - {!alignRight &&
{children}
} -
+
); }; -TableCellAvatar.displayName = "TableCellAvatar"; + export default TableCellAvatar; diff --git a/src/discounts/components/DiscountProducts/DiscountProducts.tsx b/src/discounts/components/DiscountProducts/DiscountProducts.tsx index 3ac72f735..951e95eba 100644 --- a/src/discounts/components/DiscountProducts/DiscountProducts.tsx +++ b/src/discounts/components/DiscountProducts/DiscountProducts.tsx @@ -11,9 +11,8 @@ import { ChannelsAvailabilityDropdown } from "@saleor/components/ChannelsAvailab import Checkbox from "@saleor/components/Checkbox"; import ResponsiveTable from "@saleor/components/ResponsiveTable"; import Skeleton from "@saleor/components/Skeleton"; -import TableCellAvatar, { - AVATAR_MARGIN -} from "@saleor/components/TableCellAvatar"; +import TableCellAvatar from "@saleor/components/TableCellAvatar"; +import { AVATAR_MARGIN } from "@saleor/components/TableCellAvatar/Avatar"; import TableHead from "@saleor/components/TableHead"; import TablePagination from "@saleor/components/TablePagination"; import { makeStyles } from "@saleor/theme"; diff --git a/src/discounts/components/SaleCreatePage/SaleCreatePage.tsx b/src/discounts/components/SaleCreatePage/SaleCreatePage.tsx index b39100bd6..8d71241a8 100644 --- a/src/discounts/components/SaleCreatePage/SaleCreatePage.tsx +++ b/src/discounts/components/SaleCreatePage/SaleCreatePage.tsx @@ -1,7 +1,7 @@ import { ChannelSaleData } from "@saleor/channels/utils"; import AppHeader from "@saleor/components/AppHeader"; import CardSpacer from "@saleor/components/CardSpacer"; -import ChannelsAvailability from "@saleor/components/ChannelsAvailability"; +import ChannelsAvailabilityCard from "@saleor/components/ChannelsAvailabilityCard"; import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import Container from "@saleor/components/Container"; import Form from "@saleor/components/Form"; @@ -117,7 +117,7 @@ const SaleCreatePage: React.FC = ({ />
- ({ diff --git a/src/discounts/components/SaleDetailsPage/SaleDetailsPage.tsx b/src/discounts/components/SaleDetailsPage/SaleDetailsPage.tsx index f2d1dcb2b..ea11fa26e 100644 --- a/src/discounts/components/SaleDetailsPage/SaleDetailsPage.tsx +++ b/src/discounts/components/SaleDetailsPage/SaleDetailsPage.tsx @@ -1,7 +1,7 @@ import { ChannelSaleData } from "@saleor/channels/utils"; import AppHeader from "@saleor/components/AppHeader"; import CardSpacer from "@saleor/components/CardSpacer"; -import ChannelsAvailability from "@saleor/components/ChannelsAvailability"; +import ChannelsAvailabilityCard from "@saleor/components/ChannelsAvailabilityCard"; import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import Container from "@saleor/components/Container"; import Form from "@saleor/components/Form"; @@ -293,7 +293,7 @@ const SaleDetailsPage: React.FC = ({ sale={sale} /> - ({ diff --git a/src/discounts/components/VoucherCreatePage/VoucherCreatePage.tsx b/src/discounts/components/VoucherCreatePage/VoucherCreatePage.tsx index 3e97b6f81..119267e21 100644 --- a/src/discounts/components/VoucherCreatePage/VoucherCreatePage.tsx +++ b/src/discounts/components/VoucherCreatePage/VoucherCreatePage.tsx @@ -1,7 +1,7 @@ import { ChannelVoucherData } from "@saleor/channels/utils"; import AppHeader from "@saleor/components/AppHeader"; import CardSpacer from "@saleor/components/CardSpacer"; -import ChannelsAvailability from "@saleor/components/ChannelsAvailability"; +import ChannelsAvailabilityCard from "@saleor/components/ChannelsAvailabilityCard"; import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import Container from "@saleor/components/Container"; import Form from "@saleor/components/Form"; @@ -170,7 +170,7 @@ const VoucherCreatePage: React.FC = ({ />
- ({ diff --git a/src/discounts/components/VoucherDetailsPage/VoucherDetailsPage.tsx b/src/discounts/components/VoucherDetailsPage/VoucherDetailsPage.tsx index 189af5aa0..e0ea0ee3f 100644 --- a/src/discounts/components/VoucherDetailsPage/VoucherDetailsPage.tsx +++ b/src/discounts/components/VoucherDetailsPage/VoucherDetailsPage.tsx @@ -2,7 +2,7 @@ import Typography from "@material-ui/core/Typography"; import { ChannelVoucherData } from "@saleor/channels/utils"; import AppHeader from "@saleor/components/AppHeader"; import CardSpacer from "@saleor/components/CardSpacer"; -import ChannelsAvailability from "@saleor/components/ChannelsAvailability"; +import ChannelsAvailabilityCard from "@saleor/components/ChannelsAvailabilityCard"; import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import Container from "@saleor/components/Container"; import CountryList from "@saleor/components/CountryList"; @@ -394,7 +394,7 @@ const VoucherDetailsPage: React.FC = ({ selectedChannelId={selectedChannelId} /> - ({ diff --git a/src/fragments/channels.ts b/src/fragments/channels.ts index 494dec1cd..a2512ff9d 100644 --- a/src/fragments/channels.ts +++ b/src/fragments/channels.ts @@ -1,5 +1,7 @@ import gql from "graphql-tag"; +import { shippingZoneFragment } from "./shipping"; + export const channelErrorFragment = gql` fragment ChannelErrorFragment on ChannelError { code @@ -20,9 +22,12 @@ export const channelFragment = gql` export const channelDetailsFragment = gql` ${channelFragment} - + ${shippingZoneFragment} fragment ChannelDetailsFragment on Channel { ...ChannelFragment hasOrders + shippingZones { + ...ShippingZoneFragment + } } `; diff --git a/src/fragments/products.ts b/src/fragments/products.ts index e2fb2273f..e2434bdee 100644 --- a/src/fragments/products.ts +++ b/src/fragments/products.ts @@ -202,6 +202,9 @@ export const productFragmentDetails = gql` sku name margin + media { + url(size: 200) + } stocks { ...StockFragment } @@ -256,6 +259,7 @@ export const selectedVariantAttributeFragment = gql` `; export const fragmentVariant = gql` + ${fragmentProductMedia} ${selectedVariantAttributeFragment} ${priceRangeFragment} ${fragmentProductMedia} diff --git a/src/fragments/types/ChannelDetailsFragment.ts b/src/fragments/types/ChannelDetailsFragment.ts index c29a147e2..305cac159 100644 --- a/src/fragments/types/ChannelDetailsFragment.ts +++ b/src/fragments/types/ChannelDetailsFragment.ts @@ -7,6 +7,34 @@ // GraphQL fragment: ChannelDetailsFragment // ==================================================== +export interface ChannelDetailsFragment_shippingZones_metadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface ChannelDetailsFragment_shippingZones_privateMetadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface ChannelDetailsFragment_shippingZones_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface ChannelDetailsFragment_shippingZones { + __typename: "ShippingZone"; + metadata: (ChannelDetailsFragment_shippingZones_metadata | null)[]; + privateMetadata: (ChannelDetailsFragment_shippingZones_privateMetadata | null)[]; + id: string; + countries: (ChannelDetailsFragment_shippingZones_countries | null)[] | null; + name: string; + description: string | null; +} + export interface ChannelDetailsFragment { __typename: "Channel"; id: string; @@ -15,4 +43,5 @@ export interface ChannelDetailsFragment { slug: string; currencyCode: string; hasOrders: boolean; + shippingZones: ChannelDetailsFragment_shippingZones[]; } diff --git a/src/fragments/types/Product.ts b/src/fragments/types/Product.ts index 14ef89acd..ac389a1be 100644 --- a/src/fragments/types/Product.ts +++ b/src/fragments/types/Product.ts @@ -186,6 +186,11 @@ export interface Product_media { oembedData: any; } +export interface Product_variants_media { + __typename: "ProductMedia"; + url: string; +} + export interface Product_variants_stocks_warehouse { __typename: "Warehouse"; id: string; @@ -232,6 +237,7 @@ export interface Product_variants { sku: string; name: string; margin: number | null; + media: Product_variants_media[] | null; stocks: (Product_variants_stocks | null)[] | null; trackInventory: boolean; channelListings: Product_variants_channelListings[] | null; diff --git a/src/fragments/types/ShippingZoneDetailsFragment.ts b/src/fragments/types/ShippingZoneDetailsFragment.ts index 991928aa2..f2f30d470 100644 --- a/src/fragments/types/ShippingZoneDetailsFragment.ts +++ b/src/fragments/types/ShippingZoneDetailsFragment.ts @@ -124,5 +124,5 @@ export interface ShippingZoneDetailsFragment { description: string | null; default: boolean; shippingMethods: (ShippingZoneDetailsFragment_shippingMethods | null)[] | null; - warehouses: (ShippingZoneDetailsFragment_warehouses | null)[] | null; + warehouses: ShippingZoneDetailsFragment_warehouses[]; } diff --git a/src/hooks/makeTopLevelSearch/index.ts b/src/hooks/makeTopLevelSearch/index.ts new file mode 100644 index 000000000..658103603 --- /dev/null +++ b/src/hooks/makeTopLevelSearch/index.ts @@ -0,0 +1,2 @@ +export { default } from "./makeTopLevelSearch"; +export * from "./makeTopLevelSearch"; diff --git a/src/hooks/makeTopLevelSearch.ts b/src/hooks/makeTopLevelSearch/makeTopLevelSearch.ts similarity index 89% rename from src/hooks/makeTopLevelSearch.ts rename to src/hooks/makeTopLevelSearch/makeTopLevelSearch.ts index 0e81770b7..0ff6c4a3f 100644 --- a/src/hooks/makeTopLevelSearch.ts +++ b/src/hooks/makeTopLevelSearch/makeTopLevelSearch.ts @@ -1,7 +1,7 @@ import { PageInfoFragment } from "@saleor/fragments/types/PageInfoFragment"; import { DocumentNode } from "graphql"; -import makeSearch, { SearchVariables, UseSearchHook } from "./makeSearch"; +import makeSearch, { SearchVariables, UseSearchHook } from "../makeSearch"; export interface SearchData { search: { @@ -12,6 +12,10 @@ export interface SearchData { }; } +export interface ResultSearchData { + data: SearchData; +} + function makeTopLevelSearch< TData extends SearchData, TVariables extends SearchVariables diff --git a/src/hooks/makeTopLevelSearch/types.ts b/src/hooks/makeTopLevelSearch/types.ts new file mode 100644 index 000000000..b4670e8e0 --- /dev/null +++ b/src/hooks/makeTopLevelSearch/types.ts @@ -0,0 +1,12 @@ +export interface CommonSearchOpts { + onLoadMore?: () => void; + loading?: boolean; + data?: { + search?: { + totalCount?: number; + pageInfo?: { + hasNextPage: boolean; + }; + }; + }; +} diff --git a/src/hooks/makeTopLevelSearch/utils.ts b/src/hooks/makeTopLevelSearch/utils.ts new file mode 100644 index 000000000..61d2e8058 --- /dev/null +++ b/src/hooks/makeTopLevelSearch/utils.ts @@ -0,0 +1,17 @@ +import { FetchMoreProps } from "@saleor/types"; + +import { ResultSearchData } from "./makeTopLevelSearch"; +import { CommonSearchOpts } from "./types"; + +export const getSearchFetchMoreProps = ( + { data, loading }: CommonSearchOpts, + onFetchMore: any +): FetchMoreProps => ({ + hasMore: !!data?.search?.pageInfo?.hasNextPage, + totalCount: data?.search?.totalCount, + loading: !!loading, + onFetchMore +}); + +export const getParsedSearchData = ({ data }: ResultSearchData) => + data?.search?.edges?.map(({ node }) => node) || []; diff --git a/src/hooks/useDateLocalize.ts b/src/hooks/useDateLocalize.ts index 635e7b765..6820f15ea 100644 --- a/src/hooks/useDateLocalize.ts +++ b/src/hooks/useDateLocalize.ts @@ -2,7 +2,9 @@ import { LocaleContext } from "@saleor/components/Locale"; import moment from "moment-timezone"; import { useContext } from "react"; -function useDateLocalize(): (date: string, format?: string) => string { +export type LocalizeDate = (date: string, format?: string) => string; + +function useDateLocalize(): LocalizeDate { const { locale } = useContext(LocaleContext); return (date: string, format?: string) => diff --git a/src/hooks/useForm.ts b/src/hooks/useForm.ts index cb2df629e..6dfa66831 100644 --- a/src/hooks/useForm.ts +++ b/src/hooks/useForm.ts @@ -100,11 +100,12 @@ function useForm( setData(initial); } - function set(newData: Partial) { + function set(newData: Partial, setHasChanged = true) { setData(data => ({ ...data, ...newData })); + setChanged(setHasChanged); } async function submit() { diff --git a/src/hooks/useNotifier/index.ts b/src/hooks/useNotifier/index.ts new file mode 100644 index 000000000..4f87156dc --- /dev/null +++ b/src/hooks/useNotifier/index.ts @@ -0,0 +1,2 @@ +export { default } from "./useNotifier"; +export * from "./useNotifier"; diff --git a/src/hooks/useNotifier.ts b/src/hooks/useNotifier/useNotifier.ts similarity index 100% rename from src/hooks/useNotifier.ts rename to src/hooks/useNotifier/useNotifier.ts diff --git a/src/hooks/useNotifier/utils.ts b/src/hooks/useNotifier/utils.ts new file mode 100644 index 000000000..c0105c45b --- /dev/null +++ b/src/hooks/useNotifier/utils.ts @@ -0,0 +1,18 @@ +import { IMessage } from "@saleor/components/messages"; +import { commonMessages } from "@saleor/intl"; +import commonErrorMessages from "@saleor/utils/errors/common"; +import { IntlShape } from "react-intl"; + +export const getDefaultNotifierSuccessErrorData = ( + errors: any[], + intl: IntlShape +): IMessage => + !errors.length + ? { + status: "success", + text: intl.formatMessage(commonMessages.savedChanges) + } + : { + status: "error", + text: intl.formatMessage(commonErrorMessages.unknownError) + }; diff --git a/src/icons/CheckboxSemiChecked.tsx b/src/icons/CheckboxSemiChecked.tsx new file mode 100644 index 000000000..30a8d336e --- /dev/null +++ b/src/icons/CheckboxSemiChecked.tsx @@ -0,0 +1,12 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import React from "react"; + +const CheckboxSemiChecked = createSvgIcon( + + + + , + "CheckboxSemiChecked" +); + +export default CheckboxSemiChecked; diff --git a/src/icons/ChevronDown.tsx b/src/icons/ChevronDown.tsx new file mode 100644 index 000000000..f07eb96b7 --- /dev/null +++ b/src/icons/ChevronDown.tsx @@ -0,0 +1,25 @@ +import useTheme from "@saleor/hooks/useTheme"; +import React from "react"; + +const ChevronDown: React.FC = () => { + const { isDark } = useTheme(); + + return ( + + + + ); +}; + +export default ChevronDown; diff --git a/src/icons/ChevronUp.tsx b/src/icons/ChevronUp.tsx new file mode 100644 index 000000000..39d51dc04 --- /dev/null +++ b/src/icons/ChevronUp.tsx @@ -0,0 +1,16 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import React from "react"; + +const ChevronUp = createSvgIcon( + + + , + "ChevronUp" +); + +export default ChevronUp; diff --git a/src/icons/Trash.tsx b/src/icons/Trash.tsx new file mode 100644 index 000000000..8d881a028 --- /dev/null +++ b/src/icons/Trash.tsx @@ -0,0 +1,30 @@ +import createSvgIcon from "@material-ui/icons/utils/createSvgIcon"; +import useTheme from "@saleor/hooks/useTheme"; +import React from "react"; + +const Trash: React.FC = () => { + const { isDark } = useTheme(); + + const TrashComponent = createSvgIcon( + + + , + "Trash" + ); + + return ; +}; + +export default Trash; diff --git a/src/orders/components/OrderDraftDetailsProducts/OrderDraftDetailsProducts.tsx b/src/orders/components/OrderDraftDetailsProducts/OrderDraftDetailsProducts.tsx index f09d071bf..872e5ad68 100644 --- a/src/orders/components/OrderDraftDetailsProducts/OrderDraftDetailsProducts.tsx +++ b/src/orders/components/OrderDraftDetailsProducts/OrderDraftDetailsProducts.tsx @@ -3,7 +3,7 @@ import TableCell from "@material-ui/core/TableCell"; import TableHead from "@material-ui/core/TableHead"; import TableRow from "@material-ui/core/TableRow"; import ResponsiveTable from "@saleor/components/ResponsiveTable"; -import { AVATAR_MARGIN } from "@saleor/components/TableCellAvatar"; +import { AVATAR_MARGIN } from "@saleor/components/TableCellAvatar/Avatar"; import { OrderLineDiscountConsumer, OrderLineDiscountContextConsumerProps diff --git a/src/orders/components/OrderDraftDetailsProducts/TableLine.tsx b/src/orders/components/OrderDraftDetailsProducts/TableLine.tsx index affdece21..997466061 100644 --- a/src/orders/components/OrderDraftDetailsProducts/TableLine.tsx +++ b/src/orders/components/OrderDraftDetailsProducts/TableLine.tsx @@ -5,9 +5,8 @@ import Typography from "@material-ui/core/Typography"; import DeleteIcon from "@material-ui/icons/Delete"; import Link from "@saleor/components/Link"; import Money from "@saleor/components/Money"; -import TableCellAvatar, { - AVATAR_MARGIN -} from "@saleor/components/TableCellAvatar"; +import TableCellAvatar from "@saleor/components/TableCellAvatar"; +import { AVATAR_MARGIN } from "@saleor/components/TableCellAvatar/Avatar"; import { OrderLineDiscountContextConsumerProps } from "@saleor/products/components/OrderDiscountProviders/OrderLineDiscountProvider"; import { makeStyles } from "@saleor/theme"; import React, { useRef } from "react"; diff --git a/src/orders/components/OrderFulfillmentDialog/OrderFulfillmentDialog.tsx b/src/orders/components/OrderFulfillmentDialog/OrderFulfillmentDialog.tsx index d057198b9..99a4a4202 100644 --- a/src/orders/components/OrderFulfillmentDialog/OrderFulfillmentDialog.tsx +++ b/src/orders/components/OrderFulfillmentDialog/OrderFulfillmentDialog.tsx @@ -15,9 +15,8 @@ import ConfirmButton, { import Form from "@saleor/components/Form"; import { FormSpacer } from "@saleor/components/FormSpacer"; import ResponsiveTable from "@saleor/components/ResponsiveTable"; -import TableCellAvatar, { - AVATAR_MARGIN -} from "@saleor/components/TableCellAvatar"; +import TableCellAvatar from "@saleor/components/TableCellAvatar"; +import { AVATAR_MARGIN } from "@saleor/components/TableCellAvatar/Avatar"; import { OrderErrorFragment } from "@saleor/fragments/types/OrderErrorFragment"; import { buttonMessages } from "@saleor/intl"; import { makeStyles } from "@saleor/theme"; diff --git a/src/orders/components/OrderProductAddDialog/OrderProductAddDialog.tsx b/src/orders/components/OrderProductAddDialog/OrderProductAddDialog.tsx index 5a11cabeb..9de4b629a 100644 --- a/src/orders/components/OrderProductAddDialog/OrderProductAddDialog.tsx +++ b/src/orders/components/OrderProductAddDialog/OrderProductAddDialog.tsx @@ -189,21 +189,49 @@ const OrderProductAddDialog: React.FC = props => { onClose: () => setVariants([]) }); + const isValidVariant = ({ + channelListings + }: SearchOrderVariant_search_edges_node_variants) => { + const currentListing = channelListings.find( + listing => listing.channel.id === selectedChannelId + ); + + const listingPrice = currentListing?.price?.amount; + + const isVariantPriceSet = + listingPrice !== null && listingPrice !== undefined; + + return !!currentListing && isVariantPriceSet; + }; + + const getValidProductVariants = ({ + variants + }: SearchOrderVariant_search_edges_node) => variants.filter(isValidVariant); + const productChoices = - products?.filter(product => product.variants?.length > 0) || []; + products?.filter(product => getValidProductVariants(product).length > 0) || + []; + const selectedVariantsToProductsMap = productChoices ? productChoices.map(product => - product.variants.map(variant => isVariantSelected(variant, variants)) + getValidProductVariants(product).map(variant => + isVariantSelected(variant, variants) + ) ) : []; + const productsWithAllVariantsSelected = productChoices ? productChoices.map(product => - hasAllVariantsSelected(product.variants, variants) + hasAllVariantsSelected(getValidProductVariants(product), variants) ) : []; const handleSubmit = () => onSubmit(variants); + const productChoicesWithValidVariants = productChoices.filter( + ({ variants }) => variants.some(isValidVariant) + ); + return ( = props => { {renderCollection( - productChoices, - (product, productIndex) => - product.variants.some(variant => - variant.channelListings.some( - listing => listing.channel.id === selectedChannelId - ) - ) ? ( - - - - - onProductAdd( - product, - productIndex, - productsWithAllVariantsSelected, - variants, - setVariants - ) - } - /> - - product.thumbnail.url)} + productChoicesWithValidVariants, + (product, productIndex) => ( + + + + + onProductAdd( + product, + productIndex, + productsWithAllVariantsSelected, + variants, + setVariants + ) + } /> - - {maybe(() => product.name)} - - - {maybe(() => product.variants, []).map( - (variant, variantIndex) => - variant.channelListings.some( - listing => listing.channel.id === selectedChannelId - ) ? ( - - - - - onVariantAdd( - variant, - variantIndex, - productIndex, - variants, - selectedVariantsToProductsMap, - setVariants - ) - } - /> - - -
{variant.name}
-
- -
-
- - {variant.channelListings.map( - listing => - listing.channel.id === - selectedChannelId && ( - - ) - )} - -
- ) : null - )} -
- ) : null, + + product.thumbnail.url)} + /> + + {maybe(() => product.name)} + +
+ {maybe(() => product.variants, []) + .filter(isValidVariant) + .map((variant, variantIndex) => ( + + + + + onVariantAdd( + variant, + variantIndex, + productIndex, + variants, + selectedVariantsToProductsMap, + setVariants + ) + } + /> + + +
{variant.name}
+
+ +
+
+ + {variant?.channelListings[0]?.price && ( + + )} + +
+ ))} +
+ ), () => ( diff --git a/src/orders/components/OrderProductsCardElements/OrderProductsTableRow.tsx b/src/orders/components/OrderProductsCardElements/OrderProductsTableRow.tsx index 04dba0f15..4075d3348 100644 --- a/src/orders/components/OrderProductsCardElements/OrderProductsTableRow.tsx +++ b/src/orders/components/OrderProductsCardElements/OrderProductsTableRow.tsx @@ -1,9 +1,8 @@ import { makeStyles, TableCell, TableRow } from "@material-ui/core"; import Money from "@saleor/components/Money"; import Skeleton from "@saleor/components/Skeleton"; -import TableCellAvatar, { - AVATAR_MARGIN -} from "@saleor/components/TableCellAvatar"; +import TableCellAvatar from "@saleor/components/TableCellAvatar"; +import { AVATAR_MARGIN } from "@saleor/components/TableCellAvatar/Avatar"; import { maybe } from "@saleor/misc"; import { OrderDetails_order_fulfillments_lines, diff --git a/src/orders/components/OrderReturnPage/utils.tsx b/src/orders/components/OrderReturnPage/utils.tsx index 98b534ce4..b57b2075e 100644 --- a/src/orders/components/OrderReturnPage/utils.tsx +++ b/src/orders/components/OrderReturnPage/utils.tsx @@ -95,3 +95,30 @@ export const getById = (idToCompare: string) => (obj: { id: string }) => export const getByUnmatchingId = (idToCompare: string) => (obj: { id: string; }) => obj.id !== idToCompare; + +const isIncludedInIds = function( + arrayToCompare: string[] | T[], + obj: { id: string } +) { + const isSimpleIdsArray = (arrayToCompare as string[]).every( + value => typeof value === "string" + ); + + const idsToCompare = isSimpleIdsArray + ? (arrayToCompare as string[]) + : ((arrayToCompare as T[]).map(({ id }) => id) as string[]); + + return idsToCompare.includes(obj.id); +}; + +export function getByIds( + arrayToCompare: string[] | T[] +) { + return (obj: { id: string }) => isIncludedInIds(arrayToCompare, obj); +} + +export function getByUnmatchingIds( + arrayToCompare: string[] | T[] +) { + return (obj: { id: string }) => !isIncludedInIds(arrayToCompare, obj); +} diff --git a/src/plugins/components/PluginsDetailsPage/PluginsDetailsPage.tsx b/src/plugins/components/PluginsDetailsPage/PluginsDetailsPage.tsx index bbab1b6ce..027ff0a87 100644 --- a/src/plugins/components/PluginsDetailsPage/PluginsDetailsPage.tsx +++ b/src/plugins/components/PluginsDetailsPage/PluginsDetailsPage.tsx @@ -76,7 +76,7 @@ const PluginsDetailsPage: React.FC = props => { return ( - {({ data, hasChanged, submit, set, triggerChange }) => { + {({ data, hasChanged, submit, set }) => { const onChange = (event: ChangeEvent) => { const { name, value } = event.target; const newData = { @@ -98,7 +98,6 @@ const PluginsDetailsPage: React.FC = props => { }); } - triggerChange(); set(newData); }; return ( diff --git a/src/products/components/OrderDiscountProviders/OrderDiscountProvider.tsx b/src/products/components/OrderDiscountProviders/OrderDiscountProvider.tsx index 2e14575fe..e64195eae 100644 --- a/src/products/components/OrderDiscountProviders/OrderDiscountProvider.tsx +++ b/src/products/components/OrderDiscountProviders/OrderDiscountProvider.tsx @@ -1,6 +1,7 @@ /* eslint-disable sort-keys */ import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import useNotifier from "@saleor/hooks/useNotifier"; +import { getDefaultNotifierSuccessErrorData } from "@saleor/hooks/useNotifier/utils"; import { OrderDiscountCommonInput } from "@saleor/orders/components/OrderDiscountCommonModal/types"; import { useOrderDiscountAddMutation, @@ -15,7 +16,7 @@ import React, { createContext } from "react"; import { useIntl } from "react-intl"; import { OrderDiscountConsumerCommonProps, OrderDiscountData } from "./types"; -import { getDiscountNotifierData, useDiscountDialog } from "./utils"; +import { useDiscountDialog } from "./utils"; import { getManualOrderDiscount, getParsedDiscountData } from "./utils"; export interface OrderDiscountContextConsumerProps @@ -68,7 +69,7 @@ export const OrderDiscountProvider: React.FC = ({ const handleDiscountDataSubmission = (errors: any[]) => { closeDialog(); - notify(getDiscountNotifierData(errors, intl)); + notify(getDefaultNotifierSuccessErrorData(errors, intl)); }; const addOrderDiscount = (data: OrderDiscountCommonInput) => diff --git a/src/products/components/OrderDiscountProviders/OrderLineDiscountProvider.tsx b/src/products/components/OrderDiscountProviders/OrderLineDiscountProvider.tsx index 4cf33acd7..a5f1b5e84 100644 --- a/src/products/components/OrderDiscountProviders/OrderLineDiscountProvider.tsx +++ b/src/products/components/OrderDiscountProviders/OrderLineDiscountProvider.tsx @@ -1,6 +1,7 @@ /* eslint-disable sort-keys */ import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import useNotifier from "@saleor/hooks/useNotifier"; +import { getDefaultNotifierSuccessErrorData } from "@saleor/hooks/useNotifier/utils"; import { OrderDiscountCommonInput } from "@saleor/orders/components/OrderDiscountCommonModal/types"; import { getById } from "@saleor/orders/components/OrderReturnPage/utils"; import { @@ -19,7 +20,7 @@ import { OrderLineDiscountConsumerProps, OrderLineDiscountData } from "./types"; -import { getDiscountNotifierData, useDiscountDialog } from "./utils"; +import { useDiscountDialog } from "./utils"; import { getOrderLineDiscount, getParsedDiscountData } from "./utils"; export interface OrderLineDiscountContextConsumerProps @@ -79,7 +80,7 @@ export const OrderLineDiscountProvider: React.FC = ({ const handleDiscountDataSubmission = (errors: any[]) => { closeDialog(); - notify(getDiscountNotifierData(errors, intl)); + notify(getDefaultNotifierSuccessErrorData(errors, intl)); }; const addOrUpdateOrderLineDiscount = (orderLineId: string) => ( diff --git a/src/products/components/OrderDiscountProviders/utils.ts b/src/products/components/OrderDiscountProviders/utils.ts index 5dd410a7e..64a8254b5 100644 --- a/src/products/components/OrderDiscountProviders/utils.ts +++ b/src/products/components/OrderDiscountProviders/utils.ts @@ -1,5 +1,3 @@ -import { IMessage } from "@saleor/components/messages"; -import { commonMessages } from "@saleor/intl"; import { OrderDiscountCommonInput } from "@saleor/orders/components/OrderDiscountCommonModal/types"; import { OrderDetails_order, @@ -7,9 +5,7 @@ import { OrderDetails_order_lines } from "@saleor/orders/types/OrderDetails"; import { OrderDiscountType } from "@saleor/types/globalTypes"; -import commonErrorMessages from "@saleor/utils/errors/common"; import { useState } from "react"; -import { IntlShape } from "react-intl"; import { OrderLineDiscountData } from "./types"; @@ -21,21 +17,6 @@ export const useDiscountDialog = () => { return { closeDialog, isDialogOpen, openDialog }; }; - -export const getDiscountNotifierData = ( - errors: any[], - intl: IntlShape -): IMessage => - !errors.length - ? { - status: "success", - text: intl.formatMessage(commonMessages.savedChanges) - } - : { - status: "error", - text: intl.formatMessage(commonErrorMessages.unknownError) - }; - export const getManualOrderDiscount = (order: OrderDetails_order) => order ? getOrderDiscount(order, OrderDiscountType.MANUAL) : null; diff --git a/src/products/components/ProductCreatePage/ProductCreatePage.tsx b/src/products/components/ProductCreatePage/ProductCreatePage.tsx index 4c071596a..90897f6f5 100644 --- a/src/products/components/ProductCreatePage/ProductCreatePage.tsx +++ b/src/products/components/ProductCreatePage/ProductCreatePage.tsx @@ -2,12 +2,13 @@ import { getAttributeValuesFromReferences, mergeAttributeValues } from "@saleor/attributes/utils/data"; +import CannotDefineChannelsAvailabilityCard from "@saleor/channels/components/CannotDefineChannelsAvailabilityCard/CannotDefineChannelsAvailabilityCard"; import { ChannelData } from "@saleor/channels/utils"; import AppHeader from "@saleor/components/AppHeader"; import AssignAttributeValueDialog from "@saleor/components/AssignAttributeValueDialog"; import Attributes, { AttributeInput } from "@saleor/components/Attributes"; -import AvailabilityCard from "@saleor/components/AvailabilityCard"; import CardSpacer from "@saleor/components/CardSpacer"; +import ChannelsAvailabilityCard from "@saleor/components/ChannelsAvailabilityCard"; import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import Container from "@saleor/components/Container"; import Grid from "@saleor/components/Grid"; @@ -307,26 +308,30 @@ export const ProductCreatePage: React.FC = ({ collectionsInputDisplayValue={selectedCollections} /> - + visibleLabel: intl.formatMessage({ + defaultMessage: "Published", + description: "product label" + }) + }} + errors={channelsErrors} + selectedChannelsCount={data.channelListings?.length || 0} + allChannelsCount={allChannelsCount} + channels={data.channelListings || []} + disabled={loading} + onChange={handlers.changeChannels} + openModal={openChannelsModal} + /> + ) : ( + + )} = ({ const intl = useIntl(); const [query, onQueryChange] = useSearchQuery(onFetch); const getFieldLabel = useProductExportFieldMessages(); + const { + query: channelsQuery, + onQueryChange: onChannelsQueryChange, + filteredChannels + } = useChannelsSearch(channels); const handleFieldChange = (event: ChangeEvent) => onChange({ @@ -283,6 +290,9 @@ const ProductExportDialogInfo: React.FC = ({ const selectedAllInventoryFields = selectedInventoryFields.length === inventoryFields.length; + const handleSelectAllChannels = () => + onSelectAllChannels(channels, channels.length); + return ( <> @@ -321,19 +331,21 @@ const ProductExportDialogInfo: React.FC = ({ } data-test="channels" > - - !!selectedChannels.find(channel => channel.id === option.id) - } - onChange={onChannelSelect} - toggleAll={onSelectAllChannels} - /> + + + !!selectedChannels.find(channel => channel.id === option.id) + } + onChange={onChannelSelect} + /> + ({ + container: { + paddingTop: theme.spacing(1), + paddingBottom: theme.spacing(1), + paddingLeft: theme.spacing(3), + paddingRight: theme.spacing(2), + display: "flex", + flexDirection: "row", + justifyContent: "space-between", + alignItems: "center", + width: "100%", + position: "relative" + } + }), + { name: "CardAddItemsFooter" } +); + +interface CardAddItemsFooterProps { + title: MessageDescriptor; + onAdd: () => void; + testIds: { + link: string; + button: string; + }; + ref?: MutableRefObject; +} + +const CardAddItemsFooter: React.FC = ({ + title, + onAdd, + testIds, + ref, + children +}) => { + const intl = useIntl(); + const classes = useStyles({}); + + return ( +
+ + {intl.formatMessage(title)} + + + + + {children} +
+ ); +}; + +export default CardAddItemsFooter; diff --git a/src/products/components/ProductUpdatePage/ProductUpdatePage.test.tsx b/src/products/components/ProductUpdatePage/ProductUpdatePage.test.tsx index 0047a0e78..caee93953 100644 --- a/src/products/components/ProductUpdatePage/ProductUpdatePage.test.tsx +++ b/src/products/components/ProductUpdatePage/ProductUpdatePage.test.tsx @@ -14,10 +14,6 @@ import ProductUpdatePage, { ProductUpdatePageProps } from "./ProductUpdatePage"; const product = productFixture(placeholderImage); const channels = createChannelsData(channelsList); -const channelChoices = product.channelListings.map(listing => ({ - label: listing.channel.name, - value: listing.channel.id -})); import Adapter from "enzyme-adapter-react-16"; configure({ adapter: new Adapter() }); @@ -28,7 +24,10 @@ const props: ProductUpdatePageProps = { ...listActionsProps, allChannelsCount: 5, categories: [product.category], - channelChoices, + channelsData: [], + channelsWithVariantsData: {}, + isSimpleProduct: false, + setChannelsData: () => undefined, channelsErrors: [], collections, currentChannels: channels, diff --git a/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx b/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx index b8cc69ba4..e900bf934 100644 --- a/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx +++ b/src/products/components/ProductUpdatePage/ProductUpdatePage.tsx @@ -7,8 +7,8 @@ import { ChannelData } from "@saleor/channels/utils"; import AppHeader from "@saleor/components/AppHeader"; import AssignAttributeValueDialog from "@saleor/components/AssignAttributeValueDialog"; import Attributes, { AttributeInput } from "@saleor/components/Attributes"; -import AvailabilityCard from "@saleor/components/AvailabilityCard"; import CardSpacer from "@saleor/components/CardSpacer"; +import ChannelsAvailabilityCard from "@saleor/components/ChannelsAvailabilityCard"; import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import Container from "@saleor/components/Container"; import Grid from "@saleor/components/Grid"; @@ -17,7 +17,6 @@ import PageHeader from "@saleor/components/PageHeader"; import SaveButtonBar from "@saleor/components/SaveButtonBar"; import SeoForm from "@saleor/components/SeoForm"; import { RefreshLimits_shop_limits } from "@saleor/components/Shop/types/RefreshLimits"; -import { SingleAutocompleteChoiceType } from "@saleor/components/SingleAutocompleteSelectField"; import { ProductChannelListingErrorFragment } from "@saleor/fragments/types/ProductChannelListingErrorFragment"; import { ProductErrorWithAttributesFragment } from "@saleor/fragments/types/ProductErrorWithAttributesFragment"; import { TaxTypeFragment } from "@saleor/fragments/types/TaxTypeFragment"; @@ -29,6 +28,7 @@ import { sectionNames } from "@saleor/intl"; import { maybe } from "@saleor/misc"; import ProductExternalMediaDialog from "@saleor/products/components/ProductExternalMediaDialog"; import ProductVariantPrice from "@saleor/products/components/ProductVariantPrice"; +import { ChannelsWithVariantsData } from "@saleor/products/views/ProductUpdate/types"; import { SearchCategories_search_edges_node } from "@saleor/searches/types/SearchCategories"; import { SearchCollections_search_edges_node } from "@saleor/searches/types/SearchCollections"; import { SearchPages_search_edges_node } from "@saleor/searches/types/SearchPages"; @@ -42,6 +42,7 @@ import { import React from "react"; import { useIntl } from "react-intl"; +import ChannelsWithVariantsAvailabilityCard from "../../../channels/ChannelsWithVariantsAvailabilityCard/ChannelsWithVariantsAvailabilityCard"; import { ProductDetails_product, ProductDetails_product_media, @@ -61,12 +62,15 @@ import ProductUpdateForm, { } from "./form"; export interface ProductUpdatePageProps extends ListActions, ChannelProps { + channelsWithVariantsData: ChannelsWithVariantsData; + setChannelsData: (data: ChannelData[]) => void; + onChannelsChange: (data: ChannelData[]) => void; + channelsData: ChannelData[]; + currentChannels: ChannelData[]; + allChannelsCount: number; + channelsErrors: ProductChannelListingErrorFragment[]; defaultWeightUnit: string; errors: ProductErrorWithAttributesFragment[]; - channelsErrors: ProductChannelListingErrorFragment[]; - allChannelsCount: number; - currentChannels: ChannelData[]; - channelChoices: SingleAutocompleteChoiceType[]; placeholderImage: string; collections: SearchCollections_search_edges_node[]; categories: SearchCategories_search_edges_node[]; @@ -88,6 +92,7 @@ export interface ProductUpdatePageProps extends ListActions, ChannelProps { assignReferencesAttributeId?: string; fetchMoreReferencePages?: FetchMoreProps; fetchMoreReferenceProducts?: FetchMoreProps; + isSimpleProduct: boolean; fetchCategories: (query: string) => void; fetchCollections: (query: string) => void; fetchReferencePages?: (data: string) => void; @@ -100,7 +105,6 @@ export interface ProductUpdatePageProps extends ListActions, ChannelProps { onImageDelete: (id: string) => () => void; onSubmit: (data: ProductUpdatePageSubmitData) => SubmitPromise; openChannelsModal: () => void; - onChannelsChange: (data: ChannelData[]) => void; onBack?(); onDelete(); onImageEdit?(id: string); @@ -113,9 +117,7 @@ export interface ProductUpdatePageProps extends ListActions, ChannelProps { onWarehouseConfigure(); } -export interface ProductUpdatePageSubmitData - extends ProductUpdatePageFormData, - ChannelProps { +export interface ProductUpdatePageSubmitData extends ProductUpdatePageFormData { addStocks: ProductStockInput[]; attributes: AttributeInput[]; attributesWithNewFileValue: FormsetData; @@ -130,9 +132,8 @@ export const ProductUpdatePage: React.FC = ({ disabled, categories: categoryChoiceList, channelsErrors, - allChannelsCount, - currentChannels = [], collections: collectionChoiceList, + isSimpleProduct, errors, fetchCategories, fetchCollections, @@ -147,21 +148,24 @@ export const ProductUpdatePage: React.FC = ({ saveButtonBarState, variants, warehouses, + setChannelsData, taxTypes, referencePages = [], referenceProducts = [], onBack, onDelete, + allChannelsCount, + currentChannels, onImageDelete, onImageEdit, onImageReorder, onImageUpload, onMediaUrlUpload, - onChannelsChange, openChannelsModal, onSeoClick, onSubmit, onVariantAdd, + channelsData, onVariantsAdd, onSetDefaultVariant, onVariantShow, @@ -180,7 +184,9 @@ export const ProductUpdatePage: React.FC = ({ fetchMoreReferencePages, fetchReferenceProducts, fetchMoreReferenceProducts, - onCloseDialog + onCloseDialog, + channelsWithVariantsData, + onChannelsChange }) => { const intl = useIntl(); @@ -229,10 +235,15 @@ export const ProductUpdatePage: React.FC = ({ return ( = ({ setChannels={onChannelsChange} taxTypes={taxTypeChoices} warehouses={warehouses} - currentChannels={currentChannels} hasVariants={hasVariants} referencePages={referencePages} referenceProducts={referenceProducts} @@ -299,7 +309,7 @@ export const ProductUpdatePage: React.FC = ({ /> )} - {!!product?.productType && !hasVariants && ( + {isSimpleProduct && ( <> = ({ onCollectionChange={handlers.selectCollection} /> - + visibleLabel: intl.formatMessage({ + defaultMessage: "Published", + description: "product label" + }) + }} + errors={channelsErrors} + selectedChannelsCount={data.channelListings.length} + allChannelsCount={allChannelsCount} + channels={data.channelListings} + disabled={disabled} + onChange={handlers.changeChannels} + openModal={openChannelsModal} + /> + ) : ( + + )} >; setSelectedTaxType: React.Dispatch>; - setChannels: (channels: ChannelData[]) => void; selectedCollections: MultiAutocompleteChoiceType[]; warehouses: SearchWarehouses_search_edges_node[]; - currentChannels: ChannelData[]; + channelsData: ChannelData[]; hasVariants: boolean; + currentChannels: ChannelData[]; + setChannels: (data: ChannelData[]) => void; + setChannelsData: (data: ChannelData[]) => void; referencePages: SearchPages_search_edges_node[]; referenceProducts: SearchProducts_search_edges_node[]; fetchReferencePages?: (data: string) => void; @@ -154,6 +159,8 @@ export interface UseProductUpdateFormOpts fetchReferenceProducts?: (data: string) => void; fetchMoreReferenceProducts?: FetchMoreProps; assignReferencesAttributeId?: string; + channelsWithVariants: ChannelsWithVariantsData; + isSimpleProduct: boolean; } export interface ProductUpdateFormProps extends UseProductUpdateFormOpts { @@ -198,7 +205,9 @@ function useProductUpdateForm( getProductUpdatePageFormData( product, product?.variants, - opts.currentChannels + opts.currentChannels, + opts.channelsData, + opts.channelsWithVariants ) ); const attributes = useFormset(getAttributeInputFromProduct(product)); @@ -292,19 +301,23 @@ function useProductUpdateForm( opts.taxTypes ); const changeMetadata = makeMetadataChangeHandler(handleChange); + const handleChannelsChange = createChannelsChangeHandler( - opts.currentChannels, - opts.setChannels, + opts.isSimpleProduct ? opts.currentChannels : opts.channelsData, + opts.isSimpleProduct ? opts.setChannels : opts.setChannelsData, triggerChange ); + const handleChannelPriceChange = createChannelsPriceChangeHandler( - opts.currentChannels, - opts.setChannels, + opts.isSimpleProduct ? opts.currentChannels : opts.channelsData, + opts.isSimpleProduct ? opts.setChannels : opts.setChannelsData, triggerChange ); const data: ProductUpdateData = { ...form.data, + channelListings: opts.currentChannels, + channelsData: opts.channelsData, attributes: getAttributesDisplayData( attributes.data, attributesWithNewFileValue.data, @@ -314,6 +327,7 @@ function useProductUpdateForm( description: description.current, stocks: stocks.data }; + // Need to make it function to always have description.current up to date const getSubmitData = (): ProductUpdateSubmitData => ({ ...data, diff --git a/src/products/components/ProductVariantPrice/ProductVariantPrice.tsx b/src/products/components/ProductVariantPrice/ProductVariantPrice.tsx index 1e3ee19a8..ebeb16817 100644 --- a/src/products/components/ProductVariantPrice/ProductVariantPrice.tsx +++ b/src/products/components/ProductVariantPrice/ProductVariantPrice.tsx @@ -7,7 +7,7 @@ import { } from "@material-ui/core"; import Card from "@material-ui/core/Card"; import CardContent from "@material-ui/core/CardContent"; -import { ChannelPriceArgs, ChannelPriceData } from "@saleor/channels/utils"; +import { ChannelData, ChannelPriceArgs } from "@saleor/channels/utils"; import CardTitle from "@saleor/components/CardTitle"; import PriceField from "@saleor/components/PriceField"; import ResponsiveTable from "@saleor/components/ResponsiveTable"; @@ -62,7 +62,7 @@ const useStyles = makeStyles( ); interface ProductVariantPriceProps { - ProductVariantChannelListings: ChannelPriceData[]; + ProductVariantChannelListings: ChannelData[]; errors: ProductChannelListingErrorFragment[]; loading?: boolean; onChange: (id: string, data: ChannelPriceArgs) => void; diff --git a/src/products/types/ProductChannelListingUpdate.ts b/src/products/types/ProductChannelListingUpdate.ts index 312fbb71f..00c3d915c 100644 --- a/src/products/types/ProductChannelListingUpdate.ts +++ b/src/products/types/ProductChannelListingUpdate.ts @@ -186,6 +186,11 @@ export interface ProductChannelListingUpdate_productChannelListingUpdate_product oembedData: any; } +export interface ProductChannelListingUpdate_productChannelListingUpdate_product_variants_media { + __typename: "ProductMedia"; + url: string; +} + export interface ProductChannelListingUpdate_productChannelListingUpdate_product_variants_stocks_warehouse { __typename: "Warehouse"; id: string; @@ -232,6 +237,7 @@ export interface ProductChannelListingUpdate_productChannelListingUpdate_product sku: string; name: string; margin: number | null; + media: ProductChannelListingUpdate_productChannelListingUpdate_product_variants_media[] | null; stocks: (ProductChannelListingUpdate_productChannelListingUpdate_product_variants_stocks | null)[] | null; trackInventory: boolean; channelListings: ProductChannelListingUpdate_productChannelListingUpdate_product_variants_channelListings[] | null; diff --git a/src/products/types/ProductCreate.ts b/src/products/types/ProductCreate.ts index 387fb7184..a52ad3f0d 100644 --- a/src/products/types/ProductCreate.ts +++ b/src/products/types/ProductCreate.ts @@ -193,6 +193,11 @@ export interface ProductCreate_productCreate_product_media { oembedData: any; } +export interface ProductCreate_productCreate_product_variants_media { + __typename: "ProductMedia"; + url: string; +} + export interface ProductCreate_productCreate_product_variants_stocks_warehouse { __typename: "Warehouse"; id: string; @@ -239,6 +244,7 @@ export interface ProductCreate_productCreate_product_variants { sku: string; name: string; margin: number | null; + media: ProductCreate_productCreate_product_variants_media[] | null; stocks: (ProductCreate_productCreate_product_variants_stocks | null)[] | null; trackInventory: boolean; channelListings: ProductCreate_productCreate_product_variants_channelListings[] | null; diff --git a/src/products/types/ProductDetails.ts b/src/products/types/ProductDetails.ts index 824578fd0..661fed2dd 100644 --- a/src/products/types/ProductDetails.ts +++ b/src/products/types/ProductDetails.ts @@ -186,6 +186,11 @@ export interface ProductDetails_product_media { oembedData: any; } +export interface ProductDetails_product_variants_media { + __typename: "ProductMedia"; + url: string; +} + export interface ProductDetails_product_variants_stocks_warehouse { __typename: "Warehouse"; id: string; @@ -232,6 +237,7 @@ export interface ProductDetails_product_variants { sku: string; name: string; margin: number | null; + media: ProductDetails_product_variants_media[] | null; stocks: (ProductDetails_product_variants_stocks | null)[] | null; trackInventory: boolean; channelListings: ProductDetails_product_variants_channelListings[] | null; diff --git a/src/products/types/ProductMediaCreate.ts b/src/products/types/ProductMediaCreate.ts index 192358dcd..6c1176e95 100644 --- a/src/products/types/ProductMediaCreate.ts +++ b/src/products/types/ProductMediaCreate.ts @@ -192,6 +192,11 @@ export interface ProductMediaCreate_productMediaCreate_product_media { oembedData: any; } +export interface ProductMediaCreate_productMediaCreate_product_variants_media { + __typename: "ProductMedia"; + url: string; +} + export interface ProductMediaCreate_productMediaCreate_product_variants_stocks_warehouse { __typename: "Warehouse"; id: string; @@ -238,6 +243,7 @@ export interface ProductMediaCreate_productMediaCreate_product_variants { sku: string; name: string; margin: number | null; + media: ProductMediaCreate_productMediaCreate_product_variants_media[] | null; stocks: (ProductMediaCreate_productMediaCreate_product_variants_stocks | null)[] | null; trackInventory: boolean; channelListings: ProductMediaCreate_productMediaCreate_product_variants_channelListings[] | null; diff --git a/src/products/types/ProductMediaUpdate.ts b/src/products/types/ProductMediaUpdate.ts index 9ec1e8d56..2fed1599e 100644 --- a/src/products/types/ProductMediaUpdate.ts +++ b/src/products/types/ProductMediaUpdate.ts @@ -192,6 +192,11 @@ export interface ProductMediaUpdate_productMediaUpdate_product_media { oembedData: any; } +export interface ProductMediaUpdate_productMediaUpdate_product_variants_media { + __typename: "ProductMedia"; + url: string; +} + export interface ProductMediaUpdate_productMediaUpdate_product_variants_stocks_warehouse { __typename: "Warehouse"; id: string; @@ -238,6 +243,7 @@ export interface ProductMediaUpdate_productMediaUpdate_product_variants { sku: string; name: string; margin: number | null; + media: ProductMediaUpdate_productMediaUpdate_product_variants_media[] | null; stocks: (ProductMediaUpdate_productMediaUpdate_product_variants_stocks | null)[] | null; trackInventory: boolean; channelListings: ProductMediaUpdate_productMediaUpdate_product_variants_channelListings[] | null; diff --git a/src/products/types/ProductUpdate.ts b/src/products/types/ProductUpdate.ts index 34bcbeef9..93ce99645 100644 --- a/src/products/types/ProductUpdate.ts +++ b/src/products/types/ProductUpdate.ts @@ -193,6 +193,11 @@ export interface ProductUpdate_productUpdate_product_media { oembedData: any; } +export interface ProductUpdate_productUpdate_product_variants_media { + __typename: "ProductMedia"; + url: string; +} + export interface ProductUpdate_productUpdate_product_variants_stocks_warehouse { __typename: "Warehouse"; id: string; @@ -239,6 +244,7 @@ export interface ProductUpdate_productUpdate_product_variants { sku: string; name: string; margin: number | null; + media: ProductUpdate_productUpdate_product_variants_media[] | null; stocks: (ProductUpdate_productUpdate_product_variants_stocks | null)[] | null; trackInventory: boolean; channelListings: ProductUpdate_productUpdate_product_variants_channelListings[] | null; diff --git a/src/products/types/ProductVariantReorder.ts b/src/products/types/ProductVariantReorder.ts index 7e2410b80..bb291f5ce 100644 --- a/src/products/types/ProductVariantReorder.ts +++ b/src/products/types/ProductVariantReorder.ts @@ -192,6 +192,11 @@ export interface ProductVariantReorder_productVariantReorder_product_media { oembedData: any; } +export interface ProductVariantReorder_productVariantReorder_product_variants_media { + __typename: "ProductMedia"; + url: string; +} + export interface ProductVariantReorder_productVariantReorder_product_variants_stocks_warehouse { __typename: "Warehouse"; id: string; @@ -238,6 +243,7 @@ export interface ProductVariantReorder_productVariantReorder_product_variants { sku: string; name: string; margin: number | null; + media: ProductVariantReorder_productVariantReorder_product_variants_media[] | null; stocks: (ProductVariantReorder_productVariantReorder_product_variants_stocks | null)[] | null; trackInventory: boolean; channelListings: ProductVariantReorder_productVariantReorder_product_variants_channelListings[] | null; diff --git a/src/products/types/ProductVariantSetDefault.ts b/src/products/types/ProductVariantSetDefault.ts index 779483e5d..9edfddb02 100644 --- a/src/products/types/ProductVariantSetDefault.ts +++ b/src/products/types/ProductVariantSetDefault.ts @@ -192,6 +192,11 @@ export interface ProductVariantSetDefault_productVariantSetDefault_product_media oembedData: any; } +export interface ProductVariantSetDefault_productVariantSetDefault_product_variants_media { + __typename: "ProductMedia"; + url: string; +} + export interface ProductVariantSetDefault_productVariantSetDefault_product_variants_stocks_warehouse { __typename: "Warehouse"; id: string; @@ -238,6 +243,7 @@ export interface ProductVariantSetDefault_productVariantSetDefault_product_varia sku: string; name: string; margin: number | null; + media: ProductVariantSetDefault_productVariantSetDefault_product_variants_media[] | null; stocks: (ProductVariantSetDefault_productVariantSetDefault_product_variants_stocks | null)[] | null; trackInventory: boolean; channelListings: ProductVariantSetDefault_productVariantSetDefault_product_variants_channelListings[] | null; diff --git a/src/products/types/SimpleProductUpdate.ts b/src/products/types/SimpleProductUpdate.ts index 236938ed1..36531d900 100644 --- a/src/products/types/SimpleProductUpdate.ts +++ b/src/products/types/SimpleProductUpdate.ts @@ -193,6 +193,11 @@ export interface SimpleProductUpdate_productUpdate_product_media { oembedData: any; } +export interface SimpleProductUpdate_productUpdate_product_variants_media { + __typename: "ProductMedia"; + url: string; +} + export interface SimpleProductUpdate_productUpdate_product_variants_stocks_warehouse { __typename: "Warehouse"; id: string; @@ -239,6 +244,7 @@ export interface SimpleProductUpdate_productUpdate_product_variants { sku: string; name: string; margin: number | null; + media: SimpleProductUpdate_productUpdate_product_variants_media[] | null; stocks: (SimpleProductUpdate_productUpdate_product_variants_stocks | null)[] | null; trackInventory: boolean; channelListings: SimpleProductUpdate_productUpdate_product_variants_channelListings[] | null; diff --git a/src/products/utils/data.ts b/src/products/utils/data.ts index 802cbe69f..b1b6d31ec 100644 --- a/src/products/utils/data.ts +++ b/src/products/utils/data.ts @@ -22,6 +22,7 @@ import { mapMetadataItemToInput } from "@saleor/utils/maps"; import { ProductStockInput } from "../components/ProductStocks"; import { ProductType_productType_productAttributes } from "../types/ProductType"; import { ProductVariantCreateData_product } from "../types/ProductVariantCreateData"; +import { ChannelsWithVariantsData } from "../views/ProductUpdate/types"; export interface Collection { id: string; @@ -204,7 +205,9 @@ export function getChoices(nodes: Node[]): SingleAutocompleteChoiceType[] { export interface ProductUpdatePageFormData extends MetadataFormData { category: string | null; changeTaxCode: boolean; + channelsWithVariants: ChannelsWithVariantsData; channelListings: ChannelData[]; + channelsData: ChannelData[]; chargeTaxes: boolean; collections: string[]; isAvailable: boolean; @@ -222,17 +225,21 @@ export interface ProductUpdatePageFormData extends MetadataFormData { export function getProductUpdatePageFormData( product: ProductDetails_product, variants: ProductDetails_product_variants[], - currentChannels: ChannelData[] + currentChannels: ChannelData[], + channelsData: ChannelData[], + channelsWithVariants: ChannelsWithVariantsData ): ProductUpdatePageFormData { return { + channelsWithVariants, + channelsData, category: maybe(() => product.category.id, ""), changeTaxCode: !!product?.taxType.taxCode, - channelListings: currentChannels, chargeTaxes: maybe(() => product.chargeTaxes, false), collections: maybe( () => product.collections.map(collection => collection.id), [] ), + channelListings: currentChannels, isAvailable: !!product?.isAvailable, metadata: product?.metadata?.map(mapMetadataItemToInput), name: maybe(() => product.name, ""), diff --git a/src/products/utils/handlers.ts b/src/products/utils/handlers.ts index 017c14fa2..49f9666cc 100644 --- a/src/products/utils/handlers.ts +++ b/src/products/utils/handlers.ts @@ -6,8 +6,8 @@ import { import { FormChange } from "@saleor/hooks/useForm"; export function createChannelsPriceChangeHandler( - channelListings: ChannelPriceData[], - updateChannels: (data: ChannelPriceData[]) => void, + channelListings: ChannelData[], + updateChannels: (data: ChannelData[]) => void, triggerChange: () => void ) { return (id: string, priceData: ChannelPriceArgs) => { @@ -27,12 +27,13 @@ export function createChannelsPriceChangeHandler( ...channelListings.slice(channelIndex + 1) ]; updateChannels(updatedChannels); + triggerChange(); }; } export function createChannelsChangeHandler( - channelListings: ChannelData[], + channelsData: ChannelData[], updateChannels: (data: ChannelData[]) => void, triggerChange: () => void ) { @@ -40,20 +41,20 @@ export function createChannelsChangeHandler( id: string, data: Omit ) => { - const channelIndex = channelListings.findIndex( - channel => channel.id === id - ); - const channel = channelListings[channelIndex]; + const channelIndex = channelsData.findIndex(channel => channel.id === id); + const channel = channelsData[channelIndex]; const updatedChannels = [ - ...channelListings.slice(0, channelIndex), + ...channelsData.slice(0, channelIndex), { ...channel, ...data }, - ...channelListings.slice(channelIndex + 1) + ...channelsData.slice(channelIndex + 1) ]; + updateChannels(updatedChannels); + triggerChange(); }; } diff --git a/src/products/views/ProductCreate/handlers.ts b/src/products/views/ProductCreate/handlers.ts index ea2ddeda2..16099dff0 100644 --- a/src/products/views/ProductCreate/handlers.ts +++ b/src/products/views/ProductCreate/handlers.ts @@ -44,7 +44,7 @@ const getChannelsVariables = (productId: string, channels: ChannelData[]) => ({ variables: { id: productId, input: { - addChannels: getAvailabilityVariables(channels) + updateChannels: getAvailabilityVariables(channels) } } }); diff --git a/src/products/views/ProductUpdate/ProductUpdate.tsx b/src/products/views/ProductUpdate/ProductUpdate.tsx index 202ca1ea2..407b27406 100644 --- a/src/products/views/ProductUpdate/ProductUpdate.tsx +++ b/src/products/views/ProductUpdate/ProductUpdate.tsx @@ -3,6 +3,7 @@ import DialogContentText from "@material-ui/core/DialogContentText"; import IconButton from "@material-ui/core/IconButton"; import DeleteIcon from "@material-ui/icons/Delete"; import { useAttributeValueDeleteMutation } from "@saleor/attributes/mutations"; +import ChannelsWithVariantsAvailabilityDialog from "@saleor/channels/components/ChannelsWithVariantsAvailabilityDialog"; import { useChannelsList } from "@saleor/channels/queries"; import { ChannelData, @@ -18,6 +19,7 @@ import { useShopLimitsQuery } from "@saleor/components/Shop/query"; import { WindowTitle } from "@saleor/components/WindowTitle"; import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config"; import { useFileUploadMutation } from "@saleor/files/mutations"; +import { getSearchFetchMoreProps } from "@saleor/hooks/makeTopLevelSearch/utils"; import useBulkActions from "@saleor/hooks/useBulkActions"; import useChannels from "@saleor/hooks/useChannels"; import useNavigator from "@saleor/hooks/useNavigator"; @@ -52,10 +54,12 @@ import { import { useWarehouseList } from "@saleor/warehouses/queries"; import { warehouseAddPath } from "@saleor/warehouses/urls"; import React from "react"; -import { FormattedMessage, useIntl } from "react-intl"; +import { defineMessages, FormattedMessage, useIntl } from "react-intl"; import { getMutationState } from "../../../misc"; -import ProductUpdatePage from "../../components/ProductUpdatePage"; +import ProductUpdatePage, { + ProductUpdatePageSubmitData +} from "../../components/ProductUpdatePage"; import { useProductDetails } from "../../queries"; import { ProductMediaCreateVariables } from "../../types/ProductMediaCreate"; import { ProductUpdate as ProductUpdateMutationResult } from "../../types/ProductUpdate"; @@ -75,6 +79,27 @@ import { createUpdateHandler, createVariantReorderHandler } from "./handlers"; +import useChannelsWithProductVariants from "./useChannelsWithProductVariants"; + +const messages = defineMessages({ + deleteProductDialogTitle: { + defaultMessage: "Delete Product", + description: "delete product dialog title" + }, + deleteProductDialogSubtitle: { + defaultMessage: "Are you sure you want to delete {name}?", + description: "delete product dialog subtitle" + }, + deleteVariantDialogTitle: { + defaultMessage: "Delete Product Variants", + description: "delete variant dialog title" + }, + deleteVariantDialogSubtitle: { + defaultMessage: + "{counter,plural,one{Are you sure you want to delete this variant?} other{Are you sure you want to delete {displayQuantity} variants?}}", + description: "delete variant dialog subtitle" + } +}); interface ProductUpdateProps { id: string; @@ -130,7 +155,7 @@ export const ProductUpdate: React.FC = ({ id, params }) => { productVariantCreateOpts ] = useVariantCreateMutation({}); - const { data: channelsData } = useChannelsList({}); + const { data: channelsListData } = useChannelsList({}); const { data, loading, refetch } = useProductDetails({ displayLoader: true, @@ -228,14 +253,33 @@ export const ProductUpdate: React.FC = ({ id, params }) => { const allChannels: ChannelData[] = createChannelsDataWithPrice( product, - channelsData?.channels + channelsListData?.channels ).sort((channel, nextChannel) => channel.name.localeCompare(nextChannel.name) ); + const isSimpleProduct = !data?.product?.productType?.hasVariants; + + const { + channelsWithVariantsData, + haveChannelsWithVariantsDataChanged, + setHaveChannelsWithVariantsChanged, + onChannelsAvailiabilityModalOpen, + channelsData, + setChannelsData, + ...channelsWithVariantsProps + } = useChannelsWithProductVariants({ + channels: allChannels, + variants: product?.variants, + action: params?.action, + openModal, + closeModal + }); + const productChannelsChoices: ChannelData[] = createSortedChannelsDataFromProduct( product ); + const { channelListElements, channelsToggle, @@ -254,24 +298,17 @@ export const ProductUpdate: React.FC = ({ id, params }) => { const [updateChannels, updateChannelsOpts] = useProductChannelListingUpdate({ onCompleted: data => { - if (data.productChannelListingUpdate.errors.length === 0) { - const updatedProductChannelsChoices: ChannelData[] = createSortedChannelsDataFromProduct( - data.productChannelListingUpdate.product - ); - setCurrentChannels(updatedProductChannelsChoices); + if (!!data.productChannelListingUpdate.errors.length) { + return; } } }); + const [ updateVariantChannels, updateVariantChannelsOpts ] = useProductVariantChannelListingUpdate({}); - const channelChoices = product?.channelListings.map(listing => ({ - label: listing.channel.name, - value: listing.channel.id - })); - const [ createProductMedia, createProductMediaOpts @@ -328,6 +365,7 @@ export const ProductUpdate: React.FC = ({ id, params }) => { product, createUpdateHandler( product, + allChannels, variables => uploadFile({ variables }), variables => updateProduct({ variables }), variables => updateSimpleProduct({ variables }), @@ -409,61 +447,76 @@ export const ProductUpdate: React.FC = ({ id, params }) => { ?.errors || []) ]; - const fetchMoreCollections = { - hasMore: searchCollectionsOpts.data?.search?.pageInfo?.hasNextPage, - loading: searchCollectionsOpts.loading, - onFetchMore: loadMoreCollections - }; - const fetchMoreCategories = { - hasMore: searchCategoriesOpts.data?.search?.pageInfo?.hasNextPage, - loading: searchCategoriesOpts.loading, - onFetchMore: loadMoreCategories - }; - const fetchMoreReferencePages = { - hasMore: searchPagesOpts.data?.search?.pageInfo?.hasNextPage, - loading: searchPagesOpts.loading, - onFetchMore: loadMorePages - }; - const fetchMoreReferenceProducts = { - hasMore: searchProductsOpts.data?.search?.pageInfo?.hasNextPage, - loading: searchProductsOpts.loading, - onFetchMore: loadMoreProducts - }; + const fetchMoreCollections = getSearchFetchMoreProps( + searchCollectionsOpts, + loadMoreCollections + ); + + const fetchMoreCategories = getSearchFetchMoreProps( + searchCategoriesOpts, + loadMoreCategories + ); + + const fetchMoreReferencePages = getSearchFetchMoreProps( + searchPagesOpts, + loadMorePages + ); + + const fetchMoreReferenceProducts = getSearchFetchMoreProps( + searchProductsOpts, + loadMoreProducts + ); return ( <> - {!!allChannels?.length && ( - - )} + {!!allChannels?.length && + (isSimpleProduct ? ( + + ) : ( + + ))} = ({ id, params }) => { onDelete={() => openModal("remove")} onImageReorder={handleImageReorder} onMediaUrlUpload={handleMediaUrlUpload} - onSubmit={handleSubmit} + onSubmit={(formData: ProductUpdatePageSubmitData) => { + setHaveChannelsWithVariantsChanged(false); + return handleSubmit(formData); + }} onWarehouseConfigure={() => navigate(warehouseAddPath)} onVariantAdd={handleVariantAdd} onVariantsAdd={() => navigate(productVariantCreatorUrl(id))} @@ -510,8 +566,6 @@ export const ProductUpdate: React.FC = ({ id, params }) => { fetchMoreCategories={fetchMoreCategories} fetchMoreCollections={fetchMoreCollections} selectedChannelId={channel?.id} - openChannelsModal={handleChannelsModalOpen} - onChannelsChange={setCurrentChannels} assignReferencesAttributeId={ params.action === "assign-attribute-value" && params.id } @@ -534,18 +588,12 @@ export const ProductUpdate: React.FC = ({ id, params }) => { confirmButtonState={deleteProductOpts.status} onConfirm={() => deleteProduct({ variables: { id } })} variant="delete" - title={intl.formatMessage({ - defaultMessage: "Delete Product", - description: "dialog header" - })} + title={intl.formatMessage(messages.deleteProductDialogTitle)} > @@ -561,15 +609,11 @@ export const ProductUpdate: React.FC = ({ id, params }) => { }) } variant="delete" - title={intl.formatMessage({ - defaultMessage: "Delete Product Variants", - description: "dialog header" - })} + title={intl.formatMessage(messages.deleteVariantDialogTitle)} > {params?.ids?.length} diff --git a/src/products/views/ProductUpdate/handlers.ts b/src/products/views/ProductUpdate/handlers/index.ts similarity index 80% rename from src/products/views/ProductUpdate/handlers.ts rename to src/products/views/ProductUpdate/handlers/index.ts index 7e34b57df..a33f4efba 100644 --- a/src/products/views/ProductUpdate/handlers.ts +++ b/src/products/views/ProductUpdate/handlers/index.ts @@ -12,7 +12,7 @@ import { handleUploadMultipleFiles, prepareAttributesInput } from "@saleor/attributes/utils/handlers"; -import { createSortedChannelsDataFromProduct } from "@saleor/channels/utils"; +import { ChannelData } from "@saleor/channels/utils"; import { FileUpload, FileUploadVariables @@ -23,7 +23,6 @@ import { ProductChannelListingErrorFragment } from "@saleor/fragments/types/Prod import { ProductErrorFragment } from "@saleor/fragments/types/ProductErrorFragment"; import { StockErrorFragment } from "@saleor/fragments/types/StockErrorFragment"; import { UploadErrorFragment } from "@saleor/fragments/types/UploadErrorFragment"; -import { weight } from "@saleor/misc"; import { ProductUpdatePageSubmitData } from "@saleor/products/components/ProductUpdatePage"; import { ProductChannelListingUpdate, @@ -55,14 +54,20 @@ import { VariantCreateVariables } from "@saleor/products/types/VariantCreate"; import { mapFormsetStockToStockInput } from "@saleor/products/utils/data"; -import { getAvailabilityVariables } from "@saleor/products/utils/handlers"; import { getParsedDataForJsonStringField } from "@saleor/translations/utils"; import { ReorderEvent } from "@saleor/types"; import { move } from "@saleor/utils/lists"; -import { diff } from "fast-array-diff"; import { MutationFetchResult } from "react-apollo"; import { arrayMove } from "react-sortable-hoc"; +import { + getChannelsVariables, + getSimpleChannelsVariables, + getSimpleProductErrors, + getSimpleProductVariables, + getVariantChannelsInput +} from "./utils"; + type SubmitErrors = Array< | ProductErrorFragment | StockErrorFragment @@ -72,64 +77,9 @@ type SubmitErrors = Array< | ProductChannelListingErrorFragment >; -const getSimpleProductVariables = ( - productVariables: ProductUpdateVariables, - data: ProductUpdatePageSubmitData, - productId: string -) => ({ - ...productVariables, - addStocks: data.addStocks.map(mapFormsetStockToStockInput), - deleteStocks: data.removeStocks, - input: { - ...productVariables.input, - weight: weight(data.weight) - }, - productVariantId: productId, - productVariantInput: { - sku: data.sku, - trackInventory: data.trackInventory - }, - updateStocks: data.updateStocks.map(mapFormsetStockToStockInput) -}); - -const getSimpleProductErrors = (data: SimpleProductUpdate) => [ - ...data.productUpdate.errors, - ...data.productVariantStocksCreate.errors, - ...data.productVariantStocksDelete.errors, - ...data.productVariantStocksUpdate.errors -]; - -const getChannelsVariables = ( - data: ProductUpdatePageSubmitData, - product: ProductDetails_product -) => { - const productChannels = createSortedChannelsDataFromProduct(product); - const diffChannels = diff( - productChannels, - data.channelListings, - (a, b) => a.id === b.id - ); - - return { - id: product.id, - input: { - addChannels: getAvailabilityVariables(data.channelListings), - removeChannels: diffChannels.removed?.map( - removedChannel => removedChannel.id - ) - } - }; -}; - -const getVariantChannelsInput = (data: ProductUpdatePageSubmitData) => - data.channelListings.map(listing => ({ - channelId: listing.id, - costPrice: listing.costPrice || null, - price: listing.price - })); - export function createUpdateHandler( product: ProductDetails_product, + allChannels: ChannelData[], uploadFile: ( variables: FileUploadVariables ) => Promise>, @@ -202,9 +152,7 @@ export function createUpdateHandler( const result = await updateProduct(productVariables); errors = [...errors, ...result.data.productUpdate.errors]; - await updateChannels({ - variables: getChannelsVariables(data, product) - }); + await updateChannels(getChannelsVariables(product, allChannels, data)); } else { if (!product.variants.length) { const productVariantResult = await productVariantCreate({ @@ -228,6 +176,7 @@ export function createUpdateHandler( const variantId = productVariantResult.data.productVariantCreate?.productVariant?.id; + if (variantId) { updateVariantChannels({ variables: { @@ -235,9 +184,11 @@ export function createUpdateHandler( input: getVariantChannelsInput(data) } }); - await updateChannels({ - variables: getChannelsVariables(data, product) - }); + + await updateChannels( + getChannelsVariables(product, allChannels, data) + ); + const result = await updateSimpleProduct( getSimpleProductVariables(productVariables, data, variantId) ); @@ -253,9 +204,8 @@ export function createUpdateHandler( ); errors = [...errors, ...getSimpleProductErrors(result.data)]; - await updateChannels({ - variables: getChannelsVariables(data, product) - }); + await updateChannels(getSimpleChannelsVariables(data, product)); + updateVariantChannels({ variables: { id: product.variants[0].id, diff --git a/src/products/views/ProductUpdate/handlers/utils.ts b/src/products/views/ProductUpdate/handlers/utils.ts new file mode 100644 index 000000000..d4e6d9ee5 --- /dev/null +++ b/src/products/views/ProductUpdate/handlers/utils.ts @@ -0,0 +1,193 @@ +import { + ChannelData, + createSortedChannelsDataFromProduct +} from "@saleor/channels/utils"; +import { weight } from "@saleor/misc"; +import { getById } from "@saleor/orders/components/OrderReturnPage/utils"; +import { ProductUpdatePageSubmitData } from "@saleor/products/components/ProductUpdatePage"; +import { ProductUpdateSubmitData } from "@saleor/products/components/ProductUpdatePage/form"; +import { + ProductDetails_product, + ProductDetails_product_variants +} from "@saleor/products/types/ProductDetails"; +import { ProductUpdateVariables } from "@saleor/products/types/ProductUpdate"; +import { SimpleProductUpdate } from "@saleor/products/types/SimpleProductUpdate"; +import { mapFormsetStockToStockInput } from "@saleor/products/utils/data"; +import { getAvailabilityVariables } from "@saleor/products/utils/handlers"; +import { ProductChannelListingAddInput } from "@saleor/types/globalTypes"; +import { diff } from "fast-array-diff"; +import isEqual from "lodash/isEqual"; + +import { ChannelsWithVariantsData, ChannelWithVariantData } from "../types"; +import { getParsedChannelsWithVariantsDataFromChannels } from "../utils"; + +export const getSimpleProductVariables = ( + productVariables: ProductUpdateVariables, + data: ProductUpdatePageSubmitData, + productId: string +) => ({ + ...productVariables, + addStocks: data.addStocks.map(mapFormsetStockToStockInput), + deleteStocks: data.removeStocks, + input: { + ...productVariables.input, + weight: weight(data.weight) + }, + productVariantId: productId, + productVariantInput: { + sku: data.sku, + trackInventory: data.trackInventory + }, + updateStocks: data.updateStocks.map(mapFormsetStockToStockInput) +}); + +export const getSimpleProductErrors = (data: SimpleProductUpdate) => [ + ...data.productUpdate.errors, + ...data.productVariantStocksCreate.errors, + ...data.productVariantStocksDelete.errors, + ...data.productVariantStocksUpdate.errors +]; + +export const getChannelListingBaseInputData = ({ + id: channelId, + isPublished, + publicationDate, + isAvailableForPurchase, + availableForPurchase, + visibleInListings +}: ChannelData) => ({ + channelId, + isPublished, + publicationDate, + visibleInListings, + isAvailableForPurchase, + availableForPurchaseDate: availableForPurchase +}); + +export const getChannelListingUpdateInputFromData = ( + { variantsIdsToAdd, variantsIdsToRemove }: ChannelWithVariantData, + { selectedVariantsIds: initialSelectedVariantsIds }: ChannelWithVariantData, + basicChannelData: ChannelData +) => ({ + ...getChannelListingBaseInputData(basicChannelData), + addVariants: diff(initialSelectedVariantsIds, variantsIdsToAdd).added, + removeVariants: variantsIdsToRemove +}); + +const getParsedChannelsData = ( + channelsWithVariants: ChannelsWithVariantsData, + initialChannelWithVariants: ChannelsWithVariantsData, + channelsData: ChannelData[] +): ProductChannelListingAddInput[] => + channelsData.map(({ id, ...rest }) => + getChannelListingUpdateInputFromData( + channelsWithVariants[id], + initialChannelWithVariants[id], + { id, ...rest } + ) + ); + +const shouldRemoveChannel = ( + allVariants: ProductDetails_product_variants[] +) => ({ removeVariants }: ProductChannelListingAddInput) => + isRemovingAllVariants(allVariants, removeVariants); + +const isRemovingAllVariants = ( + allVariants: ProductDetails_product_variants[], + removeVariants: string[] +) => !!removeVariants.length && removeVariants.length === allVariants.length; + +const shouldUpdateChannel = ( + initialChannelWithVariantData, + allVariants: ProductDetails_product_variants[], + allChannels: ChannelData[] +) => ({ + removeVariants, + addVariants, + channelId, + ...rest +}: ProductChannelListingAddInput) => { + const initialDataInput = getChannelListingUpdateInputFromData( + initialChannelWithVariantData[channelId], + initialChannelWithVariantData[channelId], + allChannels.find(getById(channelId)) + ); + + const hasDataChanged = !isEqual( + { removeVariants, addVariants, channelId, ...rest }, + initialDataInput + ); + + const isRemovingChannel = isRemovingAllVariants(allVariants, removeVariants); + + return hasDataChanged && !isRemovingChannel; +}; + +export const getChannelsVariables = ( + { id, variants }: ProductDetails_product, + allChannels: ChannelData[], + { channelsWithVariants, channelsData }: ProductUpdateSubmitData +) => { + const initialChannelWithVariants = getParsedChannelsWithVariantsDataFromChannels( + channelsData + ); + + const channelsToBeUpdated = getParsedChannelsData( + channelsWithVariants, + initialChannelWithVariants, + channelsData + ).filter( + shouldUpdateChannel(initialChannelWithVariants, variants, allChannels) + ); + + const channelsIdsToBeRemoved = getParsedChannelsData( + channelsWithVariants, + initialChannelWithVariants, + channelsData + ) + .filter(shouldRemoveChannel(variants)) + .map(({ channelId }) => channelId); + + return { + variables: { + id, + input: { + updateChannels: channelsToBeUpdated, + removeChannels: channelsIdsToBeRemoved + } + } + }; +}; + +export const getSimpleChannelsVariables = ( + data: ProductUpdatePageSubmitData, + product: ProductDetails_product +) => { + const productChannels = createSortedChannelsDataFromProduct(product); + const diffChannels = diff( + productChannels, + data.channelListings, + (a, b) => a.id === b.id + ); + + return { + variables: { + id: product.id, + input: { + updateChannels: getAvailabilityVariables(data.channelListings), + removeChannels: diffChannels.removed?.map( + removedChannel => removedChannel.id + ) + } + } + }; +}; + +export const getVariantChannelsInput = ({ + channelListings +}: ProductUpdatePageSubmitData) => + channelListings.map(listing => ({ + channelId: listing.id, + costPrice: listing.costPrice || null, + price: listing.price + })); diff --git a/src/products/views/ProductUpdate/types.ts b/src/products/views/ProductUpdate/types.ts new file mode 100644 index 000000000..2e5d2674d --- /dev/null +++ b/src/products/views/ProductUpdate/types.ts @@ -0,0 +1,44 @@ +import { ChannelsAction } from "@saleor/channels/urls"; +import { ChannelData } from "@saleor/channels/utils"; +import { ProductDetails_product_variants } from "@saleor/products/types/ProductDetails"; +import { ProductUrlDialog } from "@saleor/products/urls"; + +export interface UseChannelsWithProductVariantsProps { + channels: ChannelData[]; + variants: ProductDetails_product_variants[]; + action: ProductUrlDialog; + openModal: (action: ChannelsAction) => void; + closeModal: () => void; +} + +export interface ChannelWithVariantData { + selectedVariantsIds: string[]; + variantsIdsToRemove: string[]; + variantsIdsToAdd: string[]; +} + +export type ChannelsWithVariantsData = Record; + +export const initialChannelWithVariantData: ChannelWithVariantData = { + variantsIdsToRemove: [], + variantsIdsToAdd: [], + selectedVariantsIds: [] +}; + +export const CHANNELS_AVAILIABILITY_MODAL_SELECTOR = "open-channels-picker"; + +export interface UseChannelsWithProductVariants { + channelsData: ChannelData[]; + setChannelsData: (data: ChannelData[]) => void; + onChannelsWithVariantsConfirm: () => void; + addVariantToChannel: (channelId: string, variantId: string) => void; + removeVariantFromChannel: (channelId: string, variantId: string) => void; + channelsWithVariantsData: ChannelsWithVariantsData; + onChannelsAvailiabilityModalOpen: () => void; + onChannelsAvailiabilityModalClose: () => void; + isChannelsAvailabilityModalOpen: boolean; + toggleAllChannels: () => void; + toggleAllChannelVariants: (channelId: string) => () => void; + haveChannelsWithVariantsDataChanged: boolean; + setHaveChannelsWithVariantsChanged: (hasChanged: boolean) => void; +} diff --git a/src/products/views/ProductUpdate/useChannelsWithProductVariants.ts b/src/products/views/ProductUpdate/useChannelsWithProductVariants.ts new file mode 100644 index 000000000..2eae15ade --- /dev/null +++ b/src/products/views/ProductUpdate/useChannelsWithProductVariants.ts @@ -0,0 +1,140 @@ +import useStateFromProps from "@saleor/hooks/useStateFromProps"; +import isEmpty from "lodash-es/isEmpty"; +import reduce from "lodash-es/reduce"; +import { useEffect, useRef, useState } from "react"; + +import { + CHANNELS_AVAILIABILITY_MODAL_SELECTOR, + ChannelsWithVariantsData, + UseChannelsWithProductVariants, + UseChannelsWithProductVariantsProps +} from "./types"; +import { + areAllVariantsAtAllChannelsSelected, + areAnyChannelVariantsSelected, + getChannelVariantToggleData, + getChannelWithAddedVariantData, + getChannelWithRemovedVariantData, + getParsedChannelsWithVariantsDataFromChannels +} from "./utils"; + +const useChannelsWithProductVariants = ({ + channels, + variants, + openModal, + closeModal, + action +}: UseChannelsWithProductVariantsProps): UseChannelsWithProductVariants => { + const [channelsData, setChannelsData] = useStateFromProps(channels); + + const initialChannelsWithVariantsData = getParsedChannelsWithVariantsDataFromChannels( + channels + ); + + const [ + channelsWithVariantsData, + setChannelsWithVariantsData + ] = useStateFromProps( + initialChannelsWithVariantsData + ); + + const channelsWithVariantsDataRef = useRef(channelsWithVariantsData); + + const [hasChanged, setHasChanged] = useState(false); + + const handleSetHasChanged = () => { + const isDataRefEmpty = isEmpty(channelsWithVariantsDataRef.current); + const isDataEmpty = isEmpty(channelsWithVariantsData); + + const hasFilledInitialData = isDataRefEmpty && !isDataEmpty; + + const hasNoDataFilled = isDataRefEmpty && isDataEmpty; + + channelsWithVariantsDataRef.current = channelsWithVariantsData; + + if (hasNoDataFilled || hasFilledInitialData) { + return; + } + + setHasChanged(true); + }; + + useEffect(handleSetHasChanged, [channelsWithVariantsData]); + + const handleAddVariant = (channelId: string, variantId: string) => + setChannelsWithVariantsData({ + ...channelsWithVariantsData, + ...getChannelWithAddedVariantData({ + channelWithVariantsData: channelsWithVariantsData[channelId], + channelId, + variantId + }) + }); + + const handleRemoveVariant = (channelId: string, variantId: string) => + setChannelsWithVariantsData({ + ...channelsWithVariantsData, + ...getChannelWithRemovedVariantData({ + channelWithVariantsData: channelsWithVariantsData[channelId], + channelId, + variantId + }) + }); + + const toggleAllChannelVariants = (channelId: string) => () => { + const isChannelSelected = areAnyChannelVariantsSelected( + channelsWithVariantsData[channelId] + ); + + setChannelsWithVariantsData({ + ...channelsWithVariantsData, + [channelId]: getChannelVariantToggleData(variants, isChannelSelected) + }); + }; + + const toggleAllChannels = () => { + const areAllChannelsSelected = areAllVariantsAtAllChannelsSelected( + variants, + channelsWithVariantsData + ); + + const updatedData: ChannelsWithVariantsData = reduce( + channelsWithVariantsData, + (result, _, channelId) => ({ + ...result, + [channelId]: getChannelVariantToggleData( + variants, + areAllChannelsSelected + ) + }), + {} + ); + + setChannelsWithVariantsData(updatedData); + }; + + const onChannelsWithVariantsConfirm = () => closeModal(); + + const handleModalOpen = () => + openModal(CHANNELS_AVAILIABILITY_MODAL_SELECTOR); + + const isModalOpen = action === CHANNELS_AVAILIABILITY_MODAL_SELECTOR; + + return { + channelsWithVariantsData, + setChannelsData, + channelsData, + addVariantToChannel: handleAddVariant, + removeVariantFromChannel: handleRemoveVariant, + onChannelsAvailiabilityModalOpen: handleModalOpen, + onChannelsAvailiabilityModalClose: closeModal, + isChannelsAvailabilityModalOpen: isModalOpen, + haveChannelsWithVariantsDataChanged: hasChanged, + toggleAllChannelVariants, + toggleAllChannels, + onChannelsWithVariantsConfirm, + setHaveChannelsWithVariantsChanged: setHasChanged + }; +}; + +export default useChannelsWithProductVariants; diff --git a/src/products/views/ProductUpdate/utils.ts b/src/products/views/ProductUpdate/utils.ts new file mode 100644 index 000000000..db4dccc5f --- /dev/null +++ b/src/products/views/ProductUpdate/utils.ts @@ -0,0 +1,122 @@ +import { + getUpdatedIdsWithNewId, + getUpdatedIdsWithoutNewId +} from "@saleor/channels/pages/ChannelDetailsPage/utils"; +import { ChannelData } from "@saleor/channels/utils"; +import { ProductDetails_product_variants } from "@saleor/products/types/ProductDetails"; +import { reduce } from "lodash"; +import every from "lodash-es/every"; + +import { + ChannelsWithVariantsData, + ChannelWithVariantData, + initialChannelWithVariantData +} from "./types"; + +export const getParsedChannelsWithVariantsDataFromChannels = ( + channels: ChannelData[] +): ChannelsWithVariantsData => + channels?.reduce( + (result: ChannelsWithVariantsData, { id, variantsIds }) => ({ + ...result, + [id]: { + ...initialChannelWithVariantData, + selectedVariantsIds: variantsIds + } as ChannelWithVariantData + }), + {} + ); + +interface ChannelAddRemoveVariantCommonProps { + channelWithVariantsData: ChannelWithVariantData; + channelId: string; + variantId: string; +} + +export const getChannelWithAddedVariantData = ({ + channelWithVariantsData: { + selectedVariantsIds, + variantsIdsToAdd, + variantsIdsToRemove + }, + channelId, + variantId +}: ChannelAddRemoveVariantCommonProps): ChannelsWithVariantsData => ({ + [channelId]: { + selectedVariantsIds: getUpdatedIdsWithNewId(selectedVariantsIds, variantId), + variantsIdsToAdd: getUpdatedIdsWithNewId(variantsIdsToAdd, variantId), + variantsIdsToRemove: getUpdatedIdsWithoutNewId( + variantsIdsToRemove, + variantId + ) + } +}); + +export const getChannelWithRemovedVariantData = ({ + channelWithVariantsData: { + selectedVariantsIds, + variantsIdsToAdd, + variantsIdsToRemove + }, + channelId, + variantId +}: ChannelAddRemoveVariantCommonProps): ChannelsWithVariantsData => ({ + [channelId]: { + selectedVariantsIds: getUpdatedIdsWithoutNewId( + selectedVariantsIds, + variantId + ), + variantsIdsToRemove: getUpdatedIdsWithNewId(variantsIdsToRemove, variantId), + variantsIdsToAdd: getUpdatedIdsWithoutNewId(variantsIdsToAdd, variantId) + } +}); + +export const getChannelVariantToggleData = ( + variants: ProductDetails_product_variants[], + isSelected: boolean +): ChannelWithVariantData => { + const allProductVariantsIds = extractAllProductVariantsIds(variants); + + return isSelected + ? { + selectedVariantsIds: [], + variantsIdsToAdd: [], + variantsIdsToRemove: allProductVariantsIds + } + : { + selectedVariantsIds: allProductVariantsIds, + variantsIdsToAdd: allProductVariantsIds, + variantsIdsToRemove: [] + }; +}; + +export const extractAllProductVariantsIds = ( + productVariants: ProductDetails_product_variants[] = [] +) => productVariants.map(({ id }) => id); + +export const areAllVariantsAtAllChannelsSelected = ( + variants: ProductDetails_product_variants[] = [], + channelsWithVariants: ChannelsWithVariantsData = {} +) => + every(channelsWithVariants, channelWithVariantsData => + areAllChannelVariantsSelected(variants, channelWithVariantsData) + ); + +export const areAllChannelVariantsSelected = ( + variants: ProductDetails_product_variants[] = [], + { selectedVariantsIds }: Pick +) => selectedVariantsIds.length === variants.length; + +export const areAnyChannelVariantsSelected = ( + channelsWithVariantsData: ChannelWithVariantData +) => channelsWithVariantsData?.selectedVariantsIds.length > 0; + +export const getTotalSelectedChannelsCount = ( + channelsWithVariantsData: ChannelsWithVariantsData +) => + reduce( + channelsWithVariantsData, + (result, { selectedVariantsIds }) => + selectedVariantsIds.length ? result + 1 : result, + 0 + ); diff --git a/src/searches/types/SearchShippingZones.ts b/src/searches/types/SearchShippingZones.ts new file mode 100644 index 000000000..ccef17280 --- /dev/null +++ b/src/searches/types/SearchShippingZones.ts @@ -0,0 +1,46 @@ +/* tslint:disable */ +/* eslint-disable */ +// @generated +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: SearchShippingZones +// ==================================================== + +export interface SearchShippingZones_search_edges_node { + __typename: "ShippingZone"; + id: string; + name: string; +} + +export interface SearchShippingZones_search_edges { + __typename: "ShippingZoneCountableEdge"; + node: SearchShippingZones_search_edges_node; +} + +export interface SearchShippingZones_search_pageInfo { + __typename: "PageInfo"; + endCursor: string | null; + hasNextPage: boolean; + hasPreviousPage: boolean; + startCursor: string | null; +} + +export interface SearchShippingZones_search { + __typename: "ShippingZoneCountableConnection"; + totalCount: number | null; + edges: SearchShippingZones_search_edges[]; + pageInfo: SearchShippingZones_search_pageInfo; +} + +export interface SearchShippingZones { + search: SearchShippingZones_search | null; +} + +export interface SearchShippingZonesVariables { + query: string; + first: number; + after?: string | null; + last?: number | null; + before?: string | null; +} diff --git a/src/searches/useShippingZonesSearch.ts b/src/searches/useShippingZonesSearch.ts new file mode 100644 index 000000000..71e075c6d --- /dev/null +++ b/src/searches/useShippingZonesSearch.ts @@ -0,0 +1,43 @@ +import { pageInfoFragment } from "@saleor/fragments/pageInfo"; +import makeTopLevelSearch from "@saleor/hooks/makeTopLevelSearch"; +import gql from "graphql-tag"; + +import { + SearchShippingZones, + SearchShippingZonesVariables +} from "./types/SearchShippingZones"; + +const searchShippingZones = gql` + ${pageInfoFragment} + query SearchShippingZones( + $query: String! + $first: Int! + $after: String + $last: Int + $before: String + ) { + search: shippingZones( + filter: { search: $query } + first: $first + after: $after + last: $last + before: $before + ) { + totalCount + edges { + node { + id + name + } + } + pageInfo { + ...PageInfoFragment + } + } + } +`; + +export default makeTopLevelSearch< + SearchShippingZones, + SearchShippingZonesVariables +>(searchShippingZones); diff --git a/src/shipping/components/ShippingZoneDetailsPage/ShippingZoneDetailsPage.tsx b/src/shipping/components/ShippingZoneDetailsPage/ShippingZoneDetailsPage.tsx index 6c3cd0252..957cb5732 100644 --- a/src/shipping/components/ShippingZoneDetailsPage/ShippingZoneDetailsPage.tsx +++ b/src/shipping/components/ShippingZoneDetailsPage/ShippingZoneDetailsPage.tsx @@ -1,3 +1,4 @@ +import { Channels_channels } from "@saleor/channels/types/Channels"; import AppHeader from "@saleor/components/AppHeader"; import CardSpacer from "@saleor/components/CardSpacer"; import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; @@ -6,20 +7,17 @@ import CountryList from "@saleor/components/CountryList"; import Form from "@saleor/components/Form"; import Grid from "@saleor/components/Grid"; import Metadata from "@saleor/components/Metadata/Metadata"; -import { MetadataFormData } from "@saleor/components/Metadata/types"; import { MultiAutocompleteChoiceType } from "@saleor/components/MultiAutocompleteSelectField"; import PageHeader from "@saleor/components/PageHeader"; import SaveButtonBar from "@saleor/components/SaveButtonBar"; import { SingleAutocompleteChoiceType } from "@saleor/components/SingleAutocompleteSelectField"; import { ShippingErrorFragment } from "@saleor/fragments/types/ShippingErrorFragment"; -import { - ShippingZoneDetailsFragment, - ShippingZoneDetailsFragment_warehouses -} from "@saleor/fragments/types/ShippingZoneDetailsFragment"; +import { ShippingZoneDetailsFragment_warehouses } from "@saleor/fragments/types/ShippingZoneDetailsFragment"; import { SubmitPromise } from "@saleor/hooks/useForm"; import useStateFromProps from "@saleor/hooks/useStateFromProps"; +import { ShippingZone_shippingZone } from "@saleor/shipping/types/ShippingZone"; import createMultiAutocompleteSelectHandler from "@saleor/utils/handlers/multiAutocompleteSelectChangeHandler"; -import { mapMetadataItemToInput } from "@saleor/utils/maps"; +import { mapNodeToChoice } from "@saleor/utils/maps"; import useMetadataChangeTrigger from "@saleor/utils/metadata/useMetadataChangeTrigger"; import React from "react"; import { defineMessages, FormattedMessage, useIntl } from "react-intl"; @@ -27,15 +25,11 @@ import { defineMessages, FormattedMessage, useIntl } from "react-intl"; import { getStringOrPlaceholder } from "../../../misc"; import { ChannelProps, FetchMoreProps, SearchProps } from "../../../types"; import { ShippingMethodTypeEnum } from "../../../types/globalTypes"; +import { FormData } from "../../components/ShippingZoneDetailsPage/types"; import ShippingZoneInfo from "../ShippingZoneInfo"; import ShippingZoneRates from "../ShippingZoneRates"; -import ShippingZoneWarehouses from "../ShippingZoneWarehouses"; - -export interface FormData extends MetadataFormData { - name: string; - description: string; - warehouses: string[]; -} +import ShippingZoneSettingsCard from "../ShippingZoneSettingsCard"; +import { getInitialFormData } from "./utils"; const messages = defineMessages({ countries: { @@ -63,7 +57,7 @@ export interface ShippingZoneDetailsPageProps disabled: boolean; errors: ShippingErrorFragment[]; saveButtonBarState: ConfirmButtonTransitionState; - shippingZone: ShippingZoneDetailsFragment; + shippingZone: ShippingZone_shippingZone; warehouses: ShippingZoneDetailsFragment_warehouses[]; onBack: () => void; onCountryAdd: () => void; @@ -76,6 +70,7 @@ export interface ShippingZoneDetailsPageProps onWarehouseAdd: () => void; onWeightRateAdd: () => void; onWeightRateEdit: (id: string) => void; + allChannels?: Channels_channels[]; } function warehouseToChoice( @@ -108,28 +103,25 @@ const ShippingZoneDetailsPage: React.FC = ({ saveButtonBarState, selectedChannelId, shippingZone, - warehouses + warehouses, + allChannels }) => { const intl = useIntl(); - const initialForm: FormData = { - description: shippingZone?.description || "", - metadata: shippingZone?.metadata.map(mapMetadataItemToInput), - name: shippingZone?.name || "", - privateMetadata: shippingZone?.privateMetadata.map(mapMetadataItemToInput), - warehouses: shippingZone?.warehouses?.map(warehouse => warehouse.id) || [] - }; + const initialForm = getInitialFormData(shippingZone); + const [warehouseDisplayValues, setWarehouseDisplayValues] = useStateFromProps< MultiAutocompleteChoiceType[] - >( - shippingZone?.warehouses?.map(warehouse => ({ - label: warehouse.name, - value: warehouse.id - })) || [] - ); + >(mapNodeToChoice(shippingZone?.warehouses)); const warehouseChoices = warehouses.map(warehouseToChoice); + const channelChoices = mapNodeToChoice(allChannels); + + const [channelsDisplayValues, setChannelDisplayValues] = useStateFromProps< + MultiAutocompleteChoiceType[] + >(mapNodeToChoice(shippingZone?.channels)); + const { makeChangeHandler: makeMetadataChangeHandler } = useMetadataChangeTrigger(); @@ -144,6 +136,13 @@ const ShippingZoneDetailsPage: React.FC = ({ warehouseChoices ); + const handleChannelChange = createMultiAutocompleteSelectHandler( + toggleValue, + setChannelDisplayValues, + channelsDisplayValues, + channelChoices + ); + const changeMetadata = makeMetadataChangeHandler(change); return ( @@ -205,16 +204,19 @@ const ShippingZoneDetailsPage: React.FC = ({
-
diff --git a/src/shipping/components/ShippingZoneDetailsPage/types.ts b/src/shipping/components/ShippingZoneDetailsPage/types.ts new file mode 100644 index 000000000..0b0e50515 --- /dev/null +++ b/src/shipping/components/ShippingZoneDetailsPage/types.ts @@ -0,0 +1,8 @@ +import { MetadataFormData } from "@saleor/components/Metadata"; + +export interface FormData extends MetadataFormData { + name: string; + description: string; + warehouses: string[]; + channels: string[]; +} diff --git a/src/shipping/components/ShippingZoneDetailsPage/utils.ts b/src/shipping/components/ShippingZoneDetailsPage/utils.ts new file mode 100644 index 000000000..320a3a362 --- /dev/null +++ b/src/shipping/components/ShippingZoneDetailsPage/utils.ts @@ -0,0 +1,15 @@ +import { ShippingZone_shippingZone } from "@saleor/shipping/types/ShippingZone"; +import { mapMetadataItemToInput } from "@saleor/utils/maps"; + +import { FormData } from "./types"; + +export const getInitialFormData = ( + shippingZone?: ShippingZone_shippingZone +): FormData => ({ + description: shippingZone?.description || "", + metadata: shippingZone?.metadata.map(mapMetadataItemToInput), + name: shippingZone?.name || "", + privateMetadata: shippingZone?.privateMetadata.map(mapMetadataItemToInput), + warehouses: shippingZone?.warehouses?.map(warehouse => warehouse.id) || [], + channels: shippingZone?.channels.map(({ id }) => id) || [] +}); diff --git a/src/shipping/components/ShippingZoneRatesCreatePage/ShippingZoneRatesCreatePage.tsx b/src/shipping/components/ShippingZoneRatesCreatePage/ShippingZoneRatesCreatePage.tsx index 23ffab72b..428b57064 100644 --- a/src/shipping/components/ShippingZoneRatesCreatePage/ShippingZoneRatesCreatePage.tsx +++ b/src/shipping/components/ShippingZoneRatesCreatePage/ShippingZoneRatesCreatePage.tsx @@ -1,7 +1,7 @@ import { ChannelShippingData } from "@saleor/channels/utils"; import AppHeader from "@saleor/components/AppHeader"; import CardSpacer from "@saleor/components/CardSpacer"; -import ChannelsAvailability from "@saleor/components/ChannelsAvailability"; +import ChannelsAvailabilityCard from "@saleor/components/ChannelsAvailabilityCard"; import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import Container from "@saleor/components/Container"; import Form from "@saleor/components/Form"; @@ -166,13 +166,10 @@ export const ShippingZoneRatesCreatePage: React.FC
- ({ - id: channel.id, - name: channel.name - }))} + channelsList={data.channelListings} openModal={openChannelsModal} />
diff --git a/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.tsx b/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.tsx index 91993979a..09e4eb775 100644 --- a/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.tsx +++ b/src/shipping/components/ShippingZoneRatesPage/ShippingZoneRatesPage.tsx @@ -1,7 +1,7 @@ import { ChannelShippingData } from "@saleor/channels/utils"; import AppHeader from "@saleor/components/AppHeader"; import CardSpacer from "@saleor/components/CardSpacer"; -import ChannelsAvailability from "@saleor/components/ChannelsAvailability"; +import ChannelsAvailabilityCard from "@saleor/components/ChannelsAvailabilityCard"; import { ConfirmButtonTransitionState } from "@saleor/components/ConfirmButton"; import Container from "@saleor/components/Container"; import Form from "@saleor/components/Form"; @@ -196,7 +196,7 @@ export const ShippingZoneRatesPage: React.FC = ({
- ({ diff --git a/src/shipping/components/ShippingZoneSettingsCard/ChannelsSection.tsx b/src/shipping/components/ShippingZoneSettingsCard/ChannelsSection.tsx new file mode 100644 index 000000000..4263af986 --- /dev/null +++ b/src/shipping/components/ShippingZoneSettingsCard/ChannelsSection.tsx @@ -0,0 +1,67 @@ +import { useChannelsSearch } from "@saleor/channels/components/ChannelsAvailabilityDialog/utils"; +import { Channels_channels } from "@saleor/channels/types/Channels"; +import CardSpacer from "@saleor/components/CardSpacer"; +import MultiAutocompleteSelectField, { + MultiAutocompleteChoiceType +} from "@saleor/components/MultiAutocompleteSelectField"; +import { FormChange } from "@saleor/hooks/useForm"; +import { mapNodeToChoice } from "@saleor/utils/maps"; +import React from "react"; +import { useIntl } from "react-intl"; +import { defineMessages, FormattedMessage } from "react-intl"; + +const messages = defineMessages({ + subtitle: { + defaultMessage: + "Assign channels to this shipping zone so we know which orders will be supported", + description: "ChannelsSection subtitle" + }, + selectFieldLabel: { + defaultMessage: "Channel", + description: "ChannelsSection select field label", + id: "shippingZoneChannels.autocomplete.label" + }, + selectFieldPlaceholder: { + defaultMessage: "Add Channel", + description: "ChannelsSection select field placeholder" + } +}); + +interface ChannelsSectionProps { + onChange: FormChange; + selectedChannels: string[]; + allChannels?: Channels_channels[]; + channelsDisplayValues: MultiAutocompleteChoiceType[]; +} + +const ChannelsSection: React.FC = ({ + onChange, + allChannels = [], + selectedChannels, + channelsDisplayValues +}) => { + const { onQueryChange, filteredChannels } = useChannelsSearch(allChannels); + + const intl = useIntl(); + + return ( + <> + + + + + ); +}; + +export default ChannelsSection; diff --git a/src/shipping/components/ShippingZoneSettingsCard/ShippingZoneSettingsCard.stories.tsx b/src/shipping/components/ShippingZoneSettingsCard/ShippingZoneSettingsCard.stories.tsx new file mode 100644 index 000000000..b65516d0b --- /dev/null +++ b/src/shipping/components/ShippingZoneSettingsCard/ShippingZoneSettingsCard.stories.tsx @@ -0,0 +1,61 @@ +import { Channels_channels } from "@saleor/channels/types/Channels"; +import CentralPlacementDecorator from "@saleor/storybook/CentralPlacementDecorator"; +import CommonDecorator from "@saleor/storybook/Decorator"; +import { storiesOf } from "@storybook/react"; +import React from "react"; + +import { FormData } from "../../components/ShippingZoneDetailsPage/types"; +import ShippingZoneSettingsCard, { + ShippingZoneSettingsCardProps +} from "./ShippingZoneSettingsCard"; + +const props: ShippingZoneSettingsCardProps = { + formData: { + channels: ["channel1"], + warehouses: ["warehouse1", "warehouse2"] + } as FormData, + warehousesDisplayValues: [ + { + value: "warehouse1", + label: "Asia Warehouse" + }, + { + value: "warehouse2", + label: "Europe Warehouse" + } + ], + hasMoreWarehouses: false, + loading: false, + onWarehouseChange: () => undefined, + onFetchMoreWarehouses: () => undefined, + onWarehousesSearchChange: () => undefined, + onWarehouseAdd: () => undefined, + warehousesChoices: [ + { + value: "warehouse1", + label: "C our wares" + }, + { + value: "warehouse2", + label: "Be stocked" + } + ], + allChannels: [ + { __typename: "Channel", id: "channel1", name: "GBP" }, + + { __typename: "Channel", id: "channel2", name: "PLN" }, + { __typename: "Channel", id: "channel3", name: "USD" } + ] as Channels_channels[], + channelsDisplayValues: [ + { + value: "channel1", + label: "GBP" + } + ], + onChannelChange: () => undefined +}; + +storiesOf("Shipping zones details / Settings Card", module) + .addDecorator(CommonDecorator) + .addDecorator(CentralPlacementDecorator) + .add("default", () => ); diff --git a/src/shipping/components/ShippingZoneSettingsCard/ShippingZoneSettingsCard.tsx b/src/shipping/components/ShippingZoneSettingsCard/ShippingZoneSettingsCard.tsx new file mode 100644 index 000000000..7fe76d417 --- /dev/null +++ b/src/shipping/components/ShippingZoneSettingsCard/ShippingZoneSettingsCard.tsx @@ -0,0 +1,93 @@ +import { Divider } from "@material-ui/core"; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { Channels_channels } from "@saleor/channels/types/Channels"; +import CardTitle from "@saleor/components/CardTitle"; +import { MultiAutocompleteChoiceType } from "@saleor/components/MultiAutocompleteSelectField"; +import Skeleton from "@saleor/components/Skeleton"; +import { FormChange } from "@saleor/hooks/useForm"; +import React from "react"; +import { defineMessages, useIntl } from "react-intl"; + +import { FormData } from "../../components/ShippingZoneDetailsPage/types"; +import ChannelsSection from "./ChannelsSection"; +import WarehousesSection from "./WarehousesSection"; + +const messages = defineMessages({ + title: { + defaultMessage: "Settings", + description: "ShippingZoneSettingsCard title" + } +}); + +export interface ShippingZoneSettingsCardProps { + formData: FormData; + warehousesDisplayValues: MultiAutocompleteChoiceType[]; + warehousesChoices: MultiAutocompleteChoiceType[]; + onWarehouseAdd: () => void; + onWarehouseChange: FormChange; + hasMoreWarehouses: boolean; + onFetchMoreWarehouses: () => void; + onWarehousesSearchChange: (query: string) => void; + channelsDisplayValues: MultiAutocompleteChoiceType[]; + onChannelChange: FormChange; + allChannels?: Channels_channels[]; + loading: boolean; +} + +export const ShippingZoneSettingsCard: React.FC = ({ + formData, + warehousesDisplayValues, + hasMoreWarehouses, + loading, + warehousesChoices, + onFetchMoreWarehouses, + onWarehousesSearchChange, + onWarehouseAdd, + onWarehouseChange, + allChannels, + onChannelChange, + channelsDisplayValues +}) => { + const intl = useIntl(); + + return ( + + + {loading && ( + + + + )} + + {!loading && ( + <> + + + + + + + + + )} + + ); +}; + +export default ShippingZoneSettingsCard; diff --git a/src/shipping/components/ShippingZoneSettingsCard/WarehousesSection.tsx b/src/shipping/components/ShippingZoneSettingsCard/WarehousesSection.tsx new file mode 100644 index 000000000..b3cb4d60e --- /dev/null +++ b/src/shipping/components/ShippingZoneSettingsCard/WarehousesSection.tsx @@ -0,0 +1,78 @@ +import CardSpacer from "@saleor/components/CardSpacer"; +import MultiAutocompleteSelectField, { + MultiAutocompleteChoiceType +} from "@saleor/components/MultiAutocompleteSelectField"; +import { FormChange } from "@saleor/hooks/useForm"; +import { FetchMoreProps, SearchProps } from "@saleor/types"; +import React from "react"; +import { useIntl } from "react-intl"; +import { defineMessages, FormattedMessage } from "react-intl"; + +const messages = defineMessages({ + subtitle: { + defaultMessage: + "Select warehouse from which you will ship products for this shipping zone. This warehouse address will also be used to calculate taxes.", + description: "WarehousesSection subtitle" + }, + selectFieldAddText: { + defaultMessage: "Add New Warehouse", + description: "WarehousesSection select field add text" + }, + selectFieldLabel: { + defaultMessage: "Warehouse", + description: "WarehousesSection select field label", + id: "shippingZoneWarehouses.autocomplete.label" + }, + selectFieldPlaceholder: { + defaultMessage: "Select Warehouse", + description: "WarehousesSection select field placeholder" + } +}); + +interface WarehousesSectionProps extends FetchMoreProps, SearchProps { + displayValues: MultiAutocompleteChoiceType[]; + choices: MultiAutocompleteChoiceType[]; + onChange: FormChange; + onAdd: () => void; + selectedWarehouses: string[]; +} + +const WarehousesSection: React.FC = ({ + onAdd, + onSearchChange, + onChange, + onFetchMore, + displayValues, + choices, + selectedWarehouses, + hasMore, + loading +}) => { + const intl = useIntl(); + + return ( + <> + + + + + ); +}; + +export default WarehousesSection; diff --git a/src/shipping/components/ShippingZoneSettingsCard/index.ts b/src/shipping/components/ShippingZoneSettingsCard/index.ts new file mode 100644 index 000000000..61a4f0d9e --- /dev/null +++ b/src/shipping/components/ShippingZoneSettingsCard/index.ts @@ -0,0 +1,2 @@ +export * from "./ShippingZoneSettingsCard"; +export { default } from "./ShippingZoneSettingsCard"; diff --git a/src/shipping/components/ShippingZoneWarehouses/ShippingZoneWarehouses.tsx b/src/shipping/components/ShippingZoneWarehouses/ShippingZoneWarehouses.tsx deleted file mode 100644 index 2db7806bb..000000000 --- a/src/shipping/components/ShippingZoneWarehouses/ShippingZoneWarehouses.tsx +++ /dev/null @@ -1,82 +0,0 @@ -import Card from "@material-ui/core/Card"; -import CardContent from "@material-ui/core/CardContent"; -import CardTitle from "@saleor/components/CardTitle"; -import MultiAutocompleteSelectField, { - MultiAutocompleteChoiceType -} from "@saleor/components/MultiAutocompleteSelectField"; -import { FormChange } from "@saleor/hooks/useForm"; -import { FetchMoreProps, SearchProps } from "@saleor/types"; -import React from "react"; -import { useIntl } from "react-intl"; - -interface ShippingZoneWarehousesFormData { - warehouses: string[]; -} -interface ShippingZonewWarehousesProps extends FetchMoreProps, SearchProps { - data: ShippingZoneWarehousesFormData; - displayValues: MultiAutocompleteChoiceType[]; - warehouses: MultiAutocompleteChoiceType[]; - onChange: FormChange; - onWarehouseAdd: () => void; -} - -export const ShippingZoneWarehouses: React.FC = props => { - const { - data, - displayValues, - hasMore, - loading, - warehouses, - onChange, - onFetchMore, - onSearchChange, - onWarehouseAdd - } = props; - const intl = useIntl(); - - return ( - - - - - - - ); -}; -ShippingZoneWarehouses.displayName = "ShippingZoneWarehouses"; -export default ShippingZoneWarehouses; diff --git a/src/shipping/components/ShippingZoneWarehouses/index.ts b/src/shipping/components/ShippingZoneWarehouses/index.ts deleted file mode 100644 index 9719aa5e7..000000000 --- a/src/shipping/components/ShippingZoneWarehouses/index.ts +++ /dev/null @@ -1,2 +0,0 @@ -export { default } from "./ShippingZoneWarehouses"; -export * from "./ShippingZoneWarehouses"; diff --git a/src/shipping/fixtures.ts b/src/shipping/fixtures.ts index e213c1c00..ddda3b108 100644 --- a/src/shipping/fixtures.ts +++ b/src/shipping/fixtures.ts @@ -1304,6 +1304,11 @@ export const shippingZones: ShippingZoneFragment[] = [ export const shippingZone: ShippingZone_shippingZone = { __typename: "ShippingZone", + channels: [ + { __typename: "Channel", id: "channel1", name: "GBP", currencyCode: "GBP" }, + + { __typename: "Channel", id: "channel2", name: "PLN", currencyCode: "PLN" } + ], countries: [ { __typename: "CountryDisplay", diff --git a/src/shipping/queries.ts b/src/shipping/queries.ts index 5d288d90c..aa11c5b06 100644 --- a/src/shipping/queries.ts +++ b/src/shipping/queries.ts @@ -7,6 +7,10 @@ import makeQuery from "@saleor/hooks/makeQuery"; import gql from "graphql-tag"; import { ShippingZone, ShippingZoneVariables } from "./types/ShippingZone"; +import { + ShippingZoneChannels, + ShippingZoneChannelsVariables +} from "./types/ShippingZoneChannels"; import { ShippingZones, ShippingZonesVariables } from "./types/ShippingZones"; const shippingZones = gql` @@ -51,6 +55,11 @@ const shippingZone = gql` shippingMethods { ...ShippingMethodWithExcludedProductsFragment } + channels { + id + name + currencyCode + } warehouses { id name @@ -61,3 +70,21 @@ const shippingZone = gql` export const useShippingZone = makeQuery( shippingZone ); + +const shippingZoneChannels = gql` + query ShippingZoneChannels($id: ID!) { + shippingZone(id: $id) { + id + channels { + id + name + currencyCode + } + } + } +`; + +export const useShippingZoneChannels = makeQuery< + ShippingZoneChannels, + ShippingZoneChannelsVariables +>(shippingZoneChannels); diff --git a/src/shipping/types/CreateShippingRate.ts b/src/shipping/types/CreateShippingRate.ts index b6b5ac8b6..d30d5d860 100644 --- a/src/shipping/types/CreateShippingRate.ts +++ b/src/shipping/types/CreateShippingRate.ts @@ -130,7 +130,7 @@ export interface CreateShippingRate_shippingPriceCreate_shippingZone { description: string | null; default: boolean; shippingMethods: (CreateShippingRate_shippingPriceCreate_shippingZone_shippingMethods | null)[] | null; - warehouses: (CreateShippingRate_shippingPriceCreate_shippingZone_warehouses | null)[] | null; + warehouses: CreateShippingRate_shippingPriceCreate_shippingZone_warehouses[]; } export interface CreateShippingRate_shippingPriceCreate_shippingMethod_postalCodeRules { diff --git a/src/shipping/types/DeleteShippingRate.ts b/src/shipping/types/DeleteShippingRate.ts index ebbfeed7f..19810e3e5 100644 --- a/src/shipping/types/DeleteShippingRate.ts +++ b/src/shipping/types/DeleteShippingRate.ts @@ -130,7 +130,7 @@ export interface DeleteShippingRate_shippingPriceDelete_shippingZone { description: string | null; default: boolean; shippingMethods: (DeleteShippingRate_shippingPriceDelete_shippingZone_shippingMethods | null)[] | null; - warehouses: (DeleteShippingRate_shippingPriceDelete_shippingZone_warehouses | null)[] | null; + warehouses: DeleteShippingRate_shippingPriceDelete_shippingZone_warehouses[]; } export interface DeleteShippingRate_shippingPriceDelete { diff --git a/src/shipping/types/ShippingZone.ts b/src/shipping/types/ShippingZone.ts index 635715557..f11346d50 100644 --- a/src/shipping/types/ShippingZone.ts +++ b/src/shipping/types/ShippingZone.ts @@ -140,6 +140,13 @@ export interface ShippingZone_shippingZone_shippingMethods { excludedProducts: ShippingZone_shippingZone_shippingMethods_excludedProducts | null; } +export interface ShippingZone_shippingZone_channels { + __typename: "Channel"; + id: string; + name: string; + currencyCode: string; +} + export interface ShippingZone_shippingZone_warehouses { __typename: "Warehouse"; id: string; @@ -156,7 +163,8 @@ export interface ShippingZone_shippingZone { description: string | null; default: boolean; shippingMethods: (ShippingZone_shippingZone_shippingMethods | null)[] | null; - warehouses: (ShippingZone_shippingZone_warehouses | null)[] | null; + channels: ShippingZone_shippingZone_channels[]; + warehouses: ShippingZone_shippingZone_warehouses[]; } export interface ShippingZone { diff --git a/src/shipping/types/ShippingZoneChannels.ts b/src/shipping/types/ShippingZoneChannels.ts new file mode 100644 index 000000000..5a5dbed33 --- /dev/null +++ b/src/shipping/types/ShippingZoneChannels.ts @@ -0,0 +1,29 @@ +/* tslint:disable */ +/* eslint-disable */ +// @generated +// This file was automatically generated and should not be edited. + +// ==================================================== +// GraphQL query operation: ShippingZoneChannels +// ==================================================== + +export interface ShippingZoneChannels_shippingZone_channels { + __typename: "Channel"; + id: string; + name: string; + currencyCode: string; +} + +export interface ShippingZoneChannels_shippingZone { + __typename: "ShippingZone"; + id: string; + channels: ShippingZoneChannels_shippingZone_channels[]; +} + +export interface ShippingZoneChannels { + shippingZone: ShippingZoneChannels_shippingZone | null; +} + +export interface ShippingZoneChannelsVariables { + id: string; +} diff --git a/src/shipping/types/ShippingZoneDetails.ts b/src/shipping/types/ShippingZoneDetails.ts new file mode 100644 index 000000000..0fd16d10a --- /dev/null +++ b/src/shipping/types/ShippingZoneDetails.ts @@ -0,0 +1,176 @@ +/* tslint:disable */ +/* eslint-disable */ +// @generated +// This file was automatically generated and should not be edited. + +import { PostalCodeRuleInclusionTypeEnum, WeightUnitsEnum, ShippingMethodTypeEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: ShippingZoneDetails +// ==================================================== + +export interface ShippingZoneDetails_shippingZone_metadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface ShippingZoneDetails_shippingZone_privateMetadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface ShippingZoneDetails_shippingZone_countries { + __typename: "CountryDisplay"; + code: string; + country: string; +} + +export interface ShippingZoneDetails_shippingZone_shippingMethods_postalCodeRules { + __typename: "ShippingMethodPostalCodeRule"; + id: string; + inclusionType: PostalCodeRuleInclusionTypeEnum | null; + start: string | null; + end: string | null; +} + +export interface ShippingZoneDetails_shippingZone_shippingMethods_metadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface ShippingZoneDetails_shippingZone_shippingMethods_privateMetadata { + __typename: "MetadataItem"; + key: string; + value: string; +} + +export interface ShippingZoneDetails_shippingZone_shippingMethods_minimumOrderWeight { + __typename: "Weight"; + unit: WeightUnitsEnum; + value: number; +} + +export interface ShippingZoneDetails_shippingZone_shippingMethods_maximumOrderWeight { + __typename: "Weight"; + unit: WeightUnitsEnum; + value: number; +} + +export interface ShippingZoneDetails_shippingZone_shippingMethods_channelListings_channel { + __typename: "Channel"; + id: string; + name: string; + currencyCode: string; +} + +export interface ShippingZoneDetails_shippingZone_shippingMethods_channelListings_price { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ShippingZoneDetails_shippingZone_shippingMethods_channelListings_minimumOrderPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ShippingZoneDetails_shippingZone_shippingMethods_channelListings_maximumOrderPrice { + __typename: "Money"; + amount: number; + currency: string; +} + +export interface ShippingZoneDetails_shippingZone_shippingMethods_channelListings { + __typename: "ShippingMethodChannelListing"; + id: string; + channel: ShippingZoneDetails_shippingZone_shippingMethods_channelListings_channel; + price: ShippingZoneDetails_shippingZone_shippingMethods_channelListings_price | null; + minimumOrderPrice: ShippingZoneDetails_shippingZone_shippingMethods_channelListings_minimumOrderPrice | null; + maximumOrderPrice: ShippingZoneDetails_shippingZone_shippingMethods_channelListings_maximumOrderPrice | null; +} + +export interface ShippingZoneDetails_shippingZone_shippingMethods_excludedProducts_pageInfo { + __typename: "PageInfo"; + hasNextPage: boolean; + hasPreviousPage: boolean; + endCursor: string | null; + startCursor: string | null; +} + +export interface ShippingZoneDetails_shippingZone_shippingMethods_excludedProducts_edges_node_thumbnail { + __typename: "Image"; + url: string; +} + +export interface ShippingZoneDetails_shippingZone_shippingMethods_excludedProducts_edges_node { + __typename: "Product"; + id: string; + name: string; + thumbnail: ShippingZoneDetails_shippingZone_shippingMethods_excludedProducts_edges_node_thumbnail | null; +} + +export interface ShippingZoneDetails_shippingZone_shippingMethods_excludedProducts_edges { + __typename: "ProductCountableEdge"; + node: ShippingZoneDetails_shippingZone_shippingMethods_excludedProducts_edges_node; +} + +export interface ShippingZoneDetails_shippingZone_shippingMethods_excludedProducts { + __typename: "ProductCountableConnection"; + pageInfo: ShippingZoneDetails_shippingZone_shippingMethods_excludedProducts_pageInfo; + edges: ShippingZoneDetails_shippingZone_shippingMethods_excludedProducts_edges[]; +} + +export interface ShippingZoneDetails_shippingZone_shippingMethods { + __typename: "ShippingMethod"; + id: string; + postalCodeRules: (ShippingZoneDetails_shippingZone_shippingMethods_postalCodeRules | null)[] | null; + metadata: (ShippingZoneDetails_shippingZone_shippingMethods_metadata | null)[]; + privateMetadata: (ShippingZoneDetails_shippingZone_shippingMethods_privateMetadata | null)[]; + minimumOrderWeight: ShippingZoneDetails_shippingZone_shippingMethods_minimumOrderWeight | null; + maximumOrderWeight: ShippingZoneDetails_shippingZone_shippingMethods_maximumOrderWeight | null; + minimumDeliveryDays: number | null; + maximumDeliveryDays: number | null; + name: string; + type: ShippingMethodTypeEnum | null; + channelListings: ShippingZoneDetails_shippingZone_shippingMethods_channelListings[] | null; + excludedProducts: ShippingZoneDetails_shippingZone_shippingMethods_excludedProducts | null; +} + +export interface ShippingZoneDetails_shippingZone_channels { + __typename: "Channel"; + id: string; + name: string; + currencyCode: string; +} + +export interface ShippingZoneDetails_shippingZone_warehouses { + __typename: "Warehouse"; + id: string; + name: string; +} + +export interface ShippingZoneDetails_shippingZone { + __typename: "ShippingZone"; + metadata: (ShippingZoneDetails_shippingZone_metadata | null)[]; + privateMetadata: (ShippingZoneDetails_shippingZone_privateMetadata | null)[]; + id: string; + countries: (ShippingZoneDetails_shippingZone_countries | null)[] | null; + name: string; + description: string | null; + default: boolean; + shippingMethods: (ShippingZoneDetails_shippingZone_shippingMethods | null)[] | null; + channels: ShippingZoneDetails_shippingZone_channels[]; + warehouses: ShippingZoneDetails_shippingZone_warehouses[]; +} + +export interface ShippingZoneDetails { + shippingZone: ShippingZoneDetails_shippingZone | null; +} + +export interface ShippingZoneDetailsVariables { + id: string; +} diff --git a/src/shipping/views/PriceRatesCreate/PriceRatesCreate.tsx b/src/shipping/views/PriceRatesCreate/PriceRatesCreate.tsx index 7410a393c..4f84fd0fd 100644 --- a/src/shipping/views/PriceRatesCreate/PriceRatesCreate.tsx +++ b/src/shipping/views/PriceRatesCreate/PriceRatesCreate.tsx @@ -1,4 +1,3 @@ -import { useChannelsList } from "@saleor/channels/queries"; import { createSortedShippingChannels } from "@saleor/channels/utils"; import ChannelsAvailabilityDialog from "@saleor/components/ChannelsAvailabilityDialog"; import { WindowTitle } from "@saleor/components/WindowTitle"; @@ -8,6 +7,7 @@ import { sectionNames } from "@saleor/intl"; import ShippingZonePostalCodeRangeDialog from "@saleor/shipping/components/ShippingZonePostalCodeRangeDialog"; import ShippingZoneRatesCreatePage from "@saleor/shipping/components/ShippingZoneRatesCreatePage"; import { useShippingRateCreator } from "@saleor/shipping/handlers"; +import { useShippingZoneChannels } from "@saleor/shipping/queries"; import { shippingPriceRatesUrl, ShippingRateCreateUrlDialog, @@ -41,14 +41,22 @@ export const PriceRatesCreate: React.FC = ({ const navigate = useNavigator(); const intl = useIntl(); - const { data: channelsData, loading: channelsLoading } = useChannelsList({}); - const [openModal, closeModal] = createDialogActionHandlers< ShippingRateCreateUrlDialog, ShippingRateCreateUrlQueryParams >(navigate, params => shippingPriceRatesUrl(id, params), params); - const allChannels = createSortedShippingChannels(channelsData?.channels); + const { + data: shippingZoneData, + loading: channelsLoading + } = useShippingZoneChannels({ + displayLoader: true, + variables: { id } + }); + + const allChannels = createSortedShippingChannels( + shippingZoneData?.shippingZone?.channels + ); const { channelListElements, diff --git a/src/shipping/views/PriceRatesUpdate/PriceRatesUpdate.tsx b/src/shipping/views/PriceRatesUpdate/PriceRatesUpdate.tsx index f6be75183..ec2113424 100644 --- a/src/shipping/views/PriceRatesUpdate/PriceRatesUpdate.tsx +++ b/src/shipping/views/PriceRatesUpdate/PriceRatesUpdate.tsx @@ -1,5 +1,4 @@ import Button from "@material-ui/core/Button"; -import { useChannelsList } from "@saleor/channels/queries"; import { createShippingChannelsFromRate, createSortedShippingChannels @@ -90,6 +89,8 @@ export const PriceRatesUpdate: React.FC = ({ variables: { id, ...paginationState } }); + const channelsData = data?.shippingZone?.channels; + const rate = data?.shippingZone?.shippingMethods?.find(getById(rateId)); const { @@ -113,8 +114,6 @@ export const PriceRatesUpdate: React.FC = ({ params ); - const { data: channelsData } = useChannelsList({}); - const [ updateShippingMethodChannelListing, updateShippingMethodChannelListingOpts @@ -145,7 +144,7 @@ export const PriceRatesUpdate: React.FC = ({ const shippingChannels = createShippingChannelsFromRate( rate?.channelListings ); - const allChannels = createSortedShippingChannels(channelsData?.channels); + const allChannels = createSortedShippingChannels(channelsData); const { channelListElements, diff --git a/src/shipping/views/ShippingZoneDetails/index.tsx b/src/shipping/views/ShippingZoneDetails/index.tsx index da13434f6..0fe06ce78 100644 --- a/src/shipping/views/ShippingZoneDetails/index.tsx +++ b/src/shipping/views/ShippingZoneDetails/index.tsx @@ -1,4 +1,5 @@ import DialogContentText from "@material-ui/core/DialogContentText"; +import { useChannelsList } from "@saleor/channels/queries"; import ActionDialog from "@saleor/components/ActionDialog"; import useAppChannel from "@saleor/components/AppLayout/AppChannelContext"; import NotFoundPage from "@saleor/components/NotFoundPage"; @@ -32,9 +33,8 @@ import { FormattedMessage, useIntl } from "react-intl"; import { findValueInEnum, getStringOrPlaceholder } from "../../../misc"; import { CountryCode } from "../../../types/globalTypes"; -import ShippingZoneDetailsPage, { - FormData -} from "../../components/ShippingZoneDetailsPage"; +import ShippingZoneDetailsPage from "../../components/ShippingZoneDetailsPage"; +import { FormData } from "../../components/ShippingZoneDetailsPage/types"; import { useShippingZone } from "../../queries"; import { shippingPriceRatesEditUrl, @@ -69,6 +69,8 @@ const ShippingZoneDetails: React.FC = ({ } ); + const { data: channelsList } = useChannelsList({}); + const { data, loading } = useShippingZone({ displayLoader: true, variables: { id, ...paginationState } @@ -138,11 +140,18 @@ const ShippingZoneDetails: React.FC = ({ submitData.warehouses ); + const channelsDiff = diff( + data.shippingZone.channels.map(channel => channel.id), + submitData.channels + ); + const result = await updateShippingZone({ variables: { id, input: { addWarehouses: warehouseDiff.added, + addChannels: channelsDiff.added, + removeChannels: channelsDiff.removed, description: submitData.description, name: submitData.name, removeWarehouses: warehouseDiff.removed @@ -187,6 +196,7 @@ const ShippingZoneDetails: React.FC = ({ }) } onSubmit={handleSubmit} + allChannels={channelsList?.channels} onWarehouseAdd={() => openModal("add-warehouse")} onWeightRateAdd={() => navigate(shippingWeightRatesUrl(id))} onWeightRateEdit={rateId => diff --git a/src/shipping/views/WeightRatesCreate/WeightRatesCreate.tsx b/src/shipping/views/WeightRatesCreate/WeightRatesCreate.tsx index 93bc558e6..59fb5bd80 100644 --- a/src/shipping/views/WeightRatesCreate/WeightRatesCreate.tsx +++ b/src/shipping/views/WeightRatesCreate/WeightRatesCreate.tsx @@ -1,4 +1,3 @@ -import { useChannelsList } from "@saleor/channels/queries"; import { createShippingChannels, createSortedShippingChannels @@ -11,6 +10,7 @@ import { sectionNames } from "@saleor/intl"; import ShippingZonePostalCodeRangeDialog from "@saleor/shipping/components/ShippingZonePostalCodeRangeDialog"; import ShippingZoneRatesCreatePage from "@saleor/shipping/components/ShippingZoneRatesCreatePage"; import { useShippingRateCreator } from "@saleor/shipping/handlers"; +import { useShippingZoneChannels } from "@saleor/shipping/queries"; import { ShippingRateCreateUrlDialog, ShippingRateCreateUrlQueryParams, @@ -44,15 +44,25 @@ export const WeightRatesCreate: React.FC = ({ const navigate = useNavigator(); const intl = useIntl(); - const { data: channelsData, loading: channelsLoading } = useChannelsList({}); + const { + data: shippingZoneData, + loading: channelsLoading + } = useShippingZoneChannels({ + displayLoader: true, + variables: { id } + }); const [openModal, closeModal] = createDialogActionHandlers< ShippingRateCreateUrlDialog, ShippingRateCreateUrlQueryParams >(navigate, params => shippingWeightRatesUrl(id, params), params); - const shippingChannels = createShippingChannels(channelsData?.channels); - const allChannels = createSortedShippingChannels(channelsData?.channels); + const shippingChannels = createShippingChannels( + shippingZoneData?.shippingZone?.channels + ); + const allChannels = createSortedShippingChannels( + shippingZoneData?.shippingZone?.channels + ); const { channelListElements, diff --git a/src/shipping/views/WeightRatesUpdate/WeightRatesUpdate.tsx b/src/shipping/views/WeightRatesUpdate/WeightRatesUpdate.tsx index 717cd5d0f..0f7cd5ab8 100644 --- a/src/shipping/views/WeightRatesUpdate/WeightRatesUpdate.tsx +++ b/src/shipping/views/WeightRatesUpdate/WeightRatesUpdate.tsx @@ -1,5 +1,4 @@ import Button from "@material-ui/core/Button"; -import { useChannelsList } from "@saleor/channels/queries"; import { createShippingChannelsFromRate, createSortedShippingChannels @@ -90,6 +89,8 @@ export const WeightRatesUpdate: React.FC = ({ variables: { id, ...paginationState } }); + const channelsData = data?.shippingZone?.channels; + const rate = data?.shippingZone?.shippingMethods?.find(getById(rateId)); const [openModal, closeModal] = createDialogActionHandlers< @@ -162,7 +163,6 @@ export const WeightRatesUpdate: React.FC = ({ params ); - const { data: channelsData } = useChannelsList({}); const [ updateShippingMethodChannelListing, updateShippingMethodChannelListingOpts @@ -194,7 +194,7 @@ export const WeightRatesUpdate: React.FC = ({ const shippingChannels = createShippingChannelsFromRate( rate?.channelListings ); - const allChannels = createSortedShippingChannels(channelsData?.channels); + const allChannels = createSortedShippingChannels(channelsData); const { channelListElements, diff --git a/src/storybook/CentralPlacementDecorator.tsx b/src/storybook/CentralPlacementDecorator.tsx new file mode 100644 index 000000000..7bbb6a32f --- /dev/null +++ b/src/storybook/CentralPlacementDecorator.tsx @@ -0,0 +1,18 @@ +import React from "react"; + +const CentralPlacementDecorator = storyFn => ( +
+ {storyFn()} +
+); +export default CentralPlacementDecorator; diff --git a/src/storybook/__snapshots__/Stories.test.ts.snap b/src/storybook/__snapshots__/Stories.test.ts.snap index 0e47bbde1..f65be766a 100644 --- a/src/storybook/__snapshots__/Stories.test.ts.snap +++ b/src/storybook/__snapshots__/Stories.test.ts.snap @@ -1339,6 +1339,833 @@ exports[`Storyshots Attributes / Delete multiple attributes default 1`] = ` /> `; +exports[`Storyshots Channels / Cannot define channels availability card default 1`] = ` +
+
+
+
+ + Availability + +
+
+
+
+
+ You will be able to define availability of product after creating variants. +
+
+
+
+`; + +exports[`Storyshots Channels / Channels with Variants Availability Dialog default 1`] = ` +
+`; + +exports[`Storyshots Channels / Channels with variants availability card default 1`] = ` +
+
+
+
+ + Availability + +
+
+
+
+
+
+ Available at 2 out of 3 channels +
+
+
+ +
+
+
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+ Set availability date +
+
+ +
+
+
+
+
+
+
+ +
+
+
+
+
+
+
+ + +
+
+
+
+
+ + +
+
+
+ Set availability date +
+
+ +
+
+
+
+
+
+
+
+
+
+`; + exports[`Storyshots Customers / Address editing dialog default 1`] = `
`; -exports[`Storyshots Generics / AvailabilityCard default 1`] = ` -
-
-
- - Availability - -
-
-
-
-
-
- Available at 3 out of 4 channels -
-
-
-
-
-
- Channel1 -
- -
-
- Visible since 07/14/2020 -
-
-
-
-
-
-
-
- Channel2 -
- -
-
- Will become available on 07/30/2020 -
-
-
-
-
-
-
-`; - exports[`Storyshots Generics / Card menu default 1`] = `
`; -exports[`Storyshots Generics / ChannelsAvailability default 1`] = ` +exports[`Storyshots Generics / Channels availability card default 1`] = `
@@ -2902,7 +3606,7 @@ exports[`Storyshots Generics / ChannelsAvailability default 1`] = `
`; -exports[`Storyshots Generics / ChannelsAvailability with onChange 1`] = ` +exports[`Storyshots Generics / Channels availability card with onChange 1`] = `
@@ -2952,83 +3656,737 @@ exports[`Storyshots Generics / ChannelsAvailability with onChange 1`] = ` class="Hr-root-id ChannelsAvailabilityCard-hr-id" />
-
-
+
+
+
+
+
+
+
+
+
+
+ + +
+
+
+ Set availability date +
+
+ +
+
+
+
+
+
+
+ -
@@ -3545,6 +4903,39 @@ exports[`Storyshots Generics / DateTime plain 1`] = `
`; +exports[`Storyshots Generics / Deletable Item default 1`] = ` +
+
+ +
+
+`; + exports[`Storyshots Generics / Delete filter tab default 1`] = `
`; +exports[`Storyshots Generics / Select with autocomplete naked 1`] = ` +
+
+
+ +
+ +
+ +
+
+
+`; + exports[`Storyshots Generics / Select with autocomplete no data 1`] = `
`; +exports[`Storyshots Shipping zones card with no options selected 1`] = ` +
+
+
+ + Shipping Zones + +
+
+
+
+
+
+ Select Shipping Zones that will be supplied via this channel. You can assign Shipping Zones to multiple channels. +
+
+
+
+ +
+
+
+
+
+
+
+
+ + Add Shipping Zones + + +
+
+
+
+
+
+
+
+`; + +exports[`Storyshots Shipping zones card with options selected 1`] = ` +
+
+
+ + Shipping Zones + +
+
+
+
+
+
+ Select Shipping Zones that will be supplied via this channel. You can assign Shipping Zones to multiple channels. +
+
+
+
+ +
+
+
+
+
+
+
+
+
+ Fancy shipping zone +
+
+ +
+
+
+
+
+ Nice shipping zone +
+
+ +
+
+
+
+ + Add Shipping Zones + + +
+
+
+
+
+
+
+
+`; + +exports[`Storyshots Shipping zones details / Settings Card default 1`] = ` +
+
+
+
+ + Settings + +
+
+
+
+
+ Assign channels to this shipping zone so we know which orders will be supported +
+
+
+ + +
+
+
+
+
+
+ GBP +
+ +
+
+
+
+
+
+ Select warehouse from which you will ship products for this shipping zone. This warehouse address will also be used to calculate taxes. +
+
+
+ + +
+
+
+
+
+
+ Asia Warehouse +
+ +
+
+
+
+
+ Europe Warehouse +
+ +
+
+
+
+
+
+
+`; + exports[`Storyshots Views / Apps / Activate app default 1`] = `
- Secrect Key + Secret Key @@ -22769,7 +24849,7 @@ exports[`Storyshots Views / Apps / Webhooks / Create webhook form errors 1`] = ` class="PrivateNotchedOutline-legendLabelled-id" > - Secrect Key + Secret Key @@ -24100,7 +26180,7 @@ exports[`Storyshots Views / Apps / Webhooks / Create webhook loading 1`] = ` class="PrivateNotchedOutline-legendLabelled-id" > - Secrect Key + Secret Key @@ -25492,7 +27572,7 @@ exports[`Storyshots Views / Apps / Webhooks / Webhook details default 1`] = ` class="PrivateNotchedOutline-legendLabelled-id PrivateNotchedOutline-legendNotched-id" > - Secrect Key + Secret Key @@ -26831,7 +28911,7 @@ exports[`Storyshots Views / Apps / Webhooks / Webhook details form errors 1`] = class="PrivateNotchedOutline-legendLabelled-id PrivateNotchedOutline-legendNotched-id" > - Secrect Key + Secret Key @@ -28168,7 +30248,7 @@ exports[`Storyshots Views / Apps / Webhooks / Webhook details loading 1`] = ` class="PrivateNotchedOutline-legendLabelled-id" > - Secrect Key + Secret Key @@ -29548,7 +31628,7 @@ exports[`Storyshots Views / Apps / Webhooks / Webhook details unnamed 1`] = ` class="PrivateNotchedOutline-legendLabelled-id PrivateNotchedOutline-legendNotched-id" > - Secrect Key + Secret Key @@ -47302,12 +49382,13 @@ exports[`Storyshots Views / Categories / Update category products 1`] = `
Gardner-Schultz
@@ -47387,12 +49468,13 @@ exports[`Storyshots Views / Categories / Update category products 1`] = `
James, Martinez and Murray
@@ -47472,12 +49554,13 @@ exports[`Storyshots Views / Categories / Update category products 1`] = `
Curtis, Joyce and Turner
@@ -47557,12 +49640,13 @@ exports[`Storyshots Views / Categories / Update category products 1`] = `
Davis, Brown and Ray
@@ -47642,12 +49726,13 @@ exports[`Storyshots Views / Categories / Update category products 1`] = `
Gallegos Ltd
@@ -47727,12 +49812,13 @@ exports[`Storyshots Views / Categories / Update category products 1`] = `
Franklin Inc
@@ -47812,12 +49898,13 @@ exports[`Storyshots Views / Categories / Update category products 1`] = `
Williams-Taylor
@@ -47897,12 +49984,13 @@ exports[`Storyshots Views / Categories / Update category products 1`] = `
Riddle, Evans and Hicks
@@ -47982,12 +50070,13 @@ exports[`Storyshots Views / Categories / Update category products 1`] = `
Hebert-Sherman
@@ -48067,12 +50156,13 @@ exports[`Storyshots Views / Categories / Update category products 1`] = `
Carter and Sons
@@ -48371,6 +50461,143 @@ exports[`Storyshots Views / Channels / Channel details default 1`] = `
+
+
+
+ + Shipping Zones + +
+
+
+
+
+
+ Select Shipping Zones that will be supplied via this channel. You can assign Shipping Zones to multiple channels. +
+
+
+
+ +
+
+
+
+
+
+
+
+ + Add Shipping Zones + + +
+
+
+
+
+
+
@@ -48627,6 +50854,143 @@ exports[`Storyshots Views / Channels / Channel details disabled 1`] = `
+
+
+
+ + Shipping Zones + +
+
+
+
+
+
+ Select Shipping Zones that will be supplied via this channel. You can assign Shipping Zones to multiple channels. +
+
+
+
+ +
+
+
+
+
+
+
+
+ + Add Shipping Zones + + +
+
+
+
+
+
+
@@ -48880,6 +51244,143 @@ exports[`Storyshots Views / Channels / Channel details loading 1`] = `
+
+
+
+ + Shipping Zones + +
+
+
+
+
+
+ Select Shipping Zones that will be supplied via this channel. You can assign Shipping Zones to multiple channels. +
+
+
+
+ +
+
+
+
+
+
+
+
+ + Add Shipping Zones + + +
+
+
+
+
+
+
@@ -49133,6 +51634,143 @@ exports[`Storyshots Views / Channels / Channel details with data 1`] = `
+
+
+
+ + Shipping Zones + +
+
+
+
+
+
+ Select Shipping Zones that will be supplied via this channel. You can assign Shipping Zones to multiple channels. +
+
+
+
+ +
+
+
+
+
+
+
+
+ + Add Shipping Zones + + +
+
+
+
+
+
+
@@ -49392,6 +52030,143 @@ exports[`Storyshots Views / Channels / Channel details with errors 1`] = `
+
+
+
+ + Shipping Zones + +
+
+
+
+
+
+ Select Shipping Zones that will be supplied via this channel. You can assign Shipping Zones to multiple channels. +
+
+
+
+ +
+
+
+
+
+
+
+
+ + Add Shipping Zones + + +
+
+
+
+
+
+
@@ -49598,6 +52373,143 @@ exports[`Storyshots Views / Channels / Channel details without editable currency
+
+
+
+ + Shipping Zones + +
+
+
+
+
+
+ Select Shipping Zones that will be supplied via this channel. You can assign Shipping Zones to multiple channels. +
+
+
+
+ +
+
+
+
+
+
+
+
+ + Add Shipping Zones + + +
+
+
+
+
+
+
@@ -52117,12 +55029,13 @@ exports[`Storyshots Views / Collections / Collection detailsCollection details d
Murray Inc
@@ -52221,12 +55134,13 @@ exports[`Storyshots Views / Collections / Collection detailsCollection details d
Williams-Taylor
@@ -52325,12 +55239,13 @@ exports[`Storyshots Views / Collections / Collection detailsCollection details d
Hebert-Sherman
@@ -52429,12 +55344,13 @@ exports[`Storyshots Views / Collections / Collection detailsCollection details d
Estes, Johnson and Graham
@@ -52582,46 +55498,228 @@ exports[`Storyshots Views / Collections / Collection detailsCollection details d class="Hr-root-id ChannelsAvailabilityCard-hr-id" />
-
@@ -53383,12 +56481,13 @@ exports[`Storyshots Views / Collections / Collection detailsCollection details f
Murray Inc
@@ -53487,12 +56586,13 @@ exports[`Storyshots Views / Collections / Collection detailsCollection details f
Williams-Taylor
@@ -53591,12 +56691,13 @@ exports[`Storyshots Views / Collections / Collection detailsCollection details f
Hebert-Sherman
@@ -53695,12 +56796,13 @@ exports[`Storyshots Views / Collections / Collection detailsCollection details f
Estes, Johnson and Graham
@@ -53848,46 +56950,228 @@ exports[`Storyshots Views / Collections / Collection detailsCollection details f class="Hr-root-id ChannelsAvailabilityCard-hr-id" />
-
@@ -54375,10 +57659,10 @@ exports[`Storyshots Views / Collections / Collection detailsCollection details l class="MuiTableCell-root-id MuiTableCell-body-id TableCellAvatar-root-id CollectionProducts-colName-id" >
-
@@ -55357,46 +58823,228 @@ exports[`Storyshots Views / Collections / Collection detailsCollection details n class="Hr-root-id ChannelsAvailabilityCard-hr-id" />
-
@@ -57208,292 +60856,1566 @@ exports[`Storyshots Views / Collections / Create collection default 1`] = ` class="Hr-root-id ChannelsAvailabilityCard-hr-id" />
-
-
-
-
-
-
-
@@ -57918,292 +62840,1566 @@ exports[`Storyshots Views / Collections / Create collection form errors 1`] = ` class="Hr-root-id ChannelsAvailabilityCard-hr-id" />
-
-
-
-
-
-
-
@@ -58622,292 +64818,1566 @@ exports[`Storyshots Views / Collections / Create collection loading 1`] = ` class="Hr-root-id ChannelsAvailabilityCard-hr-id" />
-
-
-
-
-
-
-
@@ -79754,12 +87224,13 @@ exports[`Storyshots Views / Discounts / Sale details products 1`] = `
Orange Juice
@@ -79858,12 +87329,13 @@ exports[`Storyshots Views / Discounts / Sale details products 1`] = `
Carrot Juice
@@ -79962,12 +87434,13 @@ exports[`Storyshots Views / Discounts / Sale details products 1`] = `
Bean Juice
@@ -80066,12 +87539,13 @@ exports[`Storyshots Views / Discounts / Sale details products 1`] = `
Black Hoodie
@@ -93939,13 +101413,15 @@ exports[`Storyshots Views / HomePage default 1`] = ` class="MuiTableRow-root-id HomeProductListCard-tableRow-id MuiTableRow-hover-id" >
@@ -101000,12 +108476,13 @@ exports[`Storyshots Views / Orders / Fulfill order default 1`] = ` >
T-Shirt
Lemon Juice
Orange Juice
T-Shirt
Lemon Juice
Orange Juice
T-Shirt
Lemon Juice
Orange Juice
Watkins-Gonzalez (Soft)
@@ -103044,12 +110530,13 @@ exports[`Storyshots Views / Orders / Order details cancelled 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -103173,12 +110660,13 @@ exports[`Storyshots Views / Orders / Order details cancelled 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -104552,12 +112040,13 @@ exports[`Storyshots Views / Orders / Order details default 1`] = ` >
Watkins-Gonzalez (Soft)
@@ -104721,12 +112210,13 @@ exports[`Storyshots Views / Orders / Order details default 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -104890,12 +112380,13 @@ exports[`Storyshots Views / Orders / Order details default 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -106365,12 +113856,13 @@ exports[`Storyshots Views / Orders / Order details fulfilled 1`] = ` >
Watkins-Gonzalez (Soft)
@@ -106534,12 +114026,13 @@ exports[`Storyshots Views / Orders / Order details fulfilled 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -106703,12 +114196,13 @@ exports[`Storyshots Views / Orders / Order details fulfilled 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -108747,12 +116241,13 @@ exports[`Storyshots Views / Orders / Order details no customer note 1`] = ` >
Watkins-Gonzalez (Soft)
@@ -108916,12 +116411,13 @@ exports[`Storyshots Views / Orders / Order details no customer note 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -109085,12 +116581,13 @@ exports[`Storyshots Views / Orders / Order details no customer note 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -110560,12 +118057,13 @@ exports[`Storyshots Views / Orders / Order details no payment 1`] = ` >
Watkins-Gonzalez (Soft)
@@ -110729,12 +118227,13 @@ exports[`Storyshots Views / Orders / Order details no payment 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -110898,12 +118397,13 @@ exports[`Storyshots Views / Orders / Order details no payment 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -112373,12 +119873,13 @@ exports[`Storyshots Views / Orders / Order details no shipping address 1`] = ` >
Watkins-Gonzalez (Soft)
@@ -112542,12 +120043,13 @@ exports[`Storyshots Views / Orders / Order details no shipping address 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -112711,12 +120213,13 @@ exports[`Storyshots Views / Orders / Order details no shipping address 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -114186,12 +121689,13 @@ exports[`Storyshots Views / Orders / Order details partially fulfilled 1`] = ` >
Watkins-Gonzalez (Soft)
@@ -114355,12 +121859,13 @@ exports[`Storyshots Views / Orders / Order details partially fulfilled 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -114524,12 +122029,13 @@ exports[`Storyshots Views / Orders / Order details partially fulfilled 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -115999,12 +123505,13 @@ exports[`Storyshots Views / Orders / Order details payment confirmed 1`] = ` >
Watkins-Gonzalez (Soft)
@@ -116168,12 +123675,13 @@ exports[`Storyshots Views / Orders / Order details payment confirmed 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -116337,12 +123845,13 @@ exports[`Storyshots Views / Orders / Order details payment confirmed 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -117812,12 +125321,13 @@ exports[`Storyshots Views / Orders / Order details payment error 1`] = ` >
Watkins-Gonzalez (Soft)
@@ -117981,12 +125491,13 @@ exports[`Storyshots Views / Orders / Order details payment error 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -118150,12 +125661,13 @@ exports[`Storyshots Views / Orders / Order details payment error 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -119625,12 +127137,13 @@ exports[`Storyshots Views / Orders / Order details pending payment 1`] = ` >
Watkins-Gonzalez (Soft)
@@ -119794,12 +127307,13 @@ exports[`Storyshots Views / Orders / Order details pending payment 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -119963,12 +127477,13 @@ exports[`Storyshots Views / Orders / Order details pending payment 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -121438,12 +128953,13 @@ exports[`Storyshots Views / Orders / Order details refunded payment 1`] = ` >
Watkins-Gonzalez (Soft)
@@ -121607,12 +129123,13 @@ exports[`Storyshots Views / Orders / Order details refunded payment 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -121776,12 +129293,13 @@ exports[`Storyshots Views / Orders / Order details refunded payment 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -123251,12 +130769,13 @@ exports[`Storyshots Views / Orders / Order details rejected payment 1`] = ` >
Watkins-Gonzalez (Soft)
@@ -123420,12 +130939,13 @@ exports[`Storyshots Views / Orders / Order details rejected payment 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -123589,12 +131109,13 @@ exports[`Storyshots Views / Orders / Order details rejected payment 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -125064,12 +132585,13 @@ exports[`Storyshots Views / Orders / Order details unfulfilled 1`] = ` >
Watkins-Gonzalez (Soft)
@@ -125233,12 +132755,13 @@ exports[`Storyshots Views / Orders / Order details unfulfilled 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -125402,12 +132925,13 @@ exports[`Storyshots Views / Orders / Order details unfulfilled 1`] = ` >
Williams, Garcia and Walker (XS)
@@ -126867,12 +134391,13 @@ exports[`Storyshots Views / Orders / Order draft default 1`] = ` >
Milk
@@ -134922,12 +142451,13 @@ exports[`Storyshots Views / Orders / Refund order products 1`] = ` >
Coffee
@@ -135086,12 +142616,13 @@ exports[`Storyshots Views / Orders / Refund order products 1`] = ` >
Milk
@@ -135163,12 +142694,13 @@ exports[`Storyshots Views / Orders / Refund order products 1`] = ` >
Coffee
@@ -135327,12 +142859,13 @@ exports[`Storyshots Views / Orders / Refund order products 1`] = ` >
Milk
@@ -135404,12 +142937,13 @@ exports[`Storyshots Views / Orders / Refund order products 1`] = ` >
Coffee
@@ -166795,303 +174329,9 @@ exports[`Storyshots Views / Products / Create product When loading 1`] = ` class="CardTitle-hr-id" />
-
- Available at 7 out of 5 channels -
-
-
-
-
-
- Test -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel test -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel USD -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel test -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel USD -
- -
-
- Hidden -
-
-
-
+ You will be able to define availability of product after creating variants.
-
- Available at 7 out of 5 channels -
-
-
-
-
-
- Test -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel test -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel USD -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel test -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel USD -
- -
-
- Hidden -
-
-
-
+ You will be able to define availability of product after creating variants.
-
- Available at 7 out of 5 channels -
-
-
-
-
-
- Test -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel test -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel USD -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel test -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel USD -
- -
-
- Hidden -
-
-
-
+ You will be able to define availability of product after creating variants.
@@ -170615,12 +177268,13 @@ exports[`Storyshots Views / Products / Create product variant default 1`] = `
@@ -170646,10 +177300,10 @@ exports[`Storyshots Views / Products / Create product variant default 1`] = ` colspan="2" >
@@ -171836,12 +178491,13 @@ exports[`Storyshots Views / Products / Create product variant no warehouses 1`]
@@ -171867,10 +178523,10 @@ exports[`Storyshots Views / Products / Create product variant no warehouses 1`] colspan="2" >
@@ -172954,10 +179610,10 @@ exports[`Storyshots Views / Products / Create product variant when loading data colspan="2" >
@@ -174029,12 +180686,13 @@ exports[`Storyshots Views / Products / Create product variant with errors 1`] =
@@ -174060,10 +180718,10 @@ exports[`Storyshots Views / Products / Create product variant with errors 1`] = colspan="2" >

- Available at 0 out of 5 channels + Available at 1 out of 7 channels

- Available at 0 out of 5 channels + Available at 1 out of 7 channels

- Available at 0 out of 5 channels + Available at 1 out of 7 channels

-
-
- - Pricing - -
-
-
-
-
-
- Channels that don’t have assigned prices will use their parent channel to define the price. Price will be converted to channel’s currency -
-
- - - - - - - - - - - - - -
- Channel Name - - Selling Price - - Cost Price -
- No channels found -
-
-
-
-
@@ -183332,7 +189908,7 @@ exports[`Storyshots Views / Products / Product edit no stock and no variants 1`]
- Available at 0 out of 5 channels + Available at 1 out of 7 channels

-
-
- - Pricing - -
-
-
-
-
-
- Channels that don’t have assigned prices will use their parent channel to define the price. Price will be converted to channel’s currency -
-
- - - - - - - - - - - - - -
- Channel Name - - Selling Price - - Cost Price -
- No channels found -
-
-
-
-
@@ -184971,7 +191465,7 @@ exports[`Storyshots Views / Products / Product edit no stock, no variants and no
- Available at 0 out of 5 channels + Available at 1 out of 7 channels

-
-
- - Pricing - -
-
-
-
-
-
- Channels that don’t have assigned prices will use their parent channel to define the price. Price will be converted to channel’s currency -
-
- - - - - - - - - - - - - -
- Channel Name - - Selling Price - - Cost Price -
- No channels found -
-
-
-
-
@@ -186832,7 +193244,7 @@ exports[`Storyshots Views / Products / Product edit no variants 1`] = `
- Available at 0 out of 5 channels + Available at 1 out of 7 channels

- Available at 0 out of 5 channels + Available at 1 out of 7 channels

-
- Available at 0 out of 5 channels -
-
+ You will be able to define availability of product after creating variants.
- Available at 0 out of 5 channels + Available at 1 out of 7 channels

-
-
- - Pricing - -
-
-
-
-
-
- Channels that don’t have assigned prices will use their parent channel to define the price. Price will be converted to channel’s currency -
-
- - - - - - - - - - - - - -
- Channel Name - - Selling Price - - Cost Price -
- No channels found -
-
-
-
-
@@ -193098,7 +199421,7 @@ exports[`Storyshots Views / Products / Product edit when product has no variants
- Available at 0 out of 5 channels + Available at 1 out of 7 channels

- Available at 7 out of 5 channels -
-
-
-
-
-
- Test -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel test -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel USD -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel test -
- -
-
- Hidden -
-
-
-
-
-
-
-
- Channel USD -
- -
-
- Hidden -
-
+ Available at 1 out of 7 channels

@@ -209056,12 +215193,13 @@ exports[`Storyshots Views / Products / Product variant details attribute errors
@@ -209120,12 +215258,13 @@ exports[`Storyshots Views / Products / Product variant details attribute errors
@@ -209184,12 +215323,13 @@ exports[`Storyshots Views / Products / Product variant details attribute errors
@@ -210782,12 +216922,13 @@ exports[`Storyshots Views / Products / Product variant details no warehouses 1`]
@@ -210846,12 +216987,13 @@ exports[`Storyshots Views / Products / Product variant details no warehouses 1`]
@@ -210910,12 +217052,13 @@ exports[`Storyshots Views / Products / Product variant details no warehouses 1`]
@@ -210974,12 +217117,13 @@ exports[`Storyshots Views / Products / Product variant details no warehouses 1`]
@@ -212340,12 +218484,13 @@ exports[`Storyshots Views / Products / Product variant details when loaded data
@@ -212404,12 +218549,13 @@ exports[`Storyshots Views / Products / Product variant details when loaded data
@@ -212468,12 +218614,13 @@ exports[`Storyshots Views / Products / Product variant details when loaded data
@@ -212532,12 +218679,13 @@ exports[`Storyshots Views / Products / Product variant details when loaded data
@@ -214127,10 +220275,10 @@ exports[`Storyshots Views / Products / Product variant details when loading data class="MuiTableCell-root-id MuiTableCell-body-id TableCellAvatar-root-id ProductVariantNavigation-colAvatar-id" >
@@ -216751,12 +222899,13 @@ exports[`Storyshots Views / Shipping / Shipping rate create price rate 1`] = `
- Warehouse + Settings
+ Assign channels to this shipping zone so we know which orders will be supported +
+
+
+ + +
+
+
+
+
+
+ GBP +
+ +
+
+
+
+
+ PLN +
+ +
+
+
+
+
+
+ Select warehouse from which you will ship products for this shipping zone. This warehouse address will also be used to calculate taxes. +
@@ -222736,11 +229030,6 @@ exports[`Storyshots Views / Shipping / Shipping zone details default 1`] = `
-

- Select warehouse from which you will ship products for this shipping zone. This warehouse address will also be used to calculate taxes. -

- Warehouse + Settings
+ Assign channels to this shipping zone so we know which orders will be supported +
+
+
+ + +
+
+
+
+
+
+ GBP +
+ +
+
+
+
+
+ PLN +
+ +
+
+
+
+
+
+ Select warehouse from which you will ship products for this shipping zone. This warehouse address will also be used to calculate taxes. +
@@ -223707,11 +230138,6 @@ exports[`Storyshots Views / Shipping / Shipping zone details form errors 1`] = `
-

- Select warehouse from which you will ship products for this shipping zone. This warehouse address will also be used to calculate taxes. -

- Warehouse + Settings
+ Assign channels to this shipping zone so we know which orders will be supported +
+
+
+ + +
+
+
+
+
+
+ Select warehouse from which you will ship products for this shipping zone. This warehouse address will also be used to calculate taxes. +
@@ -224519,11 +231020,6 @@ exports[`Storyshots Views / Shipping / Shipping zone details loading 1`] = `
-

- Select warehouse from which you will ship products for this shipping zone. This warehouse address will also be used to calculate taxes. -

({ - label: listing.channel.name, - value: listing.channel.id -})); - const props: ProductUpdatePageProps = { ...listActionsProps, allChannelsCount: 5, + onChannelsChange: () => undefined, + currentChannels: [], + isSimpleProduct: false, categories: [product.category], - channelChoices, + channelsWithVariantsData: { + channel1: { + selectedVariantsIds: ["variantA"], + variantsIdsToRemove: ["variantB"], + variantsIdsToAdd: [] + } + }, + setChannelsData: () => undefined, + channelsData: channels, channelsErrors: [], collections, - currentChannels: [], defaultWeightUnit: "kg", disabled: false, errors: [], @@ -50,7 +55,6 @@ const props: ProductUpdatePageProps = { limits, onAssignReferencesClick: () => undefined, onBack: () => undefined, - onChannelsChange: () => undefined, onCloseDialog: () => undefined, onDelete: () => undefined, onImageDelete: () => undefined, diff --git a/src/types.ts b/src/types.ts index 8a387d964..6d2ad5939 100644 --- a/src/types.ts +++ b/src/types.ts @@ -176,6 +176,7 @@ export type ReorderAction = (event: ReorderEvent) => void; export interface FetchMoreProps { loading: boolean; hasMore: boolean; + totalCount?: number; onFetchMore: () => void; } diff --git a/src/types/globalTypes.ts b/src/types/globalTypes.ts index a781480ec..0372fb42b 100644 --- a/src/types/globalTypes.ts +++ b/src/types/globalTypes.ts @@ -121,6 +121,7 @@ export enum ChannelErrorCode { CHANNELS_CURRENCY_MUST_BE_THE_SAME = "CHANNELS_CURRENCY_MUST_BE_THE_SAME", CHANNEL_TARGET_ID_MUST_BE_DIFFERENT = "CHANNEL_TARGET_ID_MUST_BE_DIFFERENT", CHANNEL_WITH_ORDERS = "CHANNEL_WITH_ORDERS", + DUPLICATED_INPUT_ITEM = "DUPLICATED_INPUT_ITEM", GRAPHQL_ERROR = "GRAPHQL_ERROR", INVALID = "INVALID", NOT_FOUND = "NOT_FOUND", @@ -1092,7 +1093,6 @@ export interface AttributeFilterInput { filterableInStorefront?: boolean | null; filterableInDashboard?: boolean | null; availableInGrid?: boolean | null; - metadata?: (MetadataInput | null)[] | null; search?: string | null; ids?: (string | null)[] | null; type?: AttributeTypeEnum | null; @@ -1159,7 +1159,6 @@ export interface CatalogueInput { export interface CategoryFilterInput { search?: string | null; - metadata?: (MetadataInput | null)[] | null; ids?: (string | null)[] | null; } @@ -1183,6 +1182,7 @@ export interface ChannelCreateInput { name: string; slug: string; currencyCode: string; + addShippingZones?: string[] | null; } export interface ChannelDeleteInput { @@ -1193,6 +1193,8 @@ export interface ChannelUpdateInput { isActive?: boolean | null; name?: string | null; slug?: string | null; + addShippingZones?: string[] | null; + removeShippingZones?: string[] | null; } export interface CollectionChannelListingUpdateInput { @@ -1215,7 +1217,6 @@ export interface CollectionCreateInput { export interface CollectionFilterInput { published?: CollectionPublished | null; search?: string | null; - metadata?: (MetadataInput | null)[] | null; ids?: (string | null)[] | null; channel?: string | null; } @@ -1257,7 +1258,6 @@ export interface CustomerInput { email?: string | null; isActive?: boolean | null; note?: string | null; - languageCode?: LanguageCodeEnum | null; } export interface DateRangeInput { @@ -1384,7 +1384,6 @@ export interface OrderDraftFilterInput { customer?: string | null; created?: DateRangeInput | null; search?: string | null; - metadata?: (MetadataInput | null)[] | null; channels?: (string | null)[] | null; } @@ -1394,7 +1393,6 @@ export interface OrderFilterInput { customer?: string | null; created?: DateRangeInput | null; search?: string | null; - metadata?: (MetadataInput | null)[] | null; channels?: (string | null)[] | null; } @@ -1588,10 +1586,12 @@ export interface ProductChannelListingAddInput { visibleInListings?: boolean | null; isAvailableForPurchase?: boolean | null; availableForPurchaseDate?: any | null; + addVariants?: string[] | null; + removeVariants?: string[] | null; } export interface ProductChannelListingUpdateInput { - addChannels?: ProductChannelListingAddInput[] | null; + updateChannels?: ProductChannelListingAddInput[] | null; removeChannels?: string[] | null; } @@ -1620,7 +1620,6 @@ export interface ProductFilterInput { productType?: string | null; stocks?: ProductStockFilterInput | null; search?: string | null; - metadata?: (MetadataInput | null)[] | null; price?: PriceRangeInput | null; minimalPrice?: PriceRangeInput | null; productTypes?: (string | null)[] | null; @@ -1658,7 +1657,6 @@ export interface ProductTypeFilterInput { search?: string | null; configurable?: ProductTypeConfigurable | null; productType?: ProductTypeEnum | null; - metadata?: (MetadataInput | null)[] | null; ids?: (string | null)[] | null; } @@ -1800,6 +1798,7 @@ export interface ShippingZoneCreateInput { countries?: (string | null)[] | null; default?: boolean | null; addWarehouses?: (string | null)[] | null; + addChannels?: string[] | null; } export interface ShippingZoneUpdateInput { @@ -1808,7 +1807,9 @@ export interface ShippingZoneUpdateInput { countries?: (string | null)[] | null; default?: boolean | null; addWarehouses?: (string | null)[] | null; + addChannels?: string[] | null; removeWarehouses?: (string | null)[] | null; + removeChannels?: string[] | null; } export interface ShopSettingsInput { @@ -1877,7 +1878,6 @@ export interface UserCreateInput { email?: string | null; isActive?: boolean | null; note?: string | null; - languageCode?: LanguageCodeEnum | null; redirectUrl?: string | null; } diff --git a/src/utils/maps.ts b/src/utils/maps.ts index 0367e8599..4bfe0ece1 100644 --- a/src/utils/maps.ts +++ b/src/utils/maps.ts @@ -27,6 +27,10 @@ export function mapPagesToChoices( export function mapNodeToChoice( nodes: Array> ): Array { + if (!nodes) { + return []; + } + return nodes.map(node => ({ label: node.name, value: node.id