diff --git a/CHANGELOG.md b/CHANGELOG.md index f34551f97..52a9c6a40 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,7 @@ All notable, unreleased changes to this project will be documented in this file. - Add background task manager - #574 by @dominik-zeglen - Handle task failure and fix task duplication - #588 by @dominik-zeglen - Move fragments to separate directory to avoid circular imports - #592 by @dominik-zeglen +- Add order invoices management - #570 by @orzechdev ## 2.10.0 diff --git a/locale/defaultMessages.json b/locale/defaultMessages.json index c97881d0b..57e0a2a67 100644 --- a/locale/defaultMessages.json +++ b/locale/defaultMessages.json @@ -1461,6 +1461,17 @@ "context": "button", "string": "Confirm" }, + "src_dot_containers_dot_BackgroundTasks_dot_invoiceGenerateFinishedText": { + "string": "Requested Invoice was generated. It was added to the top of the invoice list on this view. Enjoy!" + }, + "src_dot_containers_dot_BackgroundTasks_dot_invoiceGenerateFinishedTitle": { + "context": "invoice generating has finished, header", + "string": "Invoice Generated" + }, + "src_dot_containers_dot_BackgroundTasks_dot_invoiceGenerationFailedTitle": { + "context": "dialog header, title", + "string": "Invoice Generation" + }, "src_dot_create": { "context": "button", "string": "Create" @@ -2667,6 +2678,40 @@ "context": "order history message", "string": "Order was cancelled" }, + "src_dot_orders_dot_components_dot_OrderInvoiceEmailSendDialog_dot_1821123638": { + "string": "Are you sure you want to send this invoice: {invoiceNumber} to the customer?" + }, + "src_dot_orders_dot_components_dot_OrderInvoiceEmailSendDialog_dot_2166306944": { + "context": "dialog header", + "string": "Send Invoice" + }, + "src_dot_orders_dot_components_dot_OrderInvoiceList_dot_24460204": { + "context": "section header", + "string": "Invoices" + }, + "src_dot_orders_dot_components_dot_OrderInvoiceList_dot_2489266682": { + "context": "invoice number", + "string": "Invoice no" + }, + "src_dot_orders_dot_components_dot_OrderInvoiceList_dot_2739475235": { + "context": "invoice create date prefix", + "string": "created" + }, + "src_dot_orders_dot_components_dot_OrderInvoiceList_dot_3340654960": { + "string": "No invoices to be shown" + }, + "src_dot_orders_dot_components_dot_OrderInvoiceList_dot_3589949197": { + "context": "invoice number prefix", + "string": "Invoice" + }, + "src_dot_orders_dot_components_dot_OrderInvoiceList_dot_4120604650": { + "context": "action for invoice", + "string": "Action" + }, + "src_dot_orders_dot_components_dot_OrderInvoiceList_dot_949234851": { + "context": "generate invoice button", + "string": "Generate" + }, "src_dot_orders_dot_components_dot_OrderListPage_dot_2826235371": { "context": "button", "string": "Create order" @@ -2841,6 +2886,9 @@ "context": "order line total price", "string": "Total" }, + "src_dot_orders_dot_views_dot_OrderDetails_dot_1039259580": { + "string": "We’re generating the invoice you requested. Please wait a couple of moments" + }, "src_dot_orders_dot_views_dot_OrderDetails_dot_1056718390": { "string": "Payment successfully captured" }, @@ -2874,6 +2922,12 @@ "src_dot_orders_dot_views_dot_OrderDetails_dot_3367579693": { "string": "Order successfully updated" }, + "src_dot_orders_dot_views_dot_OrderDetails_dot_4085755992": { + "string": "Invoice email sent" + }, + "src_dot_orders_dot_views_dot_OrderDetails_dot_55607988": { + "string": "Invoice is Generating" + }, "src_dot_orders_dot_views_dot_OrderDetails_dot_580490159": { "context": "window title", "string": "Order #{orderNumber}" @@ -4016,6 +4070,10 @@ "src_dot_savedChanges": { "string": "Saved changes" }, + "src_dot_send": { + "context": "button", + "string": "Send" + }, "src_dot_serviceAccounts": { "context": "service accounts section name", "string": "Service Accounts" @@ -5105,6 +5163,10 @@ "src_dot_utils_dot_errors_dot_duplicatedInputItem": { "string": "Cannot add and remove group the same time" }, + "src_dot_utils_dot_errors_dot_emailNotSet": { + "context": "error message", + "string": "Email address is not set" + }, "src_dot_utils_dot_errors_dot_graphqlError": { "string": "API error" }, @@ -5114,6 +5176,10 @@ "src_dot_utils_dot_errors_dot_invalidPassword": { "string": "Invalid password" }, + "src_dot_utils_dot_errors_dot_invalidStatus": { + "context": "error message", + "string": "Cannot request an invoice for draft order" + }, "src_dot_utils_dot_errors_dot_noShippingAddress": { "context": "error message", "string": "Cannot choose a shipping method for an order without the shipping address" @@ -5122,6 +5188,18 @@ "context": "error message", "string": "Only draft orders can be edited" }, + "src_dot_utils_dot_errors_dot_notFound": { + "context": "error message", + "string": "Invoice not found" + }, + "src_dot_utils_dot_errors_dot_notReady": { + "context": "error message", + "string": "Billing address is not set or invoice is not ready to be send" + }, + "src_dot_utils_dot_errors_dot_numberNotSet": { + "context": "error message", + "string": "Number not set for an invoice" + }, "src_dot_utils_dot_errors_dot_outOfScopeGroup": { "string": "Group is out of your permission scope" }, @@ -5169,6 +5247,10 @@ "src_dot_utils_dot_errors_dot_unknownError": { "string": "Unknown error" }, + "src_dot_utils_dot_errors_dot_urlNotSet": { + "context": "error message", + "string": "URL not set for an invoice" + }, "src_dot_utils_dot_errors_dot_variantNoDigitalContent": { "string": "This variant does not have any digital content" }, @@ -5258,6 +5340,10 @@ "context": "dialog header", "string": "Delete Webhook" }, + "src_dot_webhooks_dot_components_dot_WebhookEvents_dot_1368317066": { + "context": "event", + "string": "Invoice deleted" + }, "src_dot_webhooks_dot_components_dot_WebhookEvents_dot_1436364351": { "context": "section header", "string": "Events" @@ -5270,6 +5356,10 @@ "context": "event", "string": "All events" }, + "src_dot_webhooks_dot_components_dot_WebhookEvents_dot_2862596150": { + "context": "event", + "string": "Invoice sent" + }, "src_dot_webhooks_dot_components_dot_WebhookEvents_dot_2899821092": { "context": "event", "string": "Product created" @@ -5302,6 +5392,10 @@ "context": "event", "string": "Changed quantity in checkout" }, + "src_dot_webhooks_dot_components_dot_WebhookEvents_dot_4186057882": { + "context": "event", + "string": "Invoice requested" + }, "src_dot_webhooks_dot_components_dot_WebhookEvents_dot_4281441551": { "context": "event", "string": "Fulfillment created" diff --git a/package-lock.json b/package-lock.json index beffc6dc7..55335b920 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3978,6 +3978,181 @@ } } }, + "@webassemblyjs/ast": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", + "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", + "dev": true, + "requires": { + "@webassemblyjs/helper-module-context": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0" + } + }, + "@webassemblyjs/floating-point-hex-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", + "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", + "dev": true + }, + "@webassemblyjs/helper-api-error": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", + "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", + "dev": true + }, + "@webassemblyjs/helper-buffer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", + "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", + "dev": true + }, + "@webassemblyjs/helper-code-frame": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", + "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", + "dev": true, + "requires": { + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/helper-fsm": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", + "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", + "dev": true + }, + "@webassemblyjs/helper-module-context": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", + "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0" + } + }, + "@webassemblyjs/helper-wasm-bytecode": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", + "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", + "dev": true + }, + "@webassemblyjs/helper-wasm-section": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", + "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0" + } + }, + "@webassemblyjs/ieee754": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", + "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", + "dev": true, + "requires": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "@webassemblyjs/leb128": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", + "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", + "dev": true, + "requires": { + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/utf8": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", + "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", + "dev": true + }, + "@webassemblyjs/wasm-edit": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", + "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/helper-wasm-section": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-opt": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0", + "@webassemblyjs/wast-printer": "1.9.0" + } + }, + "@webassemblyjs/wasm-gen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", + "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wasm-opt": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", + "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-buffer": "1.9.0", + "@webassemblyjs/wasm-gen": "1.9.0", + "@webassemblyjs/wasm-parser": "1.9.0" + } + }, + "@webassemblyjs/wasm-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", + "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-wasm-bytecode": "1.9.0", + "@webassemblyjs/ieee754": "1.9.0", + "@webassemblyjs/leb128": "1.9.0", + "@webassemblyjs/utf8": "1.9.0" + } + }, + "@webassemblyjs/wast-parser": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", + "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/floating-point-hex-parser": "1.9.0", + "@webassemblyjs/helper-api-error": "1.9.0", + "@webassemblyjs/helper-code-frame": "1.9.0", + "@webassemblyjs/helper-fsm": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, + "@webassemblyjs/wast-printer": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", + "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", + "dev": true, + "requires": { + "@webassemblyjs/ast": "1.9.0", + "@webassemblyjs/wast-parser": "1.9.0", + "@xtuc/long": "4.2.2" + } + }, "@wry/context": { "version": "0.4.4", "resolved": "https://registry.npmjs.org/@wry/context/-/context-0.4.4.tgz", @@ -4877,11 +5052,12 @@ "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" }, "asar": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/asar/-/asar-2.0.1.tgz", - "integrity": "sha512-Vo9yTuUtyFahkVMFaI6uMuX6N7k5DWa6a/8+7ov0/f8Lq9TVR0tUjzSzxQSxT1Y+RJIZgnP7BVb6Uhi+9cjxqA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/asar/-/asar-2.1.0.tgz", + "integrity": "sha512-d2Ovma+bfqNpvBzY/KU8oPY67ZworixTpkjSx0PCXnQi67c2cXmssaTxpFDUM0ttopXoGx/KRxNg/GDThYbXQA==", "dev": true, "requires": { + "@types/glob": "^7.1.1", "chromium-pickle-js": "^0.2.0", "commander": "^2.20.0", "cuint": "^0.2.2", @@ -8159,12 +8335,20 @@ "dev": true }, "compressible": { - "version": "2.0.17", - "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.17.tgz", - "integrity": "sha512-BGHeLCK1GV7j1bSmQQAi26X+GgWcTjLr/0tzSvMCl3LH1w1IJ4PFSPoV5316b30cneTziC+B1a+3OjoSUcQYmw==", + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "dev": true, "requires": { - "mime-db": ">= 1.40.0 < 2" + "mime-db": ">= 1.43.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz", + "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==", + "dev": true + } } }, "compression": { @@ -11313,24 +11497,10 @@ "dev": true }, "follow-redirects": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.9.0.tgz", - "integrity": "sha512-CRcPzsSIbXyVDl0QI01muNDu69S8trU4jArW9LpOt2WtC6LyUJetcIrmfHsRBx7/Jb6GHJUiuqyYxPooFfNt6A==", - "dev": true, - "requires": { - "debug": "^3.0.0" - }, - "dependencies": { - "debug": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", - "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", - "dev": true, - "requires": { - "ms": "^2.1.1" - } - } - } + "version": "1.12.1", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.12.1.tgz", + "integrity": "sha512-tmRv0AVuR7ZyouUHLeNSiO6pqulF7dYa3s19c6t+wz9LD69/uSzdMxJ2S91nTI9U3rt/IldxpzMOFejp6f0hjg==", + "dev": true }, "for-in": { "version": "1.0.2", @@ -12442,9 +12612,9 @@ } }, "handle-thing": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.0.tgz", - "integrity": "sha512-d4sze1JNC454Wdo2fkuyzCr6aHcbL6PGGuFAz0Li/NcOm1tCHGnWDRmJP85dh9IhQErTc2svWFEX5xHIOo//kQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/handle-thing/-/handle-thing-2.0.1.tgz", + "integrity": "sha512-9Qn4yBxelxoh2Ow62nP+Ka/kMnOXRi8BXnRaUwezLNhqelnN49xKz4F/dPP8OYLxLxq6JDtZb2i9XznUQbNPTg==", "dev": true }, "har-schema": { @@ -12891,9 +13061,9 @@ "dev": true }, "http-proxy": { - "version": "1.18.0", - "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.0.tgz", - "integrity": "sha512-84I2iJM/n1d4Hdgc6y2+qY5mDaz2PUVjlg9znE9byl+q0uC3DeByqBGReQu5tpLK0TAqTIXScRUV+dg7+bUPpQ==", + "version": "1.18.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "dev": true, "requires": { "eventemitter3": "^4.0.0", @@ -15250,13 +15420,13 @@ } }, "loader-fs-cache": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.2.tgz", - "integrity": "sha512-70IzT/0/L+M20jUlEqZhZyArTU6VKLRTYRDAYN26g4jfzpJqjipLL3/hgYpySqI9PwsVRHHFja0LfEmsx9X2Cw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz", + "integrity": "sha512-ldcgZpjNJj71n+2Mf6yetz+c9bM4xpKtNds4LbqXzU/PTdeAX0g3ytnU1AJMEcTk2Lex4Smpe3Q/eCTsvUBxbA==", "dev": true, "requires": { "find-cache-dir": "^0.1.1", - "mkdirp": "0.5.1" + "mkdirp": "^0.5.1" }, "dependencies": { "find-cache-dir": { @@ -15584,9 +15754,9 @@ } }, "loglevel": { - "version": "1.6.6", - "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.6.tgz", - "integrity": "sha512-Sgr5lbboAUBo3eXCSPL4/KoVz3ROKquOjcctxmHIt+vol2DrqTQe3SwkKKuYhEiWB5kYa13YyopJ69deJ1irzQ==", + "version": "1.6.8", + "resolved": "https://registry.npmjs.org/loglevel/-/loglevel-1.6.8.tgz", + "integrity": "sha512-bsU7+gc9AJ2SqpzxwU3+1fedl8zAntbtC5XYlt3s2j1hJcn2PsXSmgN8TaLG/J1/2mod4+cE/3vNL70/c1RNCA==", "dev": true }, "loose-envify": { @@ -15689,9 +15859,9 @@ } }, "markdown-to-jsx": { - "version": "6.10.3", - "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-6.10.3.tgz", - "integrity": "sha512-PSoUyLnW/xoW6RsxZrquSSz5eGEOTwa15H5eqp3enmrp8esmgDJmhzd6zmQ9tgAA9TxJzx1Hmf3incYU/IamoQ==", + "version": "6.11.4", + "resolved": "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-6.11.4.tgz", + "integrity": "sha512-3lRCD5Sh+tfA52iGgfs/XZiw33f7fFX9Bn55aNnVNUd2GzLDkOWyKYYD8Yju2B1Vn+feiEdgJs8T6Tg0xNokPw==", "dev": true, "requires": { "prop-types": "^15.6.2", @@ -15998,20 +16168,12 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "dev": true, "requires": { - "minimist": "0.0.8" - }, - "dependencies": { - "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", - "dev": true - } + "minimist": "^1.2.5" } }, "mock-apollo-client": { @@ -17128,9 +17290,9 @@ "integrity": "sha512-+G+EkOPoE5S/zChTpmBSSDYmhXJ5PsW8eMhH8cP/CQHMFPBG/kC9Y5IIw6qNYgdJ+/COf0ddY2li28iHaZRSjw==" }, "portfinder": { - "version": "1.0.25", - "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.25.tgz", - "integrity": "sha512-6ElJnHBbxVA1XSLgBp7G1FiCkQdlqGzuF7DswL5tcea+E8UpuvPU7beVAjjRwCioTS9ZluNbu+ZyRvgTsmqEBg==", + "version": "1.0.26", + "resolved": "https://registry.npmjs.org/portfinder/-/portfinder-1.0.26.tgz", + "integrity": "sha512-Xi7mKxJHHMI3rIUrnm/jjUgwhbYMkp/XKEcZX3aG4BrumLpq3nmoQMX+ClYnDZnZ/New7IatC1no5RX0zo1vXQ==", "dev": true, "requires": { "async": "^2.6.2", @@ -19148,6 +19310,15 @@ "upper-case-first": "^1.1.2" } }, + "serialize-javascript": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-3.1.0.tgz", + "integrity": "sha512-JIJT1DGiWmIKhzRsG91aS6Ze4sFUrYbltlkg2onR5OrnNM02Kl/hnY/T4FN2omvyeBbQmMJv+K4cPOpGzOTFBg==", + "dev": true, + "requires": { + "randombytes": "^2.1.0" + } + }, "serve-favicon": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.5.0.tgz", @@ -19548,13 +19719,14 @@ } }, "sockjs": { - "version": "0.3.19", - "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.19.tgz", - "integrity": "sha512-V48klKZl8T6MzatbLlzzRNhMepEys9Y4oGFpypBFFn1gLI/QQ9HtLLyWJNbPlwGLelOVOEijUbTTJeLLI59jLw==", + "version": "0.3.20", + "resolved": "https://registry.npmjs.org/sockjs/-/sockjs-0.3.20.tgz", + "integrity": "sha512-SpmVOVpdq0DJc0qArhF3E5xsxvaiqGNb73XfgBpK1y3UD5gs8DSo8aCTsuT5pX8rssdc2NDIzANwP9eCAiSdTA==", "dev": true, "requires": { "faye-websocket": "^0.10.0", - "uuid": "^3.0.1" + "uuid": "^3.4.0", + "websocket-driver": "0.6.5" }, "dependencies": { "faye-websocket": { @@ -19565,6 +19737,21 @@ "requires": { "websocket-driver": ">=0.5.1" } + }, + "uuid": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", + "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==", + "dev": true + }, + "websocket-driver": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.6.5.tgz", + "integrity": "sha1-XLJVbOuF9Dc8bYI4qmkchFThOjY=", + "dev": true, + "requires": { + "websocket-extensions": ">=0.1.1" + } } } }, @@ -19687,9 +19874,9 @@ "dev": true }, "spdy": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.1.tgz", - "integrity": "sha512-HeZS3PBdMA+sZSu0qwpCxl3DeALD5ASx8pAX0jZdKXSpPWbQ6SYGnlg3BBmYLx5LtiZrmkAZfErCm2oECBcioA==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/spdy/-/spdy-4.0.2.tgz", + "integrity": "sha512-r46gZQZQV+Kl9oItvl1JZZqJKGr+oEkB08A6BzkiR7593/7IbtuncXHd2YoYeTsG4157ZssMu9KYvUHLcjcDoA==", "dev": true, "requires": { "debug": "^4.1.0", @@ -19714,9 +19901,9 @@ }, "dependencies": { "readable-stream": { - "version": "3.4.0", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", - "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", + "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", "dev": true, "requires": { "inherits": "^2.0.3", @@ -20355,16 +20542,16 @@ } }, "terser-webpack-plugin": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.3.tgz", - "integrity": "sha512-QMxecFz/gHQwteWwSo5nTc6UaICqN1bMedC5sMtUc7y3Ha3Q8y6ZO0iCR8pq4RJC8Hjf0FEPEHZqcMB/+DFCrA==", + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz", + "integrity": "sha512-U4mACBHIegmfoEe5fdongHESNJWqsGU+W0S/9+BmYGVQDw1+c2Ow05TpMhxjPK1sRb7cuYq1BPl1e5YHJMTCqA==", "dev": true, "requires": { "cacache": "^12.0.2", "find-cache-dir": "^2.1.0", "is-wsl": "^1.1.0", "schema-utils": "^1.0.0", - "serialize-javascript": "^2.1.2", + "serialize-javascript": "^3.1.0", "source-map": "^0.6.1", "terser": "^4.1.2", "webpack-sources": "^1.4.0", @@ -20382,12 +20569,6 @@ "pkg-dir": "^3.0.0" } }, - "serialize-javascript": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-2.1.2.tgz", - "integrity": "sha512-rs9OggEUF0V4jUSecXazOYsLfu7OGK2qIn3c7IPBiffz32XniEp/TX9Xmc9LQfK2nQ2QKHvZ2oygKUGU0lG4jQ==", - "dev": true - }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -22006,14 +22187,145 @@ } }, "watchpack": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz", - "integrity": "sha512-i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==", + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-1.7.2.tgz", + "integrity": "sha512-ymVbbQP40MFTp+cNMvpyBpBtygHnPzPkHqoIwRRj/0B8KhqQwV8LaKjtbaxF2lK4vl8zN9wCxS46IFCU5K4W0g==", "dev": true, "requires": { - "chokidar": "^2.0.2", + "chokidar": "^3.4.0", "graceful-fs": "^4.1.2", - "neo-async": "^2.5.0" + "neo-async": "^2.5.0", + "watchpack-chokidar2": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.1.tgz", + "integrity": "sha512-mM8522psRCqzV+6LhomX5wgp25YVibjh8Wj23I5RPkPppSVSjyKD2A2mBJmWGa+KN7f2D6LNh9jkBCeyLktzjg==", + "dev": true, + "optional": true, + "requires": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + } + }, + "binary-extensions": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.1.0.tgz", + "integrity": "sha512-1Yj8h9Q+QDF5FzhMs/c9+6UntbD5MkRfRwac8DoEm9ZfUBZ7tZ55YcGVAzEe4bXsdQHEk+s9S5wsOKVdZrw0tQ==", + "dev": true, + "optional": true + }, + "braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dev": true, + "optional": true, + "requires": { + "fill-range": "^7.0.1" + } + }, + "chokidar": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.4.0.tgz", + "integrity": "sha512-aXAaho2VJtisB/1fg1+3nlLJqGOuewTzQpd/Tz0yTg2R0e4IGtshYvtjowyEumcBv2z+y4+kc75Mz7j5xJskcQ==", + "dev": true, + "optional": true, + "requires": { + "anymatch": "~3.1.1", + "braces": "~3.0.2", + "fsevents": "~2.1.2", + "glob-parent": "~5.1.0", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.4.0" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dev": true, + "optional": true, + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "fsevents": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.1.3.tgz", + "integrity": "sha512-Auw9a4AxqWpa9GUfj370BMPzzyncfBABW8Mab7BGWBYDj4Isgq+cDKtx0i6u9jcX9pQDnswsaaOTgTmA5pEjuQ==", + "dev": true, + "optional": true + }, + "glob-parent": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.1.tgz", + "integrity": "sha512-FnI+VGOpnlGHWZxthPGR+QhR78fuiK0sNLkHQv+bL9fQi57lNNdquIbna/WrfROrolq8GK5Ek6BiMwqL/voRYQ==", + "dev": true, + "optional": true, + "requires": { + "is-glob": "^4.0.1" + } + }, + "is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "optional": true, + "requires": { + "binary-extensions": "^2.0.0" + } + }, + "is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "optional": true + }, + "readdirp": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.4.0.tgz", + "integrity": "sha512-0xe001vZBnJEK+uKcj8qOhyAKPzIT+gStxWr3LCB0DwcXR5NZJ3IaC+yGnHCYzB/S7ov3m3EEbZI2zeNvX+hGQ==", + "dev": true, + "optional": true, + "requires": { + "picomatch": "^2.2.1" + }, + "dependencies": { + "picomatch": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", + "dev": true, + "optional": true + } + } + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "optional": true, + "requires": { + "is-number": "^7.0.0" + } + } + } + }, + "watchpack-chokidar2": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz", + "integrity": "sha512-9TyfOyN/zLUbA288wZ8IsMZ+6cbzvsNyEzSBp6e/zkifi6xxbl8SmQ/CxQq32k8NNqrdVEVUVSEf56L4rQ/ZxA==", + "dev": true, + "optional": true, + "requires": { + "chokidar": "^2.1.8" } }, "wbuf": { @@ -22038,16 +22350,16 @@ "dev": true }, "webpack": { - "version": "4.42.1", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.42.1.tgz", - "integrity": "sha512-SGfYMigqEfdGchGhFFJ9KyRpQKnipvEvjc1TwrXEPCM6H5Wywu10ka8o3KGrMzSMxMQKt8aCHUFh5DaQ9UmyRg==", + "version": "4.43.0", + "resolved": "https://registry.npmjs.org/webpack/-/webpack-4.43.0.tgz", + "integrity": "sha512-GW1LjnPipFW2Y78OOab8NJlCflB7EFskMih2AHdvjbpKMeDJqEgSx24cXXXiPS65+WSwVyxtDsJH6jGX2czy+g==", "dev": true, "requires": { "@webassemblyjs/ast": "1.9.0", "@webassemblyjs/helper-module-context": "1.9.0", "@webassemblyjs/wasm-edit": "1.9.0", "@webassemblyjs/wasm-parser": "1.9.0", - "acorn": "^6.2.1", + "acorn": "^6.4.1", "ajv": "^6.10.2", "ajv-keywords": "^3.4.1", "chrome-trace-event": "^1.0.2", @@ -22064,194 +22376,8 @@ "schema-utils": "^1.0.0", "tapable": "^1.1.3", "terser-webpack-plugin": "^1.4.3", - "watchpack": "^1.6.0", + "watchpack": "^1.6.1", "webpack-sources": "^1.4.1" - }, - "dependencies": { - "@webassemblyjs/ast": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.9.0.tgz", - "integrity": "sha512-C6wW5L+b7ogSDVqymbkkvuW9kruN//YisMED04xzeBBqjHa2FYnmvOlS6Xj68xWQRgWvI9cIglsjFowH/RJyEA==", - "dev": true, - "requires": { - "@webassemblyjs/helper-module-context": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0" - } - }, - "@webassemblyjs/floating-point-hex-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz", - "integrity": "sha512-TG5qcFsS8QB4g4MhrxK5TqfdNe7Ey/7YL/xN+36rRjl/BlGE/NcBvJcqsRgCP6Z92mRE+7N50pRIi8SmKUbcQA==", - "dev": true - }, - "@webassemblyjs/helper-api-error": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz", - "integrity": "sha512-NcMLjoFMXpsASZFxJ5h2HZRcEhDkvnNFOAKneP5RbKRzaWJN36NC4jqQHKwStIhGXu5mUWlUUk7ygdtrO8lbmw==", - "dev": true - }, - "@webassemblyjs/helper-buffer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz", - "integrity": "sha512-qZol43oqhq6yBPx7YM3m9Bv7WMV9Eevj6kMi6InKOuZxhw+q9hOkvq5e/PpKSiLfyetpaBnogSbNCfBwyB00CA==", - "dev": true - }, - "@webassemblyjs/helper-code-frame": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz", - "integrity": "sha512-ERCYdJBkD9Vu4vtjUYe8LZruWuNIToYq/ME22igL+2vj2dQ2OOujIZr3MEFvfEaqKoVqpsFKAGsRdBSBjrIvZA==", - "dev": true, - "requires": { - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/helper-fsm": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz", - "integrity": "sha512-OPRowhGbshCb5PxJ8LocpdX9Kl0uB4XsAjl6jH/dWKlk/mzsANvhwbiULsaiqT5GZGT9qinTICdj6PLuM5gslw==", - "dev": true - }, - "@webassemblyjs/helper-module-context": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz", - "integrity": "sha512-MJCW8iGC08tMk2enck1aPW+BE5Cw8/7ph/VGZxwyvGbJwjktKkDK7vy7gAmMDx88D7mhDTCNKAW5tED+gZ0W8g==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0" - } - }, - "@webassemblyjs/helper-wasm-bytecode": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz", - "integrity": "sha512-R7FStIzyNcd7xKxCZH5lE0Bqy+hGTwS3LJjuv1ZVxd9O7eHCedSdrId/hMOd20I+v8wDXEn+bjfKDLzTepoaUw==", - "dev": true - }, - "@webassemblyjs/helper-wasm-section": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz", - "integrity": "sha512-XnMB8l3ek4tvrKUUku+IVaXNHz2YsJyOOmz+MMkZvh8h1uSJpSen6vYnw3IoQ7WwEuAhL8Efjms1ZWjqh2agvw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0" - } - }, - "@webassemblyjs/ieee754": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz", - "integrity": "sha512-dcX8JuYU/gvymzIHc9DgxTzUUTLexWwt8uCTWP3otys596io0L5aW02Gb1RjYpx2+0Jus1h4ZFqjla7umFniTg==", - "dev": true, - "requires": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "@webassemblyjs/leb128": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.9.0.tgz", - "integrity": "sha512-ENVzM5VwV1ojs9jam6vPys97B/S65YQtv/aanqnU7D8aSoHFX8GyhGg0CMfyKNIHBuAVjy3tlzd5QMMINa7wpw==", - "dev": true, - "requires": { - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/utf8": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.9.0.tgz", - "integrity": "sha512-GZbQlWtopBTP0u7cHrEx+73yZKrQoBMpwkGEIqlacljhXCkVM1kMQge/Mf+csMJAjEdSwhOyLAS0AoR3AG5P8w==", - "dev": true - }, - "@webassemblyjs/wasm-edit": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz", - "integrity": "sha512-FgHzBm80uwz5M8WKnMTn6j/sVbqilPdQXTWraSjBwFXSYGirpkSWE2R9Qvz9tNiTKQvoKILpCuTjBKzOIm0nxw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/helper-wasm-section": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-opt": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0", - "@webassemblyjs/wast-printer": "1.9.0" - } - }, - "@webassemblyjs/wasm-gen": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz", - "integrity": "sha512-cPE3o44YzOOHvlsb4+E9qSqjc9Qf9Na1OO/BHFy4OI91XDE14MjFN4lTMezzaIWdPqHnsTodGGNP+iRSYfGkjA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wasm-opt": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz", - "integrity": "sha512-Qkjgm6Anhm+OMbIL0iokO7meajkzQD71ioelnfPEj6r4eOFuqm4YC3VBPqXjFyyNwowzbMD+hizmprP/Fwkl2A==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-buffer": "1.9.0", - "@webassemblyjs/wasm-gen": "1.9.0", - "@webassemblyjs/wasm-parser": "1.9.0" - } - }, - "@webassemblyjs/wasm-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz", - "integrity": "sha512-9+wkMowR2AmdSWQzsPEjFU7njh8HTO5MqO8vjwEHuM+AMHioNqSBONRdr0NQQ3dVQrzp0s8lTcYqzUdb7YgELA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-wasm-bytecode": "1.9.0", - "@webassemblyjs/ieee754": "1.9.0", - "@webassemblyjs/leb128": "1.9.0", - "@webassemblyjs/utf8": "1.9.0" - } - }, - "@webassemblyjs/wast-parser": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz", - "integrity": "sha512-qsqSAP3QQ3LyZjNC/0jBJ/ToSxfYJ8kYyuiGvtn/8MK89VrNEfwj7BPQzJVHi0jGTRK2dGdJ5PRqhtjzoww+bw==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/floating-point-hex-parser": "1.9.0", - "@webassemblyjs/helper-api-error": "1.9.0", - "@webassemblyjs/helper-code-frame": "1.9.0", - "@webassemblyjs/helper-fsm": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "@webassemblyjs/wast-printer": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz", - "integrity": "sha512-2J0nE95rHXHyQ24cWjMKJ1tqB/ds8z/cyeOZxJhcb+rW+SQASVjuznUSmdz5GpVJTzU8JkhYut0D3siFDD6wsA==", - "dev": true, - "requires": { - "@webassemblyjs/ast": "1.9.0", - "@webassemblyjs/wast-parser": "1.9.0", - "@xtuc/long": "4.2.2" - } - }, - "mkdirp": { - "version": "0.5.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", - "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", - "dev": true, - "requires": { - "minimist": "^1.2.5" - } - } } }, "webpack-cli": { @@ -22359,9 +22485,9 @@ } }, "webpack-dev-server": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.10.1.tgz", - "integrity": "sha512-AGG4+XrrXn4rbZUueyNrQgO4KGnol+0wm3MPdqGLmmA+NofZl3blZQKxZ9BND6RDNuvAK9OMYClhjOSnxpWRoA==", + "version": "3.11.0", + "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz", + "integrity": "sha512-PUxZ+oSTxogFQgkTtFndEtJIPNmml7ExwufBZ9L2/Xyyd5PnOL5UreWe5ZT7IU25DSdykL9p1MLQzmLh2ljSeg==", "dev": true, "requires": { "ansi-html": "0.0.7", @@ -22372,31 +22498,31 @@ "debug": "^4.1.1", "del": "^4.1.1", "express": "^4.17.1", - "html-entities": "^1.2.1", + "html-entities": "^1.3.1", "http-proxy-middleware": "0.19.1", "import-local": "^2.0.0", "internal-ip": "^4.3.0", "ip": "^1.1.5", "is-absolute-url": "^3.0.3", "killable": "^1.0.1", - "loglevel": "^1.6.6", + "loglevel": "^1.6.8", "opn": "^5.5.0", "p-retry": "^3.0.1", - "portfinder": "^1.0.25", + "portfinder": "^1.0.26", "schema-utils": "^1.0.0", "selfsigned": "^1.10.7", "semver": "^6.3.0", "serve-index": "^1.9.1", - "sockjs": "0.3.19", + "sockjs": "0.3.20", "sockjs-client": "1.4.0", - "spdy": "^4.0.1", + "spdy": "^4.0.2", "strip-ansi": "^3.0.1", "supports-color": "^6.1.0", "url": "^0.11.0", "webpack-dev-middleware": "^3.7.2", "webpack-log": "^2.0.0", "ws": "^6.2.1", - "yargs": "12.0.5" + "yargs": "^13.3.2" }, "dependencies": { "ansi-regex": { @@ -22405,34 +22531,6 @@ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, - "cliui": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", - "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", - "dev": true, - "requires": { - "string-width": "^2.1.1", - "strip-ansi": "^4.0.0", - "wrap-ansi": "^2.0.0" - }, - "dependencies": { - "ansi-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", - "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", - "dev": true - }, - "strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", - "dev": true, - "requires": { - "ansi-regex": "^3.0.0" - } - } - } - }, "del": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", @@ -22448,12 +22546,6 @@ "rimraf": "^2.6.3" } }, - "get-caller-file": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", - "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", - "dev": true - }, "globby": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", @@ -22475,14 +22567,11 @@ } } }, - "is-fullwidth-code-point": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", - "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", - "dev": true, - "requires": { - "number-is-nan": "^1.0.0" - } + "html-entities": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.3.1.tgz", + "integrity": "sha512-rhE/4Z3hIhzHAUKbW8jVcCyuT5oJCXXqhN/6mXXVCpzTmvJnoH2HL/bt3EZ6p55jbFJBeAe1ZNpL5BugLujxNA==", + "dev": true }, "is-path-in-cwd": { "version": "2.1.0", @@ -22502,12 +22591,6 @@ "path-is-inside": "^1.0.2" } }, - "require-main-filename": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", - "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", - "dev": true - }, "rimraf": { "version": "2.7.1", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", @@ -22523,6 +22606,34 @@ "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, + "string-width": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", + "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", + "dev": true, + "requires": { + "emoji-regex": "^7.0.1", + "is-fullwidth-code-point": "^2.0.0", + "strip-ansi": "^5.1.0" + }, + "dependencies": { + "ansi-regex": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", + "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", + "dev": true + }, + "strip-ansi": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", + "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", + "dev": true, + "requires": { + "ansi-regex": "^4.1.0" + } + } + } + }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", @@ -22541,29 +22652,6 @@ "has-flag": "^3.0.0" } }, - "wrap-ansi": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", - "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", - "dev": true, - "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" - }, - "dependencies": { - "string-width": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", - "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", - "dev": true, - "requires": { - "code-point-at": "^1.0.0", - "is-fullwidth-code-point": "^1.0.0", - "strip-ansi": "^3.0.0" - } - } - } - }, "ws": { "version": "6.2.1", "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz", @@ -22574,33 +22662,21 @@ } }, "yargs": { - "version": "12.0.5", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", - "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", + "version": "13.3.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.3.2.tgz", + "integrity": "sha512-AX3Zw5iPruN5ie6xGRIDgqkT+ZhnRlZMLMHAs8tg7nRruy2Nb+i5o9bwghAogtM08q1dpr2LVoS8KSTMYpWXUw==", "dev": true, "requires": { - "cliui": "^4.0.0", - "decamelize": "^1.2.0", + "cliui": "^5.0.0", "find-up": "^3.0.0", - "get-caller-file": "^1.0.1", - "os-locale": "^3.0.0", + "get-caller-file": "^2.0.1", "require-directory": "^2.1.1", - "require-main-filename": "^1.0.1", + "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", - "string-width": "^2.0.0", + "string-width": "^3.0.0", "which-module": "^2.0.0", - "y18n": "^3.2.1 || ^4.0.0", - "yargs-parser": "^11.1.1" - } - }, - "yargs-parser": { - "version": "11.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", - "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", - "dev": true, - "requires": { - "camelcase": "^5.0.0", - "decamelize": "^1.2.0" + "y18n": "^4.0.0", + "yargs-parser": "^13.1.2" } } } @@ -22917,9 +22993,9 @@ } }, "yargs-parser": { - "version": "13.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.1.tgz", - "integrity": "sha512-oVAVsHz6uFrg3XQheFII8ESO2ssAf9luWuAd6Wexsu4F3OtIW0o8IribPXYrD4WC24LWtPrJlGy87y5udK+dxQ==", + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.1.2.tgz", + "integrity": "sha512-3lbsNRf/j+A4QuSZfDRA7HRSfWrzO0YjqTJd5kjAq37Zep1CEgaYmrH9Q3GwPiB9cHyd1Y1UwggGhJGoxipbzg==", "dev": true, "requires": { "camelcase": "^5.0.0", diff --git a/package.json b/package.json index e94c6b0fa..e49d07810 100644 --- a/package.json +++ b/package.json @@ -143,7 +143,7 @@ "tsconfig-paths-webpack-plugin": "^3.2.0", "webpack": "^4.35.3", "webpack-cli": "^3.3.6", - "webpack-dev-server": "^3.10.1" + "webpack-dev-server": "^3.11.0" }, "optionalDependencies": { "fsevents": "^1.2.9" @@ -196,7 +196,6 @@ "check-types": "tsc --noEmit", "extract-json-messages": "rimraf build/locale && cross-env NODE_ENV=extract babel src 'src/**/*.{ts,tsx}' -o build/dashboard.bundle.js", "extract-messages": "npm run extract-json-messages && npm run transpile-messages", - "generate-component": "plop --plopfile .plop/plopfile.js", "heroku-postbuild": "npm run build", "serve:lhci": "NODE_ENV=production npm run server", "start": "webpack-dev-server -d", diff --git a/schema.graphql b/schema.graphql index 4925d28f5..876d48e8b 100644 --- a/schema.graphql +++ b/schema.graphql @@ -1957,8 +1957,93 @@ input IntRangeInput { lte: Int } +type Invoice implements ObjectWithMetadata & Job & Node { + id: ID! + metadata: [MetadataItem]! + status: JobStatusEnum! + number: String + externalUrl: String + privateMetadata: [MetadataItem]! + privateMeta: [MetaStore]! @deprecated(reason: "Use the `privetaMetadata` field. This field will be removed after 2020-07-31.") + meta: [MetaStore]! @deprecated(reason: "Use the `metadata` field. This field will be removed after 2020-07-31.") + createdAt: DateTime! + updatedAt: DateTime! + url: String +} + +type InvoiceCreate { + errors: [Error!]! @deprecated(reason: "Use typed errors with error codes. This field will be removed after 2020-07-31.") + invoiceErrors: [InvoiceError!]! + invoice: Invoice +} + +input InvoiceCreateInput { + number: String! + url: String! +} + +type InvoiceDelete { + errors: [Error!]! @deprecated(reason: "Use typed errors with error codes. This field will be removed after 2020-07-31.") + invoiceErrors: [InvoiceError!]! + invoice: Invoice +} + +type InvoiceError { + field: String + message: String + code: InvoiceErrorCode! +} + +enum InvoiceErrorCode { + REQUIRED + NOT_READY + URL_NOT_SET + EMAIL_NOT_SET + NUMBER_NOT_SET + NOT_FOUND + INVALID_STATUS +} + +type InvoiceRequest { + errors: [Error!]! @deprecated(reason: "Use typed errors with error codes. This field will be removed after 2020-07-31.") + order: Order + invoiceErrors: [InvoiceError!]! + invoice: Invoice +} + +type InvoiceRequestDelete { + errors: [Error!]! @deprecated(reason: "Use typed errors with error codes. This field will be removed after 2020-07-31.") + invoiceErrors: [InvoiceError!]! + invoice: Invoice +} + +type InvoiceSendEmail { + errors: [Error!]! @deprecated(reason: "Use typed errors with error codes. This field will be removed after 2020-07-31.") + invoiceErrors: [InvoiceError!]! + invoice: Invoice +} + +type InvoiceUpdate { + errors: [Error!]! @deprecated(reason: "Use typed errors with error codes. This field will be removed after 2020-07-31.") + invoiceErrors: [InvoiceError!]! + invoice: Invoice +} + scalar JSONString +interface Job { + status: JobStatusEnum! + createdAt: DateTime! + updatedAt: DateTime! +} + +enum JobStatusEnum { + PENDING + SUCCESS + FAILED + DELETED +} + enum LanguageCodeEnum { AR AZ @@ -2442,6 +2527,12 @@ type Mutation { menuItemUpdate(id: ID!, input: MenuItemInput!): MenuItemUpdate menuItemTranslate(id: ID!, input: NameTranslationInput!, languageCode: LanguageCodeEnum!): MenuItemTranslate menuItemMove(menu: ID!, moves: [MenuItemMoveInput]!): MenuItemMove + invoiceRequest(number: String, orderId: ID!): InvoiceRequest + invoiceRequestDelete(id: ID!): InvoiceRequestDelete + invoiceCreate(input: InvoiceCreateInput!, orderId: ID!): InvoiceCreate + invoiceDelete(id: ID!): InvoiceDelete + invoiceUpdate(id: ID!, input: UpdateInvoiceInput!): InvoiceUpdate + invoiceSendEmail(id: ID!): InvoiceSendEmail giftCardActivate(id: ID!): GiftCardActivate giftCardCreate(input: GiftCardCreateInput!): GiftCardCreate giftCardDeactivate(id: ID!): GiftCardDeactivate @@ -2589,6 +2680,7 @@ type Order implements Node & ObjectWithMetadata { lines: [OrderLine]! actions: [OrderAction]! availableShippingMethods: [ShippingMethod] + invoices: [Invoice] number: String isPaid: Boolean paymentStatus: PaymentChargeStatusEnum @@ -4769,6 +4861,11 @@ input TranslationInput { scalar UUID +input UpdateInvoiceInput { + number: String + url: String +} + type UpdateMetadata { errors: [Error!]! @deprecated(reason: "Use typed errors with error codes. This field will be removed after 2020-07-31.") metadataErrors: [MetadataError!]! @@ -5251,6 +5348,9 @@ enum WebhookEventTypeEnum { ORDER_UPDATED ORDER_CANCELLED ORDER_FULFILLED + INVOICE_REQUESTED + INVOICE_DELETED + INVOICE_SENT CUSTOMER_CREATED PRODUCT_CREATED CHECKOUT_QUANTITY_CHANGED @@ -5268,6 +5368,9 @@ enum WebhookSampleEventTypeEnum { ORDER_UPDATED ORDER_CANCELLED ORDER_FULFILLED + INVOICE_REQUESTED + INVOICE_DELETED + INVOICE_SENT CUSTOMER_CREATED PRODUCT_CREATED CHECKOUT_QUANTITY_CHANGED diff --git a/src/containers/BackgroundTasks/BackgroundTasksProvider.tsx b/src/containers/BackgroundTasks/BackgroundTasksProvider.tsx index b6948caef..600addac1 100644 --- a/src/containers/BackgroundTasks/BackgroundTasksProvider.tsx +++ b/src/containers/BackgroundTasks/BackgroundTasksProvider.tsx @@ -1,21 +1,21 @@ import { IMessageContext } from "@saleor/components/messages"; import useNotifier from "@saleor/hooks/useNotifier"; +import { checkOrderInvoicesStatus } from "@saleor/orders/queries"; import ApolloClient from "apollo-client"; import React from "react"; import { useApolloClient } from "react-apollo"; import { IntlShape, useIntl } from "react-intl"; import BackgroundTasksContext from "./context"; -import { handleTask, queueCustom } from "./tasks"; +import { handleTask, queueCustom, queueInvoiceGenerate } from "./tasks"; import { QueuedTask, Task, TaskData, TaskStatus } from "./types"; export const backgroundTasksRefreshTime = 15 * 1000; -// TODO: Remove underscores when working on #575 or similar PR export function useBackgroundTasks( - _apolloClient: ApolloClient, - _notify: IMessageContext, - _intl: IntlShape + apolloClient: ApolloClient, + notify: IMessageContext, + intl: IntlShape ) { const idCounter = React.useRef(0); const tasks = React.useRef([]); @@ -64,6 +64,23 @@ export function useBackgroundTasks( case Task.CUSTOM: queueCustom(idCounter.current, tasks, data); break; + case Task.INVOICE_GENERATE: + queueInvoiceGenerate( + idCounter.current, + data.generateInvoice, + tasks, + () => + apolloClient.query({ + fetchPolicy: "network-only", + query: checkOrderInvoicesStatus, + variables: { + id: data.generateInvoice.orderId + } + }), + notify, + intl + ); + break; } return idCounter.current; diff --git a/src/containers/BackgroundTasks/tasks.ts b/src/containers/BackgroundTasks/tasks.ts index 8c60479ff..a1adcdf27 100644 --- a/src/containers/BackgroundTasks/tasks.ts +++ b/src/containers/BackgroundTasks/tasks.ts @@ -1,4 +1,31 @@ -import { QueuedTask, TaskData, TaskStatus } from "./types"; +import { IMessageContext } from "@saleor/components/messages"; +import { commonMessages } from "@saleor/intl"; +import { CheckOrderInvoicesStatus } from "@saleor/orders/types/CheckOrderInvoicesStatus"; +import { JobStatusEnum } from "@saleor/types/globalTypes"; +import { ApolloQueryResult } from "apollo-client"; +import { defineMessages, IntlShape } from "react-intl"; + +import { + InvoiceGenerateParams, + QueuedTask, + TaskData, + TaskStatus +} from "./types"; + +export const messages = defineMessages({ + invoiceGenerateFinishedText: { + defaultMessage: + "Requested Invoice was generated. It was added to the top of the invoice list on this view. Enjoy!" + }, + invoiceGenerateFinishedTitle: { + defaultMessage: "Invoice Generated", + description: "invoice generating has finished, header" + }, + invoiceGenerationFailedTitle: { + defaultMessage: "Invoice Generation", + description: "dialog header, title" + } +}); export async function handleTask(task: QueuedTask): Promise { let status = TaskStatus.PENDING; @@ -41,3 +68,47 @@ export function queueCustom( } ]; } + +export function queueInvoiceGenerate( + id: number, + generateInvoice: InvoiceGenerateParams, + tasks: React.MutableRefObject, + fetch: () => Promise>, + notify: IMessageContext, + intl: IntlShape +) { + if (!generateInvoice) { + throw new Error("generateInvoice is required when creating custom task"); + } + tasks.current = [ + ...tasks.current, + { + handle: async () => { + const result = await fetch(); + const status = result.data.order.invoices.find( + invoice => invoice.id === generateInvoice.invoiceId + ).status; + + return status === JobStatusEnum.SUCCESS + ? TaskStatus.SUCCESS + : status === JobStatusEnum.PENDING + ? TaskStatus.PENDING + : TaskStatus.FAILURE; + }, + id, + onCompleted: data => + data.status === TaskStatus.SUCCESS + ? notify({ + status: "success", + text: intl.formatMessage(messages.invoiceGenerateFinishedText), + title: intl.formatMessage(messages.invoiceGenerateFinishedTitle) + }) + : notify({ + text: intl.formatMessage(commonMessages.somethingWentWrong), + title: intl.formatMessage(messages.invoiceGenerationFailedTitle) + }), + onError: handleError, + status: TaskStatus.PENDING + } + ]; +} diff --git a/src/containers/BackgroundTasks/types.ts b/src/containers/BackgroundTasks/types.ts index 0eabb6f7c..b927a0554 100644 --- a/src/containers/BackgroundTasks/types.ts +++ b/src/containers/BackgroundTasks/types.ts @@ -1,11 +1,16 @@ export enum Task { - CUSTOM + CUSTOM, + INVOICE_GENERATE } export enum TaskStatus { FAILURE, PENDING, SUCCESS } +export interface InvoiceGenerateParams { + orderId: string; + invoiceId: string; +} export interface OnCompletedTaskData { status: TaskStatus; @@ -21,6 +26,7 @@ export interface QueuedTask { } export interface TaskData { + generateInvoice?: InvoiceGenerateParams; id?: string; handle?: () => Promise; onCompleted?: OnCompletedTaskFn; diff --git a/src/fragments/errors.ts b/src/fragments/errors.ts index a45f97292..36154150f 100644 --- a/src/fragments/errors.ts +++ b/src/fragments/errors.ts @@ -104,3 +104,10 @@ export const webhookErrorFragment = gql` field } `; + +export const invoiceErrorFragment = gql` + fragment InvoiceErrorFragment on InvoiceError { + code + field + } +`; diff --git a/src/fragments/orders.ts b/src/fragments/orders.ts index a16092550..0ea8826fb 100644 --- a/src/fragments/orders.ts +++ b/src/fragments/orders.ts @@ -63,11 +63,22 @@ export const fulfillmentFragment = gql` } `; +export const invoiceFragment = gql` + fragment InvoiceFragment on Invoice { + id + number + createdAt + url + status + } +`; + export const fragmentOrderDetails = gql` ${fragmentAddress} ${fragmentOrderEvent} ${fragmentOrderLine} ${fulfillmentFragment} + ${invoiceFragment} fragment OrderDetailsFragment on Order { id billingAddress { @@ -143,5 +154,8 @@ export const fragmentOrderDetails = gql` amount currency } + invoices { + ...InvoiceFragment + } } `; diff --git a/src/fragments/types/InvoiceErrorFragment.ts b/src/fragments/types/InvoiceErrorFragment.ts new file mode 100644 index 000000000..6f7fdd502 --- /dev/null +++ b/src/fragments/types/InvoiceErrorFragment.ts @@ -0,0 +1,15 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { InvoiceErrorCode } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL fragment: InvoiceErrorFragment +// ==================================================== + +export interface InvoiceErrorFragment { + __typename: "InvoiceError"; + code: InvoiceErrorCode; + field: string | null; +} diff --git a/src/fragments/types/InvoiceFragment.ts b/src/fragments/types/InvoiceFragment.ts new file mode 100644 index 000000000..1959df4ab --- /dev/null +++ b/src/fragments/types/InvoiceFragment.ts @@ -0,0 +1,18 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { JobStatusEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL fragment: InvoiceFragment +// ==================================================== + +export interface InvoiceFragment { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} diff --git a/src/fragments/types/OrderDetailsFragment.ts b/src/fragments/types/OrderDetailsFragment.ts index f14f016d7..48fbcb7ae 100644 --- a/src/fragments/types/OrderDetailsFragment.ts +++ b/src/fragments/types/OrderDetailsFragment.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; +import { OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, JobStatusEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL fragment: OrderDetailsFragment @@ -246,6 +246,15 @@ export interface OrderDetailsFragment_discount { currency: string; } +export interface OrderDetailsFragment_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + export interface OrderDetailsFragment { __typename: "Order"; id: string; @@ -272,4 +281,5 @@ export interface OrderDetailsFragment { userEmail: string | null; availableShippingMethods: (OrderDetailsFragment_availableShippingMethods | null)[] | null; discount: OrderDetailsFragment_discount | null; + invoices: (OrderDetailsFragment_invoices | null)[] | null; } diff --git a/src/intl.ts b/src/intl.ts index 43c150b65..50ebb2148 100644 --- a/src/intl.ts +++ b/src/intl.ts @@ -141,6 +141,10 @@ export const buttonMessages = defineMessages({ defaultMessage: "Save", description: "button" }, + send: { + defaultMessage: "Send", + description: "button" + }, show: { defaultMessage: "Show", description: "button" diff --git a/src/orders/components/OrderDetailsPage/OrderDetailsPage.tsx b/src/orders/components/OrderDetailsPage/OrderDetailsPage.tsx index 41d023559..bd0062055 100644 --- a/src/orders/components/OrderDetailsPage/OrderDetailsPage.tsx +++ b/src/orders/components/OrderDetailsPage/OrderDetailsPage.tsx @@ -20,6 +20,7 @@ import OrderCustomer from "../OrderCustomer"; import OrderCustomerNote from "../OrderCustomerNote"; import OrderFulfillment from "../OrderFulfillment"; import OrderHistory, { FormData as HistoryFormData } from "../OrderHistory"; +import OrderInvoiceList from "../OrderInvoiceList"; import OrderPayment from "../OrderPayment/OrderPayment"; import OrderUnfulfilledItems from "../OrderUnfulfilledItems/OrderUnfulfilledItems"; @@ -62,6 +63,9 @@ export interface OrderDetailsPageProps extends UserPermissionProps { onOrderCancel(); onNoteAdd(data: HistoryFormData); onProfileView(); + onInvoiceClick(invoiceId: string); + onInvoiceGenerate(); + onInvoiceSend(invoiceId: string); } const OrderDetailsPage: React.FC = props => { @@ -80,7 +84,10 @@ const OrderDetailsPage: React.FC = props => { onPaymentRefund, onPaymentVoid, onShippingAddressEdit, - onProfileView + onProfileView, + onInvoiceClick, + onInvoiceGenerate, + onInvoiceSend } = props; const classes = useStyles(props); @@ -179,6 +186,13 @@ const OrderDetailsPage: React.FC = props => { onProfileView={onProfileView} /> + + order.customerNote)} /> diff --git a/src/orders/components/OrderInvoiceEmailSendDialog/OrderInvoiceEmailSendDialog.tsx b/src/orders/components/OrderInvoiceEmailSendDialog/OrderInvoiceEmailSendDialog.tsx new file mode 100644 index 000000000..639c79e94 --- /dev/null +++ b/src/orders/components/OrderInvoiceEmailSendDialog/OrderInvoiceEmailSendDialog.tsx @@ -0,0 +1,81 @@ +import Button from "@material-ui/core/Button"; +import Dialog from "@material-ui/core/Dialog"; +import DialogActions from "@material-ui/core/DialogActions"; +import DialogContent from "@material-ui/core/DialogContent"; +import DialogContentText from "@material-ui/core/DialogContentText"; +import DialogTitle from "@material-ui/core/DialogTitle"; +import ConfirmButton, { + ConfirmButtonTransitionState +} from "@saleor/components/ConfirmButton"; +import FormSpacer from "@saleor/components/FormSpacer"; +import { InvoiceErrorFragment } from "@saleor/fragments/types/InvoiceErrorFragment"; +import { InvoiceFragment } from "@saleor/fragments/types/InvoiceFragment"; +import { buttonMessages } from "@saleor/intl"; +import { DialogProps } from "@saleor/types"; +import getInvoiceErrorMessage from "@saleor/utils/errors/invoice"; +import React from "react"; +import { FormattedMessage, useIntl } from "react-intl"; + +export interface OrderInvoiceEmailSendDialogProps extends DialogProps { + confirmButtonState: ConfirmButtonTransitionState; + errors: InvoiceErrorFragment[]; + invoice: InvoiceFragment; + onSend: () => void; +} + +const OrderInvoiceEmailSendDialog: React.FC = ({ + confirmButtonState, + errors, + open, + invoice, + onClose, + onSend +}) => { + const intl = useIntl(); + + return ( + + + {intl.formatMessage({ + defaultMessage: "Send Invoice", + description: "dialog header" + })} + + + + {invoice?.number} + }} + /> + + {errors.length > 0 && ( + <> + + {errors.map((err, idx) => ( + + {getInvoiceErrorMessage(err, intl)} + + ))} + + )} + + + + + + + + + ); +}; +OrderInvoiceEmailSendDialog.displayName = "OrderInvoiceEmailSendDialog"; +export default OrderInvoiceEmailSendDialog; diff --git a/src/orders/components/OrderInvoiceEmailSendDialog/index.ts b/src/orders/components/OrderInvoiceEmailSendDialog/index.ts new file mode 100644 index 000000000..62455152a --- /dev/null +++ b/src/orders/components/OrderInvoiceEmailSendDialog/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderInvoiceEmailSendDialog"; +export * from "./OrderInvoiceEmailSendDialog"; diff --git a/src/orders/components/OrderInvoiceList/OrderInvoiceList.tsx b/src/orders/components/OrderInvoiceList/OrderInvoiceList.tsx new file mode 100644 index 000000000..c22bb9080 --- /dev/null +++ b/src/orders/components/OrderInvoiceList/OrderInvoiceList.tsx @@ -0,0 +1,148 @@ +import Button from "@material-ui/core/Button"; +import Card from "@material-ui/core/Card"; +import CardContent from "@material-ui/core/CardContent"; +import { makeStyles } from "@material-ui/core/styles"; +import TableBody from "@material-ui/core/TableBody"; +import TableCell from "@material-ui/core/TableCell"; +import TableHead from "@material-ui/core/TableHead"; +import TableRow from "@material-ui/core/TableRow"; +import Typography from "@material-ui/core/Typography"; +import CardTitle from "@saleor/components/CardTitle"; +import Date from "@saleor/components/Date"; +import ResponsiveTable from "@saleor/components/ResponsiveTable"; +import Skeleton from "@saleor/components/Skeleton"; +import TableCellHeader from "@saleor/components/TableCellHeader"; +import { InvoiceFragment } from "@saleor/fragments/types/InvoiceFragment"; +import { buttonMessages } from "@saleor/intl"; +import React from "react"; +import { FormattedMessage, useIntl } from "react-intl"; + +const useStyles = makeStyles( + () => ({ + cardContentTable: { + "&:last-child": { + padding: 0 + }, + padding: 0 + }, + colAction: { paddingRight: "0.5rem", width: "auto" }, + colNumber: { width: "100%" }, + colNumberClickable: { + cursor: "pointer", + width: "100%" + } + }), + { name: "OrderInvoiceList" } +); + +export interface OrderInvoiceListProps { + invoices: InvoiceFragment[]; + onInvoiceGenerate: () => void; + onInvoiceClick: (invoiceId: string) => void; + onInvoiceSend: (invoiceId: string) => void; +} + +const OrderInvoiceList: React.FC = props => { + const { invoices, onInvoiceGenerate, onInvoiceClick, onInvoiceSend } = props; + + const classes = useStyles(props); + + const intl = useIntl(); + + const generatedInvoices = invoices?.filter( + invoice => invoice.status === "SUCCESS" + ); + + return ( + + + + + ) + } + /> + + {!generatedInvoices ? ( + + ) : !generatedInvoices?.length ? ( + + + + ) : ( + + + + + + + {onInvoiceSend && ( + + + + )} + + + + {generatedInvoices.map(invoice => ( + + onInvoiceClick(invoice.id)} + > + {" "} + {invoice.number} + + {" "} + + + + {onInvoiceSend && ( + onInvoiceSend(invoice.id)} + > + + + )} + + ))} + + + )} + + + ); +}; + +OrderInvoiceList.displayName = "OrderInvoiceList"; +export default OrderInvoiceList; diff --git a/src/orders/components/OrderInvoiceList/index.ts b/src/orders/components/OrderInvoiceList/index.ts new file mode 100644 index 000000000..155c0f16e --- /dev/null +++ b/src/orders/components/OrderInvoiceList/index.ts @@ -0,0 +1,2 @@ +export { default } from "./OrderInvoiceList"; +export * from "./OrderInvoiceList"; diff --git a/src/orders/containers/OrderOperations.tsx b/src/orders/containers/OrderOperations.tsx index c134b21aa..68832d315 100644 --- a/src/orders/containers/OrderOperations.tsx +++ b/src/orders/containers/OrderOperations.tsx @@ -3,6 +3,8 @@ import React from "react"; import { getMutationProviderData } from "../../misc"; import { PartialMutationProviderOutput } from "../../types"; import { + TypedInvoiceEmailSendMutation, + TypedInvoiceRequestMutation, TypedOrderAddNoteMutation, TypedOrderCancelMutation, TypedOrderCaptureMutation, @@ -20,6 +22,14 @@ import { TypedOrderUpdateMutation, TypedOrderVoidMutation } from "../mutations"; +import { + InvoiceEmailSend, + InvoiceEmailSendVariables +} from "../types/InvoiceEmailSend"; +import { + InvoiceRequest, + InvoiceRequestVariables +} from "../types/InvoiceRequest"; import { OrderAddNote, OrderAddNoteVariables } from "../types/OrderAddNote"; import { OrderCancel, OrderCancelVariables } from "../types/OrderCancel"; import { OrderCapture, OrderCaptureVariables } from "../types/OrderCapture"; @@ -128,6 +138,14 @@ interface OrderOperationsProps { OrderLineUpdate, OrderLineUpdateVariables >; + orderInvoiceRequest: PartialMutationProviderOutput< + InvoiceRequest, + InvoiceRequestVariables + >; + orderInvoiceSend: PartialMutationProviderOutput< + InvoiceEmailSend, + InvoiceEmailSendVariables + >; }) => React.ReactNode; onOrderFulfillmentCancel: (data: OrderFulfillmentCancel) => void; onOrderFulfillmentUpdate: (data: OrderFulfillmentUpdateTracking) => void; @@ -145,6 +163,8 @@ interface OrderOperationsProps { onOrderLineDelete: (data: OrderLineDelete) => void; onOrderLinesAdd: (data: OrderLinesAdd) => void; onOrderLineUpdate: (data: OrderLineUpdate) => void; + onInvoiceRequest: (data: InvoiceRequest) => void; + onInvoiceSend: (data: InvoiceEmailSend) => void; } const OrderOperations: React.FC = ({ @@ -164,7 +184,9 @@ const OrderOperations: React.FC = ({ onDraftFinalize, onOrderFulfillmentCancel, onOrderFulfillmentUpdate, - onOrderMarkAsPaid + onOrderMarkAsPaid, + onInvoiceRequest, + onInvoiceSend }) => ( {(...orderVoid) => ( @@ -233,58 +255,86 @@ const OrderOperations: React.FC = ({ > {( ...markAsPaid - ) => - children({ - orderAddNote: getMutationProviderData( - ...addNote - ), - orderCancel: getMutationProviderData( - ...orderCancel - ), - orderDraftCancel: getMutationProviderData( - ...cancelDraft - ), - orderDraftFinalize: getMutationProviderData( - ...finalizeDraft - ), - orderDraftUpdate: getMutationProviderData( - ...updateDraft - ), - orderFulfillmentCancel: getMutationProviderData( - ...cancelFulfillment - ), - orderFulfillmentUpdateTracking: getMutationProviderData( - ...updateTrackingNumber - ), - orderLineDelete: getMutationProviderData( - ...deleteOrderLine - ), - orderLineUpdate: getMutationProviderData( - ...updateOrderLine - ), - orderLinesAdd: getMutationProviderData( - ...addOrderLine - ), - orderPaymentCapture: getMutationProviderData( - ...paymentCapture - ), - orderPaymentMarkAsPaid: getMutationProviderData( - ...markAsPaid - ), - orderPaymentRefund: getMutationProviderData( - ...paymentRefund - ), - orderShippingMethodUpdate: getMutationProviderData( - ...updateShippingMethod - ), - orderUpdate: getMutationProviderData( - ...update - ), - orderVoid: getMutationProviderData( - ...orderVoid - ) - }) - } + ) => ( + + {( + ...invoiceRequest + ) => ( + + {( + ...invoiceEmailSend + ) => + children( + { + orderAddNote: getMutationProviderData( + ...addNote + ), + orderCancel: getMutationProviderData( + ...orderCancel + ), + orderDraftCancel: getMutationProviderData( + ...cancelDraft + ), + orderDraftFinalize: getMutationProviderData( + ...finalizeDraft + ), + orderDraftUpdate: getMutationProviderData( + ...updateDraft + ), + orderFulfillmentCancel: getMutationProviderData( + ...cancelFulfillment + ), + orderFulfillmentUpdateTracking: getMutationProviderData( + ...updateTrackingNumber + ), + orderInvoiceRequest: getMutationProviderData( + ...invoiceRequest + ), + orderInvoiceSend: getMutationProviderData( + ...invoiceEmailSend + ), + orderLineDelete: getMutationProviderData( + ...deleteOrderLine + ), + orderLineUpdate: getMutationProviderData( + ...updateOrderLine + ), + orderLinesAdd: getMutationProviderData( + ...addOrderLine + ), + orderPaymentCapture: getMutationProviderData( + ...paymentCapture + ), + orderPaymentMarkAsPaid: getMutationProviderData( + ...markAsPaid + ), + orderPaymentRefund: getMutationProviderData( + ...paymentRefund + ), + orderShippingMethodUpdate: getMutationProviderData( + ...updateShippingMethod + ), + orderUpdate: getMutationProviderData( + ...update + ), + orderVoid: getMutationProviderData( + ...orderVoid + ) + } + ) + } + + )} + + )} )} diff --git a/src/orders/fixtures.ts b/src/orders/fixtures.ts index 6ec41e96e..f992a15fc 100644 --- a/src/orders/fixtures.ts +++ b/src/orders/fixtures.ts @@ -1,3 +1,4 @@ +import { InvoiceFragment } from "@saleor/fragments/types/InvoiceFragment"; import { SearchCustomers_search_edges_node } from "@saleor/searches/types/SearchCustomers"; import { warehouseList } from "@saleor/warehouses/fixtures"; import { MessageDescriptor } from "react-intl"; @@ -5,6 +6,7 @@ import { MessageDescriptor } from "react-intl"; import { transformOrderStatus, transformPaymentStatus } from "../misc"; import { FulfillmentStatus, + JobStatusEnum, OrderAction, OrderEventsEnum, OrderStatus, @@ -914,6 +916,16 @@ export const order = (placeholder: string): OrderDetails_order => ({ } ], id: "T3JkZXI6OQ==", + invoices: [ + { + __typename: "Invoice", + createdAt: "2020-06-22T13:52:05.094636+00:00", + id: "SW52b2ljZTox", + number: "1", + status: JobStatusEnum.SUCCESS, + url: "invoice1" + } + ], lines: [ { __typename: "OrderLine", @@ -1046,6 +1058,16 @@ export const draftOrder = (placeholder: string): OrderDetails_order => ({ events: [], fulfillments: [], id: "T3JkZXI6MjQ=", + invoices: [ + { + __typename: "Invoice", + createdAt: "2020-06-22T13:52:05.094636+00:00", + id: "SW52b2ljZTox", + number: "1", + status: JobStatusEnum.SUCCESS, + url: "invoice1" + } + ], lines: [ { __typename: "OrderLine" as "OrderLine", @@ -1298,3 +1320,42 @@ export const orderLineSearch = ( ] } ]; + +export const invoices: InvoiceFragment[] = [ + { + __typename: "Invoice", + createdAt: "2020-07-02T12:13:56.901097+00:00", + id: "SW52b2ljZTo0", + number: "1/07/2020", + status: JobStatusEnum.PENDING, + url: + "http://localhost:8000/media/invoices/invoice-1/07/2020-order-20-1fef611b-7514-4dc6-aee3-09a8232b1d6a.pdf" + }, + { + __typename: "Invoice", + createdAt: "2020-07-02T09:06:17.059412+00:00", + id: "SW52b2ljZToz", + number: "1/07/2020", + status: JobStatusEnum.SUCCESS, + url: + "http://localhost:8000/media/invoices/invoice-1/07/2020-order-20-8df26967-ad21-4075-a446-cef44ae05197.pdf" + }, + { + __typename: "Invoice", + createdAt: "2020-07-02T09:05:58.300952+00:00", + id: "SW52b2ljZToy", + number: "1/07/2020", + status: JobStatusEnum.SUCCESS, + url: + "http://localhost:8000/media/invoices/invoice-1/07/2020-order-20-5ebc85e0-e587-4386-8292-9b85839281e6.pdf" + }, + { + __typename: "Invoice", + createdAt: "2020-07-02T09:04:27.257562+00:00", + id: "SW52b2ljZTox", + number: "1/07/2020", + status: JobStatusEnum.SUCCESS, + url: + "http://localhost:8000/media/invoices/invoice-1/07/2020-order-20-0e449e10-ef4b-4066-bebe-361f670b6820.pdf" + } +]; diff --git a/src/orders/mutations.ts b/src/orders/mutations.ts index 3819a5276..70253553d 100644 --- a/src/orders/mutations.ts +++ b/src/orders/mutations.ts @@ -1,14 +1,26 @@ import { fragmentAddress } from "@saleor/fragments/address"; -import { orderErrorFragment } from "@saleor/fragments/errors"; +import { + invoiceErrorFragment, + orderErrorFragment +} from "@saleor/fragments/errors"; import { fragmentOrderDetails, - fragmentOrderEvent + fragmentOrderEvent, + invoiceFragment } from "@saleor/fragments/orders"; import makeMutation from "@saleor/hooks/makeMutation"; import gql from "graphql-tag"; import { TypedMutation } from "../mutations"; import { FulfillOrder, FulfillOrderVariables } from "./types/FulfillOrder"; +import { + InvoiceEmailSend, + InvoiceEmailSendVariables +} from "./types/InvoiceEmailSend"; +import { + InvoiceRequest, + InvoiceRequestVariables +} from "./types/InvoiceRequest"; import { OrderAddNote, OrderAddNoteVariables } from "./types/OrderAddNote"; import { OrderCancel, OrderCancelVariables } from "./types/OrderCancel"; import { OrderCapture, OrderCaptureVariables } from "./types/OrderCapture"; @@ -448,3 +460,47 @@ export const useOrderFulfill = makeMutation< FulfillOrder, FulfillOrderVariables >(fulfillOrder); + +const invoiceRequestMutation = gql` + ${invoiceErrorFragment} + ${invoiceFragment} + mutation InvoiceRequest($orderId: ID!) { + invoiceRequest(orderId: $orderId) { + errors: invoiceErrors { + ...InvoiceErrorFragment + } + invoice { + ...InvoiceFragment + } + order { + id + invoices { + ...InvoiceFragment + } + } + } + } +`; +export const TypedInvoiceRequestMutation = TypedMutation< + InvoiceRequest, + InvoiceRequestVariables +>(invoiceRequestMutation); + +const invoiceEmailSendMutation = gql` + ${invoiceErrorFragment} + ${invoiceFragment} + mutation InvoiceEmailSend($id: ID!) { + invoiceSendEmail(id: $id) { + errors: invoiceErrors { + ...InvoiceErrorFragment + } + invoice { + ...InvoiceFragment + } + } + } +`; +export const TypedInvoiceEmailSendMutation = TypedMutation< + InvoiceEmailSend, + InvoiceEmailSendVariables +>(invoiceEmailSendMutation); diff --git a/src/orders/queries.ts b/src/orders/queries.ts index 334c15538..a0d227c23 100644 --- a/src/orders/queries.ts +++ b/src/orders/queries.ts @@ -1,5 +1,8 @@ import { fragmentAddress } from "@saleor/fragments/address"; -import { fragmentOrderDetails } from "@saleor/fragments/orders"; +import { + fragmentOrderDetails, + invoiceFragment +} from "@saleor/fragments/orders"; import makeQuery from "@saleor/hooks/makeQuery"; import makeTopLevelSearch from "@saleor/hooks/makeTopLevelSearch"; import gql from "graphql-tag"; @@ -228,3 +231,15 @@ export const useOrderFulfillData = makeQuery< OrderFulfillData, OrderFulfillDataVariables >(orderFulfillData); + +export const checkOrderInvoicesStatus = gql` + ${invoiceFragment} + query CheckOrderInvoicesStatus($id: ID!) { + order(id: $id) { + id + invoices { + ...InvoiceFragment + } + } + } +`; diff --git a/src/orders/types/CheckOrderInvoicesStatus.ts b/src/orders/types/CheckOrderInvoicesStatus.ts new file mode 100644 index 000000000..85dc7962e --- /dev/null +++ b/src/orders/types/CheckOrderInvoicesStatus.ts @@ -0,0 +1,32 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { JobStatusEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL query operation: CheckOrderInvoicesStatus +// ==================================================== + +export interface CheckOrderInvoicesStatus_order_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + +export interface CheckOrderInvoicesStatus_order { + __typename: "Order"; + id: string; + invoices: (CheckOrderInvoicesStatus_order_invoices | null)[] | null; +} + +export interface CheckOrderInvoicesStatus { + order: CheckOrderInvoicesStatus_order | null; +} + +export interface CheckOrderInvoicesStatusVariables { + id: string; +} diff --git a/src/orders/types/FulfillOrder.ts b/src/orders/types/FulfillOrder.ts index f3f8ca758..60798da5c 100644 --- a/src/orders/types/FulfillOrder.ts +++ b/src/orders/types/FulfillOrder.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { OrderFulfillInput, OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; +import { OrderFulfillInput, OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, JobStatusEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL mutation operation: FulfillOrder @@ -254,6 +254,15 @@ export interface FulfillOrder_orderFulfill_order_discount { currency: string; } +export interface FulfillOrder_orderFulfill_order_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + export interface FulfillOrder_orderFulfill_order { __typename: "Order"; id: string; @@ -280,6 +289,7 @@ export interface FulfillOrder_orderFulfill_order { userEmail: string | null; availableShippingMethods: (FulfillOrder_orderFulfill_order_availableShippingMethods | null)[] | null; discount: FulfillOrder_orderFulfill_order_discount | null; + invoices: (FulfillOrder_orderFulfill_order_invoices | null)[] | null; } export interface FulfillOrder_orderFulfill { diff --git a/src/orders/types/InvoiceEmailSend.ts b/src/orders/types/InvoiceEmailSend.ts new file mode 100644 index 000000000..6406ed5c0 --- /dev/null +++ b/src/orders/types/InvoiceEmailSend.ts @@ -0,0 +1,38 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { InvoiceErrorCode, JobStatusEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: InvoiceEmailSend +// ==================================================== + +export interface InvoiceEmailSend_invoiceSendEmail_errors { + __typename: "InvoiceError"; + code: InvoiceErrorCode; + field: string | null; +} + +export interface InvoiceEmailSend_invoiceSendEmail_invoice { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + +export interface InvoiceEmailSend_invoiceSendEmail { + __typename: "InvoiceSendEmail"; + errors: InvoiceEmailSend_invoiceSendEmail_errors[]; + invoice: InvoiceEmailSend_invoiceSendEmail_invoice | null; +} + +export interface InvoiceEmailSend { + invoiceSendEmail: InvoiceEmailSend_invoiceSendEmail | null; +} + +export interface InvoiceEmailSendVariables { + id: string; +} diff --git a/src/orders/types/InvoiceRequest.ts b/src/orders/types/InvoiceRequest.ts new file mode 100644 index 000000000..973ff4bda --- /dev/null +++ b/src/orders/types/InvoiceRequest.ts @@ -0,0 +1,54 @@ +/* tslint:disable */ +/* eslint-disable */ +// This file was automatically generated and should not be edited. + +import { InvoiceErrorCode, JobStatusEnum } from "./../../types/globalTypes"; + +// ==================================================== +// GraphQL mutation operation: InvoiceRequest +// ==================================================== + +export interface InvoiceRequest_invoiceRequest_errors { + __typename: "InvoiceError"; + code: InvoiceErrorCode; + field: string | null; +} + +export interface InvoiceRequest_invoiceRequest_invoice { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + +export interface InvoiceRequest_invoiceRequest_order_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + +export interface InvoiceRequest_invoiceRequest_order { + __typename: "Order"; + id: string; + invoices: (InvoiceRequest_invoiceRequest_order_invoices | null)[] | null; +} + +export interface InvoiceRequest_invoiceRequest { + __typename: "InvoiceRequest"; + errors: InvoiceRequest_invoiceRequest_errors[]; + invoice: InvoiceRequest_invoiceRequest_invoice | null; + order: InvoiceRequest_invoiceRequest_order | null; +} + +export interface InvoiceRequest { + invoiceRequest: InvoiceRequest_invoiceRequest | null; +} + +export interface InvoiceRequestVariables { + orderId: string; +} diff --git a/src/orders/types/OrderCancel.ts b/src/orders/types/OrderCancel.ts index 14800b4b4..ad93b33e3 100644 --- a/src/orders/types/OrderCancel.ts +++ b/src/orders/types/OrderCancel.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; +import { OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, JobStatusEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL mutation operation: OrderCancel @@ -252,6 +252,15 @@ export interface OrderCancel_orderCancel_order_discount { currency: string; } +export interface OrderCancel_orderCancel_order_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + export interface OrderCancel_orderCancel_order { __typename: "Order"; id: string; @@ -278,6 +287,7 @@ export interface OrderCancel_orderCancel_order { userEmail: string | null; availableShippingMethods: (OrderCancel_orderCancel_order_availableShippingMethods | null)[] | null; discount: OrderCancel_orderCancel_order_discount | null; + invoices: (OrderCancel_orderCancel_order_invoices | null)[] | null; } export interface OrderCancel_orderCancel { diff --git a/src/orders/types/OrderCapture.ts b/src/orders/types/OrderCapture.ts index 38ddbdf43..fe727a08e 100644 --- a/src/orders/types/OrderCapture.ts +++ b/src/orders/types/OrderCapture.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; +import { OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, JobStatusEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL mutation operation: OrderCapture @@ -252,6 +252,15 @@ export interface OrderCapture_orderCapture_order_discount { currency: string; } +export interface OrderCapture_orderCapture_order_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + export interface OrderCapture_orderCapture_order { __typename: "Order"; id: string; @@ -278,6 +287,7 @@ export interface OrderCapture_orderCapture_order { userEmail: string | null; availableShippingMethods: (OrderCapture_orderCapture_order_availableShippingMethods | null)[] | null; discount: OrderCapture_orderCapture_order_discount | null; + invoices: (OrderCapture_orderCapture_order_invoices | null)[] | null; } export interface OrderCapture_orderCapture { diff --git a/src/orders/types/OrderDetails.ts b/src/orders/types/OrderDetails.ts index 944958c59..48e16314c 100644 --- a/src/orders/types/OrderDetails.ts +++ b/src/orders/types/OrderDetails.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, WeightUnitsEnum } from "./../../types/globalTypes"; +import { OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, JobStatusEnum, WeightUnitsEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL query operation: OrderDetails @@ -246,6 +246,15 @@ export interface OrderDetails_order_discount { currency: string; } +export interface OrderDetails_order_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + export interface OrderDetails_order { __typename: "Order"; id: string; @@ -272,6 +281,7 @@ export interface OrderDetails_order { userEmail: string | null; availableShippingMethods: (OrderDetails_order_availableShippingMethods | null)[] | null; discount: OrderDetails_order_discount | null; + invoices: (OrderDetails_order_invoices | null)[] | null; } export interface OrderDetails_shop_countries { diff --git a/src/orders/types/OrderDraftCancel.ts b/src/orders/types/OrderDraftCancel.ts index 26b8c2672..3320b9017 100644 --- a/src/orders/types/OrderDraftCancel.ts +++ b/src/orders/types/OrderDraftCancel.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; +import { OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, JobStatusEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL mutation operation: OrderDraftCancel @@ -252,6 +252,15 @@ export interface OrderDraftCancel_draftOrderDelete_order_discount { currency: string; } +export interface OrderDraftCancel_draftOrderDelete_order_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + export interface OrderDraftCancel_draftOrderDelete_order { __typename: "Order"; id: string; @@ -278,6 +287,7 @@ export interface OrderDraftCancel_draftOrderDelete_order { userEmail: string | null; availableShippingMethods: (OrderDraftCancel_draftOrderDelete_order_availableShippingMethods | null)[] | null; discount: OrderDraftCancel_draftOrderDelete_order_discount | null; + invoices: (OrderDraftCancel_draftOrderDelete_order_invoices | null)[] | null; } export interface OrderDraftCancel_draftOrderDelete { diff --git a/src/orders/types/OrderDraftFinalize.ts b/src/orders/types/OrderDraftFinalize.ts index 62f289a95..db0658998 100644 --- a/src/orders/types/OrderDraftFinalize.ts +++ b/src/orders/types/OrderDraftFinalize.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; +import { OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, JobStatusEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL mutation operation: OrderDraftFinalize @@ -252,6 +252,15 @@ export interface OrderDraftFinalize_draftOrderComplete_order_discount { currency: string; } +export interface OrderDraftFinalize_draftOrderComplete_order_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + export interface OrderDraftFinalize_draftOrderComplete_order { __typename: "Order"; id: string; @@ -278,6 +287,7 @@ export interface OrderDraftFinalize_draftOrderComplete_order { userEmail: string | null; availableShippingMethods: (OrderDraftFinalize_draftOrderComplete_order_availableShippingMethods | null)[] | null; discount: OrderDraftFinalize_draftOrderComplete_order_discount | null; + invoices: (OrderDraftFinalize_draftOrderComplete_order_invoices | null)[] | null; } export interface OrderDraftFinalize_draftOrderComplete { diff --git a/src/orders/types/OrderDraftUpdate.ts b/src/orders/types/OrderDraftUpdate.ts index 90d8e039e..ec5873bae 100644 --- a/src/orders/types/OrderDraftUpdate.ts +++ b/src/orders/types/OrderDraftUpdate.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { DraftOrderInput, OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; +import { DraftOrderInput, OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, JobStatusEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL mutation operation: OrderDraftUpdate @@ -252,6 +252,15 @@ export interface OrderDraftUpdate_draftOrderUpdate_order_discount { currency: string; } +export interface OrderDraftUpdate_draftOrderUpdate_order_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + export interface OrderDraftUpdate_draftOrderUpdate_order { __typename: "Order"; id: string; @@ -278,6 +287,7 @@ export interface OrderDraftUpdate_draftOrderUpdate_order { userEmail: string | null; availableShippingMethods: (OrderDraftUpdate_draftOrderUpdate_order_availableShippingMethods | null)[] | null; discount: OrderDraftUpdate_draftOrderUpdate_order_discount | null; + invoices: (OrderDraftUpdate_draftOrderUpdate_order_invoices | null)[] | null; } export interface OrderDraftUpdate_draftOrderUpdate { diff --git a/src/orders/types/OrderFulfillmentCancel.ts b/src/orders/types/OrderFulfillmentCancel.ts index 6d440ced5..276d099b5 100644 --- a/src/orders/types/OrderFulfillmentCancel.ts +++ b/src/orders/types/OrderFulfillmentCancel.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { FulfillmentCancelInput, OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; +import { FulfillmentCancelInput, OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, JobStatusEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL mutation operation: OrderFulfillmentCancel @@ -252,6 +252,15 @@ export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_discount { currency: string; } +export interface OrderFulfillmentCancel_orderFulfillmentCancel_order_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + export interface OrderFulfillmentCancel_orderFulfillmentCancel_order { __typename: "Order"; id: string; @@ -278,6 +287,7 @@ export interface OrderFulfillmentCancel_orderFulfillmentCancel_order { userEmail: string | null; availableShippingMethods: (OrderFulfillmentCancel_orderFulfillmentCancel_order_availableShippingMethods | null)[] | null; discount: OrderFulfillmentCancel_orderFulfillmentCancel_order_discount | null; + invoices: (OrderFulfillmentCancel_orderFulfillmentCancel_order_invoices | null)[] | null; } export interface OrderFulfillmentCancel_orderFulfillmentCancel { diff --git a/src/orders/types/OrderFulfillmentUpdateTracking.ts b/src/orders/types/OrderFulfillmentUpdateTracking.ts index c1b94eb78..0652c972d 100644 --- a/src/orders/types/OrderFulfillmentUpdateTracking.ts +++ b/src/orders/types/OrderFulfillmentUpdateTracking.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { FulfillmentUpdateTrackingInput, OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; +import { FulfillmentUpdateTrackingInput, OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, JobStatusEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL mutation operation: OrderFulfillmentUpdateTracking @@ -252,6 +252,15 @@ export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_o currency: string; } +export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order { __typename: "Order"; id: string; @@ -278,6 +287,7 @@ export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_o userEmail: string | null; availableShippingMethods: (OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_availableShippingMethods | null)[] | null; discount: OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_discount | null; + invoices: (OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking_order_invoices | null)[] | null; } export interface OrderFulfillmentUpdateTracking_orderFulfillmentUpdateTracking { diff --git a/src/orders/types/OrderLineDelete.ts b/src/orders/types/OrderLineDelete.ts index 632857bfc..e8dcdada6 100644 --- a/src/orders/types/OrderLineDelete.ts +++ b/src/orders/types/OrderLineDelete.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; +import { OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, JobStatusEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL mutation operation: OrderLineDelete @@ -252,6 +252,15 @@ export interface OrderLineDelete_draftOrderLineDelete_order_discount { currency: string; } +export interface OrderLineDelete_draftOrderLineDelete_order_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + export interface OrderLineDelete_draftOrderLineDelete_order { __typename: "Order"; id: string; @@ -278,6 +287,7 @@ export interface OrderLineDelete_draftOrderLineDelete_order { userEmail: string | null; availableShippingMethods: (OrderLineDelete_draftOrderLineDelete_order_availableShippingMethods | null)[] | null; discount: OrderLineDelete_draftOrderLineDelete_order_discount | null; + invoices: (OrderLineDelete_draftOrderLineDelete_order_invoices | null)[] | null; } export interface OrderLineDelete_draftOrderLineDelete { diff --git a/src/orders/types/OrderLineUpdate.ts b/src/orders/types/OrderLineUpdate.ts index f2186941f..25db5e22a 100644 --- a/src/orders/types/OrderLineUpdate.ts +++ b/src/orders/types/OrderLineUpdate.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { OrderLineInput, OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; +import { OrderLineInput, OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, JobStatusEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL mutation operation: OrderLineUpdate @@ -252,6 +252,15 @@ export interface OrderLineUpdate_draftOrderLineUpdate_order_discount { currency: string; } +export interface OrderLineUpdate_draftOrderLineUpdate_order_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + export interface OrderLineUpdate_draftOrderLineUpdate_order { __typename: "Order"; id: string; @@ -278,6 +287,7 @@ export interface OrderLineUpdate_draftOrderLineUpdate_order { userEmail: string | null; availableShippingMethods: (OrderLineUpdate_draftOrderLineUpdate_order_availableShippingMethods | null)[] | null; discount: OrderLineUpdate_draftOrderLineUpdate_order_discount | null; + invoices: (OrderLineUpdate_draftOrderLineUpdate_order_invoices | null)[] | null; } export interface OrderLineUpdate_draftOrderLineUpdate { diff --git a/src/orders/types/OrderLinesAdd.ts b/src/orders/types/OrderLinesAdd.ts index b8ab0f6ef..75d8d50bc 100644 --- a/src/orders/types/OrderLinesAdd.ts +++ b/src/orders/types/OrderLinesAdd.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { OrderLineCreateInput, OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; +import { OrderLineCreateInput, OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, JobStatusEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL mutation operation: OrderLinesAdd @@ -252,6 +252,15 @@ export interface OrderLinesAdd_draftOrderLinesCreate_order_discount { currency: string; } +export interface OrderLinesAdd_draftOrderLinesCreate_order_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + export interface OrderLinesAdd_draftOrderLinesCreate_order { __typename: "Order"; id: string; @@ -278,6 +287,7 @@ export interface OrderLinesAdd_draftOrderLinesCreate_order { userEmail: string | null; availableShippingMethods: (OrderLinesAdd_draftOrderLinesCreate_order_availableShippingMethods | null)[] | null; discount: OrderLinesAdd_draftOrderLinesCreate_order_discount | null; + invoices: (OrderLinesAdd_draftOrderLinesCreate_order_invoices | null)[] | null; } export interface OrderLinesAdd_draftOrderLinesCreate { diff --git a/src/orders/types/OrderMarkAsPaid.ts b/src/orders/types/OrderMarkAsPaid.ts index a13983748..f9b985df0 100644 --- a/src/orders/types/OrderMarkAsPaid.ts +++ b/src/orders/types/OrderMarkAsPaid.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; +import { OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, JobStatusEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL mutation operation: OrderMarkAsPaid @@ -252,6 +252,15 @@ export interface OrderMarkAsPaid_orderMarkAsPaid_order_discount { currency: string; } +export interface OrderMarkAsPaid_orderMarkAsPaid_order_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + export interface OrderMarkAsPaid_orderMarkAsPaid_order { __typename: "Order"; id: string; @@ -278,6 +287,7 @@ export interface OrderMarkAsPaid_orderMarkAsPaid_order { userEmail: string | null; availableShippingMethods: (OrderMarkAsPaid_orderMarkAsPaid_order_availableShippingMethods | null)[] | null; discount: OrderMarkAsPaid_orderMarkAsPaid_order_discount | null; + invoices: (OrderMarkAsPaid_orderMarkAsPaid_order_invoices | null)[] | null; } export interface OrderMarkAsPaid_orderMarkAsPaid { diff --git a/src/orders/types/OrderRefund.ts b/src/orders/types/OrderRefund.ts index 87a525ed8..36acf30ac 100644 --- a/src/orders/types/OrderRefund.ts +++ b/src/orders/types/OrderRefund.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; +import { OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, JobStatusEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL mutation operation: OrderRefund @@ -252,6 +252,15 @@ export interface OrderRefund_orderRefund_order_discount { currency: string; } +export interface OrderRefund_orderRefund_order_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + export interface OrderRefund_orderRefund_order { __typename: "Order"; id: string; @@ -278,6 +287,7 @@ export interface OrderRefund_orderRefund_order { userEmail: string | null; availableShippingMethods: (OrderRefund_orderRefund_order_availableShippingMethods | null)[] | null; discount: OrderRefund_orderRefund_order_discount | null; + invoices: (OrderRefund_orderRefund_order_invoices | null)[] | null; } export interface OrderRefund_orderRefund { diff --git a/src/orders/types/OrderVoid.ts b/src/orders/types/OrderVoid.ts index 77ce2269d..41c348242 100644 --- a/src/orders/types/OrderVoid.ts +++ b/src/orders/types/OrderVoid.ts @@ -2,7 +2,7 @@ /* eslint-disable */ // This file was automatically generated and should not be edited. -import { OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction } from "./../../types/globalTypes"; +import { OrderErrorCode, OrderEventsEmailsEnum, OrderEventsEnum, FulfillmentStatus, PaymentChargeStatusEnum, OrderStatus, OrderAction, JobStatusEnum } from "./../../types/globalTypes"; // ==================================================== // GraphQL mutation operation: OrderVoid @@ -252,6 +252,15 @@ export interface OrderVoid_orderVoid_order_discount { currency: string; } +export interface OrderVoid_orderVoid_order_invoices { + __typename: "Invoice"; + id: string; + number: string | null; + createdAt: any; + url: string | null; + status: JobStatusEnum; +} + export interface OrderVoid_orderVoid_order { __typename: "Order"; id: string; @@ -278,6 +287,7 @@ export interface OrderVoid_orderVoid_order { userEmail: string | null; availableShippingMethods: (OrderVoid_orderVoid_order_availableShippingMethods | null)[] | null; discount: OrderVoid_orderVoid_order_discount | null; + invoices: (OrderVoid_orderVoid_order_invoices | null)[] | null; } export interface OrderVoid_orderVoid { diff --git a/src/orders/urls.ts b/src/orders/urls.ts index e4935f6f9..0efa7ffde 100644 --- a/src/orders/urls.ts +++ b/src/orders/urls.ts @@ -99,7 +99,8 @@ export type OrderUrlDialog = | "finalize" | "mark-paid" | "refund" - | "void"; + | "void" + | "invoice-send"; export type OrderUrlQueryParams = Dialog & SingleAction; export const orderUrl = (id: string, params?: OrderUrlQueryParams) => orderPath(encodeURIComponent(id)) + "?" + stringifyQs(params); diff --git a/src/orders/views/OrderDetails/OrderDetailsMessages.tsx b/src/orders/views/OrderDetails/OrderDetailsMessages.tsx index 475f3d27e..56b3112b8 100644 --- a/src/orders/views/OrderDetails/OrderDetailsMessages.tsx +++ b/src/orders/views/OrderDetails/OrderDetailsMessages.tsx @@ -1,9 +1,12 @@ +import { messages } from "@saleor/containers/BackgroundTasks/tasks"; import useNavigator from "@saleor/hooks/useNavigator"; import useNotifier from "@saleor/hooks/useNotifier"; import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers"; import React from "react"; import { useIntl } from "react-intl"; +import { InvoiceEmailSend } from "../../types/InvoiceEmailSend"; +import { InvoiceRequest } from "../../types/InvoiceRequest"; import { OrderAddNote } from "../../types/OrderAddNote"; import { OrderCancel } from "../../types/OrderCancel"; import { OrderCapture } from "../../types/OrderCapture"; @@ -42,6 +45,9 @@ interface OrderDetailsMessages { handlePaymentRefund: (data: OrderRefund) => void; handleShippingMethodUpdate: (data: OrderShippingMethodUpdate) => void; handleUpdate: (data: OrderUpdate) => void; + handleInvoiceGeneratePending: (data: InvoiceRequest) => void; + handleInvoiceGenerateFinished: (data: InvoiceRequest) => void; + handleInvoiceSend: (data: InvoiceEmailSend) => void; }) => React.ReactElement; id: string; params: OrderUrlQueryParams; @@ -251,11 +257,51 @@ export const OrderDetailsMessages: React.FC = ({ closeModal(); } }; + const handleInvoiceGeneratePending = (data: InvoiceRequest) => { + const errs = data.invoiceRequest?.errors; + if (errs.length === 0) { + pushMessage({ + text: intl.formatMessage({ + defaultMessage: + "We’re generating the invoice you requested. Please wait a couple of moments" + }), + title: intl.formatMessage({ + defaultMessage: "Invoice is Generating" + }) + }); + closeModal(); + } + }; + const handleInvoiceGenerateFinished = (data: InvoiceRequest) => { + const errs = data.invoiceRequest?.errors; + if (errs.length === 0) { + pushMessage({ + status: "success", + text: intl.formatMessage(messages.invoiceGenerateFinishedText), + title: intl.formatMessage(messages.invoiceGenerateFinishedTitle) + }); + closeModal(); + } + }; + const handleInvoiceSend = (data: InvoiceEmailSend) => { + const errs = data.invoiceSendEmail?.errors; + if (errs.length === 0) { + pushMessage({ + text: intl.formatMessage({ + defaultMessage: "Invoice email sent" + }) + }); + closeModal(); + } + }; return children({ handleDraftCancel, handleDraftFinalize, handleDraftUpdate, + handleInvoiceGenerateFinished, + handleInvoiceGeneratePending, + handleInvoiceSend, handleNoteAdd, handleOrderCancel, handleOrderFulfillmentCancel, diff --git a/src/orders/views/OrderDetails/index.tsx b/src/orders/views/OrderDetails/index.tsx index 7696086d2..282fa7d9d 100644 --- a/src/orders/views/OrderDetails/index.tsx +++ b/src/orders/views/OrderDetails/index.tsx @@ -1,9 +1,13 @@ import NotFoundPage from "@saleor/components/NotFoundPage"; import { WindowTitle } from "@saleor/components/WindowTitle"; import { DEFAULT_INITIAL_SEARCH_DATA } from "@saleor/config"; +import { Task } from "@saleor/containers/BackgroundTasks/types"; +import useBackgroundTask from "@saleor/hooks/useBackgroundTask"; import useNavigator from "@saleor/hooks/useNavigator"; import useUser from "@saleor/hooks/useUser"; import OrderCannotCancelOrderDialog from "@saleor/orders/components/OrderCannotCancelOrderDialog"; +import OrderInvoiceEmailSendDialog from "@saleor/orders/components/OrderInvoiceEmailSendDialog"; +import { InvoiceRequest } from "@saleor/orders/types/InvoiceRequest"; import useCustomerSearch from "@saleor/searches/useCustomerSearch"; import createDialogActionHandlers from "@saleor/utils/handlers/dialogActionHandlers"; import { useWarehouseList } from "@saleor/warehouses/queries"; @@ -17,7 +21,11 @@ import { transformAddressToForm } from "../../../misc"; import { productUrl } from "../../../products/urls"; -import { FulfillmentStatus, OrderStatus } from "../../../types/globalTypes"; +import { + FulfillmentStatus, + JobStatusEnum, + OrderStatus +} from "../../../types/globalTypes"; import OrderAddressEditDialog from "../../components/OrderAddressEditDialog"; import OrderCancelDialog from "../../components/OrderCancelDialog"; import OrderDetailsPage from "../../components/OrderDetailsPage"; @@ -103,6 +111,7 @@ export const OrderDetails: React.FC = ({ id, params }) => { first: 30 } }); + const { queue } = useBackgroundTask(); const intl = useIntl(); const [openModal, closeModal] = createDialogActionHandlers< @@ -148,6 +157,22 @@ export const OrderDetails: React.FC = ({ id, params }) => { onDraftFinalize={orderMessages.handleDraftFinalize} onDraftCancel={orderMessages.handleDraftCancel} onOrderMarkAsPaid={orderMessages.handleOrderMarkAsPaid} + onInvoiceRequest={(data: InvoiceRequest) => { + if ( + data.invoiceRequest.invoice.status === JobStatusEnum.SUCCESS + ) { + orderMessages.handleInvoiceGenerateFinished(data); + } else { + orderMessages.handleInvoiceGeneratePending(data); + queue(Task.INVOICE_GENERATE, { + generateInvoice: { + invoiceId: data.invoiceRequest.invoice.id, + orderId: id + } + }); + } + }} + onInvoiceSend={orderMessages.handleInvoiceSend} > {({ orderAddNote, @@ -165,7 +190,9 @@ export const OrderDetails: React.FC = ({ id, params }) => { orderFulfillmentUpdateTracking, orderDraftCancel, orderDraftFinalize, - orderPaymentMarkAsPaid + orderPaymentMarkAsPaid, + orderInvoiceRequest, + orderInvoiceSend }) => ( <> {order?.status !== OrderStatus.DRAFT ? ( @@ -229,6 +256,21 @@ export const OrderDetails: React.FC = ({ id, params }) => { onProfileView={() => navigate(customerUrl(order.user.id)) } + onInvoiceClick={id => + window.open( + order.invoices.find(invoice => invoice.id === id) + ?.url, + "_blank" + ) + } + onInvoiceGenerate={() => + orderInvoiceRequest.mutate({ + orderId: id + }) + } + onInvoiceSend={id => + openModal("invoice-send", { id }) + } /> = ({ id, params }) => { } onClose={closeModal} /> + invoice.id === params.id + )} + onClose={closeModal} + onSend={() => + orderInvoiceSend.mutate({ id: params.id }) + } + /> ) : ( <> diff --git a/src/storybook/__snapshots__/Stories.test.ts.snap b/src/storybook/__snapshots__/Stories.test.ts.snap index 3a3bb39b8..13528ecfb 100644 --- a/src/storybook/__snapshots__/Stories.test.ts.snap +++ b/src/storybook/__snapshots__/Stories.test.ts.snap @@ -9331,6 +9331,286 @@ exports[`Storyshots Orders / OrderHistory default 1`] = ` `; +exports[`Storyshots Orders / OrderInvoiceList loading 1`] = ` +
+
+
+ + Invoices + +
+ +
+
+
+
+
+ + ‌ + +
+
+
+`; + +exports[`Storyshots Orders / OrderInvoiceList with invoices 1`] = ` +
+
+
+ + Invoices + +
+ +
+
+
+
+
+
+ + + + + + + + + + + + + + + + + + + + + +
+
+
+ Invoice no +
+
+
+
+
+ Action +
+
+
+ Invoice 1/07/2020 +
+ created Jul 2, 2020 +
+
+ +
+ Invoice 1/07/2020 +
+ created Jul 2, 2020 +
+
+ +
+ Invoice 1/07/2020 +
+ created Jul 2, 2020 +
+
+ +
+
+
+
+
+`; + +exports[`Storyshots Orders / OrderInvoiceList without invoices 1`] = ` +
+
+
+ + Invoices + +
+ +
+
+
+
+
+
+ No invoices to be shown +
+
+
+
+`; + exports[`Storyshots Orders / OrderMarkAsPaidDialog default 1`] = `
+
+
+ + Invoices + +
+ +
+
+
+
+
+
+ + + + + + + + + + + + + +
+
+
+ Invoice no +
+
+
+
+
+ Action +
+
+
+ Invoice 1 +
+ created Jun 22, 2020 +
+
+ +
+
+
+
+
@@ -68100,6 +68498,124 @@ exports[`Storyshots Views / Orders / Order details default 1`] = `
+
+
+ + Invoices + +
+ +
+
+
+
+
+
+ + + + + + + + + + + + + +
+
+
+ Invoice no +
+
+
+
+
+ Action +
+
+
+ Invoice 1 +
+ created Jun 22, 2020 +
+
+ +
+
+
+
+
@@ -69159,6 +69675,124 @@ exports[`Storyshots Views / Orders / Order details fulfilled 1`] = `
+
+
+ + Invoices + +
+ +
+
+
+
+
+
+ + + + + + + + + + + + + +
+
+
+ Invoice no +
+
+
+
+
+ Action +
+
+
+ Invoice 1 +
+ created Jun 22, 2020 +
+
+ +
+
+
+
+
@@ -69744,6 +70378,52 @@ exports[`Storyshots Views / Orders / Order details loading 1`] = `
+
+
+ + Invoices + +
+ +
+
+
+
+
+ + ‌ + +
+
+
@@ -70803,6 +71483,124 @@ exports[`Storyshots Views / Orders / Order details no customer note 1`] = `
+
+
+ + Invoices + +
+ +
+
+
+
+
+
+ + + + + + + + + + + + + +
+
+
+ Invoice no +
+
+
+
+
+ Action +
+
+
+ Invoice 1 +
+ created Jun 22, 2020 +
+
+ +
+
+
+
+
@@ -71862,6 +72660,124 @@ exports[`Storyshots Views / Orders / Order details no payment 1`] = `
+
+
+ + Invoices + +
+ +
+
+
+
+
+
+ + + + + + + + + + + + + +
+
+
+ Invoice no +
+
+
+
+
+ Action +
+
+
+ Invoice 1 +
+ created Jun 22, 2020 +
+
+ +
+
+
+
+
@@ -72921,6 +73837,124 @@ exports[`Storyshots Views / Orders / Order details no shipping address 1`] = `
+
+
+ + Invoices + +
+ +
+
+
+
+
+
+ + + + + + + + + + + + + +
+
+
+ Invoice no +
+
+
+
+
+ Action +
+
+
+ Invoice 1 +
+ created Jun 22, 2020 +
+
+ +
+
+
+
+
@@ -73980,6 +75014,124 @@ exports[`Storyshots Views / Orders / Order details partially fulfilled 1`] = `
+
+
+ + Invoices + +
+ +
+
+
+
+
+
+ + + + + + + + + + + + + +
+
+
+ Invoice no +
+
+
+
+
+ Action +
+
+
+ Invoice 1 +
+ created Jun 22, 2020 +
+
+ +
+
+
+
+
@@ -75039,6 +76191,124 @@ exports[`Storyshots Views / Orders / Order details payment confirmed 1`] = `
+
+
+ + Invoices + +
+ +
+
+
+
+
+
+ + + + + + + + + + + + + +
+
+
+ Invoice no +
+
+
+
+
+ Action +
+
+
+ Invoice 1 +
+ created Jun 22, 2020 +
+
+ +
+
+
+
+
@@ -76098,6 +77368,124 @@ exports[`Storyshots Views / Orders / Order details payment error 1`] = `
+
+
+ + Invoices + +
+ +
+
+
+
+
+
+ + + + + + + + + + + + + +
+
+
+ Invoice no +
+
+
+
+
+ Action +
+
+
+ Invoice 1 +
+ created Jun 22, 2020 +
+
+ +
+
+
+
+
@@ -77157,6 +78545,124 @@ exports[`Storyshots Views / Orders / Order details pending payment 1`] = `
+
+
+ + Invoices + +
+ +
+
+
+
+
+
+ + + + + + + + + + + + + +
+
+
+ Invoice no +
+
+
+
+
+ Action +
+
+
+ Invoice 1 +
+ created Jun 22, 2020 +
+
+ +
+
+
+
+
@@ -78216,6 +79722,124 @@ exports[`Storyshots Views / Orders / Order details refunded payment 1`] = `
+
+
+ + Invoices + +
+ +
+
+
+
+
+
+ + + + + + + + + + + + + +
+
+
+ Invoice no +
+
+
+
+
+ Action +
+
+
+ Invoice 1 +
+ created Jun 22, 2020 +
+
+ +
+
+
+
+
@@ -79275,6 +80899,124 @@ exports[`Storyshots Views / Orders / Order details rejected payment 1`] = `
+
+
+ + Invoices + +
+ +
+
+
+
+
+
+ + + + + + + + + + + + + +
+
+
+ Invoice no +
+
+
+
+
+ Action +
+
+
+ Invoice 1 +
+ created Jun 22, 2020 +
+
+ +
+
+
+
+
@@ -80334,6 +82076,124 @@ exports[`Storyshots Views / Orders / Order details unfulfilled 1`] = `
+
+
+ + Invoices + +
+ +
+
+
+
+
+
+ + + + + + + + + + + + + +
+
+
+ Invoice no +
+
+
+
+
+ Action +
+
+
+ Invoice 1 +
+ created Jun 22, 2020 +
+
+ +
+
+
+
+
@@ -154913,6 +156773,75 @@ exports[`Storyshots Views / Webhooks / Create webhook default 1`] = `
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +