diff --git a/.circleci/config.yml b/.circleci/config.yml
index 119209ab2..3efd1edbc 100644
--- a/.circleci/config.yml
+++ b/.circleci/config.yml
@@ -138,37 +138,47 @@ jobs:
paths:
- front/dist
+ lint-front:
+ executor: node-executor
+ working_directory: ~/
+ resource_class: medium+
+ steps:
+ - attach_workspace:
+ at: ~/
+ - run:
+ name: Lint and type-check front app
+ command: |
+ pnpm check-types
+
test-front:
executor: node-executor
- working_directory: ~/front
+ parallelism: 4
+ working_directory: ~/
resource_class: medium+
steps:
- attach_workspace:
at: ~/
- run:
- name: Test front app and create reports
+ name: Install Playwright deps
command: |
- DEBUG_PRINT_LIMIT=10000 pnpm test:coverage --test-timeout=40000
+ npx playwright install --with-deps chromium
- run:
- name: Test shared-components and create reports
+ name: Test front app and create reports
+ environment:
+ FRONT_AUTH0_DOMAIN: boxtribute-dev.eu.auth0.com
+ FRONT_AUTH0_CLIENT_ID: ni9ZdcoIv3HU10kyc4t1qxOMxjVyxcbS
+ FRONT_USE_MSW: true
command: |
- DEBUG_PRINT_LIMIT=10000 pnpm -C ../shared-components test:coverage --test-timeout=40000
- - store_test_results:
- path: coverage/junit.xml
- - store_test_results:
- path: ../shared-components/coverage/junit.xml
- - store_artifacts:
- path: coverage
- destination: front-coverage
- - store_artifacts:
- path: ../shared-components/coverage
- destination: shared-components-coverage
- - codecov/upload:
- flags: frontend
- file: coverage/coverage-final.json
- - codecov/upload:
- flags: sharedComponents
- file: ../shared-components/coverage/coverage-final.json
+ SHARD="$((${CIRCLE_NODE_INDEX}+1))"; ls tests && pnpm test -- --shard=${SHARD}/${CIRCLE_NODE_TOTAL}
+ # TODO: add coverage, report, record video on fail
+ # - store_test_results:
+ # path: coverage/junit.xml
+ # - store_artifacts:
+ # path: coverage
+ # destination: front-coverage
+ # - codecov/upload:
+ # flags: frontend
+ # file: coverage/coverage-final.json
- slack/notify-on-failure:
only_for_branches: master,production
@@ -440,6 +450,10 @@ workflows:
context: STAGING
requires:
- install-node-packages
+ - lint-front:
+ context: STAGING
+ requires:
+ - install-node-packages
- test-front:
context: STAGING
requires:
diff --git a/.eslintrc.cjs b/.eslintrc.cjs
index 290370d90..9e94eae7b 100644
--- a/.eslintrc.cjs
+++ b/.eslintrc.cjs
@@ -83,15 +83,5 @@ module.exports = {
tsx: "never",
},
],
- },
- overrides: [
- {
- files: [
- "**/?(__)tests?(__)/**/*.[jt]s?(x)",
- "**/?(*.)+(spec|test).[jt]s?(x)",
- "**/mocks/**/*.[jt]s?(x)",
- ],
- extends: ["plugin:testing-library/react"],
- },
- ],
+ }
};
diff --git a/.gitignore b/.gitignore
index 34ccf32a2..e3e491e0d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -36,3 +36,8 @@ docs/graphql-api/public
.VSCodeCounter
*.old.*
__pycache__/*
+/test-results/
+/playwright-report/
+/blob-report/
+/playwright/.cache/
+state.json
diff --git a/.vscode/settings.json b/.vscode/settings.json
index cecdf019e..a564c7e2f 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -11,6 +11,7 @@
"editor.formatOnPaste": false, // required
"editor.formatOnType": false, // required
"editor.formatOnSave": true,
+ "prettier.configPath": ".prettierrc",
// eslint
"eslint.workingDirectories": ["./", "./front", "./shared-components", "./statviz"],
@@ -29,5 +30,6 @@
},
"typescript.tsdk": "node_modules/typescript/lib",
- "typescript.enablePromptUseWorkspaceTsdk": true
+ "typescript.enablePromptUseWorkspaceTsdk": true,
+ "git.enableCommitSigning": true
}
diff --git a/back/README.md b/back/README.md
index 83dfa16c0..5c5f24868 100755
--- a/back/README.md
+++ b/back/README.md
@@ -378,7 +378,7 @@ to simulate a god user with ID 8 (for a regular user, set something like `id=1,
> [!IMPORTANT]
> To keep the front-end side up-to-date with the GraphQL schema, make sure that the pre-commit command for `*.graphql` files (`id: generate-graphql-ts-types`) is running properly.
>
-> It should generate both `schema.graphql` (the introspected unified schema) and `graphql-env.d.ts` (the generated types to be ìnferred and consumed in the FE with `gql.tada`) inside `/graphql/generated/`.
+> It should generate `schema.graphql` (the introspected unified schema), `graphql-env.d.ts` (the generated types to be ìnferred and consumed in the FE with `gql.tada`), `types.ts` (base generated types for msw handlers and mocks) and lastly `mocks.ts` (base mocks to make fixtures and use in tests) inside `/graphql/generated/`.
## Project structure
diff --git a/docker-compose.yml b/docker-compose.yml
index 066b9feea..00d49ec91 100755
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -40,6 +40,7 @@ services:
NODE_ENV: development
HUSKY: 0
FRONT_ENVIRONMENT: ${ENVIRONMENT:-development}
+ FRONT_USE_MSW: ${USE_MSW}
FRONT_SENTRY_ENVIRONMENT: ${ENVIRONMENT:-development}
FRONT_SENTRY_FE_DSN: ${SENTRY_FE_DSN:-}
FRONT_SENTRY_TRACES_SAMPLE_RATE: ${SENTRY_TRACES_SAMPLE_RATE:-}
diff --git a/docs/adr/adr_frontend_tests.md b/docs/adr/adr_frontend_tests.md
new file mode 100644
index 000000000..9410daffb
--- /dev/null
+++ b/docs/adr/adr_frontend_tests.md
@@ -0,0 +1,79 @@
+# ADR: Use Playwright for Application, Integration and Component Testing
+
+Author: [Felipe](https://github.com/fhenrich33)
+
+Reviewed by: [Roanna K](https://github.com/aerinsol)
+
+## Status
+
+Proposed, Implementing
+
+## Context
+
+The current testing setup for the Boxtribute front-end project uses React Testing Library and Vitest for unit and integration tests. While these tools are effective for testing individual components and their interactions, the tests usually aren't fully 1-1 representative of what the user will experience. E2E and more involved integration testing are crucial for ensuring that the application works correctly from the user's perspective, covering the entire workflow from start to finish.
+
+Additionally, we use Mock Service Worker (MSW) to mock API requests during tests (and sometimes development) to avoid hitting the real development server and database during tests. This allows us to test the application in isolation and ensure consistent and fast test results.
+
+## Decision Drivers
+
+1. **Comprehensive Testing**: We need a testing framework that can simulate real user interactions, test the application as a whole, and handle integration tests with mocked API requests.
+2. **Cross-Browser Testing**: The ability to test the application across different browsers to ensure compatibility.
+3. **Ease of Use**: The testing framework should be easy to set up and use, with good documentation and community support.
+4. **Performance**: The framework should be fast and efficient, minimizing the impact on the development workflow.
+5. **Integration with CI/CD**: The framework should integrate well with our existing CI/CD pipeline.
+
+## Considered Options
+
+1. **React Testing Library + Vitest**
+
+ - Pros:
+ - Well-suited for unit and integration tests.
+ - Good community support and documentation.
+ - Easy to set up and use for isolated testing.
+ - Cons:
+ - Limited to testing individual components and their interactions.
+ - Does not provide comprehensive application testing capabilities (in comparison to Playwright).
+ - Runs against a mocked DOM structure (jsdom) instead of a real browser, which leads to flakiness and unreliability.
+ - No built-in support for cross-browser testing.
+
+2. **Playwright**
+ - Pros:
+ - Comprehensive application, integration, and component testing capabilities.
+ - Tests against the real DOM, as even in headless mode the tests run inside a real browser.
+ - Supports cross-browser testing (Chromium, Firefox, WebKit).
+ - Easy to set up and use with excellent documentation. The API for test specs is very similar to React Testing Library.
+ - Ability to generate tests by using the app. See https://playwright.dev/docs/codegen-intro.
+ - Can still run isolated component tests. See https://playwright.dev/docs/test-components.
+ - Can run visual diffing. See https://playwright.dev/docs/test-snapshots.
+ - Fast and efficient, with parallel test execution. Might not match React Testing Library speed but gets close while testing in a real environment.
+ - Integrates well with CI/CD pipelines in headless mode.
+ - Cons:
+ - Additional learning curve for advanced use cases.
+ - Extra setup may be required for advanced use cases.
+ - Slightly slower than React Testing Library for sequential test runs (alleviated by parallel runs).
+
+## Decision
+
+We have decided to adopt Playwright for application, integration, and component testing in the Boxtribute front-end project. Playwright provides comprehensive testing capabilities, supports cross-browser testing, and integrates well with our existing CI/CD pipeline. Additionally, Playwright can be used with Mock Service Worker (MSW) to mock API requests, allowing us to test the application in isolation, while faithfully mimicking the real server since the mocks infer the data types from the GraphQL Schema. Vitest will still be used for individual TypeScript functions and modules.
+
+## Consequences
+
+- **Positive**:
+
+ - Improved test coverage with comprehensive application, integration, and component tests.
+ - Ability to test the application across different browsers.
+ - Fast testing with parallel test execution, while being more faithful to how a user will experience the app.
+ - Better integration with our CI/CD pipeline. Less prone to flakiness.
+ - Consistent test results by mocking API requests with MSW based on our GraphQL Schema.
+
+- **Negative**:
+ - Additional learning curve for developers.
+ - Potential need for additional setup for advanced use cases.
+ - Heavier Development and CI/CD setup, as we install real browsers as dependencies.
+
+## References
+
+- [Playwright Documentation](https://playwright.dev/docs/intro)
+- [React Testing Library Documentation](https://testing-library.com/docs/react-testing-library/intro)
+- [Vitest Documentation](https://vitest.dev/)
+- [Mock Service Worker Documentation](https://mswjs.io/docs/)
diff --git a/example.env b/example.env
index a5f3b82b4..8c58da8f2 100644
--- a/example.env
+++ b/example.env
@@ -18,3 +18,5 @@ TEST_AUTH0_MANAGEMENT_API_CLIENT_ID=ZBDcEypTHMwn23ScgeaMqwzMxO5epguH
TEST_AUTH0_MANAGEMENT_API_CLIENT_SECRET=
ENVIRONMENT=development
+
+USE_MSW=false
diff --git a/front/README.md b/front/README.md
index e873ed9b4..00b3a4b3e 100644
--- a/front/README.md
+++ b/front/README.md
@@ -21,7 +21,7 @@ Following the [general set-up steps](../README.md), here a few steps that make y
### Install node and pnpm
-For almost all features of our development set-up you should also have [node](https://nodejs.org/en/download/) installed on your computer. You will need it to run front-end tests and the formatters and linters in your IDE (e.g. VSCode).
+For almost all features of Boxtribute's development set-up you should also have [node](https://nodejs.org/en/download/) installed on your computer. You will need it to run front-end tests and the formatters and linters in your IDE (e.g. VSCode).
We recommend you to install node through a [version control like nvm](https://github.com/nvm-sh/nvm). It provides you with much more clarity which version you are running and makes it easy to switch versions of node.
@@ -61,7 +61,7 @@ docker compose exec front pnpm format:write
## Note about pnpm and Docker
-We are using docker to spin up our dev environment. The front folder is in sync with the front Docker container. Therefore, the hot-reloading of the node development server should function.
+We are using docker to spin up Boxtribute's dev environment. The front folder is in sync with the front Docker container. Therefore, the hot-reloading of the node development server should function.
When you wish to add a dependency, e.g. when you make a change to your local `package.json`, you will need to rebuild the docker container and relaunch.
@@ -84,35 +84,104 @@ Afterwards:
## Testing
-Testing is done with React Testing Library and Jest.
+Testing is done with [Playwright](https://playwright.dev/) for application, integration, and component testing.
-Test files are located in the same directory as the files they are testing. For example, `EditBox.test.js` and `EditBox.tsx` are both located in `front/src/views/EditBox`.
+[Vitest](https://vitest.dev/) is used for standalone TypeScript functions and modules.
-For integration tests, we mock the Apollo client with a `MockedProvider` component instead of the `ApolloProvider` component that is used to handle real data. More information on mocking the Apollo client can be found [here](https://www.apollographql.com/docs/react/development-testing/testing/).
+We use [Mock Service Worker](https://mswjs.io/) (MSW for short) to mock data in a way that faithfully mimics the real server. It's also very useful to mock GraphQL Schema bits that aren't implemented in the production backend yet to build new features on top of it.
-To eliminate repetitive code, a custom renderer was built in `front/src/tests/test-utils.js`. It allows developers to render a component in a test environment where chakra, Apollo and Routes are wrapped around it. The utility also exports the entire react testing library, so you should import from this utility instead of `@testing-library/react`. See `EditBox.test.js` for examples of the custom renderer's use.
+Application test specs are inside the `/tests` folder. Other tests are colocated with the files that are the subject of what is being tested.
-Tests and test coverage can be run with the following command:
+See Playwright's docs to see how to make the most of its API to help you build test cases e.g. [recording tests by using the app](https://playwright.dev/docs/codegen-intro).
-```sh
-# run tests
-docker compose exec front pnpm test
+### Fixtures and mock data
+
+Mock data is located inside `tests/fixtures.ts`, and is usually retrieved from the development backend calls to speed up testing and development since fixtures for that data were already written. As long as both the front-end and backend match the GraphQL Schema, we can be sure that the mocked data will match real data consumed in the app. You can add more fixtures by hand or by using the real API results that you can get from the Network tab inside Devtools in the browser.
+
+To label the fixture/mock data, follow the convention of placing it as `userName: { graphqlOperationName: { modifierEGbaseId: data } }`. Then use it inside the MSW handler at `mswHandlers.ts` (also to export the handler at the bottom of the file).
+
+> [!IMPORTANT]
+> You must place this entry on your `.env` file for the tests to run against MSW and mock data in `tests/fixtures.ts`.
+>
+> `USE_MSW=true`
+>
+> You might need to bring down the Docker containers, rebuild, and start again to pick up the environment variable changes.
-# or locally
+### Running tests
+
+Tests and test coverage can be run with the following commands:
+
+```sh
+# Run tests locally in headless mode (CLI only)
pnpm test
+# Run tests in UI mode (opens a Chromium browser to visually run and debug tests)
+pnpm test:ui
+
# test coverage
+pnpm test:coverage
+
+# run tests inside Docker
+docker compose exec front pnpm test
+
+# test coverage inside Docker
docker compose exec front pnpm test:coverage
+```
+
+Here, is a list of best practices you should follow when writing front-end tests:
+
+- [Write tests that simulate user behavior rather than single components](https://kentcdodds.com/blog/write-fewer-longer-tests)
+- [Use the right queries according to their priorization](https://testing-library.com/docs/queries/about#priority)
+- [Maybe use this Browser extension to find the best query](https://chrome.google.com/webstore/detail/testing-playground/hejbmebodbijjdhflfknehhcgaklhano)
+
+Testing is done with [Playwright](https://playwright.dev/) for application, integration, and component testing.
-# or locally
+[Vitest](https://vitest.dev/) is used for standalone TypeScript functions and modules.
+
+We use [Mock Service Worker](https://mswjs.io/) (MSW for short) to mock data in a way that faithfully mimics the real server. It's also very useful to mock GraphQL Schema bits that aren't implemented in the production backend yet to build new features on top of it.
+
+Application test specs are inside the `/tests` folder. Other tests are colocated with the files that are the subject of what is being tested.
+
+See Playwright's docs to see how to make the most of it's API to help you build test cases e.g. [recording tests by using the app](https://playwright.dev/docs/codegen-intro).
+
+### Fixtures and mock data
+
+Mock data is located inside `tests/fixtures.ts`, and usually retrieved from the development backend calls to speed up testing and development since fixtures for that data were already written. As long as both frontend and backend matches the GraphQL Schema, we can be sure that the mocked data will match real data consumed in the app. You can add more fixtures by hand or by using the real API results that you can get from the Network tab inside Devtools in the browser.
+
+To label the fixture/mock data, follow the convention of placing it as `userName: { graphqlOperationName: { modifierEGbaseId: data } }`. Then use it inside the MSW handler at `mswHandlers.ts` (also to export the handler at the bottom of the file).
+
+> [!IMPORTANT]
+> You must place this entry on your `.env` file in order for the tests to run against MSW and mock data in `tests/fixtures.ts`.
+>
+> `USE_MSW=true`
+>
+> You might need to bring down the Docker containers, rebuild and start again to pick up the enviroment variable changes.
+
+### Running tests
+
+Tests and test coverage can be run with the following commands:
+
+```sh
+# Run tests locally in headless mode (CLI only)
+pnpm test
+
+# Run tests in UI mode (opens a Chromium browser to visually run and debug tests)
+pnpm test:ui
+
+# test coverage
pnpm test:coverage
+
+# run tests inside Docker
+docker compose exec front pnpm test
+
+# test coverage inside Docker
+docker compose exec front pnpm test:coverage
```
-Here, a list of best practices you should follow when writing front-end tests with React Testing Library:
+Here, a list of best practices you should follow when writing front-end tests:
-- [Common mistakes with React Testing Library](https://kentcdodds.com/blog/common-mistakes-with-react-testing-library)
- [Write tests that simulate user behavior rather than single components](https://kentcdodds.com/blog/write-fewer-longer-tests)
-- [Use the right queries in React Testing Library according to their priorization](https://testing-library.com/docs/queries/about#priority)
+- [Use the right queries according to their priorization](https://testing-library.com/docs/queries/about#priority)
- [Maybe use this Browser extension to find the best query](https://chrome.google.com/webstore/detail/testing-playground/hejbmebodbijjdhflfknehhcgaklhano)
## Mobile functional testing
@@ -214,18 +283,18 @@ The folder structure is as follows:
## Apollo
-Apollo is our client to send GraphQL queries and mutation to the back-end. It can also be used as a local storage for global states. Here, some articles you might want to check out:
+Apollo is Boxtribute's client to send GraphQL queries and mutation to the backend. It can also be used as a local storage for global states. Here, some articles you might want to check out:
- [Apollo Client for State Management](https://www.apollographql.com/blog/apollo-client/caching/dispatch-this-using-apollo-client-3-as-a-state-management-solution/)
- [When to use refetchQueries](https://www.apollographql.com/blog/apollo-client/caching/when-to-use-refetch-queries/)
## Types and GraphQL
-As our front-end uses TypeScript to statically type our codebase and has a GraphQL schema as our source of truth for almost all of our data, we should make the most of this by inferring types as much as possible from the schema.
+As Boxtribute's front-end uses TypeScript to statically type the codebase and has a GraphQL schema as the source of truth for almost all of the data, we should make the most of this by inferring types as much as possible from the schema.
-And we do that by using [gql.tada](https://gql-tada.0no.co/), which automagically infer types from a unified schema generated from introspection of our API.
+And we do that by using [gql.tada](https://gql-tada.0no.co/), which automagically infer types from a unified schema generated from introspection of Boxtribute's API.
-See how it's generated by checking out the root `package.json` command `graphql-gen` and by taking a look at the end of the [GraphQL API section](../back/README.md#graphql-api) in the back-end README.
+See how it's generated by checking out the root `package.json` command `graphql-gen` and by taking a look at the end of the [GraphQL API section](../back/README.md#graphql-api) in the backend README.
### Convention for creating new GraphQL Fragments, Mutations, Queries, and Types
diff --git a/front/browser.ts b/front/browser.ts
new file mode 100644
index 000000000..2b5e64761
--- /dev/null
+++ b/front/browser.ts
@@ -0,0 +1,4 @@
+import { setupWorker } from "msw/browser";
+import { handlers } from "../tests/mswHandlers";
+
+export const worker = setupWorker(...handlers);
diff --git a/front/index.html b/front/index.html
index 3d8d056ae..8b115c60c 100644
--- a/front/index.html
+++ b/front/index.html
@@ -65,7 +65,7 @@
font-family: "Open Sans";
font-style: normal;
font-weight: 800;
- src: url("/fonts/open-sans-latin800-normal.woff2") format("woff2");
+ src: url("/fonts/open-sans-latin-800-normal.woff2") format("woff2");
}
@font-face {
font-family: "Open Sans";
diff --git a/front/package.json b/front/package.json
index 3df8c9fa5..bbda6b912 100644
--- a/front/package.json
+++ b/front/package.json
@@ -19,29 +19,15 @@
"victory": "^37.3.6"
},
"devDependencies": {
- "@chakra-ui/storybook-addon": "^5.2.5",
"@sentry/types": "^8.50.0",
- "@storybook/addon-actions": "^8.5.0",
- "@storybook/addon-essentials": "^8.5.0",
- "@storybook/addon-interactions": "^8.5.0",
- "@storybook/addon-links": "^8.5.0",
- "@storybook/node-logger": "^8.5.0",
- "@storybook/react": "^8.5.0",
- "@storybook/react-vite": "^8.5.0",
- "@storybook/test": "^8.5.0",
"@types/react-big-calendar": "^1.16.1",
"@types/react-table": "^7.7.20",
- "msw": "^2.7.0",
- "mutationobserver-shim": "^0.3.7",
- "storybook": "^8.5.0"
+ "mutationobserver-shim": "^0.3.7"
},
"scripts": {
- "build": "tsc && vite build",
+ "build": "vite build",
"dev": "vite",
"preview": "vite preview",
- "test": "TZ=UTC vitest",
- "test:coverage": "TZ=UTC vitest run --coverage",
- "upload:test-report": "./node_modules/.bin/codecov",
"tsc:check": "tsc --noEmit",
"tsc:precommit": "tsc-files --noEmit",
"lint": "eslint --ext ts,tsx --report-unused-disable-directives --max-warnings 0 --ignore-path ../.eslintignore",
@@ -51,11 +37,6 @@
"format:check:all": "pnpm format:check \"src/**/*.{js,jsx,json,scss,md,ts,tsx}\" ",
"format:check": "prettier --check --ignore-path ../.eslintignore",
"format:write:all": "pnpm format:write \"src/**/*.{js,jsx,json,scss,md,ts,tsx}\"",
- "format:write": "prettier --write --ignore-path ../.eslintignore",
- "storybook": "storybook dev -p 6006",
- "build-storybook": "storybook build"
- },
- "msw": {
- "workerDirectory": "public"
+ "format:write": "prettier --write --ignore-path ../.eslintignore"
}
}
diff --git a/front/public/mockServiceWorker.js b/front/public/mockServiceWorker.js
index 51d85eeeb..ec47a9a50 100644
--- a/front/public/mockServiceWorker.js
+++ b/front/public/mockServiceWorker.js
@@ -2,13 +2,15 @@
/* tslint:disable */
/**
- * Mock Service Worker (1.3.2).
+ * Mock Service Worker.
* @see https://github.com/mswjs/msw
* - Please do NOT modify this file.
* - Please do NOT serve this file on production.
*/
-const INTEGRITY_CHECKSUM = '3d6b9f06410d179a7f7404d4bf4c3c70'
+const PACKAGE_VERSION = '2.7.0'
+const INTEGRITY_CHECKSUM = '00729d72e3b82faf54ca8b9621dbb96f'
+const IS_MOCKED_RESPONSE = Symbol('isMockedResponse')
const activeClientIds = new Set()
self.addEventListener('install', function () {
@@ -47,7 +49,10 @@ self.addEventListener('message', async function (event) {
case 'INTEGRITY_CHECK_REQUEST': {
sendToClient(client, {
type: 'INTEGRITY_CHECK_RESPONSE',
- payload: INTEGRITY_CHECKSUM,
+ payload: {
+ packageVersion: PACKAGE_VERSION,
+ checksum: INTEGRITY_CHECKSUM,
+ },
})
break
}
@@ -57,7 +62,12 @@ self.addEventListener('message', async function (event) {
sendToClient(client, {
type: 'MOCKING_ENABLED',
- payload: true,
+ payload: {
+ client: {
+ id: client.id,
+ frameType: client.frameType,
+ },
+ },
})
break
}
@@ -86,12 +96,6 @@ self.addEventListener('message', async function (event) {
self.addEventListener('fetch', function (event) {
const { request } = event
- const accept = request.headers.get('accept') || ''
-
- // Bypass server-sent events.
- if (accept.includes('text/event-stream')) {
- return
- }
// Bypass navigation requests.
if (request.mode === 'navigate') {
@@ -112,29 +116,8 @@ self.addEventListener('fetch', function (event) {
}
// Generate unique request ID.
- const requestId = Math.random().toString(16).slice(2)
-
- event.respondWith(
- handleRequest(event, requestId).catch((error) => {
- if (error.name === 'NetworkError') {
- console.warn(
- '[MSW] Successfully emulated a network error for the "%s %s" request.',
- request.method,
- request.url,
- )
- return
- }
-
- // At this point, any exception indicates an issue with the original request/response.
- console.error(
- `\
-[MSW] Caught an exception from the "%s %s" request (%s). This is probably not a problem with Mock Service Worker. There is likely an additional logging output above.`,
- request.method,
- request.url,
- `${error.name}: ${error.message}`,
- )
- }),
- )
+ const requestId = crypto.randomUUID()
+ event.respondWith(handleRequest(event, requestId))
})
async function handleRequest(event, requestId) {
@@ -146,21 +129,24 @@ async function handleRequest(event, requestId) {
// this message will pend indefinitely.
if (client && activeClientIds.has(client.id)) {
;(async function () {
- const clonedResponse = response.clone()
- sendToClient(client, {
- type: 'RESPONSE',
- payload: {
- requestId,
- type: clonedResponse.type,
- ok: clonedResponse.ok,
- status: clonedResponse.status,
- statusText: clonedResponse.statusText,
- body:
- clonedResponse.body === null ? null : await clonedResponse.text(),
- headers: Object.fromEntries(clonedResponse.headers.entries()),
- redirected: clonedResponse.redirected,
+ const responseClone = response.clone()
+
+ sendToClient(
+ client,
+ {
+ type: 'RESPONSE',
+ payload: {
+ requestId,
+ isMockedResponse: IS_MOCKED_RESPONSE in response,
+ type: responseClone.type,
+ status: responseClone.status,
+ statusText: responseClone.statusText,
+ body: responseClone.body,
+ headers: Object.fromEntries(responseClone.headers.entries()),
+ },
},
- })
+ [responseClone.body],
+ )
})()
}
@@ -174,6 +160,10 @@ async function handleRequest(event, requestId) {
async function resolveMainClient(event) {
const client = await self.clients.get(event.clientId)
+ if (activeClientIds.has(event.clientId)) {
+ return client
+ }
+
if (client?.frameType === 'top-level') {
return client
}
@@ -196,20 +186,34 @@ async function resolveMainClient(event) {
async function getResponse(event, client, requestId) {
const { request } = event
- const clonedRequest = request.clone()
+
+ // Clone the request because it might've been already used
+ // (i.e. its body has been read and sent to the client).
+ const requestClone = request.clone()
function passthrough() {
- // Clone the request because it might've been already used
- // (i.e. its body has been read and sent to the client).
- const headers = Object.fromEntries(clonedRequest.headers.entries())
+ // Cast the request headers to a new Headers instance
+ // so the headers can be manipulated with.
+ const headers = new Headers(requestClone.headers)
+
+ // Remove the "accept" header value that marked this request as passthrough.
+ // This prevents request alteration and also keeps it compliant with the
+ // user-defined CORS policies.
+ const acceptHeader = headers.get('accept')
+ if (acceptHeader) {
+ const values = acceptHeader.split(',').map((value) => value.trim())
+ const filteredValues = values.filter(
+ (value) => value !== 'msw/passthrough',
+ )
- // Remove MSW-specific request headers so the bypassed requests
- // comply with the server's CORS preflight check.
- // Operate with the headers as an object because request "Headers"
- // are immutable.
- delete headers['x-msw-bypass']
+ if (filteredValues.length > 0) {
+ headers.set('accept', filteredValues.join(', '))
+ } else {
+ headers.delete('accept')
+ }
+ }
- return fetch(clonedRequest, { headers })
+ return fetch(requestClone, { headers })
}
// Bypass mocking when the client is not active.
@@ -225,57 +229,46 @@ async function getResponse(event, client, requestId) {
return passthrough()
}
- // Bypass requests with the explicit bypass header.
- // Such requests can be issued by "ctx.fetch()".
- if (request.headers.get('x-msw-bypass') === 'true') {
- return passthrough()
- }
-
// Notify the client that a request has been intercepted.
- const clientMessage = await sendToClient(client, {
- type: 'REQUEST',
- payload: {
- id: requestId,
- url: request.url,
- method: request.method,
- headers: Object.fromEntries(request.headers.entries()),
- cache: request.cache,
- mode: request.mode,
- credentials: request.credentials,
- destination: request.destination,
- integrity: request.integrity,
- redirect: request.redirect,
- referrer: request.referrer,
- referrerPolicy: request.referrerPolicy,
- body: await request.text(),
- bodyUsed: request.bodyUsed,
- keepalive: request.keepalive,
+ const requestBuffer = await request.arrayBuffer()
+ const clientMessage = await sendToClient(
+ client,
+ {
+ type: 'REQUEST',
+ payload: {
+ id: requestId,
+ url: request.url,
+ mode: request.mode,
+ method: request.method,
+ headers: Object.fromEntries(request.headers.entries()),
+ cache: request.cache,
+ credentials: request.credentials,
+ destination: request.destination,
+ integrity: request.integrity,
+ redirect: request.redirect,
+ referrer: request.referrer,
+ referrerPolicy: request.referrerPolicy,
+ body: requestBuffer,
+ keepalive: request.keepalive,
+ },
},
- })
+ [requestBuffer],
+ )
switch (clientMessage.type) {
case 'MOCK_RESPONSE': {
return respondWithMock(clientMessage.data)
}
- case 'MOCK_NOT_FOUND': {
+ case 'PASSTHROUGH': {
return passthrough()
}
-
- case 'NETWORK_ERROR': {
- const { name, message } = clientMessage.data
- const networkError = new Error(message)
- networkError.name = name
-
- // Rejecting a "respondWith" promise emulates a network error.
- throw networkError
- }
}
return passthrough()
}
-function sendToClient(client, message) {
+function sendToClient(client, message, transferrables = []) {
return new Promise((resolve, reject) => {
const channel = new MessageChannel()
@@ -287,17 +280,28 @@ function sendToClient(client, message) {
resolve(event.data)
}
- client.postMessage(message, [channel.port2])
+ client.postMessage(
+ message,
+ [channel.port2].concat(transferrables.filter(Boolean)),
+ )
})
}
-function sleep(timeMs) {
- return new Promise((resolve) => {
- setTimeout(resolve, timeMs)
+async function respondWithMock(response) {
+ // Setting response status code to 0 is a no-op.
+ // However, when responding with a "Response.error()", the produced Response
+ // instance will have status code set to 0. Since it's not possible to create
+ // a Response instance with status code 0, handle that use-case separately.
+ if (response.status === 0) {
+ return Response.error()
+ }
+
+ const mockedResponse = new Response(response.body, response)
+
+ Reflect.defineProperty(mockedResponse, IS_MOCKED_RESPONSE, {
+ value: true,
+ enumerable: true,
})
-}
-async function respondWithMock(response) {
- await sleep(response.delay)
- return new Response(response.body, response)
+ return mockedResponse
}
diff --git a/front/src/components/BoxReconciliationOverlay/BoxReconciliationOverlay.test.tsx b/front/src/components/BoxReconciliationOverlay/BoxReconciliationOverlay.test.tsx
deleted file mode 100644
index f4dc0f254..000000000
--- a/front/src/components/BoxReconciliationOverlay/BoxReconciliationOverlay.test.tsx
+++ /dev/null
@@ -1,274 +0,0 @@
-import { vi, beforeEach, it, expect, describe } from "vitest";
-import { screen, render, waitFor } from "tests/test-utils";
-import { useAuth0 } from "@auth0/auth0-react";
-import { BoxReconciliationOverlay } from "components/BoxReconciliationOverlay/BoxReconciliationOverlay";
-import { mockAuthenticatedUser } from "mocks/hooks";
-import { generateMockShipment } from "mocks/shipments";
-import { organisation1 } from "mocks/organisations";
-import { cache, boxReconciliationOverlayVar, IBoxReconciliationOverlayVar } from "queries/cache";
-import { generateMockLocationWithBase } from "mocks/locations";
-import { products } from "mocks/products";
-import { tag1, tag2 } from "mocks/tags";
-import { userEvent } from "@testing-library/user-event";
-import { SHIPMENT_BY_ID_WITH_PRODUCTS_AND_LOCATIONS_QUERY } from "queries/queries";
-import { UPDATE_SHIPMENT_WHEN_RECEIVING } from "queries/mutations";
-import { mockedCreateToast, mockedTriggerError } from "tests/setupTests";
-import { FakeGraphQLError, FakeGraphQLNetworkError } from "mocks/functions";
-
-vi.mock("@auth0/auth0-react");
-// @ts-ignore
-window.scrollTo = vi.fn();
-
-// .mocked() is a nice helper function from jest for typescript support
-// https://jestjs.io/docs/mock-function-api/#typescript-usage
-const mockedUseAuth0 = vi.mocked(useAuth0);
-
-beforeEach(() => {
- mockAuthenticatedUser(mockedUseAuth0, "dev_volunteer@boxaid.org");
-});
-
-const queryShipmentDetailForBoxReconciliation = {
- request: {
- query: SHIPMENT_BY_ID_WITH_PRODUCTS_AND_LOCATIONS_QUERY,
- variables: {
- shipmentId: "1",
- baseId: "1",
- },
- },
- result: {
- data: {
- base: {
- locations: [generateMockLocationWithBase({})],
- products,
- tags: [tag1, tag2],
- },
- shipment: generateMockShipment({ state: "Receiving" }),
- },
- },
-};
-
-const failedQueryShipmentDetailForBoxReconciliation = {
- request: {
- query: SHIPMENT_BY_ID_WITH_PRODUCTS_AND_LOCATIONS_QUERY,
- variables: {
- shipmentId: "1",
- baseId: "1",
- },
- },
- result: {
- errors: [new FakeGraphQLError()],
- },
-};
-
-// Test case 4.7.2
-
-it("4.7.2 - Query for shipment, box, available products, sizes and locations returns an error ", async () => {
- boxReconciliationOverlayVar({
- isOpen: true,
- labelIdentifier: "123",
- shipmentId: "1",
- } as IBoxReconciliationOverlayVar);
- render( , {
- routePath: "/bases/:baseId",
- initialUrl: "/bases/1",
- mocks: [failedQueryShipmentDetailForBoxReconciliation],
- cache,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: organisation1.bases[0],
- },
- },
- });
-
- // toast shown
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/Could not fetch data! Please try reloading the page/i),
- }),
- ),
- );
-});
-
-const mockUpdateShipmentWhenReceivingMutation = ({
- networkError = false,
- graphQlError = false,
- shipmentId = "1",
- lostBoxLabelIdentifiers = ["123"],
-}) => ({
- request: {
- query: UPDATE_SHIPMENT_WHEN_RECEIVING,
- variables: {
- id: shipmentId,
- lostBoxLabelIdentifiers,
- },
- },
- result: networkError
- ? undefined
- : {
- data: graphQlError
- ? null
- : {
- updateShipmentWhenReceiving: generateMockShipment({ state: "Receiving" }),
- },
- errors: graphQlError ? [new FakeGraphQLError()] : undefined,
- },
- error: networkError ? new FakeGraphQLNetworkError() : undefined,
-});
-
-const noDeliveryTests = [
- {
- name: "4.7.3.1 - Mark as Lost Mutation fails due to GraphQL error",
- mocks: [
- queryShipmentDetailForBoxReconciliation,
- mockUpdateShipmentWhenReceivingMutation({ graphQlError: true }),
- ],
- toast: { isError: true, message: /Could not change state of the box./i },
- },
- {
- name: "4.7.3.2 - Mark as Lost Mutation fails due to Network error",
- mocks: [
- queryShipmentDetailForBoxReconciliation,
- mockUpdateShipmentWhenReceivingMutation({ networkError: true }),
- ],
- toast: { isError: true, message: /Could not change state of the box./i },
- },
- {
- name: "4.7.3.3 - Mark as Lost Mutation is succesfull",
- mocks: [queryShipmentDetailForBoxReconciliation, mockUpdateShipmentWhenReceivingMutation({})],
- toast: { isError: false, message: /Box marked as undelivered/i },
- },
-];
-
-describe("No Delivery Tests", () => {
- noDeliveryTests.forEach(({ name, mocks, toast }) => {
- it(
- name,
- async () => {
- const user = userEvent.setup();
- boxReconciliationOverlayVar({
- isOpen: true,
- labelIdentifier: "123",
- shipmentId: "1",
- } as IBoxReconciliationOverlayVar);
- render( , {
- routePath: "/bases/:baseId",
- initialUrl: "/bases/1",
- mocks,
- cache,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: organisation1.bases[0],
- },
- },
- });
-
- // BoxReconciliation is visible
- expect(await screen.findByText(/box 123/i)).toBeInTheDocument();
-
- // Click trashIcon Button
- const noDeliveryIconButton = screen.getByTestId("NoDeliveryIcon");
- expect(noDeliveryIconButton).toBeInTheDocument();
- await user.click(noDeliveryIconButton);
-
- // AYS is open
- expect(await screen.findByText(/box not delivered\?/i)).toBeInTheDocument();
- const noButton = screen.getByRole("button", { name: /nevermind/i });
- expect(noButton).toBeInTheDocument();
- await user.click(noButton);
-
- // BoxReconciliation is visible
- expect(await screen.findByText(/box 123/i)).toBeInTheDocument();
-
- // 4.7.3 - Click NoDelivery Button
- const matchProductButton = await screen.findByRole("button", {
- name: /1\. match products/i,
- });
- expect(matchProductButton).toBeInTheDocument();
- await user.click(matchProductButton);
- const noDeliveryButton = screen.getByTestId("NoDeliveryButton");
- expect(noDeliveryButton).toBeInTheDocument();
- await user.click(noDeliveryButton);
-
- // AYS is open
- expect(await screen.findByText(/box not delivered\?/i)).toBeInTheDocument();
- const yesButton = screen.getByTestId("AYSRightButton");
- expect(yesButton).toBeInTheDocument();
- await user.click(yesButton);
-
- // toast shown
- await waitFor(
- () =>
- expect(toast.isError ? mockedTriggerError : mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(toast.message),
- }),
- ),
- { timeout: 5000 },
- );
- },
- 40000,
- );
- });
-});
-
-// Test case 4.7.1
-
-it("4.7.1 - Query for shipment, box, available products, sizes and locations is loading ", async () => {
- const user = userEvent.setup();
- boxReconciliationOverlayVar({
- isOpen: true,
- labelIdentifier: "123",
- shipmentId: "1",
- } as IBoxReconciliationOverlayVar);
- render( , {
- routePath: "/bases/:baseId",
- initialUrl: "/bases/1",
- mocks: [queryShipmentDetailForBoxReconciliation],
- cache,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: organisation1.bases[0],
- },
- },
- });
-
- expect((await screen.findAllByText(/box 123/i)).length).toBeGreaterThanOrEqual(1);
-
- expect(screen.getAllByText(/1\. match products/i)).toHaveLength(1);
- expect(screen.getAllByText(/2\. receive location/i)).toHaveLength(1);
- const matchProductButton = screen.getByRole("button", {
- name: /1\. match products/i,
- });
- await user.click(matchProductButton);
-
- expect((await screen.findAllByText(/Long Sleeves/i)).length).toBeGreaterThanOrEqual(1);
- expect((await screen.findAllByText(/sender product & gender/i)).length).toBeGreaterThanOrEqual(1);
- const selectProductControlInput = screen.getByText(/save product as\.\.\./i);
- // check if source product renders correctly
- expect(screen.getByText(/Long Sleeves \(Women\)/i)).toBeInTheDocument();
- await user.click(selectProductControlInput);
- [/Winter Jackets \(Men\)/, /Long Sleeves \(Women\)/].forEach(async (option) => {
- expect(await screen.findByRole("option", { name: option })).toBeInTheDocument();
- });
-
- const receiveLocationButton = screen.getByRole("button", {
- name: /2\. receive location/i,
- });
- await user.click(receiveLocationButton);
-
- expect((await screen.findAllByText(/select location/i)).length).toBeGreaterThanOrEqual(1);
-
- const selectLocationControlInput = screen.getByText(/select location/i);
- await user.click(selectLocationControlInput);
- expect(await screen.findByRole("option", { name: /WH Men/i })).toBeInTheDocument();
-}, 20000);
diff --git a/front/src/components/HeaderMenu/HeaderMenuContainer.test.tsx b/front/src/components/HeaderMenu/HeaderMenuContainer.test.tsx
deleted file mode 100644
index 0c5a5bd99..000000000
--- a/front/src/components/HeaderMenu/HeaderMenuContainer.test.tsx
+++ /dev/null
@@ -1,121 +0,0 @@
-import { vi, it, expect } from "vitest";
-import { screen, render } from "tests/test-utils";
-import { useAuth0 } from "@auth0/auth0-react";
-import HeaderMenuContainer from "components/HeaderMenu/HeaderMenuContainer";
-import { QrReaderScanner } from "components/QrReader/components/QrReaderScanner";
-import { mockAuthenticatedUser } from "mocks/hooks";
-import { mockImplementationOfQrReader } from "mocks/components";
-
-vi.mock("@auth0/auth0-react");
-vi.mock("components/QrReader/components/QrReaderScanner");
-const mockedUseAuth0 = vi.mocked(useAuth0);
-const mockedQrReader = vi.mocked(QrReaderScanner);
-
-it("1.3.1 - Menus are available to the user depending on ABPs - Nothing", async () => {
- mockImplementationOfQrReader(mockedQrReader, "NoBoxAssociatedWithQrCode");
- mockAuthenticatedUser(mockedUseAuth0, "dev_volunteer@boxaid.org");
-
- render( , {
- routePath: "/bases/:baseId",
- initialUrl: "/bases/1",
- });
-
- expect(screen.queryByRole("button", { name: /Statistics/i })).not.toBeInTheDocument();
- expect(screen.queryByRole("button", { name: /Aid Inventory/i })).not.toBeInTheDocument();
- expect(screen.queryByRole("button", { name: /Coordinator Admin/i })).not.toBeInTheDocument();
-}, 10000);
-
-it("1.3.2 - Menus are available to the user depending on ABPs - Aid Inventory", async () => {
- mockImplementationOfQrReader(mockedQrReader, "NoBoxAssociatedWithQrCode");
- mockAuthenticatedUser(
- mockedUseAuth0,
- "dev_volunteer@boxaid.org",
- ["view_inventory", "view_shipments", "view_beneficiary_graph", "create_label"],
- "3",
- );
-
- render( , {
- routePath: "/bases/:baseId",
- initialUrl: "/bases/1",
- });
-
- expect(screen.getByRole("button", { name: /Statistics/i })).toBeInTheDocument();
-
- expect(screen.getByRole("button", { name: /Aid Inventory/i })).toBeInTheDocument();
- expect(screen.getByText(/Print Box Labels/i)).toBeInTheDocument();
- expect(screen.queryByText(/Manage Boxes/i)).not.toBeInTheDocument();
- expect(screen.queryByText(/Classic Manage Boxes/i)).not.toBeInTheDocument();
-
- expect(screen.queryByRole("button", { name: /Coordinator Admin/i })).not.toBeInTheDocument();
-}, 10000);
-
-it("1.3.3 - Menus are available to the user depending on ABPs - Aid Inventory w/ submenus Stock Planning, Manage Boxes", async () => {
- mockImplementationOfQrReader(mockedQrReader, "NoBoxAssociatedWithQrCode");
- mockAuthenticatedUser(
- mockedUseAuth0,
- "dev_volunteer@boxaid.org",
- ["create_label", "manage_inventory"],
- "0",
- );
-
- render( , {
- routePath: "/bases/:baseId",
- initialUrl: "/bases/1",
- });
-
- expect(screen.queryByRole("button", { name: /Statistics/i })).not.toBeInTheDocument();
-
- expect(screen.getByRole("button", { name: /Aid Inventory/i })).toBeInTheDocument();
- expect(screen.getByText(/Print Box Labels/i)).toBeInTheDocument();
- expect(screen.getByText(/Classic Manage Boxes/i)).toBeInTheDocument();
-
- expect(screen.queryByRole("button", { name: /Coordinator Admin/i })).not.toBeInTheDocument();
-}, 10000);
-
-it("1.3.4 - Menus available to the user depending on ABPs - Coordinator Admin", async () => {
- mockImplementationOfQrReader(mockedQrReader, "NoBoxAssociatedWithQrCode");
- mockAuthenticatedUser(
- mockedUseAuth0,
- "dev_volunteer@boxaid.org",
- ["view_inventory", "view_shipments", "view_beneficiary_graph", "manage_volunteers"],
- "3",
- );
-
- render( , {
- routePath: "/bases/:baseId",
- initialUrl: "/bases/1",
- });
-
- expect(screen.getByRole("button", { name: /Statistics/i })).toBeInTheDocument();
- expect(screen.getByRole("button", { name: /Aid Inventory/i })).toBeInTheDocument();
- expect(screen.getByRole("button", { name: /Coordinator Admin/i })).toBeInTheDocument();
-}, 10000);
-
-it("1.3.5 - Menus available to the user depending on ABPs - Coordinator Admin w/ submenus Manage Products, Edit Warehouses", async () => {
- mockImplementationOfQrReader(mockedQrReader, "NoBoxAssociatedWithQrCode");
- mockAuthenticatedUser(
- mockedUseAuth0,
- "dev_volunteer@boxaid.org",
- [
- "view_inventory",
- "view_shipments",
- "view_beneficiary_graph",
- "manage_volunteers",
- "manage_products",
- "manage_warehouses",
- ],
- "3",
- );
-
- render( , {
- routePath: "/bases/:baseId",
- initialUrl: "/bases/1",
- });
-
- expect(screen.getByRole("button", { name: /Statistics/i })).toBeInTheDocument();
- expect(screen.getByRole("button", { name: /Aid Inventory/i })).toBeInTheDocument();
-
- expect(screen.getByRole("button", { name: /Coordinator Admin/i })).toBeInTheDocument();
- expect(screen.getByText(/Manage Products/i)).toBeInTheDocument();
- expect(screen.getByText(/Edit Warehouses/i)).toBeInTheDocument();
-}, 10000);
diff --git a/front/src/components/QrReader/components/QrReader.tsx b/front/src/components/QrReader/components/QrReader.tsx
index 69a02637c..45d73078c 100644
--- a/front/src/components/QrReader/components/QrReader.tsx
+++ b/front/src/components/QrReader/components/QrReader.tsx
@@ -38,9 +38,11 @@ function QrReader({
// Did the QrReaderScanner catch a QrCode? --> call onScan with text value
const onResult = useCallback(
- (multiScan: boolean, qrReaderResult: Result | undefined | null) => {
- if (qrReaderResult) {
+ (multiScan: boolean, qrReaderResult: Result | string | undefined | null) => {
+ if (qrReaderResult && qrReaderResult instanceof Result) {
onScan(qrReaderResult.getText(), multiScan);
+ } else if (qrReaderResult && typeof qrReaderResult === "string") {
+ onScan(qrReaderResult, multiScan);
}
},
[onScan],
diff --git a/front/src/components/QrReader/components/QrReaderScanner.tsx b/front/src/components/QrReader/components/QrReaderScanner.tsx
index 7269a574f..7709c68e3 100644
--- a/front/src/components/QrReader/components/QrReaderScanner.tsx
+++ b/front/src/components/QrReader/components/QrReaderScanner.tsx
@@ -1,4 +1,4 @@
-import { MutableRefObject, useEffect, useRef } from "react";
+import { ElementRef, MutableRefObject, useEffect, useRef } from "react";
import { BrowserQRCodeReader, IScannerControls } from "@zxing/browser";
import { Result } from "@zxing/library";
import { styles } from "./QrReaderScannerStyles";
@@ -10,9 +10,9 @@ export type OnResultFunction = (
*/
multiScan: boolean,
/**
- * The QR values extracted by Zxing
+ * The QR values extracted by Zxing or mocked through search params
*/
- result?: Result | undefined | null,
+ result?: Result | string | undefined | null,
/**
* The name of the exceptions thrown while reading the QR
*/
@@ -44,8 +44,11 @@ export function QrReaderScanner({
onResult,
scanPeriod: delayBetweenScanAttempts = 500,
}: QrReaderScannerProps) {
+ // this is to avoid infinite rendering loops when using qr code from url for testing
+ const scanFromURLSearchParam = useRef(false);
// this ref is needed to pass/preview the video stream coming from BrowserQrCodeReader to the the user
- const previewVideoRef: MutableRefObject = useRef(null);
+ const previewVideoRef: MutableRefObject =
+ useRef>(null);
// this ref is to store the controls for the BrowerQRCodeReader. We only need it to tell it to stop scanning at certain points.
const controlsRef: MutableRefObject = useRef(null);
// this ref is to store the BrowerQRCodeReader. We need a reference with useRef to ensure that multiple scanning processes are started by the different renders.
@@ -58,6 +61,23 @@ export function QrReaderScanner({
zoom,
};
+ /**
+ * Mock QR code in URL Search Params for testing purposes.
+ *
+ * Multiple `qr` search params means multiscan.
+ */
+ const qrCodeParams = new URLSearchParams(window.location.search).getAll("qr");
+
+ if (!scanFromURLSearchParam.current && qrCodeParams.length) {
+ scanFromURLSearchParam.current = true;
+
+ // Convert to format readed by QrResolver Hook. e.g. barcode=foobar
+ const qrCodeConvertedToBarcode = qrCodeParams.map((qrCode) => `barcode=${qrCode}`);
+ for (const qrCode of qrCodeConvertedToBarcode) {
+ onResult(qrCodeParams.length > 1, qrCode);
+ }
+ }
+
if (previewVideoRef.current == null) {
console.error("QR Reader: Video Element not (yet) available");
return;
diff --git a/front/src/components/QrReaderOverlay/QrReaderOverlay.test.tsx b/front/src/components/QrReaderOverlay/QrReaderOverlay.test.tsx
deleted file mode 100644
index 5da8bdf3e..000000000
--- a/front/src/components/QrReaderOverlay/QrReaderOverlay.test.tsx
+++ /dev/null
@@ -1,445 +0,0 @@
-import { vi, beforeEach, it, expect } from "vitest";
-import { userEvent } from "@testing-library/user-event";
-import { screen, render, waitFor } from "tests/test-utils";
-import HeaderMenuContainer from "components/HeaderMenu/HeaderMenuContainer";
-import { useAuth0 } from "@auth0/auth0-react";
-import { QrReaderScanner } from "components/QrReader/components/QrReaderScanner";
-import { mockAuthenticatedUser } from "mocks/hooks";
-import { mockImplementationOfQrReader } from "mocks/components";
-import {
- BOX_DETAILS_BY_LABEL_IDENTIFIER_QUERY,
- GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE,
-} from "queries/queries";
-import { generateMockBox } from "mocks/boxes";
-import { mockedTriggerError } from "tests/setupTests";
-import { FakeGraphQLError } from "mocks/functions";
-
-vi.mock("@auth0/auth0-react");
-vi.mock("components/QrReader/components/QrReaderScanner");
-const mockedUseAuth0 = vi.mocked(useAuth0);
-const mockedQrReader = vi.mocked(QrReaderScanner);
-
-beforeEach(() => {
- mockAuthenticatedUser(mockedUseAuth0, "dev_volunteer@boxaid.org");
-});
-
-const queryFindNoBoxAssociated = {
- request: {
- query: BOX_DETAILS_BY_LABEL_IDENTIFIER_QUERY,
- variables: {
- labelIdentifier: "123456",
- },
- },
- result: {
- data: {
- box: null,
- },
- errors: [new FakeGraphQLError("BAD_USER_INPUT")],
- },
-};
-
-it("3.4.1.2 - Mobile: Enter invalid box identifier and click on Find button", async () => {
- const user = userEvent.setup();
- mockImplementationOfQrReader(mockedQrReader, "NoBoxAssociatedWithQrCode");
- // mock scanning a QR code
- render( , {
- routePath: "/bases/:baseId",
- initialUrl: "/bases/1",
- mocks: [queryFindNoBoxAssociated],
- additionalRoute: "/bases/1/boxes/123456",
- mediaQueryReturnValue: false,
- });
-
- // Open the menu
- const menuButton = await screen.findByTestId("menu-button");
- await user.click(menuButton);
-
- // 3.4.1.1 - Open QROverlay
- const qrButton = await screen.findByTestId("qr-code-button");
- await user.click(qrButton);
-
- // Find Box
- const findBoxButton = await screen.findByRole("button", { name: /find/i });
- await user.type(screen.getByRole("textbox"), "123456");
- await user.click(findBoxButton);
-
- // error message appears
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/A box with this label number doesn't exist/i),
- }),
- ),
- );
- // QrOverlay stays open
- expect(screen.getByRole("button", { name: /find/i })).toBeInTheDocument();
-}, 30000);
-
-const queryFindBox = {
- request: {
- query: BOX_DETAILS_BY_LABEL_IDENTIFIER_QUERY,
- variables: {
- labelIdentifier: "123456",
- },
- },
- result: {
- data: {
- box: generateMockBox({ labelIdentifier: "123456" }),
- },
- },
-};
-
-it("3.4.1.3 - Mobile: Enter valid box identifier and click on Find button", async () => {
- const user = userEvent.setup();
- mockImplementationOfQrReader(mockedQrReader, "BoxAssociatedWithQrCode");
- // mock scanning a QR code
- render( , {
- routePath: "/bases/:baseId",
- initialUrl: "/bases/1",
- mocks: [queryFindBox],
- additionalRoute: "/bases/1/boxes/123456",
- mediaQueryReturnValue: false,
- });
-
- // Open the menu
- const menuButton = await screen.findByTestId("menu-button");
- await user.click(menuButton);
-
- // 3.4.1.1 - Open QROverlay
- const qrButton = await screen.findByTestId("qr-code-button");
- await user.click(qrButton);
-
- // Find Box
- const findBoxButton = await screen.findByRole("button", { name: /find/i });
- await user.type(screen.getByRole("textbox"), "123456");
- await user.click(findBoxButton);
-
- // Click a button to trigger the event of scanning a QR-Code in mockImplementationOfQrReader
- expect(await screen.findByRole("heading", { name: "/bases/1/boxes/123456" })).toBeInTheDocument();
-}, 20000);
-
-const queryFindBoxFromOtherOrg = {
- request: {
- query: BOX_DETAILS_BY_LABEL_IDENTIFIER_QUERY,
- variables: {
- labelIdentifier: "123456",
- },
- },
- result: {
- data: {
- box: null,
- },
- errors: [new FakeGraphQLError("FORBIDDEN")],
- },
-};
-
-it("3.4.1.4 - Mobile: Enter valid box identifier from unauthorized bases and click on Find button", async () => {
- const user = userEvent.setup();
- mockImplementationOfQrReader(mockedQrReader, "NoBoxAssociatedWithQrCode");
- // mock scanning a QR code
- render( , {
- routePath: "/bases/:baseId",
- initialUrl: "/bases/1",
- mocks: [queryFindBoxFromOtherOrg],
- additionalRoute: "/bases/1/boxes/123456",
- mediaQueryReturnValue: false,
- });
-
- // Open the menu
- const menuButton = await screen.findByTestId("menu-button");
- await user.click(menuButton);
-
- // 3.4.1.1 - Open QROverlay
- const qrButton = await screen.findByTestId("qr-code-button");
- await user.click(qrButton);
-
- // Find Box
- const findBoxButton = await screen.findByRole("button", { name: /find/i });
- await user.type(screen.getByRole("textbox"), "123456");
- await user.click(findBoxButton);
-
- // error message appears
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/You don't have permission to access this box/i),
- }),
- ),
- );
- // QrOverlay stays open
- expect(screen.getByRole("button", { name: /find/i })).toBeInTheDocument();
-}, 10000);
-
-const queryNoBoxAssociatedWithQrCode = {
- request: {
- query: GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE,
- variables: {
- qrCode: "NoBoxAssociatedWithQrCode",
- },
- },
- result: {
- data: {
- qrCode: {
- __typename: "QrCode",
- code: "NoBoxAssociatedWithQrCode",
- box: null,
- },
- },
- },
-};
-
-it("3.4.2.1 - Mobile: User scans QR code of same org without previously associated box", async () => {
- const user = userEvent.setup();
- // mock scanning a QR code
- mockImplementationOfQrReader(mockedQrReader, "NoBoxAssociatedWithQrCode");
- render( , {
- routePath: "/bases/:baseId",
- initialUrl: "/bases/1",
- mocks: [queryNoBoxAssociatedWithQrCode],
- additionalRoute: "/bases/1/boxes/create/NoBoxAssociatedWithQrCode",
- mediaQueryReturnValue: false,
- });
- // Open the menu
- const menuButton = await screen.findByTestId("menu-button");
- await user.click(menuButton);
-
- // 3.4.1.1 - Open QROverlay
- const qrButton = await screen.findByTestId("qr-code-button");
- await user.click(qrButton);
-
- const scanButton = await screen.findByTestId("ReturnScannedQr");
- // Click a button to trigger the event of scanning a QR-Code in mockImplementationOfQrReader
- await user.click(scanButton);
- expect(
- await screen.findByRole("heading", { name: "/bases/1/boxes/create/NoBoxAssociatedWithQrCode" }),
- ).toBeInTheDocument();
-}, 20000);
-
-const queryBoxAssociatedWithQrCode = {
- request: {
- query: GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE,
- variables: {
- qrCode: "BoxAssociatedWithQrCode",
- },
- },
- result: {
- data: {
- qrCode: {
- __typename: "QrCode",
- code: "BoxAssociatedWithQrCode",
- box: generateMockBox({}),
- },
- },
- },
-};
-
-it("3.4.2.2 - Mobile: user scans QR code of same org with associated box", async () => {
- const user = userEvent.setup();
- // mock scanning a QR code
- mockImplementationOfQrReader(mockedQrReader, "BoxAssociatedWithQrCode");
- render( , {
- routePath: "/bases/:baseId",
- initialUrl: "/bases/1",
- mocks: [queryBoxAssociatedWithQrCode],
- additionalRoute: "/bases/1/boxes/123",
- mediaQueryReturnValue: false,
- });
-
- // Open the menu
- const menuButton = await screen.findByTestId("menu-button");
- await user.click(menuButton);
-
- // 3.4.1.1 - Open QROverlay
- const qrButton = await screen.findByTestId("qr-code-button");
- await user.click(qrButton);
-
- // Click a button to trigger the event of scanning a QR-Code in mockImplementationOfQrReader
- await user.click(screen.getByTestId("ReturnScannedQr"));
- expect(await screen.findByRole("heading", { name: "/bases/1/boxes/123" })).toBeInTheDocument();
-}, 20000);
-
-const queryBoxFromOtherOrganisation = {
- request: {
- query: GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE,
- variables: {
- qrCode: "BoxFromOtherOrganisation",
- },
- },
- result: {
- data: {
- qrCode: {
- __typename: "QrCode",
- code: "BoxFromOtherOrganisation",
- box: {
- __typename: "UnauthorizedForBaseError",
- baseName: "Base Foo",
- organisationName: "BoxAid",
- },
- },
- },
- errors: undefined,
- },
-};
-
-it("3.4.2.3 - Mobile: user scans QR code of different org with associated box", async () => {
- const user = userEvent.setup();
- // mock scanning a QR code
- mockImplementationOfQrReader(mockedQrReader, "BoxFromOtherOrganisation");
- render( , {
- routePath: "/bases/:baseId",
- initialUrl: "/bases/1",
- mocks: [queryBoxFromOtherOrganisation],
- mediaQueryReturnValue: false,
- });
-
- // Open the menu
- const menuButton = await screen.findByTestId("menu-button");
- await user.click(menuButton);
-
- // 3.4.1.1 - Open QROverlay
- const qrButton = await screen.findByTestId("qr-code-button");
- await user.click(qrButton);
-
- // Click a button to trigger the event of scanning a QR-Code in mockImplementationOfQrReader
- await user.click(screen.getByTestId("ReturnScannedQr"));
-
- // error message appears
- expect(
- await screen.findByText(/This box it at base Base Foo, which belongs to organization BoxAid./),
- ).toBeInTheDocument();
- // QrOverlay stays open
- expect(screen.getByTestId("ReturnScannedQr")).toBeInTheDocument();
-}, 10000);
-
-it("3.4.2.5a - Mobile: User scans non Boxtribute QR code", async () => {
- const user = userEvent.setup();
- // mock scanning a QR code
- mockImplementationOfQrReader(mockedQrReader, "NonBoxtributeQr", false);
- render( , {
- routePath: "/bases/:baseId",
- initialUrl: "/bases/1",
- mocks: [queryBoxFromOtherOrganisation],
- mediaQueryReturnValue: false,
- });
-
- // Open the menu
- const menuButton = await screen.findByTestId("menu-button");
- await user.click(menuButton);
-
- // 3.4.1.1 - Open QROverlay
- const qrButton = await screen.findByTestId("qr-code-button");
- await user.click(qrButton);
-
- // Click a button to trigger the event of scanning a QR-Code in mockImplementationOfQrReader
- await user.click(screen.getByTestId("ReturnScannedQr"));
-
- // error message appears
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/This is not a Boxtribute QR code/i),
- }),
- ),
- );
- // QrOverlay stays open
- expect(screen.getByTestId("ReturnScannedQr")).toBeInTheDocument();
-}, 15000);
-
-const queryHashNotInDb = {
- request: {
- query: GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE,
- variables: {
- qrCode: "HashNotInDb",
- },
- },
- result: {
- data: {
- qrCode: {
- __typename: "ResourceDoesNotExistError",
- resourceName: "qr",
- },
- },
- },
-};
-
-it("3.4.2.5b - Mobile: User scans non Boxtribute QR code", async () => {
- const user = userEvent.setup();
- // mock scanning a QR code
- mockImplementationOfQrReader(mockedQrReader, "HashNotInDb");
- render( , {
- routePath: "/bases/:baseId",
- initialUrl: "/bases/1",
- mocks: [queryHashNotInDb],
- mediaQueryReturnValue: false,
- });
-
- // Open the menu
- const menuButton = await screen.findByTestId("menu-button");
- await user.click(menuButton);
-
- // 3.4.1.1 - Open QROverlay
- const qrButton = await screen.findByTestId("qr-code-button");
- await user.click(qrButton);
-
- // Click a button to trigger the event of scanning a QR-Code in mockImplementationOfQrReader
- await user.click(screen.getByTestId("ReturnScannedQr"));
-
- // error message appears
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/This is not a Boxtribute QR code/i),
- }),
- ),
- );
-
- // QrOverlay stays open
- expect(screen.getByTestId("ReturnScannedQr")).toBeInTheDocument();
-}, 20000);
-
-const queryInternalServerError = {
- request: {
- query: GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE,
- variables: {
- qrCode: "InternalServerError",
- },
- },
- result: {
- data: null,
- errors: [new FakeGraphQLError("INTERNAL_SERVER_ERROR")],
- },
-};
-
-it("3.4.2.5c - Internal Server Error", async () => {
- const user = userEvent.setup();
- // mock scanning a QR code
- mockImplementationOfQrReader(mockedQrReader, "InternalServerError");
- render( , {
- routePath: "/bases/:baseId",
- initialUrl: "/bases/1",
- mocks: [queryInternalServerError],
- mediaQueryReturnValue: false,
- });
-
- // Open the menu
- const menuButton = await screen.findByTestId("menu-button");
- await user.click(menuButton);
-
- // 3.4.1.1 - Open QROverlay
- const qrButton = await screen.findByTestId("qr-code-button");
- await user.click(qrButton);
-
- // Click a button to trigger the event of scanning a QR-Code in mockImplementationOfQrReader
- await user.click(screen.getByTestId("ReturnScannedQr"));
-
- // error message appears
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/QR code lookup failed/i),
- }),
- ),
- );
- // QrOverlay stays open
- expect(screen.getByTestId("ReturnScannedQr")).toBeInTheDocument();
-}, 20000);
diff --git a/front/src/index.tsx b/front/src/index.tsx
index 26981f552..499836077 100644
--- a/front/src/index.tsx
+++ b/front/src/index.tsx
@@ -16,6 +16,7 @@ import App from "./App";
import { theme } from "./utils/theme";
import { captureConsoleIntegration } from "@sentry/react";
import React from "react";
+import { worker } from "../browser";
const ProtectedApp = withAuthenticationRequired(() => (
@@ -48,6 +49,8 @@ if (sentryDsn) {
});
}
+if (import.meta.env.FRONT_USE_MSW === "true") worker.start();
+
const root = createRoot(document.getElementById("root")!);
root.render(
diff --git a/front/src/mocks/bases.ts b/front/src/mocks/bases.ts
deleted file mode 100644
index d40cca9e2..000000000
--- a/front/src/mocks/bases.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-export const base1 = {
- __typename: "Base",
- id: "1",
- name: "Lesvos",
- organisation: {
- id: "1",
- name: "BoxAid",
- __typename: "Organisation",
- },
-};
-
-export const base2 = {
- __typename: "Base",
- id: "2",
- name: "Thessaloniki",
- organisation: {
- id: "2",
- name: "BoxCare",
- __typename: "Organisation",
- },
-};
diff --git a/front/src/mocks/boxes.ts b/front/src/mocks/boxes.ts
deleted file mode 100644
index f98b84cdd..000000000
--- a/front/src/mocks/boxes.ts
+++ /dev/null
@@ -1,88 +0,0 @@
-import { product1, productBasic1 } from "./products";
-import { size1, size2 } from "./sizeRanges";
-import { location1, generateMockLocationWithBase } from "./locations";
-import { tag1, tag2 } from "./tags";
-import { history1, history2 } from "./histories";
-
-export const box123 = {
- labelIdentifier: "123",
- state: "InStock",
- product: product1,
- size: size1,
- shipmentDetail: null,
- location: location1,
- numberOfItems: 62,
- tags: [tag1],
- comment: "Test",
- history: null,
- createdOn: "2023-11-09T17:24:29+00:00",
- lastModifiedOn: "2023-11-19T10:24:29+00:00",
- __typename: "Box",
-};
-
-export const generateMockBox = ({
- id = "1",
- labelIdentifier = "123",
- state = "InStock",
- numberOfItems = 31,
- location = generateMockLocationWithBase({}),
- comment = "Good Comment",
- product = productBasic1,
- shipmentDetail = null as any,
- size = size2,
- tags = [tag2],
- histories = [history1, history2],
-}) => ({
- id,
- labelIdentifier,
- state,
- product,
- size,
- shipmentDetail,
- location,
- numberOfItems,
- tags,
- comment,
- history: histories,
- createdOn: "2023-11-09T17:24:29+00:00",
- lastModifiedOn: "2023-11-19T10:24:29+00:00",
- distributionEvent: null,
- deletedOn: null,
- __typename: "Box",
-});
-
-const unauthorizedForBaseErrorBox = {
- __typename: "UnauthorizedForBaseError",
- baseName: "Base Foo",
- organisationName: "BoxAid",
-};
-
-const insufficientPermissionErrorBox = {
- __typename: "InsufficientPermissionError",
- name: "Base Bar",
-};
-
-/**
- * Generate box data based on ownership: Organization, Base and Permissions.
- *
- * Check `GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE` query for reference.
- */
-export const handleBoxGeneration = ({
- labelIdentifier = "123",
- state = "InStock",
- isBoxAssociated = true,
- isBoxSameBase = true,
- isBoxSameOrg = true
-}) => {
- if (isBoxAssociated && isBoxSameOrg && isBoxSameBase)
- return generateMockBox({ labelIdentifier, state });
-
- if (isBoxAssociated && !isBoxSameOrg)
- return unauthorizedForBaseErrorBox;
-
- if (isBoxAssociated && !isBoxSameBase)
- return insufficientPermissionErrorBox;
-
- // Box not associated with the QR code or no permission and authorization will end up here.
- return null;
-}
diff --git a/front/src/mocks/components.tsx b/front/src/mocks/components.tsx
deleted file mode 100644
index 8df6fc29f..000000000
--- a/front/src/mocks/components.tsx
+++ /dev/null
@@ -1,42 +0,0 @@
-import { Result } from "@zxing/library";
-
-/**
- * Mocking the QrReader component in components/QrReader/QrReader by overriding the implemention of the component with a button.
- * To mock the QrReader component you have to
- * - add a mock of the path for imports by adding `vi.mock("components/QrReader/QrReader")` at the top of your test file.
- * - mock the acctual component by adding `const mockedQrReader = vi.mocked(QrReader);` in your testfile
- * - to override the implementation of the component you need to pass the mockedQrReader above into the function below.
- *
- * If you then call this function, e.g. `mockImplementationOfQrReader(mockedQrReader, "NoBoxAssociatedWithQrCode");` in a test a
- * button is added to the DOM instead of the QrReader component. By clicking this button, you can mock firing the onResult Event
- * of the QrReader.
- * @param mockedQrReader - The mocked QrReader component whose implementation needs to be overwritten.
- * @param hash - md5 hash of Boxtribute boxes
- * @param isBoxtributeQr - to test non Boxtribute qr-code
- * @returns An component including a button that fires the onResult event of the QrReader component when it is clicked.
- */
-export function mockImplementationOfQrReader(
- mockedQrReader: any,
- hash: string,
- isBoxtributeQr: boolean = true,
- multiScan: boolean = false,
-) {
- mockedQrReader.mockImplementation((props) => (
-
- props.onResult(
- multiScan,
- new Result(
- isBoxtributeQr ? `barcode=${hash}` : "nonBoxtributeQr",
- new Uint8Array([0]),
- 0,
- [],
- 11,
- ),
- )
- }
- />
- ));
-}
diff --git a/front/src/mocks/functions.ts b/front/src/mocks/functions.ts
deleted file mode 100644
index 4f57fe097..000000000
--- a/front/src/mocks/functions.ts
+++ /dev/null
@@ -1,55 +0,0 @@
-import { GraphQLError } from "graphql";
-import { vi } from "vitest";
-
-export function mockMatchMediaQuery(returnBool: Boolean) {
- // Jest does not implement window.matchMedia() which is used in the chackra ui hook useMediaQuery().
- // To mock a result of useMediaQuery you have to define this property. The 'matches' boolean is the return value.
- // https://jestjs.io/docs/26.x/manual-mocks#mocking-methods-which-are-not-implemented-in-jsdom
- Object.defineProperty(window, "matchMedia", {
- writable: true,
- value: vi.fn().mockImplementation((query) => ({
- matches: returnBool,
- media: query,
- onchange: null,
- addListener: vi.fn(),
- removeListener: vi.fn(),
- addEventListener: vi.fn(),
- removeEventListener: vi.fn(),
- dispatchEvent: vi.fn(),
- })),
- });
-}
-
-export class FakeGraphQLError extends GraphQLError {
- constructor(errorCode?: string, errorDescription?: string) {
- super(
- "Fake GraphQL Error",
- errorCode ? { extensions: { code: errorCode, description: errorDescription } } : undefined,
- );
- }
-}
-
-export class FakeGraphQLNetworkError extends Error {
- constructor() {
- super("Fake GraphQL Network Error");
- }
-}
-
-export const mockGraphQLError = (query, variables = {}) => ({
- request: {
- query,
- variables,
- },
- result: {
- errors: [new FakeGraphQLError()],
- },
-});
-
-// mock a network error when sending a graphQL request
-export const mockNetworkError = (query, variables = {}) => ({
- request: {
- query,
- variables,
- },
- error: new FakeGraphQLNetworkError(),
-});
diff --git a/front/src/mocks/handlers.ts b/front/src/mocks/handlers.ts
deleted file mode 100644
index 6748e2ccf..000000000
--- a/front/src/mocks/handlers.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-export const handlers = [
- // graphql.query(
- // "DistroSpotsForBaseId",
- // (req, res, ctx) => {
- // return res(
- // ctx.data({
- // base: {
- // __typename: "Base",
- // distributions: {
- // __typename: "Distributions",
- // distributionSpots: [
- // {
- // __typename: "DistributionSpot",
- // id: "1",
- // name: "Horgos River",
- // latitude: 132.142,
- // longitude: 132.142,
- // },
- // ],
- // },
- // },
- // })
- // );
- // }
- // ),
-];
diff --git a/front/src/mocks/histories.ts b/front/src/mocks/histories.ts
deleted file mode 100644
index d47a34583..000000000
--- a/front/src/mocks/histories.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-export const history1 = {
- __typename: "HistoryEntry",
- changeDate: "2023-01-12T08:39:44+00:00",
-
- changes: "created record",
- id: "1",
- user: {
- __typename: "User",
- id: "8",
- name: "Dev Coordinator",
- },
-};
-
-export const history2 = {
- __typename: "HistoryEntry",
- changeDate: "2023-01-14T08:07:13+00:00",
- changes: "changed box location from WH Men to WH Women",
- id: "2",
- user: {
- __typename: "User",
- id: "8",
- name: "Dev Coordinator",
- },
-};
-
-export const histories = [history1, history2];
diff --git a/front/src/mocks/hooks.ts b/front/src/mocks/hooks.ts
deleted file mode 100644
index 6e5b828c5..000000000
--- a/front/src/mocks/hooks.ts
+++ /dev/null
@@ -1,35 +0,0 @@
-import { JWT_ROLE, JWT_ABP, JWT_BETA } from "utils/constants";
-import { vi } from "vitest";
-/**
- * Mocking the return value of the useAuth0 hook. This is needed to mock the authentication of a test user
- * To mock an authenticated user you have to
- * - add a mock of the path for imports by adding `vi.mock("@auth0/auth0-react")` at the top of your test file.
- * - mock the acctual hook by adding `const mockedUseAuth0 = vi.mocked(useAuth0);` in your testfile
- * - set the return value of useAuth0 by passing mockedUseAuth0 to the function below.
- *
- * @param mockedUseAuth0 - The mocked useAuth0 hook whose return value needs to be set
- * @param email - the email of the test user you want to mock that it is authenticated
- * @returns mocked `Auth0ContextInterface` for an authenticated user. Check https://auth0.github.io/auth0-react/functions/useAuth0.html for the definition.
- */
-
-export function mockAuthenticatedUser(mockedUseAuth0: any, email: string, actions = ["be_user"], betaUser = "0", roles = "administrator") {
- mockedUseAuth0.mockReturnValue({
- isAuthenticated: true,
- user: {
- email,
- [JWT_ABP]: actions,
- [JWT_BETA]: betaUser,
- [JWT_ROLE]: roles,
- },
- logout: vi.fn(),
- loginWithRedirect: vi.fn(),
- getAccessTokenWithPopup: vi.fn(),
- getAccessTokenSilently: vi.fn(),
- getIdTokenClaims: vi.fn(),
- loginWithPopup: vi.fn(),
- isLoading: false,
- buildAuthorizeUrl: vi.fn(),
- buildLogoutUrl: vi.fn(),
- handleRedirectCallback: vi.fn(),
- });
-}
diff --git a/front/src/mocks/locations.ts b/front/src/mocks/locations.ts
deleted file mode 100644
index 33ebaa8ba..000000000
--- a/front/src/mocks/locations.ts
+++ /dev/null
@@ -1,122 +0,0 @@
-import { organisation1 } from "./organisations";
-
-export const location1 = {
- id: "1",
- seq: "1",
- name: "Warehouse",
- defaultBoxState: "InStock",
- __typename: "ClassicLocation",
- base: {
- __typename: "Base",
- id: "1",
- name: "Lesvos",
- },
-};
-
-const location2 = {
- id: "2",
- seq: "2",
- name: "Shop",
- defaultBoxState: "Donated",
- __typename: "ClassicLocation",
-};
-
-export const generateMockLocationWithBase = ({
- defaultBoxState = "InStock",
- defaultLocationName = "WH Men",
- defaultLocationId = 7,
-}) => ({
- defaultBoxState,
- __typename: "ClassicLocation",
- base: {
- __typename: "Base",
- id: "1",
- name: "Lesvos",
- organisation: organisation1,
- distributionEventsBeforeReturnedFromDistributionState: [],
- locations: [
- {
- __typename: "ClassicLocation",
- defaultBoxState: "Donated",
- id: "1",
- seq: "1",
- name: "Shop",
- },
- {
- __typename: "ClassicLocation",
- defaultBoxState: "InStock",
- id: "4",
- seq: "4",
- name: "Stockroom",
- },
- {
- __typename: "ClassicLocation",
- defaultBoxState: "InStock",
- id: "5",
- seq: "5",
- name: "WH",
- },
- {
- __typename: "ClassicLocation",
- defaultBoxState: "InStock",
- id: "6",
- seq: "6",
- name: "WH Women",
- },
- {
- __typename: "ClassicLocation",
- defaultBoxState: "InStock",
- id: "7",
- seq: "7",
- name: "WH Men",
- },
- {
- __typename: "ClassicLocation",
- defaultBoxState: "InStock",
- id: "8",
- seq: "8",
- name: "WH Children",
- },
- {
- __typename: "ClassicLocation",
- defaultBoxState: "InStock",
- id: "9",
- seq: "9",
- name: "WH Babies",
- },
- {
- __typename: "ClassicLocation",
- defaultBoxState: "InStock",
- id: "10",
- seq: "10",
- name: "WH Shoes",
- },
- {
- __typename: "ClassicLocation",
- defaultBoxState: "InStock",
- id: "11",
- seq: "11",
- name: "WH New arrivals",
- },
- {
- __typename: "ClassicLocation",
- defaultBoxState: "InStock",
- id: "12",
- seq: "12",
- name: "WH Hygiene",
- },
- {
- __typename: "ClassicLocation",
- defaultBoxState: "InStock",
- id: "13",
- seq: "12",
- name: "WH Seasonal",
- },
- ],
- },
- id: defaultLocationId,
- seq: defaultLocationId,
- name: defaultLocationName,
-});
-
-export const locations = [location1, location2];
diff --git a/front/src/mocks/organisations.ts b/front/src/mocks/organisations.ts
deleted file mode 100644
index 5dbb4e2a4..000000000
--- a/front/src/mocks/organisations.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-export const organisation1 = {
- bases: [
- {
- __typename: "Base",
- id: "1",
- name: "Lesvos",
- },
- ],
- __typename: "Organisation",
- id: "1",
- name: "BoxAid",
-};
-
-export const organisation2 = {
- bases: [
- {
- __typename: "Base",
- id: "2",
- name: "Thessaloniki",
- },
- {
- __typename: "Base",
- id: "3",
- name: "Samos",
- },
- ],
- __typename: "Organisation",
- id: "2",
- name: "BoxCare",
-};
-
-export const organisations = [organisation1, organisation2];
diff --git a/front/src/mocks/products.ts b/front/src/mocks/products.ts
deleted file mode 100644
index 682beaff8..000000000
--- a/front/src/mocks/products.ts
+++ /dev/null
@@ -1,59 +0,0 @@
-import { sizeRange1, sizeRange2 } from "./sizeRanges";
-
-export const product1 = {
- id: "1",
- name: "Long Sleeves",
- gender: "Women",
- category: {
- id: "1",
- name: "Tops",
- __typename: "ProductCategory",
- },
- sizeRange: sizeRange1,
- deletedOn: null,
- __typename: "Product",
-};
-
-export const productBasic1 = {
- id: "1",
- name: "Snow trousers",
- category: {
- id: "2",
- name: "Bottoms",
- __typename: "ProductCategory",
- },
- gender: "Boy",
- deletedOn: null,
- __typename: "Product",
-};
-
-export const product3 = {
- id: "3",
- name: "Long Sleeves",
- gender: "None",
- category: {
- id: "1",
- name: "Tops",
- __typename: "ProductCategory",
- },
- sizeRange: sizeRange2,
- deletedOn: null,
- __typename: "Product",
-};
-
-export const products = [
- product1,
- {
- id: "2",
- name: "Winter Jackets",
- gender: "Men",
- category: {
- id: "3",
- name: "Jackets / Outerwear",
- __typename: "ProductCategory",
- },
- sizeRange: sizeRange2,
- deletedOn: null,
- __typename: "Product",
- },
-];
diff --git a/front/src/mocks/shipmentDetail.ts b/front/src/mocks/shipmentDetail.ts
deleted file mode 100644
index 3e51827ed..000000000
--- a/front/src/mocks/shipmentDetail.ts
+++ /dev/null
@@ -1,81 +0,0 @@
-import { base1 } from "./bases";
-import { generateMockBox } from "./boxes";
-import { location1, generateMockLocationWithBase } from "./locations";
-import { product1 } from "./products";
-import { generateMockShipment } from "./shipments";
-import { size1 } from "./sizeRanges";
-import { user1 } from "./users";
-
-export const shipmentDetail1 = () => ({
- __typename: "ShipmentDetail",
- id: "2",
- box: {
- __typename: "Box",
- labelIdentifier: "123",
- location: {
- ...location1,
- base: base1,
- },
- shipmentDetail: {
- __typename: "ShipmentDetail",
- id: "2",
- shipment: {
- id: "1",
- },
- },
- lastModifiedOn: "2023-01-09T17:24:29+00:00",
- },
- sourceProduct: product1,
- targetProduct: null,
- sourceSize: size1,
- targetSize: null,
- sourceLocation: location1,
- sourceQuantity: 10,
- targetQuantity: null,
- createdOn: "2023-01-09T17:24:29+00:00",
- createdBy: user1,
- removedOn: null,
- removedBy: null,
- lostOn: null,
- lostBy: null,
- receivedOn: null,
- receivedBy: null,
- shipment: generateMockShipment({}),
-});
-
-export const generateMockShipmentDetail = ({
- id = "1",
- box = generateMockBox({
- labelIdentifier: "123",
- numberOfItems: 10,
- product: product1,
- location: generateMockLocationWithBase({}),
- }),
- sourceProduct = product1,
- targetProduct = null,
- sourceSize = size1,
- sourceQuantity = 10,
- createdOn = "2023-01-09T17:24:29+00:00",
- createdBy = user1,
- removedOn = null,
- removedBy = null,
-}) => ({
- id,
- box,
- sourceProduct,
- targetProduct,
- sourceSize,
- targetSize: null,
- sourceLocation: location1,
- sourceQuantity,
- targetQuantity: null,
- createdOn,
- createdBy,
- removedOn,
- removedBy,
- lostOn: null,
- lostBy: null,
- receivedOn: null,
- receivedBy: null,
- __typename: "ShipmentDetail",
-});
diff --git a/front/src/mocks/shipments.ts b/front/src/mocks/shipments.ts
deleted file mode 100644
index 5c8cabe73..000000000
--- a/front/src/mocks/shipments.ts
+++ /dev/null
@@ -1,280 +0,0 @@
-import { base1, base2 } from "./bases";
-import { generateMockBox } from "./boxes";
-import { location1 } from "./locations";
-import { product1, product3 } from "./products";
-import { size1, size2 } from "./sizeRanges";
-import { user1 } from "./users";
-import { generateMockShipmentDetail } from "./shipmentDetail";
-
-export const basicShipment = {
- __typename: "Shipment",
- id: "1",
- labelIdentifier: "S001-231111-LExTH",
- state: "Preparing",
- sourceBase: {
- __typename: "Base",
- id: "1",
- name: "Lesvos",
- organisation: {
- __typename: "Organisation",
- id: "1",
- name: "BoxAid",
- },
- },
- targetBase: {
- __typename: "Base",
- id: "2",
- name: "Thessaloniki",
- organisation: {
- __typename: "Organisation",
- id: "2",
- name: "BoxCare",
- },
- },
-};
-
-export const shipment1 = {
- ...basicShipment,
- details: [
- {
- sourceProduct: product1,
- box: generateMockBox({
- labelIdentifier: "123",
- numberOfItems: 10,
- product: product1,
- }),
- },
- {
- sourceProduct: product3,
- box: generateMockBox({
- labelIdentifier: "124",
- numberOfItems: 12,
- product: product3,
- }),
- },
- ],
- sentBy: null,
- transferAgreement: {
- id: "1",
- type: "Bidirectional",
- comment: "",
- },
-};
-
-export const shipment2 = {
- ...basicShipment,
- details: [],
- sentBy: null,
- transferAgreement: {
- id: "1",
- type: "Bidirectional",
- comment: "",
- },
-};
-
-export const shipments = [shipment1];
-
-export const generateMockShipment = ({
- state = "Preparing",
- iAmSource = true,
- hasBoxes = true,
-}) => ({
- id: "1",
- labelIdentifier: "S001-231111-LExTH",
- state,
- details: hasBoxes
- ? [
- {
- id: "1",
- box: {
- __typename: "Box",
- labelIdentifier: "123",
- state: "MarkedForShipment",
- comment: null,
- location: {
- ...location1,
- base: {
- ...base1,
- },
- },
- shipmentDetail: {
- __typename: "ShipmentDetail",
- id: "2",
- shipment: {
- id: "1",
- },
- },
- lastModifiedOn: new Date().toISOString(),
- },
- sourceProduct: product1,
- targetProduct: null,
- sourceSize: size1,
- sourceLocation: location1,
- targetSize: null,
- sourceQuantity: 10,
- targetQuantity: null,
- createdOn: "2023-01-09T17:24:29+00:00",
- createdBy: user1,
- removedOn: "2023-01-10T17:24:29+00:00",
- removedBy: user1,
- lostOn: null,
- lostBy: null,
- receivedOn: null,
- receivedBy: null,
- __typename: "ShipmentDetail",
- },
- {
- id: "2",
- box: {
- __typename: "Box",
- labelIdentifier: "123",
- state: "MarkedForShipment",
- comment: null,
- location: {
- ...location1,
- base: {
- ...base1,
- },
- },
- shipmentDetail: {
- __typename: "ShipmentDetail",
- id: "2",
- shipment: {
- id: "1",
- },
- },
- lastModifiedOn: new Date().toISOString(),
- },
- sourceProduct: product1,
- targetProduct: null,
- sourceSize: size1,
- targetSize: null,
- sourceLocation: location1,
- sourceQuantity: 10,
- targetQuantity: null,
- createdOn: "2023-01-11T17:24:29+00:00",
- createdBy: user1,
- receivedOn: state === "Completed" ? "2023-01-14T17:24:29+00:00" : null,
- receivedBy: state === "Completed" ? user1 : null,
- removedOn: null,
- removedBy: null,
- lostOn: null,
- lostBy: null,
- __typename: "ShipmentDetail",
- },
- {
- id: "3",
- box: generateMockBox({
- labelIdentifier: "124",
- numberOfItems: 12,
- product: product3,
- state:
- state === "Receiving"
- ? "Receiving"
- : state === "Sent"
- ? "InTransit"
- : "MarkedForShipment",
- shipmentDetail: {
- __typename: "ShipmentDetail",
- id: "3",
- shipment: {
- id: "1",
- },
- },
- }),
- sourceProduct: product3,
- targetProduct: null,
- sourceSize: size2,
- targetSize: null,
- sourceLocation: location1,
- sourceQuantity: 12,
- targetQuantity: null,
- createdOn: "2023-02-01T17:24:29+00:00",
- createdBy: user1,
- receivedOn: state === "Completed" ? "2023-01-14T17:24:29+00:00" : null,
- receivedBy: state === "Completed" ? user1 : null,
- lostOn: null,
- lostBy: null,
- removedOn: null,
- removedBy: null,
- __typename: "ShipmentDetail",
- },
- ]
- : [],
- sourceBase: iAmSource ? base1 : base2,
- targetBase: iAmSource ? base2 : base1,
- transferAgreement: {
- id: "1",
- comment: "",
- type: "Bidirectional",
- __typename: "TransferAgreement",
- },
- startedOn: "2023-01-08T17:24:29+00:00",
- startedBy: user1,
- sentOn: null,
- sentBy: null,
- receivingStartedOn: null,
- receivingStartedBy: null,
- completedOn: null,
- completedBy: null,
- canceledOn: null,
- canceledBy: null,
- __typename: "Shipment",
-});
-
-export const generateMockShipmentMinimal = ({
- state = "Preparing",
- iAmSource = true,
-}) => {
- const shipment = {
- id: "1",
- state,
- labelIdentifier: iAmSource
- ? `001-123123-${base1.name.substring(0, 2).toUpperCase()}x${base2.name
- .substring(0, 2)
- .toUpperCase()}`
- : `001-123123-${base2.name.substring(0, 2).toUpperCase()}x${base1.name
- .substring(0, 2)
- .toUpperCase()}`,
- sourceBase: iAmSource ? base1 : base2,
- targetBase: iAmSource ? base2 : base1,
- };
-
- return shipment;
-};
-
-export const generateMockShipmentWithCustomDetails = ({
- state = "Preparing",
- iAmSource = true,
- details = [generateMockShipmentDetail({})],
-}) => ({
- id: "1",
- labelIdentifier: iAmSource
- ? `001-123123-${base1.name.substring(0, 2).toUpperCase()}x${base2.name
- .substring(0, 2)
- .toUpperCase()}`
- : `001-123123-${base2.name.substring(0, 2).toUpperCase()}x${base1.name
- .substring(0, 2)
- .toUpperCase()}`,
- state,
- details,
- sourceBase: iAmSource ? base1 : base2,
- targetBase: iAmSource ? base2 : base1,
- transferAgreement: {
- id: "1",
- comment: "",
- type: "Bidirectional",
- __typename: "TransferAgreement",
- },
- startedOn: "2023-01-08T17:24:29+00:00",
- startedBy: user1,
- sentOn: null,
- sentBy: null,
- receivingStartedOn: null,
- receivingStartedBy: null,
- completedOn: null,
- completedBy: null,
- canceledOn: null,
- canceledBy: null,
- __typename: "Shipment",
-});
diff --git a/front/src/mocks/sizeRanges.ts b/front/src/mocks/sizeRanges.ts
deleted file mode 100644
index c3a9d78c7..000000000
--- a/front/src/mocks/sizeRanges.ts
+++ /dev/null
@@ -1,43 +0,0 @@
-export const size1 = {
- id: "1",
- label: "S",
- __typename: "Size",
-};
-
-export const size2 = {
- id: "52",
- label: "Mixed",
- __typename: "Size",
-};
-
-export const sizeRange1 = {
- id: "1",
- label: "S,M,L",
- sizes: [
- size1,
- {
- id: "2",
- label: "M",
- __typename: "Size",
- },
- {
- id: "3",
- label: "L",
- __typename: "Size",
- },
- ],
- __typename: "SizeRange",
-};
-
-export const sizeRange2 = {
- id: "2",
- label: "Mixed Sizes",
- sizes: [
- {
- id: "4",
- label: "Mixed",
- __typename: "Size",
- },
- ],
- __typename: "SizeRange",
-};
diff --git a/front/src/mocks/tags.ts b/front/src/mocks/tags.ts
deleted file mode 100644
index a6df0cb91..000000000
--- a/front/src/mocks/tags.ts
+++ /dev/null
@@ -1,50 +0,0 @@
-export const tag1 = {
- color: "#20963f",
- label: "tag1",
- value: "1",
- id: "1",
- name: "tag1",
- type: "All",
- description: "tag1",
- __typename: "Tag",
-};
-
-export const tag2 = {
- color: "#90d4a2",
- id: "17",
- name: "test tag",
- label: "tag1",
- value: "1",
- type: "All",
- description: "tag17",
- __typename: "Tag",
-};
-
-export const tags = [
- tag1,
- {
- color: "#20969f",
- label: "tag2",
- value: "2",
- __typename: "Tag",
- },
-];
-
-export const tagsArray = [
- {
- color: "#20963f",
- name: "tag1",
- id: "1",
- type: "All",
- description: "tag1",
- __typename: "Tag",
- },
- {
- color: "#20969f",
- name: "tag2",
- id: "2",
- type: "Box",
- description: "tag2",
- __typename: "Tag",
- },
-];
diff --git a/front/src/mocks/transferAgreements.ts b/front/src/mocks/transferAgreements.ts
deleted file mode 100644
index 1b34df6fd..000000000
--- a/front/src/mocks/transferAgreements.ts
+++ /dev/null
@@ -1,105 +0,0 @@
-import { base1, base2 } from "./bases";
-import { organisation1, organisation2 } from "./organisations";
-
-export const generateMockTransferAgreement = ({
- type = "Bidirectional",
- state = "UnderReview",
- comment = "Good Comment",
- isInitiator = true,
-}) => {
- const iAmSource =
- (isInitiator && type !== "ReceivingFrom") ||
- (!isInitiator && type === "ReceivingFrom");
-
- return {
- id: "1",
- type,
- state,
- comment,
- validFrom: "2023-02-09T17:24:29+00:00",
- validUntil: "2024-01-01T17:24:29+00:00",
- sourceOrganisation: iAmSource ? organisation1 : organisation2,
- sourceBases: iAmSource ? [base1] : [base2],
- targetOrganisation: iAmSource ? organisation2 : organisation1,
- targetBases: iAmSource ? [base2] : [base1],
- shipments: [
- {
- id: "1",
- state: "Preparing",
- sourceBase: iAmSource ? base1 : base2,
- targetBase: iAmSource ? base2 : base1,
- __typename: "Shipment",
- },
- ],
- requestedOn: "2023-02-09T17:24:29+00:00",
- requestedBy: {
- id: "1",
- name: "Test User",
- __typename: "User",
- },
- acceptedOn: null,
- acceptedBy: null,
- terminatedOn: null,
- terminatedBy: null,
- __typename: "TransferAgreement",
- };
-};
-
-export const acceptedTransferAgreement = {
- __typename: "TransferAgreement",
- comment: "",
- id: "1",
- requestedOn: "2023-02-09T17:24:29+00:00",
- requestedBy: {
- __typename: "User",
- id: "1",
- name: "some admin",
- },
- acceptedOn: "2023-02-19T17:24:29+00:00",
- acceptedBy: {
- __typename: "User",
- id: "1",
- name: "some admin",
- },
- terminatedOn: null,
- terminatedBy: null,
- shipments: [],
- targetBases: [
- {
- __typename: "Base",
- id: "2",
- name: "Thessaloniki",
- },
- {
- __typename: "Base",
- id: "3",
- name: "Samos",
- },
- {
- __typename: "Base",
- id: "4",
- name: "Athens",
- },
- ],
- targetOrganisation: {
- __typename: "Organisation",
- id: "2",
- name: "BoxCare",
- },
- state: "Accepted",
- sourceBases: [
- {
- __typename: "Base",
- id: "1",
- name: "Lesvos",
- },
- ],
- sourceOrganisation: {
- __typename: "Organisation",
- id: "1",
- name: "BoxAid",
- },
- type: "SendingTo",
- validFrom: "2023-01-26T00:00:00+00:00",
- validUntil: null,
-};
diff --git a/front/src/mocks/users.ts b/front/src/mocks/users.ts
deleted file mode 100644
index ae9dc124d..000000000
--- a/front/src/mocks/users.ts
+++ /dev/null
@@ -1,5 +0,0 @@
-export const user1 = {
- id: "1",
- name: "Test User",
- __typename: "User",
-};
diff --git a/front/src/tests/helpers.ts b/front/src/tests/helpers.ts
deleted file mode 100644
index 171cc3ebc..000000000
--- a/front/src/tests/helpers.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-import { expect } from "vitest";
-import { screen, waitFor } from "tests/test-utils";
-import { userEvent } from "@testing-library/user-event";
-
-type UserEvent = ReturnType;
-
-export async function assertOptionsInSelectField(
- user: UserEvent,
- label: RegExp | string,
- options: (RegExp | string)[],
- elementOutside: HTMLElement,
- subHeadings: (RegExp | string)[] = [],
-) {
- const fieldControlInput = screen.getByLabelText(label);
- options.forEach((option) => {
- expect(screen.queryByText(option)).not.toBeInTheDocument();
- });
- subHeadings.forEach((subHeading) => {
- expect(screen.queryByText(subHeading)).not.toBeInTheDocument();
- });
- await user.click(fieldControlInput);
- options.forEach(async (option) => {
- expect(await screen.findByRole("option", { name: option })).toBeInTheDocument();
- });
- subHeadings.forEach((subHeading) => {
- expect(screen.getByText(subHeading)).toBeInTheDocument();
- });
- await user.click(elementOutside);
- options.forEach(async (option) => {
- await waitFor(() => {
- expect(screen.queryByText(option)).not.toBeInTheDocument();
- });
- });
- subHeadings.forEach((subHeading) => {
- expect(screen.queryByText(subHeading)).not.toBeInTheDocument();
- });
-}
-
-export async function selectOptionInSelectField(
- user: UserEvent,
- label: RegExp | string | undefined,
- option: RegExp | string,
- placeholderText: RegExp | string = "",
- isMulti: boolean = false,
- optionInTestingEnvironment: string = "option",
-) {
- const fieldControlInput =
- label !== undefined ? screen.getByLabelText(label) : screen.getByText(placeholderText);
- await user.click(fieldControlInput);
- const optionButton = await screen.findByRole(optionInTestingEnvironment, { name: option });
- expect(optionButton).toBeInTheDocument();
- await user.click(optionButton);
- if (isMulti) {
- await waitFor(() => {
- expect(
- screen.queryByRole(optionInTestingEnvironment, { name: option }),
- ).not.toBeInTheDocument();
- });
- }
- expect(await screen.findByText(option)).toBeInTheDocument();
-}
-// Returns text content of given element
-// Cf. https://github.com/testing-library/dom-testing-library/issues/410#issuecomment-1060917305
-export function textContentMatcher(textMatch: string | RegExp) {
- const hasText =
- typeof textMatch === "string"
- ? (node: Element) => node.textContent === textMatch
- : (node: Element) => textMatch.test(node?.textContent || "");
-
- return (_content: string, node: Element) => {
- if (!hasText(node)) {
- return false;
- }
-
- // eslint-disable-next-line testing-library/no-node-access
- const childrenDontHaveText = Array.from(node?.children || []).every((child) => !hasText(child));
-
- return childrenDontHaveText;
- };
-}
diff --git a/front/src/tests/setupTests.ts b/front/src/tests/setupTests.ts
deleted file mode 100644
index 3fdaf5ccd..000000000
--- a/front/src/tests/setupTests.ts
+++ /dev/null
@@ -1,70 +0,0 @@
-// jest-dom adds custom jest matchers for asserting on DOM nodes.
-// allows you to do things like:
-// expect(element).toHaveTextContent(/react/i)
-// learn more: https://github.com/testing-library/jest-dom
-import "@testing-library/jest-dom";
-import { cache } from "queries/cache";
-import { beforeEach, vi } from "vitest";
-import "regenerator-runtime/runtime";
-import { useErrorHandling } from "hooks/useErrorHandling";
-import { useNotification } from "hooks/useNotification";
-
-import { loadErrorMessages, loadDevMessages } from "@apollo/client/dev";
-
-// -------- Apollo cache
-// extracting a cacheObject to reset the cache correctly later
-const emptyCache = cache.extract();
-// Adds full apollo error messages in a dev environment
-// so we get meaningful error messages rather than encoded
-// url - https://www.apollographql.com/docs/react/errors/
-loadDevMessages();
-loadErrorMessages();
-
-// -------- Mocking Toasts
-// Toasts are persisting throughout the tests since they are rendered in the wrapper and not in the render-function.
-// Therefore, we need to mock the notification and error toasts.
-// These are the functions that are we use in the tests to check if the toast was called.
-export const mockedTriggerError = vi.fn();
-export const mockedCreateToast = vi.fn();
-// This is needed to mock the import of the useErrorHandling and useNotification hooks.
-vi.mock("hooks/useErrorHandling");
-vi.mock("hooks/useNotification");
-// This is needed to mock the useErrorHandling and useNotification hooks.
-// .mocked() is a nice helper function for typescript support
-const mockedUseErrorHandling = vi.mocked(useErrorHandling);
-const mockedUseNotification = vi.mocked(useNotification);
-// This is needed to return the mocked functions when the hooks are called.
-mockedUseErrorHandling.mockReturnValue({ triggerError: mockedTriggerError });
-mockedUseNotification.mockReturnValue({ createToast: mockedCreateToast });
-
-// This is needed to mock the `navigator.mediaDevices.getUserMedia` function,
-// used to ask users for camera permissions in order to scan QR codes.
-const mockGetUserMedia = vi.fn(
- async () =>
- new Promise((resolve) => {
- resolve();
- }),
-);
-
-Object.defineProperty(navigator, "mediaDevices", {
- value: {
- getUserMedia: mockGetUserMedia,
- },
-});
-
-// TODO: Function for test what text is displayed deppending on userAgent?
-// Mock the `navigator.userAgent` property to check for iOS browsers.
-Object.defineProperty(navigator, "userAgent", {
- get() {
- return "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:128.0) Gecko/20100101 Firefox/128.0";
- },
- // configurable: true
-});
-
-beforeEach(() => {
- // Reset the cache before each test
- cache.restore(emptyCache);
- // Reset the mocked toast before each test
- mockedTriggerError.mockClear();
- mockedCreateToast.mockClear();
-});
diff --git a/front/src/tests/test-utils.tsx b/front/src/tests/test-utils.tsx
deleted file mode 100644
index a6cd2ec74..000000000
--- a/front/src/tests/test-utils.tsx
+++ /dev/null
@@ -1,169 +0,0 @@
-/* eslint-disable import/export */
-// TODO: Investigate possible render function overload.
-
-import { vi } from "vitest";
-import React, { ReactNode } from "react";
-import { render as rtlRender } from "@testing-library/react";
-import { MockedProvider, MockedResponse, MockLink } from "@apollo/client/testing";
-import { onError } from "@apollo/client/link/error";
-import { MemoryRouter, Route, Routes } from "react-router-dom";
-import { theme } from "utils/theme";
-import { ChakraProvider } from "@chakra-ui/react";
-import "mutationobserver-shim";
-import {
- ApolloClient,
- ApolloLink,
- InMemoryCache,
- HttpLink,
- ApolloProvider,
- DefaultOptions,
-} from "@apollo/client";
-import {
- GlobalPreferencesContext,
- IGlobalPreferencesContext,
-} from "providers/GlobalPreferencesProvider";
-import { organisation1 } from "mocks/organisations";
-import { base1 } from "mocks/bases";
-import { FakeGraphQLError, FakeGraphQLNetworkError, mockMatchMediaQuery } from "mocks/functions";
-
-// Options for Apollo MockProvider
-const defaultOptions: DefaultOptions = {
- query: {
- errorPolicy: "all",
- },
- mutate: {
- errorPolicy: "all",
- },
-};
-
-/**
- * Renders a React component with Apollo GraphQL client and @testing-library/react.
- *
- * @param {React.ReactElement} ui - The React element to render.
- * @param {Object} options - The options object.
- * @param {MockedResponse[]} options.mocks - An array of `MockedResponse` objects from `@apollo/client/testing`. These objects define the mocked responses for GraphQL queries and mutations.
- * @param {string} options.routePath - A string representing the path of the route that the `ui` component should be rendered at.
- * @param {string} options.initialUrl - A string representing the initial URL that the `MemoryRouter` should be initialized with.
- * @param {string} [options.additionalRoute] - A string representing a path the `ui` component might redirect to.
- * @param {boolean} [options.addTypename=false] - Whether to include the `__typename` field in query results.
- * @param {IGlobalPreferencesContext} [options.globalPreferences] - An object representing global preferences context for the rendered component.
- * @param {boolean} [options.mediaQueryReturnValue=true] - The return value for the mocked `window.matchMedia` function. This function is needed if the useMediaQuery is called.
- * @param {Object} options.renderOptions - Additional options that can be passed to the `rtlRender` function from `@testing-library/react`.
- * @returns {Object} An object containing the rendered component and functions for interacting with it.
- */
-
-function render(
- ui,
- {
- mocks = [],
- cache = undefined,
- routePath,
- initialUrl,
- additionalRoute = undefined,
- addTypename = false,
- globalPreferences,
- mediaQueryReturnValue = true,
- ...renderOptions
- }: {
- mocks?: Array;
- cache?: InMemoryCache;
- routePath: string;
- initialUrl: string;
- additionalRoute?: string;
- addTypename?: boolean;
- globalPreferences?: IGlobalPreferencesContext;
- mediaQueryReturnValue?: boolean;
- },
-) {
- // set showWarnings to false, as we'll log them via the onError callback instead
- const mockLink = new MockLink(mocks, undefined, { showWarnings: false });
- const errorLoggingLink = onError((error: any) => {
- const { graphQLErrors, networkError } = error;
- if (graphQLErrors) {
- for (const error of graphQLErrors) {
- // log errors, but only if they aren't ones we set up in a mock
- // TODO: figure out how to fail the outer test once these are fixed
- if (!(error instanceof FakeGraphQLError)) {
- console.error(`[GraphQL error]: ${error}`);
- }
- }
- return;
- }
- if (networkError) {
- // log errors, but only if they aren't ones we set up in a mock
- // TODO: figure out how to fail the outer test once these are fixed
- if (!(networkError instanceof FakeGraphQLNetworkError)) {
- console.error(`[GraphQL network error]: ${networkError}`);
- }
- return;
- }
- console.error(`[Unknown Error]: ${error}`);
- });
- mockLink.setOnError((error) => {
- console.error(`[MockLink Error]: ${error}`);
- });
-
- const link = ApolloLink.from([errorLoggingLink, mockLink]);
- const globalPreferencesMock: IGlobalPreferencesContext = {
- dispatch: vi.fn(),
- globalPreferences: {
- selectedBase: { id: base1.id, name: base1.name },
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- };
-
- mockMatchMediaQuery(mediaQueryReturnValue);
-
- // Mock BaseId URL Param.
-
- Object.defineProperty(window, "location", {
- value: {
- pathname: `http://localhost:3000/bases/${globalPreferences ? globalPreferences.globalPreferences.selectedBase?.id : base1.id}/`,
- },
- });
-
- const Wrapper: React.FC = ({ children }: any) => (
-
-
-
-
-
- {additionalRoute !== undefined && (
- {additionalRoute}} />
- )}
-
-
-
-
-
-
- );
- return rtlRender(ui, {
- wrapper: Wrapper,
- ...renderOptions,
- });
-}
-
-function StorybookApolloProvider({ children }: { children: ReactNode }) {
- const httpLink = new HttpLink({
- uri: "http://localhost:6006/MOCKED-graphql",
- });
-
- const client = new ApolloClient({
- cache: new InMemoryCache(),
- defaultOptions,
- link: httpLink,
- });
-
- return {children} ;
-}
-
-export * from "@testing-library/react";
-export { render, StorybookApolloProvider };
diff --git a/front/src/views/Box/BoxView.test.tsx b/front/src/views/Box/BoxView.test.tsx
deleted file mode 100644
index 305eaa82c..000000000
--- a/front/src/views/Box/BoxView.test.tsx
+++ /dev/null
@@ -1,972 +0,0 @@
-import { vi, beforeEach, it, expect } from "vitest";
-import { screen, render, waitFor } from "tests/test-utils";
-import { userEvent } from "@testing-library/user-event";
-import { cache } from "queries/cache";
-import { generateMockBox } from "mocks/boxes";
-import { generateMockLocationWithBase, locations } from "mocks/locations";
-import { product1, product3, products } from "mocks/products";
-import { BOX_BY_LABEL_IDENTIFIER_AND_ALL_PRODUCTS_WITH_BASEID_QUERY } from "views/BoxEdit/BoxEditView";
-import { tags } from "mocks/tags";
-import { textContentMatcher } from "tests/helpers";
-import { FakeGraphQLError, FakeGraphQLNetworkError, mockMatchMediaQuery } from "mocks/functions";
-import { BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY } from "queries/queries";
-import { organisation1 } from "mocks/organisations";
-import { mockedCreateToast, mockedTriggerError } from "tests/setupTests";
-import BoxDetails from "./components/BoxDetails";
-import BTBox, {
- UPDATE_NUMBER_OF_ITEMS_IN_BOX_MUTATION,
- UPDATE_STATE_IN_BOX_MUTATION,
- UPDATE_BOX_MUTATION,
-} from "./BoxView";
-
-const initialQuery = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY,
- variables: {
- labelIdentifier: "123",
- },
- },
- result: {
- data: {
- box: generateMockBox({}),
- shipments: null,
- },
- },
-};
-
-const initialQueryForChangeNumberOfBoxes = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY,
- variables: {
- labelIdentifier: "1235",
- },
- },
- result: {
- data: {
- box: generateMockBox({ labelIdentifier: "1235", numberOfItems: 31 }),
- shipments: null,
- },
- },
-};
-
-const initialQueryForBoxInLegacyLostLocation = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY,
- variables: {
- labelIdentifier: "1234",
- },
- },
- result: {
- data: {
- box: generateMockBox({
- labelIdentifier: "1234",
- location: generateMockLocationWithBase({
- defaultBoxState: "Lost",
- defaultLocationName: "LOST",
- defaultLocationId: 1,
- }),
- state: "Lost",
- }),
- shipments: null,
- },
- },
-};
-
-const initialQueryForBoxLostState = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY,
- variables: {
- labelIdentifier: "1234",
- },
- },
- result: {
- data: {
- box: generateMockBox({
- labelIdentifier: "1234",
- state: "Lost",
- }),
- shipments: null,
- },
- },
-};
-
-const initialQueryForBoxScrapState = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY,
- variables: {
- labelIdentifier: "1234",
- },
- },
- result: {
- data: {
- box: generateMockBox({
- labelIdentifier: "1234",
- state: "Scrap",
- }),
- shipments: null,
- },
- },
-};
-
-const initialQueryForBoxMarkedForShipmentState = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY,
- variables: {
- labelIdentifier: "1234",
- },
- },
- result: {
- data: {
- box: generateMockBox({
- labelIdentifier: "1234",
- state: "MarkedForShipment",
- }),
- shipments: null,
- },
- },
-};
-
-const productWithoutGenderQuery = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY,
- variables: {
- labelIdentifier: "123",
- },
- },
- result: {
- data: {
- box: generateMockBox({ product: product3 }),
- shipments: null,
- },
- },
-};
-
-const initialQueryBeforeRedirect = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY,
- variables: {
- labelIdentifier: "127",
- },
- },
- result: {
- data: {
- box: generateMockBox({
- labelIdentifier: "127",
- }),
- shipments: null,
- },
- },
-};
-
-const boxEditInitialQuery = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_PRODUCTS_WITH_BASEID_QUERY,
- variables: {
- baseId: "1",
- labelIdentifier: "127",
- },
- },
- result: {
- data: {
- box: generateMockBox({}),
- base: {
- products,
- locations,
- tags,
- },
- },
- },
-};
-
-const updateNumberOfItemsMutation = {
- request: {
- query: UPDATE_NUMBER_OF_ITEMS_IN_BOX_MUTATION,
- variables: {
- boxLabelIdentifier: "1235",
- numberOfItems: 32,
- },
- },
- result: {
- data: {
- updateBox: generateMockBox({ numberOfItems: 32, labelIdentifier: "1235" }),
- shipments: null,
- },
- },
-};
-
-const initialQueryMoveLocationOfBox = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY,
- variables: {
- labelIdentifier: "125",
- },
- },
- result: {
- data: {
- box: generateMockBox({
- labelIdentifier: "125",
- state: "InStock",
- }),
- shipments: null,
- },
- },
-};
-
-const moveLocationOfBoxMutation = {
- request: {
- query: UPDATE_BOX_MUTATION,
- variables: {
- boxLabelIdentifier: "125",
- newLocationId: 6,
- },
- },
- result: {
- data: {
- updateBox: generateMockBox({
- product: product1,
- labelIdentifier: "125",
- state: "InStock",
- location: generateMockLocationWithBase({
- defaultLocationId: 6,
- defaultLocationName: "WH Women",
- }),
- }),
- shipments: null,
- },
- },
-};
-
-const updateBoxStateToScrapMutation = {
- request: {
- query: UPDATE_STATE_IN_BOX_MUTATION,
- variables: {
- boxLabelIdentifier: "123",
- newState: "Scrap",
- },
- },
- result: {
- data: {
- updateBox: generateMockBox({
- labelIdentifier: "123",
- state: "Scrap",
- }),
- },
- },
-};
-
-const updateBoxStateToLostMutation = {
- request: {
- query: UPDATE_STATE_IN_BOX_MUTATION,
- variables: {
- boxLabelIdentifier: "123",
- newState: "Lost",
- },
- },
- result: {
- data: {
- updateBox: generateMockBox({ state: "Lost" }),
- shipments: null,
- },
- },
-};
-
-const initialFailedQuery = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY,
- variables: {
- labelIdentifier: "1111",
- },
- },
- result: {
- errors: [new FakeGraphQLError()],
- },
-};
-
-const initialWithoutShipmentQuery = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY,
- variables: {
- labelIdentifier: "129",
- },
- },
- result: {
- data: {
- box: generateMockBox({ labelIdentifier: "129" }),
- shipments: [],
- },
- },
-};
-
-const initialForFailedQuery = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY,
- variables: {
- labelIdentifier: "124",
- },
- },
- result: {
- data: {
- box: generateMockBox({ labelIdentifier: "124" }),
- shipments: null,
- },
- },
-};
-
-const updateNumberOfItemsFailedMutation = {
- request: {
- query: UPDATE_NUMBER_OF_ITEMS_IN_BOX_MUTATION,
- variables: {
- boxLabelIdentifier: "123",
- numberOfItems: 31,
- },
- },
- result: {
- errors: [new FakeGraphQLError()],
- },
-};
-
-const moveLocationOfBoxFailedMutation = {
- request: {
- query: UPDATE_BOX_MUTATION,
- variables: {
- boxLabelIdentifier: "123",
- newLocationId: 10,
- },
- },
- result: {
- errors: [new FakeGraphQLError()],
- },
-};
-
-const moveLocationOfBoxNetworkFailedMutation = {
- request: {
- query: UPDATE_BOX_MUTATION,
- variables: {
- boxLabelIdentifier: "123",
- newLocationId: 10,
- },
- },
- error: new FakeGraphQLNetworkError(),
-};
-
-beforeEach(() => {
- // setting the screensize to
- mockMatchMediaQuery(true);
-});
-
-// Test case 3.1.1
-it("3.1.1 - Initial load of Page", async () => {
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/2/boxes/123",
- mocks: [initialQuery],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- },
- });
-
- // Test case 3.1.1.1 - Is the Loading State Shown First?
- // // eslint-disable-next-line testing-library/prefer-presence-queries
- // expect(screen.getByTestId("loader")).toBeInTheDocument();
-
- // Test case 3.1.1.2 - Content: Heading renders correctly with valid box identifier
- const title = await screen.findByRole("heading", { name: "Box 123" });
- expect(title).toBeInTheDocument();
-
- // Test case 3.1.1.3 - Content: Renders sub heading with valid state for an Instock Box
- const boxSubheading = screen.getByTestId("box-subheader");
- expect(boxSubheading).toHaveTextContent("Status: InStock");
-
- // Test case 3.1.1.3.1 - Content: State color for Instock Box is correct
- expect(screen.getByTestId("box-state")).toHaveStyle(`color: #0CA789`);
-
- // Test case 3.1.1.4 - Hide Distro Event Functionality for Ineligible Orgs
- // const distroEventSection = screen.getByTestId("box-sections");
- // expect(distroEventSection).not.toContain("Assign this Box to Distribution Event:");
-
- // Test case 3.1.1.5 - Content: Box Tags are shown correctly
- const boxTags = screen.getByTestId("box-tags");
- expect(boxTags).toBeInTheDocument();
- expect(screen.getByText(/test tag/i)).toBeInTheDocument();
- expect(boxTags).toHaveTextContent("test tag");
-
- // Test case 3.1.1.6 - Content: Comment section renders correctly
- expect(screen.getByText(/comment:/i)).toBeInTheDocument();
- const element = screen.queryByText(/Good Comment/i);
- expect(element).toBeInTheDocument();
-}, 10000);
-
-// Test case 3.1.1.7
-
-it("3.1.1.7 - Content: Display an warning note if a box is located in a legacy location", async () => {
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/1/boxes/1234",
- mocks: [initialQueryForBoxInLegacyLostLocation],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- },
- });
-
- // Test case 3.1.1.7 - Content: Display an warning note if a box is located in a legacy location
-
- const title = await screen.findByRole("heading", { name: "Box 1234" });
- expect(title).toBeInTheDocument();
-
- expect(screen.getByRole("alert")).toBeInTheDocument();
- expect(
- screen.getByText(
- /To edit this box, please move it to an InStock warehouse location\. Boxtribute no longer supports LOST and SCRAP locations\./i,
- ),
- ).toBeInTheDocument();
-}, 10000);
-
-// Test case 3.1.1.8
-it("3.1.1.8 - Content: Display an info alert if a box status is Lost", async () => {
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/1/boxes/1234",
- mocks: [initialQueryForBoxLostState],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- },
- });
-
- // Test case 3.1.1.8 - Content: Display an info alert if a box status is Lost
-
- const title = await screen.findByRole("heading", { name: "Box 1234" });
- expect(title).toBeInTheDocument();
-
- expect(screen.getByRole("alert")).toBeInTheDocument();
- expect(screen.getByText(/to edit or move this box, remove the lost status/i)).toBeInTheDocument();
-}, 10000);
-
-// Test case 3.1.1.9
-it("3.1.1.9 - Content: Display an info alert if a box status is Scrap", async () => {
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/1/boxes/1234",
- mocks: [initialQueryForBoxScrapState],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- },
- });
-
- // Test case 3.1.1.9 - Content: Display an info alert if a box status is Scrap
-
- const title = await screen.findByRole("heading", { name: "Box 1234" });
- expect(title).toBeInTheDocument();
-
- expect(screen.getByRole("alert")).toBeInTheDocument();
- expect(
- screen.getByText(/to edit or move this box, remove the scrap status/i),
- ).toBeInTheDocument();
-}, 10000);
-
-// Test case 3.1.1.10
-it("3.1.1.10 - Content: Display an info alert if a box status is mark for shipment", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/1/boxes/1234",
- mocks: [initialQueryForBoxMarkedForShipmentState],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- },
- });
-
- // Test case 3.1.1.10 - Content: Display an info alert if a box status is mark for shipment
-
- const title = await screen.findByRole("heading", { name: "Box 1234" });
- expect(title).toBeInTheDocument();
-
- const moveTab = screen.getByRole("tab", { name: /move/i });
- user.click(moveTab);
-
- expect(await screen.findByRole("alert")).toBeInTheDocument();
- expect(screen.getByText(/markedforshipment boxes are not movable/i)).toBeInTheDocument();
-}, 10000);
-// Test case 3.1.2
-it("3.1.2 - Change Number of Items", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/2/boxes/1235",
- mocks: [initialQueryForChangeNumberOfBoxes, updateNumberOfItemsMutation],
- cache,
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- },
- });
-
- const title = await screen.findByRole("heading", { name: "Box 1235" });
- expect(title).toBeInTheDocument();
-
- expect(screen.getByRole("heading", { name: /31x snow trousers/i }));
-
- const addToItemsButton = screen.getByTestId("increase-items");
- await user.click(addToItemsButton);
-
- // Test case 3.1.2.1 - Click on + Button
- expect(await screen.findByText(/add items to the Box/i)).toBeInTheDocument();
- await waitFor(() => expect(screen.getByRole("spinbutton")).toHaveValue("1"));
-
- // Test case 3.1.2.1.1 - Alphabetical Input isn't allowed
- await user.type(screen.getByRole("spinbutton"), "a");
- await waitFor(() => expect(screen.getByRole("spinbutton")).toHaveValue("1"));
-
- // Test case 3.1.2.1.2 - Number of Item Validation
- await user.type(screen.getByRole("spinbutton"), "{backspace}");
- await user.type(screen.getByRole("spinbutton"), "-");
- await waitFor(() => expect(screen.getByRole("spinbutton")).toHaveValue("-"));
-
- await user.click(
- screen.getByRole("button", {
- name: /submit/i,
- }),
- );
-
- await waitFor(() => expect(screen.getByRole("spinbutton")).toHaveValue("0"));
-
- // // // Test case 3.1.2.2 - Number of Item Validation
- await user.type(screen.getByRole("spinbutton"), "{backspace}");
- await user.type(screen.getByRole("spinbutton"), "1");
- await waitFor(() => expect(screen.getByRole("spinbutton")).toHaveValue("1"));
-
- await user.click(
- screen.getByRole("button", {
- name: /submit/i,
- }),
- );
-
- await waitFor(() =>
- expect(mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/successfully added 1 items to box/i),
- }),
- ),
- );
- expect(screen.getByTestId("boxview-number-items")).toHaveTextContent(/32x snow trousers/i);
-}, 50000);
-
-// Test case 3.1.3.1
-it("3.1.3.1 - Change State to Scrap", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/2/boxes/123",
- mocks: [initialQuery, updateBoxStateToScrapMutation, updateBoxStateToLostMutation],
- cache,
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- },
- });
-
- expect(await screen.findByText(/status:/i)).toBeInTheDocument();
-
- const boxSubheading = screen.getByTestId("box-subheader");
- await waitFor(() => expect(boxSubheading).toHaveTextContent("Status: InStock"));
- // Test case 3.1.3.1 - Click on Scrap
- user.click(screen.getByTestId("box-scrap-btn"));
-
- expect(await screen.findByText(/status:/i)).toBeInTheDocument();
- // Test case 3.1.3.1.1 - Change state on Scrap Toggled
- await waitFor(() =>
- expect(screen.getByTestId("box-subheader")).toHaveTextContent("Status: Scrap"),
- );
-}, 10000);
-
-// Test case 3.1.3.2
-it("3.1.3.2 - Change State to Lost", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/2/boxes/123",
- mocks: [initialQuery, updateBoxStateToLostMutation],
- addTypename: true,
- cache,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- },
- });
-
- expect(await screen.findByText(/status:/i)).toBeInTheDocument();
-
- // Test case 3.1.3.2 - Click on Lost
- user.click(screen.getByTestId("box-lost-btn"));
-
- expect(await screen.findByText(/status:/i)).toBeInTheDocument();
- // Test case 3.1.3.2.1 - Change state on Lost Toggled
- const boxSubheadingChangedToLost = screen.getByTestId("box-subheader");
- await waitFor(() => expect(boxSubheadingChangedToLost).toHaveTextContent("Status: Lost"));
-
- // Test case 3.1.3.2.2 - If state changes to Lost, color also changes
- expect(screen.getByTestId("box-state")).toHaveStyle(`color: #EB404A`);
-
- // Test case 3.1.3.3 - If the Box is in a Lost or Scrap state, editing should be disabled
- expect(screen.getByTestId("increase-items")).toHaveAttribute("disabled");
- expect(screen.getByTestId("decrease-items")).toHaveAttribute("disabled");
- expect(screen.getByRole("button", { name: /edit box/i })).toHaveAttribute("disabled");
-}, 10000);
-
-// Test case 3.1.4
-it("3.1.4 - Move location", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/1/boxes/125",
- mocks: [initialQueryMoveLocationOfBox, moveLocationOfBoxMutation],
- cache,
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- },
- });
-
- expect(await screen.findByText(/move this box from/i)).toBeInTheDocument();
-
- const boxLocationLabel = screen.getByTestId("box-location-label");
- expect(boxLocationLabel).toHaveTextContent("WH Men to:");
- // Test case 3.1.4.1- Click to move box from WH Men to WH Women
- const whWomenLocation = screen.getByRole("button", { name: /wh women/i });
- user.click(whWomenLocation);
-
- await waitFor(() =>
- expect(mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/successfully moved the box/i),
- }),
- ),
- );
-
- await screen.findByRole("button", { name: /wh men/i });
- const boxLocationUpdatedLabel = screen.getByTestId("box-location-label");
- expect(boxLocationUpdatedLabel).toHaveTextContent("Move this box from WH Women to:");
-
- // // Test case 3.1.4.2 - Show last history entry
- expect(await screen.findByText(/history:/i)).toBeInTheDocument();
- const historyEntry = screen.getByTestId("history-1");
- expect(historyEntry).toBeInTheDocument();
-
- // // Test case 3.1.4.2.1 - Show last history entry icon
- expect(screen.getByRole("presentation")).toBeInTheDocument();
-}, 10000);
-
-// Test case 3.1.5
-it("3.1.5 - Redirect to Edit Box", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/1/boxes/127",
- additionalRoute: "/bases/1/boxes/127/edit",
- mocks: [initialQueryBeforeRedirect, boxEditInitialQuery],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- },
- });
-
- const title = await screen.findByRole("heading", { name: "Box 127" });
- expect(title).toBeInTheDocument();
-
- // Test case 3.1.5.1 - Click on edit Icon
- const editLink = screen.getByRole("link");
- user.click(editLink);
-
- expect(
- await screen.findByRole("heading", { name: "/bases/1/boxes/127/edit" }),
- ).toBeInTheDocument();
-}, 10000);
-
-// Test case 3.1.6
-it("3.1.6 - Product Gender", async () => {
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/2/boxes/123",
- mocks: [productWithoutGenderQuery],
- addTypename: true,
- });
-
- const title = await screen.findByRole("heading", { name: "Box 123" });
- expect(title).toBeInTheDocument();
- // Test case 3.1.6.1 - Don't Show Gender If Not Applicable
- const element = screen.queryByText(textContentMatcher("Gender:"));
- expect(element).not.toBeInTheDocument();
-}, 10000);
-
-// Test case 3.1.7
-it("3.1.7 - Error Shows Correctly When Trying to Remove (-) Items", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/2/boxes/124",
- mocks: [initialForFailedQuery, updateNumberOfItemsFailedMutation],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- },
- });
-
- const title = await screen.findByRole("heading", { name: "Box 124" });
- expect(title).toBeInTheDocument();
-
- // Test case 3.1.7.1 - Correct input is entered, but there is a processing error (item mutation query returns and error message)
- const takeItemsButton = screen.getByTestId("decrease-items");
- user.click(takeItemsButton);
- expect(await screen.findByText(/take items from the box/i)).toBeInTheDocument();
-
- await user.type(screen.getByRole("spinbutton"), "1");
- user.click(screen.getByText(/Submit/i));
-
- await waitFor(
- () =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/could not remove items from the box./i),
- }),
- ),
- { timeout: 5000 },
- );
-}, 20000);
-
-// Test case 3.1.7.2
-it("3.1.7.2 - Form data was valid, but the mutation failed", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/2/boxes/124",
- mocks: [initialForFailedQuery, moveLocationOfBoxFailedMutation],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- },
- });
-
- const title = await screen.findByRole("heading", { name: "Box 124" });
- expect(title).toBeInTheDocument();
-
- const boxLocationLabel = screen.getByTestId("box-location-label");
- expect(boxLocationLabel).toHaveTextContent("Move this box from WH Men to:");
-
- const whWomenLocation = screen.getByRole("button", { name: /wh shoes/i });
- user.click(whWomenLocation);
-
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/box could not be moved!/i),
- }),
- ),
- );
-}, 10000);
-
-// Test case 3.1.8
-it("3.1.8 - Error When Move Locations", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/2/boxes/124",
- mocks: [initialForFailedQuery, moveLocationOfBoxNetworkFailedMutation],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- },
- });
- await waitFor(() => {
- expect(screen.getByTestId("box-header")).toBeInTheDocument();
- });
-
- // Test case 3.1.8.1 - Move Location has a processing error (box move mutation query returns error)
- const boxLocationLabel = screen.getByText(/move this box from/i);
- expect(boxLocationLabel).toHaveTextContent("Move this box from WH Men to:");
-
- const whWomenLocation = screen.getByRole("button", { name: /wh shoes/i });
- user.click(whWomenLocation);
-
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/box could not be moved!/i),
- }),
- ),
- );
-}, 10000);
-
-// Test case 3.1.9
-it("3.1.9 - Given Invalid Box Label Identifier in the URL/Link", async () => {
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/2/boxes/1111",
- mocks: [initialFailedQuery],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- },
- });
-
- await screen.findByText(/could not fetch box data! please try reloading the page./i);
-}, 10000);
-
-// Test case 3.1.10
-it("3.1.10 - No Data or Null Data Fetched for a given Box Label Identifier", async () => {
- const mockFunction = vi.fn();
- render(
- ,
- {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/2/boxes/1111",
- mocks: [initialFailedQuery],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- },
- },
- );
-
- await screen.findByText(/no data found for a box with this id/i);
-}, 10000);
-
-// Test case 4.6.1.3
-
-it("4.6.1.3 - Box is InStock and query for shipments returns no shipments in preparing state", async () => {
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/2/boxes/129",
- mocks: [initialWithoutShipmentQuery],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- },
- });
-
- await waitFor(() => {
- expect(screen.getByRole("heading", { name: /box 129/i })).toBeInTheDocument();
- });
-
- expect(screen.getByRole("tab", { name: /move/i, selected: true })).toHaveTextContent("Move");
-
- // The following code is commented out as a temporary workaround (refer to Trello card at https://trello.com/c/4lxf6jY3).
-
- // const transferTab = screen.getByRole("tab", { name: /transfer/i });
- // await user.click(transferTab);
-
- // expect(screen.getByRole("tab", { name: /transfer/i, selected: true })).toHaveTextContent(
- // "Transfer",
- // );
-
- // await waitFor(() =>
- // expect(
- // screen.getByText(/no shipments are being prepared from your base!/i),
- // ).toBeInTheDocument(),
- // );
-}, 10000);
-
-// Test case 4.6.1.3b
-it('4.6.1.3b - When there are no shipments, the "Transfer" tab should not be visible', async () => {
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/2/boxes/129",
- mocks: [initialWithoutShipmentQuery],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- },
- },
- });
-
- await waitFor(() => {
- expect(screen.getByRole("heading", { name: /box 129/i })).toBeInTheDocument();
- });
-
- expect(screen.getByRole("tab", { name: /move/i, selected: true })).toHaveTextContent("Move");
-
- expect(screen.queryByRole("tab", { name: /transfer/i, selected: true })).not.toBeInTheDocument();
-}, 10000);
diff --git a/front/src/views/Box/BoxViewHistoryOverlay.test.tsx b/front/src/views/Box/BoxViewHistoryOverlay.test.tsx
deleted file mode 100644
index 7efd84952..000000000
--- a/front/src/views/Box/BoxViewHistoryOverlay.test.tsx
+++ /dev/null
@@ -1,111 +0,0 @@
-import { vi, beforeEach, it, expect, describe } from "vitest";
-import { screen, render } from "tests/test-utils";
-import { userEvent } from "@testing-library/user-event";
-import { cache } from "queries/cache";
-
-import { BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY } from "queries/queries";
-import { organisation1 } from "mocks/organisations";
-
-import { history1, history2 } from "mocks/histories";
-import { generateMockBox } from "mocks/boxes";
-import { mockMatchMediaQuery } from "mocks/functions";
-import BTBox from "./BoxView";
-
-const initialQueryForBoxWithHistory = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY,
- variables: {
- labelIdentifier: "123",
- },
- notifyOnNetworkStatusChange: true,
- },
- result: {
- data: {
- box: generateMockBox({
- labelIdentifier: "123",
- state: "InStock",
- histories: [history1, history2],
- }),
- },
- },
-};
-
-// Test case 3.1.12
-describe("3.1.12 - Box HistoryOverlay on BoxView", () => {
- beforeEach(() => {
- // setting the screensize to
- mockMatchMediaQuery(true);
- });
-
- // Test case 3.1.12.1
- it("3.1.12.1 - When more than one entry is available displays history icon", async () => {
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/1/boxes/123",
- additionalRoute: "/bases/1/shipment/1",
- mocks: [initialQueryForBoxWithHistory],
- addTypename: true,
- cache,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: organisation1.bases[0],
- },
- },
- });
-
- const heading = await screen.findByRole("heading", { name: /box 123/i });
- expect(heading).toBeInTheDocument();
-
- const showHistoryButton = await screen.findByRole("button", {
- name: /show detail history/i,
- });
-
- expect(showHistoryButton).toBeInTheDocument();
- }, 10000);
-
- // Test case 3.1.12.2
- it("3.1.12.2 - Click on history icons opens history overlay", async () => {
- const user = userEvent.setup();
-
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/1/boxes/123",
- additionalRoute: "/bases/1/shipment/1",
- mocks: [initialQueryForBoxWithHistory],
- addTypename: true,
- cache,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: organisation1.bases[0],
- },
- },
- });
-
- const heading = await screen.findByRole("heading", { name: /box 123/i });
- expect(heading).toBeInTheDocument();
-
- const historyButton = await screen.findByRole("button", {
- name: /show detail history/i,
- });
-
- expect(historyButton).toBeInTheDocument();
-
- await user.click(historyButton);
-
- const banner = await screen.findByRole("banner");
-
- expect(banner).toBeInTheDocument();
- expect(screen.getByText(/jan 14, 2023/i)).toBeInTheDocument();
- expect(
- screen.getByText(/dev coordinator changed box location from wh men to wh women/i),
- ).toBeInTheDocument();
- expect(screen.getByText(/jan 12, 2023/i)).toBeInTheDocument();
- expect(screen.getByText(/dev coordinator created record/i)).toBeInTheDocument();
- }, 10000);
-});
diff --git a/front/src/views/Box/BoxViewReconciliationOverlay.test.tsx b/front/src/views/Box/BoxViewReconciliationOverlay.test.tsx
deleted file mode 100644
index d79e27917..000000000
--- a/front/src/views/Box/BoxViewReconciliationOverlay.test.tsx
+++ /dev/null
@@ -1,143 +0,0 @@
-import { vi, beforeEach, it, expect } from "vitest";
-import { screen, render } from "tests/test-utils";
-import { cache } from "queries/cache";
-import {
- BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY,
- SHIPMENT_BY_ID_WITH_PRODUCTS_AND_LOCATIONS_QUERY,
-} from "queries/queries";
-import { organisation1 } from "mocks/organisations";
-import { generateMockLocationWithBase } from "mocks/locations";
-import { products } from "mocks/products";
-import { tag1, tag2 } from "mocks/tags";
-import { generateMockShipment } from "mocks/shipments";
-import { mockMatchMediaQuery } from "mocks/functions";
-import BTBox from "./BoxView";
-
-const initialQueryForBoxInReceivingState = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY,
- variables: {
- labelIdentifier: "123",
- },
- notifyOnNetworkStatusChange: true,
- },
- result: {
- data: {
- box: {
- __typename: "Box",
- comment: null,
- distributionEvent: null,
- history: [],
- labelIdentifier: "123",
- location: null,
- numberOfItems: 10,
- product: null,
- shipmentDetail: {
- __typename: "ShipmentDetail",
- shipment: {
- __typename: "Shipment",
- details: [
- {
- __typename: "ShipmentDetail",
- box: {
- __typename: "Box",
- labelIdentifier: "123",
- location: null,
- },
- sourceLocation: {
- __typename: "ClassicLocation",
- defaultBoxState: "InStock",
- id: "18",
- name: "WH2",
- seq: 18,
- },
- sourceProduct: {
- __typename: "Product",
- gender: "UnisexBaby",
- id: "399",
- name: "baby gloves",
- },
- sourceQuantity: 10,
- sourceSize: {
- __typename: "Size",
- id: "52",
- label: "Mixed",
- },
- },
- ],
- id: "1",
- state: "Receiving",
- targetBase: {
- __typename: "Base",
- id: "1",
- name: "Lesvos",
- organisation: {
- __typename: "Organisation",
- id: "1",
- name: "BoxAid",
- },
- },
- },
- },
- size: {
- __typename: "Size",
- id: "52",
- label: "Mixed",
- },
- state: "Receiving",
- tags: [],
- },
- shipments: [generateMockShipment({ state: "Receiving" })],
- },
- },
-};
-
-const queryShipmentDetailForBoxReconciliation = {
- request: {
- query: SHIPMENT_BY_ID_WITH_PRODUCTS_AND_LOCATIONS_QUERY,
- variables: {
- shipmentId: "1",
- baseId: "1",
- },
- },
- result: {
- data: {
- base: {
- locations: [generateMockLocationWithBase({})],
- products,
- tags: [tag1, tag2],
- },
- shipment: generateMockShipment({ state: "Receiving" }),
- },
- },
-};
-
-beforeEach(() => {
- // setting the screensize to
- mockMatchMediaQuery(true);
-});
-
-// Test case 4.7.4.1
-it("4.7.4.1 - Reconciliation dialog automatically appears when box state equals Receiving", async () => {
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier",
- initialUrl: "/bases/1/boxes/123",
- additionalRoute: "/bases/1/shipment/1",
- mocks: [initialQueryForBoxInReceivingState, queryShipmentDetailForBoxReconciliation],
- addTypename: true,
- cache,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: organisation1.bases[0],
- },
- },
- });
-
- expect(await screen.findByRole("heading", { name: /box 123/i })).toBeInTheDocument();
-
- expect(screen.getByText(/match products/i)).toBeInTheDocument();
- expect(screen.getByText(/receive location/i)).toBeInTheDocument();
-}, 10000);
diff --git a/front/src/views/BoxCreate/components/BoxCreate.stories.tsx b/front/src/views/BoxCreate/components/BoxCreate.stories.tsx
deleted file mode 100644
index d794e19e7..000000000
--- a/front/src/views/BoxCreate/components/BoxCreate.stories.tsx
+++ /dev/null
@@ -1,136 +0,0 @@
-import { Meta, StoryFn } from "@storybook/react";
-// import { DistroEvent } from "../State1Planning/DistroEventPlanning";
-import { action } from "@storybook/addon-actions";
-import BoxCreate, { IBoxCreateProps, IProductWithSizeRangeData, ISizeRangeData } from "./BoxCreate";
-
-const mockedEuTshirtsSizeRange: ISizeRangeData = {
- label: "EU T-Shirt Sizes (XS-XXL)",
- sizes: [
- {
- id: "1",
- label: "XS",
- },
- {
- id: "2",
- label: "S",
- },
- ],
-};
-const mockedEuJacketsSizeRange: ISizeRangeData = {
- label: "EU Jacket Sizes (XS-XXL)",
- sizes: [
- {
- id: "1",
- label: "38",
- },
- {
- id: "2",
- label: "42",
- },
- ],
-};
-
-const mockedLocations: IBoxCreateProps["allLocations"] = [
- {
- id: "1",
- name: "Warehouse 1",
- },
- {
- id: "2",
- name: "Warehouse 2",
- },
- {
- id: "3",
- name: "Sorting Area",
- },
-];
-
-const mockedProducts: IProductWithSizeRangeData[] = [
- {
- id: "1",
- name: "Jacket Male",
- category: {
- name: "Jackets",
- },
- sizeRange: mockedEuTshirtsSizeRange,
- },
- {
- id: "3",
- name: "Jacket Woman",
- category: {
- name: "Jackets",
- },
- sizeRange: mockedEuJacketsSizeRange,
- },
- {
- id: "2",
- name: "T-shirt",
- gender: "Women",
- category: {
- name: "T-Shirts",
- },
- sizeRange: mockedEuTshirtsSizeRange,
- },
- // size: {
- // id: "1",
- // label: "M"
- // },
-
- // size: {
- // id: "2",
- // label: "S"
- // },
- // size: {
- // id: "1",
- // label: "M"
- // },
-
- // size: {
- // id: "123",
- // label: "M",
- // },
- // {
- // id: "1",
- // name: "T-shirt",
- // gender: ProductGender.Men,
- // sizeRange: {
- // label: "EU Jacket Sizes (XS-XXL)"
- // }
- // },
- // {
- // size: {
- // id: "234",
- // label: "S",
- // },
-];
-
-// const mockedPackingActionListProps: PackingActionListProps = {
-// onDeleteBoxFromDistribution: action("onDeleteBoxFromDistribution"),
-// }
-
-export default {
- title: "Boxes/Create/Component",
- component: BoxCreate,
- parameters: {},
-} as Meta;
-
-const Template: StoryFn = (args) => ;
-
-const mockedProps: IBoxCreateProps = {
- productAndSizesData: mockedProducts,
- allLocations: mockedLocations,
- onSubmitBoxCreateForm: action("onSubmitBoxCreateForm"),
- allTags: undefined,
-};
-
-export const Default = Template.bind({});
-Default.args = {
- ...mockedProps,
- // packingListEntries: mockedDistroEventPackingList,
- // boxData: mockedBoxData,
- // boxesData: mockedBoxesData,
- // onShowListClick: action('onShowListClick'),
- // packingActionProps: mockedPackingActionProps,
- // packingActionListProps: mockedPackingActionListProps,
- // onCheckboxClick: action('onCheckboxClick'),
-};
diff --git a/front/src/views/BoxEdit/BoxEditView.test.tsx b/front/src/views/BoxEdit/BoxEditView.test.tsx
deleted file mode 100644
index ba6dc98f1..000000000
--- a/front/src/views/BoxEdit/BoxEditView.test.tsx
+++ /dev/null
@@ -1,340 +0,0 @@
-import { it, expect } from "vitest";
-import { userEvent } from "@testing-library/user-event";
-import { screen, render, waitFor } from "tests/test-utils";
-import { assertOptionsInSelectField, selectOptionInSelectField } from "tests/helpers";
-import { box123 } from "mocks/boxes";
-import { products } from "mocks/products";
-import { locations } from "mocks/locations";
-import { tags } from "mocks/tags";
-import { BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY } from "queries/queries";
-import { mockedCreateToast, mockedTriggerError } from "tests/setupTests";
-import BoxEditView, {
- BOX_BY_LABEL_IDENTIFIER_AND_ALL_PRODUCTS_WITH_BASEID_QUERY,
- UPDATE_CONTENT_OF_BOX_MUTATION,
-} from "./BoxEditView";
-import { FakeGraphQLError, FakeGraphQLNetworkError } from "mocks/functions";
-
-const initialQuery = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_PRODUCTS_WITH_BASEID_QUERY,
- variables: {
- baseId: "1",
- labelIdentifier: "123",
- },
- },
- result: {
- data: {
- box: box123,
- base: {
- products,
- locations,
- tags,
- },
- },
- },
-};
-
-const initialQueryNetworkError = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_PRODUCTS_WITH_BASEID_QUERY,
- variables: {
- baseId: "1",
- labelIdentifier: "123",
- },
- },
- result: {
- errors: [new FakeGraphQLError()],
- },
-};
-
-const initialQueryGraphQLError = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_PRODUCTS_WITH_BASEID_QUERY,
- variables: {
- baseId: "1",
- labelIdentifier: "123",
- },
- },
- error: new FakeGraphQLNetworkError(),
-};
-
-const successfulMutation = {
- request: {
- query: UPDATE_CONTENT_OF_BOX_MUTATION,
- variables: {
- boxLabelIdentifier: "123",
- productId: 1,
- sizeId: 2,
- numberOfItems: 62,
- locationId: 1,
- tagIds: [1],
- comment: "Test",
- },
- },
- result: {
- data: {
- updateBox: {
- labelIdentifier: 123,
- },
- },
- },
-};
-
-const refetchQuery = {
- request: {
- query: BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY,
- variables: {
- labelIdentifier: "123",
- },
- },
- result: {
- data: {
- box: box123,
- },
- },
-};
-
-const mutationNetworkError = {
- request: {
- query: UPDATE_CONTENT_OF_BOX_MUTATION,
- variables: {
- boxLabelIdentifier: "123",
- productId: 1,
- sizeId: 2,
- numberOfItems: 62,
- locationId: 1,
- tagIds: [1],
- comment: "Test",
- },
- },
- error: new FakeGraphQLNetworkError(),
-};
-
-const mutationGraphQLError = {
- request: {
- query: UPDATE_CONTENT_OF_BOX_MUTATION,
- variables: {
- boxLabelIdentifier: "123",
- productId: 1,
- sizeId: 2,
- numberOfItems: 62,
- locationId: 1,
- tagIds: [1],
- comment: "Test",
- },
- },
- result: {
- errors: [new FakeGraphQLError()],
- },
-};
-
-// Test case 3.2.1
-it("3.2.1 - Initial load of Page", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier/edit",
- initialUrl: "/bases/1/boxes/123/edit",
- mocks: [initialQuery],
- addTypename: true,
- });
-
- // 3.2.1.0 Show loading state
- expect(screen.getByTestId("loading-indicator")).toBeInTheDocument();
-
- // 3.2.1.1 Title is rendered
- const title = await screen.findByRole("heading", { name: "Box 123" });
- expect(title).toBeInTheDocument();
-
- // 3.2.1.2 Product of Box is shown
- expect(screen.getByText(/Long Sleeves.*Women/)).toBeInTheDocument();
- // 3.2.1.2.1 Product Options are shown correctly
- await assertOptionsInSelectField(user, /Product/, [/Winter Jacket.*Men/], title, [
- /Jackets \/ Outerwear/,
- /Tops/,
- ]);
-
- // 3.2.1.3 Size of Box is shown
- expect(await screen.findByText("S")).toBeInTheDocument();
- // 3.2.1.3.1 Size Options are shown correctly
- await assertOptionsInSelectField(user, /Size/, ["M", "L"], title);
-
- // 3.2.1.4 NumberofItems of Box is shown
- expect(await screen.findByDisplayValue(/62/i)).toBeInTheDocument();
-
- // 3.2.1.5 Location of Box is shown
- expect(screen.getByText("Warehouse")).toBeInTheDocument();
- // 3.2.1.5.1 Location Options are shown correctly
- await assertOptionsInSelectField(user, /Location/, [/Shop.*Donated/], title);
-
- // 3.2.1.6 Tag of Box is shown
- expect(await screen.findByText(/tag1/i)).toBeInTheDocument();
- // 3.2.1.6.1 Tag Options are shown correctly
- await assertOptionsInSelectField(user, /Tags/, [/tag2/i], title);
-
- // 3.2.1.7 Comments of Box is shown
- expect(await screen.findByDisplayValue(/test/i)).toBeInTheDocument();
-}, 20000);
-
-it("3.2.2 - Cancel Button", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier/edit",
- initialUrl: "/bases/1/boxes/123/edit",
- mocks: [initialQuery],
- addTypename: true,
- additionalRoute: "/bases/1/boxes/123",
- });
- const cancelButton = await screen.findByRole("button", { name: /cancel/i });
- await user.click(cancelButton);
- expect(screen.getByRole("heading", { name: "/bases/1/boxes/123" })).toBeInTheDocument();
-}, 10000);
-
-it("3.2.3 - Change Product", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier/edit",
- initialUrl: "/bases/1/boxes/123/edit",
- mocks: [initialQuery, successfulMutation, refetchQuery],
- addTypename: true,
- additionalRoute: "/bases/1/boxes/123",
- });
-
- const submitButton = await screen.findByRole("button", { name: /update box/i });
-
- // 3.2.3.2 Select Product with one --> Size is selected automatically
- await selectOptionInSelectField(user, /Product/, /Winter Jacket.*Men/);
- expect(await screen.findByText("Mixed")).toBeInTheDocument();
-
- // 3.2.3.1 Select Product multiple sizes --> SizeField is empty
- await selectOptionInSelectField(user, /Product/, /Long Sleeves.*Women/);
- expect(await screen.findByText(/select a size/i)).toBeInTheDocument();
-
- // 3.2.3.1.1 Prohibit submission of empty submit field
- await user.click(submitButton);
- expect(screen.getAllByText(/select a size/i)).toHaveLength(2);
- expect(screen.queryByRole("heading", { name: "/bases/1/boxes/123" })).not.toBeInTheDocument();
-
- // 3.2.3.2 Successful submission
- await selectOptionInSelectField(user, /Size/, "M");
- expect(await screen.findByText("M")).toBeInTheDocument();
- await user.click(submitButton);
- await waitFor(() =>
- expect(mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/successfully modified/i),
- }),
- ),
- );
- expect(await screen.findByRole("heading", { name: "/bases/1/boxes/123" })).toBeInTheDocument();
-}, 20000);
-
-it("3.2.4 - No Data is loaded due to Network error", async () => {
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier/edit",
- initialUrl: "/bases/1/boxes/123/edit",
- mocks: [initialQueryNetworkError],
- addTypename: true,
- });
- // The correct error notifications appear
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/could not fetch Box Data/i),
- }),
- ),
- );
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/no products are available/i),
- }),
- ),
- );
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/no locations are available/i),
- }),
- ),
- );
- // an empty div is rendered
- expect(screen.queryByRole("heading")).not.toBeInTheDocument();
-});
-
-it("3.2.5 - No Data is loaded due to GraphQL error", async () => {
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier/edit",
- initialUrl: "/bases/1/boxes/123/edit",
- mocks: [initialQueryGraphQLError],
- addTypename: true,
- });
- // The correct error notifications appear
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/could not fetch Box Data/i),
- }),
- ),
- );
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/no products are available/i),
- }),
- ),
- );
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/no locations are available/i),
- }),
- ),
- );
-
- // an empty div is rendered
- expect(screen.queryByRole("heading")).not.toBeInTheDocument();
-});
-
-it("3.2.6 - Mutation Failure due to Network Error", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier/edit",
- initialUrl: "/bases/1/boxes/123/edit",
- mocks: [initialQuery, mutationNetworkError],
- addTypename: true,
- additionalRoute: "/bases/1/boxes/123",
- });
-
- const submitButton = await screen.findByRole("button", { name: /update box/i });
- await user.click(submitButton);
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/could not update Box/i),
- }),
- ),
- );
- expect(screen.getByRole("heading", { name: "Box 123" })).toBeInTheDocument();
-});
-
-it("3.2.7 - Mutation failure due to GraphQL Error", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/boxes/:labelIdentifier/edit",
- initialUrl: "/bases/1/boxes/123/edit",
- mocks: [initialQuery, mutationGraphQLError],
- addTypename: true,
- additionalRoute: "/bases/1/boxes/123",
- });
-
- const submitButton = await screen.findByRole("button", { name: /update box/i });
- await user.click(submitButton);
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/could not update Box/i),
- }),
- ),
- );
- expect(await screen.findByRole("heading", { name: "Box 123" })).toBeInTheDocument();
-});
diff --git a/front/src/views/Boxes/BoxesView.test.tsx b/front/src/views/Boxes/BoxesView.test.tsx
deleted file mode 100644
index d99fdc584..000000000
--- a/front/src/views/Boxes/BoxesView.test.tsx
+++ /dev/null
@@ -1,685 +0,0 @@
-import { vi, it, describe, expect } from "vitest";
-import { userEvent } from "@testing-library/user-event";
-import { base2 } from "mocks/bases";
-import { organisation1, organisation2 } from "mocks/organisations";
-import { screen, render, waitFor, within } from "tests/test-utils";
-import { generateMoveBoxRequest } from "queries/dynamic-mutations";
-import { ErrorBoundary } from "@sentry/react";
-import { AlertWithoutAction } from "components/Alerts";
-import { TableSkeleton } from "components/Skeletons";
-import { Suspense } from "react";
-import { cache } from "queries/cache";
-import Boxes, { ACTION_OPTIONS_FOR_BOXESVIEW_QUERY, BOXES_FOR_BOXESVIEW_QUERY } from "./BoxesView";
-import { FakeGraphQLError, FakeGraphQLNetworkError } from "mocks/functions";
-
-const boxesQuery = {
- request: {
- query: BOXES_FOR_BOXESVIEW_QUERY,
- variables: {
- baseId: "2",
- filterInput: {
- states: ["InStock"],
- },
- },
- },
- result: {
- data: {
- // TODO: the data should be placed in the mocks
- boxes: {
- __typename: "BoxPage",
- elements: [
- {
- __typename: "Box",
- comment: null,
- history: [],
- labelIdentifier: "4495955",
- location: {
- __typename: "ClassicLocation",
- base: {
- __typename: "Base",
- id: "2",
- name: "Thessaloniki",
- },
- defaultBoxState: "Scrap",
- id: "15",
- name: "SCRAP",
- },
- numberOfItems: 99,
- product: {
- __typename: "Product",
- deletedOn: null,
- category: {
- id: "1",
- name: "Bottoms",
- __typename: "ProductCategory",
- },
- gender: "none",
- id: "233",
- name: "Toothbrush",
- },
- shipmentDetail: null,
- size: {
- __typename: "Size",
- id: "68",
- label: "One size",
- },
- state: "Scrap",
- tags: [],
- createdOn: "2021-10-29T15:02:40+00:00",
- createdBy: {
- __typename: "User",
- id: "123",
- name: "Some User",
- },
- lastModifiedBy: {
- __typename: "User",
- id: "1234",
- name: "Another User",
- },
- lastModifiedOn: new Date().toISOString(),
- deletedOn: null,
- },
- {
- __typename: "Box",
- comment: null,
- history: [],
- labelIdentifier: "1481666",
- location: {
- __typename: "ClassicLocation",
- base: {
- __typename: "Base",
- id: "2",
- name: "Thessaloniki",
- },
- defaultBoxState: "InStock",
- id: "16",
- name: "Stockroom",
- },
- numberOfItems: 23,
- product: {
- __typename: "Product",
- deletedOn: null,
- category: {
- id: "1",
- name: "Bottoms",
- __typename: "ProductCategory",
- },
- gender: "Men",
- id: "267",
- name: "Sweatpants",
- },
- shipmentDetail: null,
- size: {
- __typename: "Size",
- id: "52",
- label: "Mixed",
- },
- state: "InStock",
- tags: [
- {
- __typename: "Tag",
- color: "#d89016",
- description: "",
- id: "11",
- name: "new",
- type: "All",
- },
- ],
- createdOn: "2021-10-29T15:02:40+00:00",
- createdBy: {
- __typename: "User",
- id: "123",
- name: "Some User",
- },
- lastModifiedBy: {
- __typename: "User",
- id: "1234",
- name: "Another User",
- },
- lastModifiedOn: new Date().toISOString(),
- deletedOn: null,
- },
- {
- __typename: "Box",
- comment: null,
- history: [
- {
- __typename: "HistoryEntry",
- changeDate: "2023-10-29T15:02:58+00:00",
- changes: "changed box state from Scrap to InStock",
- id: "30946",
- user: {
- __typename: "User",
- id: "17",
- name: "Dev Coordinator",
- },
- },
- {
- __typename: "HistoryEntry",
- changeDate: "2023-10-29T15:02:51+00:00",
- changes: "changed box state from InStock to Scrap",
- id: "30945",
- user: {
- __typename: "User",
- id: "17",
- name: "Dev Coordinator",
- },
- },
- {
- __typename: "HistoryEntry",
- changeDate: "2023-10-29T15:02:40+00:00",
- changes: "changed box state from Scrap to InStock",
- id: "30944",
- user: {
- __typename: "User",
- id: "17",
- name: "Dev Coordinator",
- },
- },
- {
- __typename: "HistoryEntry",
- changeDate: "2023-10-29T15:02:40+00:00",
- changes: "changed box location from SCRAP to WH2",
- id: "30943",
- user: {
- __typename: "User",
- id: "17",
- name: "Dev Coordinator",
- },
- },
- ],
- labelIdentifier: "8650860",
- location: {
- __typename: "ClassicLocation",
- base: {
- __typename: "Base",
- id: "2",
- name: "Thessaloniki",
- },
- defaultBoxState: "InStock",
- id: "18",
- name: "WH1",
- },
- numberOfItems: 33,
- product: {
- __typename: "Product",
- deletedOn: null,
- category: {
- id: "1",
- name: "Bottoms",
- __typename: "ProductCategory",
- },
- gender: "UnisexKid",
- id: "350",
- name: "Robes",
- },
- shipmentDetail: null,
- size: {
- __typename: "Size",
- id: "52",
- label: "Mixed",
- },
- state: "InStock",
- tags: [
- {
- __typename: "Tag",
- color: "#f37167",
- description: "Donation from company x",
- id: "10",
- name: "company X",
- type: "Box",
- },
- {
- __typename: "Tag",
- color: "#d89016",
- description: "",
- id: "11",
- name: "new",
- type: "All",
- },
- {
- __typename: "Tag",
- color: "#0097ff",
- description: "Hold back for emergencies",
- id: "12",
- name: "emergency",
- type: "Box",
- },
- ],
- createdOn: "2021-10-29T15:02:40+00:00",
- createdBy: {
- __typename: "User",
- id: "123",
- name: "Some User",
- },
- lastModifiedBy: {
- __typename: "User",
- id: "1234",
- name: "Another User",
- },
- lastModifiedOn: new Date().toISOString(),
- deletedOn: null,
- },
- ],
- pageInfo: {
- __typename: "PageInfo",
- hasNextPage: false,
- },
- totalCount: 268,
- },
- },
- },
-};
-
-const actionsQuery = {
- request: {
- query: ACTION_OPTIONS_FOR_BOXESVIEW_QUERY,
- variables: {
- baseId: "2",
- },
- },
- result: {
- data: {
- base: {
- __typename: "Base",
- id: "2",
- locations: [
- {
- __typename: "ClassicLocation",
- defaultBoxState: "Lost",
- id: "14",
- name: "LOST",
- seq: 14,
- },
- {
- __typename: "ClassicLocation",
- defaultBoxState: "Scrap",
- id: "15",
- name: "SCRAP",
- seq: 15,
- },
- {
- __typename: "ClassicLocation",
- defaultBoxState: "InStock",
- id: "16",
- name: "Stockroom",
- seq: 16,
- },
- {
- __typename: "ClassicLocation",
- defaultBoxState: "InStock",
- id: "17",
- name: "WH1",
- seq: 17,
- },
- {
- __typename: "ClassicLocation",
- defaultBoxState: "InStock",
- id: "18",
- name: "WH2",
- seq: 18,
- },
- ],
- tags: [
- {
- __typename: "Tag",
- color: "#f37167",
- description: "Donation from company x",
- id: "10",
- name: "company X",
- type: "Box",
- },
- {
- __typename: "Tag",
- color: "#d89016",
- description: "",
- id: "11",
- name: "new",
- type: "All",
- },
- {
- __typename: "Tag",
- color: "#0097ff",
- description: "Hold back for emergencies",
- id: "12",
- name: "emergency",
- type: "Box",
- },
- ],
- },
- shipments: [
- {
- __typename: "Shipment",
- labelIdentifier: "S001-231111-LExTH",
- id: "1",
- sourceBase: {
- __typename: "Base",
- id: "1",
- name: "Lesvos",
- organisation: {
- __typename: "Organisation",
- id: "1",
- name: "BoxAid",
- },
- },
- state: "Preparing",
- targetBase: {
- __typename: "Base",
- id: "2",
- name: "Thessaloniki",
- organisation: {
- __typename: "Organisation",
- id: "2",
- name: "BoxCare",
- },
- },
- },
- {
- __typename: "Shipment",
- labelIdentifier: "S002-231111-LExTH",
- id: "2",
- sourceBase: {
- __typename: "Base",
- id: "1",
- name: "Lesvos",
- organisation: {
- __typename: "Organisation",
- id: "1",
- name: "BoxAid",
- },
- },
- state: "Canceled",
- targetBase: {
- __typename: "Base",
- id: "3",
- name: "Samos",
- organisation: {
- __typename: "Organisation",
- id: "2",
- name: "BoxCare",
- },
- },
- },
- ],
- },
- },
-};
-
-const gqlRequestPrep = generateMoveBoxRequest(["8650860", "1481666"], 17);
-
-const moveBoxesMutation = {
- request: {
- query: gqlRequestPrep.gqlRequest,
- variables: gqlRequestPrep.variables,
- },
- result: {
- data: {
- // TODO: the data should be placed in the mocks
- moveBox8650860: {
- __typename: "Box",
- labelIdentifier: "8650860",
- location: {
- __typename: "ClassicLocation",
- id: "17",
- },
- state: "InStock",
- lastModifiedOn: new Date().toISOString(),
- },
- moveBox1481666: {
- __typename: "Box",
- labelIdentifier: "1481666",
- location: {
- __typename: "ClassicLocation",
- id: "17",
- },
- state: "InStock",
- lastModifiedOn: new Date().toISOString(),
- },
- },
- },
-};
-
-const initialQueryNetworkError = {
- request: {
- query: BOXES_FOR_BOXESVIEW_QUERY,
- variables: {
- baseId: "2",
- filterInput: {
- states: ["InStock"],
- },
- },
- },
-
- error: new FakeGraphQLNetworkError(),
-};
-
-const initialQueryGraphQLError = {
- request: {
- query: BOXES_FOR_BOXESVIEW_QUERY,
- variables: {
- baseId: "2",
- filterInput: {
- states: ["InStock"],
- },
- },
- },
- result: {
- data: {
- boxes: null,
- },
- errors: [new FakeGraphQLError()],
- },
-};
-
-describe("4.8.1 - Initial load of Page", () => {
- it("4.8.1.1 - Is the Loading State Shown First?", async () => {
- render(
-
- }
- >
- }>
-
-
- ,
- {
- routePath: "/bases/:baseId/boxes",
- initialUrl: "/bases/2/boxes",
- mocks: [boxesQuery, actionsQuery],
- cache,
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation2.id, name: organisation2.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base2.id, name: base2.name },
- },
- },
- },
- );
- // Test case 4.8.1.1
- expect(screen.getByTestId("TableSkeleton")).toBeInTheDocument();
- });
-
- it("4.8.1.2 - Failed to Fetch Initial Data (GraphQL Error)", async () => {
- render(
-
- }
- >
- }>
-
-
- ,
- {
- routePath: "/bases/:baseId/boxes",
- initialUrl: "/bases/2/boxes",
- mocks: [initialQueryGraphQLError, actionsQuery],
- cache,
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation2.id, name: organisation2.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base2.id, name: base2.name },
- },
- },
- },
- );
-
- expect(
- await screen.findByText(
- /could not fetch boxes data! Please try reloading the page./i,
- {},
- { timeout: 5000 },
- ),
- ).toBeInTheDocument();
- });
-
- it("4.8.1.2 - Failed to Fetch Initial Data (Network Error)", async () => {
- render(
-
- }
- >
- }>
-
-
- ,
- {
- routePath: "/bases/:baseId/boxes",
- initialUrl: "/bases/2/boxes",
- mocks: [initialQueryNetworkError, actionsQuery],
- cache,
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation2.id, name: organisation2.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base2.id, name: base2.name },
- },
- },
- },
- );
-
- expect(
- await screen.findByText(
- /could not fetch boxes data! Please try reloading the page./i,
- {},
- { timeout: 5000 },
- ),
- ).toBeInTheDocument();
- });
-
- it("4.8.1.3 - The Boxes Table is shown", async () => {
- render(
-
- }
- >
- }>
-
-
- ,
- {
- routePath: "/bases/:baseId/boxes",
- initialUrl: "/bases/2/boxes",
- mocks: [boxesQuery, actionsQuery],
- cache,
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation2.id, name: organisation2.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base2.id, name: base2.name },
- },
- },
- },
- );
-
- // Test case 4.8.1.3
- expect(await screen.findByText(/8650860/i, {}, { timeout: 5000 })).toBeInTheDocument();
- });
-});
-
-describe("4.8.2 - Selecting rows and performing bulk actions", () => {
- it("4.8.2.1 - Select two checkboxes and perform bulk moves", async () => {
- const user = userEvent.setup();
- render(
-
- }
- >
- }>
-
-
- ,
- {
- routePath: "/bases/:baseId/boxes",
- initialUrl: "/bases/2/boxes",
- mocks: [boxesQuery, actionsQuery, moveBoxesMutation],
- cache,
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation2.id, name: organisation2.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base2.id, name: base2.name },
- },
- },
- },
- );
-
- // Test case 4.8.2.1 - Select two checkboxes and perform bulk moves
- const row1 = await screen.findByRole("row", { name: /8650860/i }, { timeout: 5000 });
- const checkbox1 = within(row1).getByRole("checkbox", {
- name: /toggle row selected/i,
- });
-
- const row2 = await screen.findByRole("row", { name: /1481666/i });
- const checkbox2 = within(row2).getByRole("checkbox", {
- name: /toggle row selected/i,
- });
-
- if (checkbox1 && checkbox2) {
- expect(checkbox1).not.toBeChecked();
- await user.click(checkbox1);
- await waitFor(() => expect(checkbox1).toBeChecked());
-
- expect(checkbox2).not.toBeChecked();
- await user.click(checkbox2);
- await waitFor(() => expect(checkbox2).toBeChecked());
-
- const moveBoxesButton = await screen.findByRole("button", {
- name: /move to/i,
- });
-
- await user.click(moveBoxesButton);
-
- expect(
- await screen.findByRole("menuitem", {
- name: /wh1/i,
- }),
- ).toBeInTheDocument();
-
- await user.click(
- screen.getByRole("menuitem", {
- name: /wh1/i,
- }),
- );
-
- expect(await within(row1).findByText(/8650860/i)).toBeInTheDocument();
- expect(await within(row2).findByText(/1481666/i)).toBeInTheDocument();
- }
- }, 15000);
-});
diff --git a/front/src/views/Boxes/BoxesViewActions.test.tsx b/front/src/views/Boxes/BoxesViewActions.test.tsx
deleted file mode 100644
index 10068bddc..000000000
--- a/front/src/views/Boxes/BoxesViewActions.test.tsx
+++ /dev/null
@@ -1,544 +0,0 @@
-import { vi, beforeEach, it, expect } from "vitest";
-import { basicShipment, generateMockShipment } from "mocks/shipments";
-import { location1 } from "mocks/locations";
-import { generateMockBox } from "mocks/boxes";
-import { shipmentDetail1 } from "mocks/shipmentDetail";
-import { useAuth0 } from "@auth0/auth0-react";
-import { mockAuthenticatedUser } from "mocks/hooks";
-import { cache, tableConfigsVar } from "queries/cache";
-import { render, screen, waitFor } from "tests/test-utils";
-import { userEvent } from "@testing-library/user-event";
-import { ASSIGN_BOXES_TO_SHIPMENT } from "hooks/useAssignBoxesToShipment";
-import { graphql } from "../../../../graphql/graphql";
-import { AlertWithoutAction } from "components/Alerts";
-import { TableSkeleton } from "components/Skeletons";
-import { Suspense } from "react";
-import { ErrorBoundary } from "@sentry/react";
-import { mockedCreateToast, mockedTriggerError } from "tests/setupTests";
-import Boxes, { ACTION_OPTIONS_FOR_BOXESVIEW_QUERY, BOXES_FOR_BOXESVIEW_QUERY } from "./BoxesView";
-import { FakeGraphQLError, FakeGraphQLNetworkError } from "mocks/functions";
-import { DELETE_BOXES } from "hooks/useDeleteBoxes";
-import { TadaDocumentNode } from "gql.tada";
-
-const boxesQuery = ({
- state = "InStock",
- stateFilter = ["InStock"],
- shipmentDetail = null as any,
- labelIdentifier = "123",
-}) => ({
- request: {
- query: BOXES_FOR_BOXESVIEW_QUERY,
- variables: {
- baseId: "1",
- filterInput: stateFilter.length
- ? {
- states: stateFilter,
- }
- : {},
- },
- },
- result: {
- data: {
- boxes: {
- __typename: "BoxPage",
- elements: [
- generateMockBox({
- labelIdentifier,
- state,
- shipmentDetail,
- }),
- ],
- pageInfo: {
- __typename: "PageInfo",
- hasNextPage: false,
- },
- totalCount: 1,
- },
- },
- },
-});
-
-const actionsQuery = () => ({
- request: {
- query: ACTION_OPTIONS_FOR_BOXESVIEW_QUERY,
- variables: {
- baseId: "1",
- },
- },
- result: {
- data: {
- base: {
- __typename: "Base",
- id: "1",
- locations: [location1],
- tags: [],
- },
- shipments: [generateMockShipment({ hasBoxes: false })],
- },
- },
-});
-
-const mutation = ({
- gQLRequest = ASSIGN_BOXES_TO_SHIPMENT as TadaDocumentNode,
- variables = { id: "1", labelIdentifiers: ["123"] } as any,
- resultData = {
- updateShipmentWhenPreparing: { ...basicShipment, details: [shipmentDetail1()] },
- } as any,
- networkError = false,
- graphQlError = false,
-}) => ({
- request: {
- query: gQLRequest,
- variables,
- },
- result: networkError
- ? undefined
- : {
- data: graphQlError ? null : resultData,
- errors: graphQlError ? [new FakeGraphQLError()] : undefined,
- },
- error: networkError ? new FakeGraphQLNetworkError() : undefined,
-});
-
-vi.mock("@auth0/auth0-react");
-const mockedUseAuth0 = vi.mocked(useAuth0);
-
-beforeEach(() => {
- mockAuthenticatedUser(mockedUseAuth0, "dev_volunteer@boxaid.org");
- tableConfigsVar(new Map());
-});
-
-const moveBoxesGQLRequest = graphql(`
- mutation MoveBoxes($newLocationId: Int!, $labelIdentifier0: String!) {
- moveBox123: updateBox(
- updateInput: { labelIdentifier: $labelIdentifier0, locationId: $newLocationId }
- ) {
- labelIdentifier
- state
- location {
- id
- }
- lastModifiedOn
- }
- }
-`);
-
-const unassignFromShipmentGQLRequest = graphql(`
- mutation UnassignBoxesFromShipments($shipment0: ID!, $labelIdentifiers0: [String!]!) {
- unassignBoxesFromShipment1: updateShipmentWhenPreparing(
- updateInput: {
- id: $shipment0
- preparedBoxLabelIdentifiers: []
- removedBoxLabelIdentifiers: $labelIdentifiers0
- }
- ) {
- id
- details {
- id
- removedOn
- removedBy {
- id
- __typename
- }
- box {
- labelIdentifier
- state
- shipmentDetail {
- id
- __typename
- }
- lastModifiedOn
- __typename
- }
- __typename
- }
- __typename
- }
- }
-`);
-
-const deleteBoxesMutation = ({
- labelIdentifiers = ["123"],
- invalidBoxLabelIdentifiers = [] as string[],
- networkError = false,
- graphQlError = false,
- insufficientPermissionError = false,
-}) => ({
- request: {
- query: DELETE_BOXES,
- variables: { labelIdentifiers },
- },
- result: networkError
- ? undefined
- : {
- data: insufficientPermissionError
- ? {
- deleteBoxes: {
- __typename: "InsufficientPermissionError",
- name: "InsufficientPermissionError",
- },
- }
- : graphQlError
- ? null
- : {
- deleteBoxes: {
- __typename: "BoxesResult",
- updatedBoxes: labelIdentifiers.map((id) => ({
- labelIdentifier: id,
- deletedOn: new Date().toISOString(),
- })),
- invalidBoxLabelIdentifiers: invalidBoxLabelIdentifiers,
- },
- },
- errors: graphQlError ? [new FakeGraphQLError()] : undefined,
- },
- error: networkError ? new FakeGraphQLNetworkError() : undefined,
-});
-
-const boxesViewActionsTests = [
- {
- name: "4.8.5.2 - MoveBoxes Action is successful",
- mocks: [
- boxesQuery({}),
- actionsQuery(),
- mutation({
- gQLRequest: moveBoxesGQLRequest,
- variables: { newLocationId: 1, labelIdentifier0: "123" },
- resultData: {
- moveBox123: {
- labelIdentifier: "123",
- state: "InStock",
- location: {
- id: "1",
- },
- createdBy: {
- __typename: "User",
- id: "123",
- name: "Some User",
- },
- lastModifiedOn: new Date().toISOString(),
- lastModifiedBy: {
- __typename: "User",
- id: "1234",
- name: "Another User",
- },
- },
- },
- }),
- ],
- clicks: [/move to/i, /warehouse/i],
- toast: /A Box was successfully moved/i,
- },
- {
- name: "4.8.5.3 - MoveBoxes Action is failing due to GraphQL error",
- mocks: [
- boxesQuery({}),
- actionsQuery(),
- mutation({
- gQLRequest: moveBoxesGQLRequest,
- variables: { newLocationId: 1, labelIdentifier0: "123" },
- graphQlError: true,
- }),
- ],
- clicks: [/move to/i, /warehouse/i],
- toast: /Could not move a box/i,
- },
- {
- name: "4.8.5.4 - MoveBoxes Action is failing due to Network error",
- mocks: [
- boxesQuery({}),
- actionsQuery(),
- mutation({
- gQLRequest: moveBoxesGQLRequest,
- variables: { newLocationId: 1, labelIdentifier0: "123" },
- networkError: true,
- }),
- ],
- clicks: [/move to/i, /warehouse/i],
- toast: /Could not move a box/i,
- },
- {
- name: "4.8.5.5 - MoveBoxes Action is not executing since box is in wrong state",
- mocks: [boxesQuery({ state: "MarkedForShipment", stateFilter: [] }), actionsQuery()],
- clicks: [/move to/i, /warehouse/i],
- toast: /Cannot move a box in shipment states./i,
- searchParams: "?columnFilters=%5B%5D",
- },
- {
- name: "4.8.3.2 - Assign To Shipment Action is successful",
- mocks: [
- boxesQuery({}),
- actionsQuery(),
- mutation({
- gQLRequest: ASSIGN_BOXES_TO_SHIPMENT,
- variables: { id: "1", labelIdentifiers: ["123"] },
- resultData: {
- updateShipmentWhenPreparing: generateMockShipment({}),
- },
- }),
- boxesQuery({}),
- ],
- clicks: [/assign to shipment/i, /thessaloniki/i],
- toast: /A Box was successfully assigned/i,
- },
- {
- name: "4.8.3.3 - Assign To Shipment Action is failing due to GraphQL error",
- mocks: [
- boxesQuery({}),
- actionsQuery(),
- mutation({
- gQLRequest: ASSIGN_BOXES_TO_SHIPMENT,
- variables: { id: "1", labelIdentifiers: ["123"] },
- graphQlError: true,
- }),
- ],
- clicks: [/assign to shipment/i, /thessaloniki/i],
- toast: /Could not assign a box/i,
- },
- {
- name: "4.8.3.4 - Assign To Shipment Action is failing due to Network error",
- mocks: [
- boxesQuery({}),
- actionsQuery(),
- mutation({
- gQLRequest: ASSIGN_BOXES_TO_SHIPMENT,
- variables: { id: "1", labelIdentifiers: ["123"] },
- networkError: true,
- }),
- ],
- clicks: [/assign to shipment/i, /thessaloniki/i],
- toast: /Could not assign a box/i,
- },
- {
- name: "4.8.3.5 - Assign To Shipment Action is not executing since box is in wrong state",
- mocks: [boxesQuery({ state: "Donated", stateFilter: [] }), actionsQuery()],
- clicks: [/assign to shipment/i, /thessaloniki/i],
- toast: /Cannot assign a box/i,
- searchParams: "?columnFilters=%5B%5D",
- },
- {
- name: "4.8.4.2 - Unassign From Shipment Action is successful",
- mocks: [
- boxesQuery({
- state: "MarkedForShipment",
- shipmentDetail: shipmentDetail1(),
- stateFilter: [],
- }),
- actionsQuery(),
- mutation({
- gQLRequest: unassignFromShipmentGQLRequest,
- variables: { shipment0: "1", labelIdentifiers0: ["123"] },
- resultData: {
- unassignBoxesFromShipment1: generateMockShipment({ hasBoxes: false }),
- },
- }),
- ],
- clicks: [/remove from shipment/i],
- toast: /A Box was successfully unassigned/i,
- searchParams: "?columnFilters=%5B%5D",
- },
- {
- name: "4.8.4.3 - Unassign From Shipment Action is failing due to GraphQL error",
- mocks: [
- boxesQuery({
- state: "MarkedForShipment",
- shipmentDetail: shipmentDetail1(),
- stateFilter: [],
- }),
- actionsQuery(),
- mutation({
- gQLRequest: unassignFromShipmentGQLRequest,
- variables: { shipment0: "1", labelIdentifiers0: ["123"] },
- graphQlError: true,
- }),
- ],
- clicks: [/remove from shipment/i],
- toast: /Could not remove a box/i,
- searchParams: "?columnFilters=%5B%5D",
- },
- {
- name: "4.8.4.4 - Unassign From Shipment Action is failing due to Network error",
- mocks: [
- boxesQuery({
- state: "MarkedForShipment",
- shipmentDetail: shipmentDetail1(),
- stateFilter: [],
- }),
- actionsQuery(),
- mutation({
- gQLRequest: unassignFromShipmentGQLRequest,
- variables: { shipment0: "1", labelIdentifiers0: ["123"] },
- networkError: true,
- }),
- ],
- clicks: [/remove from shipment/i],
- toast: /Could not remove a box/i,
- searchParams: "?columnFilters=%5B%5D",
- },
- // 4.8.6 - DeleteBoxes Action
- {
- name: "4.8.6.1 - DeleteBoxes Action is loading and shows Table skeleton",
- mocks: [boxesQuery({}), actionsQuery()],
- clicks: [], // No action clicks since we're just testing the initial load
- toast: null, // No toast message expected
- },
- {
- name: "4.8.6.2 - DeleteBoxes Action is successful",
- mocks: [
- boxesQuery({}),
- actionsQuery(),
- deleteBoxesMutation({
- labelIdentifiers: ["123"],
- }),
- ],
- clicks: [/delete box/i],
- toast: /A box was successfully deleted|Boxes successfully deleted/i,
- },
- {
- name: "4.8.6.3 - DeleteBoxes Action is failing due to GraphQL error",
- mocks: [
- boxesQuery({}),
- actionsQuery(),
- deleteBoxesMutation({
- labelIdentifiers: ["123"],
- graphQlError: true,
- }),
- ],
- clicks: [/delete box/i],
- triggerError: /Could not delete boxes./i,
- },
- {
- name: "4.8.6.4 - DeleteBoxes Action is failing due to Network error",
- mocks: [
- boxesQuery({}),
- actionsQuery(),
- deleteBoxesMutation({
- labelIdentifiers: ["123"],
- networkError: true,
- }),
- ],
- clicks: [/delete box/i],
- triggerError: /Could not delete boxes./i,
- },
- {
- name: "4.8.6.5 - DeleteBoxes Action fails due to invalid box identifier",
- mocks: [
- boxesQuery({
- labelIdentifier: "456",
- }),
- actionsQuery(),
- deleteBoxesMutation({
- labelIdentifiers: ["456"],
- invalidBoxLabelIdentifiers: ["456"],
- }),
- ],
- clicks: [/delete box/i],
- triggerError: /The deletion failed for: 456/i,
- },
- {
- name: "4.8.6.6 - DeleteBoxes Action fails due to insufficient permissions",
- mocks: [
- boxesQuery({}),
- actionsQuery(),
- deleteBoxesMutation({
- labelIdentifiers: ["123"],
- insufficientPermissionError: true,
- }),
- ],
- clicks: [/delete box/i],
- triggerError: /You don't have the permissions to delete these boxes/i,
- },
-];
-
-boxesViewActionsTests.forEach(({ name, mocks, clicks, toast, searchParams, triggerError }) => {
- it(
- name,
- async () => {
- const user = userEvent.setup();
- render(
-
- }
- >
- }>
-
-
- ,
- {
- routePath: "/bases/:baseId/boxes",
- initialUrl: `/bases/1/boxes${searchParams || ""}`,
- mocks,
- cache,
- },
- );
-
- // Check loading state
- expect(await screen.findByTestId("TableSkeleton")).toBeInTheDocument();
-
- if (clicks.length > 0) {
- // Select the first box
- const checkboxes = await screen.findAllByRole(
- "checkbox",
- { name: /toggle row selected/i },
- { timeout: 5000 },
- );
- expect(checkboxes.length).toBe(1);
- await user.click(checkboxes[0]);
- await waitFor(() => expect(checkboxes[0]).toBeChecked());
-
- // Conditional check for delete action confirmation
- if (name.toLowerCase().includes("delete")) {
- // Check for "Remove Box" button visibility
- const deleteBoxButton = await screen.findByTestId("delete-boxes-button");
- expect(deleteBoxButton).toBeInTheDocument();
- await user.click(deleteBoxButton);
- const confirmDialogButton = await screen.findByRole("button", { name: /delete/i });
- expect(confirmDialogButton).toBeInTheDocument();
- await user.click(confirmDialogButton);
- } else {
- // Perform action based on the `clicks` parameter
- const actionButton = await screen.findByRole("button", { name: clicks[0] });
- expect(actionButton).toBeInTheDocument();
- await user.click(actionButton);
- }
-
- if (clicks[1]) {
- // For other actions, click the sub-action button if specified
- const subButton = await screen.findByText(clicks[1]);
- expect(subButton).toBeInTheDocument();
- await user.click(subButton);
- }
-
- // Only confirm deletion if the action is a delete operation
- if (name.toLowerCase().includes("delete")) {
- const confirmButton = await screen.findByRole("button", { name: /delete/i });
- await user.click(confirmButton);
- }
- }
-
- if (triggerError) {
- // error message appears
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(triggerError),
- }),
- ),
- );
- }
-
- // Check for the expected toast message
- if (toast) {
- await waitFor(() =>
- expect(mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(toast),
- }),
- ),
- );
- }
- },
- 20000,
- );
-});
diff --git a/front/src/views/Boxes/components/transformers.ts b/front/src/views/Boxes/components/transformers.ts
index 54b071e98..e0c6555e3 100644
--- a/front/src/views/Boxes/components/transformers.ts
+++ b/front/src/views/Boxes/components/transformers.ts
@@ -11,13 +11,13 @@ export const boxesRawDataToTableDataTransformer = (boxesQueryResult: BoxesForBox
({
id: element.id,
labelIdentifier: element.labelIdentifier,
- product: element.product!.name,
- productCategory: element.product!.category.name,
- gender: element.product!.gender,
+ product: element.product?.name,
+ productCategory: element.product?.category?.name,
+ gender: element.product?.gender,
numberOfItems: element.numberOfItems,
size: element.size?.label,
state: element.state,
- location: element.location!.name,
+ location: element.location?.name,
tags: element.tags,
shipment: element.shipmentDetail?.shipment,
comment: element.comment,
diff --git a/front/src/views/Distributions/CreateDistributionEventView/components/CreateDistributionEvent.stories.tsx b/front/src/views/Distributions/CreateDistributionEventView/components/CreateDistributionEvent.stories.tsx
deleted file mode 100644
index 6debca585..000000000
--- a/front/src/views/Distributions/CreateDistributionEventView/components/CreateDistributionEvent.stories.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import { action } from "@storybook/addon-actions";
-import { StoryFn, Meta } from "@storybook/react";
-import CreateDistroEvent from "./CreateDistributionEvent";
-
-const mockedDistroSpot = {
- name: "Horgosz River",
-};
-
-export default {
- title: "Mobile Distro Events/Distro Events/Create Distro Event Date/Component",
- component: CreateDistroEvent,
- parameters: {},
-} as Meta;
-
-const Template: StoryFn = (args) => ;
-
-export const Default = Template.bind({});
-Default.args = {
- distroSpot: mockedDistroSpot,
- onSubmitNewDistroEvent: action("onSubmitNewDistroEvent"),
-};
diff --git a/front/src/views/Distributions/CreateDistributionSpotView/components/CreateDistributionSpot.stories.tsx b/front/src/views/Distributions/CreateDistributionSpotView/components/CreateDistributionSpot.stories.tsx
deleted file mode 100644
index f541fe7bc..000000000
--- a/front/src/views/Distributions/CreateDistributionSpotView/components/CreateDistributionSpot.stories.tsx
+++ /dev/null
@@ -1,14 +0,0 @@
-import { StoryFn, Meta } from "@storybook/react";
-import CreateDistributionSpot from "./CreateDistributionSpot";
-
-export default {
- title: "Mobile Distro Events/Distro Spots/Create Distro Spot",
- component: CreateDistributionSpot,
- parameters: {},
-} as Meta;
-
-const Template: StoryFn = (args) => (
-
-);
-
-export const Default = Template.bind({});
diff --git a/front/src/views/Distributions/DistroEventView/components/State1Planning/DistroEventDetailsForPlanningState.stories.tsx b/front/src/views/Distributions/DistroEventView/components/State1Planning/DistroEventDetailsForPlanningState.stories.tsx
deleted file mode 100644
index f067d19ef..000000000
--- a/front/src/views/Distributions/DistroEventView/components/State1Planning/DistroEventDetailsForPlanningState.stories.tsx
+++ /dev/null
@@ -1,52 +0,0 @@
-import { action } from "@storybook/addon-actions";
-import { Meta, StoryFn } from "@storybook/react";
-import { IPackingListEntry } from "views/Distributions/types";
-import DistroEventDetailsForPlanningState from "./DistroEventDetailsForPlanningState";
-
-const mockedDistroEventPackingList: IPackingListEntry[] = [
- {
- id: "3",
- numberOfItems: 32,
- size: {
- id: "123",
- label: "M",
- },
- product: {
- id: "1",
- name: "T-shirt",
- gender: "Men",
- },
- },
- {
- id: "4",
- numberOfItems: 10,
- size: {
- id: "234",
- label: "S",
- },
- product: {
- id: "2",
- name: "T-shirt",
- gender: "Women",
- },
- },
-];
-
-export default {
- title: "Mobile Distro Events/Distro Events/Detail View/State: 1 - Planning/Component",
- component: DistroEventDetailsForPlanningState,
- parameters: {},
-} as Meta;
-
-const Template: StoryFn = (args) => (
-
-);
-
-export const Default = Template.bind({});
-Default.args = {
- packingListEntries: mockedDistroEventPackingList,
- onAddItemsClick: action("onAddItemsClick"),
- onCopyPackingListFromPreviousEventsClick: action("onCopyPackingListFromPreviousEventsClick"),
- onUpdatePackingListEntry: action("onEditItemOnPackingListClick"),
- onRemoveItemFromPackingListClick: action("onRemoveItemFromPackingListClick"),
-};
diff --git a/front/src/views/Distributions/DistroEventView/components/State2Packing/DistroEventDetailsForPackingState.stories.tsx b/front/src/views/Distributions/DistroEventView/components/State2Packing/DistroEventDetailsForPackingState.stories.tsx
deleted file mode 100644
index d61602d32..000000000
--- a/front/src/views/Distributions/DistroEventView/components/State2Packing/DistroEventDetailsForPackingState.stories.tsx
+++ /dev/null
@@ -1,85 +0,0 @@
-import { StoryFn, Meta } from "@storybook/react";
-import DistroEventDetailsForPackingState from "./DistroEventDetailsForPackingState";
-// import { DistroEvent } from "../State1Planning/DistroEventPlanning";
-import { BoxData, IPackingListEntryForPackingState } from "views/Distributions/types";
-
-const mockedBoxesData: BoxData[] = [
- {
- __typename: "Box",
- labelIdentifier: "23982",
- product: {
- id: "3",
- name: "Jacket Woman",
- },
- size: {
- id: "1",
- label: "M",
- },
- numberOfItems: 42,
- },
- {
- __typename: "Box",
- labelIdentifier: "23942",
- product: {
- id: "2",
- name: "Jacket Male",
- },
- size: {
- id: "2",
- label: "S",
- },
- numberOfItems: 23,
- },
-];
-
-const mockedDistroEventPackingList: IPackingListEntryForPackingState[] = [
- {
- id: "3",
- numberOfItems: 32,
- size: {
- id: "123",
- label: "M",
- },
- product: {
- id: "1",
- name: "T-shirt",
- gender: "Men",
- },
- matchingPackedItemsCollections: mockedBoxesData,
- },
- {
- id: "4",
- numberOfItems: 10,
- size: {
- id: "234",
- label: "S",
- },
- product: {
- id: "2",
- name: "T-shirt",
- gender: "Women",
- },
- matchingPackedItemsCollections: [],
- },
-];
-
-export default {
- title: "Mobile Distro Events/Distro Events/Detail View/State: 4 - Packing/Component",
- component: DistroEventDetailsForPackingState,
- parameters: {},
-} as Meta;
-
-const Template: StoryFn = (args) => (
-
-);
-
-export const Default = Template.bind({});
-Default.args = {
- packingListEntries: mockedDistroEventPackingList,
- // boxData: mockedBoxData,
- // boxesData: mockedBoxesData,
- // onShowListClick: action('onShowListClick'),
- // packingActionProps: mockedPackingActionProps,
- // packingActionListProps: mockedPackingActionListProps,
- // onCheckboxClick: action('onCheckboxClick'),
-};
diff --git a/front/src/views/Distributions/DistroEventView/components/State5Completed/DistroEventCompleted.stories.tsx b/front/src/views/Distributions/DistroEventView/components/State5Completed/DistroEventCompleted.stories.tsx
deleted file mode 100644
index cec3cbda2..000000000
--- a/front/src/views/Distributions/DistroEventView/components/State5Completed/DistroEventCompleted.stories.tsx
+++ /dev/null
@@ -1,57 +0,0 @@
-import { StoryFn, Meta } from "@storybook/react";
-import DistroEventCompleted, { DistroEventData } from "./DistroEventCompleted";
-
-const mockedDistroEvent: DistroEventData = {
- eventDate: new Date("2022/08/22"),
- status: "Completed",
- id: "2",
- outflows: [
- {
- id: "3",
- labelIdentifier: "348293",
- numberOfItems: 32,
- size: "M",
- name: "T-shirt",
- gender: "Men",
- },
- {
- id: "4",
- labelIdentifier: "348323",
- numberOfItems: 10,
- size: "S",
- name: "T-shirt",
- gender: "Men",
- },
- ],
- returns: [
- {
- id: "3",
- labelIdentifier: "348293",
- numberOfItems: 32,
- size: "M",
- name: "T-shirt",
- gender: "Men",
- },
- {
- id: "4",
- labelIdentifier: "348323",
- numberOfItems: 10,
- size: "S",
- name: "T-shirt",
- gender: "Men",
- },
- ],
-};
-
-export default {
- title: "Mobile Distro Events/Distro Events/Detail View/State: 8 - Completed/Component",
- component: DistroEventCompleted,
- parameters: {},
-} as Meta;
-
-const Template: StoryFn = (args) => ;
-
-export const Default = Template.bind({});
-Default.args = {
- distroEventData: mockedDistroEvent,
-};
diff --git a/front/src/views/Distributions/DistroSpotsView/components/DistroSpots.stories.tsx b/front/src/views/Distributions/DistroSpotsView/components/DistroSpots.stories.tsx
deleted file mode 100644
index 5f71338c7..000000000
--- a/front/src/views/Distributions/DistroSpotsView/components/DistroSpots.stories.tsx
+++ /dev/null
@@ -1,66 +0,0 @@
-import { StoryFn, Meta } from "@storybook/react";
-import DistroSpots from "./DistroSpots";
-import { DistributionSpotEnrichedData } from "views/Distributions/types";
-
-const mockedDistroSpots: DistributionSpotEnrichedData[] = [
- {
- id: "1",
- baseId: "10",
- name: "Horgosz",
- distroEvents: [],
- },
- {
- id: "2",
- baseId: "10",
- name: "Subotica",
- nextDistroEventDate: new Date("2022/08/22"),
- distroEvents: [
- {
- plannedStartDateTime: new Date("2022/08/22"),
- plannedEndDateTime: new Date("2022/08/22"),
- state: "Packing",
- id: "1",
- },
- {
- plannedStartDateTime: new Date("2022/02/13"),
- plannedEndDateTime: new Date("2022/08/22"),
- state: "Completed",
- id: "2",
- },
- ],
- },
- {
- id: "3",
- baseId: "10",
- name: "Bihac",
- nextDistroEventDate: new Date("2022/09/15"),
- comment:
- "This distro spot is currently having issues regarding accessibility for our 2nd vehicle.",
- distroEvents: [
- {
- plannedStartDateTime: new Date("2022/09/15"),
- plannedEndDateTime: new Date("2022/09/22"),
- state: "Planning",
- id: "3",
- },
- ],
- },
-];
-
-export default {
- title: "Mobile Distro Events/Distro Spots/List View/Component",
- component: DistroSpots,
- parameters: {},
-} as Meta;
-
-const Template: StoryFn = (args) => ;
-
-export const Default = Template.bind({});
-Default.args = {
- distroSpots: mockedDistroSpots,
-};
-
-export const NoData = Template.bind({});
-NoData.args = {
- distroSpots: [],
-};
diff --git a/front/src/views/Distributions/DistroSpotsView/components/DistroSpotsContainer.stories.tsx b/front/src/views/Distributions/DistroSpotsView/components/DistroSpotsContainer.stories.tsx
deleted file mode 100644
index 16879d55a..000000000
--- a/front/src/views/Distributions/DistroSpotsView/components/DistroSpotsContainer.stories.tsx
+++ /dev/null
@@ -1,58 +0,0 @@
-import { StoryFn, Meta } from "@storybook/react";
-import { action } from "@storybook/addon-actions";
-import DistroSpotsContainer from "./DistroSpotsContainer";
-import { StorybookApolloProvider } from "tests/test-utils";
-
-export default {
- title: "Mobile Distro Events/Distro Spots/List View/Container",
- component: DistroSpotsContainer,
- parameters: {},
- decorators: [
- (Story) => {
- // worker.use(
- // graphql.query(
- // "DistroSpotsForBaseId",
- // (req, res, ctx) => {
- // const mockedDistroSpotsForBaseIdData = {
- // base: {
- // __typename: "Base",
- // distributionSpots: [
- // {
- // __typename: "DistributionSpot",
- // id: "1",
- // name: "Horgos (River)",
- // latitude: 132.142,
- // longitude: 132.142,
- // distributionEvents: [
- // {
- // __typename: "DistributionEvent",
- // id: "3",
- // name: "Warm Clothes and Tea",
- // // startDateTime: "2022-06-01T14:48:25+00:00",
- // plannedStartDateTime: "2022-06-01T14:48:25+00:00",
- // state: DistributionEventState.Planning,
- // },
- // ],
- // },
- // ],
- // },
- // } as DistroSpotsForBaseIdQuery;
- // return res(ctx.data(mockedDistroSpotsForBaseIdData));
- // },
- // ),
- // );
- return (
-
-
-
- );
- },
- ],
-} as Meta;
-
-const Template: StoryFn = (args) => ;
-
-export const Default = Template.bind({});
-Default.args = {
- onGoToDistroEventView: action("onGoToDistroEventView for id"),
-};
diff --git a/front/src/views/Distributions/DistrosDashboardView/components/DistroEventsCalendar/DistroEventsCalendarContainer.stories.tsx b/front/src/views/Distributions/DistrosDashboardView/components/DistroEventsCalendar/DistroEventsCalendarContainer.stories.tsx
deleted file mode 100644
index 0b8e7b37d..000000000
--- a/front/src/views/Distributions/DistrosDashboardView/components/DistroEventsCalendar/DistroEventsCalendarContainer.stories.tsx
+++ /dev/null
@@ -1,47 +0,0 @@
-import { Meta, StoryFn } from "@storybook/react";
-import { addDays, addHours } from "date-fns";
-import DistroEventsCalendarContainer from "./DistroEventsCalendarContainer";
-
-export default {
- title: "Mobile Distro Events/Distro Events/Calendar/Component",
- component: DistroEventsCalendarContainer,
- parameters: {},
- decorators: [],
-} as Meta;
-
-const Template: StoryFn = (args) => (
-
-);
-
-const todayAtTenThirty = new Date();
-todayAtTenThirty.setHours(10, 30, 0, 0);
-
-const distroEvents = [
- {
- id: "1",
- name: "Distro 1",
- plannedStartDateTime: addDays(todayAtTenThirty, 3),
- plannedEndDateTime: addHours(addDays(todayAtTenThirty, 3), 3),
- state: "Packing",
- distributionSpot: {
- id: "1",
- name: "Horgos (River)",
- },
- },
- {
- id: "2",
- name: "Distro 2",
- plannedStartDateTime: addDays(todayAtTenThirty, 11),
- plannedEndDateTime: addHours(addDays(todayAtTenThirty, 11), 5),
- state: "Completed",
- distributionSpot: {
- id: "2",
- name: "Subotica (LIDL)",
- },
- },
-];
-
-export const Default = Template.bind({});
-Default.args = {
- distributionEvents: distroEvents,
-};
diff --git a/front/src/views/Distributions/components/AddItemsToPackingList/AddItemsToPacking.stories.tsx b/front/src/views/Distributions/components/AddItemsToPackingList/AddItemsToPacking.stories.tsx
deleted file mode 100644
index d7a43ed04..000000000
--- a/front/src/views/Distributions/components/AddItemsToPackingList/AddItemsToPacking.stories.tsx
+++ /dev/null
@@ -1,54 +0,0 @@
-import { StoryFn, Meta } from "@storybook/react";
-import AddItemsToPackingList, { ProductDataForPackingList } from "./AddItemsToPackingList";
-
-const clothingCategory = {
- id: "1",
- name: "Clothing",
-};
-
-const hygenicCategory = {
- id: "2",
- name: "Hygenic",
-};
-
-const mockedProductData: ProductDataForPackingList[] = [
- {
- id: "1",
- name: "Jacket",
- category: { ...clothingCategory },
- gender: "Men",
- },
- {
- id: "2",
- name: "T-shirt",
- category: { ...clothingCategory },
- gender: "Men",
- },
- {
- id: "3",
- name: "Skirt",
- category: { ...clothingCategory },
- gender: "Women",
- },
- {
- id: "10",
- name: "Razor (50 pack)",
- category: { ...hygenicCategory },
- gender: "Men",
- },
-];
-
-export default {
- title: "Mobile Distro Events/Distro Events/Add Items to Packing List/Component",
- component: AddItemsToPackingList,
- parameters: {},
-} as Meta;
-
-const Template: StoryFn = (args) => (
-
-);
-
-export const Default = Template.bind({});
-Default.args = {
- productData: mockedProductData,
-};
diff --git a/front/src/views/QrReader/QrReaderMultiBox.test.tsx b/front/src/views/QrReader/QrReaderMultiBox.test.tsx
deleted file mode 100644
index 4f6cffba5..000000000
--- a/front/src/views/QrReader/QrReaderMultiBox.test.tsx
+++ /dev/null
@@ -1,315 +0,0 @@
-import { vi, beforeEach, it, expect } from "vitest";
-import { userEvent } from "@testing-library/user-event";
-import { screen, render, waitFor } from "tests/test-utils";
-import { useAuth0 } from "@auth0/auth0-react";
-import { QrReaderScanner } from "components/QrReader/components/QrReaderScanner";
-import { mockAuthenticatedUser } from "mocks/hooks";
-import { mockImplementationOfQrReader } from "mocks/components";
-import { generateMockBox } from "mocks/boxes";
-import {
- GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE,
- MULTI_BOX_ACTION_OPTIONS_FOR_LOCATIONS_TAGS_AND_SHIPMENTS_QUERY,
-} from "queries/queries";
-import { cache } from "queries/cache";
-import { locations } from "mocks/locations";
-import { mockedCreateToast, mockedTriggerError } from "tests/setupTests";
-import QrReaderView from "./QrReaderView";
-import { FakeGraphQLError, FakeGraphQLNetworkError } from "mocks/functions";
-
-const mockSuccessfulQrQuery = ({
- query = GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE,
- hash = "abc",
- isBoxAssociated = true,
- labelIdentifier = "123",
- state = "InStock",
-}) => ({
- request: {
- query,
- variables: { qrCode: hash },
- },
- result: {
- data: {
- qrCode: {
- __typename: "QrCode",
- code: hash,
- box: isBoxAssociated ? generateMockBox({ labelIdentifier, state }) : null,
- },
- },
- },
-});
-
-const mockEmptyLocationsTagsShipmentsQuery = {
- request: {
- query: MULTI_BOX_ACTION_OPTIONS_FOR_LOCATIONS_TAGS_AND_SHIPMENTS_QUERY,
- variables: { baseId: "1" },
- },
- result: {
- data: {
- shipments: [],
- base: { locations, tags: null },
- },
- },
-};
-
-vi.mock("@auth0/auth0-react");
-vi.mock("components/QrReader/components/QrReaderScanner");
-const mockedUseAuth0 = vi.mocked(useAuth0);
-const mockedQrReader = vi.mocked(QrReaderScanner);
-
-beforeEach(() => {
- mockAuthenticatedUser(mockedUseAuth0, "dev_volunteer@boxaid.org");
-});
-
-const qrScanningInMultiBoxTabTests = [
- {
- name: "3.4.3.2 - user scans QR code of same org with associated box",
- hash: "QrWithBoxFromSameBase",
- mocks: [
- mockSuccessfulQrQuery({ hash: "QrWithBoxFromSameBase" }),
- mockEmptyLocationsTagsShipmentsQuery,
- ],
- boxCount: 1,
- toasts: [{ message: /Box 123 was added/i, isError: false }],
- },
- {
- name: "3.4.3.3 - user scans QR code of same org with associated box twice",
- hash: "QrWithBoxFromSameBase",
- mocks: [
- mockSuccessfulQrQuery({ hash: "QrWithBoxFromSameBase" }),
- mockSuccessfulQrQuery({ hash: "QrWithBoxFromSameBase" }),
- ],
- boxCount: 1,
- toasts: [
- { message: /Box 123 was added/i, isError: false },
- { message: /Box 123 is already on the list/i, isError: false },
- ],
- },
- {
- name: "3.4.3.4 - user scans QR code of same org without previously associated box",
- hash: "QrWithoutBox",
- mocks: [mockSuccessfulQrQuery({ hash: "QrWithoutBox", isBoxAssociated: false })],
- boxCount: 0,
- toasts: [{ message: /no box associated to this Q/i, isError: true }],
- },
-];
-
-qrScanningInMultiBoxTabTests.forEach(({ name, hash, mocks, boxCount, toasts }) => {
- it(name, async () => {
- const user = userEvent.setup();
- mockImplementationOfQrReader(mockedQrReader, hash, true, true);
- render( , {
- routePath: "/bases/:baseId/qrreader",
- initialUrl: "/bases/1/qrreader",
- mocks,
- cache,
- });
-
- // go to the MultiBox Tab
- const multiBoxTab = await screen.findByRole("tab", { name: /multi box/i });
- expect(multiBoxTab).toBeInTheDocument();
- await user.click(multiBoxTab);
-
- // 3.4.3.1 - no QR-codes were successfully scanned yet.
- const boxesSelectedStatus = await screen.findByText(/boxes selected: 0/i);
- expect(boxesSelectedStatus).toBeInTheDocument();
- expect(
- screen.queryByRole("button", { name: /delete list of scanned boxes/i }),
- ).not.toBeInTheDocument();
- expect(screen.queryByRole("button", { name: /undo last scan/i })).not.toBeInTheDocument();
-
- // Click a button to trigger the event of scanning a QR-Code in mockImplementationOfQrReader
- const scanButton = await screen.findByTestId("ReturnScannedQr");
- await user.click(scanButton);
-
- // toast shown
- await waitFor(() =>
- expect(toasts[0].isError ? mockedTriggerError : mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(toasts[0].message),
- }),
- ),
- );
-
- // second scan?
- if (toasts.length === 2) {
- await user.click(scanButton);
- // toast shown
- await waitFor(() =>
- expect(toasts[1].isError ? mockedTriggerError : mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(toasts[1].message),
- }),
- ),
- );
- }
-
- // Boxes Selected After
- const boxesSelectedStatus2 = await screen.findByText(
- new RegExp(`boxes selected: ${boxCount}`, "i"),
- );
- expect(boxesSelectedStatus2).toBeInTheDocument();
- if (boxCount) {
- const deleteScannedBoxesButton = screen.getByRole("button", {
- name: /delete list of scanned boxes/i,
- });
- expect(deleteScannedBoxesButton).toBeInTheDocument();
- expect(screen.getByRole("button", { name: /undo last scan/i })).toBeInTheDocument();
- // 3.4.4.1 - Pressing the delete button
- await user.click(deleteScannedBoxesButton);
- expect(await screen.findByText(/boxes selected: 0/i)).toBeInTheDocument();
- }
- });
-});
-
-const mockFailedQrQuery = ({
- query = GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE,
- hash = "",
- graphQlError = false,
- networkError = false,
- returnedQrTypeName = "QrCode",
- returnedBoxTypeName = "Box",
-}) => ({
- request: {
- query,
- variables: { qrCode: hash },
- },
- result: networkError
- ? undefined
- : graphQlError
- ? { errors: graphQlError ? undefined : [new FakeGraphQLError("Error")] }
- : {
- data:
- returnedQrTypeName === "InsufficientPermissionError"
- ? {
- qrCode: {
- __typename: returnedQrTypeName,
- permissionName: "qr:read",
- },
- }
- : returnedQrTypeName === "ResourceDoesNotExistError"
- ? {
- qrCode: {
- __typename: returnedQrTypeName,
- resourceName: "qr",
- },
- }
- : {
- qrCode: {
- __typename: "QrCode",
- code: hash,
- box:
- returnedBoxTypeName === "InsufficientPermissionError"
- ? {
- __typename: returnedBoxTypeName,
- permissionName: "stock:read",
- }
- : returnedBoxTypeName === "UnauthorizedForBaseError"
- ? {
- __typename: returnedBoxTypeName,
- baseName: "base",
- organisationName: "org",
- }
- : null,
- },
- },
- },
- error: networkError ? new FakeGraphQLNetworkError() : undefined,
-});
-
-const qrScanningInMultiBoxTabTestsFailing = [
- {
- name: "3.4.3.5 - user scans QR code with associated box, but has no access",
- hash: "noStockReadPermission",
- isBoxtributeQr: true,
- mocks: [
- mockEmptyLocationsTagsShipmentsQuery,
- mockFailedQrQuery({
- hash: "noStockReadPermission",
- returnedBoxTypeName: "InsufficientPermissionError",
- }),
- ],
- toasts: [{ message: /have permission to access this box/i, isError: true }],
- },
- {
- name: "3.4.3.7 - user scans non Boxtribute QR code ",
- hash: "nonBoxtributeQr",
- isBoxtributeQr: false,
- mocks: [],
- toasts: [{ message: /This is not a Boxtribute QR code/i, isError: true }],
- },
- {
- name: "3.4.3.8 - user scans QR code where hash is not found in db",
- hash: "QrHashNotInDb",
- isBoxtributeQr: true,
- mocks: [
- mockFailedQrQuery({
- hash: "QrHashNotInDb",
- returnedQrTypeName: "ResourceDoesNotExistError",
- }),
- ],
- toasts: [{ message: /This is not a Boxtribute QR code/i, isError: true }],
- },
- {
- name: "3.4.3.9 - user scans QR code and server returns unexpected error",
- hash: "InternalServerError",
- isBoxtributeQr: true,
- mocks: [
- mockFailedQrQuery({
- hash: "InternalServerError",
- graphQlError: true,
- }),
- ],
- toasts: [{ message: /QR code lookup failed/i, isError: true }],
- },
- {
- name: "3.4.3.10 - user scans QR code and a network error is returned",
- hash: "NetworkError",
- isBoxtributeQr: true,
- mocks: [
- mockFailedQrQuery({
- hash: "NetworkError",
- networkError: true,
- }),
- ],
- toasts: [{ message: /QR code lookup failed/i, isError: true }],
- },
-];
-
-qrScanningInMultiBoxTabTestsFailing.forEach(({ name, hash, isBoxtributeQr, mocks, toasts }) => {
- it(name, async () => {
- const user = userEvent.setup();
- mockImplementationOfQrReader(mockedQrReader, hash, isBoxtributeQr, true);
- render( , {
- routePath: "/bases/:baseId/qrreader",
- initialUrl: "/bases/1/qrreader",
- mocks,
- cache,
- });
-
- // go to the MultiBox Tab
- const multiBoxTab = await screen.findByRole("tab", { name: /multi box/i });
- expect(multiBoxTab).toBeInTheDocument();
- await user.click(multiBoxTab);
-
- // 3.4.3.1 - no QR-codes were successfully scanned yet.
- const boxesSelectedStatus = await screen.findByText(/boxes selected: 0/i);
- expect(boxesSelectedStatus).toBeInTheDocument();
- expect(
- screen.queryByRole("button", { name: /delete list of scanned boxes/i }),
- ).not.toBeInTheDocument();
- expect(screen.queryByRole("button", { name: /undo last scan/i })).not.toBeInTheDocument();
-
- // Click a button to trigger the event of scanning a QR-Code in mockImplementationOfQrReader
- const scanButton = await screen.findByTestId("ReturnScannedQr");
- await user.click(scanButton);
-
- // toast shown
- await waitFor(() =>
- expect(toasts[0].isError ? mockedTriggerError : mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(toasts[0].message),
- }),
- ),
- );
- });
-});
diff --git a/front/src/views/QrReader/QrReaderMultiBoxAssignTags.test.tsx b/front/src/views/QrReader/QrReaderMultiBoxAssignTags.test.tsx
deleted file mode 100644
index 9c29e1212..000000000
--- a/front/src/views/QrReader/QrReaderMultiBoxAssignTags.test.tsx
+++ /dev/null
@@ -1,254 +0,0 @@
-import { vi, beforeEach, it, expect } from "vitest";
-import { userEvent } from "@testing-library/user-event";
-import { screen, render, waitFor } from "tests/test-utils";
-import { useAuth0 } from "@auth0/auth0-react";
-import { QrReaderScanner } from "components/QrReader/components/QrReaderScanner";
-import { mockAuthenticatedUser } from "mocks/hooks";
-import { mockImplementationOfQrReader } from "mocks/components";
-import { generateMockBox } from "mocks/boxes";
-import {
- GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE,
- MULTI_BOX_ACTION_OPTIONS_FOR_LOCATIONS_TAGS_AND_SHIPMENTS_QUERY,
-} from "queries/queries";
-import { cache } from "queries/cache";
-import { generateMockShipmentMinimal } from "mocks/shipments";
-import { selectOptionInSelectField } from "tests/helpers";
-import { locations } from "mocks/locations";
-import { generateAssignTagsRequest } from "queries/dynamic-mutations";
-import { tagsArray } from "mocks/tags";
-import { mockedCreateToast, mockedTriggerError } from "tests/setupTests";
-import QrReaderView from "./QrReaderView";
-import { FakeGraphQLError, FakeGraphQLNetworkError } from "mocks/functions";
-
-const mockSuccessfulQrQuery = ({
- query = GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE,
- hash = "abc",
- labelIdentifier = "678",
- state = "InStock",
-}) => ({
- request: {
- query,
- variables: { qrCode: hash },
- },
- result: {
- data: {
- qrCode: {
- __typename: "QrCode",
- code: hash,
- box: generateMockBox({ labelIdentifier, state }),
- },
- },
- },
-});
-
-const mockTagsQuery = ({
- query = MULTI_BOX_ACTION_OPTIONS_FOR_LOCATIONS_TAGS_AND_SHIPMENTS_QUERY,
- networkError = false,
- graphQlError = false,
-}) => ({
- request: {
- query,
- variables: { baseId: "1" },
- },
- result: networkError
- ? undefined
- : {
- data: graphQlError
- ? null
- : {
- shipments: [generateMockShipmentMinimal({ state: "Preparing", iAmSource: true })],
- base: { locations, tags: tagsArray },
- },
- errors: graphQlError ? [new FakeGraphQLError()] : undefined,
- },
- error: networkError ? new FakeGraphQLNetworkError() : undefined,
-});
-
-const generateAssignTagsResponse = ({ labelIdentifiers, newTagId, failLabelIdentifier }) => {
- const response = {};
- labelIdentifiers.forEach((labelIdentifier) => {
- if (labelIdentifier !== failLabelIdentifier) {
- response[`assignTagsToBox${labelIdentifier}`] = {
- labelIdentifier,
- tags: [
- {
- id: newTagId,
- },
- ],
- };
- } else {
- response[`assignTagsToBox${labelIdentifier}`] = null;
- }
- });
- return response;
-};
-
-const mockAssignTagsMutation = ({
- networkError = false,
- graphQlError = false,
- labelIdentifiers = ["123"],
- newTagId = 1,
- failLabelIdentifier = "678",
-}) => ({
- request: {
- query: generateAssignTagsRequest(labelIdentifiers, [newTagId]).gqlRequest,
- variables: generateAssignTagsRequest(labelIdentifiers, [newTagId]).variables,
- },
- result: networkError
- ? undefined
- : {
- data: graphQlError
- ? null
- : generateAssignTagsResponse({
- labelIdentifiers,
- newTagId,
- failLabelIdentifier,
- }),
- errors: graphQlError ? [new FakeGraphQLError()] : undefined,
- },
- error: networkError ? new FakeGraphQLNetworkError() : undefined,
-});
-
-vi.mock("@auth0/auth0-react");
-vi.mock("components/QrReader/components/QrReaderScanner");
-const mockedUseAuth0 = vi.mocked(useAuth0);
-const mockedQrReader = vi.mocked(QrReaderScanner);
-
-beforeEach(() => {
- mockAuthenticatedUser(mockedUseAuth0, "dev_volunteer@boxaid.org");
-});
-
-const assignTagsMutationTests = [
- {
- name: "3.4.7.6 - Mutation to assign tags returns Network Error",
- mocks: [
- mockSuccessfulQrQuery({ hash: "InStockBox", labelIdentifier: "123" }),
- mockTagsQuery({}),
- mockAssignTagsMutation({ networkError: true }),
- ],
- toast: { isError: true, message: /Network issue: could not assign/i },
- },
- {
- name: "3.4.7.7 - Mutation to assign tags returns GraphQL Error",
- mocks: [
- mockSuccessfulQrQuery({ hash: "InStockBox", labelIdentifier: "123" }),
- mockTagsQuery({}),
- mockAssignTagsMutation({ graphQlError: true }),
- ],
- toast: { isError: true, message: /Could not assign/i },
- },
- {
- name: "3.4.7.10 - Boxes are successfully tagged",
- mocks: [
- mockSuccessfulQrQuery({ hash: "InStockBox", labelIdentifier: "123" }),
- mockTagsQuery({}),
- mockAssignTagsMutation({}),
- ],
- toast: { isError: false, message: /A Box was successfully assign/i },
- },
-];
-
-assignTagsMutationTests.forEach(({ name, mocks, toast }) => {
- it(name, async () => {
- const user = userEvent.setup();
- mockImplementationOfQrReader(mockedQrReader, "InStockBox", true, true);
- render( , {
- routePath: "/bases/:baseId/qrreader",
- initialUrl: "/bases/1/qrreader",
- mocks,
- cache,
- });
-
- // go to the MultiBox Tab
- const multiBoxTab = await screen.findByRole("tab", { name: /multi box/i });
- expect(multiBoxTab).toBeInTheDocument();
- user.click(multiBoxTab);
-
- const assignToShipmentOption = await screen.findByTestId("AssignTags");
- await user.click(assignToShipmentOption);
- await selectOptionInSelectField(user, undefined, /tag1/i, /please select tags/i);
-
- // The submit button is not yet shown
- expect(screen.queryByRole("button", { name: /assign all/i })).not.toBeInTheDocument();
-
- // Click a button to trigger the event of scanning a QR-Code in mockImplementationOfQrReader
- const scanButton = await screen.findByTestId("ReturnScannedQr");
- await user.click(scanButton);
-
- // The submit button is shown
- const submitButton = await screen.findByRole("button", { name: /assign all/i });
- expect(submitButton).not.toBeDisabled();
- await user.click(submitButton);
-
- // toast shown
- await waitFor(() =>
- expect(toast.isError ? mockedTriggerError : mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(toast.message),
- }),
- ),
- );
- });
-});
-
-it("3.4.7.8 - One Box of two or more Boxes fail for the assign tag Mutation", async () => {
- const user = userEvent.setup();
- mockImplementationOfQrReader(mockedQrReader, "InStockBox1", true, true);
- const { rerender } = render( , {
- routePath: "/bases/:baseId/qrreader",
- initialUrl: "/bases/1/qrreader",
- mocks: [
- mockSuccessfulQrQuery({ hash: "InStockBox1", labelIdentifier: "123" }),
- mockSuccessfulQrQuery({ hash: "InStockBox2", labelIdentifier: "678" }),
- mockTagsQuery({}),
- mockAssignTagsMutation({ labelIdentifiers: ["123", "678"] }),
- ],
- cache,
- });
-
- // go to the MultiBox Tab
- user.click(await screen.findByRole("tab", { name: /multi box/i }));
- expect(await screen.findByText(/boxes selected: 0/i)).toBeInTheDocument();
-
- // scan box 123
- await user.click(await screen.findByTestId("ReturnScannedQr"));
- expect(await screen.findByText(/boxes selected: 1/i)).toBeInTheDocument();
-
- // scan box 678
- mockImplementationOfQrReader(mockedQrReader, "InStockBox2", true, true);
- rerender( );
- await user.click(await screen.findByTestId("ReturnScannedQr"));
- expect(await screen.findByText(/boxes selected: 2/i)).toBeInTheDocument();
-
- // 3.4.5.5 - Query for locations returns two locations
- const assignTagsOption = await screen.findByTestId("AssignTags");
- await user.click(assignTagsOption);
- await selectOptionInSelectField(user, undefined, /tag1/i, /please select tags/i);
-
- // The submit button is shown
- const submitButton = await screen.findByRole("button", { name: /assign all/i });
- expect(submitButton).not.toBeDisabled();
- await user.click(submitButton);
-
- // selected boxes remains the same
- expect(await screen.findByText(/boxes selected: 2/i)).toBeInTheDocument();
-
- // toast shown
- await waitFor(() =>
- expect(mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/A box was successfully assign/i),
- }),
- ),
- );
-
- // Alert appears
- expect(await screen.findByText(/The following boxes were not assign/i)).toBeInTheDocument();
- expect(screen.getByText(/678/i)).toBeInTheDocument();
-
- // click link to remove all not failed boxes
- await user.click(screen.getByText(/Click here to remove all failed boxes from the list/i));
- expect(await screen.findByText(/boxes selected: 1/i)).toBeInTheDocument();
- expect(screen.queryByRole("alert")).not.toBeInTheDocument();
- expect(screen.getByRole("button", { name: /assign all/i })).toBeInTheDocument();
-}, 10000);
diff --git a/front/src/views/QrReader/QrReaderMultiBoxAssignToShipment.test.tsx b/front/src/views/QrReader/QrReaderMultiBoxAssignToShipment.test.tsx
deleted file mode 100644
index 052ffc71c..000000000
--- a/front/src/views/QrReader/QrReaderMultiBoxAssignToShipment.test.tsx
+++ /dev/null
@@ -1,373 +0,0 @@
-import { vi, beforeEach, it, expect } from "vitest";
-import { userEvent } from "@testing-library/user-event";
-import { screen, render, waitFor } from "tests/test-utils";
-import { useAuth0 } from "@auth0/auth0-react";
-import { QrReaderScanner } from "components/QrReader/components/QrReaderScanner";
-import { mockAuthenticatedUser } from "mocks/hooks";
-import { mockImplementationOfQrReader } from "mocks/components";
-import { generateMockBox } from "mocks/boxes";
-import {
- GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE,
- MULTI_BOX_ACTION_OPTIONS_FOR_LOCATIONS_TAGS_AND_SHIPMENTS_QUERY,
-} from "queries/queries";
-import { cache } from "queries/cache";
-import { generateMockShipment, generateMockShipmentMinimal } from "mocks/shipments";
-import { ASSIGN_BOXES_TO_SHIPMENT } from "hooks/useAssignBoxesToShipment";
-import { locations } from "mocks/locations";
-import { tags } from "mocks/tags";
-import { selectOptionInSelectField } from "tests/helpers";
-import { mockedCreateToast, mockedTriggerError } from "tests/setupTests";
-import QrReaderView from "./QrReaderView";
-import { FakeGraphQLError, FakeGraphQLNetworkError } from "mocks/functions";
-
-const mockSuccessfulQrQuery = ({
- query = GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE,
- hash = "abc",
- labelIdentifier = "678",
- state = "InStock",
-}) => ({
- request: {
- query,
- variables: { qrCode: hash },
- },
- result: {
- data: {
- qrCode: {
- __typename: "QrCode",
- code: hash,
- box: generateMockBox({ labelIdentifier, state }),
- },
- },
- },
-});
-
-const mockShipmentsQuery = ({
- query = MULTI_BOX_ACTION_OPTIONS_FOR_LOCATIONS_TAGS_AND_SHIPMENTS_QUERY,
- state = "Preparing",
- iAmSource = true,
- networkError = false,
- graphQlError = false,
-}) => ({
- request: {
- query,
- variables: { baseId: "1" },
- },
- result: networkError
- ? undefined
- : {
- data: graphQlError
- ? null
- : {
- shipments: [generateMockShipmentMinimal({ state, iAmSource })],
- base: { locations, tags },
- },
- errors: graphQlError ? [new FakeGraphQLError()] : undefined,
- },
- error: networkError ? new FakeGraphQLNetworkError() : undefined,
-});
-
-const mockAssignToShipmentMutation = ({
- networkError = false,
- graphQlError = false,
- errorCode = "",
- labelIdentifiers = ["123"],
-}) => ({
- request: {
- query: ASSIGN_BOXES_TO_SHIPMENT,
- variables: {
- id: "1",
- labelIdentifiers,
- },
- },
- result: networkError
- ? undefined
- : {
- data: graphQlError ? null : { updateShipmentWhenPreparing: generateMockShipment({}) },
- errors: graphQlError ? [new FakeGraphQLError(errorCode)] : undefined,
- },
- error: networkError ? new FakeGraphQLNetworkError() : undefined,
-});
-
-vi.mock("@auth0/auth0-react");
-vi.mock("components/QrReader/components/QrReaderScanner");
-const mockedUseAuth0 = vi.mocked(useAuth0);
-const mockedQrReader = vi.mocked(QrReaderScanner);
-
-beforeEach(() => {
- mockAuthenticatedUser(mockedUseAuth0, "dev_volunteer@boxaid.org");
-});
-
-const failingShipmentsQueryTests = [
- {
- name: "3.4.5.3a - Query for shipments returns an error (Network)",
- hash: "QrWithBoxFromSameBase",
- mocks: [mockShipmentsQuery({ networkError: true })],
- alert: /Could not fetch/i,
- },
- {
- name: "3.4.5.3b - Query for shipments returns an error (GraphQL)",
- hash: "QrWithBoxFromSameBase",
- mocks: [mockShipmentsQuery({ graphQlError: true })],
- alert: /Could not fetch/i,
- },
- {
- name: "3.4.5.4 - Query for shipments returns no shipments in preparing state",
- hash: "QrWithBoxFromSameBase",
- mocks: [mockShipmentsQuery({ state: "Receiving" })],
- alert: undefined,
- },
-];
-
-failingShipmentsQueryTests.forEach(({ name, hash, mocks, alert }) => {
- it(name, async () => {
- const user = userEvent.setup();
- mockImplementationOfQrReader(mockedQrReader, hash, true, true);
- render( , {
- routePath: "/bases/:baseId/qrreader",
- initialUrl: "/bases/1/qrreader",
- mocks,
- cache,
- });
-
- // go to the MultiBox Tab
- const multiBoxTab = await screen.findByRole("tab", { name: /multi box/i });
- expect(multiBoxTab).toBeInTheDocument();
- user.click(multiBoxTab);
-
- // alert shown
- if (alert) {
- expect(await screen.findByText(alert)).toBeInTheDocument();
- }
- // assign to Shipment Radio button is not shown
- expect(screen.queryByTestId("AssignShipment")).not.toBeInTheDocument();
- // submit button is not shown
- expect(screen.queryByRole("button", { name: /assign all/i })).not.toBeInTheDocument();
- });
-});
-
-it("3.4.5.1 - There are boxes in the list, but the state of some is not InStock", async () => {
- const user = userEvent.setup();
- mockImplementationOfQrReader(mockedQrReader, "LostBox", true, true);
- render( , {
- routePath: "/bases/:baseId/qrreader",
- initialUrl: "/bases/1/qrreader",
- mocks: [mockSuccessfulQrQuery({ hash: "LostBox", state: "Lost" }), mockShipmentsQuery({})],
- cache,
- });
-
- // go to the MultiBox Tab
- const multiBoxTab = await screen.findByRole("tab", { name: /multi box/i });
- expect(multiBoxTab).toBeInTheDocument();
- user.click(multiBoxTab);
-
- // 3.4.3.1 - no QR-codes were successfully scanned yet.
- const boxesSelectedStatus = await screen.findByText(/boxes selected: 0/i);
- expect(boxesSelectedStatus).toBeInTheDocument();
- expect(
- screen.queryByRole("button", { name: /delete list of scanned boxes/i }),
- ).not.toBeInTheDocument();
- expect(screen.queryByRole("button", { name: /undo last scan/i })).not.toBeInTheDocument();
-
- // Click a button to trigger the event of scanning a QR-Code in mockImplementationOfQrReader
- const scanButton = await screen.findByTestId("ReturnScannedQr");
- await user.click(scanButton);
-
- // 3.4.5.5 - Query for shipments returns one or more shipments in preparing state
- const assignToShipmentOption = await screen.findByTestId("AssignShipment");
- await user.click(assignToShipmentOption);
- await selectOptionInSelectField(
- user,
- undefined,
- /thessaloniki/i,
- /please select a shipment/i,
- false,
- "button",
- );
-
- // Alert appears and button is disabled
- expect(
- await screen.findByText(
- /a box must be in the instock state to be assigned to a shipment\. is not instock\./i,
- ),
- ).toBeInTheDocument();
- expect(screen.getByRole("button", { name: /assign all/i })).toBeDisabled();
-
- // click link to remove all not InStock boxes
- await user.click(screen.getByText(/click here to remove all non instock boxes from the list\./i));
- expect(await screen.findByText(/boxes selected: 0/i)).toBeInTheDocument();
- expect(screen.queryByRole("alert")).not.toBeInTheDocument();
- expect(screen.queryByRole("button", { name: /assign all/i })).not.toBeInTheDocument();
-});
-
-const assignToShipmentMutationTests = [
- {
- name: "3.4.5.7 - Mutation to assign boxes to shipment returns Network Error",
- mocks: [
- mockSuccessfulQrQuery({ hash: "InStockBox", labelIdentifier: "123" }),
- mockShipmentsQuery({}),
- mockAssignToShipmentMutation({ networkError: true }),
- ],
- toast: { isError: true, message: /Could not assign boxes to shipment/i },
- },
- {
- name: "3.4.5.8 - Mutation to assign boxes to shipment returns General Server Error",
- mocks: [
- mockSuccessfulQrQuery({ hash: "InStockBox", labelIdentifier: "123" }),
- mockShipmentsQuery({}),
- mockAssignToShipmentMutation({ graphQlError: true, errorCode: "INTERNAL_SERVER_ERROR" }),
- ],
- toast: { isError: true, message: /Could not assign boxes to shipment/i },
- },
- {
- name: "3.4.5.9 - Mutation to assign boxes to shipment returns Authorization Error",
- mocks: [
- mockSuccessfulQrQuery({ hash: "InStockBox", labelIdentifier: "123" }),
- mockShipmentsQuery({}),
- mockAssignToShipmentMutation({ graphQlError: true, errorCode: "FORBIDDEN" }),
- ],
- toast: { isError: true, message: /have the permissions to assign boxes to this shipment/i },
- },
- {
- name: "3.4.5.10 - Mutation to assign boxes to shipment fails since shipment is not in the Preparing State anymore",
- mocks: [
- mockSuccessfulQrQuery({ hash: "InStockBox", labelIdentifier: "123" }),
- mockShipmentsQuery({}),
- mockAssignToShipmentMutation({ graphQlError: true, errorCode: "BAD_USER_INPUT" }),
- ],
- toast: { isError: true, message: /The shipment is not in the Preparing state/i },
- },
- {
- name: "3.4.5.12 - Boxes are successfully assigned to shipment",
- mocks: [
- mockSuccessfulQrQuery({ hash: "InStockBox", labelIdentifier: "123" }),
- mockShipmentsQuery({}),
- mockAssignToShipmentMutation({}),
- ],
- toast: { isError: false, message: /A Box was successfully assigned to the shipment/i },
- },
-];
-
-assignToShipmentMutationTests.forEach(({ name, mocks, toast }) => {
- it(name, async () => {
- const user = userEvent.setup();
- mockImplementationOfQrReader(mockedQrReader, "InStockBox", true, true);
- render( , {
- routePath: "/bases/:baseId/qrreader",
- initialUrl: "/bases/1/qrreader",
- mocks,
- cache,
- additionalRoute: "/bases/1/transfers/shipments/1",
- });
-
- // go to the MultiBox Tab
- const multiBoxTab = await screen.findByRole("tab", { name: /multi box/i });
- expect(multiBoxTab).toBeInTheDocument();
- user.click(multiBoxTab);
-
- // 3.4.5.5 - Query for shipments returns one or more shipments in preparing state
- const assignToShipmentOption = await screen.findByTestId("AssignShipment");
- await user.click(assignToShipmentOption);
- await selectOptionInSelectField(
- user,
- undefined,
- /thessaloniki/i,
- /please select a shipment/i,
- false,
- "button",
- );
-
- // The submit button is not yet shown
- expect(screen.queryByRole("button", { name: /assign all/i })).not.toBeInTheDocument();
-
- // Click a button to trigger the event of scanning a QR-Code in mockImplementationOfQrReader
- const scanButton = await screen.findByTestId("ReturnScannedQr");
- await user.click(scanButton);
-
- // The submit button is shown
- const submitButton = await screen.findByRole("button", { name: /assign all/i });
- expect(submitButton).not.toBeDisabled();
- await user.click(submitButton);
-
- // toast shown
- await waitFor(() =>
- expect(toast.isError ? mockedTriggerError : mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(toast.message),
- }),
- ),
- );
- });
-});
-
-it("3.4.5.11 - One Box of two or more Boxes fail for the Assign boxes to shipment Mutation", async () => {
- const user = userEvent.setup();
- mockImplementationOfQrReader(mockedQrReader, "InStockBox1", true, true);
- const { rerender } = render( , {
- routePath: "/bases/:baseId/qrreader",
- initialUrl: "/bases/1/qrreader",
- mocks: [
- mockSuccessfulQrQuery({ hash: "InStockBox1", labelIdentifier: "123" }),
- mockSuccessfulQrQuery({ hash: "InStockBox2", labelIdentifier: "678" }),
- mockShipmentsQuery({}),
- mockAssignToShipmentMutation({ labelIdentifiers: ["123", "678"] }),
- ],
- cache,
- });
-
- // go to the MultiBox Tab
- user.click(await screen.findByRole("tab", { name: /multi box/i }));
- expect(await screen.findByText(/boxes selected: 0/i)).toBeInTheDocument();
-
- // scan box 123
- await user.click(await screen.findByTestId("ReturnScannedQr"));
- expect(await screen.findByText(/boxes selected: 1/i)).toBeInTheDocument();
-
- // scan box 678
- mockImplementationOfQrReader(mockedQrReader, "InStockBox2", true, true);
- rerender( );
- await user.click(await screen.findByTestId("ReturnScannedQr"));
- expect(await screen.findByText(/boxes selected: 2/i)).toBeInTheDocument();
-
- // 3.4.5.5 - Query for shipments returns one or more shipments in preparing state
- const assignToShipmentOption = await screen.findByTestId("AssignShipment");
- await user.click(assignToShipmentOption);
- await selectOptionInSelectField(
- user,
- undefined,
- /thessaloniki/i,
- /please select a shipment/i,
- false,
- "button",
- );
-
- // The submit button is shown
- const submitButton = await screen.findByRole("button", { name: /assign all/i });
- expect(submitButton).not.toBeDisabled();
- await user.click(submitButton);
-
- // selected boxes remains the same
- expect(await screen.findByText(/boxes selected: 2/i)).toBeInTheDocument();
-
- // toast shown
- await waitFor(() =>
- expect(mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/A Box was successfully assigned to the shipment/i),
- }),
- ),
- );
-
- // Alert appears
- expect(
- await screen.findByText(/The following boxes were not assigned to the shipment/i),
- ).toBeInTheDocument();
- expect(screen.getByText(/678/i)).toBeInTheDocument();
-
- // click link to remove all not failed boxes
- await user.click(screen.getByText(/Click here to remove all failed boxes from the list/i));
- expect(await screen.findByText(/boxes selected: 1/i)).toBeInTheDocument();
- expect(screen.getByRole("button", { name: /assign all/i })).toBeInTheDocument();
- // Alert appears because box was assigned to shipment and thus not inStock.
- expect(screen.getByRole("alert")).toBeInTheDocument();
- expect(screen.getByRole("button", { name: /assign all/i })).toBeDisabled();
-});
diff --git a/front/src/views/QrReader/QrReaderMultiBoxMoveBox.test.tsx b/front/src/views/QrReader/QrReaderMultiBoxMoveBox.test.tsx
deleted file mode 100644
index 317adcdfd..000000000
--- a/front/src/views/QrReader/QrReaderMultiBoxMoveBox.test.tsx
+++ /dev/null
@@ -1,261 +0,0 @@
-import { vi, beforeEach, it, expect } from "vitest";
-import { userEvent } from "@testing-library/user-event";
-import { screen, render, waitFor } from "tests/test-utils";
-import { useAuth0 } from "@auth0/auth0-react";
-import { QrReaderScanner } from "components/QrReader/components/QrReaderScanner";
-import { mockAuthenticatedUser } from "mocks/hooks";
-import { mockImplementationOfQrReader } from "mocks/components";
-import { generateMockBox } from "mocks/boxes";
-import {
- GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE,
- MULTI_BOX_ACTION_OPTIONS_FOR_LOCATIONS_TAGS_AND_SHIPMENTS_QUERY,
-} from "queries/queries";
-import { cache } from "queries/cache";
-import { generateMockShipmentMinimal } from "mocks/shipments";
-import { selectOptionInSelectField } from "tests/helpers";
-import { locations } from "mocks/locations";
-import { generateMoveBoxRequest } from "queries/dynamic-mutations";
-import { tags } from "mocks/tags";
-import { mockedCreateToast, mockedTriggerError } from "tests/setupTests";
-import QrReaderView from "./QrReaderView";
-import { FakeGraphQLError, FakeGraphQLNetworkError } from "mocks/functions";
-
-const mockSuccessfulQrQuery = ({
- query = GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE,
- hash = "abc",
- labelIdentifier = "678",
- state = "InStock",
-}) => ({
- request: {
- query,
- variables: { qrCode: hash },
- },
- result: {
- data: {
- qrCode: {
- __typename: "QrCode",
- code: hash,
- box: generateMockBox({ labelIdentifier, state }),
- },
- },
- },
-});
-
-const mockLocationsQuery = ({
- query = MULTI_BOX_ACTION_OPTIONS_FOR_LOCATIONS_TAGS_AND_SHIPMENTS_QUERY,
- networkError = false,
- graphQlError = false,
-}) => ({
- request: {
- query,
- variables: { baseId: "1" },
- },
- result: networkError
- ? undefined
- : {
- data: graphQlError
- ? null
- : {
- shipments: [generateMockShipmentMinimal({ state: "Preparing", iAmSource: true })],
- base: { locations, tags },
- },
- errors: graphQlError ? [new FakeGraphQLError()] : undefined,
- },
- error: networkError ? new FakeGraphQLNetworkError() : undefined,
-});
-
-const generateMoveBoxesResponse = ({
- labelIdentifiers,
- newLocationId,
- newBoxState,
- failLabelIdentifier,
-}) => {
- const response = {};
- labelIdentifiers.forEach((labelIdentifier) => {
- if (labelIdentifier !== failLabelIdentifier) {
- response[`moveBox${labelIdentifier}`] = {
- labelIdentifier,
- state: newBoxState,
- location: {
- id: newLocationId,
- },
- };
- } else {
- response[`moveBox${labelIdentifier}`] = null;
- }
- });
- return response;
-};
-
-const mockMoveBoxesMutation = ({
- networkError = false,
- graphQlError = false,
- labelIdentifiers = ["123"],
- newLocationId = 2,
- newBoxState = "Donated",
- failLabelIdentifier = "678",
-}) => ({
- request: {
- query: generateMoveBoxRequest(labelIdentifiers, newLocationId).gqlRequest,
- variables: generateMoveBoxRequest(labelIdentifiers, newLocationId).variables,
- },
- result: networkError
- ? undefined
- : {
- data: graphQlError
- ? null
- : generateMoveBoxesResponse({
- labelIdentifiers,
- newLocationId,
- newBoxState,
- failLabelIdentifier,
- }),
- errors: graphQlError ? [new FakeGraphQLError()] : undefined,
- },
- error: networkError ? new FakeGraphQLNetworkError() : undefined,
-});
-
-vi.mock("@auth0/auth0-react");
-vi.mock("components/QrReader/components/QrReaderScanner");
-const mockedUseAuth0 = vi.mocked(useAuth0);
-const mockedQrReader = vi.mocked(QrReaderScanner);
-
-beforeEach(() => {
- mockAuthenticatedUser(mockedUseAuth0, "dev_volunteer@boxaid.org");
-});
-
-const moveBoxesMutationTests = [
- {
- name: "3.4.6.2 - Mutation to move boxes returns Network Error",
- mocks: [
- mockSuccessfulQrQuery({ hash: "InStockBox", labelIdentifier: "123" }),
- mockLocationsQuery({}),
- mockMoveBoxesMutation({ networkError: true }),
- ],
- toast: { isError: true, message: /Network issue: could not move/i },
- },
- {
- name: "3.4.6.3 - Mutation to move boxes returns GraphQL Error",
- mocks: [
- mockSuccessfulQrQuery({ hash: "InStockBox", labelIdentifier: "123" }),
- mockLocationsQuery({}),
- mockMoveBoxesMutation({ graphQlError: true }),
- ],
- toast: { isError: true, message: /Could not move/i },
- },
- {
- name: "3.4.6.5 - Boxes are successfully moved",
- mocks: [
- mockSuccessfulQrQuery({ hash: "InStockBox", labelIdentifier: "123" }),
- mockLocationsQuery({}),
- mockMoveBoxesMutation({}),
- ],
- toast: { isError: false, message: /A Box was successfully moved/i },
- },
-];
-
-moveBoxesMutationTests.forEach(({ name, mocks, toast }) => {
- it(name, async () => {
- const user = userEvent.setup();
- mockImplementationOfQrReader(mockedQrReader, "InStockBox", true, true);
- render( , {
- routePath: "/bases/:baseId/qrreader",
- initialUrl: "/bases/1/qrreader",
- mocks,
- cache,
- });
-
- // go to the MultiBox Tab
- const multiBoxTab = await screen.findByRole("tab", { name: /multi box/i });
- expect(multiBoxTab).toBeInTheDocument();
- user.click(multiBoxTab);
-
- // query for locations returns two options
- const assignToShipmentOption = await screen.findByTestId("MoveBox");
- await user.click(assignToShipmentOption);
- await selectOptionInSelectField(user, undefined, /shop/i, /please select a location/i);
-
- // The submit button is not yet shown
- expect(screen.queryByRole("button", { name: /move all/i })).not.toBeInTheDocument();
-
- // Click a button to trigger the event of scanning a QR-Code in mockImplementationOfQrReader
- const scanButton = await screen.findByTestId("ReturnScannedQr");
- await user.click(scanButton);
-
- // The submit button is shown
- const submitButton = await screen.findByRole("button", { name: /move all/i });
- expect(submitButton).not.toBeDisabled();
- await user.click(submitButton);
-
- // toast shown
- await waitFor(() =>
- expect(toast.isError ? mockedTriggerError : mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(toast.message),
- }),
- ),
- );
- });
-});
-
-it("3.4.6.4 - One Box of two or more Boxes fail for the move Box Mutation", async () => {
- const user = userEvent.setup();
- mockImplementationOfQrReader(mockedQrReader, "InStockBox1", true, true);
- const { rerender } = render( , {
- routePath: "/bases/:baseId/qrreader",
- initialUrl: "/bases/1/qrreader",
- mocks: [
- mockSuccessfulQrQuery({ hash: "InStockBox1", labelIdentifier: "123" }),
- mockSuccessfulQrQuery({ hash: "InStockBox2", labelIdentifier: "678" }),
- mockLocationsQuery({}),
- mockMoveBoxesMutation({ labelIdentifiers: ["123", "678"] }),
- ],
- cache,
- });
-
- // go to the MultiBox Tab
- user.click(await screen.findByRole("tab", { name: /multi box/i }));
- expect(await screen.findByText(/boxes selected: 0/i)).toBeInTheDocument();
-
- // scan box 123
- await user.click(await screen.findByTestId("ReturnScannedQr"));
- expect(await screen.findByText(/boxes selected: 1/i)).toBeInTheDocument();
-
- // scan box 678
- mockImplementationOfQrReader(mockedQrReader, "InStockBox2", true, true);
- rerender( );
- await user.click(await screen.findByTestId("ReturnScannedQr"));
- expect(await screen.findByText(/boxes selected: 2/i)).toBeInTheDocument();
-
- // 3.4.5.5 - Query for locations returns two locations
- const moveBoxesOption = await screen.findByTestId("MoveBox");
- await user.click(moveBoxesOption);
- await selectOptionInSelectField(user, undefined, /shop/i, /please select a location/i);
-
- // The submit button is shown
- const submitButton = await screen.findByRole("button", { name: /move all/i });
- expect(submitButton).not.toBeDisabled();
- await user.click(submitButton);
-
- // selected boxes remains the same
- expect(await screen.findByText(/boxes selected: 2/i)).toBeInTheDocument();
-
- // toast shown
- await waitFor(() =>
- expect(mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/A box was successfully moved/i),
- }),
- ),
- );
-
- // Alert appears
- expect(await screen.findByText(/The following boxes were not moved/i)).toBeInTheDocument();
- expect(screen.getByText(/678/i)).toBeInTheDocument();
-
- // click link to remove all not failed boxes
- await user.click(screen.getByText(/Click here to remove all failed boxes from the list/i));
- expect(await screen.findByText(/boxes selected: 1/i)).toBeInTheDocument();
- expect(screen.queryByRole("alert")).not.toBeInTheDocument();
- expect(screen.getByRole("button", { name: /move all/i })).toBeInTheDocument();
-});
diff --git a/front/src/views/QrReader/components/ResolveHash.test.tsx b/front/src/views/QrReader/components/ResolveHash.test.tsx
deleted file mode 100644
index 465a0086d..000000000
--- a/front/src/views/QrReader/components/ResolveHash.test.tsx
+++ /dev/null
@@ -1,227 +0,0 @@
-import { vi, beforeEach, it, expect } from "vitest";
-import { useAuth0 } from "@auth0/auth0-react";
-import { QrReaderScanner } from "components/QrReader/components/QrReaderScanner";
-import { handleBoxGeneration } from "mocks/boxes";
-import { mockImplementationOfQrReader } from "mocks/components";
-import { mockAuthenticatedUser } from "mocks/hooks";
-import { cache } from "queries/cache";
-import { GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE } from "queries/queries";
-import { render, screen, waitFor } from "tests/test-utils";
-import { mockedTriggerError } from "tests/setupTests";
-import ResolveHash from "./ResolveHash";
-import { FakeGraphQLError, FakeGraphQLNetworkError } from "mocks/functions";
-
-vi.mock("@auth0/auth0-react");
-vi.mock("components/QrReader/components/QrReaderScanner");
-const mockedUseAuth0 = vi.mocked(useAuth0);
-const mockedQrReader = vi.mocked(QrReaderScanner);
-
-beforeEach(() => {
- mockAuthenticatedUser(mockedUseAuth0, "dev_volunteer@boxaid.org");
-});
-
-const mockSuccessfulQrQuery = ({
- query = GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE,
- hash = "abc",
- isBoxAssociated = true,
- isBoxSameBase = true,
- isBoxSameOrg = true,
- labelIdentifier = "123",
- state = "InStock",
-}) => ({
- delay: 100,
- request: {
- query,
- variables: { qrCode: hash },
- },
- result: {
- data: {
- qrCode: {
- __typename: "QrCode",
- code: hash,
- box: handleBoxGeneration({
- labelIdentifier,
- state,
- isBoxAssociated,
- isBoxSameOrg,
- isBoxSameBase,
- }),
- },
- },
- },
-});
-
-const SuccessfulQrScanningTests = [
- {
- name: "3.4.8.2 - User scans QR code of same org without previously associated box",
- hash: "QrWithoutBox",
- mocks: [mockSuccessfulQrQuery({ hash: "QrWithoutBox", isBoxAssociated: false })],
- endRoute: "/bases/1/boxes/create/QrWithoutBox",
- },
- {
- name: "3.4.8.3 - User scans QR code of same org with associated box",
- hash: "QrWithBoxFromSameBase",
- mocks: [mockSuccessfulQrQuery({ hash: "QrWithBoxFromSameBase" })],
- endRoute: "/bases/1/boxes/123",
- },
-];
-
-SuccessfulQrScanningTests.forEach(({ name, hash, mocks, endRoute }) => {
- it(name, async () => {
- mockImplementationOfQrReader(mockedQrReader, hash, true, true);
- render( , {
- routePath: "/bases/1/qrreader/:hash",
- initialUrl: `/bases/1/qrreader/${hash}`,
- additionalRoute: endRoute,
- mocks,
- cache,
- });
-
- expect(screen.queryByTestId("ReturnScannedQr")).not.toBeInTheDocument();
-
- expect(await screen.findByRole("heading", { name: endRoute })).toBeInTheDocument();
- });
-});
-
-const mockFailedQrQuery = ({
- query = GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE,
- hash = "",
- graphQlError = false,
- networkError = false,
- returnedQrTypeName = "QrCode",
- returnedBoxTypeName = "Box",
-}) => ({
- request: {
- query,
- variables: { qrCode: hash },
- },
- result: networkError
- ? undefined
- : graphQlError
- ? { errors: graphQlError ? undefined : [new FakeGraphQLError("Error")] }
- : {
- data:
- returnedQrTypeName === "InsufficientPermissionError"
- ? {
- qrCode: {
- __typename: returnedQrTypeName,
- permissionName: "qr:read",
- },
- }
- : returnedQrTypeName === "ResourceDoesNotExistError"
- ? {
- qrCode: {
- __typename: returnedQrTypeName,
- resourceName: "qr",
- },
- }
- : {
- qrCode: {
- __typename: "QrCode",
- code: hash,
- box:
- returnedBoxTypeName === "InsufficientPermissionError"
- ? {
- __typename: returnedBoxTypeName,
- permissionName: "stock:read",
- }
- : returnedBoxTypeName === "UnauthorizedForBaseError"
- ? {
- __typename: returnedBoxTypeName,
- baseName: "base",
- organisationName: "org",
- }
- : null,
- },
- },
- },
- error: networkError ? new FakeGraphQLNetworkError() : undefined,
-});
-
-const SuccessfulQrScanningNoAuthorizationOrPermissonTests = [
- {
- name: "3.4.8.4 - User scans QR code of different org with associated box.",
- hash: "QrBoxSameOrgNoAccess",
- mocks: [mockSuccessfulQrQuery({ hash: "QrBoxSameOrgNoAccess", isBoxSameOrg: false })],
- },
- {
- name: "3.4.8.5 - User scans QR code of same org, but different base with associated box. The user has no access to the other base.",
- hash: "QrBoxSameOrgNoAccess",
- mocks: [mockSuccessfulQrQuery({ hash: "QrBoxSameOrgNoAccess", isBoxSameBase: false })],
- },
-];
-
-// TODO: Needs fixing with which alert box shows up in the test. It appears that there are query errors within the test context.
-SuccessfulQrScanningNoAuthorizationOrPermissonTests.forEach(({ name, hash, mocks }) => {
- it(name, async () => {
- mockImplementationOfQrReader(mockedQrReader, hash, true, true);
- render( , {
- routePath: "/bases/1/qrreader/:hash",
- initialUrl: `/bases/1/qrreader/${hash}`,
- mocks,
- cache,
- });
-
- expect(screen.queryByTestId("ReturnScannedQr")).not.toBeInTheDocument();
-
- expect(await screen.findByTestId("ErrorAlert")).toBeInTheDocument();
- // TODO: assert correct alert text.
- });
-});
-
-const FailedQrScanningTests = [
- // {
- // name: "3.4.8.4 - User scans QR code of different org with associated box",
- // hash: "QrWithBoxFromDifferentBase",
- // mocks: [mockFailedQrQuery({ hash: "QrWithBoxFromDifferentBase", errorCode: "FORBIDDEN" })],
- // toast: /You don't have permission to access this box/i,
- // },
- {
- name: "3.4.8.7 - User scans QR code where hash is not found in db",
- hash: "NoBoxtributeQr",
- mocks: [
- mockFailedQrQuery({
- hash: "NoBoxtributeQr",
- returnedQrTypeName: "ResourceDoesNotExistError",
- }),
- ],
- toast: /This is not a Boxtribute QR code/i,
- },
- {
- name: "3.4.8.8 - User scans QR code and server returns unexpected error",
- hash: "QrServerFailure",
- mocks: [mockFailedQrQuery({ hash: "QrServerFailure", graphQlError: true })],
- toast: /QR code lookup failed. Please wait a bit and try again./i,
- },
- {
- name: "3.4.8.9 - User scans QR code and a network error is returned",
- hash: "QrNetworkError",
- mocks: [mockFailedQrQuery({ hash: "QrNetworkError", networkError: true })],
- toast: /QR code lookup failed. Please wait a bit and try again./i,
- },
-];
-
-FailedQrScanningTests.forEach(({ name, hash, mocks, toast }) => {
- it(name, async () => {
- mockImplementationOfQrReader(mockedQrReader, hash, true, true);
- render( , {
- routePath: "/bases/1/qrreader/:hash",
- initialUrl: `/bases/1/qrreader/${hash}`,
- mocks,
- cache,
- });
-
- // screen.debug();
-
- expect(await screen.findByTestId("ReturnScannedQr")).toBeInTheDocument();
-
- // toast shown
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(toast),
- }),
- ),
- );
- });
-});
diff --git a/front/src/views/Transfers/CreateShipment/CreateShipmentView.test.tsx b/front/src/views/Transfers/CreateShipment/CreateShipmentView.test.tsx
deleted file mode 100644
index fc6e66af7..000000000
--- a/front/src/views/Transfers/CreateShipment/CreateShipmentView.test.tsx
+++ /dev/null
@@ -1,500 +0,0 @@
-import { vi, it, describe, expect } from "vitest";
-import { screen, render, waitFor } from "tests/test-utils";
-import { organisation1, organisation2 } from "mocks/organisations";
-import { acceptedTransferAgreement } from "mocks/transferAgreements";
-import { userEvent } from "@testing-library/user-event";
-import { assertOptionsInSelectField, selectOptionInSelectField } from "tests/helpers";
-import { base1, base2 } from "mocks/bases";
-import { generateMockShipment } from "mocks/shipments";
-import { cache } from "queries/cache";
-import { graphql } from "gql.tada";
-import { mockedCreateToast, mockedTriggerError } from "tests/setupTests";
-import CreateShipmentView, {
- ALL_ACCEPTED_TRANSFER_AGREEMENTS_QUERY,
- ALL_BASES_OF_CURRENT_ORG_QUERY,
- CREATE_SHIPMENT_MUTATION,
-} from "./CreateShipmentView";
-import { SHIPMENT_BY_ID_QUERY } from "../ShipmentView/ShipmentView";
-import { FakeGraphQLError } from "mocks/functions";
-
-vi.setConfig({ testTimeout: 20_000 });
-
-const initialQueryAllBasesOfCurrentOrg = {
- request: {
- query: ALL_BASES_OF_CURRENT_ORG_QUERY,
- variables: {
- orgId: "1",
- },
- },
- result: {
- data: organisation1.bases,
- },
-};
-
-const initialQuery = {
- request: {
- query: ALL_ACCEPTED_TRANSFER_AGREEMENTS_QUERY,
- variables: {
- baseId: "1",
- },
- },
- result: {
- data: {
- base: {
- __typename: "Base",
- id: "1",
- name: "Lesvos",
- organisation: {
- __typename: "Organisation",
- id: "1",
- name: "BoxAid",
- },
- },
- transferAgreements: [acceptedTransferAgreement],
- },
- },
-};
-
-const initialQueryWithoutAgreement = {
- request: {
- query: ALL_ACCEPTED_TRANSFER_AGREEMENTS_QUERY,
- variables: {
- baseId: "1",
- },
- },
- result: {
- data: {
- base: {
- __typename: "Base",
- id: "1",
- name: "Lesvos",
- organisation: {
- __typename: "Organisation",
- id: "1",
- name: "BoxAid",
- },
- },
- transferAgreements: [],
- },
- },
-};
-
-const initialWithoutBoxQuery = {
- request: {
- query: SHIPMENT_BY_ID_QUERY,
- variables: {
- id: "1",
- },
- },
- result: {
- data: {
- shipment: generateMockShipment({ state: "Preparing", hasBoxes: false }),
- },
- },
-};
-
-const initialQueryNetworkError = {
- request: {
- query: ALL_ACCEPTED_TRANSFER_AGREEMENTS_QUERY,
- variables: {
- baseId: "1",
- },
- },
- result: {
- errors: [new FakeGraphQLError()],
- },
-};
-
-const successfulMutation = {
- request: {
- query: CREATE_SHIPMENT_MUTATION,
- variables: {
- transferAgreementId: 1,
- sourceBaseId: 1,
- targetBaseId: 3,
- },
- },
- result: {
- data: {
- createShipment: {
- ...generateMockShipment({ state: "Preparing", hasBoxes: false }),
- },
- },
- },
-};
-
-const mutationNetworkError = {
- request: {
- query: CREATE_SHIPMENT_MUTATION,
- variables: {
- transferAgreementId: 1,
- sourceBaseId: 1,
- targetBaseId: 3,
- },
- },
- error: new Error(),
-};
-
-const mutationGraphQLError = {
- request: {
- query: CREATE_SHIPMENT_MUTATION,
- variables: {
- transferAgreementId: 1,
- sourceBaseId: 1,
- targetBaseId: 3,
- },
- },
- result: {
- errors: [new FakeGraphQLError()],
- },
-};
-
-// Test case 4.3.1
-it("4.3.1 - Initial load of Page", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/transfers/shipments/create",
- initialUrl: "/bases/1/transfers/shipments/create",
- mocks: [initialQueryAllBasesOfCurrentOrg, initialQuery],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base1.id, name: base1.name },
- },
- },
- });
-
- expect(screen.getByTestId("loading-indicator")).toBeInTheDocument();
-
- const title = await screen.findByRole("heading", { name: "New Shipment" });
- expect(title).toBeInTheDocument();
- // Test case 4.3.1.1 - Content: Displays Source Base Label
- expect(await screen.findByText(/boxaid/i)).toBeInTheDocument();
- expect(await screen.findByText(/lesvos/i)).toBeInTheDocument();
- // Test case 4.3.1.2 - Content: Displays Partner Orgs Select Options
- await assertOptionsInSelectField(user, /organisation/i, [/boxcare/i], title);
- await selectOptionInSelectField(user, /organisation/i, "BoxCare");
- expect(await screen.findByText("BoxCare")).toBeInTheDocument();
- // Test case 4.3.1.3 - Content: Displays Partner Bases Select Options When Partner Organisation Selected
- await assertOptionsInSelectField(user, /base/i, [/samos/i, /thessaloniki/i, /athens/i], title);
- await selectOptionInSelectField(user, /base/i, "Samos");
-
- // Breadcrumbs are there
- expect(screen.getByRole("link", { name: /back to manage shipments/i })).toBeInTheDocument();
-});
-
-// Test case 4.3.2
-it("4.3.2 - Input Validations", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/transfers/shipments/create",
- initialUrl: "/bases/1/transfers/shipments/create",
- mocks: [initialQueryAllBasesOfCurrentOrg, initialQuery],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base1.id, name: base1.name },
- },
- },
- });
-
- const submitButton = await screen.findByRole("button", { name: /start new shipment/i });
- expect(submitButton).toBeInTheDocument();
- user.click(submitButton);
- // Test case 4.3.2.1 - Partner Organisation SELECT field cannot be empty
- expect((screen.getByLabelText(/organisation/i) as HTMLInputElement).value).toEqual("");
- expect(screen.getByText(/please select an organisation/i)).toBeInTheDocument();
- // Test case 4.3.2.2 - Partner Organisation Base SELECT field cannot be empty
- expect((screen.getByLabelText(/base/i) as HTMLInputElement).value).toEqual("");
- expect(screen.getAllByText(/please select a base/i)[0]).toBeInTheDocument();
-
- expect((await screen.findAllByText(/required/i)).length).toEqual(2);
-});
-
-// Test case 4.3.3
-it("4.3.3 (4.3.3.1 and 4.3.3.2) - Click on Submit Button", async () => {
- const user = userEvent.setup();
-
- // modify the cache
- cache.modify({
- fields: {
- shipments(existingShipments = []) {
- const newShipmentRef = cache.writeFragment({
- // @ts-expect-error TODO: Why this is expecting an id?
- data: successfulMutation.result.data,
- fragment: graphql(`
- fragment NewShipment on Shipment {
- id
- }
- `),
- });
- return existingShipments.concat(newShipmentRef);
- },
- },
- });
-
- render( , {
- routePath: "/bases/:baseId/transfers/shipments/create",
- initialUrl: "/bases/1/transfers/shipments/create",
- additionalRoute: "/bases/1/transfers/shipments/1",
- mocks: [
- initialQueryAllBasesOfCurrentOrg,
- initialQuery,
- successfulMutation,
- initialWithoutBoxQuery,
- ],
- addTypename: true,
- cache,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base1.id, name: base1.name },
- },
- },
- });
-
- const title = await screen.findByRole("heading", { name: "New Shipment" });
- expect(title).toBeInTheDocument();
-
- // Test case 4.3.3.1 - Form data was valid and mutation was successful
- const submitButton = await screen.findByRole("button", { name: /start new shipment/i });
- expect(submitButton).toBeInTheDocument();
-
- await assertOptionsInSelectField(user, /organisation/i, [/boxcare/i], title);
- await selectOptionInSelectField(user, /organisation/i, "BoxCare");
- expect(await screen.findByText("BoxCare")).toBeInTheDocument();
- await assertOptionsInSelectField(user, /base/i, [/samos/i, /thessaloniki/i, /athens/i], title);
- await selectOptionInSelectField(user, /base/i, "Samos");
- expect(await screen.findByText("Samos")).toBeInTheDocument();
-
- await user.click(submitButton);
- await waitFor(() =>
- expect(mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/successfully created a new shipment/i),
- }),
- ),
- );
-
- // Test case 4.3.3.2 - Redirect to Transfers Shipments Page
- expect(
- await screen.findByRole("heading", { name: "/bases/1/transfers/shipments/1" }),
- ).toBeInTheDocument();
-});
-
-// Test case 4.3.3.3
-it("4.3.3.3 - Form data was valid, but the mutation failed", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/transfers/shipments/create",
- initialUrl: "/bases/1/transfers/shipments/create",
- mocks: [initialQueryAllBasesOfCurrentOrg, initialQuery, mutationNetworkError],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base1.id, name: base1.name },
- },
- },
- });
-
- // Test case 4.3.3.3 - Form data was valid, but the mutation failed
- const pageTitle = await screen.findByRole("heading", { name: "New Shipment" });
- expect(pageTitle).toBeInTheDocument();
-
- const submitStartButton = await screen.findByRole("button", { name: /start new shipment/i });
- expect(submitStartButton).toBeInTheDocument();
-
- await assertOptionsInSelectField(user, /organisation/i, [/boxcare/i], pageTitle);
- await selectOptionInSelectField(user, /organisation/i, "BoxCare");
- expect(await screen.findByText("BoxCare")).toBeInTheDocument();
- await selectOptionInSelectField(user, /base/i, "Samos");
- expect(await screen.findByText("Samos")).toBeInTheDocument();
- await user.click(submitStartButton);
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/error while trying to create a new shipment/i),
- }),
- ),
- );
-});
-
-// Test case 4.3.3.4
-it("4.3.3.4 - Form data was valid, but the mutation response has errors", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/transfers/shipments/create",
- initialUrl: "/bases/1/transfers/shipments/create",
- mocks: [initialQueryAllBasesOfCurrentOrg, initialQuery, mutationGraphQLError],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base1.id, name: base1.name },
- },
- },
- });
-
- // Test case 4.3.3.4 - Form data was valid, but the mutation response has errors
- const shipmentPageTitle = await screen.findByRole("heading", { name: "New Shipment" });
- expect(shipmentPageTitle).toBeInTheDocument();
-
- const submitShipmentStartButton = await screen.findByRole("button", {
- name: /Start New Shipment/i,
- });
- expect(submitShipmentStartButton).toBeInTheDocument();
-
- await assertOptionsInSelectField(user, /organisation/i, [/boxcare/i], shipmentPageTitle);
- await selectOptionInSelectField(user, /organisation/i, "BoxCare");
- expect(await screen.findByText("BoxCare")).toBeInTheDocument();
- await selectOptionInSelectField(user, /base/i, "Samos");
- expect(await screen.findByText("Samos")).toBeInTheDocument();
- await user.click(submitShipmentStartButton);
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/error while trying to create a new shipment/i),
- }),
- ),
- );
-});
-
-// TODO: can't make this to work inside the test environment.
-it.skip("4.3.3.5 - Click on Submit Button - Intra-org Shipment", async () => {
- const user = userEvent.setup();
-
- // modify the cache
- cache.modify({
- fields: {
- shipments(existingShipments = []) {
- const newShipmentRef = cache.writeFragment({
- // @ts-expect-error TODO: Why this is expecting an id?
- data: successfulMutation.result.data,
- fragment: graphql(`
- fragment NewShipment on Shipment {
- id
- }
- `),
- });
- return existingShipments.concat(newShipmentRef);
- },
- },
- });
-
- render( , {
- routePath: "/bases/:baseId/transfers/shipments/create",
- // Maybe there's a route and org, base mismatch?
- initialUrl: "/bases/2/transfers/shipments/create",
- additionalRoute: "/bases/2/transfers/shipments/1",
- mocks: [
- initialQueryAllBasesOfCurrentOrg,
- initialQuery,
- successfulMutation,
- initialWithoutBoxQuery,
- ],
- addTypename: true,
- cache,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation2.id, name: organisation2.name },
- availableBases: organisation2.bases,
- selectedBase: { id: base2.id, name: base2.name },
- },
- },
- });
-
- const title = await screen.findByRole("heading", { name: "New Shipment" });
- expect(title).toBeInTheDocument();
-
- const intraOrgTab = await screen.findByRole("tab", { name: /BoxAid - Lesvos/i });
- expect(intraOrgTab).toBeInTheDocument();
- await user.click(intraOrgTab);
-
- // Since this base is the only other base for this test org, it will be already selected.
- expect(await screen.findByText("Samos")).toBeInTheDocument();
-
- // Test case 4.3.3.1 - Form data was valid and mutation was successful
- const submitButton = await screen.findByRole("button", { name: /start new shipment/i });
- expect(submitButton).toBeInTheDocument();
-
- await user.click(submitButton);
-
- await waitFor(() =>
- expect(mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/successfully created a new shipment/i),
- }),
- ),
- );
-
- // Test case 4.3.3.2 - Redirect to Transfers Shipments Page
- expect(
- await screen.findByRole("heading", { name: "/bases/1/transfers/shipments/1" }),
- ).toBeInTheDocument();
-});
-
-// Test case 4.3.4
-describe("4.3.4 - Failed to Fetch Initial Data", () => {
- it("4.3.4.1 - No Partner Organisations and Bases Data", async () => {
- render( , {
- routePath: "/bases/:baseId/transfers/shipment/create",
- initialUrl: "/bases/1/transfers/shipment/create",
- mocks: [initialQueryAllBasesOfCurrentOrg, initialQueryNetworkError],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base1.id, name: base1.name },
- },
- },
- });
-
- // Test case 4.3.4.1 - No Partner Organisations and Bases Data
- expect(
- await screen.findByText(
- /could not fetch Organisation and Base data! Please try reloading the page./i,
- ),
- ).toBeInTheDocument();
- });
-
- // Test case 4.3.4.2
- it("4.3.4.2 - No Agreements Found", async () => {
- render( , {
- routePath: "/bases/:baseId/transfers/shipment/create",
- initialUrl: "/bases/1/transfers/shipment/create",
- mocks: [initialQueryAllBasesOfCurrentOrg, initialQueryWithoutAgreement],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base1.id, name: base1.name },
- },
- },
- });
-
- // Test case 4.3.4.2 - No Accepeted Agreements Found
- expect(
- await screen.findByText(
- /you must have an agreement with a network partner before creating a shipment\./i,
- ),
- ).toBeInTheDocument();
- });
-});
diff --git a/front/src/views/Transfers/CreateTransferAgreement/CreateTransferAgreementView.test.tsx b/front/src/views/Transfers/CreateTransferAgreement/CreateTransferAgreementView.test.tsx
deleted file mode 100644
index 8ebdbdc07..000000000
--- a/front/src/views/Transfers/CreateTransferAgreement/CreateTransferAgreementView.test.tsx
+++ /dev/null
@@ -1,319 +0,0 @@
-import { vi, it, expect } from "vitest";
-import { screen, render, cleanup, fireEvent, waitFor } from "tests/test-utils";
-import { userEvent } from "@testing-library/user-event";
-import { organisation1, organisations } from "mocks/organisations";
-import { assertOptionsInSelectField, selectOptionInSelectField } from "tests/helpers";
-import { addDays } from "date-fns";
-import { base1 } from "mocks/bases";
-import { mockedCreateToast, mockedTriggerError } from "tests/setupTests";
-import CreateTransferAgreementView, {
- ALL_ORGS_AND_BASES_QUERY,
- CREATE_AGREEMENT_MUTATION,
-} from "./CreateTransferAgreementView";
-import { FakeGraphQLError, FakeGraphQLNetworkError } from "mocks/functions";
-
-const initialQuery = {
- request: {
- query: ALL_ORGS_AND_BASES_QUERY,
- variables: {},
- },
- result: {
- data: {
- organisations,
- },
- },
-};
-
-const initialQueryNetworkError = {
- request: {
- query: ALL_ORGS_AND_BASES_QUERY,
- variables: {},
- },
- result: {
- errors: [new FakeGraphQLError()],
- },
-};
-
-const successfulMutation = {
- request: {
- query: CREATE_AGREEMENT_MUTATION,
- variables: {
- initiatingOrganisationId: 1,
- partnerOrganisationId: 2,
- type: "Bidirectional",
- validFrom: new Date().toISOString().substring(0, 10),
- validUntil: undefined,
- initiatingOrganisationBaseIds: [1],
- partnerOrganisationBaseIds: undefined,
- comment: "",
- },
- },
- result: {
- data: {
- createTransferAgreement: {
- id: 1,
- },
- },
- },
-};
-
-const mutationNetworkError = {
- request: {
- query: CREATE_AGREEMENT_MUTATION,
- variables: {
- initiatingOrganisationId: 1,
- partnerOrganisationId: 2,
- type: "Bidirectional",
- validFrom: new Date().toISOString().substring(0, 10),
- validUntil: undefined,
- initiatingOrganisationBaseIds: [1],
- partnerOrganisationBaseIds: undefined,
- comment: "",
- },
- },
- error: new FakeGraphQLNetworkError(),
-};
-
-const mutationIdenticalAgreementError = {
- request: {
- query: CREATE_AGREEMENT_MUTATION,
- variables: {
- initiatingOrganisationId: 1,
- partnerOrganisationId: 2,
- type: "Bidirectional",
- validFrom: new Date().toISOString().substring(0, 10),
- validUntil: undefined,
- initiatingOrganisationBaseIds: [1],
- partnerOrganisationBaseIds: undefined,
- comment: "",
- },
- },
- result: {
- data: { createTransferAgreement: null },
- errors: [new FakeGraphQLError("BAD_USER_INPUT", "An identical agreement already exists: ID 1")],
- },
-};
-
-// Test case 4.1.1
-it("4.1.1 - Initial load of Page", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/transfers/agreements/create",
- initialUrl: "/bases/1/transfers/agreements/create",
- mocks: [initialQuery],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base1.id, name: base1.name },
- },
- },
- });
-
- expect(screen.getByTestId("loading-indicator")).toBeInTheDocument();
-
- const title = await screen.findByRole("heading", { name: "New Transfer Agreement" });
- expect(title).toBeInTheDocument();
- // Breadcrumbs are there
- expect(screen.getByRole("link", { name: /back to manage agreements/i })).toBeInTheDocument();
- // Test case 4.1.1.1 - Content: Displays Source Bases Select Options
- const selectSourceBaseDropDown = screen.getByRole("combobox", { name: /boxaid bases/i });
- expect(selectSourceBaseDropDown).toBeInTheDocument();
- await user.click(selectSourceBaseDropDown);
- expect(await screen.findByText("Lesvos")).toBeInTheDocument();
- // Test case 4.1.1.2 - Content: Displays Partner Orgs Select Options
- await assertOptionsInSelectField(user, /partner organisation/i, [/boxcare/i], title);
- // Test case 4.1.1.3 - Content: Displays Partner Bases Select Options When Partner Organisation Selected
- await selectOptionInSelectField(user, /partner organisation/i, "BoxCare");
- expect(await screen.findByText("BoxCare")).toBeInTheDocument();
- const selectBaseDropDown = screen.getByRole("combobox", { name: /partner bases/i });
- expect(selectBaseDropDown).toBeInTheDocument();
- await user.click(selectBaseDropDown);
- expect(await screen.findByText("Thessaloniki")).toBeInTheDocument();
- expect(await screen.findByText("Samos")).toBeInTheDocument();
- const selectedBase = screen.getByRole("option", { name: /samos/i });
- expect(selectedBase).toBeInTheDocument();
- await user.click(selectedBase);
- // Test case 4.1.1.4 - Content: Display Source Organisation name on the label
- expect(screen.getByText(/boxaid bases/i)).toBeInTheDocument();
-});
-
-// Test case 4.1.2
-it("4.1.2 - Input Validations", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/transfers/agreements/create",
- initialUrl: "/bases/1/transfers/agreements/create",
- mocks: [initialQuery, successfulMutation],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base1.id, name: base1.name },
- },
- },
- });
-
- const submitButton = await screen.findByRole("button", { name: /create agreement/i });
- expect(submitButton).toBeInTheDocument();
-
- // Test case 4.1.2.1 - Source Organisation SELECT field cannot be empty
- const sourceSelectedBaseRemoveButton = screen.getByRole("button", { name: /remove lesvos/i });
- await user.click(sourceSelectedBaseRemoveButton);
- expect(screen.getByText(/please select base\(s\)/i)).toBeInTheDocument();
- await user.click(submitButton);
- expect(screen.getByText(/please select at least one base/i)).toBeInTheDocument();
- // Test case 4.1.2.2 - Partner Organisation SELECT field cannot be empty
- expect(screen.getByText(/please select an organisation/i)).toBeInTheDocument();
- // Test case 4.1.2.4 - The "Valid from" field is optional, but only valid date formats should be entered
- const validFrom = screen.getByLabelText(/valid until/i) as HTMLInputElement;
- const testValueForValidFrom = new Date().toJSON().split("T")[0];
- fireEvent.change(validFrom, { target: { value: testValueForValidFrom } });
- expect(validFrom.value).toEqual(testValueForValidFrom);
-
- // Test case 4.1.2.5 - The "Valid until" field is optional, but only valid date formats should be entered
- await selectOptionInSelectField(user, /partner organisation/i, "BoxCare");
- const validUntil = screen.getByLabelText(/valid until/i) as HTMLInputElement;
- const testInvalidValueForValidUntil = addDays(new Date(), -2).toJSON().split("T")[0];
- await user.type(validUntil, testInvalidValueForValidUntil);
- fireEvent.change(validUntil, { target: { value: testInvalidValueForValidUntil } });
- expect(validUntil.value).toEqual(testInvalidValueForValidUntil);
- await user.click(submitButton);
- expect(
- await screen.findByText(/please enter a greater date for the valid until/i),
- ).toBeInTheDocument();
-});
-
-// Test case 4.1.3
-it("4.1.3 - Click on Submit Button", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/transfers/agreements/create",
- initialUrl: "/bases/1/transfers/agreements/create",
- additionalRoute: "/bases/1/transfers/agreements",
- mocks: [initialQuery, successfulMutation],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base1.id, name: base1.name },
- },
- },
- });
-
- const submitButton = await screen.findByRole("button", { name: /create agreement/i });
- expect(submitButton).toBeInTheDocument();
-
- // Test case 4.1.3.1 - Form data was valid and mutation was successful
- await selectOptionInSelectField(user, /partner organisation/i, "BoxCare");
- await user.click(submitButton);
- await waitFor(() =>
- expect(mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/successfully created a transfer agreement/i),
- }),
- ),
- );
- // Test case 4.1.3.2 - Redirect to Transfers Agreements Page
- expect(
- await screen.findByRole("heading", { name: "/bases/1/transfers/agreements" }),
- ).toBeInTheDocument();
-
- // Test case 4.1.3.3 - Form data was valid, but the mutation failed
- cleanup();
- render( , {
- routePath: "/bases/:baseId/transfers/agreements/create",
- initialUrl: "/bases/1/transfers/agreements/create",
- mocks: [initialQuery, mutationNetworkError],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base1.id, name: base1.name },
- },
- },
- });
-
- const rerenderedSubmitButton = await screen.findByRole("button", { name: /create agreement/i });
- expect(rerenderedSubmitButton).toBeInTheDocument();
- await selectOptionInSelectField(user, /partner organisation/i, "BoxCare");
- await user.click(rerenderedSubmitButton);
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/your changes could not be saved!/i),
- }),
- ),
- );
-});
-
-// Test case 4.1.4
-it("4.1.4 - Failed to Fetch Initial Data", async () => {
- // const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/transfers/agreements/create",
- initialUrl: "/bases/1/transfers/agreements/create",
- mocks: [initialQueryNetworkError],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base1.id, name: base1.name },
- },
- },
- });
-
- // Test case 4.1.4.1 - No Partner Organisations and Bases Data
- expect(
- await screen.findByText(
- /could not fetch Organisation and Base data! Please try reloading the page./i,
- ),
- ).toBeInTheDocument();
-});
-
-// Test case 4.1.5
-it("4.1.5 - Failed due to the identical agreement", async () => {
- cleanup();
- const user = userEvent.setup();
- cleanup();
- render( , {
- routePath: "/bases/:baseId/transfers/agreements/create",
- initialUrl: "/bases/1/transfers/agreements/create",
- mocks: [initialQuery, mutationIdenticalAgreementError],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: { id: base1.id, name: base1.name },
- },
- },
- });
-
- const rerenderedSubmitButton = await screen.findByRole("button", { name: /create agreement/i });
- expect(rerenderedSubmitButton).toBeInTheDocument();
- await selectOptionInSelectField(user, /partner organisation/i, "BoxCare");
-
- await user.click(rerenderedSubmitButton);
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(/error while trying to create transfer agreement/i),
- }),
- ),
- );
- expect(
- await screen.findByText(/Can’t create agreement, an active identical agreement exists/i),
- ).toBeInTheDocument();
-});
diff --git a/front/src/views/Transfers/ShipmentView/ShipmentView.test.tsx b/front/src/views/Transfers/ShipmentView/ShipmentView.test.tsx
deleted file mode 100644
index 3845f7dfd..000000000
--- a/front/src/views/Transfers/ShipmentView/ShipmentView.test.tsx
+++ /dev/null
@@ -1,390 +0,0 @@
-import { vi, beforeEach, it, describe, expect } from "vitest";
-import { screen, render, waitFor } from "tests/test-utils";
-import { organisation1 } from "mocks/organisations";
-import { generateMockShipment, generateMockShipmentWithCustomDetails } from "mocks/shipments";
-import { generateMockBox } from "mocks/boxes";
-import { userEvent } from "@testing-library/user-event";
-import { FakeGraphQLError, mockMatchMediaQuery } from "mocks/functions";
-import { generateMockShipmentDetail } from "mocks/shipmentDetail";
-import ShipmentView, { SHIPMENT_BY_ID_QUERY } from "./ShipmentView";
-
-const initialQuery = {
- request: {
- query: SHIPMENT_BY_ID_QUERY,
- variables: {
- id: "1",
- },
- },
- result: {
- data: {
- shipment: generateMockShipment({ state: "Preparing" }),
- },
- },
-};
-
-const initialWithGroupedItemQuery = {
- request: {
- query: SHIPMENT_BY_ID_QUERY,
- variables: {
- id: "1",
- },
- },
- result: {
- data: {
- shipment: generateMockShipmentWithCustomDetails({
- state: "Preparing",
- details: [
- generateMockShipmentDetail({ id: "1", box: generateMockBox({ labelIdentifier: "123" }) }),
- generateMockShipmentDetail({
- id: "2",
- box: generateMockBox({ labelIdentifier: "124", numberOfItems: 20 }),
- sourceQuantity: 20,
- }),
- ],
- }),
- },
- },
-};
-
-const initialWithoutBoxQuery = {
- request: {
- query: SHIPMENT_BY_ID_QUERY,
- variables: {
- id: "1",
- },
- },
- result: {
- data: {
- shipment: generateMockShipment({ state: "Preparing", hasBoxes: false }),
- },
- },
-};
-
-const initialCompletedShipemntQuery = {
- request: {
- query: SHIPMENT_BY_ID_QUERY,
- variables: {
- id: "1",
- },
- },
- result: {
- data: {
- shipment: generateMockShipmentWithCustomDetails({
- state: "Completed",
- details: [
- generateMockShipmentDetail({ id: "1", box: generateMockBox({ labelIdentifier: "123" }) }),
- generateMockShipmentDetail({
- id: "2",
- box: generateMockBox({ labelIdentifier: "124", numberOfItems: 20 }),
- sourceQuantity: 20,
- }),
- generateMockShipmentDetail({
- id: "3",
- box: generateMockBox({
- labelIdentifier: "125",
- numberOfItems: 20,
- state: "Lost",
- }),
- sourceQuantity: 20,
- }),
- ],
- }),
- },
- },
-};
-
-const initialQueryNetworkError = {
- request: {
- query: SHIPMENT_BY_ID_QUERY,
- variables: {
- id: "1",
- },
- },
- result: {
- errors: [new FakeGraphQLError()],
- },
-};
-
-const initialRecevingUIAsSourceOrgQuery = {
- request: {
- query: SHIPMENT_BY_ID_QUERY,
- variables: {
- id: "1",
- },
- },
- result: {
- data: {
- shipment: generateMockShipment({
- state: "Receiving",
- iAmSource: true,
- hasBoxes: true,
- }),
- },
- },
-};
-
-const initialRecevingUIAsTargetOrgQuery = {
- request: {
- query: SHIPMENT_BY_ID_QUERY,
- variables: {
- id: "1",
- },
- },
- result: {
- data: {
- shipment: generateMockShipment({
- state: "Receiving",
- iAmSource: false,
- hasBoxes: true,
- }),
- },
- },
-};
-
-beforeEach(() => {
- // setting the screensize to
- mockMatchMediaQuery(true);
-});
-
-describe("4.5 Test Cases", () => {
- beforeEach(() => {
- // setting the screensize to
- mockMatchMediaQuery(true);
- });
-
- // Test case 4.5.1
- it("4.5.1 - Initial load of Page", async () => {
- // const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/transfers/shipments/:id",
- initialUrl: "/bases/1/transfers/shipments/1",
- mocks: [initialQuery],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: organisation1.bases[0],
- },
- },
- });
-
- expect(screen.getByTestId("loader")).toBeInTheDocument();
-
- await waitFor(() => {
- expect(screen.getByRole("tab", { name: /content/i })).toBeInTheDocument();
- });
-
- const title = screen.getByText(/prepare shipment/i);
- expect(title).toBeInTheDocument();
- // // Test case 4.5.1.1 - Content: Displays Shipment Source and Target Bases
- expect(screen.getByText(/lesvos/i)).toBeInTheDocument();
- expect(screen.getByText(/thessaloniki/i)).toBeInTheDocument();
- // Test case 4.5.1.2 - Content: Displays Shipment status
- expect(screen.getByText(/PREPARING/)).toBeInTheDocument();
- // // Test case 4.5.1.3 - Content: Displays total number of boxes
- expect(screen.getByRole("heading", { name: /\b2\b/i })).toBeInTheDocument();
- // // Test case 4.5.1.5 - Displays Content tab initially
- expect(screen.getByRole("tab", { name: /content/i, selected: true })).toHaveTextContent(
- "Content",
- );
- // Breadcrumbs are there
- expect(screen.getByRole("link", { name: /back to manage shipments/i })).toBeInTheDocument();
- }, 10000);
-
- // Test case 4.5.1.4
-
- it("4.5.1.4 - Content: When shipment does not contains any products display correct message", async () => {
- render( , {
- routePath: "/bases/:baseId/transfers/shipments/:id",
- initialUrl: "/bases/1/transfers/shipments/1",
- mocks: [initialWithoutBoxQuery],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: organisation1.bases[0],
- },
- },
- });
-
- await waitFor(() => {
- expect(screen.getByRole("tab", { name: /content/i })).toBeInTheDocument();
- });
-
- const title = await screen.findByText(/prepare shipment/i);
- expect(title).toBeInTheDocument();
- // Test case 4.5.1.4 - Content: When shipment does not contains any products display correct message
- expect(
- screen.getByText(/no boxes have been assigned to this shipment yet!/i),
- ).toBeInTheDocument();
- }, 10000);
-
- // Test case 4.5.1.6
-
- it("4.5.1.6 - Show the number of items per box and the sum of the items grouped together", async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/transfers/shipments/:id",
- initialUrl: "/bases/1/transfers/shipments/1",
- mocks: [initialWithGroupedItemQuery],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: organisation1.bases[0],
- },
- },
- });
-
- await waitFor(() => {
- expect(screen.getByRole("tab", { name: /content/i })).toBeInTheDocument();
- });
-
- const title = screen.getByText(/prepare shipment/i);
- expect(title).toBeInTheDocument();
-
- // Test case 4.5.1.6 - Show the number of items per box and the sum of the items grouped together
- const groupItemNameWithCount = screen.getByTestId("shipment-grouped-item-name");
- expect(groupItemNameWithCount).toHaveTextContent("Long Sleeves Women (30x)");
-
- const groupedItemAccordionButton = screen.getByTestId("shipment-accordion-button-1");
- expect(groupedItemAccordionButton).toBeInTheDocument();
- // expanding the accordion
- user.click(groupedItemAccordionButton);
-
- // check if cell with number of items equals to 20 is displayed
- await screen.findByRole(
- "cell",
- {
- name: /20/i,
- },
- { timeout: 10000 },
- );
- // check if cell with number of items equals to 10 is displayed
- screen.getByRole("cell", {
- name: /10/i,
- });
-
- expect(screen.getByText(/30x/i)).toBeInTheDocument();
- }, 10000);
-
- // Test case 4.5.2
- it("4.5.2 - Failed to Fetch Initial Data", async () => {
- render( , {
- routePath: "/bases/:baseId/transfers/shipments/:id",
- initialUrl: "/bases/1/transfers/shipments/1",
- mocks: [initialQueryNetworkError],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: organisation1.bases[0],
- },
- },
- });
-
- expect(
- await screen.findByText(/could not fetch Shipment data! Please try reloading the page./i),
- ).toBeInTheDocument();
- });
-
- // Test case 4.5.3
- it("4.5.3 - Initial load of Receiving UI As Target Organisation", async () => {
- // const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/transfers/shipments/:id",
- initialUrl: "/bases/1/transfers/shipments/1",
- mocks: [initialRecevingUIAsTargetOrgQuery],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: organisation1.bases[0],
- },
- },
- });
-
- expect(screen.getByTestId("loader")).toBeInTheDocument();
-
- await waitFor(() => {
- const title = screen.getByRole("heading", { name: /receiving shipment/i });
- expect(title);
- });
-
- expect(
- screen.getByRole("cell", { name: /124 long sleeves \(12x\) size: mixed/i }),
- ).toBeInTheDocument();
- }, 10000);
-
- // Test case 4.5.4
- it("4.5.4 - Initial load of Receiving UI As Source Organisation", async () => {
- // const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/transfers/shipments/:id",
- initialUrl: "/bases/1/transfers/shipments/1",
- mocks: [initialRecevingUIAsSourceOrgQuery],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: organisation1.bases[0],
- },
- },
- });
-
- expect(screen.getByTestId("loader")).toBeInTheDocument();
-
- await waitFor(() => {
- const title = screen.getByRole("heading", { name: /view shipment/i });
- expect(title);
- });
- }, 10000);
-});
-
-// Test case 4.5.5
-it("4.5.5 - Shows total count of the boxes when shipment completed", async () => {
- // const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/transfers/shipments/:id",
- initialUrl: "/bases/1/transfers/shipments/1",
- mocks: [initialCompletedShipemntQuery],
- addTypename: true,
- globalPreferences: {
- dispatch: vi.fn(),
- globalPreferences: {
- organisation: { id: organisation1.id, name: organisation1.name },
- availableBases: organisation1.bases,
- selectedBase: organisation1.bases[0],
- },
- },
- });
-
- expect(screen.getByTestId("loader")).toBeInTheDocument();
-
- await waitFor(() => {
- expect(screen.getByRole("tab", { name: /content/i })).toBeInTheDocument();
- });
-
- const title = screen.getByText(/view shipment/i);
- expect(title).toBeInTheDocument();
-
- expect(screen.getByText(/COMPLETE/)).toBeInTheDocument();
-
- expect(screen.getByRole("heading", { name: /\b3\b/i })).toBeInTheDocument();
-
- expect(screen.getByRole("tab", { name: /content/i, selected: true })).toHaveTextContent(
- "Content",
- );
-}, 10000);
diff --git a/front/src/views/Transfers/ShipmentsOverview/ShipmentsOverview.test.tsx b/front/src/views/Transfers/ShipmentsOverview/ShipmentsOverview.test.tsx
deleted file mode 100644
index 41623fe4f..000000000
--- a/front/src/views/Transfers/ShipmentsOverview/ShipmentsOverview.test.tsx
+++ /dev/null
@@ -1,85 +0,0 @@
-import { it, expect } from "vitest";
-import { screen, render } from "tests/test-utils";
-import { mockGraphQLError, mockNetworkError } from "mocks/functions";
-import { generateMockShipment } from "mocks/shipments";
-import { ALL_SHIPMENTS_QUERY } from "queries/queries";
-import ShipmentsOverviewView from "./ShipmentsOverviewView";
-import userEvent from "@testing-library/user-event";
-
-const mockSuccessfulShipmentsQuery = ({
- query = ALL_SHIPMENTS_QUERY,
- state = "Preparing",
- iAmSource = true,
-}) => ({
- request: {
- query,
- },
- result: {
- data: {
- shipments: [generateMockShipment({ state, iAmSource })],
- },
- },
-});
-
-const failedQueryTests = [
- {
- name: "4.4.1.2a - Accept Transfer Agreement fails due to GraphQLError",
- mocks: [mockGraphQLError(ALL_SHIPMENTS_QUERY)],
- },
- {
- name: "4.4.1.2b - Accept Transfer Agreement fails due to NetworkError",
- mocks: [mockNetworkError(ALL_SHIPMENTS_QUERY)],
- },
-];
-
-failedQueryTests.forEach(({ name, mocks }) => {
- it(
- name,
- async () => {
- render( , {
- routePath: "/bases/:baseId/transfers/shipments",
- initialUrl: "/bases/1/transfers/shipments",
- mocks,
- });
-
- // Check if Error is shown
- expect(await screen.findByTestId("ErrorAlert")).toBeInTheDocument();
- expect(screen.getByText(/Could not fetch shipment data/i)).toBeInTheDocument();
- // Check if Table is not shown
- expect(screen.queryByRole("table")).not.toBeInTheDocument();
- },
- 10000,
- );
-});
-
-it("4.4.1.4 - Initial Load of Page", async () => {
- render( , {
- routePath: "/bases/:baseId/transfers/shipments",
- initialUrl: "/bases/1/transfers/shipments",
- mocks: [mockSuccessfulShipmentsQuery({})],
- });
-
- // 4.4.1.1 - Is the Loading State Shown First?
- // expect(await screen.findByTestId("TableSkeleton")).toBeInTheDocument();
-
- const user = userEvent.setup();
- user.click(screen.getByText(/Sending \(/i));
- // Data of Mock Transfer is shown correctly
- expect(await screen.findByRole("cell", { name: /thessaloniki boxcare/i })).toBeInTheDocument();
- // Display the filtered count for "Sending" shipments.
- expect(screen.getByText(/Sending \(1\)/i)).toBeInTheDocument();
- expect(screen.getByRole("cell", { name: /preparing/i })).toBeInTheDocument();
- expect(screen.getByRole("cell", { name: /2 boxes/i })).toBeInTheDocument();
- expect(screen.getByRole("cell", { name: /2\/1\/2023/i })).toBeInTheDocument();
- // Breadcrumbs are there
- expect(
- screen.getByRole("link", {
- name: /aid transfers/i,
- }),
- ).toBeInTheDocument();
- expect(
- screen.getByRole("link", {
- name: /manage shipments/i,
- }),
- ).toBeInTheDocument();
-});
diff --git a/front/src/views/Transfers/TransferAgreementOverview/TransferAgreementOverview.test.tsx b/front/src/views/Transfers/TransferAgreementOverview/TransferAgreementOverview.test.tsx
deleted file mode 100644
index da0ea9f48..000000000
--- a/front/src/views/Transfers/TransferAgreementOverview/TransferAgreementOverview.test.tsx
+++ /dev/null
@@ -1,301 +0,0 @@
-import { it, expect } from "vitest";
-import { userEvent } from "@testing-library/user-event";
-import { screen, render, waitFor } from "tests/test-utils";
-import { generateMockTransferAgreement } from "mocks/transferAgreements";
-import { mockGraphQLError, mockNetworkError } from "mocks/functions";
-import { mockedCreateToast, mockedTriggerError } from "tests/setupTests";
-import TransferAgreementOverviewView, {
- ACCEPT_TRANSFER_AGREEMENT,
- ALL_TRANSFER_AGREEMENTS_QUERY,
- CANCEL_TRANSFER_AGREEMENT,
- REJECT_TRANSFER_AGREEMENT,
-} from "./TransferAgreementOverviewView";
-import { TadaDocumentNode } from "gql.tada";
-
-const mockSuccessfulTransferAgreementsQuery = ({
- query = ALL_TRANSFER_AGREEMENTS_QUERY,
- variables = {},
- state = "UnderReview",
- type = "Bidirectional",
- isInitiator = true,
-}) => ({
- request: {
- query,
- variables,
- },
- result: {
- data: {
- transferAgreements: [generateMockTransferAgreement({ state, type, isInitiator })],
- },
- },
-});
-
-it("4.2.2a - Failed to Fetch Initial Data (GraphQlError)", async () => {
- render( , {
- routePath: "/bases/:baseId/transfers/agreements",
- initialUrl: "/bases/1/transfers/agreements",
- mocks: [mockGraphQLError(ALL_TRANSFER_AGREEMENTS_QUERY)],
- });
-
- // Check if Error is shown
- expect(await screen.findByTestId("ErrorAlert")).toBeInTheDocument();
- // Check if Table is not shown
- expect(screen.queryByRole("table")).not.toBeInTheDocument();
-}, 10000);
-
-it("4.2.2b - Failed to Fetch Initial Data (NetworkError)", async () => {
- render( , {
- routePath: "/bases/:baseId/transfers/agreements",
- initialUrl: "/bases/1/transfers/agreements",
- mocks: [mockNetworkError(ALL_TRANSFER_AGREEMENTS_QUERY)],
- });
-
- // Check if Error is shown
- expect(await screen.findByTestId("ErrorAlert")).toBeInTheDocument();
- // Check if Table is not shown
- expect(screen.queryByRole("table")).not.toBeInTheDocument();
-});
-
-it("4.2.1 - Initial Load of Page", async () => {
- render( , {
- routePath: "/bases/:baseId/transfers/agreements",
- initialUrl: "/bases/1/transfers/agreements",
- mocks: [mockSuccessfulTransferAgreementsQuery({})],
- });
-
- // 4.2.1.1 - Is the Loading State Shown First?
- // expect(await screen.findByTestId("TableSkeleton")).toBeInTheDocument();
-
- // Data of Mock Transfer is shown correctly
- expect(await screen.findByRole("cell", { name: /to \/ from/i })).toBeInTheDocument();
- expect(screen.getByRole("cell", { name: /boxcare/i })).toBeInTheDocument();
- expect(screen.getByRole("cell", { name: /pending/i })).toBeInTheDocument();
- expect(screen.getByRole("link", { name: /thessaloniki \(1\)/i })).toBeInTheDocument();
- expect(screen.getByRole("cell", { name: /Good Comment/i })).toBeInTheDocument();
- expect(screen.getByRole("cell", { name: /1\/1\/2024/i })).toBeInTheDocument();
- // Breadcrumbs are there
- expect(
- screen.getByRole("link", {
- name: /aid transfers/i,
- }),
- ).toBeInTheDocument();
- expect(
- screen.getByRole("link", {
- name: /my network/i,
- }),
- ).toBeInTheDocument();
-});
-
-const failedMutationTests = [
- {
- name: "4.2.3.1a - Accept Transfer Agreement fails due to GraphQLError",
- mocks: [
- mockSuccessfulTransferAgreementsQuery({ isInitiator: false }),
- mockGraphQLError(ACCEPT_TRANSFER_AGREEMENT, { id: "1" }),
- ],
- stateButtonText: /request open/i,
- modalButtonText: /Accept/i,
- toastText: /could not accept/i,
- },
- {
- name: "4.2.3.1b - Accept Transfer Agreement fails due to NetworkError",
- mocks: [
- mockSuccessfulTransferAgreementsQuery({ isInitiator: false }),
- mockNetworkError(ACCEPT_TRANSFER_AGREEMENT, { id: "1" }),
- ],
- stateButtonText: /request open/i,
- modalButtonText: /Accept/i,
- toastText: /could not accept/i,
- },
- {
- name: "4.2.4.1a - Reject Transfer Agreement fails due to GraphQLError",
- mocks: [
- mockSuccessfulTransferAgreementsQuery({
- type: "SendingTo",
- isInitiator: false,
- }),
- mockGraphQLError(REJECT_TRANSFER_AGREEMENT, { id: "1" }),
- ],
- stateButtonText: /request open/i,
- modalButtonText: /Reject/i,
- toastText: /could not reject/i,
- },
- {
- name: "4.2.4.1b - Reject Transfer Agreement fails due to NetworkError",
- mocks: [
- mockSuccessfulTransferAgreementsQuery({
- type: "ReceivingFrom",
- isInitiator: false,
- }),
- mockNetworkError(REJECT_TRANSFER_AGREEMENT, { id: "1" }),
- ],
- stateButtonText: /request open/i,
- modalButtonText: /Reject/i,
- toastText: /could not reject/i,
- },
- {
- name: "4.2.5.1a - Cancel Transfer Agreement fails due to GraphQLError",
- mocks: [
- mockSuccessfulTransferAgreementsQuery({ state: "Accepted" }),
- mockGraphQLError(CANCEL_TRANSFER_AGREEMENT, { id: "1" }),
- ],
- stateButtonText: /accepted/i,
- modalButtonText: /terminate/i,
- toastText: /could not cancel/i,
- },
- {
- name: "4.2.5.1b - Cancel Transfer Agreement fails due to NetworkError",
- mocks: [
- mockSuccessfulTransferAgreementsQuery({ state: "Accepted" }),
- mockNetworkError(CANCEL_TRANSFER_AGREEMENT, { id: "1" }),
- ],
- stateButtonText: /accepted/i,
- modalButtonText: /terminate/i,
- toastText: /could not cancel/i,
- },
-];
-
-failedMutationTests.forEach(({ name, mocks, stateButtonText, modalButtonText, toastText }) => {
- it(name, async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/transfers/agreements",
- initialUrl: "/bases/1/transfers/agreements",
- mocks,
- });
-
- // click the button in the state column
- const stateButton = await screen.findByRole("button", { name: stateButtonText });
- expect(stateButton).toBeInTheDocument();
- await user.click(stateButton);
-
- // click the button in the modal
- const modalButton = await screen.findByRole("button", { name: modalButtonText });
- expect(modalButton).toBeInTheDocument();
- await user.click(modalButton);
-
- // error toast shown and overlay is still open
- await waitFor(() =>
- expect(mockedTriggerError).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(toastText),
- }),
- ),
- );
-
- expect(modalButton).toBeInTheDocument();
- });
-});
-
-const mockSuccessfulMutation = ({
- mutation = ACCEPT_TRANSFER_AGREEMENT as TadaDocumentNode,
- mutationKey = "acceptTransferAgreement",
- state = "UnderReview",
- type = "Bidirectional",
- isInitiator = true,
-}) => {
- const mockObject = {
- request: {
- query: mutation,
- variables: { id: "1" },
- },
- result: {
- data: {},
- },
- };
- mockObject.result.data[mutationKey] = generateMockTransferAgreement({ state, type, isInitiator });
- return mockObject;
-};
-
-const successfulMutationTests = [
- {
- name: "4.2.3 - Accept Transfer Agreement",
- mocks: [
- mockSuccessfulTransferAgreementsQuery({ isInitiator: false }),
- mockSuccessfulMutation({ state: "Accepted", isInitiator: false }),
- ],
- stateButtonTextBefore: /request open/i,
- stateButtonTextAfter: "Accepted",
- modalButtonText: "Accept",
- toastText: /successfully accepted/i,
- },
- {
- name: "4.2.4 - Reject Transfer Agreement",
- mocks: [
- mockSuccessfulTransferAgreementsQuery({
- type: "ReceivingFrom",
- isInitiator: false,
- }),
- mockSuccessfulMutation({
- mutation: REJECT_TRANSFER_AGREEMENT,
- mutationKey: "rejectTransferAgreement",
- state: "Rejected",
- type: "ReceivingFrom",
- isInitiator: false,
- }),
- ],
- stateButtonTextBefore: /request open/i,
- stateButtonTextAfter: /declined/i,
- modalButtonText: "Reject",
- toastText: /successfully rejected/i,
- },
- {
- name: "4.2.5 - Cancel Transfer Agreement",
- mocks: [
- mockSuccessfulTransferAgreementsQuery({
- state: "Accepted",
- isInitiator: false,
- }),
- mockSuccessfulMutation({
- mutation: CANCEL_TRANSFER_AGREEMENT,
- mutationKey: "cancelTransferAgreement",
- state: "Canceled",
- isInitiator: false,
- }),
- ],
- stateButtonTextBefore: "Accepted",
- stateButtonTextAfter: "Ended",
- modalButtonText: "Terminate",
- toastText: /successfully canceled/i,
- },
-];
-
-successfulMutationTests.forEach(
- ({ name, mocks, stateButtonTextBefore, stateButtonTextAfter, modalButtonText, toastText }) => {
- it(
- name,
- async () => {
- const user = userEvent.setup();
- render( , {
- routePath: "/bases/:baseId/transfers/agreements",
- initialUrl: "/bases/1/transfers/agreements",
- mocks,
- });
-
- // click the button in the state column
- const stateButton = await screen.findByRole("button", { name: stateButtonTextBefore });
- expect(stateButton).toBeInTheDocument();
- await user.click(stateButton);
-
- // click the button in the modal
- const modalButton = await screen.findByRole("button", { name: modalButtonText });
- expect(modalButton).toBeInTheDocument();
- await user.click(modalButton);
-
- // success toast is shown and state Button changed
- await waitFor(() =>
- expect(mockedCreateToast).toHaveBeenCalledWith(
- expect.objectContaining({
- message: expect.stringMatching(toastText),
- }),
- ),
- );
- expect(
- await screen.findByRole("button", { name: stateButtonTextAfter }),
- ).toBeInTheDocument();
- expect(screen.queryByRole("button", { name: modalButtonText })).not.toBeInTheDocument();
- },
- 10000,
- );
- },
-);
diff --git a/front/tsconfig.json b/front/tsconfig.json
index 23eced1c4..df0f456a2 100644
--- a/front/tsconfig.json
+++ b/front/tsconfig.json
@@ -10,5 +10,12 @@
"noImplicitAny": false
},
/* "types": ["vite/client"], not sure if needed */
- "include": ["src"]
+ "include": [
+ "src",
+ "../graphql/*.ts",
+ "../tests/*.ts",
+ "../playwright.config.ts",
+ "../global-setup.ts",
+ "browser.ts"
+ ]
}
diff --git a/front/vite.config.ts b/front/vite.config.ts
index 5c927813c..d08988e80 100644
--- a/front/vite.config.ts
+++ b/front/vite.config.ts
@@ -10,6 +10,9 @@ export default defineConfig({
port: 3000,
},
envPrefix: "FRONT_",
+ build: {
+ target: 'esnext'
+ },
test: {
globals: true,
environment: "jsdom",
diff --git a/global-setup.ts b/global-setup.ts
new file mode 100644
index 000000000..f954b47c0
--- /dev/null
+++ b/global-setup.ts
@@ -0,0 +1,16 @@
+import { chromium, expect, type FullConfig } from '@playwright/test';
+
+async function globalSetup(config: FullConfig) {
+ const { baseURL, storageState } = config.projects[0].use;
+ const browser = await chromium.launch();
+ const page = await browser.newPage();
+ await page.goto(baseURL!, { waitUntil: "domcontentloaded" });
+ await page.getByLabel('Email address').fill('dev_coordinator@boxcare.org');
+ await page.getByLabel('Password').fill('Browser_tests');
+ await page.getByText('Continue').click();
+ await expect(page.getByText("Settings")).toBeVisible({ timeout: 30000 });
+ await page.context().storageState({ path: storageState as string });
+ await browser.close();
+}
+
+export default globalSetup;
diff --git a/package.json b/package.json
index 02cd80a0e..ed90291cd 100644
--- a/package.json
+++ b/package.json
@@ -13,16 +13,17 @@
"lint:all": "pnpm lint shared-components front statviz",
"lint:all:fix": "pnpm lint:fix shared-components front statviz",
"graphql-gen": "cat ./back/boxtribute_server/graph_ql/definitions/basic/*.graphql ./back/boxtribute_server/graph_ql/definitions/protected/*.graphql ./back/boxtribute_server/graph_ql/definitions/public/types.graphql > ./graphql/generated/schema.graphql && pnpm gql-tada generate output",
- "test": "TZ=UTC vitest",
+ "test": "TZ=UTC pnpm exec playwright test",
+ "test:ui": "TZ=UTC pnpm exec playwright test --ui",
+ "test:record": "TZ=UTC pnpm exec playwright codegen localhost:3000",
"test:coverage": "TZ=UTC vitest run --coverage",
+ "upload:test-report": "./node_modules/.bin/codecov",
"prepare": "husky || true"
},
"dependencies": {
"@apollo/client": "^3.12.2",
"@chakra-ui/icons": "^2.2.4",
"@chakra-ui/react": "2.8.2",
- "@emotion/react": "^11.14.0",
- "@emotion/styled": "^11.14.0",
"@hookform/resolvers": "^3.10.0",
"@nivo/bar": "0.88.0",
"@nivo/core": "0.88.0",
@@ -52,9 +53,8 @@
"zod": "^3.24.1"
},
"devDependencies": {
- "@testing-library/jest-dom": "^6.6.3",
- "@testing-library/react": "^16.1.0",
- "@testing-library/user-event": "^14.5.2",
+ "@playwright/test": "^1.49.0",
+ "@types/node": "^22.10.1",
"@types/react": "^18.3.13",
"@types/react-dom": "^18.3.1",
"@typescript-eslint/eslint-plugin": "^8.20.0",
@@ -70,9 +70,8 @@
"eslint-plugin-react": "^7.37.4",
"eslint-plugin-react-hooks": "^5.1.0",
"eslint-plugin-react-refresh": "^0.4.18",
- "eslint-plugin-testing-library": "^7.1.1",
- "jsdom": "26.0.0",
"lint-staged": "^15.4.1",
+ "msw": "^2.7.0",
"prettier": "^3.4.2",
"tsc-files": "^1.1.4",
"typescript": "^5.7.3",
@@ -83,5 +82,10 @@
"lint-staged": {
"!(**/generated/*).{js,ts,tsx}": "pnpm lint:fix",
"*.{js,json,ts,tsx}": "prettier --write"
+ },
+ "msw": {
+ "workerDirectory": [
+ "./front/public"
+ ]
}
}
diff --git a/playwright.config.ts b/playwright.config.ts
new file mode 100644
index 000000000..ca42e972a
--- /dev/null
+++ b/playwright.config.ts
@@ -0,0 +1,86 @@
+import { defineConfig, devices } from '@playwright/test';
+
+/**
+ * Read environment variables from file.
+ * https://github.com/motdotla/dotenv
+ */
+// import dotenv from 'dotenv';
+// import path from 'path';
+// dotenv.config({ path: path.resolve(__dirname, '.env') });
+
+/**
+ * See https://playwright.dev/docs/test-configuration.
+ */
+export default defineConfig({
+ testDir: './tests',
+ testIgnore: process.env.CI ? '*local.spec.ts' : undefined,
+ /* Run tests in files in parallel */
+ fullyParallel: true,
+ /* Fail the build on CI if you accidentally left test.only in the source code. */
+ forbidOnly: !!process.env.CI,
+ /* Retry on CI only */
+ retries: process.env.CI ? 2 : 0,
+ /* Opt out of parallel tests on CI. */
+ workers: process.env.CI ? 1 : undefined,
+ /* Reporter to use. See https://playwright.dev/docs/test-reporters */
+ reporter: 'html',
+ globalSetup: require.resolve('./global-setup'),
+ /* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
+ use: {
+ /* Base URL to use in actions like `await page.goto('/')`. */
+ // baseURL: 'http://127.0.0.1:3000',
+
+ baseURL: 'http://localhost:3000/',
+ storageState: 'state.json',
+ /* Collect trace when retrying the failed test. See https://playwright.dev/docs/trace-viewer */
+ trace: 'on-first-retry',
+ },
+
+ /* Configure projects for major browsers */
+ projects: [
+ // Setup project
+ // { name: 'setup', testMatch: /.*\.setup\.ts/ },
+ {
+ name: 'chromium',
+ use: { ...devices['Desktop Chrome'] },
+ // dependencies: ['setup'],
+ },
+
+ // {
+ // name: 'firefox',
+ // use: { ...devices['Desktop Firefox'] },
+ // },
+
+ // {
+ // name: 'webkit',
+ // use: { ...devices['Desktop Safari'] },
+ // },
+
+ /* Test against mobile viewports. */
+ // {
+ // name: 'Mobile Chrome',
+ // use: { ...devices['Pixel 5'] },
+ // },
+ // {
+ // name: 'Mobile Safari',
+ // use: { ...devices['iPhone 12'] },
+ // },
+
+ /* Test against branded browsers. */
+ // {
+ // name: 'Microsoft Edge',
+ // use: { ...devices['Desktop Edge'], channel: 'msedge' },
+ // },
+ // {
+ // name: 'Google Chrome',
+ // use: { ...devices['Desktop Chrome'], channel: 'chrome' },
+ // },
+ ],
+
+ /* Run your local dev server before starting the tests */
+ webServer: {
+ command: 'npm -C front/ run dev',
+ url: 'http://localhost:3000',
+ reuseExistingServer: !process.env.CI,
+ },
+});
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 118422359..44a45cb40 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -17,12 +17,6 @@ importers:
'@chakra-ui/react':
specifier: 2.8.2
version: 2.8.2(@emotion/react@11.14.0(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(framer-motion@11.12.0(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@emotion/react':
- specifier: ^11.14.0
- version: 11.14.0(@types/react@18.3.14)(react@18.3.1)
- '@emotion/styled':
- specifier: ^11.14.0
- version: 11.14.0(@emotion/react@11.14.0(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1)
'@hookform/resolvers':
specifier: ^3.10.0
version: 3.10.0(react-hook-form@7.54.2(react@18.3.1))
@@ -105,15 +99,12 @@ importers:
specifier: ^3.24.1
version: 3.24.1
devDependencies:
- '@testing-library/jest-dom':
- specifier: ^6.6.3
- version: 6.6.3
- '@testing-library/react':
- specifier: ^16.1.0
- version: 16.1.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@testing-library/user-event':
- specifier: ^14.5.2
- version: 14.5.2(@testing-library/dom@10.4.0)
+ '@playwright/test':
+ specifier: ^1.49.0
+ version: 1.49.1
+ '@types/node':
+ specifier: ^22.10.1
+ version: 22.10.1
'@types/react':
specifier: ^18.3.13
version: 18.3.14
@@ -159,15 +150,12 @@ importers:
eslint-plugin-react-refresh:
specifier: ^0.4.18
version: 0.4.18(eslint@8.57.1)
- eslint-plugin-testing-library:
- specifier: ^7.1.1
- version: 7.1.1(eslint@8.57.1)(typescript@5.7.3)
- jsdom:
- specifier: 26.0.0
- version: 26.0.0
lint-staged:
specifier: ^15.4.1
version: 15.4.1
+ msw:
+ specifier: ^2.7.0
+ version: 2.7.0(@types/node@22.10.1)(typescript@5.7.3)
prettier:
specifier: ^3.4.2
version: 3.4.2
@@ -196,8 +184,8 @@ importers:
specifier: workspace:*
version: link:../shared-components
'@sentry/react':
- specifier: ^8.50.0
- version: 8.50.0(react@18.3.1)
+ specifier: ^8.51.0
+ version: 8.51.0(react@18.3.1)
'@zxing/browser':
specifier: ^0.1.5
version: 0.1.5(@zxing/library@0.21.3)
@@ -226,51 +214,18 @@ importers:
specifier: ^37.3.6
version: 37.3.6(react@18.3.1)
devDependencies:
- '@chakra-ui/storybook-addon':
- specifier: ^5.2.5
- version: 5.2.5(@chakra-ui/react@2.8.2(@emotion/react@11.14.0(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(framer-motion@11.12.0(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@storybook/components@8.5.0(storybook@8.5.0(prettier@3.4.2)))(@storybook/manager-api@8.5.0(storybook@8.5.0(prettier@3.4.2)))(@storybook/preview-api@8.5.0(storybook@8.5.0(prettier@3.4.2)))(@storybook/types@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
'@sentry/types':
specifier: ^8.50.0
version: 8.51.0
- '@storybook/addon-actions':
- specifier: ^8.5.0
- version: 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/addon-essentials':
- specifier: ^8.5.0
- version: 8.5.0(@types/react@18.3.14)(storybook@8.5.0(prettier@3.4.2))
- '@storybook/addon-interactions':
- specifier: ^8.5.0
- version: 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/addon-links':
- specifier: ^8.5.0
- version: 8.5.0(react@18.3.1)(storybook@8.5.0(prettier@3.4.2))
- '@storybook/node-logger':
- specifier: ^8.5.0
- version: 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/react':
- specifier: ^8.5.0
- version: 8.5.0(@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@3.4.2))(typescript@5.7.3)
- '@storybook/react-vite':
- specifier: ^8.5.0
- version: 8.5.0(@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.31.0)(storybook@8.5.0(prettier@3.4.2))(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.1)(yaml@2.6.1))
- '@storybook/test':
- specifier: ^8.5.0
- version: 8.5.0(storybook@8.5.0(prettier@3.4.2))
'@types/react-big-calendar':
specifier: ^1.16.1
version: 1.16.1
'@types/react-table':
specifier: ^7.7.20
version: 7.7.20
- msw:
- specifier: ^2.7.0
- version: 2.7.0(@types/node@22.10.1)(typescript@5.7.3)
mutationobserver-shim:
specifier: ^0.3.7
version: 0.3.7
- storybook:
- specifier: ^8.5.0
- version: 8.5.0(prettier@3.4.2)
shared-components: {}
@@ -296,9 +251,6 @@ packages:
graphql: ^15.5.0 || ^16.0.0 || ^17.0.0
typescript: ^5.0.0
- '@adobe/css-tools@4.4.1':
- resolution: {integrity: sha512-12WGKBQzjUAI4ayyF4IAtfw2QR/IDoqk6jTddXDhtYTJF9ASmoE1zst7cVtP0aL/F1jUJL5r+JxKXKEgHNbEUQ==}
-
'@ampproject/remapping@2.3.0':
resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==}
engines: {node: '>=6.0.0'}
@@ -337,32 +289,14 @@ packages:
resolution: {integrity: sha512-RJlIHRueQgwWitWgF8OdFYGZX328Ax5BCemNGlqHfplnRT9ESi8JkFlvaVYbS+UubVY6dpv87Fs2u5M29iNFVQ==}
engines: {node: '>=6.9.0'}
- '@babel/compat-data@7.26.5':
- resolution: {integrity: sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==}
- engines: {node: '>=6.9.0'}
-
- '@babel/core@7.26.0':
- resolution: {integrity: sha512-i1SLeK+DzNnQ3LL/CswPCa/E5u4lh1k6IAEphON8F+cXt0t9euTshDru0q7/IqMa1PMPz5RnHuHscF8/ZJsStg==}
- engines: {node: '>=6.9.0'}
-
'@babel/generator@7.26.5':
resolution: {integrity: sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-compilation-targets@7.26.5':
- resolution: {integrity: sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==}
- engines: {node: '>=6.9.0'}
-
'@babel/helper-module-imports@7.25.9':
resolution: {integrity: sha512-tnUA4RsrmflIM6W6RFTLFSXITtl0wKjgpnLgXyowocVPrbYrLUXSBXDgTs8BlbmIzIdlBySRQjINYs2BAkiLtw==}
engines: {node: '>=6.9.0'}
- '@babel/helper-module-transforms@7.26.0':
- resolution: {integrity: sha512-xO+xu6B5K2czEnQye6BHA7DolFFmS3LB7stHZFaOLb1pAwO1HWLS8fXA+eh0A2yIvltPVmx3eNNDBJA2SLHXFw==}
- engines: {node: '>=6.9.0'}
- peerDependencies:
- '@babel/core': ^7.0.0
-
'@babel/helper-string-parser@7.25.9':
resolution: {integrity: sha512-4A/SCr/2KLd5jrtOMFzaKjVtAei3+2r/NChoBNoZ3EyP/+GlhoaEGoWOZUmFmoITP7zOJyHIMm+DYRd8o3PvHA==}
engines: {node: '>=6.9.0'}
@@ -371,14 +305,6 @@ packages:
resolution: {integrity: sha512-Ed61U6XJc3CVRfkERJWDz4dJwKe7iLmmJsbOGu9wSloNSFttHV0I8g6UAgb7qnK5ly5bGLPd4oXZlxCdANBOWQ==}
engines: {node: '>=6.9.0'}
- '@babel/helper-validator-option@7.25.9':
- resolution: {integrity: sha512-e/zv1co8pp55dNdEcCynfj9X7nyUKUXoUEwfXqaZt0omVOmDe9oOTdKStH4GmAw6zxMFs50ZayuMfHDKlO7Tfw==}
- engines: {node: '>=6.9.0'}
-
- '@babel/helpers@7.26.0':
- resolution: {integrity: sha512-tbhNuIxNcVb21pInl3ZSjksLCvgdZy9KwJ8brv993QtIVKJBBkYXz4q4ZbAv31GdnC+R90np23L5FbEBlthAEw==}
- engines: {node: '>=6.9.0'}
-
'@babel/parser@7.26.2':
resolution: {integrity: sha512-DWMCZH9WA4Maitz2q21SRKHo9QXZxkDsbNZoVD62gusNtNBBqDg9i7uOhASfTfIGNzW+O+r7+jAlM8dwphcJKQ==}
engines: {node: '>=6.0.0'}
@@ -815,22 +741,6 @@ packages:
'@chakra-ui/system': '>=2.0.0'
react: '>=18'
- '@chakra-ui/storybook-addon@5.2.5':
- resolution: {integrity: sha512-Iv1LmrzSLHb0DYeDXwJnwBPgfwOl9wsapv5Rc3eWM8rZvFFRoDE/f73s3pEaz3A5dleH6y2shASoXeV7JoQNFg==}
- peerDependencies:
- '@chakra-ui/react': '>=2.0.0'
- '@storybook/components': '>=7.0.12'
- '@storybook/manager-api': '>=7.0.12'
- '@storybook/preview-api': '>=7.0.12'
- '@storybook/types': '>=7.0.24'
- react: '>=16.8.x'
- react-dom: '*'
- peerDependenciesMeta:
- react:
- optional: true
- react-dom:
- optional: true
-
'@chakra-ui/styled-system@2.9.2':
resolution: {integrity: sha512-To/Z92oHpIE+4nk11uVMWqo2GGRS86coeMmjxtpnErmWRdLcp1WVCVRAvn+ZwpLiNR+reWFr2FFqJRsREuZdAg==}
@@ -1384,15 +1294,6 @@ packages:
resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==}
engines: {node: '>=8'}
- '@joshwooding/vite-plugin-react-docgen-typescript@0.4.2':
- resolution: {integrity: sha512-feQ+ntr+8hbVudnsTUapiMN9q8T90XA1d5jn9QzY09sNoj4iD9wi0PY1vsBFTda4ZjEaxRK9S81oarR2nj7TFQ==}
- peerDependencies:
- typescript: '>= 4.3.x'
- vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0
- peerDependenciesMeta:
- typescript:
- optional: true
-
'@jridgewell/gen-mapping@0.3.5':
resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==}
engines: {node: '>=6.0.0'}
@@ -1415,12 +1316,6 @@ packages:
'@jridgewell/trace-mapping@0.3.25':
resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==}
- '@mdx-js/react@3.1.0':
- resolution: {integrity: sha512-QjHtSaoameoalGnKDT3FoIl4+9RwyTmo9ZJGBdLOks/YOiWHoRDI3PUwEzOE7kEmGcV3AFcp9K6dYu9rEuKLAQ==}
- peerDependencies:
- '@types/react': '>=16'
- react: '>=16'
-
'@mswjs/interceptors@0.37.1':
resolution: {integrity: sha512-SvE+tSpcX884RJrPCskXxoS965Ky/pYABDEhWW6oeSRhpUDLrS5nTvT5n1LLSDVDYvty4imVmXsy+3/ROVuknA==}
engines: {node: '>=18'}
@@ -1512,6 +1407,11 @@ packages:
resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==}
engines: {node: '>=14'}
+ '@playwright/test@1.49.1':
+ resolution: {integrity: sha512-Ky+BVzPz8pL6PQxHqNRW1k3mIyv933LML7HktS8uik0bUXNCdPhoS/kLihiO1tMf/egaJb4IutXd7UywvXEW+g==}
+ engines: {node: '>=18'}
+ hasBin: true
+
'@polka/url@1.0.0-next.28':
resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==}
@@ -1554,15 +1454,6 @@ packages:
peerDependencies:
react: '>=16.8.0'
- '@rollup/pluginutils@5.1.4':
- resolution: {integrity: sha512-USm05zrsFxYLPdWWq+K3STlWiT/3ELn3RcV5hJMghpeAIhxfsUIg6mt12CBJBInWMV4VneoV7SfGv8xIwo2qNQ==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0
- peerDependenciesMeta:
- rollup:
- optional: true
-
'@rollup/rollup-android-arm-eabi@4.31.0':
resolution: {integrity: sha512-9NrR4033uCbUBRgvLcBrJofa2KY9DzxL2UKZ1/4xA/mnTNyhZCWBuD8X3tPm1n4KxcgaraOYgrFKSgwjASfmlA==}
cpu: [arm]
@@ -1661,36 +1552,32 @@ packages:
'@rtsao/scc@1.1.0':
resolution: {integrity: sha512-zt6OdqaDoOnJ1ZYsCYGt9YmWzDXl4vQdKTyJev62gFhRGKdx7mcT54V9KIjg+d2wi9EXsPvAPKe7i7WjfVWB8g==}
- '@sentry-internal/browser-utils@8.50.0':
- resolution: {integrity: sha512-hZm6ngWTEzZhaMHpLIKB4wWp0Od1MdCZdvR5FRdIThUMLa1P8rXeolovTRfOE81NE755EiwJHzj4O7rq3EjA+A==}
- engines: {node: '>=14.18'}
-
- '@sentry-internal/feedback@8.50.0':
- resolution: {integrity: sha512-79WlvSJYCXL/D0PBC8AIT4JbyS44AE3h6lP05IESXMqzTZl3KeSqCx317rwJw1KaxzeFd/JQwkFq95jaKAcLhg==}
+ '@sentry-internal/browser-utils@8.51.0':
+ resolution: {integrity: sha512-r94yfRK17zNJER0hgQE4qOSy5pWzsnFcGTJQSqhSEKUcC4KK37qSfoPrPejFxtIqXhqlkd/dTWKvrMwXWcn0MQ==}
engines: {node: '>=14.18'}
- '@sentry-internal/replay-canvas@8.50.0':
- resolution: {integrity: sha512-Hv1bBaPpe62xFPLpuaUxVBUHd/Ed9bnGndeqN4hueeEGDT9T6NyVokgm35O5xE9/op6Yodm/3NfUkEg8oE++Aw==}
+ '@sentry-internal/feedback@8.51.0':
+ resolution: {integrity: sha512-VgfxSZWLYUPKDnkt2zG+Oe5ccv8U3WPM6Mo4kfABIJT3Ai4VbZB7+vb2a4pm6lUCF9DeOPXHb5o9Tg17SHDAHw==}
engines: {node: '>=14.18'}
- '@sentry-internal/replay@8.50.0':
- resolution: {integrity: sha512-mhRPujzO6n+mb6ZR+wQNkSpjqIqDriR0hZEvdzHQdyXu9zVdCHUJ3sINkzpT1XwiypQVCEfxB6Oh9y/NmcQfGg==}
+ '@sentry-internal/replay-canvas@8.51.0':
+ resolution: {integrity: sha512-ERXIbwdULkdtIQnfkMLRVfpoGV2rClwySGRlTPepFKeLxlcXo9o09cPu+qbukiDnGK0cgEgRnrV961hMg21Bmw==}
engines: {node: '>=14.18'}
- '@sentry/browser@8.50.0':
- resolution: {integrity: sha512-aGJSpuKiHVKkLvd1VklJSZ2oCsl4wcKUVxKIa8dhJC8KjDY0vREQCywrlWuS5KYP0xFy4k28pg6PPR3HKkUlNw==}
+ '@sentry-internal/replay@8.51.0':
+ resolution: {integrity: sha512-lkm7id3a2n3yMZeF5socCVQUeEeShNOGr7Wtsmb5RORacEnld0z+NfbMTilo1mDwiWBzI5OYBjm62eglm1HFsQ==}
engines: {node: '>=14.18'}
- '@sentry/core@8.50.0':
- resolution: {integrity: sha512-q71m8Ha9YGwqn4Gd7sWvcFTRgbHXxEfU4QeIFtwMBpwHfq2Q+9koiF8DOoOHqIEOsnlvZWRQgGggIOdHzajnVw==}
+ '@sentry/browser@8.51.0':
+ resolution: {integrity: sha512-1kbbyVfBBAx5Xyynp+lC5lLnAHo0qJ2r4mtmdT6koPjesvoOocEK0QQnouQBmdUbm3L0L/bPI1SgXjbeJyhzHQ==}
engines: {node: '>=14.18'}
'@sentry/core@8.51.0':
resolution: {integrity: sha512-Go0KxCYLw+OBIlLSv5YsYX+x9NW43fNVcyB6rhkSp2Q5Zme3tAE6KtZFvyu4SO7G/903wisW5Q6qV6UuK/ee4A==}
engines: {node: '>=14.18'}
- '@sentry/react@8.50.0':
- resolution: {integrity: sha512-qkDW5dieROPDf0uk1usXib/SLZTEveN5jvKgBFd+HKWz5JNu+M7L53t9KdZ7ryn4T68utI/LWs4qR3QhmXzUbQ==}
+ '@sentry/react@8.51.0':
+ resolution: {integrity: sha512-Gqa6THfBJu3kagUr9B9kUWvOwzu7L2c1Wdvo7Wcy1yq6rcB2F2Ihxo9okNvb7cAez//UBtEYFebRJAaFKZqN0g==}
engines: {node: '>=14.18'}
peerDependencies:
react: ^16.14.0 || 17.x || 18.x || 19.x
@@ -1699,189 +1586,6 @@ packages:
resolution: {integrity: sha512-LNwI3IrZR0OaB3u4e8PwjRCO/NZy0m3Hld8j44WnbA/fwq0V5b9PH0wG6NCISOsIBSDzun0HpHCUi3VeQoupvw==}
engines: {node: '>=14.18'}
- '@storybook/addon-actions@8.5.0':
- resolution: {integrity: sha512-6CW9+17rk5eNx6I8EKqCxRKtsJFTR/lHL+xiJ6/iBWApIm8sg63vhXvUTJ58UixmIkT5oLh0+ESNPh+x10D8fw==}
- peerDependencies:
- storybook: ^8.5.0
-
- '@storybook/addon-backgrounds@8.5.0':
- resolution: {integrity: sha512-lzyFLs7niNsqlhH5kdUrp7htLiMIcjY50VLWe0PaeJ6T6GZ7X9qhQzROAUV6cGqzyd8A6y/LzIUntDPMVEm/6g==}
- peerDependencies:
- storybook: ^8.5.0
-
- '@storybook/addon-controls@8.5.0':
- resolution: {integrity: sha512-1fivx77A/ahObrPl0L66o9i9MUNfqXxsrpekne5gjMNXw9XJFIRNUe/ddL4CMmwu7SgVbj2QV+q5E5mlnZNTJw==}
- peerDependencies:
- storybook: ^8.5.0
-
- '@storybook/addon-docs@8.5.0':
- resolution: {integrity: sha512-REwLSr1VgOVNJZwP3y3mldhOjBHlM5fqTvq/tC8NaYpAzx9O4rZdoUSZxW3tYtoNoYrHpB8kzRTeZl8WSdKllw==}
- peerDependencies:
- storybook: ^8.5.0
-
- '@storybook/addon-essentials@8.5.0':
- resolution: {integrity: sha512-RrHRdaw2j3ugZiYQ6OHt3Ff08ID4hwAvipqULEsbEnEw3VlXOaW/MT5e2M7kW3MHskQ3iJ6XAD1Y1rNm432Pzw==}
- peerDependencies:
- storybook: ^8.5.0
-
- '@storybook/addon-highlight@8.5.0':
- resolution: {integrity: sha512-/JxYzMK5aJSYs0K/0eAEFyER2dMoxqwM891MdnkNwLFdyrM58lzHee00F9oEX6zeQoRUNQPRepq0ui2PvbTMGw==}
- peerDependencies:
- storybook: ^8.5.0
-
- '@storybook/addon-interactions@8.5.0':
- resolution: {integrity: sha512-vX1a8qS7o/W3kEzfL/CqOj/Rr6UlGLT/n0KXMpfIhx63tzxe1a1qGpFLL0h0zqAVPHZIOu9humWMKri5Iny6oA==}
- peerDependencies:
- storybook: ^8.5.0
-
- '@storybook/addon-links@8.5.0':
- resolution: {integrity: sha512-Y11GIByAYqn0TibI/xsy0vCe+ZxJS9PVAAoHngLxkf9J4WodAXcJABr8ZPlWDNdaEhSS/FF7UQUmNag0UC2/pw==}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- storybook: ^8.5.0
- peerDependenciesMeta:
- react:
- optional: true
-
- '@storybook/addon-measure@8.5.0':
- resolution: {integrity: sha512-e8pJy2sICyj0Ff0W1PFc6HPE6PqcjnnHtfuDaO3M9uSKJLYkpTWJ8i1VSP178f8seq44r5/PdQCHqs5q5l3zgw==}
- peerDependencies:
- storybook: ^8.5.0
-
- '@storybook/addon-outline@8.5.0':
- resolution: {integrity: sha512-r12sk1b38Ph6NroWAOTfjbJ/V+gDobm7tKQQlbSDf6fgX7cqyPHmKjfNDCOCQpXouZm/Jm+41zd758PW+Yt4ng==}
- peerDependencies:
- storybook: ^8.5.0
-
- '@storybook/addon-toolbars@8.5.0':
- resolution: {integrity: sha512-q3yYYO2WX8K2DYNM++FzixGDjzYaeREincgsl2WXYXrcuGb5hkOoOgRiAQL8Nz9NQ1Eo+B/yZxrhG/5VoVhUUQ==}
- peerDependencies:
- storybook: ^8.5.0
-
- '@storybook/addon-viewport@8.5.0':
- resolution: {integrity: sha512-MlhVELImk9YzjEgGR2ciLC8d5tUSGcO7my4kWIClN0VyTRcvG4ZfwrsEC+jN3/l52nrgjLmKrDX5UAGZm6w5mQ==}
- peerDependencies:
- storybook: ^8.5.0
-
- '@storybook/blocks@8.5.0':
- resolution: {integrity: sha512-2sTOgjH/JFOgWnpqkKjpKVvKAgUaC9ZBjH1gnCoA5dne/SDafYaCAYfv6yZn7g2Xm1sTxWCAmMIUkYSALeWr+w==}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- storybook: ^8.5.0
- peerDependenciesMeta:
- react:
- optional: true
- react-dom:
- optional: true
-
- '@storybook/builder-vite@8.5.0':
- resolution: {integrity: sha512-GVJFjAxX/mL3bmXX6N619ShuYprkh6Ix08JU6QGNf/tTkG92BxjgCqQdfovBrviDhFyO2bhkdlEp6ujMo5CbZA==}
- peerDependencies:
- storybook: ^8.5.0
- vite: ^4.0.0 || ^5.0.0 || ^6.0.0
-
- '@storybook/components@8.5.0':
- resolution: {integrity: sha512-DhaHtwfEcfWYj3ih/5RBSDHe3Idxyf+oHw2/DmaLKJX6MluhdK3ZqigjRcTmA9Gj/SbR4CkHEEtDzAvBlW0BYw==}
- peerDependencies:
- storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
-
- '@storybook/core@8.5.0':
- resolution: {integrity: sha512-apborO6ynns7SeydBSqE9o0zT6JSU+VY4gLFPJROGcconvSW4bS5xtJCsgjlulceyWVxepFHGXl4jEZw+SktXA==}
- peerDependencies:
- prettier: ^2 || ^3
- peerDependenciesMeta:
- prettier:
- optional: true
-
- '@storybook/csf-plugin@8.5.0':
- resolution: {integrity: sha512-cs6ogviNyLG1h9J8Sb47U3DqIrQmn2EHm4ta3fpCeV3ABbrMgbzYyxtmybz4g/AwlDgjAZAt6PPcXkfCJ6p2CQ==}
- peerDependencies:
- storybook: ^8.5.0
-
- '@storybook/csf@0.1.12':
- resolution: {integrity: sha512-9/exVhabisyIVL0VxTCxo01Tdm8wefIXKXfltAPTSr8cbLn5JAxGQ6QV3mjdecLGEOucfoVhAKtJfVHxEK1iqw==}
-
- '@storybook/global@5.0.0':
- resolution: {integrity: sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ==}
-
- '@storybook/icons@1.3.1':
- resolution: {integrity: sha512-tgiD2v9v/4sjGOliemoP/8bUe4+ZFpehcqdCVQcPiGZfV0kSBv34Ge+MafeKqM7SLwvGesrbOEOakaogSqGxiQ==}
- engines: {node: '>=14.0.0'}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
-
- '@storybook/instrumenter@8.5.0':
- resolution: {integrity: sha512-eZ/UY6w4U2vay+wX7QVwKiRoyMzZscuv6v4k4r8BlmHPFWbhiZDO9S2GsG16UkyKnrQrYk432he70n7hn1Xvmg==}
- peerDependencies:
- storybook: ^8.5.0
-
- '@storybook/manager-api@8.5.0':
- resolution: {integrity: sha512-Ildriueo3eif4M+gMlMxu/mrBIbAnz8+oesmQJKdzZfe/U9eQTI9OUqJsxx/IVBmdzQ3ySsgNmzj5VweRkse4A==}
- peerDependencies:
- storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
-
- '@storybook/node-logger@8.5.0':
- resolution: {integrity: sha512-dQqFZeT7AnRRaHNNicQWnuG+dNJnEFLxiYpNg10veqjWaRBvLOInoawyVWHhhezaBbde7nXg10mWZ8CMlPfevQ==}
- peerDependencies:
- storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
-
- '@storybook/preview-api@8.5.0':
- resolution: {integrity: sha512-g0XbD54zMUkl6bpuA7qEBCE9rW1QV6KKmwkO4bkxMOJcMke3x9l00JTaYn7Un8wItjXiS3BIG15B6mnfBG7fng==}
- peerDependencies:
- storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
-
- '@storybook/react-dom-shim@8.5.0':
- resolution: {integrity: sha512-7P8xg4FiuFpM6kQOzZynno+0zyLVs8NgsmRK58t3JRZXbda1tzlxTXzvqx4hUevvbPJGjmrB0F3xTFH+8Otnvw==}
- peerDependencies:
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- storybook: ^8.5.0
-
- '@storybook/react-vite@8.5.0':
- resolution: {integrity: sha512-4f5AM8aPs2aTBeiycotinaDIPJg/YRtPb0F1dDquS097eUOeImS73+NSSCwrIjmSiapG/KWVkPgFnadEumFkAA==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- '@storybook/test': 8.5.0
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- storybook: ^8.5.0
- vite: ^4.0.0 || ^5.0.0 || ^6.0.0
- peerDependenciesMeta:
- '@storybook/test':
- optional: true
-
- '@storybook/react@8.5.0':
- resolution: {integrity: sha512-/jbkmGGc95N7KduIennL/k8grNTP5ye/YBnkcS4TbF7uDWBtKy3/Wqvx5BIlFXq3qeUnZJ8YtZc0lPIYeCY8XQ==}
- engines: {node: '>=18.0.0'}
- peerDependencies:
- '@storybook/test': 8.5.0
- react: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- react-dom: ^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0-beta
- storybook: ^8.5.0
- typescript: '>= 4.2.x'
- peerDependenciesMeta:
- '@storybook/test':
- optional: true
- typescript:
- optional: true
-
- '@storybook/test@8.5.0':
- resolution: {integrity: sha512-M/DdPlI6gwL7NGkK5o7GYjdEBp95AsFEUtW29zQfnVIAngYugzi3nIuM/XkQHunidVdAZCYjw2s2Yhhsx/m9sw==}
- peerDependencies:
- storybook: ^8.5.0
-
- '@storybook/theming@8.5.0':
- resolution: {integrity: sha512-591LbOj/HMmHYUfLgrMerxhF1A9mY61HWKxcRpB6xxalc1Xw1kRtQ49DcwuTXnUu9ktBB3nuOzPNPQPFSh/7PQ==}
- peerDependencies:
- storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
-
- '@storybook/types@8.5.0':
- resolution: {integrity: sha512-5orPpfLvSksGH341ibmpFnV86yqlZMbvNax+a+z1h56UKRA+4c/hgdRQl1brs7YaQzrgJ2wUX7PAlJjBJ1erUQ==}
- peerDependencies:
- storybook: ^8.2.0 || ^8.3.0-0 || ^8.4.0-0 || ^8.5.0-0 || ^8.6.0-0
-
'@swc/core-darwin-arm64@1.9.3':
resolution: {integrity: sha512-hGfl/KTic/QY4tB9DkTbNuxy5cV4IeejpPD4zo+Lzt4iLlDWIeANL4Fkg67FiVceNJboqg48CUX+APhDHO5G1w==}
engines: {node: '>=10'}
@@ -1957,57 +1661,9 @@ packages:
'@swc/types@0.1.17':
resolution: {integrity: sha512-V5gRru+aD8YVyCOMAjMpWR1Ui577DD5KSJsHP8RAxopAH22jFz6GZd/qxqjO6MJHQhcsjvjOFXyDhyLQUnMveQ==}
- '@testing-library/dom@10.4.0':
- resolution: {integrity: sha512-pemlzrSESWbdAloYml3bAJMEfNh1Z7EduzqPKprCH5S341frlpYnUEW0H72dLxa6IsYr+mPno20GiSm+h9dEdQ==}
- engines: {node: '>=18'}
-
- '@testing-library/jest-dom@6.5.0':
- resolution: {integrity: sha512-xGGHpBXYSHUUr6XsKBfs85TWlYKpTc37cSBBVrXcib2MkHLboWlkClhWF37JKlDb9KEq3dHs+f2xR7XJEWGBxA==}
- engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
-
- '@testing-library/jest-dom@6.6.3':
- resolution: {integrity: sha512-IteBhl4XqYNkM54f4ejhLRJiZNqcSCoXUOG2CPK7qbD322KjQozM4kHQOfkG2oln9b9HTYqs+Sae8vBATubxxA==}
- engines: {node: '>=14', npm: '>=6', yarn: '>=1'}
-
- '@testing-library/react@16.1.0':
- resolution: {integrity: sha512-Q2ToPvg0KsVL0ohND9A3zLJWcOXXcO8IDu3fj11KhNt0UlCWyFyvnCIBkd12tidB2lkiVRG8VFqdhcqhqnAQtg==}
- engines: {node: '>=18'}
- peerDependencies:
- '@testing-library/dom': ^10.0.0
- '@types/react': ^18.0.0 || ^19.0.0
- '@types/react-dom': ^18.0.0 || ^19.0.0
- react: ^18.0.0 || ^19.0.0
- react-dom: ^18.0.0 || ^19.0.0
- peerDependenciesMeta:
- '@types/react':
- optional: true
- '@types/react-dom':
- optional: true
-
- '@testing-library/user-event@14.5.2':
- resolution: {integrity: sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ==}
- engines: {node: '>=12', npm: '>=6'}
- peerDependencies:
- '@testing-library/dom': '>=7.21.4'
-
'@tidyjs/tidy@2.5.2':
resolution: {integrity: sha512-jIpF2tM3gUFbo+kRxcfi/mLYg6sFvj7S9cI9hCt6EsalMXT0vTWo4lybv9OLRfSAE77iXvAyXPKpnJ/h4rotDQ==}
- '@types/aria-query@5.0.4':
- resolution: {integrity: sha512-rfT93uj5s0PRL7EzccGMs3brplhcrghnDoV26NqKhCAS1hVo+WdNsPvE/yb6ilfr5hi2MEk6d5EWJTKdxg8jVw==}
-
- '@types/babel__core@7.20.5':
- resolution: {integrity: sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==}
-
- '@types/babel__generator@7.6.8':
- resolution: {integrity: sha512-ASsj+tpEDsEiFr1arWrlN6V3mdfjRMZt6LtK/Vp/kreFLnr5QH5+DhvD5nINYZXzwJvXeGq+05iUXcAzVrqWtw==}
-
- '@types/babel__template@7.4.4':
- resolution: {integrity: sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==}
-
- '@types/babel__traverse@7.20.6':
- resolution: {integrity: sha512-r1bzfrm0tomOI8g1SzvCaQHo6Lcv6zu0EA+W2kHrt8dyrHQxGzBBL4kdkzIS+jBMV+EYcMAEAqXqYaLJq5rOZg==}
-
'@types/cookie@0.6.0':
resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==}
@@ -2101,9 +1757,6 @@ packages:
'@types/date-arithmetic@4.1.4':
resolution: {integrity: sha512-p9eZ2X9B80iKiTW4ukVj8B4K6q9/+xFtQ5MGYA5HWToY9nL4EkhV9+6ftT2VHpVMEZb5Tv00Iel516bVdO+yRw==}
- '@types/doctrine@0.0.9':
- resolution: {integrity: sha512-eOIHzCUSH7SMfonMG1LsC2f8vxBFtho6NGBznK41R84YzPuvSBzrhEps33IsQiOW9+VL6NQ9DbjQJznk/S4uRA==}
-
'@types/estree@1.0.6':
resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==}
@@ -2119,9 +1772,6 @@ packages:
'@types/lodash@4.17.13':
resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==}
- '@types/mdx@2.0.13':
- resolution: {integrity: sha512-+OWZQfAYyio6YkJb3HLxDrvnx6SWWDbC0zVPfBRzUk0/nqoDyf6dNxQi3eArPe8rJ473nobTMQ/8Zk+LxJ+Yuw==}
-
'@types/node@22.10.1':
resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==}
@@ -2149,18 +1799,12 @@ packages:
'@types/react@18.3.14':
resolution: {integrity: sha512-NzahNKvjNhVjuPBQ+2G7WlxstQ+47kXZNHlUvFakDViuIEfGY926GqhMueQFZ7woG+sPiQKlF36XfrIUVSUfFg==}
- '@types/resolve@1.20.6':
- resolution: {integrity: sha512-A4STmOXPhMUtHH+S6ymgE2GiBSMqf4oTvcQZMcHzokuTLVYzXTB8ttjcgxOVaAp2lGwEdzZ0J+cRbbeevQj1UQ==}
-
'@types/statuses@2.0.5':
resolution: {integrity: sha512-jmIUGWrAiwu3dZpxntxieC+1n/5c3mjrImkmOSQ2NC5uP6cYO4aAZDdSmRcI5C1oiTmqlZGHC+/NmJrKogbP5A==}
'@types/tough-cookie@4.0.5':
resolution: {integrity: sha512-/Ad8+nIOV7Rl++6f1BdKxFSMgmoqEoYbHRpPcx3JEfv8VRsQe9Z4mCXeJBzxs7mbHY/XOZZuXlRNfhpVPbs6ZA==}
- '@types/uuid@9.0.8':
- resolution: {integrity: sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==}
-
'@types/warning@3.0.3':
resolution: {integrity: sha512-D1XC7WK8K+zZEveUPY+cf4+kgauk8N4eHr/XIHXGlGYkHLud6hK9lYfZk1ry1TNh798cZUCgb6MqGEG8DkJt6Q==}
@@ -2179,10 +1823,6 @@ packages:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.8.0'
- '@typescript-eslint/scope-manager@8.18.0':
- resolution: {integrity: sha512-PNGcHop0jkK2WVYGotk/hxj+UFLhXtGPiGtiaWgVBVP1jhMoMCHlTyJA+hEj4rszoSdLTK3fN4oOatrL0Cp+Xw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
'@typescript-eslint/scope-manager@8.20.0':
resolution: {integrity: sha512-J7+VkpeGzhOt3FeG1+SzhiMj9NzGD/M6KoGn9f4dbz3YzK9hvbhVTmLj/HiTp9DazIzJ8B4XcM80LrR9Dm1rJw==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -2194,33 +1834,16 @@ packages:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.8.0'
- '@typescript-eslint/types@8.18.0':
- resolution: {integrity: sha512-FNYxgyTCAnFwTrzpBGq+zrnoTO4x0c1CKYY5MuUTzpScqmY5fmsh2o3+57lqdI3NZucBDCzDgdEbIaNfAjAHQA==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
'@typescript-eslint/types@8.20.0':
resolution: {integrity: sha512-cqaMiY72CkP+2xZRrFt3ExRBu0WmVitN/rYPZErA80mHjHx/Svgp8yfbzkJmDoQ/whcytOPO9/IZXnOc+wigRA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- '@typescript-eslint/typescript-estree@8.18.0':
- resolution: {integrity: sha512-rqQgFRu6yPkauz+ms3nQpohwejS8bvgbPyIDq13cgEDbkXt4LH4OkDMT0/fN1RUtzG8e8AKJyDBoocuQh8qNeg==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- typescript: '>=4.8.4 <5.8.0'
-
'@typescript-eslint/typescript-estree@8.20.0':
resolution: {integrity: sha512-Y7ncuy78bJqHI35NwzWol8E0X7XkRVS4K4P4TCyzWkOJih5NDvtoRDW4Ba9YJJoB2igm9yXDdYI/+fkiiAxPzA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
peerDependencies:
typescript: '>=4.8.4 <5.8.0'
- '@typescript-eslint/utils@8.18.0':
- resolution: {integrity: sha512-p6GLdY383i7h5b0Qrfbix3Vc3+J2k6QWw6UMUeY5JGfm3C5LbZ4QIZzJNoNOfgyRe0uuYKjvVOsO/jD4SJO+xg==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
- peerDependencies:
- eslint: ^8.57.0 || ^9.0.0
- typescript: '>=4.8.4 <5.8.0'
-
'@typescript-eslint/utils@8.20.0':
resolution: {integrity: sha512-dq70RUw6UK9ei7vxc4KQtBRk7qkHZv447OUZ6RPQMQl71I3NZxQJX/f32Smr+iqWrB02pHKn2yAdHBb0KNrRMA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -2228,10 +1851,6 @@ packages:
eslint: ^8.57.0 || ^9.0.0
typescript: '>=4.8.4 <5.8.0'
- '@typescript-eslint/visitor-keys@8.18.0':
- resolution: {integrity: sha512-pCh/qEA8Lb1wVIqNvBke8UaRjJ6wrAWkJO5yyIbs8Yx6TNGYyfNjOo61tLv+WwLvoLPp4BQ8B7AHKijl8NGUfw==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
-
'@typescript-eslint/visitor-keys@8.20.0':
resolution: {integrity: sha512-v/BpkeeYAsPkKCkR8BDwcno0llhzWVqPOamQrAEMdpZav2Y9OVjd9dwJyBLJWwf335B5DmlifECIkZRJCaGaHA==}
engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0}
@@ -2313,9 +1932,6 @@ packages:
'@vitest/browser':
optional: true
- '@vitest/expect@2.0.5':
- resolution: {integrity: sha512-yHZtwuP7JZivj65Gxoi8upUN2OzHTi3zVfjwdpu2WrvCZPLwsJ2Ey5ILIPccoW23dd/zQBlJ4/dhi7DWNyXCpA==}
-
'@vitest/expect@2.1.8':
resolution: {integrity: sha512-8ytZ/fFHq2g4PJVAtDX57mayemKgDR6X3Oa2Foro+EygiOJHUXhCqBAAKQYYajZpFoIfvBCF1j6R6IYRSIUFuw==}
@@ -2330,9 +1946,6 @@ packages:
vite:
optional: true
- '@vitest/pretty-format@2.0.5':
- resolution: {integrity: sha512-h8k+1oWHfwTkyTkb9egzwNMfJAEx4veaPSnMeKbVSjp4euqGSbQlm5+6VHwTr7u4FJslVVsUG5nopCaAYdOmSQ==}
-
'@vitest/pretty-format@2.1.8':
resolution: {integrity: sha512-9HiSZ9zpqNLKlbIDRWOnAWqgcA7xu+8YxXSekhr0Ykab7PAYFkhkwoqVArPOtJhPmYeE2YHgKZlj3CP36z2AJQ==}
@@ -2342,9 +1955,6 @@ packages:
'@vitest/snapshot@2.1.8':
resolution: {integrity: sha512-20T7xRFbmnkfcmgVEz+z3AU/3b0cEzZOt/zmnvZEctg64/QZbSDJEVm9fLnnlSi74KibmRsO9/Qabi+t0vCRPg==}
- '@vitest/spy@2.0.5':
- resolution: {integrity: sha512-c/jdthAhvJdpfVuaexSrnawxZz6pywlTPe84LUB2m/4t3rl2fTo9NFGBG4oWgaD+FTgDDV8hJ/nibT7IfH3JfA==}
-
'@vitest/spy@2.1.8':
resolution: {integrity: sha512-5swjf2q95gXeYPevtW0BLk6H8+bPlMb4Vw/9Em4hFxDcaOxS+e0LOX4yqNxoHzMR2akEB2xfpnWUzkZokmgWDg==}
@@ -2353,9 +1963,6 @@ packages:
peerDependencies:
vitest: 2.1.8
- '@vitest/utils@2.0.5':
- resolution: {integrity: sha512-d8HKbqIcya+GR67mkZbrzhS5kKhtp8dQLcmRZLGTscGVg7yImT82cIrhtn2L8+VujWcy6KZweApgNmPsTAO/UQ==}
-
'@vitest/utils@2.1.8':
resolution: {integrity: sha512-dwSoui6djdwbfFmIgbIjX2ZhIoG7Ex/+xpxyiEgIGzjliY8xGkcpITKTlp6B4MgtGkF2ilvm97cPM96XZaAgcA==}
@@ -2437,10 +2044,6 @@ packages:
resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==}
engines: {node: '>=8'}
- ansi-styles@5.2.0:
- resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==}
- engines: {node: '>=10'}
-
ansi-styles@6.2.1:
resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==}
engines: {node: '>=12'}
@@ -2452,9 +2055,6 @@ packages:
resolution: {integrity: sha512-y+CcFFwelSXpLZk/7fMB2mUbGtX9lKycf1MWJ7CaTIERyitVlyQx6C+sxcROU2BAJ24OiZyK+8wj2i8AlBoS3A==}
engines: {node: '>=10'}
- aria-query@5.3.0:
- resolution: {integrity: sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==}
-
aria-query@5.3.2:
resolution: {integrity: sha512-COROpnaoap1E2F000S62r6A60uHZnmlvomhfyT2DlTcrY1OrBKn2UhH7qn5wTC9zMvD0AY7csdPSNwKP+7WiQw==}
engines: {node: '>= 0.4'}
@@ -2510,10 +2110,6 @@ packages:
ast-types-flow@0.0.8:
resolution: {integrity: sha512-OH/2E5Fg20h2aPrbe+QL8JZQFko0YZaF+j4mnQ7BGhfavO7OpSLa8a0y9sBwomHdSbkhTS8TQNayBfnW5DwbvQ==}
- ast-types@0.16.1:
- resolution: {integrity: sha512-6t10qk83GOG8p0vKmaCr8eiilZwO171AvbROMtvvNiwrTly62t+7XkA8RdIIVbpMhCASAsxgAzdRSwh6nw/5Dg==}
- engines: {node: '>=4'}
-
asynckit@0.4.0:
resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==}
@@ -2539,10 +2135,6 @@ packages:
balanced-match@1.0.2:
resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==}
- better-opn@3.0.2:
- resolution: {integrity: sha512-aVNobHnJqLiUelTaHat9DZ1qM2w0C0Eym4LPI/3JxOnSokGVdsl1T1kN7TFvsEAD8G47A6VKQ0TVHqbBnYMJlQ==}
- engines: {node: '>=12.0.0'}
-
brace-expansion@1.1.11:
resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==}
@@ -2553,14 +2145,6 @@ packages:
resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==}
engines: {node: '>=8'}
- browser-assert@1.2.1:
- resolution: {integrity: sha512-nfulgvOR6S4gt9UKCeGJOuSGBPGiFT6oQ/2UBnvTY/5aQ1PnksW72fhZkM30DzoRRv2WpwZf1vHHEr3mtuXIWQ==}
-
- browserslist@4.24.4:
- resolution: {integrity: sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==}
- engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7}
- hasBin: true
-
cac@6.7.14:
resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==}
engines: {node: '>=8'}
@@ -2585,9 +2169,6 @@ packages:
resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==}
engines: {node: '>=6'}
- caniuse-lite@1.0.30001695:
- resolution: {integrity: sha512-vHyLade6wTgI2u1ec3WQBxv+2BrTERV28UXQu9LO6lZ9pYeMk34vjXFLOxo1A4UBA8XTL4njRQZdno/yYaSmWw==}
-
chai@5.1.2:
resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==}
engines: {node: '>=12'}
@@ -2606,10 +2187,6 @@ packages:
react: ^18.0.0
react-dom: ^18.0.0
- chalk@3.0.0:
- resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==}
- engines: {node: '>=8'}
-
chalk@4.1.2:
resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==}
engines: {node: '>=10'}
@@ -2675,9 +2252,6 @@ packages:
convert-source-map@1.9.0:
resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==}
- convert-source-map@2.0.0:
- resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==}
-
cookie@0.7.2:
resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==}
engines: {node: '>= 0.6'}
@@ -2696,9 +2270,6 @@ packages:
css-box-model@1.2.1:
resolution: {integrity: sha512-a7Vr4Q/kd/aw96bnJG332W9V9LkJO69JRcaCYDUqjp6/z0w6VcZjgAcTbgFxEPfBgdnAwlh3iwu+hLopa+flJw==}
- css.escape@1.5.1:
- resolution: {integrity: sha512-YUifsXXuknHlUsmlgyY0PKzgPOr7/FjCePfHNt0jxm83wHZi44VDMQ7/fGNkjY3/jV1MC+1CmZbaHzugyeRtpg==}
-
cssstyle@4.2.1:
resolution: {integrity: sha512-9+vem03dMXG7gDmZ62uqmRiMRNtinIZ9ZyuF6BdxzfOD+FdN5hretzynkn0ReS2DO2GSw76RWHs0UmJPI2zUjw==}
engines: {node: '>=18'}
@@ -2882,10 +2453,6 @@ packages:
resolution: {integrity: sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==}
engines: {node: '>= 0.4'}
- define-lazy-prop@2.0.0:
- resolution: {integrity: sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==}
- engines: {node: '>=8'}
-
define-properties@1.2.1:
resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==}
engines: {node: '>= 0.4'}
@@ -2918,12 +2485,6 @@ packages:
resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==}
engines: {node: '>=6.0.0'}
- dom-accessibility-api@0.5.16:
- resolution: {integrity: sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg==}
-
- dom-accessibility-api@0.6.3:
- resolution: {integrity: sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w==}
-
dom-helpers@5.2.1:
resolution: {integrity: sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==}
@@ -2937,9 +2498,6 @@ packages:
eastasianwidth@0.2.0:
resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==}
- electron-to-chromium@1.5.85:
- resolution: {integrity: sha512-UgTI7ZHxtSjOUwV0vZLpqT604U1Z8L3bq8mAtAKtuRPlMZ/6dLFMYgYnLdXSi/urbVTP2ykDb9EDDUrdIzw4Qg==}
-
emoji-regex@10.4.0:
resolution: {integrity: sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==}
@@ -3014,11 +2572,6 @@ packages:
resolution: {integrity: sha512-w+5mJ3GuFL+NjVtJlvydShqE1eN3h3PbI7/5LAsYJP/2qtuMXjfL2LpHSRqo4b4eSF5K/DH1JXKUAHSB2UW50g==}
engines: {node: '>= 0.4'}
- esbuild-register@3.6.0:
- resolution: {integrity: sha512-H2/S7Pm8a9CL1uhp9OvjwrBh5Pvx0H8qVOxNu8Wed9Y7qv56MPtq+GGM8RJpq6glYJn9Wspr8uw7l55uyinNeg==}
- peerDependencies:
- esbuild: '>=0.12 <1'
-
esbuild@0.21.5:
resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==}
engines: {node: '>=12'}
@@ -3113,12 +2666,6 @@ packages:
peerDependencies:
eslint: ^3 || ^4 || ^5 || ^6 || ^7 || ^8 || ^9.7
- eslint-plugin-testing-library@7.1.1:
- resolution: {integrity: sha512-nszC833aZPwB6tik1nMkbFqmtgIXTT0sfJEYs0zMBKMlkQ4to2079yUV96SvmLh00ovSBJI4pgcBC1TiIP8mXg==}
- engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0, pnpm: ^9.14.0}
- peerDependencies:
- eslint: ^8.57.0 || ^9.0.0
-
eslint-scope@7.2.2:
resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
@@ -3141,11 +2688,6 @@ packages:
resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==}
engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0}
- esprima@4.0.1:
- resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==}
- engines: {node: '>=4'}
- hasBin: true
-
esquery@1.6.0:
resolution: {integrity: sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==}
engines: {node: '>=0.10'}
@@ -3158,9 +2700,6 @@ packages:
resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==}
engines: {node: '>=4.0'}
- estree-walker@2.0.2:
- resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==}
-
estree-walker@3.0.3:
resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==}
@@ -3267,6 +2806,11 @@ packages:
fs.realpath@1.0.0:
resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==}
+ fsevents@2.3.2:
+ resolution: {integrity: sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==}
+ engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
+ os: [darwin]
+
fsevents@2.3.3:
resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==}
engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0}
@@ -3286,10 +2830,6 @@ packages:
functions-have-names@1.2.3:
resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==}
- gensync@1.0.0-beta.2:
- resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==}
- engines: {node: '>=6.9.0'}
-
get-caller-file@2.0.5:
resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==}
engines: {node: 6.* || 8.* || >= 10.*}
@@ -3460,10 +3000,6 @@ packages:
resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==}
engines: {node: '>=0.8.19'}
- indent-string@4.0.0:
- resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==}
- engines: {node: '>=8'}
-
inflight@1.0.6:
resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==}
deprecated: This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.
@@ -3485,10 +3021,6 @@ packages:
invariant@2.2.4:
resolution: {integrity: sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==}
- is-arguments@1.2.0:
- resolution: {integrity: sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==}
- engines: {node: '>= 0.4'}
-
is-array-buffer@3.0.4:
resolution: {integrity: sha512-wcjaerHw0ydZwfhiKbXJWLDY8A7yV7KhjQOpb83hGgGfId/aQa4TOvwyzn2PuswW2gPCYEL/nEAiSVpdOj1lXw==}
engines: {node: '>= 0.4'}
@@ -3546,11 +3078,6 @@ packages:
resolution: {integrity: sha512-PwwhEakHVKTdRNVOw+/Gyh0+MzlCl4R6qKvkhuvLtPMggI1WAHt9sOwZxQLSGpUaDnrdyDsomoRgNnCfKNSXXg==}
engines: {node: '>= 0.4'}
- is-docker@2.2.1:
- resolution: {integrity: sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==}
- engines: {node: '>=8'}
- hasBin: true
-
is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
@@ -3664,10 +3191,6 @@ packages:
resolution: {integrity: sha512-mfcwb6IzQyOKTs84CQMrOwW4gQcaTOAWJ0zzJCl2WSPDrWk/OzDaImWFH3djXhb24g4eudZfLRozAvPGw4d9hQ==}
engines: {node: '>= 0.4'}
- is-wsl@2.2.0:
- resolution: {integrity: sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==}
- engines: {node: '>=8'}
-
isarray@2.0.5:
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
@@ -3704,10 +3227,6 @@ packages:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
- jsdoc-type-pratt-parser@4.1.0:
- resolution: {integrity: sha512-Hicd6JK5Njt2QB6XYFS7ok9e37O8AYk3jTcppG4YVQnYjOemymvTcmc7OWsmq/Qqj5TdRFO5/x/tIPmBeRtGHg==}
- engines: {node: '>=12.0.0'}
-
jsdom@26.0.0:
resolution: {integrity: sha512-BZYDGVAIriBWTpIxYzrXjv3E/4u8+/pSG5bQdIYCbNCGOvsPkDQfTVLAIXAf9ETdCpduCVTkDe2NNZ8NIwUVzw==}
engines: {node: '>=18'}
@@ -3741,11 +3260,6 @@ packages:
resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==}
hasBin: true
- json5@2.2.3:
- resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==}
- engines: {node: '>=6'}
- hasBin: true
-
jsx-ast-utils@3.3.5:
resolution: {integrity: sha512-ZZow9HBI5O6EPgSJLUb8n2NKgmVWTwCvHGwFuJlMjvLFqlGG6pjirPhtdsseaLZjSibD8eegzmYpUZwoIlj2cQ==}
engines: {node: '>=4.0'}
@@ -3814,27 +3328,13 @@ packages:
resolution: {integrity: sha512-123qHRfJBmo2jXDbo/a5YOQrJoHF/GNQTLzQ5+IdK5pWpceK17yRc6ozlWd25FxvGKQbIUs91fDFkXmDHTKcyA==}
engines: {node: 20 || >=22}
- lru-cache@5.1.1:
- resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==}
-
luxon@3.5.0:
resolution: {integrity: sha512-rh+Zjr6DNfUYR3bPwJEnuwDdqMbxZW7LOQfUN4B54+Cl+0o5zaU9RJ6bcidfDtC1cWCZXQ+nvX8bf6bAji37QQ==}
engines: {node: '>=12'}
- lz-string@1.5.0:
- resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==}
- hasBin: true
-
- magic-string@0.27.0:
- resolution: {integrity: sha512-8UnnX2PeRAPZuN12svgR9j7M1uWMovg/CEnIwIG0LFkXSJJe4PdfUGiTGl8V9bsBHFUtfVINcSyYxd7q+kx9fA==}
- engines: {node: '>=12'}
-
magic-string@0.30.14:
resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==}
- magic-string@0.30.17:
- resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==}
-
magicast@0.3.5:
resolution: {integrity: sha512-L0WhttDl+2BOsybvEOLK7fW3UA0OQ0IQ2d6Zl2x/a6vVRs3bAY0ECOSHHeL5jD+SbOpOCUEi0y1DgHEn9Qn1AQ==}
@@ -3842,9 +3342,6 @@ packages:
resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==}
engines: {node: '>=10'}
- map-or-similar@1.5.0:
- resolution: {integrity: sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg==}
-
math-expression-evaluator@1.4.0:
resolution: {integrity: sha512-4vRUvPyxdO8cWULGTh9dZWL2tZK6LDBvj+OGHBER7poH9Qdt7kXEoj20wiz4lQUbUXQZFjPbe5mVDo9nutizCw==}
@@ -3855,9 +3352,6 @@ packages:
memoize-one@6.0.0:
resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
- memoizerific@1.11.3:
- resolution: {integrity: sha512-/EuHYwAPdLtXwAwSZkh/Gutery6pD2KYd44oQLhAvQp/50mpyduZh8Q7PYHXTCJ+wuXxt7oij2LXyIJOOYFPog==}
-
merge-stream@2.0.0:
resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==}
@@ -3885,10 +3379,6 @@ packages:
resolution: {integrity: sha512-VP79XUPxV2CigYP3jWwAUFSku2aKqBH7uTAapFWCBqutsbmDo96KY5o8uh6U+/YSIn5OxJnXp73beVkpqMIGhA==}
engines: {node: '>=18'}
- min-indent@1.0.1:
- resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==}
- engines: {node: '>=4'}
-
minimatch@3.1.2:
resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==}
@@ -3941,9 +3431,6 @@ packages:
natural-compare@1.4.0:
resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==}
- node-releases@2.0.19:
- resolution: {integrity: sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==}
-
npm-run-path@5.3.0:
resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==}
engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0}
@@ -3998,10 +3485,6 @@ packages:
resolution: {integrity: sha512-VXJjc87FScF88uafS3JllDgvAm+c/Slfz06lorj2uAY34rlUu0Nt+v8wreiImcrgAjjIHp1rXpTDlLOGw29WwQ==}
engines: {node: '>=18'}
- open@8.4.2:
- resolution: {integrity: sha512-7x81NCL719oNbsq/3mh+hVrAWmFuEYUqrq/Iw3kUzH8ReypT9QQ0BLoJS7/G9k6N81XjW4qHWtjWwe/9eLy1EQ==}
- engines: {node: '>=12'}
-
optimism@0.18.1:
resolution: {integrity: sha512-mLXNwWPa9dgFyDqkNi54sjDyNJ9/fTI6WGBLgnXku1vdKY/jovHfZT5r+aiVeFFLOz+foPNOm5YJ4mqgld2GBQ==}
@@ -4091,9 +3574,15 @@ packages:
engines: {node: '>=0.10'}
hasBin: true
- polished@4.3.1:
- resolution: {integrity: sha512-OBatVyC/N7SCW/FaDHrSd+vn0o5cS855TOmYi4OkdWUMSJCET/xip//ch8xGUvtr3i44X9LVyWwQlRMTN3pwSA==}
- engines: {node: '>=10'}
+ playwright-core@1.49.1:
+ resolution: {integrity: sha512-BzmpVcs4kE2CH15rWfzpjzVGhWERJfmnXmniSyKeRZUs9Ws65m+RGIi7mjJK/euCegfn3i7jvqWeWyHe9y3Vgg==}
+ engines: {node: '>=18'}
+ hasBin: true
+
+ playwright@1.49.1:
+ resolution: {integrity: sha512-VYL8zLoNTBxVOrJBbDuRgDWa3i+mfQgDTrL8Ah9QXZ7ax4Dsj0MSq5bYgytRnDVVe+njoKnfsYkH3HzqVj5UZA==}
+ engines: {node: '>=18'}
+ hasBin: true
possible-typed-array-names@1.0.0:
resolution: {integrity: sha512-d7Uw+eZoloe0EHDIYoe+bQ5WXnGMOpmiZFTuMWCwpjzzkL2nTjcKiAk4hh8TjnGye2TwWOk3UXucZ+3rbmBa8Q==}
@@ -4112,14 +3601,6 @@ packages:
engines: {node: '>=14'}
hasBin: true
- pretty-format@27.5.1:
- resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==}
- engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0}
-
- process@0.11.10:
- resolution: {integrity: sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==}
- engines: {node: '>= 0.6.0'}
-
prop-types@15.8.1:
resolution: {integrity: sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==}
@@ -4150,15 +3631,6 @@ packages:
react-csv@2.2.2:
resolution: {integrity: sha512-RG5hOcZKZFigIGE8LxIEV/OgS1vigFQT4EkaHeKgyuCbUAu9Nbd/1RYq++bJcJJ9VOqO/n9TZRADsXNDR4VEpw==}
- react-docgen-typescript@2.2.2:
- resolution: {integrity: sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg==}
- peerDependencies:
- typescript: '>= 4.3.x'
-
- react-docgen@7.1.0:
- resolution: {integrity: sha512-APPU8HB2uZnpl6Vt/+0AFoVYgSRtfiP6FLrZgPPTDmqSb2R4qZRbgd0A3VzIFxDt5e+Fozjx79WjLWnF69DK8g==}
- engines: {node: '>=16.14.0'}
-
react-dom@18.3.1:
resolution: {integrity: sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==}
peerDependencies:
@@ -4190,9 +3662,6 @@ packages:
react-is@16.13.1:
resolution: {integrity: sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==}
- react-is@17.0.2:
- resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==}
-
react-lifecycles-compat@3.0.4:
resolution: {integrity: sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA==}
@@ -4272,14 +3741,6 @@ packages:
resolution: {integrity: sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==}
engines: {node: '>=0.10.0'}
- recast@0.23.9:
- resolution: {integrity: sha512-Hx/BGIbwj+Des3+xy5uAtAbdCyqK9y9wbBcDFDYanLS9JnMqf7OeF87HQwUimE87OEc72mr6tkKUKMBBL+hF9Q==}
- engines: {node: '>= 4'}
-
- redent@3.0.0:
- resolution: {integrity: sha512-6tDA8g98We0zd0GvVeMT9arEOnTw9qM03L9cJXaCjrip1OO764RDBLBfrB4cwzNGDj5OA5ioymC9GkizgWJDUg==}
- engines: {node: '>=8'}
-
reduce-css-calc@1.3.0:
resolution: {integrity: sha512-0dVfwYVOlf/LBA2ec4OwQ6p3X9mYxn/wOl2xTcLwjnPYrkgEfPx3VI4eGCH3rQLlPISG5v9I9bkZosKsNRTRKA==}
@@ -4467,10 +3928,6 @@ packages:
resolution: {integrity: sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==}
engines: {node: '>=0.10.0'}
- source-map@0.6.1:
- resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==}
- engines: {node: '>=0.10.0'}
-
stable-hash@0.0.4:
resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==}
@@ -4484,15 +3941,6 @@ packages:
std-env@3.8.0:
resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==}
- storybook@8.5.0:
- resolution: {integrity: sha512-cEx42OlCetManF+cONVJVYP7SYsnI2K922DfWKmZhebP0it0n6TUof4y5/XzJ8YUruwPgyclGLdX8TvdRuNSfw==}
- hasBin: true
- peerDependencies:
- prettier: ^2 || ^3
- peerDependenciesMeta:
- prettier:
- optional: true
-
strict-event-emitter@0.5.1:
resolution: {integrity: sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ==}
@@ -4558,16 +4006,8 @@ packages:
resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==}
engines: {node: '>=12'}
- strip-indent@3.0.0:
- resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==}
- engines: {node: '>=8'}
-
- strip-indent@4.0.0:
- resolution: {integrity: sha512-mnVSV2l+Zv6BLpSD/8V87CW/y9EmmbYzGCIavsnsI6/nwn26DwffM/yztm30Z/I2DY9wdS3vXVCMnHDgZaVNoA==}
- engines: {node: '>=12'}
-
- strip-json-comments@3.1.1:
- resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
+ strip-json-comments@3.1.1:
+ resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==}
engines: {node: '>=8'}
stylis@4.2.0:
@@ -4654,12 +4094,6 @@ packages:
resolution: {integrity: sha512-tk2G5R2KRwBd+ZN0zaEXpmzdKyOYksXwywulIX95MBODjSzMIuQnQ3m8JxgbhnL1LeVo7lqQKsYa1O3Htl7K5g==}
engines: {node: '>=18'}
- ts-api-utils@1.4.3:
- resolution: {integrity: sha512-i3eMG77UTMD0hZhgRS562pv83RC6ukSAC2GMNWc+9dieh/+jDM5u5YG+NHX6VNDRHQcHwmsTHctP9LhbC3WxVw==}
- engines: {node: '>=16'}
- peerDependencies:
- typescript: '>=4.2.0'
-
ts-api-utils@2.0.0:
resolution: {integrity: sha512-xCt/TOAc+EOHS1XPnijD3/yzpH6qg2xppZO1YDqGoVsNXfQfzHpOdNuXwrwOU8u4ITXJyDCTyt8w5g1sZv9ynQ==}
engines: {node: '>=18.12'}
@@ -4670,10 +4104,6 @@ packages:
resolution: {integrity: sha512-5OX1tzOjxWEgsr/YEUWSuPrQ00deKLh6D7OTWcvNHm12/7QPyRh8SYpyWvA4IZv8H/+GQWQEh/kwo95Q9OVW1A==}
engines: {node: '>=14.0.0'}
- ts-dedent@2.2.0:
- resolution: {integrity: sha512-q5W7tVM71e2xjHZTlgfTDoPF/SmqKG5hddq9SzR49CH2hayqRKJtQ4mtRlSxKaJlR/+9rEM+mnBHf7I2/BQcpQ==}
- engines: {node: '>=6.10'}
-
ts-invariant@0.10.3:
resolution: {integrity: sha512-uivwYcQaxAucv1CzRp2n/QdYPo4ILf9VXgH19zEIjFx2EJufV16P0JtJVpYHy89DItG6Kwj2oIUjrcK5au+4tQ==}
engines: {node: '>=8'}
@@ -4700,10 +4130,6 @@ packages:
tsconfig-paths@3.15.0:
resolution: {integrity: sha512-2Ac2RgzDe/cn48GvOe3M+o82pEFewD3UPbyoUHHdKasHwJKjds4fLXWf/Ux5kATBKN20oaFGu+jbElp1pos0mg==}
- tsconfig-paths@4.2.0:
- resolution: {integrity: sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==}
- engines: {node: '>=6'}
-
tslib@2.4.0:
resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==}
@@ -4722,10 +4148,6 @@ packages:
resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==}
engines: {node: '>=10'}
- type-fest@2.19.0:
- resolution: {integrity: sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA==}
- engines: {node: '>=12.20'}
-
type-fest@4.29.0:
resolution: {integrity: sha512-RPYt6dKyemXJe7I6oNstcH24myUGSReicxcHTvCLgzm4e0n8y05dGvcGB15/SoPRBmhlMthWQ9pvKyL81ko8nQ==}
engines: {node: '>=16'}
@@ -4782,16 +4204,6 @@ packages:
resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==}
engines: {node: '>= 4.0.0'}
- unplugin@1.16.1:
- resolution: {integrity: sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==}
- engines: {node: '>=14.0.0'}
-
- update-browserslist-db@1.1.2:
- resolution: {integrity: sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==}
- hasBin: true
- peerDependencies:
- browserslist: '>= 4.21.0'
-
uri-js@4.4.1:
resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==}
@@ -4827,13 +4239,6 @@ packages:
'@types/react':
optional: true
- util@0.12.5:
- resolution: {integrity: sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==}
-
- uuid@9.0.1:
- resolution: {integrity: sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==}
- hasBin: true
-
victory-area@37.3.6:
resolution: {integrity: sha512-wVC8LKrZJLiSySNuJLRCB449qZTsPiRyzLlNoJwe21y+XA/a2HJbmJSeywmo8P153aX8viKe1H8ygDsTFXQhHw==}
engines: {node: '>=18.0.0'}
@@ -5125,9 +4530,6 @@ packages:
resolution: {integrity: sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==}
engines: {node: '>=12'}
- webpack-virtual-modules@0.6.2:
- resolution: {integrity: sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==}
-
whatwg-encoding@3.1.1:
resolution: {integrity: sha512-6qN4hJdMwfYBtE3YBTTHhoeuUrDBPZmbQaxWAqSALV/MeEnR5z1xd8UKud2RAkFoPkmB+hli1TZSnyi84xz1vQ==}
engines: {node: '>=18'}
@@ -5219,9 +4621,6 @@ packages:
resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==}
engines: {node: '>=10'}
- yallist@3.1.1:
- resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==}
-
yaml@1.10.2:
resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==}
engines: {node: '>= 6'}
@@ -5268,8 +4667,6 @@ snapshots:
graphql: 16.10.0
typescript: 5.7.3
- '@adobe/css-tools@4.4.1': {}
-
'@ampproject/remapping@2.3.0':
dependencies:
'@jridgewell/gen-mapping': 0.3.5
@@ -5305,6 +4702,7 @@ snapshots:
'@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
'@csstools/css-tokenizer': 3.0.3
lru-cache: 11.0.2
+ optional: true
'@auth0/auth0-react@2.2.4(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
dependencies:
@@ -5320,28 +4718,6 @@ snapshots:
js-tokens: 4.0.0
picocolors: 1.1.1
- '@babel/compat-data@7.26.5': {}
-
- '@babel/core@7.26.0':
- dependencies:
- '@ampproject/remapping': 2.3.0
- '@babel/code-frame': 7.26.2
- '@babel/generator': 7.26.5
- '@babel/helper-compilation-targets': 7.26.5
- '@babel/helper-module-transforms': 7.26.0(@babel/core@7.26.0)
- '@babel/helpers': 7.26.0
- '@babel/parser': 7.26.5
- '@babel/template': 7.25.9
- '@babel/traverse': 7.26.5
- '@babel/types': 7.26.5
- convert-source-map: 2.0.0
- debug: 4.4.0
- gensync: 1.0.0-beta.2
- json5: 2.2.3
- semver: 6.3.1
- transitivePeerDependencies:
- - supports-color
-
'@babel/generator@7.26.5':
dependencies:
'@babel/parser': 7.26.5
@@ -5350,14 +4726,6 @@ snapshots:
'@jridgewell/trace-mapping': 0.3.25
jsesc: 3.1.0
- '@babel/helper-compilation-targets@7.26.5':
- dependencies:
- '@babel/compat-data': 7.26.5
- '@babel/helper-validator-option': 7.25.9
- browserslist: 4.24.4
- lru-cache: 5.1.1
- semver: 6.3.1
-
'@babel/helper-module-imports@7.25.9':
dependencies:
'@babel/traverse': 7.26.5
@@ -5365,26 +4733,10 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@babel/helper-module-transforms@7.26.0(@babel/core@7.26.0)':
- dependencies:
- '@babel/core': 7.26.0
- '@babel/helper-module-imports': 7.25.9
- '@babel/helper-validator-identifier': 7.25.9
- '@babel/traverse': 7.26.5
- transitivePeerDependencies:
- - supports-color
-
'@babel/helper-string-parser@7.25.9': {}
'@babel/helper-validator-identifier@7.25.9': {}
- '@babel/helper-validator-option@7.25.9': {}
-
- '@babel/helpers@7.26.0':
- dependencies:
- '@babel/template': 7.25.9
- '@babel/types': 7.26.5
-
'@babel/parser@7.26.2':
dependencies:
'@babel/types': 7.26.0
@@ -6014,17 +5366,6 @@ snapshots:
'@chakra-ui/system': 2.6.2(@emotion/react@11.14.0(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(react@18.3.1)
react: 18.3.1
- '@chakra-ui/storybook-addon@5.2.5(@chakra-ui/react@2.8.2(@emotion/react@11.14.0(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(framer-motion@11.12.0(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(@storybook/components@8.5.0(storybook@8.5.0(prettier@3.4.2)))(@storybook/manager-api@8.5.0(storybook@8.5.0(prettier@3.4.2)))(@storybook/preview-api@8.5.0(storybook@8.5.0(prettier@3.4.2)))(@storybook/types@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@chakra-ui/react': 2.8.2(@emotion/react@11.14.0(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(framer-motion@11.12.0(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- '@storybook/components': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/manager-api': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/preview-api': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/types': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- optionalDependencies:
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
-
'@chakra-ui/styled-system@2.9.2':
dependencies:
'@chakra-ui/shared-utils': 2.0.5
@@ -6157,12 +5498,14 @@ snapshots:
'@chakra-ui/system': 2.6.2(@emotion/react@11.14.0(@types/react@18.3.14)(react@18.3.1))(@emotion/styled@11.14.0(@emotion/react@11.14.0(@types/react@18.3.14)(react@18.3.1))(@types/react@18.3.14)(react@18.3.1))(react@18.3.1)
react: 18.3.1
- '@csstools/color-helpers@5.0.1': {}
+ '@csstools/color-helpers@5.0.1':
+ optional: true
'@csstools/css-calc@2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)':
dependencies:
'@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
'@csstools/css-tokenizer': 3.0.3
+ optional: true
'@csstools/css-color-parser@3.0.7(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)':
dependencies:
@@ -6170,12 +5513,15 @@ snapshots:
'@csstools/css-calc': 2.1.1(@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3))(@csstools/css-tokenizer@3.0.3)
'@csstools/css-parser-algorithms': 3.0.4(@csstools/css-tokenizer@3.0.3)
'@csstools/css-tokenizer': 3.0.3
+ optional: true
'@csstools/css-parser-algorithms@3.0.4(@csstools/css-tokenizer@3.0.3)':
dependencies:
'@csstools/css-tokenizer': 3.0.3
+ optional: true
- '@csstools/css-tokenizer@3.0.3': {}
+ '@csstools/css-tokenizer@3.0.3':
+ optional: true
'@emotion/babel-plugin@11.13.5':
dependencies:
@@ -6508,14 +5854,6 @@ snapshots:
'@istanbuljs/schema@0.1.3': {}
- '@joshwooding/vite-plugin-react-docgen-typescript@0.4.2(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.1)(yaml@2.6.1))':
- dependencies:
- magic-string: 0.27.0
- react-docgen-typescript: 2.2.2(typescript@5.7.3)
- vite: 6.0.11(@types/node@22.10.1)(yaml@2.6.1)
- optionalDependencies:
- typescript: 5.7.3
-
'@jridgewell/gen-mapping@0.3.5':
dependencies:
'@jridgewell/set-array': 1.2.1
@@ -6539,12 +5877,6 @@ snapshots:
'@jridgewell/resolve-uri': 3.1.2
'@jridgewell/sourcemap-codec': 1.5.0
- '@mdx-js/react@3.1.0(@types/react@18.3.14)(react@18.3.1)':
- dependencies:
- '@types/mdx': 2.0.13
- '@types/react': 18.3.14
- react: 18.3.1
-
'@mswjs/interceptors@0.37.1':
dependencies:
'@open-draft/deferred-promise': 2.2.0
@@ -6737,6 +6069,10 @@ snapshots:
'@pkgjs/parseargs@0.11.0':
optional: true
+ '@playwright/test@1.49.1':
+ dependencies:
+ playwright: 1.49.1
+
'@polka/url@1.0.0-next.28': {}
'@popperjs/core@2.11.8': {}
@@ -6780,14 +6116,6 @@ snapshots:
dequal: 2.0.3
react: 18.3.1
- '@rollup/pluginutils@5.1.4(rollup@4.31.0)':
- dependencies:
- '@types/estree': 1.0.6
- estree-walker: 2.0.2
- picomatch: 4.0.2
- optionalDependencies:
- rollup: 4.31.0
-
'@rollup/rollup-android-arm-eabi@4.31.0':
optional: true
@@ -6847,40 +6175,38 @@ snapshots:
'@rtsao/scc@1.1.0': {}
- '@sentry-internal/browser-utils@8.50.0':
+ '@sentry-internal/browser-utils@8.51.0':
dependencies:
- '@sentry/core': 8.50.0
+ '@sentry/core': 8.51.0
- '@sentry-internal/feedback@8.50.0':
+ '@sentry-internal/feedback@8.51.0':
dependencies:
- '@sentry/core': 8.50.0
+ '@sentry/core': 8.51.0
- '@sentry-internal/replay-canvas@8.50.0':
+ '@sentry-internal/replay-canvas@8.51.0':
dependencies:
- '@sentry-internal/replay': 8.50.0
- '@sentry/core': 8.50.0
+ '@sentry-internal/replay': 8.51.0
+ '@sentry/core': 8.51.0
- '@sentry-internal/replay@8.50.0':
+ '@sentry-internal/replay@8.51.0':
dependencies:
- '@sentry-internal/browser-utils': 8.50.0
- '@sentry/core': 8.50.0
+ '@sentry-internal/browser-utils': 8.51.0
+ '@sentry/core': 8.51.0
- '@sentry/browser@8.50.0':
+ '@sentry/browser@8.51.0':
dependencies:
- '@sentry-internal/browser-utils': 8.50.0
- '@sentry-internal/feedback': 8.50.0
- '@sentry-internal/replay': 8.50.0
- '@sentry-internal/replay-canvas': 8.50.0
- '@sentry/core': 8.50.0
-
- '@sentry/core@8.50.0': {}
+ '@sentry-internal/browser-utils': 8.51.0
+ '@sentry-internal/feedback': 8.51.0
+ '@sentry-internal/replay': 8.51.0
+ '@sentry-internal/replay-canvas': 8.51.0
+ '@sentry/core': 8.51.0
'@sentry/core@8.51.0': {}
- '@sentry/react@8.50.0(react@18.3.1)':
+ '@sentry/react@8.51.0(react@18.3.1)':
dependencies:
- '@sentry/browser': 8.50.0
- '@sentry/core': 8.50.0
+ '@sentry/browser': 8.51.0
+ '@sentry/core': 8.51.0
hoist-non-react-statics: 3.3.2
react: 18.3.1
@@ -6888,241 +6214,6 @@ snapshots:
dependencies:
'@sentry/core': 8.51.0
- '@storybook/addon-actions@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- '@storybook/global': 5.0.0
- '@types/uuid': 9.0.8
- dequal: 2.0.3
- polished: 4.3.1
- storybook: 8.5.0(prettier@3.4.2)
- uuid: 9.0.1
-
- '@storybook/addon-backgrounds@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- '@storybook/global': 5.0.0
- memoizerific: 1.11.3
- storybook: 8.5.0(prettier@3.4.2)
- ts-dedent: 2.2.0
-
- '@storybook/addon-controls@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- '@storybook/global': 5.0.0
- dequal: 2.0.3
- storybook: 8.5.0(prettier@3.4.2)
- ts-dedent: 2.2.0
-
- '@storybook/addon-docs@8.5.0(@types/react@18.3.14)(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- '@mdx-js/react': 3.1.0(@types/react@18.3.14)(react@18.3.1)
- '@storybook/blocks': 8.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@3.4.2))
- '@storybook/csf-plugin': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/react-dom-shim': 8.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@3.4.2))
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- storybook: 8.5.0(prettier@3.4.2)
- ts-dedent: 2.2.0
- transitivePeerDependencies:
- - '@types/react'
-
- '@storybook/addon-essentials@8.5.0(@types/react@18.3.14)(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- '@storybook/addon-actions': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/addon-backgrounds': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/addon-controls': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/addon-docs': 8.5.0(@types/react@18.3.14)(storybook@8.5.0(prettier@3.4.2))
- '@storybook/addon-highlight': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/addon-measure': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/addon-outline': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/addon-toolbars': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/addon-viewport': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- storybook: 8.5.0(prettier@3.4.2)
- ts-dedent: 2.2.0
- transitivePeerDependencies:
- - '@types/react'
-
- '@storybook/addon-highlight@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- '@storybook/global': 5.0.0
- storybook: 8.5.0(prettier@3.4.2)
-
- '@storybook/addon-interactions@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- '@storybook/global': 5.0.0
- '@storybook/instrumenter': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/test': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- polished: 4.3.1
- storybook: 8.5.0(prettier@3.4.2)
- ts-dedent: 2.2.0
-
- '@storybook/addon-links@8.5.0(react@18.3.1)(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- '@storybook/csf': 0.1.12
- '@storybook/global': 5.0.0
- storybook: 8.5.0(prettier@3.4.2)
- ts-dedent: 2.2.0
- optionalDependencies:
- react: 18.3.1
-
- '@storybook/addon-measure@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- '@storybook/global': 5.0.0
- storybook: 8.5.0(prettier@3.4.2)
- tiny-invariant: 1.3.3
-
- '@storybook/addon-outline@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- '@storybook/global': 5.0.0
- storybook: 8.5.0(prettier@3.4.2)
- ts-dedent: 2.2.0
-
- '@storybook/addon-toolbars@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- storybook: 8.5.0(prettier@3.4.2)
-
- '@storybook/addon-viewport@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- memoizerific: 1.11.3
- storybook: 8.5.0(prettier@3.4.2)
-
- '@storybook/blocks@8.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- '@storybook/csf': 0.1.12
- '@storybook/icons': 1.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)
- storybook: 8.5.0(prettier@3.4.2)
- ts-dedent: 2.2.0
- optionalDependencies:
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
-
- '@storybook/builder-vite@8.5.0(storybook@8.5.0(prettier@3.4.2))(vite@6.0.11(@types/node@22.10.1)(yaml@2.6.1))':
- dependencies:
- '@storybook/csf-plugin': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- browser-assert: 1.2.1
- storybook: 8.5.0(prettier@3.4.2)
- ts-dedent: 2.2.0
- vite: 6.0.11(@types/node@22.10.1)(yaml@2.6.1)
-
- '@storybook/components@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- storybook: 8.5.0(prettier@3.4.2)
-
- '@storybook/core@8.5.0(prettier@3.4.2)':
- dependencies:
- '@storybook/csf': 0.1.12
- better-opn: 3.0.2
- browser-assert: 1.2.1
- esbuild: 0.24.2
- esbuild-register: 3.6.0(esbuild@0.24.2)
- jsdoc-type-pratt-parser: 4.1.0
- process: 0.11.10
- recast: 0.23.9
- semver: 7.6.3
- util: 0.12.5
- ws: 8.18.0
- optionalDependencies:
- prettier: 3.4.2
- transitivePeerDependencies:
- - bufferutil
- - supports-color
- - utf-8-validate
-
- '@storybook/csf-plugin@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- storybook: 8.5.0(prettier@3.4.2)
- unplugin: 1.16.1
-
- '@storybook/csf@0.1.12':
- dependencies:
- type-fest: 2.19.0
-
- '@storybook/global@5.0.0': {}
-
- '@storybook/icons@1.3.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
-
- '@storybook/instrumenter@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- '@storybook/global': 5.0.0
- '@vitest/utils': 2.1.8
- storybook: 8.5.0(prettier@3.4.2)
-
- '@storybook/manager-api@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- storybook: 8.5.0(prettier@3.4.2)
-
- '@storybook/node-logger@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- storybook: 8.5.0(prettier@3.4.2)
-
- '@storybook/preview-api@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- storybook: 8.5.0(prettier@3.4.2)
-
- '@storybook/react-dom-shim@8.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- storybook: 8.5.0(prettier@3.4.2)
-
- '@storybook/react-vite@8.5.0(@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(rollup@4.31.0)(storybook@8.5.0(prettier@3.4.2))(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.1)(yaml@2.6.1))':
- dependencies:
- '@joshwooding/vite-plugin-react-docgen-typescript': 0.4.2(typescript@5.7.3)(vite@6.0.11(@types/node@22.10.1)(yaml@2.6.1))
- '@rollup/pluginutils': 5.1.4(rollup@4.31.0)
- '@storybook/builder-vite': 8.5.0(storybook@8.5.0(prettier@3.4.2))(vite@6.0.11(@types/node@22.10.1)(yaml@2.6.1))
- '@storybook/react': 8.5.0(@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@3.4.2))(typescript@5.7.3)
- find-up: 5.0.0
- magic-string: 0.30.17
- react: 18.3.1
- react-docgen: 7.1.0
- react-dom: 18.3.1(react@18.3.1)
- resolve: 1.22.10
- storybook: 8.5.0(prettier@3.4.2)
- tsconfig-paths: 4.2.0
- vite: 6.0.11(@types/node@22.10.1)(yaml@2.6.1)
- optionalDependencies:
- '@storybook/test': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- transitivePeerDependencies:
- - rollup
- - supports-color
- - typescript
-
- '@storybook/react@8.5.0(@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2)))(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@3.4.2))(typescript@5.7.3)':
- dependencies:
- '@storybook/components': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/global': 5.0.0
- '@storybook/manager-api': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/preview-api': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@storybook/react-dom-shim': 8.5.0(react-dom@18.3.1(react@18.3.1))(react@18.3.1)(storybook@8.5.0(prettier@3.4.2))
- '@storybook/theming': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- storybook: 8.5.0(prettier@3.4.2)
- optionalDependencies:
- '@storybook/test': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- typescript: 5.7.3
-
- '@storybook/test@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- '@storybook/csf': 0.1.12
- '@storybook/global': 5.0.0
- '@storybook/instrumenter': 8.5.0(storybook@8.5.0(prettier@3.4.2))
- '@testing-library/dom': 10.4.0
- '@testing-library/jest-dom': 6.5.0
- '@testing-library/user-event': 14.5.2(@testing-library/dom@10.4.0)
- '@vitest/expect': 2.0.5
- '@vitest/spy': 2.0.5
- storybook: 8.5.0(prettier@3.4.2)
-
- '@storybook/theming@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- storybook: 8.5.0(prettier@3.4.2)
-
- '@storybook/types@8.5.0(storybook@8.5.0(prettier@3.4.2))':
- dependencies:
- storybook: 8.5.0(prettier@3.4.2)
-
'@swc/core-darwin-arm64@1.9.3':
optional: true
@@ -7175,79 +6266,11 @@ snapshots:
dependencies:
'@swc/counter': 0.1.3
- '@testing-library/dom@10.4.0':
- dependencies:
- '@babel/code-frame': 7.26.2
- '@babel/runtime': 7.26.0
- '@types/aria-query': 5.0.4
- aria-query: 5.3.0
- chalk: 4.1.2
- dom-accessibility-api: 0.5.16
- lz-string: 1.5.0
- pretty-format: 27.5.1
-
- '@testing-library/jest-dom@6.5.0':
- dependencies:
- '@adobe/css-tools': 4.4.1
- aria-query: 5.3.2
- chalk: 3.0.0
- css.escape: 1.5.1
- dom-accessibility-api: 0.6.3
- lodash: 4.17.21
- redent: 3.0.0
-
- '@testing-library/jest-dom@6.6.3':
- dependencies:
- '@adobe/css-tools': 4.4.1
- aria-query: 5.3.2
- chalk: 3.0.0
- css.escape: 1.5.1
- dom-accessibility-api: 0.6.3
- lodash: 4.17.21
- redent: 3.0.0
-
- '@testing-library/react@16.1.0(@testing-library/dom@10.4.0)(@types/react-dom@18.3.1)(@types/react@18.3.14)(react-dom@18.3.1(react@18.3.1))(react@18.3.1)':
- dependencies:
- '@babel/runtime': 7.26.0
- '@testing-library/dom': 10.4.0
- react: 18.3.1
- react-dom: 18.3.1(react@18.3.1)
- optionalDependencies:
- '@types/react': 18.3.14
- '@types/react-dom': 18.3.1
-
- '@testing-library/user-event@14.5.2(@testing-library/dom@10.4.0)':
- dependencies:
- '@testing-library/dom': 10.4.0
-
'@tidyjs/tidy@2.5.2':
dependencies:
d3-array: 2.12.1
ts-toolbelt: 8.4.0
- '@types/aria-query@5.0.4': {}
-
- '@types/babel__core@7.20.5':
- dependencies:
- '@babel/parser': 7.26.5
- '@babel/types': 7.26.5
- '@types/babel__generator': 7.6.8
- '@types/babel__template': 7.4.4
- '@types/babel__traverse': 7.20.6
-
- '@types/babel__generator@7.6.8':
- dependencies:
- '@babel/types': 7.26.5
-
- '@types/babel__template@7.4.4':
- dependencies:
- '@babel/parser': 7.26.5
- '@babel/types': 7.26.5
-
- '@types/babel__traverse@7.20.6':
- dependencies:
- '@babel/types': 7.26.5
-
'@types/cookie@0.6.0': {}
'@types/d3-array@3.0.3': {}
@@ -7328,8 +6351,6 @@ snapshots:
'@types/date-arithmetic@4.1.4': {}
- '@types/doctrine@0.0.9': {}
-
'@types/estree@1.0.6': {}
'@types/geojson@7946.0.14': {}
@@ -7342,8 +6363,6 @@ snapshots:
'@types/lodash@4.17.13': {}
- '@types/mdx@2.0.13': {}
-
'@types/node@22.10.1':
dependencies:
undici-types: 6.20.0
@@ -7380,14 +6399,10 @@ snapshots:
'@types/prop-types': 15.7.13
csstype: 3.1.3
- '@types/resolve@1.20.6': {}
-
'@types/statuses@2.0.5': {}
'@types/tough-cookie@4.0.5': {}
- '@types/uuid@9.0.8': {}
-
'@types/warning@3.0.3': {}
'@typescript-eslint/eslint-plugin@8.20.0(@typescript-eslint/parser@8.20.0(eslint@8.57.1)(typescript@5.7.3))(eslint@8.57.1)(typescript@5.7.3)':
@@ -7419,11 +6434,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/scope-manager@8.18.0':
- dependencies:
- '@typescript-eslint/types': 8.18.0
- '@typescript-eslint/visitor-keys': 8.18.0
-
'@typescript-eslint/scope-manager@8.20.0':
dependencies:
'@typescript-eslint/types': 8.20.0
@@ -7440,24 +6450,8 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/types@8.18.0': {}
-
'@typescript-eslint/types@8.20.0': {}
- '@typescript-eslint/typescript-estree@8.18.0(typescript@5.7.3)':
- dependencies:
- '@typescript-eslint/types': 8.18.0
- '@typescript-eslint/visitor-keys': 8.18.0
- debug: 4.4.0
- fast-glob: 3.3.3
- is-glob: 4.0.3
- minimatch: 9.0.5
- semver: 7.6.3
- ts-api-utils: 1.4.3(typescript@5.7.3)
- typescript: 5.7.3
- transitivePeerDependencies:
- - supports-color
-
'@typescript-eslint/typescript-estree@8.20.0(typescript@5.7.3)':
dependencies:
'@typescript-eslint/types': 8.20.0
@@ -7472,17 +6466,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/utils@8.18.0(eslint@8.57.1)(typescript@5.7.3)':
- dependencies:
- '@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
- '@typescript-eslint/scope-manager': 8.18.0
- '@typescript-eslint/types': 8.18.0
- '@typescript-eslint/typescript-estree': 8.18.0(typescript@5.7.3)
- eslint: 8.57.1
- typescript: 5.7.3
- transitivePeerDependencies:
- - supports-color
-
'@typescript-eslint/utils@8.20.0(eslint@8.57.1)(typescript@5.7.3)':
dependencies:
'@eslint-community/eslint-utils': 4.4.1(eslint@8.57.1)
@@ -7494,11 +6477,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@typescript-eslint/visitor-keys@8.18.0':
- dependencies:
- '@typescript-eslint/types': 8.18.0
- eslint-visitor-keys: 4.2.0
-
'@typescript-eslint/visitor-keys@8.20.0':
dependencies:
'@typescript-eslint/types': 8.20.0
@@ -7657,13 +6635,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- '@vitest/expect@2.0.5':
- dependencies:
- '@vitest/spy': 2.0.5
- '@vitest/utils': 2.0.5
- chai: 5.1.2
- tinyrainbow: 1.2.0
-
'@vitest/expect@2.1.8':
dependencies:
'@vitest/spy': 2.1.8
@@ -7680,10 +6651,6 @@ snapshots:
msw: 2.7.0(@types/node@22.10.1)(typescript@5.7.3)
vite: 5.4.11(@types/node@22.10.1)
- '@vitest/pretty-format@2.0.5':
- dependencies:
- tinyrainbow: 1.2.0
-
'@vitest/pretty-format@2.1.8':
dependencies:
tinyrainbow: 1.2.0
@@ -7699,10 +6666,6 @@ snapshots:
magic-string: 0.30.14
pathe: 1.1.2
- '@vitest/spy@2.0.5':
- dependencies:
- tinyspy: 3.0.2
-
'@vitest/spy@2.1.8':
dependencies:
tinyspy: 3.0.2
@@ -7718,13 +6681,6 @@ snapshots:
tinyrainbow: 1.2.0
vitest: 2.1.8(@types/node@22.10.1)(@vitest/ui@2.1.8)(jsdom@26.0.0)(msw@2.7.0(@types/node@22.10.1)(typescript@5.7.3))
- '@vitest/utils@2.0.5':
- dependencies:
- '@vitest/pretty-format': 2.0.5
- estree-walker: 3.0.3
- loupe: 3.1.2
- tinyrainbow: 1.2.0
-
'@vitest/utils@2.1.8':
dependencies:
'@vitest/pretty-format': 2.1.8
@@ -7781,8 +6737,10 @@ snapshots:
debug: 4.4.0
transitivePeerDependencies:
- supports-color
+ optional: true
- agent-base@7.1.3: {}
+ agent-base@7.1.3:
+ optional: true
ajv@6.12.6:
dependencies:
@@ -7807,8 +6765,6 @@ snapshots:
dependencies:
color-convert: 2.0.1
- ansi-styles@5.2.0: {}
-
ansi-styles@6.2.1: {}
argparse@2.0.1: {}
@@ -7817,10 +6773,6 @@ snapshots:
dependencies:
tslib: 2.8.1
- aria-query@5.3.0:
- dependencies:
- dequal: 2.0.3
-
aria-query@5.3.2: {}
array-buffer-byte-length@1.0.1:
@@ -7914,11 +6866,8 @@ snapshots:
ast-types-flow@0.0.8: {}
- ast-types@0.16.1:
- dependencies:
- tslib: 2.8.1
-
- asynckit@0.4.0: {}
+ asynckit@0.4.0:
+ optional: true
available-typed-arrays@1.0.7:
dependencies:
@@ -7938,10 +6887,6 @@ snapshots:
balanced-match@1.0.2: {}
- better-opn@3.0.2:
- dependencies:
- open: 8.4.2
-
brace-expansion@1.1.11:
dependencies:
balanced-match: 1.0.2
@@ -7955,15 +6900,6 @@ snapshots:
dependencies:
fill-range: 7.1.1
- browser-assert@1.2.1: {}
-
- browserslist@4.24.4:
- dependencies:
- caniuse-lite: 1.0.30001695
- electron-to-chromium: 1.5.85
- node-releases: 2.0.19
- update-browserslist-db: 1.1.2(browserslist@4.24.4)
-
cac@6.7.14: {}
call-bind-apply-helpers@1.0.1:
@@ -7993,8 +6929,6 @@ snapshots:
callsites@3.1.0: {}
- caniuse-lite@1.0.30001695: {}
-
chai@5.1.2:
dependencies:
assertion-error: 2.0.1
@@ -8020,11 +6954,6 @@ snapshots:
- '@types/react'
- supports-color
- chalk@3.0.0:
- dependencies:
- ansi-styles: 4.3.0
- supports-color: 7.2.0
-
chalk@4.1.2:
dependencies:
ansi-styles: 4.3.0
@@ -8068,6 +6997,7 @@ snapshots:
combined-stream@1.0.8:
dependencies:
delayed-stream: 1.0.0
+ optional: true
commander@12.1.0: {}
@@ -8077,8 +7007,6 @@ snapshots:
convert-source-map@1.9.0: {}
- convert-source-map@2.0.0: {}
-
cookie@0.7.2: {}
copy-to-clipboard@3.3.3:
@@ -8103,12 +7031,11 @@ snapshots:
dependencies:
tiny-invariant: 1.3.3
- css.escape@1.5.1: {}
-
cssstyle@4.2.1:
dependencies:
'@asamuzakjp/css-color': 2.8.2
rrweb-cssom: 0.8.0
+ optional: true
csstype@3.1.3: {}
@@ -8206,6 +7133,7 @@ snapshots:
dependencies:
whatwg-mimetype: 4.0.0
whatwg-url: 14.1.0
+ optional: true
data-view-buffer@1.0.1:
dependencies:
@@ -8263,7 +7191,8 @@ snapshots:
dependencies:
ms: 2.1.3
- decimal.js@10.4.3: {}
+ decimal.js@10.4.3:
+ optional: true
deep-eql@5.0.2: {}
@@ -8275,8 +7204,6 @@ snapshots:
es-errors: 1.3.0
gopd: 1.2.0
- define-lazy-prop@2.0.0: {}
-
define-properties@1.2.1:
dependencies:
define-data-property: 1.1.4
@@ -8293,7 +7220,8 @@ snapshots:
dependencies:
delaunator: 4.0.1
- delayed-stream@1.0.0: {}
+ delayed-stream@1.0.0:
+ optional: true
dequal@2.0.3: {}
@@ -8307,10 +7235,6 @@ snapshots:
dependencies:
esutils: 2.0.3
- dom-accessibility-api@0.5.16: {}
-
- dom-accessibility-api@0.6.3: {}
-
dom-helpers@5.2.1:
dependencies:
'@babel/runtime': 7.26.0
@@ -8326,8 +7250,6 @@ snapshots:
eastasianwidth@0.2.0: {}
- electron-to-chromium@1.5.85: {}
-
emoji-regex@10.4.0: {}
emoji-regex@8.0.0: {}
@@ -8339,7 +7261,8 @@ snapshots:
graceful-fs: 4.2.11
tapable: 2.2.1
- entities@4.5.0: {}
+ entities@4.5.0:
+ optional: true
environment@1.1.0: {}
@@ -8556,13 +7479,6 @@ snapshots:
is-date-object: 1.1.0
is-symbol: 1.1.1
- esbuild-register@3.6.0(esbuild@0.24.2):
- dependencies:
- debug: 4.4.0
- esbuild: 0.24.2
- transitivePeerDependencies:
- - supports-color
-
esbuild@0.21.5:
optionalDependencies:
'@esbuild/aix-ppc64': 0.21.5
@@ -8738,15 +7654,6 @@ snapshots:
string.prototype.matchall: 4.0.12
string.prototype.repeat: 1.0.0
- eslint-plugin-testing-library@7.1.1(eslint@8.57.1)(typescript@5.7.3):
- dependencies:
- '@typescript-eslint/scope-manager': 8.18.0
- '@typescript-eslint/utils': 8.18.0(eslint@8.57.1)(typescript@5.7.3)
- eslint: 8.57.1
- transitivePeerDependencies:
- - supports-color
- - typescript
-
eslint-scope@7.2.2:
dependencies:
esrecurse: 4.3.0
@@ -8805,8 +7712,6 @@ snapshots:
acorn-jsx: 5.3.2(acorn@8.14.0)
eslint-visitor-keys: 3.4.3
- esprima@4.0.1: {}
-
esquery@1.6.0:
dependencies:
estraverse: 5.3.0
@@ -8817,8 +7722,6 @@ snapshots:
estraverse@5.3.0: {}
- estree-walker@2.0.2: {}
-
estree-walker@3.0.3:
dependencies:
'@types/estree': 1.0.6
@@ -8914,6 +7817,7 @@ snapshots:
asynckit: 0.4.0
combined-stream: 1.0.8
mime-types: 2.1.35
+ optional: true
framer-motion@11.12.0(@emotion/is-prop-valid@1.3.1)(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
dependencies:
@@ -8929,6 +7833,9 @@ snapshots:
fs.realpath@1.0.0: {}
+ fsevents@2.3.2:
+ optional: true
+
fsevents@2.3.3:
optional: true
@@ -8952,8 +7859,6 @@ snapshots:
functions-have-names@1.2.3: {}
- gensync@1.0.0-beta.2: {}
-
get-caller-file@2.0.5: {}
get-east-asian-width@1.3.0: {}
@@ -9108,6 +8013,7 @@ snapshots:
html-encoding-sniffer@4.0.0:
dependencies:
whatwg-encoding: 3.1.1
+ optional: true
html-escaper@2.0.2: {}
@@ -9117,6 +8023,7 @@ snapshots:
debug: 4.4.0
transitivePeerDependencies:
- supports-color
+ optional: true
https-proxy-agent@7.0.6:
dependencies:
@@ -9124,12 +8031,14 @@ snapshots:
debug: 4.4.0
transitivePeerDependencies:
- supports-color
+ optional: true
human-signals@5.0.0: {}
iconv-lite@0.6.3:
dependencies:
safer-buffer: 2.1.2
+ optional: true
ignore@5.3.2: {}
@@ -9140,8 +8049,6 @@ snapshots:
imurmurhash@0.1.4: {}
- indent-string@4.0.0: {}
-
inflight@1.0.6:
dependencies:
once: 1.4.0
@@ -9163,11 +8070,6 @@ snapshots:
dependencies:
loose-envify: 1.4.0
- is-arguments@1.2.0:
- dependencies:
- call-bound: 1.0.3
- has-tostringtag: 1.0.2
-
is-array-buffer@3.0.4:
dependencies:
call-bind: 1.0.8
@@ -9232,8 +8134,6 @@ snapshots:
call-bound: 1.0.3
has-tostringtag: 1.0.2
- is-docker@2.2.1: {}
-
is-extglob@2.1.1: {}
is-finalizationregistry@1.1.1:
@@ -9278,7 +8178,8 @@ snapshots:
is-path-inside@3.0.3: {}
- is-potential-custom-element-name@1.0.1: {}
+ is-potential-custom-element-name@1.0.1:
+ optional: true
is-regex@1.2.0:
dependencies:
@@ -9340,10 +8241,6 @@ snapshots:
call-bound: 1.0.3
get-intrinsic: 1.2.6
- is-wsl@2.2.0:
- dependencies:
- is-docker: 2.2.1
-
isarray@2.0.5: {}
isexe@2.0.0: {}
@@ -9390,8 +8287,6 @@ snapshots:
dependencies:
argparse: 2.0.1
- jsdoc-type-pratt-parser@4.1.0: {}
-
jsdom@26.0.0:
dependencies:
cssstyle: 4.2.1
@@ -9419,6 +8314,7 @@ snapshots:
- bufferutil
- supports-color
- utf-8-validate
+ optional: true
jsesc@3.1.0: {}
@@ -9436,8 +8332,6 @@ snapshots:
dependencies:
minimist: 1.2.8
- json5@2.2.3: {}
-
jsx-ast-utils@3.3.5:
dependencies:
array-includes: 3.1.8
@@ -9516,28 +8410,15 @@ snapshots:
lru-cache@10.4.3: {}
- lru-cache@11.0.2: {}
-
- lru-cache@5.1.1:
- dependencies:
- yallist: 3.1.1
+ lru-cache@11.0.2:
+ optional: true
luxon@3.5.0: {}
- lz-string@1.5.0: {}
-
- magic-string@0.27.0:
- dependencies:
- '@jridgewell/sourcemap-codec': 1.5.0
-
magic-string@0.30.14:
dependencies:
'@jridgewell/sourcemap-codec': 1.5.0
- magic-string@0.30.17:
- dependencies:
- '@jridgewell/sourcemap-codec': 1.5.0
-
magicast@0.3.5:
dependencies:
'@babel/parser': 7.26.2
@@ -9548,18 +8429,12 @@ snapshots:
dependencies:
semver: 7.6.3
- map-or-similar@1.5.0: {}
-
math-expression-evaluator@1.4.0: {}
math-intrinsics@1.1.0: {}
memoize-one@6.0.0: {}
- memoizerific@1.11.3:
- dependencies:
- map-or-similar: 1.5.0
-
merge-stream@2.0.0: {}
merge2@1.4.1: {}
@@ -9569,18 +8444,18 @@ snapshots:
braces: 3.0.3
picomatch: 2.3.1
- mime-db@1.52.0: {}
+ mime-db@1.52.0:
+ optional: true
mime-types@2.1.35:
dependencies:
mime-db: 1.52.0
+ optional: true
mimic-fn@4.0.0: {}
mimic-function@5.0.1: {}
- min-indent@1.0.1: {}
-
minimatch@3.1.2:
dependencies:
brace-expansion: 1.1.11
@@ -9636,13 +8511,12 @@ snapshots:
natural-compare@1.4.0: {}
- node-releases@2.0.19: {}
-
npm-run-path@5.3.0:
dependencies:
path-key: 4.0.0
- nwsapi@2.2.16: {}
+ nwsapi@2.2.16:
+ optional: true
object-assign@4.1.1: {}
@@ -9703,12 +8577,6 @@ snapshots:
dependencies:
mimic-function: 5.0.1
- open@8.4.2:
- dependencies:
- define-lazy-prop: 2.0.0
- is-docker: 2.2.1
- is-wsl: 2.2.0
-
optimism@0.18.1:
dependencies:
'@wry/caches': 1.0.1
@@ -9757,6 +8625,7 @@ snapshots:
parse5@7.2.1:
dependencies:
entities: 4.5.0
+ optional: true
path-exists@4.0.0: {}
@@ -9789,9 +8658,13 @@ snapshots:
pidtree@0.6.0: {}
- polished@4.3.1:
+ playwright-core@1.49.1: {}
+
+ playwright@1.49.1:
dependencies:
- '@babel/runtime': 7.26.0
+ playwright-core: 1.49.1
+ optionalDependencies:
+ fsevents: 2.3.2
possible-typed-array-names@1.0.0: {}
@@ -9805,14 +8678,6 @@ snapshots:
prettier@3.4.2: {}
- pretty-format@27.5.1:
- dependencies:
- ansi-regex: 5.0.1
- ansi-styles: 5.2.0
- react-is: 17.0.2
-
- process@0.11.10: {}
-
prop-types@15.8.1:
dependencies:
loose-envify: 1.4.0
@@ -9857,25 +8722,6 @@ snapshots:
react-csv@2.2.2: {}
- react-docgen-typescript@2.2.2(typescript@5.7.3):
- dependencies:
- typescript: 5.7.3
-
- react-docgen@7.1.0:
- dependencies:
- '@babel/core': 7.26.0
- '@babel/traverse': 7.26.5
- '@babel/types': 7.26.5
- '@types/babel__core': 7.20.5
- '@types/babel__traverse': 7.20.6
- '@types/doctrine': 0.0.9
- '@types/resolve': 1.20.6
- doctrine: 3.0.0
- resolve: 1.22.10
- strip-indent: 4.0.0
- transitivePeerDependencies:
- - supports-color
-
react-dom@18.3.1(react@18.3.1):
dependencies:
loose-envify: 1.4.0
@@ -9906,8 +8752,6 @@ snapshots:
react-is@16.13.1: {}
- react-is@17.0.2: {}
-
react-lifecycles-compat@3.0.4: {}
react-overlays@5.2.1(react-dom@18.3.1(react@18.3.1))(react@18.3.1):
@@ -10003,19 +8847,6 @@ snapshots:
dependencies:
loose-envify: 1.4.0
- recast@0.23.9:
- dependencies:
- ast-types: 0.16.1
- esprima: 4.0.1
- source-map: 0.6.1
- tiny-invariant: 1.3.3
- tslib: 2.8.1
-
- redent@3.0.0:
- dependencies:
- indent-string: 4.0.0
- strip-indent: 3.0.0
-
reduce-css-calc@1.3.0:
dependencies:
balanced-match: 0.4.2
@@ -10122,7 +8953,8 @@ snapshots:
'@rollup/rollup-win32-x64-msvc': 4.31.0
fsevents: 2.3.3
- rrweb-cssom@0.8.0: {}
+ rrweb-cssom@0.8.0:
+ optional: true
run-parallel@1.2.0:
dependencies:
@@ -10153,11 +8985,13 @@ snapshots:
es-errors: 1.3.0
is-regex: 1.2.1
- safer-buffer@2.1.2: {}
+ safer-buffer@2.1.2:
+ optional: true
saxes@6.0.0:
dependencies:
xmlchars: 2.2.0
+ optional: true
scheduler@0.23.2:
dependencies:
@@ -10247,8 +9081,6 @@ snapshots:
source-map@0.5.7: {}
- source-map@0.6.1: {}
-
stable-hash@0.0.4: {}
stackback@0.0.2: {}
@@ -10257,16 +9089,6 @@ snapshots:
std-env@3.8.0: {}
- storybook@8.5.0(prettier@3.4.2):
- dependencies:
- '@storybook/core': 8.5.0(prettier@3.4.2)
- optionalDependencies:
- prettier: 3.4.2
- transitivePeerDependencies:
- - bufferutil
- - supports-color
- - utf-8-validate
-
strict-event-emitter@0.5.1: {}
string-argv@0.3.2: {}
@@ -10364,14 +9186,6 @@ snapshots:
strip-final-newline@3.0.0: {}
- strip-indent@3.0.0:
- dependencies:
- min-indent: 1.0.1
-
- strip-indent@4.0.0:
- dependencies:
- min-indent: 1.0.1
-
strip-json-comments@3.1.1: {}
stylis@4.2.0: {}
@@ -10384,7 +9198,8 @@ snapshots:
symbol-observable@4.0.0: {}
- symbol-tree@3.2.4: {}
+ symbol-tree@3.2.4:
+ optional: true
tapable@2.2.1: {}
@@ -10413,11 +9228,13 @@ snapshots:
tinyspy@3.0.2: {}
- tldts-core@6.1.65: {}
+ tldts-core@6.1.65:
+ optional: true
tldts@6.1.65:
dependencies:
tldts-core: 6.1.65
+ optional: true
to-regex-range@5.0.1:
dependencies:
@@ -10437,14 +9254,12 @@ snapshots:
tough-cookie@5.0.0:
dependencies:
tldts: 6.1.65
+ optional: true
tr46@5.0.0:
dependencies:
punycode: 2.3.1
-
- ts-api-utils@1.4.3(typescript@5.7.3):
- dependencies:
- typescript: 5.7.3
+ optional: true
ts-api-utils@2.0.0(typescript@5.7.3):
dependencies:
@@ -10452,8 +9267,6 @@ snapshots:
ts-custom-error@3.3.1: {}
- ts-dedent@2.2.0: {}
-
ts-invariant@0.10.3:
dependencies:
tslib: 2.8.1
@@ -10475,12 +9288,6 @@ snapshots:
minimist: 1.2.8
strip-bom: 3.0.0
- tsconfig-paths@4.2.0:
- dependencies:
- json5: 2.2.3
- minimist: 1.2.8
- strip-bom: 3.0.0
-
tslib@2.4.0: {}
tslib@2.8.1: {}
@@ -10493,8 +9300,6 @@ snapshots:
type-fest@0.21.3: {}
- type-fest@2.19.0: {}
-
type-fest@4.29.0: {}
typed-array-buffer@1.0.2:
@@ -10582,17 +9387,6 @@ snapshots:
universalify@0.2.0: {}
- unplugin@1.16.1:
- dependencies:
- acorn: 8.14.0
- webpack-virtual-modules: 0.6.2
-
- update-browserslist-db@1.1.2(browserslist@4.24.4):
- dependencies:
- browserslist: 4.24.4
- escalade: 3.2.0
- picocolors: 1.1.1
-
uri-js@4.4.1:
dependencies:
punycode: 2.3.1
@@ -10623,16 +9417,6 @@ snapshots:
optionalDependencies:
'@types/react': 18.3.14
- util@0.12.5:
- dependencies:
- inherits: 2.0.4
- is-arguments: 1.2.0
- is-generator-function: 1.1.0
- is-typed-array: 1.1.15
- which-typed-array: 1.1.18
-
- uuid@9.0.1: {}
-
victory-area@37.3.6(react@18.3.1):
dependencies:
lodash: 4.17.21
@@ -10962,25 +9746,28 @@ snapshots:
w3c-xmlserializer@5.0.0:
dependencies:
xml-name-validator: 5.0.0
+ optional: true
warning@4.0.3:
dependencies:
loose-envify: 1.4.0
- webidl-conversions@7.0.0: {}
-
- webpack-virtual-modules@0.6.2: {}
+ webidl-conversions@7.0.0:
+ optional: true
whatwg-encoding@3.1.1:
dependencies:
iconv-lite: 0.6.3
+ optional: true
- whatwg-mimetype@4.0.0: {}
+ whatwg-mimetype@4.0.0:
+ optional: true
whatwg-url@14.1.0:
dependencies:
tr46: 5.0.0
webidl-conversions: 7.0.0
+ optional: true
which-boxed-primitive@1.0.2:
dependencies:
@@ -11075,16 +9862,17 @@ snapshots:
wrappy@1.0.2: {}
- ws@8.18.0: {}
+ ws@8.18.0:
+ optional: true
- xml-name-validator@5.0.0: {}
+ xml-name-validator@5.0.0:
+ optional: true
- xmlchars@2.2.0: {}
+ xmlchars@2.2.0:
+ optional: true
y18n@5.0.8: {}
- yallist@3.1.1: {}
-
yaml@1.10.2: {}
yaml@2.6.1: {}
diff --git a/shared-components/statviz/components/visualizations/movedBoxes/MovedBoxes.test.tsx b/shared-components/statviz/components/visualizations/movedBoxes/MovedBoxes.test.tsx
deleted file mode 100644
index fc8e70f80..000000000
--- a/shared-components/statviz/components/visualizations/movedBoxes/MovedBoxes.test.tsx
+++ /dev/null
@@ -1,53 +0,0 @@
-import { it, expect } from "vitest";
-import MovedBoxesDataContainer, { MOVED_BOXES_QUERY } from "./MovedBoxesDataContainer";
-import { render, screen } from "../../../../tests/testUtils";
-import { GraphQLError } from "graphql";
-
-export class FakeGraphQLError extends GraphQLError {
- constructor(errorCode?: string, errorDescription?: string) {
- super(
- "Fake GraphQL Error",
- errorCode ? { extensions: { code: errorCode, description: errorDescription } } : undefined,
- );
- }
-}
-
-export class FakeGraphQLNetworkError extends Error {
- constructor() {
- super("Fake GraphQL Network Error");
- }
-}
-
-const mockFailedMovedBoxesQuery = ({ baseId = 1, networkError = false }) => ({
- request: {
- query: MOVED_BOXES_QUERY,
- variables: { baseId },
- },
- result: networkError
- ? undefined
- : {
- data: null,
- errors: [new FakeGraphQLError()],
- },
- error: networkError ? new FakeGraphQLNetworkError() : undefined,
-});
-
-const movedBoxesDataTests = [
- {
- name: "x.x.x.x - user scans wants to see movedBoxes viz, but a network error is returned",
- mocks: [mockFailedMovedBoxesQuery({ networkError: true })],
- alert: /An unexpected error happened/i,
- },
-];
-
-movedBoxesDataTests.forEach(({ name, mocks, alert }) => {
- it(name, async () => {
- render( , {
- routePath: "/bases/:baseId/",
- initialUrl: "/bases/1/",
- mocks,
- });
-
- expect(await screen.findByText(alert)).toBeInTheDocument();
- });
-});
diff --git a/shared-components/statviz/components/visualizations/stock/StockDataFilter.test.tsx b/shared-components/statviz/components/visualizations/stock/StockDataFilter.test.tsx
deleted file mode 100644
index 787ec8937..000000000
--- a/shared-components/statviz/components/visualizations/stock/StockDataFilter.test.tsx
+++ /dev/null
@@ -1,133 +0,0 @@
-import { it, expect } from "vitest";
-import { filter, tidy } from "@tidyjs/tidy";
-
-import { userEvent } from "@testing-library/user-event";
-import { render, screen } from "../../../../tests/testUtils";
-
-import StockDataFilter from "./StockDataFilter";
-import { StockOverviewResult } from "../../../../../graphql/types";
-
-it("x.x.x.x - User clicks on 'Gender' filter in drilldown chart", async () => {
- render(
- ,
- {
- routePath: "/bases/:baseId/",
- initialUrl: "/bases/1/",
- },
- );
-
- const filterDropdown = screen.getByRole("combobox");
- await userEvent.click(filterDropdown);
-
- const dropdownOption = screen.getByText(/gender/i);
- expect(dropdownOption).toBeInTheDocument();
-
- await userEvent.click(dropdownOption);
-
- expect(await screen.findByText(/Drilldown Chart of Instock Boxes/)).toBeInTheDocument();
-});
-
-it("should filter out only items with boxState === 'InStock'", () => {
- // TODO: Make the data be returned in the mocks
- const data: Partial[] = [
- {
- __typename: "StockOverviewResult",
- boxState: "InStock",
- boxesCount: 1,
- categoryId: 1,
- gender: "UnisexAdult",
- itemsCount: 5,
- locationId: 100000036,
- productName: "underwear",
- sizeId: 42,
- tagIds: [45],
- },
- {
- __typename: "StockOverviewResult",
- boxState: "Donated",
- boxesCount: 20,
- categoryId: 2,
- gender: "UnisexAdult",
- itemsCount: 8,
- locationId: 100000036,
- productName: "underwear",
- sizeId: 38,
- tagIds: [3],
- },
- {
- __typename: "StockOverviewResult",
- boxState: "InStock",
- boxesCount: 15,
- categoryId: 1,
- gender: "UnisexAdult",
- itemsCount: 6,
- locationId: 100000036,
- productName: "underwear",
- sizeId: 40,
- tagIds: [1, 4],
- },
- ];
-
- const inStockFilter = filter((fact: StockOverviewResult) => fact.boxState === "InStock");
- const filteredData = tidy(data, inStockFilter) as StockOverviewResult[];
-
- expect(filteredData.length).toBe(2);
- expect(filteredData.every((fact) => fact.boxState === "InStock")).toBe(true);
-});
diff --git a/shared-components/tests/setupTests.ts b/shared-components/tests/setupTests.ts
deleted file mode 100644
index ca1482f46..000000000
--- a/shared-components/tests/setupTests.ts
+++ /dev/null
@@ -1,21 +0,0 @@
-// jest-dom adds custom jest matchers for asserting on DOM nodes.
-// allows you to do things like:
-// expect(element).toHaveTextContent(/react/i)
-// learn more: https://github.com/testing-library/jest-dom
-import "@testing-library/jest-dom";
-import { vi } from "vitest";
-
-Object.defineProperty(window, "matchMedia", {
- // workaround for window.matchMedia not found used by chakraUI, see https://github.com/vitest-dev/vitest/issues/821 for more information
- writable: true,
- value: vi.fn().mockImplementation((query) => ({
- matches: false,
- media: query,
- onchange: null,
- addListener: vi.fn(), // deprecated
- removeListener: vi.fn(), // deprecated
- addEventListener: vi.fn(),
- removeEventListener: vi.fn(),
- dispatchEvent: vi.fn(),
- })),
-});
diff --git a/shared-components/tests/testUtils.tsx b/shared-components/tests/testUtils.tsx
deleted file mode 100644
index 2e46bb25a..000000000
--- a/shared-components/tests/testUtils.tsx
+++ /dev/null
@@ -1,95 +0,0 @@
-/* eslint-disable import/export */
-// TODO: Investigate possible render function overload.
-
-import React from "react";
-import { render as rtlRender } from "@testing-library/react";
-import { MockedProvider, MockedResponse, MockLink } from "@apollo/client/testing";
-import { onError } from "@apollo/client/link/error";
-import { MemoryRouter, Route, Routes } from "react-router-dom";
-import { ChakraProvider } from "@chakra-ui/react";
-import { ApolloLink, DefaultOptions } from "@apollo/client";
-import { theme } from "../utils/theme";
-
-// Options for Apollo MockProvider
-const defaultOptions: DefaultOptions = {
- query: {
- errorPolicy: "all",
- },
- mutate: {
- errorPolicy: "all",
- },
-};
-
-/**
- * Renders a React component with Apollo GraphQL client and @testing-library/react.
- *
- * @param {React.ReactElement} ui - The React element to render.
- * @param {Object} options - The options object.
- * @param {MockedResponse[]} options.mocks - An array of `MockedResponse` objects from `@apollo/client/testing`. These objects define the mocked responses for GraphQL queries and mutations.
- * @param {string} options.routePath - A string representing the path of the route that the `ui` component should be rendered at.
- * @param {string} options.initialUrl - A string representing the initial URL that the `MemoryRouter` should be initialized with.
- * @param {string} [options.additionalRoute] - A string representing a path the `ui` component might redirect to.
- * @param {boolean} [options.addTypename=false] - Whether to include the `__typename` field in query results.
- * @returns {Object} An object containing the rendered component and functions for interacting with it.
- */
-
-function render(
- ui,
- {
- mocks = [],
- addTypename = false,
- routePath,
- initialUrl,
- additionalRoute = undefined,
- ...renderOptions
- }: {
- mocks?: Array;
- addTypename?: boolean;
- routePath: string;
- initialUrl: string;
- additionalRoute?: string;
- },
-) {
- // Log if there is an error in the mock
- const mockLink = new MockLink(mocks);
- const errorLoggingLink = onError(({ graphQLErrors, networkError }) => {
- if (graphQLErrors) {
- graphQLErrors.map(({ message, locations, path }) =>
- console.error(
- `[GraphQL error]: Message: ${message}, Location: ${locations}, Path: ${path}`,
- ),
- );
- }
- if (networkError) {
- console.error(`[Network error]: ${networkError}`);
- }
- });
- const link = ApolloLink.from([errorLoggingLink, mockLink]);
-
- const Wrapper: React.FC = ({ children }: any) => (
-
-
-
-
- {additionalRoute !== undefined && (
- {additionalRoute}} />
- )}
-
-
-
-
-
- );
- return rtlRender(ui, {
- wrapper: Wrapper,
- ...renderOptions,
- });
-}
-
-export * from "@testing-library/react";
-export { render };
diff --git a/tests/app.spec.ts b/tests/app.spec.ts
new file mode 100644
index 000000000..5206ed974
--- /dev/null
+++ b/tests/app.spec.ts
@@ -0,0 +1,136 @@
+import { test, expect } from '@playwright/test';
+
+const BASE_URL = 'http://localhost:3000';
+
+test.describe('Boxtribute Web App', () => {
+ test.beforeEach('Open Boxtribute', async ({ page }) => {
+ await page.goto(BASE_URL, { waitUntil: "domcontentloaded" });
+ });
+
+ test('Sanity check', async ({ page }) => {
+ await expect(page.getByText("Settings")).toBeVisible();
+ });
+
+ // TODO: Fix auth setup and menu tests.
+ test.describe('1.3 - Menus are available to the user depending on ABPs', async () => {
+ test.skip("1.3.1 - Menus are available to the user depending on ABPs - freeshop.volunteer", async ({ page }) => {
+ // test.use({ storageState: FREESHOP_VOLUNTEER_PATH });
+
+ await expect(page.getByRole("button", { name: /Statistics/ })).toBeVisible();
+ await expect(page.getByRole("button", { name: /Aid Inventory/ })).not.toBeVisible();
+ await expect(page.getByRole("button", { name: /Coordinator Admin/ })).not.toBeVisible();
+ });
+
+ test.skip("1.3.2 - Menus are available to the user depending on ABPs - warehouse.volunteer", async ({ page }) => {
+ // test.use({ storageState: WAREHOUSE_VOLUNTEER_PATH });
+
+ await expect(page.getByText("Settings")).toBeVisible();
+ await expect(page.getByRole("button", { name: /Statistics/ })).toBeVisible();
+ await expect(page.getByRole("button", { name: /Print Box Labels/ })).not.toBeVisible();
+ await expect(page.getByRole("button", { name: /Manage Boxes/ })).not.toBeVisible();
+ await expect(page.getByRole("button", { name: /Classic Manage Boxes/ })).not.toBeVisible();
+ });
+
+ test.skip("1.3.3 - Menus are available to the user depending on ABPs - dev_volunteer", async ({ page }) => {
+ // test.use({ storageState: DEV_VOLUNTEER_PATH });
+
+ await expect(page.getByText("Settings")).toBeVisible();
+ await expect(page.getByRole("button", { name: /Statistics/ })).toBeVisible();
+ await expect(page.getByRole("button", { name: /Aid Inventory/ })).not.toBeVisible();
+ await expect(page.getByRole("button", { name: /Coordinator Admin/ })).not.toBeVisible();
+ });
+
+ test("1.3.4 - Menus available to the user depending on ABPs - dev_coordinator", async ({ page }) => {
+ // test.use({ storageState: DEV_COORDINATOR_PATH });
+
+ await expect(page.getByText("Settings")).toBeVisible();
+ await expect(page.getByRole("button", { name: /Statistics/ })).toBeVisible();
+ await expect(page.getByRole("button", { name: /Aid Inventory/ })).toBeVisible();
+ await expect(page.getByRole("button", { name: /Aid Transfers/ })).toBeVisible();
+ await expect(page.getByRole("button", { name: /Beneficiaries/ })).toBeVisible();
+ await expect(page.getByRole("button", { name: /Free Shop/ })).toBeVisible();
+ await expect(page.getByRole("button", { name: /Coordinator Admin/ })).toBeVisible();
+ });
+
+ test.skip("1.3.5 - Menus available to the user depending on ABPs - some.admin (god user)", async ({ page }) => {
+ // test.use({ storageState: SOME_ADMIN_PATH });
+
+ await expect(page.getByText("Settings")).toBeVisible();
+ await expect(page.getByRole("button", { name: /Statistics/ })).toBeVisible();
+ await expect(page.getByRole("button", { name: /Aid Inventory/ })).not.toBeVisible();
+ await expect(page.getByRole("button", { name: /Coordinator Admin/ })).not.toBeVisible();
+ });
+ });
+
+ test.describe('3.1 - BoxView', async () => {
+ test("3.1.1 - Initial load of Page", async ({ page }) => {
+ await page.getByRole('button', { name: 'Aid Inventory' }).click();
+ await page.getByText('Manage Boxes beta').click();
+ await page.getByRole('cell', { name: '28504995' }).click();
+ // 3.1.1.2 - Content: Heading renders correctly with valid box identifier
+ await expect(page.getByTestId('box-header')).toContainText('Box 28504995');
+ // 3.1.1.3 - Content: Renders sub heading with valid state for an Instock Box
+ await expect(page.getByTestId('box-subheader')).toContainText('Status:');
+ await expect(page.getByTestId('box-state')).toContainText('InStock');
+ await expect(page.getByTestId('boxview-number-items')).toContainText('343x Inhalation device');
+ // 3.1.1.5 - Content: Box Tags are shown correctly
+ await expect(page.getByTestId('box-tags')).toContainText('two');
+ // TODO: We shouldn't be testing CSS properties...
+ // 3.1.1.3.1 - Content: State color for Instock Box is correct
+ await expect(page.locator('span').filter({ hasText: 'two' }).first()).toHaveCSS('background', "rgb(249, 240, 179) none repeat scroll 0% 0% / auto padding-box border-box");
+ await expect(page.getByTestId('box-tags')).toContainText('maintain');
+ await expect(page.getByTestId('box-tags')).toContainText('or');
+ await expect(page.getByTestId('box-sections')).toContainText('History:');
+ await expect(page.getByTestId(/history-/).getByRole('paragraph')).toContainText(/Dev Coordinator on /);
+ // 3.1.1.6 - Content: Comment section renders correctly
+ await page.getByLabel('Edit box').click();
+ await page.getByRole('textbox').click();
+ await page.getByRole('textbox').fill('Good comment');
+ await page.getByRole('button', { name: 'Update Box' }).click();
+ await expect(page.getByTestId('box-sections')).toContainText('Comment: Good comment');
+ });
+
+ // TODO: add fixture for a box with legacy location and a legacy location
+ test.skip("3.1.1.7 - Content: Display an warning note if a box is located in a legacy location", async ({ page }) => {
+ await expect(page.getByText("Settings")).toBeVisible();
+ });
+
+ test("3.1.1.8 - Content: Display an info alert if a box status is Lost", async ({ page }) => {
+ await page.getByRole('button', { name: 'Aid Inventory' }).click();
+ await page.getByText('Manage Boxes beta').click();
+ await page.getByRole('cell', { name: '28504995' }).click();
+ await page.getByTestId('box-lost-btn').locator('span').first().click();
+ await expect(page.getByRole('status')).toContainText('Box 28504995');
+ await expect(page.getByRole('status')).toContainText('Successfully updated the box status to Lost');
+ await expect(page.getByRole('alert')).toContainText('Note');
+ await expect(page.getByRole('alert')).toContainText('To edit or move this box, remove the Lost status.');
+ // 3.1.3.2.1 - Change state on Lost Toggled
+ await expect(page.getByTestId('box-subheader')).toContainText('Status:');
+ await expect(page.getByTestId('box-state')).toContainText('Lost');
+ });
+
+ test("3.1.1.9 - Content: Display an info alert if a box status is Scrap", async ({ page }) => {
+ await page.getByRole('button', { name: 'Aid Inventory' }).click();
+ await page.getByText('Manage Boxes beta').click();
+ await page.getByRole('cell', { name: '28504995' }).click();
+ // 3.1.3.1 - Change State to Scrap
+ await page.getByTestId('box-scrap-btn').locator('span').first().click();
+ await expect(page.getByRole('status')).toContainText('Box 28504995');
+ await expect(page.getByRole('status')).toContainText('Successfully updated the box status to Scrap');
+ await expect(page.getByRole('alert')).toContainText('Note');
+ await expect(page.getByRole('alert')).toContainText('To edit or move this box, remove the Scrap status.');
+ // 3.1.3.1.1 - Change state on Scrap Toggled
+ await expect(page.getByTestId('box-subheader')).toContainText('Status:');
+ await expect(page.getByTestId('box-state')).toContainText('Scrap');
+ });
+
+ });
+
+ test.describe('3.1.2 - Change Number of Items', async () => {
+
+ });
+
+ test.describe('3.1.3 - Change State to Scrap and Lost', async () => {
+
+ });
+});
diff --git a/tests/auth.setup.ts b/tests/auth.setup.ts
new file mode 100644
index 000000000..065a16957
--- /dev/null
+++ b/tests/auth.setup.ts
@@ -0,0 +1,43 @@
+import { test as setup, expect, chromium } from '@playwright/test';
+
+const BASE_URL = 'http://localhost:3000';
+
+const SOME_ADMIN_PATH = "playwright/.auth/some.admin.json";
+const DEV_COORDINATOR_PATH = "playwright/.auth/dev_coordinator.json";
+const DEV_VOLUNTEER_PATH = "playwright/.auth/dev_volunteer.json";
+const WAREHOUSE_VOLUNTEER_PATH = "playwright/.auth/warehouse.volunteer.json";
+const FREESHOP_VOLUNTEER_PATH = "playwright/.auth/freeshop.volunteer.json";
+
+export function authSetup(email: string, path: string) {
+ return async () => {
+ const browser = await chromium.launch();
+ const page = await browser.newPage();
+ await page.goto(BASE_URL);
+ await page.getByLabel('Email address').fill(email);
+ await page.getByLabel('Password').fill('Browser_tests');
+ await page.getByText('Continue').click();
+ await expect(page.getByText("Settings")).toBeVisible({ timeout: 30000 });
+ await page.context().storageState({ path });
+ await browser.close();
+ };
+}
+
+setup('authenticate as some.admin (god user)', async () => {
+ authSetup("some.admin@boxtribute.org", SOME_ADMIN_PATH);
+});
+
+setup('authenticate as dev_coordinator', async () => {
+ authSetup("dev_coordinator@boxcare.org", DEV_COORDINATOR_PATH);
+});
+
+setup('authenticate as dev_volunteer', async () => {
+ authSetup("dev_volunteer@boxcare.org", DEV_VOLUNTEER_PATH);
+});
+
+setup('authenticate as warehouse.volunteer', async () => {
+ authSetup("warehouse.volunteer@athens.org", WAREHOUSE_VOLUNTEER_PATH);
+});
+
+setup('authenticate as freeshop.volunteer', async () => {
+ authSetup("freeshop.volunteer@athens.org", FREESHOP_VOLUNTEER_PATH);
+});
diff --git a/tests/fixtures.ts b/tests/fixtures.ts
new file mode 100644
index 000000000..dfbfe61e6
--- /dev/null
+++ b/tests/fixtures.ts
@@ -0,0 +1,73 @@
+/* prettier-ignore */
+export const Auth0 = {
+ user: { "https://www.boxtribute.com/actions": ["accept_transfer_agreement", "be_user", "cancel_shipment", "cancel_transfer_agreement", "checkout_beneficiaries", "create_beneficiaries", "create_label", "create_shipment", "create_transfer_agreement", "delete_beneficiary", "delete_transactions", "fill_shipment", "list_sales", "manage_beneficiaries", "manage_distro_events", "manage_distro_spots", "manage_inventory", "manage_products", "manage_tags", "manage_tokens", "manage_volunteers", "manage_warehouses", "operate_distro_events", "receive_shipment", "reject_transfer_agreement", "send_shipment", "view_beneficiary_graph", "view_inventory", "view_shipments", "view_start_page", "view_transfer_agreements"], "https://www.boxtribute.com/roles": ["base_2_coordinator", "base_3_coordinator"], "https://www.boxtribute.com/organisation_id": 2, "https://www.boxtribute.com/base_ids": [2, 3], "https://www.boxtribute.com/country": "Brazil", "https://www.boxtribute.com/timezone": "America/Sao_Paulo", "https://www.boxtribute.com/beta_user": 3, "nickname": "dev_coordinator", "name": "Dev Coordinator", "picture": "https://s.gravatar.com/avatar/076a89d48754136a0a1ac3afa082f9d8?s=480&r=pg&d=https%3A%2F%2Fcdn.auth0.com%2Favatars%2Fdc.png", "updated_at": "2024-12-06T01:20:17.445Z", "email": "dev_coordinator@boxcare.org", "email_verified": false, "sub": "auth0|17" },
+}
+
+export const devCoordinator = {
+ OrganisationAndBases: { "data": { "bases": [{ "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }] } },
+ createdBoxes: { "data": { "createdBoxes": { "__typename": "CreatedBoxesData", "dimensions": { "__typename": "CreatedBoxDataDimensions", "category": [{ "__typename": "DimensionInfo", "id": 1, "name": "Underwear / Nightwear" }, { "__typename": "DimensionInfo", "id": 2, "name": "Bottoms" }, { "__typename": "DimensionInfo", "id": 3, "name": "Tops" }, { "__typename": "DimensionInfo", "id": 4, "name": "Accessories" }, { "__typename": "DimensionInfo", "id": 5, "name": "Shoes" }, { "__typename": "DimensionInfo", "id": 6, "name": "Jackets / Outerwear" }, { "__typename": "DimensionInfo", "id": 7, "name": "Skirts/Dresses" }, { "__typename": "DimensionInfo", "id": 8, "name": "Baby" }, { "__typename": "DimensionInfo", "id": 9, "name": "Other" }, { "__typename": "DimensionInfo", "id": 10, "name": "Hygiene" }, { "__typename": "DimensionInfo", "id": 11, "name": "Food & Kitchen" }, { "__typename": "DimensionInfo", "id": 12, "name": "Clothing" }, { "__typename": "DimensionInfo", "id": 13, "name": "Equipment" }, { "__typename": "DimensionInfo", "id": 14, "name": "Toys & Games" }, { "__typename": "DimensionInfo", "id": 15, "name": "Medication" }, { "__typename": "DimensionInfo", "id": 18, "name": "Books & Stationery" }, { "__typename": "DimensionInfo", "id": 19, "name": "Water" }, { "__typename": "DimensionInfo", "id": 20, "name": "Shelter" }], "product": [{ "__typename": "ProductDimensionInfo", "gender": "Men", "id": 1251, "name": "Underwear" }, { "__typename": "ProductDimensionInfo", "gender": "Girl", "id": 1252, "name": "Underwear" }, { "__typename": "ProductDimensionInfo", "gender": "Boy", "id": 1253, "name": "Underwear" }, { "__typename": "ProductDimensionInfo", "gender": "Women", "id": 1254, "name": "Tights" }, { "__typename": "ProductDimensionInfo", "gender": "Men", "id": 1255, "name": "Tights" }, { "__typename": "ProductDimensionInfo", "gender": "Girl", "id": 1256, "name": "Tights" }, { "__typename": "ProductDimensionInfo", "gender": "Boy", "id": 1257, "name": "Tights" }, { "__typename": "ProductDimensionInfo", "gender": "Men", "id": 1259, "name": "trousers" }, { "__typename": "ProductDimensionInfo", "gender": "Girl", "id": 1260, "name": "Trousers" }, { "__typename": "ProductDimensionInfo", "gender": "Women", "id": 1262, "name": "T-Shirts" }, { "__typename": "ProductDimensionInfo", "gender": "Men", "id": 1263, "name": "T-Shirts" }, { "__typename": "ProductDimensionInfo", "gender": "Girl", "id": 1264, "name": "T-Shirts" }, { "__typename": "ProductDimensionInfo", "gender": "Girl", "id": 1268, "name": "Jackets" }, { "__typename": "ProductDimensionInfo", "gender": "Boy", "id": 1269, "name": "Jackets" }, { "__typename": "ProductDimensionInfo", "gender": "Women", "id": 1270, "name": "Swimwear" }, { "__typename": "ProductDimensionInfo", "gender": "Men", "id": 1271, "name": "Swimwear" }, { "__typename": "ProductDimensionInfo", "gender": "Girl", "id": 1272, "name": "Swimwear" }, { "__typename": "ProductDimensionInfo", "gender": "Boy", "id": 1273, "name": "swimwear" }, { "__typename": "ProductDimensionInfo", "gender": "Women", "id": 1274, "name": "gloves" }, { "__typename": "ProductDimensionInfo", "gender": "Men", "id": 1275, "name": "Gloves" }, { "__typename": "ProductDimensionInfo", "gender": "Girl", "id": 1276, "name": "Gloves" }, { "__typename": "ProductDimensionInfo", "gender": "Boy", "id": 1277, "name": "Gloves" }, { "__typename": "ProductDimensionInfo", "gender": "UnisexKid", "id": 1279, "name": "socks" }, { "__typename": "ProductDimensionInfo", "gender": "UnisexKid", "id": 1281, "name": "Hats" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1286, "name": "Towels" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1287, "name": "toys" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1289, "name": "Deodorant" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1290, "name": "food" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1291, "name": "tents" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1293, "name": "Inhalation device" }, { "__typename": "ProductDimensionInfo", "gender": "Women", "id": 1297, "name": "Shoes" }, { "__typename": "ProductDimensionInfo", "gender": "UnisexKid", "id": 1299, "name": "Shoes" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1300, "name": "Drinking Vessels" }, { "__typename": "ProductDimensionInfo", "gender": "UnisexKid", "id": 1301, "name": "Thick Socks" }, { "__typename": "ProductDimensionInfo", "gender": "Women", "id": 1303, "name": "Undershirts / Tank Tops" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1307, "name": "Suitcases and Bags" }, { "__typename": "ProductDimensionInfo", "gender": "Girl", "id": 1309, "name": "Undershirts / Tank Tops" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1311, "name": "Disposable Gloves" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1314, "name": "Combs, Hair Ties, Brushes" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1317, "name": "ASTM 2 Masks " }, { "__typename": "ProductDimensionInfo", "gender": "Women", "id": 1318, "name": "Trousers" }, { "__typename": "ProductDimensionInfo", "gender": "Women", "id": 1319, "name": "Leggings" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1320, "name": "Blankets" }, { "__typename": "ProductDimensionInfo", "gender": "Boy", "id": 1321, "name": "Practical Shoes" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1322, "name": "Wooden cooking spoons" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1323, "name": "Isopropryl Alcohol" }, { "__typename": "ProductDimensionInfo", "gender": "Men", "id": 1324, "name": "Trousers" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1326, "name": "Pasta" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1327, "name": "Chickpeas" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1329, "name": "Cereal" }, { "__typename": "ProductDimensionInfo", "gender": "none", "id": 1331, "name": "milk" }], "tag": [{ "__typename": "TagDimensionInfo", "color": "#eda61a", "id": 65, "name": "couple" }, { "__typename": "TagDimensionInfo", "color": "#f9f0b3", "id": 67, "name": "two" }, { "__typename": "TagDimensionInfo", "color": "#c942d6", "id": 68, "name": "run" }, { "__typename": "TagDimensionInfo", "color": "#36db39", "id": 71, "name": "some" }, { "__typename": "TagDimensionInfo", "color": "#3bc436", "id": 72, "name": "walk" }, { "__typename": "TagDimensionInfo", "color": "#3ed14f", "id": 74, "name": "good" }, { "__typename": "TagDimensionInfo", "color": "#0c9196", "id": 75, "name": "bill" }, { "__typename": "TagDimensionInfo", "color": "#d8ad20", "id": 77, "name": "his" }, { "__typename": "TagDimensionInfo", "color": "#96ef67", "id": 78, "name": "over" }, { "__typename": "TagDimensionInfo", "color": "#dd1c83", "id": 81, "name": "movement" }, { "__typename": "TagDimensionInfo", "color": "#b16ded", "id": 82, "name": "maintain" }, { "__typename": "TagDimensionInfo", "color": "#4bea9a", "id": 83, "name": "or" }, { "__typename": "TagDimensionInfo", "color": "#99f48b", "id": 84, "name": "quite" }] }, "facts": [{ "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 1, "createdOn": "2023-09-09T00:00:00", "gender": "Men", "itemsCount": 1287, "productId": 1251, "tagIds": [84] }, { "__typename": "CreatedBoxesResult", "boxesCount": 6, "categoryId": 1, "createdOn": "2023-09-08T00:00:00", "gender": "Girl", "itemsCount": 3892, "productId": 1252, "tagIds": [65, 71, 74, 81, 82, 83] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 1, "createdOn": "2023-09-11T00:00:00", "gender": "Girl", "itemsCount": 770, "productId": 1252, "tagIds": [67, 81] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 1, "createdOn": "2023-09-08T00:00:00", "gender": "Boy", "itemsCount": 638, "productId": 1253, "tagIds": [71, 72] }, { "__typename": "CreatedBoxesResult", "boxesCount": 4, "categoryId": 1, "createdOn": "2023-09-09T00:00:00", "gender": "Boy", "itemsCount": 1900, "productId": 1253, "tagIds": [72, 74, 83] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 1, "createdOn": "2023-09-11T00:00:00", "gender": "Boy", "itemsCount": 1066, "productId": 1253, "tagIds": [77, 81] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 1, "createdOn": "2023-09-09T00:00:00", "gender": "Women", "itemsCount": 1758, "productId": 1254, "tagIds": [65, 78] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 1, "createdOn": "2023-09-08T00:00:00", "gender": "Men", "itemsCount": 954, "productId": 1255, "tagIds": [74] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 1, "createdOn": "2023-09-10T00:00:00", "gender": "Girl", "itemsCount": 1650, "productId": 1256, "tagIds": [74, 75] }, { "__typename": "CreatedBoxesResult", "boxesCount": 3, "categoryId": 1, "createdOn": "2023-09-10T00:00:00", "gender": "Boy", "itemsCount": 625, "productId": 1257, "tagIds": [71, 78] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 1, "createdOn": "2023-09-11T00:00:00", "gender": "Boy", "itemsCount": 12, "productId": 1257, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 2, "createdOn": "2023-09-10T00:00:00", "gender": "Men", "itemsCount": 595, "productId": 1259, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 2, "createdOn": "2023-09-11T00:00:00", "gender": "Girl", "itemsCount": 607, "productId": 1260, "tagIds": [65] }, { "__typename": "CreatedBoxesResult", "boxesCount": 3, "categoryId": 3, "createdOn": "2023-09-10T00:00:00", "gender": "Women", "itemsCount": 1993, "productId": 1262, "tagIds": [71, 72] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 3, "createdOn": "2023-09-08T00:00:00", "gender": "Men", "itemsCount": 850, "productId": 1263, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 5, "categoryId": 3, "createdOn": "2023-09-09T00:00:00", "gender": "Girl", "itemsCount": 1842, "productId": 1264, "tagIds": [67, 71, 78, 81] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 6, "createdOn": "2023-09-09T00:00:00", "gender": "Girl", "itemsCount": 989, "productId": 1268, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 6, "createdOn": "2023-09-08T00:00:00", "gender": "Boy", "itemsCount": 71, "productId": 1269, "tagIds": [84] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 12, "createdOn": "2023-09-10T00:00:00", "gender": "Women", "itemsCount": 702, "productId": 1270, "tagIds": [81] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 12, "createdOn": "2023-09-11T00:00:00", "gender": "Men", "itemsCount": 89, "productId": 1271, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 12, "createdOn": "2023-09-10T00:00:00", "gender": "Girl", "itemsCount": 1014, "productId": 1272, "tagIds": [82, 84] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 12, "createdOn": "2023-09-11T00:00:00", "gender": "Boy", "itemsCount": 500, "productId": 1273, "tagIds": [77, 82] }, { "__typename": "CreatedBoxesResult", "boxesCount": 3, "categoryId": 12, "createdOn": "2023-09-11T00:00:00", "gender": "Women", "itemsCount": 2754, "productId": 1274, "tagIds": [68, 74, 83] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 12, "createdOn": "2023-09-08T00:00:00", "gender": "Men", "itemsCount": 1752, "productId": 1275, "tagIds": [71, 78] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 12, "createdOn": "2023-09-12T00:00:00", "gender": "Girl", "itemsCount": 415, "productId": 1276, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 3, "categoryId": 12, "createdOn": "2023-09-09T00:00:00", "gender": "Boy", "itemsCount": 1392, "productId": 1277, "tagIds": [75, 81, 82] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 12, "createdOn": "2023-09-10T00:00:00", "gender": "Boy", "itemsCount": 1440, "productId": 1277, "tagIds": [77, 84] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 1, "createdOn": "2023-09-10T00:00:00", "gender": "UnisexKid", "itemsCount": 688, "productId": 1279, "tagIds": [67, 81] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 1, "createdOn": "2023-09-11T00:00:00", "gender": "UnisexKid", "itemsCount": 825, "productId": 1279, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 5, "categoryId": 1, "createdOn": "2023-09-10T00:00:00", "gender": "UnisexKid", "itemsCount": 3049, "productId": 1281, "tagIds": [65, 67, 71] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 9, "createdOn": "2023-09-08T00:00:00", "gender": "none", "itemsCount": 800, "productId": 1286, "tagIds": [67, 77] }, { "__typename": "CreatedBoxesResult", "boxesCount": 5, "categoryId": 9, "createdOn": "2023-09-09T00:00:00", "gender": "none", "itemsCount": 3430, "productId": 1286, "tagIds": [67, 75, 78, 82, 84] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 9, "createdOn": "2023-09-10T00:00:00", "gender": "none", "itemsCount": 566, "productId": 1286, "tagIds": [67, 72] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 9, "createdOn": "2023-09-11T00:00:00", "gender": "none", "itemsCount": 692, "productId": 1286, "tagIds": [71, 82] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 9, "createdOn": "2023-09-08T00:00:00", "gender": "none", "itemsCount": 492, "productId": 1287, "tagIds": [81] }, { "__typename": "CreatedBoxesResult", "boxesCount": 3, "categoryId": 9, "createdOn": "2023-09-11T00:00:00", "gender": "none", "itemsCount": 2973, "productId": 1287, "tagIds": [65, 75, 78] }, { "__typename": "CreatedBoxesResult", "boxesCount": 3, "categoryId": 10, "createdOn": "2023-09-09T00:00:00", "gender": "none", "itemsCount": 1607, "productId": 1289, "tagIds": [77, 78, 81] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 11, "createdOn": "2023-09-08T00:00:00", "gender": "none", "itemsCount": 484, "productId": 1290, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 11, "createdOn": "2023-09-09T00:00:00", "gender": "none", "itemsCount": 414, "productId": 1290, "tagIds": [65, 78] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 11, "createdOn": "2023-09-10T00:00:00", "gender": "none", "itemsCount": 882, "productId": 1290, "tagIds": [75, 83] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 13, "createdOn": "2023-09-08T00:00:00", "gender": "none", "itemsCount": 337, "productId": 1291, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 3, "categoryId": 13, "createdOn": "2023-09-11T00:00:00", "gender": "none", "itemsCount": 2196, "productId": 1291, "tagIds": [68, 78, 81] }, { "__typename": "CreatedBoxesResult", "boxesCount": 4, "categoryId": 15, "createdOn": "2023-09-11T00:00:00", "gender": "none", "itemsCount": 1421, "productId": 1293, "tagIds": [67, 82, 83] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 5, "createdOn": "2023-09-07T00:00:00", "gender": "Women", "itemsCount": 1624, "productId": 1297, "tagIds": [65, 84] }, { "__typename": "CreatedBoxesResult", "boxesCount": 3, "categoryId": 5, "createdOn": "2023-09-09T00:00:00", "gender": "Women", "itemsCount": 2548, "productId": 1297, "tagIds": [65, 74, 78] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 5, "createdOn": "2023-09-11T00:00:00", "gender": "Women", "itemsCount": 798, "productId": 1297, "tagIds": [72] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 5, "createdOn": "2023-09-08T00:00:00", "gender": "UnisexKid", "itemsCount": 958, "productId": 1299, "tagIds": [71, 78] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 19, "createdOn": "2023-09-09T00:00:00", "gender": "none", "itemsCount": 190, "productId": 1300, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 19, "createdOn": "2023-09-10T00:00:00", "gender": "none", "itemsCount": 459, "productId": 1300, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 12, "createdOn": "2023-09-10T00:00:00", "gender": "UnisexKid", "itemsCount": 553, "productId": 1301, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 4, "categoryId": 3, "createdOn": "2023-09-11T00:00:00", "gender": "Women", "itemsCount": 2114, "productId": 1303, "tagIds": [75, 83, 84] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 3, "createdOn": "2023-09-12T00:00:00", "gender": "Women", "itemsCount": 809, "productId": 1303, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 9, "createdOn": "2023-09-08T00:00:00", "gender": "none", "itemsCount": 694, "productId": 1307, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 1, "createdOn": "2023-09-09T00:00:00", "gender": "Girl", "itemsCount": 552, "productId": 1309, "tagIds": [78, 84] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 1, "createdOn": "2023-09-11T00:00:00", "gender": "Girl", "itemsCount": 1794, "productId": 1309, "tagIds": [78, 84] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 10, "createdOn": "2023-09-08T00:00:00", "gender": "none", "itemsCount": 1414, "productId": 1311, "tagIds": [72, 74] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 10, "createdOn": "2023-09-09T00:00:00", "gender": "none", "itemsCount": 579, "productId": 1311, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 10, "createdOn": "2023-09-10T00:00:00", "gender": "none", "itemsCount": 1828, "productId": 1311, "tagIds": [72, 81] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 10, "createdOn": "2023-09-08T00:00:00", "gender": "none", "itemsCount": 118, "productId": 1314, "tagIds": [78] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 10, "createdOn": "2023-09-10T00:00:00", "gender": "none", "itemsCount": 336, "productId": 1314, "tagIds": [72] }, { "__typename": "CreatedBoxesResult", "boxesCount": 4, "categoryId": 10, "createdOn": "2023-09-11T00:00:00", "gender": "none", "itemsCount": 2312, "productId": 1314, "tagIds": [67, 68, 75, 84] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 10, "createdOn": "2023-09-07T00:00:00", "gender": "none", "itemsCount": 720, "productId": 1317, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 2, "createdOn": "2023-09-09T00:00:00", "gender": "Women", "itemsCount": 853, "productId": 1318, "tagIds": [81] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 1, "createdOn": "2023-09-11T00:00:00", "gender": "Women", "itemsCount": 90, "productId": 1319, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 20, "createdOn": "2023-09-10T00:00:00", "gender": "none", "itemsCount": 406, "productId": 1320, "tagIds": [81] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 20, "createdOn": "2023-09-11T00:00:00", "gender": "none", "itemsCount": 760, "productId": 1320, "tagIds": [83] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 5, "createdOn": "2023-09-08T00:00:00", "gender": "Boy", "itemsCount": 130, "productId": 1321, "tagIds": [84] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 5, "createdOn": "2023-09-10T00:00:00", "gender": "Boy", "itemsCount": 808, "productId": 1321, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 3, "categoryId": 11, "createdOn": "2023-09-10T00:00:00", "gender": "none", "itemsCount": 2238, "productId": 1322, "tagIds": [67, 77, 82] }, { "__typename": "CreatedBoxesResult", "boxesCount": 2, "categoryId": 10, "createdOn": "2023-09-08T00:00:00", "gender": "none", "itemsCount": 1160, "productId": 1323, "tagIds": [81] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 10, "createdOn": "2023-09-11T00:00:00", "gender": "none", "itemsCount": 24, "productId": 1323, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 4, "categoryId": 2, "createdOn": "2023-09-09T00:00:00", "gender": "Men", "itemsCount": 2067, "productId": 1324, "tagIds": [65, 68, 77] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 2, "createdOn": "2023-09-11T00:00:00", "gender": "Men", "itemsCount": 565, "productId": 1324, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 11, "createdOn": "2023-09-08T00:00:00", "gender": "none", "itemsCount": 247, "productId": 1326, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 11, "createdOn": "2023-09-09T00:00:00", "gender": "none", "itemsCount": 250, "productId": 1326, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 11, "createdOn": "2023-09-08T00:00:00", "gender": "none", "itemsCount": 968, "productId": 1327, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 11, "createdOn": "2023-09-08T00:00:00", "gender": "none", "itemsCount": 329, "productId": 1329, "tagIds": [] }, { "__typename": "CreatedBoxesResult", "boxesCount": 3, "categoryId": 11, "createdOn": "2023-09-08T00:00:00", "gender": "none", "itemsCount": 685, "productId": 1331, "tagIds": [77, 82] }, { "__typename": "CreatedBoxesResult", "boxesCount": 1, "categoryId": 11, "createdOn": "2023-09-10T00:00:00", "gender": "none", "itemsCount": 914, "productId": 1331, "tagIds": [71] }, { "__typename": "CreatedBoxesResult", "boxesCount": 5, "categoryId": 11, "createdOn": "2023-09-11T00:00:00", "gender": "none", "itemsCount": 2952, "productId": 1331, "tagIds": [71, 72, 75, 77, 81] }] } } },
+ movedBoxes: { "data": { "movedBoxes": { "__typename": "MovedBoxesData", "dimensions": { "__typename": "MovedBoxDataDimensions", "category": [{ "__typename": "DimensionInfo", "id": 1, "name": "Underwear / Nightwear" }, { "__typename": "DimensionInfo", "id": 2, "name": "Bottoms" }, { "__typename": "DimensionInfo", "id": 3, "name": "Tops" }, { "__typename": "DimensionInfo", "id": 4, "name": "Accessories" }, { "__typename": "DimensionInfo", "id": 5, "name": "Shoes" }, { "__typename": "DimensionInfo", "id": 6, "name": "Jackets / Outerwear" }, { "__typename": "DimensionInfo", "id": 7, "name": "Skirts/Dresses" }, { "__typename": "DimensionInfo", "id": 8, "name": "Baby" }, { "__typename": "DimensionInfo", "id": 9, "name": "Other" }, { "__typename": "DimensionInfo", "id": 10, "name": "Hygiene" }, { "__typename": "DimensionInfo", "id": 11, "name": "Food & Kitchen" }, { "__typename": "DimensionInfo", "id": 12, "name": "Clothing" }, { "__typename": "DimensionInfo", "id": 13, "name": "Equipment" }, { "__typename": "DimensionInfo", "id": 14, "name": "Toys & Games" }, { "__typename": "DimensionInfo", "id": 15, "name": "Medication" }, { "__typename": "DimensionInfo", "id": 18, "name": "Books & Stationery" }, { "__typename": "DimensionInfo", "id": 19, "name": "Water" }, { "__typename": "DimensionInfo", "id": 20, "name": "Shelter" }], "target": [{ "__typename": "TargetDimensionInfo", "id": "FreeShop", "name": "FreeShop", "type": "OutgoingLocation" }, { "__typename": "TargetDimensionInfo", "id": "Donated location", "name": "Donated location", "type": "OutgoingLocation" }, { "__typename": "TargetDimensionInfo", "id": "Lesvos", "name": "Lesvos", "type": "Shipment" }, { "__typename": "TargetDimensionInfo", "id": "Scrap", "name": "Scrap", "type": "BoxState" }] }, "facts": [{ "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 1, "gender": "UnisexKid", "itemsCount": 871, "movedOn": "2023-09-12", "organisationName": null, "productName": "hats", "tagIds": [65], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 1, "gender": "UnisexKid", "itemsCount": 825, "movedOn": "2023-09-12", "organisationName": null, "productName": "socks", "tagIds": [], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 1, "gender": "Girl", "itemsCount": 1794, "movedOn": "2023-09-12", "organisationName": null, "productName": "undershirts / tank tops", "tagIds": [78, 84], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 1, "gender": "Girl", "itemsCount": 1704, "movedOn": "2023-09-12", "organisationName": null, "productName": "underwear", "tagIds": [74, 81], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 2, "gender": "Men", "itemsCount": 778, "movedOn": "2023-09-12", "organisationName": null, "productName": "trousers", "tagIds": [65, 68], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 9, "gender": "none", "itemsCount": 692, "movedOn": "2023-09-12", "organisationName": null, "productName": "towels", "tagIds": [71, 82], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 10, "gender": "none", "itemsCount": 720, "movedOn": "2023-09-12", "organisationName": null, "productName": "astm 2 masks", "tagIds": [], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 10, "gender": "none", "itemsCount": 51, "movedOn": "2023-09-12", "organisationName": null, "productName": "deodorant", "tagIds": [77], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 10, "gender": "none", "itemsCount": 1556, "movedOn": "2023-09-12", "organisationName": null, "productName": "deodorant", "tagIds": [78, 81], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 10, "gender": "none", "itemsCount": 1414, "movedOn": "2023-09-12", "organisationName": null, "productName": "disposable gloves", "tagIds": [72, 74], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 11, "gender": "none", "itemsCount": 414, "movedOn": "2023-09-12", "organisationName": null, "productName": "food", "tagIds": [65, 78], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 11, "gender": "none", "itemsCount": 1542, "movedOn": "2023-09-12", "organisationName": null, "productName": "milk", "tagIds": [71, 75], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 247, "movedOn": "2023-09-12", "organisationName": null, "productName": "pasta", "tagIds": [], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 12, "gender": "Men", "itemsCount": 1752, "movedOn": "2023-09-12", "organisationName": null, "productName": "gloves", "tagIds": [71, 78], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 12, "gender": "Men", "itemsCount": 89, "movedOn": "2023-09-12", "organisationName": null, "productName": "swimwear", "tagIds": [], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 15, "gender": "none", "itemsCount": 392, "movedOn": "2023-09-12", "organisationName": null, "productName": "inhalation device", "tagIds": [], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 19, "gender": "none", "itemsCount": 190, "movedOn": "2023-09-12", "organisationName": null, "productName": "drinking vessels", "tagIds": [], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 1, "gender": "UnisexKid", "itemsCount": 1234, "movedOn": "2023-09-13", "organisationName": null, "productName": "hats", "tagIds": [67, 71], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 1, "gender": "Boy", "itemsCount": 434, "movedOn": "2023-09-13", "organisationName": null, "productName": "tights", "tagIds": [71, 78], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 1, "gender": "Girl", "itemsCount": 552, "movedOn": "2023-09-13", "organisationName": null, "productName": "undershirts / tank tops", "tagIds": [78, 84], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 1, "gender": "Men", "itemsCount": 829, "movedOn": "2023-09-13", "organisationName": null, "productName": "underwear", "tagIds": [], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 1, "gender": "Girl", "itemsCount": 280, "movedOn": "2023-09-13", "organisationName": null, "productName": "underwear", "tagIds": [71, 82], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 3, "categoryId": 1, "gender": "Boy", "itemsCount": 1761, "movedOn": "2023-09-13", "organisationName": null, "productName": "underwear", "tagIds": [72, 74, 83], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 1, "gender": "Boy", "itemsCount": 638, "movedOn": "2023-09-13", "organisationName": null, "productName": "underwear", "tagIds": [71, 72], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 2, "gender": "Men", "itemsCount": 595, "movedOn": "2023-09-13", "organisationName": null, "productName": "trousers", "tagIds": [], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 2, "gender": "Men", "itemsCount": 565, "movedOn": "2023-09-13", "organisationName": null, "productName": "trousers", "tagIds": [], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 2, "gender": "Girl", "itemsCount": 607, "movedOn": "2023-09-13", "organisationName": null, "productName": "trousers", "tagIds": [65], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 3, "gender": "Women", "itemsCount": 809, "movedOn": "2023-09-13", "organisationName": null, "productName": "undershirts / tank tops", "tagIds": [], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 5, "gender": "Women", "itemsCount": 1624, "movedOn": "2023-09-13", "organisationName": null, "productName": "shoes", "tagIds": [65, 84], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 6, "gender": "Boy", "itemsCount": 71, "movedOn": "2023-09-13", "organisationName": null, "productName": "jackets", "tagIds": [84], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 9, "gender": "none", "itemsCount": 1168, "movedOn": "2023-09-13", "organisationName": null, "productName": "towels", "tagIds": [82, 84], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 3, "categoryId": 9, "gender": "none", "itemsCount": 2262, "movedOn": "2023-09-13", "organisationName": null, "productName": "towels", "tagIds": [67, 75, 78], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 10, "gender": "none", "itemsCount": 336, "movedOn": "2023-09-13", "organisationName": null, "productName": "combs, hair ties, brushes", "tagIds": [72], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 10, "gender": "none", "itemsCount": 315, "movedOn": "2023-09-13", "organisationName": null, "productName": "isopropryl alcohol", "tagIds": [81], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 13, "gender": "none", "itemsCount": 337, "movedOn": "2023-09-13", "organisationName": null, "productName": "tents", "tagIds": [], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 20, "gender": "none", "itemsCount": 760, "movedOn": "2023-09-13", "organisationName": null, "productName": "blankets", "tagIds": [83], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 3, "categoryId": 11, "gender": "none", "itemsCount": 1410, "movedOn": "2023-09-14", "organisationName": null, "productName": "milk", "tagIds": [72, 77, 81], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 250, "movedOn": "2023-09-14", "organisationName": null, "productName": "pasta", "tagIds": [], "targetId": "Donated location" }, { "__typename": "MovedBoxesResult", "boxesCount": 3, "categoryId": 11, "gender": "none", "itemsCount": 2238, "movedOn": "2023-09-14", "organisationName": null, "productName": "wooden cooking spoons", "tagIds": [67, 77, 82], "targetId": "FreeShop" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 1, "gender": "Men", "itemsCount": 458, "movedOn": "2024-01-10", "organisationName": "BoxAid", "productName": "underwear", "tagIds": [84], "targetId": "Lesvos" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 1, "gender": "Boy", "itemsCount": 809, "movedOn": "2024-01-10", "organisationName": "BoxAid", "productName": "underwear", "tagIds": [], "targetId": "Lesvos" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 6, "gender": "Girl", "itemsCount": 989, "movedOn": "2024-01-10", "organisationName": "BoxAid", "productName": "jackets", "tagIds": [], "targetId": "Lesvos" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 10, "gender": "none", "itemsCount": 118, "movedOn": "2024-01-10", "organisationName": "BoxAid", "productName": "combs, hair ties, brushes", "tagIds": [78], "targetId": "Lesvos" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 312, "movedOn": "2024-01-10", "organisationName": "BoxAid", "productName": "milk", "tagIds": [71], "targetId": "Lesvos" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 2, "gender": "Girl", "itemsCount": 534, "movedOn": "2024-01-11", "organisationName": "BoxAid", "productName": "trousers", "tagIds": [], "targetId": "Lesvos" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 5, "gender": "Boy", "itemsCount": 819, "movedOn": "2024-01-11", "organisationName": "BoxAid", "productName": "practical shoes", "tagIds": [84], "targetId": "Lesvos" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 5, "gender": "Women", "itemsCount": 1928, "movedOn": "2024-01-11", "organisationName": "BoxAid", "productName": "shoes", "tagIds": [65, 78], "targetId": "Lesvos" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 329, "movedOn": "2024-01-11", "organisationName": "BoxAid", "productName": "cereal", "tagIds": [], "targetId": "Lesvos" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 627, "movedOn": "2024-01-11", "organisationName": "BoxAid", "productName": "milk", "tagIds": [], "targetId": "Lesvos" }, { "__typename": "MovedBoxesResult", "boxesCount": 1, "categoryId": 12, "gender": "Men", "itemsCount": 783, "movedOn": "2024-01-11", "organisationName": "BoxAid", "productName": "swimwear", "tagIds": [], "targetId": "Lesvos" }, { "__typename": "MovedBoxesResult", "boxesCount": 3, "categoryId": 13, "gender": "none", "itemsCount": 2196, "movedOn": "2024-01-11", "organisationName": "BoxAid", "productName": "tents", "tagIds": [68, 78, 81], "targetId": "Lesvos" }, { "__typename": "MovedBoxesResult", "boxesCount": 2, "categoryId": 3, "gender": "Women", "itemsCount": 1328, "movedOn": "2024-12-06", "organisationName": null, "productName": "t-shirts", "tagIds": [71, 72], "targetId": "Scrap" }] } } },
+ BeneficiaryDemographics: { "data": { "beneficiaryDemographics": { "__typename": "BeneficiaryDemographicsData", "dimensions": { "__typename": "BeneficiaryDemographicsDimensions", "tag": [{ "__typename": "TagDimensionInfo", "color": "#c2dd49", "id": 66, "name": "person" }, { "__typename": "TagDimensionInfo", "color": "#b07bd8", "id": 69, "name": "their" }, { "__typename": "TagDimensionInfo", "color": "#391cc9", "id": 70, "name": "against" }, { "__typename": "TagDimensionInfo", "color": "#36db39", "id": 71, "name": "some" }, { "__typename": "TagDimensionInfo", "color": "#3ed14f", "id": 74, "name": "good" }, { "__typename": "TagDimensionInfo", "color": "#46ff3f", "id": 76, "name": "cover" }, { "__typename": "TagDimensionInfo", "color": "#d8ad20", "id": 77, "name": "his" }, { "__typename": "TagDimensionInfo", "color": "#96ef67", "id": 78, "name": "over" }, { "__typename": "TagDimensionInfo", "color": "#ce6433", "id": 79, "name": "together" }, { "__typename": "TagDimensionInfo", "color": "#dd1c83", "id": 81, "name": "movement" }, { "__typename": "TagDimensionInfo", "color": "#b16ded", "id": 82, "name": "maintain" }] }, "facts": [{ "__typename": "BeneficiaryDemographicsResult", "age": 3, "count": 1, "createdOn": "2023-07-18", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 3, "count": 1, "createdOn": "2023-07-20", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 6, "count": 1, "createdOn": "2023-07-19", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 7, "count": 2, "createdOn": "2023-07-18", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 8, "count": 1, "createdOn": "2023-07-17", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 8, "count": 2, "createdOn": "2023-07-20", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 9, "count": 2, "createdOn": "2023-07-19", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 10, "count": 1, "createdOn": "2023-07-19", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 12, "count": 1, "createdOn": "2023-07-18", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 12, "count": 1, "createdOn": "2023-07-19", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 14, "count": 1, "createdOn": "2023-07-19", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 14, "count": 2, "createdOn": "2023-07-20", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 16, "count": 1, "createdOn": "2023-07-17", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 16, "count": 2, "createdOn": "2023-07-18", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 16, "count": 1, "createdOn": "2023-07-20", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 34, "count": 1, "createdOn": "2023-07-15", "gender": "Female", "tagIds": [66, 74, 77] }, { "__typename": "BeneficiaryDemographicsResult", "age": 37, "count": 1, "createdOn": "2023-07-14", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 48, "count": 1, "createdOn": "2023-07-14", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 55, "count": 1, "createdOn": "2023-07-15", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 56, "count": 1, "createdOn": "2023-07-15", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 59, "count": 1, "createdOn": "2023-07-17", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 61, "count": 1, "createdOn": "2023-07-14", "gender": "Female", "tagIds": [69] }, { "__typename": "BeneficiaryDemographicsResult", "age": 61, "count": 1, "createdOn": "2023-07-16", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 79, "count": 1, "createdOn": "2023-07-17", "gender": "Female", "tagIds": [79] }, { "__typename": "BeneficiaryDemographicsResult", "age": 80, "count": 1, "createdOn": "2023-07-15", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 81, "count": 1, "createdOn": "2023-07-16", "gender": "Female", "tagIds": [69] }, { "__typename": "BeneficiaryDemographicsResult", "age": 86, "count": 1, "createdOn": "2023-07-16", "gender": "Female", "tagIds": [74, 78, 79] }, { "__typename": "BeneficiaryDemographicsResult", "age": 87, "count": 1, "createdOn": "2023-07-16", "gender": "Female", "tagIds": [69, 71, 74] }, { "__typename": "BeneficiaryDemographicsResult", "age": 99, "count": 1, "createdOn": "2023-07-17", "gender": "Female", "tagIds": [78] }, { "__typename": "BeneficiaryDemographicsResult", "age": 100, "count": 1, "createdOn": "2023-07-15", "gender": "Female", "tagIds": [71] }, { "__typename": "BeneficiaryDemographicsResult", "age": 102, "count": 1, "createdOn": "2023-07-15", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 105, "count": 1, "createdOn": "2023-07-17", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 106, "count": 1, "createdOn": "2023-07-16", "gender": "Female", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 115, "count": 1, "createdOn": "2023-07-14", "gender": "Female", "tagIds": [79] }, { "__typename": "BeneficiaryDemographicsResult", "age": 115, "count": 1, "createdOn": "2023-07-16", "gender": "Female", "tagIds": [70, 78] }, { "__typename": "BeneficiaryDemographicsResult", "age": 2, "count": 1, "createdOn": "2023-07-18", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 2, "count": 1, "createdOn": "2023-07-20", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 3, "count": 1, "createdOn": "2023-07-18", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 3, "count": 1, "createdOn": "2023-07-19", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 4, "count": 1, "createdOn": "2023-07-20", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 5, "count": 1, "createdOn": "2023-07-18", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 5, "count": 1, "createdOn": "2023-07-19", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 7, "count": 1, "createdOn": "2023-07-18", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 8, "count": 1, "createdOn": "2023-07-19", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 9, "count": 1, "createdOn": "2023-07-17", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 9, "count": 1, "createdOn": "2023-07-18", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 10, "count": 1, "createdOn": "2023-07-19", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 13, "count": 1, "createdOn": "2023-07-19", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 14, "count": 1, "createdOn": "2023-07-18", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 14, "count": 1, "createdOn": "2023-07-20", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 16, "count": 1, "createdOn": "2023-07-17", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 16, "count": 1, "createdOn": "2023-07-19", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 16, "count": 1, "createdOn": "2023-07-20", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 17, "count": 2, "createdOn": "2023-07-20", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 35, "count": 1, "createdOn": "2023-07-17", "gender": "Male", "tagIds": [70, 71, 81] }, { "__typename": "BeneficiaryDemographicsResult", "age": 39, "count": 1, "createdOn": "2023-07-15", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 42, "count": 1, "createdOn": "2023-07-16", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 46, "count": 1, "createdOn": "2023-07-14", "gender": "Male", "tagIds": [69, 78, 81] }, { "__typename": "BeneficiaryDemographicsResult", "age": 47, "count": 1, "createdOn": "2023-07-17", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 48, "count": 1, "createdOn": "2023-07-15", "gender": "Male", "tagIds": [66, 71, 82] }, { "__typename": "BeneficiaryDemographicsResult", "age": 51, "count": 1, "createdOn": "2023-07-15", "gender": "Male", "tagIds": [77, 78, 81] }, { "__typename": "BeneficiaryDemographicsResult", "age": 55, "count": 1, "createdOn": "2023-07-16", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 55, "count": 1, "createdOn": "2023-07-17", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 58, "count": 1, "createdOn": "2023-07-14", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 63, "count": 1, "createdOn": "2023-07-15", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 66, "count": 1, "createdOn": "2023-07-14", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 69, "count": 1, "createdOn": "2023-07-15", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 90, "count": 1, "createdOn": "2023-07-14", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 91, "count": 1, "createdOn": "2023-07-16", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 95, "count": 1, "createdOn": "2023-07-15", "gender": "Male", "tagIds": [77] }, { "__typename": "BeneficiaryDemographicsResult", "age": 98, "count": 1, "createdOn": "2023-07-17", "gender": "Male", "tagIds": [] }, { "__typename": "BeneficiaryDemographicsResult", "age": 101, "count": 1, "createdOn": "2023-07-16", "gender": "Male", "tagIds": [74] }, { "__typename": "BeneficiaryDemographicsResult", "age": 103, "count": 1, "createdOn": "2023-07-16", "gender": "Male", "tagIds": [71, 76] }, { "__typename": "BeneficiaryDemographicsResult", "age": 117, "count": 1, "createdOn": "2023-07-16", "gender": "Male", "tagIds": [71] }] } } },
+ stockOverview: { "data": { "stockOverview": { "__typename": "StockOverviewData", "dimensions": { "__typename": "StockOverviewDataDimensions", "category": [{ "__typename": "DimensionInfo", "id": 1, "name": "Underwear / Nightwear" }, { "__typename": "DimensionInfo", "id": 2, "name": "Bottoms" }, { "__typename": "DimensionInfo", "id": 3, "name": "Tops" }, { "__typename": "DimensionInfo", "id": 4, "name": "Accessories" }, { "__typename": "DimensionInfo", "id": 5, "name": "Shoes" }, { "__typename": "DimensionInfo", "id": 6, "name": "Jackets / Outerwear" }, { "__typename": "DimensionInfo", "id": 7, "name": "Skirts/Dresses" }, { "__typename": "DimensionInfo", "id": 8, "name": "Baby" }, { "__typename": "DimensionInfo", "id": 9, "name": "Other" }, { "__typename": "DimensionInfo", "id": 10, "name": "Hygiene" }, { "__typename": "DimensionInfo", "id": 11, "name": "Food & Kitchen" }, { "__typename": "DimensionInfo", "id": 12, "name": "Clothing" }, { "__typename": "DimensionInfo", "id": 13, "name": "Equipment" }, { "__typename": "DimensionInfo", "id": 14, "name": "Toys & Games" }, { "__typename": "DimensionInfo", "id": 15, "name": "Medication" }, { "__typename": "DimensionInfo", "id": 18, "name": "Books & Stationery" }, { "__typename": "DimensionInfo", "id": 19, "name": "Water" }, { "__typename": "DimensionInfo", "id": 20, "name": "Shelter" }], "location": [{ "__typename": "DimensionInfo", "id": 100000042, "name": "Stockroom" }, { "__typename": "DimensionInfo", "id": 100000043, "name": "WH" }, { "__typename": "DimensionInfo", "id": 100000044, "name": "WH2" }, { "__typename": "DimensionInfo", "id": 100000045, "name": "FreeShop" }, { "__typename": "DimensionInfo", "id": 100000046, "name": "Donated location" }], "size": [{ "__typename": "DimensionInfo", "id": 1, "name": "S" }, { "__typename": "DimensionInfo", "id": 2, "name": "M" }, { "__typename": "DimensionInfo", "id": 3, "name": "L" }, { "__typename": "DimensionInfo", "id": 4, "name": "XL" }, { "__typename": "DimensionInfo", "id": 5, "name": "XS" }, { "__typename": "DimensionInfo", "id": 14, "name": "20" }, { "__typename": "DimensionInfo", "id": 17, "name": "23" }, { "__typename": "DimensionInfo", "id": 25, "name": "31" }, { "__typename": "DimensionInfo", "id": 44, "name": "19-24 months" }, { "__typename": "DimensionInfo", "id": 47, "name": "7-12 months" }, { "__typename": "DimensionInfo", "id": 48, "name": "13-18 months" }, { "__typename": "DimensionInfo", "id": 52, "name": "Mixed" }, { "__typename": "DimensionInfo", "id": 55, "name": "L" }, { "__typename": "DimensionInfo", "id": 57, "name": "39" }, { "__typename": "DimensionInfo", "id": 63, "name": "45" }, { "__typename": "DimensionInfo", "id": 68, "name": "One size" }, { "__typename": "DimensionInfo", "id": 71, "name": "Mixed" }, { "__typename": "DimensionInfo", "id": 111, "name": "Size 3 (7-13 kg)" }, { "__typename": "DimensionInfo", "id": 118, "name": "11-15 years" }, { "__typename": "DimensionInfo", "id": 124, "name": "6-10 years" }, { "__typename": "DimensionInfo", "id": 138, "name": "0-6 months" }, { "__typename": "DimensionInfo", "id": 203, "name": "XXL" }], "tag": [{ "__typename": "TagDimensionInfo", "color": "#eda61a", "id": 65, "name": "couple" }, { "__typename": "TagDimensionInfo", "color": "#f9f0b3", "id": 67, "name": "two" }, { "__typename": "TagDimensionInfo", "color": "#c942d6", "id": 68, "name": "run" }, { "__typename": "TagDimensionInfo", "color": "#36db39", "id": 71, "name": "some" }, { "__typename": "TagDimensionInfo", "color": "#3bc436", "id": 72, "name": "walk" }, { "__typename": "TagDimensionInfo", "color": "#3ed14f", "id": 74, "name": "good" }, { "__typename": "TagDimensionInfo", "color": "#0c9196", "id": 75, "name": "bill" }, { "__typename": "TagDimensionInfo", "color": "#d8ad20", "id": 77, "name": "his" }, { "__typename": "TagDimensionInfo", "color": "#96ef67", "id": 78, "name": "over" }, { "__typename": "TagDimensionInfo", "color": "#dd1c83", "id": 81, "name": "movement" }, { "__typename": "TagDimensionInfo", "color": "#b16ded", "id": 82, "name": "maintain" }, { "__typename": "TagDimensionInfo", "color": "#4bea9a", "id": 83, "name": "or" }, { "__typename": "TagDimensionInfo", "color": "#99f48b", "id": 84, "name": "quite" }] }, "facts": [{ "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 1, "gender": "Girl", "itemsCount": 283, "locationId": 100000042, "productName": "underwear", "sizeId": 5, "tagIds": [65, 83] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 1, "gender": "Girl", "itemsCount": 344, "locationId": 100000042, "productName": "underwear", "sizeId": 4, "tagIds": [67, 81] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 1, "gender": "Boy", "itemsCount": 320, "locationId": 100000042, "productName": "underwear", "sizeId": 1, "tagIds": [77, 81] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 1, "gender": "Men", "itemsCount": 159, "locationId": 100000042, "productName": "tights", "sizeId": 52, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 1, "gender": "Girl", "itemsCount": 947, "locationId": 100000042, "productName": "tights", "sizeId": 52, "tagIds": [74, 75] }, { "__typename": "StockOverviewResult", "boxState": "Receiving", "boxesCount": 1, "categoryId": 2, "gender": "Girl", "itemsCount": 534, "locationId": 100000042, "productName": "trousers", "sizeId": 5, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "NotDelivered", "boxesCount": 1, "categoryId": 2, "gender": "Boy", "itemsCount": 921, "locationId": 100000042, "productName": "trousers", "sizeId": 3, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "NotDelivered", "boxesCount": 1, "categoryId": 3, "gender": "Women", "itemsCount": 517, "locationId": 100000042, "productName": "t-shirts", "sizeId": 14, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 3, "gender": "Men", "itemsCount": 516, "locationId": 100000042, "productName": "t-shirts", "sizeId": 203, "tagIds": [67, 77] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 6, "gender": "Men", "itemsCount": 745, "locationId": 100000042, "productName": "jackets", "sizeId": 111, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 6, "gender": "Men", "itemsCount": 44, "locationId": 100000042, "productName": "jackets", "sizeId": 3, "tagIds": [77] }, { "__typename": "StockOverviewResult", "boxState": "NotDelivered", "boxesCount": 1, "categoryId": 6, "gender": "Girl", "itemsCount": 989, "locationId": 100000042, "productName": "jackets", "sizeId": 203, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 12, "gender": "Women", "itemsCount": 850, "locationId": 100000042, "productName": "gloves", "sizeId": 47, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 12, "gender": "Women", "itemsCount": 918, "locationId": 100000042, "productName": "gloves", "sizeId": 52, "tagIds": [68, 74, 83] }, { "__typename": "StockOverviewResult", "boxState": "NotDelivered", "boxesCount": 1, "categoryId": 12, "gender": "UnisexKid", "itemsCount": 454, "locationId": 100000042, "productName": "belts", "sizeId": 118, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 4, "gender": "none", "itemsCount": 277, "locationId": 100000042, "productName": "pillows", "sizeId": 52, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 9, "gender": "none", "itemsCount": 310, "locationId": 100000042, "productName": "towels", "sizeId": 68, "tagIds": [67, 72] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 9, "gender": "none", "itemsCount": 991, "locationId": 100000042, "productName": "toys", "sizeId": 68, "tagIds": [65, 75, 78] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 29, "locationId": 100000042, "productName": "food", "sizeId": 68, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "MarkedForShipment", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 441, "locationId": 100000042, "productName": "food", "sizeId": 68, "tagIds": [75, 83] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 15, "gender": "none", "itemsCount": 321, "locationId": 100000042, "productName": "inhalation device", "sizeId": 68, "tagIds": [67, 82, 83] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 5, "gender": "UnisexKid", "itemsCount": 479, "locationId": 100000042, "productName": "shoes", "sizeId": 17, "tagIds": [71, 78] }, { "__typename": "StockOverviewResult", "boxState": "MarkedForShipment", "boxesCount": 1, "categoryId": 10, "gender": "none", "itemsCount": 914, "locationId": 100000042, "productName": "disposable gloves", "sizeId": 68, "tagIds": [72, 81] }, { "__typename": "StockOverviewResult", "boxState": "NotDelivered", "boxesCount": 1, "categoryId": 10, "gender": "none", "itemsCount": 118, "locationId": 100000042, "productName": "combs, hair ties, brushes", "sizeId": 68, "tagIds": [78] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 1, "gender": "Women", "itemsCount": 169, "locationId": 100000042, "productName": "leggings", "sizeId": 3, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "Receiving", "boxesCount": 1, "categoryId": 5, "gender": "Boy", "itemsCount": 819, "locationId": 100000042, "productName": "practical shoes", "sizeId": 17, "tagIds": [84] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 5, "gender": "Boy", "itemsCount": 746, "locationId": 100000042, "productName": "practical shoes", "sizeId": 25, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 464, "locationId": 100000042, "productName": "wooden cooking spoons", "sizeId": 52, "tagIds": [75, 81, 82] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 968, "locationId": 100000042, "productName": "chickpeas", "sizeId": null, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "Receiving", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 329, "locationId": 100000042, "productName": "cereal", "sizeId": null, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 871, "locationId": 100000042, "productName": "milk", "sizeId": null, "tagIds": [77, 82] }, { "__typename": "StockOverviewResult", "boxState": "NotDelivered", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 312, "locationId": 100000042, "productName": "milk", "sizeId": null, "tagIds": [71] }, { "__typename": "StockOverviewResult", "boxState": "NotDelivered", "boxesCount": 1, "categoryId": 1, "gender": "Boy", "itemsCount": 809, "locationId": 100000043, "productName": "underwear", "sizeId": 124, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "MarkedForShipment", "boxesCount": 1, "categoryId": 3, "gender": "Women", "itemsCount": 191, "locationId": 100000043, "productName": "t-shirts", "sizeId": 4, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 12, "gender": "Girl", "itemsCount": 507, "locationId": 100000043, "productName": "swimwear", "sizeId": 68, "tagIds": [82, 84] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 12, "gender": "Boy", "itemsCount": 250, "locationId": 100000043, "productName": "swimwear", "sizeId": 52, "tagIds": [77, 82] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 12, "gender": "Men", "itemsCount": 694, "locationId": 100000043, "productName": "gloves", "sizeId": 68, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 1, "gender": "UnisexKid", "itemsCount": 68, "locationId": 100000043, "productName": "hats", "sizeId": 5, "tagIds": [67, 71] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 13, "gender": "none", "itemsCount": 822, "locationId": 100000043, "productName": "tents", "sizeId": 68, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "Receiving", "boxesCount": 1, "categoryId": 5, "gender": "Women", "itemsCount": 964, "locationId": 100000043, "productName": "shoes", "sizeId": 17, "tagIds": [65, 78] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 1, "gender": "Men", "itemsCount": 158, "locationId": 100000043, "productName": "leggings", "sizeId": 52, "tagIds": [67] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 20, "gender": "none", "itemsCount": 406, "locationId": 100000043, "productName": "blankets", "sizeId": 52, "tagIds": [81] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 459, "locationId": 100000043, "productName": "wooden cooking spoons", "sizeId": 52, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "Receiving", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 627, "locationId": 100000043, "productName": "milk", "sizeId": null, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "NotDelivered", "boxesCount": 1, "categoryId": 1, "gender": "Men", "itemsCount": 458, "locationId": 100000044, "productName": "underwear", "sizeId": 52, "tagIds": [84] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 1, "gender": "Girl", "itemsCount": 135, "locationId": 100000044, "productName": "underwear", "sizeId": 3, "tagIds": [67, 81] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 1, "gender": "Women", "itemsCount": 512, "locationId": 100000044, "productName": "tights", "sizeId": 68, "tagIds": [65, 78] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 1, "gender": "Men", "itemsCount": 998, "locationId": 100000044, "productName": "tights", "sizeId": 52, "tagIds": [74] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 1, "gender": "Boy", "itemsCount": 568, "locationId": 100000044, "productName": "tights", "sizeId": 52, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 2, "gender": "Men", "itemsCount": 613, "locationId": 100000044, "productName": "trousers", "sizeId": 203, "tagIds": [72] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 2, "gender": "Boy", "itemsCount": 469, "locationId": 100000044, "productName": "trousers", "sizeId": 1, "tagIds": [81] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 3, "gender": "Women", "itemsCount": 663, "locationId": 100000044, "productName": "t-shirts", "sizeId": 3, "tagIds": [71, 72] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 3, "gender": "Men", "itemsCount": 824, "locationId": 100000044, "productName": "t-shirts", "sizeId": 71, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 3, "gender": "Girl", "itemsCount": 31, "locationId": 100000044, "productName": "t-shirts", "sizeId": 71, "tagIds": [67, 71, 78, 81] }, { "__typename": "StockOverviewResult", "boxState": "Receiving", "boxesCount": 1, "categoryId": 12, "gender": "Men", "itemsCount": 783, "locationId": 100000044, "productName": "swimwear", "sizeId": 44, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 12, "gender": "Men", "itemsCount": 565, "locationId": 100000044, "productName": "gloves", "sizeId": 52, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 12, "gender": "UnisexAdult", "itemsCount": 893, "locationId": 100000044, "productName": "belts", "sizeId": 5, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "MarkedForShipment", "boxesCount": 1, "categoryId": 10, "gender": "none", "itemsCount": 492, "locationId": 100000044, "productName": "deodorant", "sizeId": 68, "tagIds": [81] }, { "__typename": "StockOverviewResult", "boxState": "Receiving", "boxesCount": 1, "categoryId": 13, "gender": "none", "itemsCount": 732, "locationId": 100000044, "productName": "tents", "sizeId": 68, "tagIds": [68, 78, 81] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 13, "gender": "none", "itemsCount": 720, "locationId": 100000044, "productName": "candles", "sizeId": 68, "tagIds": [77, 84] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 5, "gender": "Women", "itemsCount": 379, "locationId": 100000044, "productName": "shoes", "sizeId": 63, "tagIds": [74] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 5, "gender": "UnisexKid", "itemsCount": 761, "locationId": 100000044, "productName": "shoes", "sizeId": 57, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 12, "gender": "UnisexKid", "itemsCount": 137, "locationId": 100000044, "productName": "thick socks", "sizeId": 52, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 3, "gender": "Women", "itemsCount": 435, "locationId": 100000044, "productName": "undershirts / tank tops", "sizeId": 203, "tagIds": [75, 83, 84] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 10, "gender": "none", "itemsCount": 969, "locationId": 100000044, "productName": "combs, hair ties, brushes", "sizeId": 68, "tagIds": [67, 68, 75, 84] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 2, "gender": "Women", "itemsCount": 574, "locationId": 100000044, "productName": "trousers", "sizeId": 48, "tagIds": [81] }, { "__typename": "StockOverviewResult", "boxState": "MarkedForShipment", "boxesCount": 1, "categoryId": 10, "gender": "none", "itemsCount": 845, "locationId": 100000044, "productName": "isopropryl alcohol", "sizeId": 52, "tagIds": [81] }, { "__typename": "StockOverviewResult", "boxState": "InStock", "boxesCount": 1, "categoryId": 2, "gender": "Men", "itemsCount": 672, "locationId": 100000044, "productName": "trousers", "sizeId": 3, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 1, "gender": "Girl", "itemsCount": 812, "locationId": 100000045, "productName": "underwear", "sizeId": 2, "tagIds": [65, 84] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 12, "gender": "Girl", "itemsCount": 754, "locationId": 100000045, "productName": "swimwear", "sizeId": 4, "tagIds": [67, 75, 78] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 12, "gender": "Girl", "itemsCount": 607, "locationId": 100000045, "productName": "swimwear", "sizeId": 68, "tagIds": [65] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 1, "gender": "UnisexAdult", "itemsCount": 12, "locationId": 100000045, "productName": "socks", "sizeId": 52, "tagIds": [71, 78] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 1, "gender": "UnisexKid", "itemsCount": 871, "locationId": 100000045, "productName": "hats", "sizeId": 52, "tagIds": [65] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 9, "gender": "none", "itemsCount": 536, "locationId": 100000045, "productName": "towels", "sizeId": 68, "tagIds": [71, 82] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 10, "gender": "none", "itemsCount": 778, "locationId": 100000045, "productName": "deodorant", "sizeId": 68, "tagIds": [78, 81] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 207, "locationId": 100000045, "productName": "food", "sizeId": 68, "tagIds": [65, 78] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 3, "categoryId": 13, "gender": "none", "itemsCount": 1798, "locationId": 100000045, "productName": "tents", "sizeId": 68, "tagIds": [71, 72] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 8, "gender": "UnisexBaby", "itemsCount": 88, "locationId": 100000045, "productName": "trousers", "sizeId": 138, "tagIds": [77] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 2, "categoryId": 19, "gender": "none", "itemsCount": 1213, "locationId": 100000045, "productName": "drinking vessels", "sizeId": 52, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 1, "gender": "Girl", "itemsCount": 897, "locationId": 100000045, "productName": "undershirts / tank tops", "sizeId": 5, "tagIds": [78, 84] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 10, "gender": "none", "itemsCount": 336, "locationId": 100000045, "productName": "combs, hair ties, brushes", "sizeId": 68, "tagIds": [72] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 10, "gender": "none", "itemsCount": 720, "locationId": 100000045, "productName": "astm 2 masks", "sizeId": 52, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 2, "gender": "Men", "itemsCount": 325, "locationId": 100000045, "productName": "trousers", "sizeId": 55, "tagIds": [65, 68] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 2, "gender": "Men", "itemsCount": 565, "locationId": 100000045, "productName": "trousers", "sizeId": 203, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 525, "locationId": 100000045, "productName": "pasta", "sizeId": null, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 778, "locationId": 100000045, "productName": "milk", "sizeId": null, "tagIds": [71, 75] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 1, "gender": "Men", "itemsCount": 829, "locationId": 100000046, "productName": "underwear", "sizeId": 1, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 1, "gender": "Boy", "itemsCount": 587, "locationId": 100000046, "productName": "underwear", "sizeId": 52, "tagIds": [72, 74, 83] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 2, "gender": "Men", "itemsCount": 767, "locationId": 100000046, "productName": "trousers", "sizeId": 4, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 3, "gender": "Women", "itemsCount": 707, "locationId": 100000046, "productName": "t-shirts", "sizeId": 203, "tagIds": [72, 74] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 12, "gender": "Men", "itemsCount": 89, "locationId": 100000046, "productName": "swimwear", "sizeId": 48, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 12, "gender": "Boy", "itemsCount": 857, "locationId": 100000046, "productName": "gloves", "sizeId": 3, "tagIds": [74, 81] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 1, "gender": "UnisexKid", "itemsCount": 324, "locationId": 100000046, "productName": "socks", "sizeId": 52, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 9, "gender": "none", "itemsCount": 584, "locationId": 100000046, "productName": "towels", "sizeId": 68, "tagIds": [82, 84] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 617, "locationId": 100000046, "productName": "food", "sizeId": 68, "tagIds": [67, 71] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 15, "gender": "none", "itemsCount": 392, "locationId": 100000046, "productName": "inhalation device", "sizeId": 68, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 19, "gender": "none", "itemsCount": 140, "locationId": 100000046, "productName": "drinking vessels", "sizeId": 52, "tagIds": [71, 82] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 9, "gender": "none", "itemsCount": 71, "locationId": 100000046, "productName": "suitcases and bags", "sizeId": 52, "tagIds": [84] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 1, "gender": "Girl", "itemsCount": 276, "locationId": 100000046, "productName": "undershirts / tank tops", "sizeId": 52, "tagIds": [78, 84] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 10, "gender": "none", "itemsCount": 217, "locationId": 100000046, "productName": "combs, hair ties, brushes", "sizeId": 68, "tagIds": [71, 78] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 20, "gender": "none", "itemsCount": 760, "locationId": 100000046, "productName": "blankets", "sizeId": 52, "tagIds": [83] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 10, "gender": "none", "itemsCount": 315, "locationId": 100000046, "productName": "isopropryl alcohol", "sizeId": 68, "tagIds": [81] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 250, "locationId": 100000046, "productName": "pasta", "sizeId": null, "tagIds": [] }, { "__typename": "StockOverviewResult", "boxState": "Donated", "boxesCount": 1, "categoryId": 11, "gender": "none", "itemsCount": 863, "locationId": 100000046, "productName": "milk", "sizeId": null, "tagIds": [72, 77, 81] }] } } },
+ GetBoxLabelIdentifierForQrCode: {
+ "8d795aa39fff6d41a402d29dd7ddc409": { "data": { "qrCode": { "__typename": "QrCode", "box": { "__typename": "UnauthorizedForBaseError", "baseName": "Lesvos", "organisationName": "BoxAid" }, "code": "8d795aa39fff6d41a402d29dd7ddc409" } } },
+ "2c9a1bd9598ad909f84937ff8271cee0": { "data": { "qrCode": { "__typename": "QrCode", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "38216171", "lastModifiedOn": "2024-01-10T02:48:07+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "InStock" }, "code": "2c9a1bd9598ad909f84937ff8271cee0" } } },
+ "412ba2104fe5f7c98e3a55882d852f5d": { "data": { "qrCode": { "__typename": "QrCode", "box": { "__typename": "Box", "comment": "One.", "labelIdentifier": "81249458", "lastModifiedOn": "2023-10-02T23:45:39+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000048" }, "shipmentDetail": null, "state": "InStock" }, "code": "412ba2104fe5f7c98e3a55882d852f5d" } } },
+ "615f0611da1c0ca2733a7566bab1190e": { "data": { "qrCode": { "__typename": "QrCode", "box": { "__typename": "UnauthorizedForBaseError", "baseName": "Athens", "organisationName": "BoxCare" }, "code": "615f0611da1c0ca2733a7566bab1190e" } } },
+ "02292cfdb2f54e0e496c56b764507fb3": { "data": { "qrCode": { "__typename": "QrCode", "box": null, "code": "02292cfdb2f54e0e496c56b764507fb3" } } },
+ "168842e6389b520d4b1836562aa1f05": { "data": { "qrCode": { "__typename": "ResourceDoesNotExistError", "resourceName": "QrCode" } } },
+ },
+ CheckIfQrExistsInDb: {
+ "02292cfdb2f54e0e496c56b764507fb3": { "data": { "qrExists": true } },
+ },
+ AllProductsAndLocationsForBase: {
+ baseId: {
+ "2": { "data": { "base": { "__typename": "Base", "locations": [{ "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000043", "name": "WH", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "Donated", "id": "100000045", "name": "FreeShop", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "Donated", "id": "100000046", "name": "Donated location", "seq": null }], "products": [{ "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Women", "id": "1250", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1251", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Girl", "id": "1252", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1253", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Women", "id": "1254", "name": "Tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1255", "name": "Tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Girl", "id": "1256", "name": "Tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1257", "name": "Tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Bottoms" }, "deletedOn": null, "gender": "Women", "id": "1258", "name": "trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Bottoms" }, "deletedOn": null, "gender": "Men", "id": "1259", "name": "trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Bottoms" }, "deletedOn": null, "gender": "Girl", "id": "1260", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Bottoms" }, "deletedOn": null, "gender": "Boy", "id": "1261", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1262", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Men", "id": "1263", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Girl", "id": "1264", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Boy", "id": "1265", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Women", "id": "1266", "name": "Jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Men", "id": "1267", "name": "jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Girl", "id": "1268", "name": "Jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Boy", "id": "1269", "name": "Jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Women", "id": "1270", "name": "Swimwear", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1271", "name": "Swimwear", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Girl", "id": "1272", "name": "Swimwear", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Boy", "id": "1273", "name": "swimwear", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Women", "id": "1274", "name": "gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1275", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Girl", "id": "1276", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Boy", "id": "1277", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "UnisexAdult", "id": "1278", "name": "Socks", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "UnisexKid", "id": "1279", "name": "socks", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "UnisexAdult", "id": "1280", "name": "Hats", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "UnisexKid", "id": "1281", "name": "Hats", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexAdult", "id": "1282", "name": "Belts", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexKid", "id": "1283", "name": "belts", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Accessories" }, "deletedOn": null, "gender": "none", "id": "1284", "name": "Umbrellas", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Accessories" }, "deletedOn": null, "gender": "none", "id": "1285", "name": "Pillows", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Other" }, "deletedOn": null, "gender": "none", "id": "1286", "name": "Towels", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Other" }, "deletedOn": null, "gender": "none", "id": "1287", "name": "toys", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1288", "name": "Soap", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1289", "name": "Deodorant", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1290", "name": "food", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Equipment" }, "deletedOn": null, "gender": "none", "id": "1291", "name": "tents", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Equipment" }, "deletedOn": null, "gender": "none", "id": "1292", "name": "Candles", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Medication" }, "deletedOn": null, "gender": "none", "id": "1293", "name": "Inhalation device", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Baby" }, "deletedOn": null, "gender": "UnisexBaby", "id": "1294", "name": "Shirts", "sizeRange": { "__typename": "SizeRange", "id": "22", "label": "Baby by month (0-6, 7-24)", "sizes": [{ "__typename": "Size", "id": "138", "label": "0-6 months" }, { "__typename": "Size", "id": "139", "label": "7-24 months" }, { "__typename": "Size", "id": "218", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Baby" }, "deletedOn": null, "gender": "UnisexBaby", "id": "1295", "name": "Jackets", "sizeRange": { "__typename": "SizeRange", "id": "22", "label": "Baby by month (0-6, 7-24)", "sizes": [{ "__typename": "Size", "id": "138", "label": "0-6 months" }, { "__typename": "Size", "id": "139", "label": "7-24 months" }, { "__typename": "Size", "id": "218", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Baby" }, "deletedOn": null, "gender": "UnisexBaby", "id": "1296", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "22", "label": "Baby by month (0-6, 7-24)", "sizes": [{ "__typename": "Size", "id": "138", "label": "0-6 months" }, { "__typename": "Size", "id": "139", "label": "7-24 months" }, { "__typename": "Size", "id": "218", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shoes" }, "deletedOn": null, "gender": "Women", "id": "1297", "name": "Shoes", "sizeRange": { "__typename": "SizeRange", "id": "3", "label": "Shoe sizes Female", "sizes": [{ "__typename": "Size", "id": "28", "label": "34" }, { "__typename": "Size", "id": "29", "label": "35" }, { "__typename": "Size", "id": "30", "label": "36" }, { "__typename": "Size", "id": "31", "label": "37" }, { "__typename": "Size", "id": "32", "label": "38" }, { "__typename": "Size", "id": "33", "label": "39" }, { "__typename": "Size", "id": "34", "label": "40" }, { "__typename": "Size", "id": "35", "label": "41" }, { "__typename": "Size", "id": "36", "label": "42 and bigger" }, { "__typename": "Size", "id": "205", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shoes" }, "deletedOn": null, "gender": "Men", "id": "1298", "name": "Shoes", "sizeRange": { "__typename": "SizeRange", "id": "8", "label": "Shoe sizes Male", "sizes": [{ "__typename": "Size", "id": "56", "label": "38 and smaller" }, { "__typename": "Size", "id": "57", "label": "39" }, { "__typename": "Size", "id": "58", "label": "40" }, { "__typename": "Size", "id": "59", "label": "41" }, { "__typename": "Size", "id": "60", "label": "42" }, { "__typename": "Size", "id": "61", "label": "43" }, { "__typename": "Size", "id": "62", "label": "44" }, { "__typename": "Size", "id": "63", "label": "45" }, { "__typename": "Size", "id": "64", "label": "46 and bigger" }, { "__typename": "Size", "id": "208", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shoes" }, "deletedOn": null, "gender": "UnisexKid", "id": "1299", "name": "Shoes", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Water" }, "deletedOn": null, "gender": "none", "id": "1300", "name": "Drinking Vessels", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexKid", "id": "1301", "name": "Thick Socks", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shoes" }, "deletedOn": null, "gender": "Women", "id": "1302", "name": "Practical Shoes", "sizeRange": { "__typename": "SizeRange", "id": "3", "label": "Shoe sizes Female", "sizes": [{ "__typename": "Size", "id": "28", "label": "34" }, { "__typename": "Size", "id": "29", "label": "35" }, { "__typename": "Size", "id": "30", "label": "36" }, { "__typename": "Size", "id": "31", "label": "37" }, { "__typename": "Size", "id": "32", "label": "38" }, { "__typename": "Size", "id": "33", "label": "39" }, { "__typename": "Size", "id": "34", "label": "40" }, { "__typename": "Size", "id": "35", "label": "41" }, { "__typename": "Size", "id": "36", "label": "42 and bigger" }, { "__typename": "Size", "id": "205", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1303", "name": "Undershirts / Tank Tops", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Boy", "id": "1304", "name": "T-Shirts / Short Sleeves", "sizeRange": { "__typename": "SizeRange", "id": "18", "label": "Children by year (6-10, 11-15)", "sizes": [{ "__typename": "Size", "id": "124", "label": "6-10 years" }, { "__typename": "Size", "id": "125", "label": "11-15 years" }, { "__typename": "Size", "id": "214", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Other" }, "deletedOn": null, "gender": "none", "id": "1307", "name": "Suitcases and Bags", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Girl", "id": "1309", "name": "Undershirts / Tank Tops", "sizeRange": { "__typename": "SizeRange", "id": "18", "label": "Children by year (6-10, 11-15)", "sizes": [{ "__typename": "Size", "id": "124", "label": "6-10 years" }, { "__typename": "Size", "id": "125", "label": "11-15 years" }, { "__typename": "Size", "id": "214", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1311", "name": "Disposable Gloves", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1312", "name": "Leggings", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Women", "id": "1313", "name": "Thick Socks", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1314", "name": "Combs, Hair Ties, Brushes", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Bottoms" }, "deletedOn": null, "gender": "UnisexBaby", "id": "1315", "name": "Baby Trousers", "sizeRange": { "__typename": "SizeRange", "id": "21", "label": "Baby by month (0-2, 3-6, 7-12, 13-18, 19-24)", "sizes": [{ "__typename": "Size", "id": "44", "label": "19-24 months" }, { "__typename": "Size", "id": "45", "label": "3-6 months" }, { "__typename": "Size", "id": "47", "label": "7-12 months" }, { "__typename": "Size", "id": "48", "label": "13-18 months" }, { "__typename": "Size", "id": "69", "label": "0-2 months" }, { "__typename": "Size", "id": "97", "label": "All ages" }, { "__typename": "Size", "id": "217", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1317", "name": "ASTM 2 Masks ", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Bottoms" }, "deletedOn": null, "gender": "Women", "id": "1318", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Women", "id": "1319", "name": "Leggings", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shelter" }, "deletedOn": null, "gender": "none", "id": "1320", "name": "Blankets", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shoes" }, "deletedOn": null, "gender": "Boy", "id": "1321", "name": "Practical Shoes", "sizeRange": { "__typename": "SizeRange", "id": "9", "label": "Shoe sizes children", "sizes": [{ "__typename": "Size", "id": "14", "label": "20" }, { "__typename": "Size", "id": "15", "label": "21" }, { "__typename": "Size", "id": "16", "label": "22" }, { "__typename": "Size", "id": "17", "label": "23" }, { "__typename": "Size", "id": "18", "label": "24" }, { "__typename": "Size", "id": "19", "label": "25" }, { "__typename": "Size", "id": "20", "label": "26" }, { "__typename": "Size", "id": "21", "label": "27" }, { "__typename": "Size", "id": "22", "label": "28" }, { "__typename": "Size", "id": "23", "label": "29" }, { "__typename": "Size", "id": "24", "label": "30" }, { "__typename": "Size", "id": "25", "label": "31" }, { "__typename": "Size", "id": "26", "label": "32" }, { "__typename": "Size", "id": "27", "label": "33" }, { "__typename": "Size", "id": "51", "label": "19" }, { "__typename": "Size", "id": "65", "label": "35" }, { "__typename": "Size", "id": "66", "label": "36 and bigger" }, { "__typename": "Size", "id": "67", "label": "34" }, { "__typename": "Size", "id": "128", "label": "17" }, { "__typename": "Size", "id": "129", "label": "18" }, { "__typename": "Size", "id": "209", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1322", "name": "Wooden cooking spoons", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1323", "name": "Isopropryl Alcohol", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Bottoms" }, "deletedOn": null, "gender": "Men", "id": "1324", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1325", "name": "Rice", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1326", "name": "Pasta", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1327", "name": "Chickpeas", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1328", "name": "Sugar", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1329", "name": "Cereal", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1330", "name": "Sauce", "sizeRange": { "__typename": "SizeRange", "id": "29", "label": "Volume", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1331", "name": "milk", "sizeRange": { "__typename": "SizeRange", "id": "29", "label": "Volume", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1332", "name": "Vegetable oil", "sizeRange": { "__typename": "SizeRange", "id": "29", "label": "Volume", "sizes": [] } }], "tags": [{ "__typename": "Tag", "color": "#eda61a", "label": "couple", "value": "65" }, { "__typename": "Tag", "color": "#f9f0b3", "label": "two", "value": "67" }, { "__typename": "Tag", "color": "#c942d6", "label": "run", "value": "68" }, { "__typename": "Tag", "color": "#36db39", "label": "some", "value": "71" }, { "__typename": "Tag", "color": "#3bc436", "label": "walk", "value": "72" }, { "__typename": "Tag", "color": "#3ed14f", "label": "good", "value": "74" }, { "__typename": "Tag", "color": "#0c9196", "label": "bill", "value": "75" }, { "__typename": "Tag", "color": "#d8ad20", "label": "his", "value": "77" }, { "__typename": "Tag", "color": "#96ef67", "label": "over", "value": "78" }, { "__typename": "Tag", "color": "#dd1c83", "label": "movement", "value": "81" }, { "__typename": "Tag", "color": "#b16ded", "label": "maintain", "value": "82" }, { "__typename": "Tag", "color": "#4bea9a", "label": "or", "value": "83" }, { "__typename": "Tag", "color": "#99f48b", "label": "quite", "value": "84" }] } } },
+ }
+ },
+ MultiBoxActionOptionsForLocationsTagsAndShipments: {
+ baseId: {
+ "2": { "data": { "base": { "__typename": "Base", "locations": [{ "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000043", "name": "WH", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "Donated", "id": "100000045", "name": "FreeShop", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "Donated", "id": "100000046", "name": "Donated location", "seq": null }], "tags": [{ "__typename": "Tag", "color": "#eda61a", "description": "Education.", "id": "65", "name": "couple", "type": "Box" }, { "__typename": "Tag", "color": "#f9f0b3", "description": "Deep pick run range fast.", "id": "67", "name": "two", "type": "Box" }, { "__typename": "Tag", "color": "#c942d6", "description": "Position her bank shoulder save.", "id": "68", "name": "run", "type": "Box" }, { "__typename": "Tag", "color": "#36db39", "description": "Statement medical.", "id": "71", "name": "some", "type": "All" }, { "__typename": "Tag", "color": "#3bc436", "description": "Alone decade.", "id": "72", "name": "walk", "type": "Box" }, { "__typename": "Tag", "color": "#3ed14f", "description": "Let truth statement of.", "id": "74", "name": "good", "type": "All" }, { "__typename": "Tag", "color": "#0c9196", "description": "Concern bag especially.", "id": "75", "name": "bill", "type": "Box" }, { "__typename": "Tag", "color": "#d8ad20", "description": "Value during school voice.", "id": "77", "name": "his", "type": "All" }, { "__typename": "Tag", "color": "#96ef67", "description": "Family seat relationship television.", "id": "78", "name": "over", "type": "All" }, { "__typename": "Tag", "color": "#dd1c83", "description": "Large mother.", "id": "81", "name": "movement", "type": "All" }, { "__typename": "Tag", "color": "#b16ded", "description": "Study kind.", "id": "82", "name": "maintain", "type": "All" }, { "__typename": "Tag", "color": "#4bea9a", "description": "Life all yet Democrat.", "id": "83", "name": "or", "type": "Box" }, { "__typename": "Tag", "color": "#99f48b", "description": "Live learn choice hand.", "id": "84", "name": "quite", "type": "Box" }] }, "shipments": [{ "__typename": "Shipment", "id": "1", "labelIdentifier": "S001-240109-LExTH", "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "state": "Completed", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "2", "labelIdentifier": "S002-240110-LExTH", "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "state": "Canceled", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "3", "labelIdentifier": "S003-240110-THxLE", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Lost", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "id": "4", "labelIdentifier": "S004-240111-THxLE", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Receiving", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "id": "5", "labelIdentifier": "S005-240111-SAxLE", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Preparing", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "id": "6", "labelIdentifier": "S006-240111-SAxLE", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Sent", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "id": "7", "labelIdentifier": "S007-240112-THxSA", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Preparing", "targetBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "8", "labelIdentifier": "S008-240112-THxSA", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Canceled", "targetBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "9", "labelIdentifier": "S009-240112-SAxAT", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Sent", "targetBase": { "__typename": "Base", "id": "4", "name": "Athens", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "10", "labelIdentifier": "S010-240113-ATxTH", "sourceBase": { "__typename": "Base", "id": "4", "name": "Athens", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Receiving", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }] } },
+ "3": { "data": { "base": { "__typename": "Base", "locations": [{ "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000048", "name": "Stockroom", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "Donated", "id": "100000051", "name": "FreeShop", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "Donated", "id": "100000052", "name": "Donated location", "seq": null }], "tags": [{ "__typename": "Tag", "color": "#c12dce", "description": "Method similar with.", "id": "87", "name": "third", "type": "Box" }, { "__typename": "Tag", "color": "#a9a3ed", "description": "Scientist past citizen.", "id": "88", "name": "green", "type": "Box" }, { "__typename": "Tag", "color": "#8c5bef", "description": "Pass region rich while someone.", "id": "89", "name": "performance", "type": "All" }, { "__typename": "Tag", "color": "#bf118d", "description": "Improve class rich reveal.", "id": "90", "name": "both", "type": "Box" }, { "__typename": "Tag", "color": "#0e8c6e", "description": "There hope key.", "id": "91", "name": "particular", "type": "All" }, { "__typename": "Tag", "color": "#b78424", "description": "Hair bring through.", "id": "94", "name": "participant", "type": "All" }, { "__typename": "Tag", "color": "#ed538e", "description": "Song clearly.", "id": "96", "name": "collection", "type": "All" }, { "__typename": "Tag", "color": "#3f2a99", "description": "It customer event he.", "id": "100", "name": "letter", "type": "All" }, { "__typename": "Tag", "color": "#d72fe0", "description": "Beautiful can store.", "id": "101", "name": "everybody", "type": "All" }, { "__typename": "Tag", "color": "#d827b2", "description": "Tax choose mother bit.", "id": "102", "name": "reality", "type": "All" }, { "__typename": "Tag", "color": "#60f29b", "description": "Surface.", "id": "103", "name": "especially", "type": "All" }] }, "shipments": [{ "__typename": "Shipment", "id": "1", "labelIdentifier": "S001-240109-LExTH", "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "state": "Completed", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "2", "labelIdentifier": "S002-240110-LExTH", "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "state": "Canceled", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "3", "labelIdentifier": "S003-240110-THxLE", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Lost", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "id": "4", "labelIdentifier": "S004-240111-THxLE", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Receiving", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "id": "5", "labelIdentifier": "S005-240111-SAxLE", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Preparing", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "id": "6", "labelIdentifier": "S006-240111-SAxLE", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Sent", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "id": "7", "labelIdentifier": "S007-240112-THxSA", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Preparing", "targetBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "8", "labelIdentifier": "S008-240112-THxSA", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Canceled", "targetBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "9", "labelIdentifier": "S009-240112-SAxAT", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Sent", "targetBase": { "__typename": "Base", "id": "4", "name": "Athens", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "10", "labelIdentifier": "S010-240113-ATxTH", "sourceBase": { "__typename": "Base", "id": "4", "name": "Athens", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Receiving", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }] } },
+ }
+ },
+ CreateBox: { "data": { "createBox": { "__typename": "Box", "labelIdentifier": "32308232", "qrCode": { "__typename": "QrCode", "box": { "__typename": "Box", "labelIdentifier": "32308232" }, "code": "02292cfdb2f54e0e496c56b764507fb3" } } } },
+ BoxesForBoxesViewQuery: {
+ baseId: {
+ "2": { "data": { "boxes": { "__typename": "BoxPage", "elements": [{ "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "24", "name": "Lesvos Free Shop Volunteer" }, "createdOn": "2023-08-08T16:07:47+00:00", "deletedOn": null, "labelIdentifier": "38216171", "lastModifiedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lastModifiedOn": "2024-01-10T02:48:07+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 277, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "4", "name": "Accessories" }, "deletedOn": null, "gender": "none", "id": "1285", "name": "Pillows" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "25", "name": "Lesvos Library Volunteer" }, "createdOn": "2023-08-10T00:07:15+00:00", "deletedOn": null, "labelIdentifier": "63387082", "lastModifiedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lastModifiedOn": "2024-01-10T02:48:07+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 565, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1275", "name": "Gloves" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "7", "name": "Dev Volunteer" }, "createdOn": "2023-08-16T00:04:51+00:00", "deletedOn": null, "labelIdentifier": "16751747", "lastModifiedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lastModifiedOn": "2024-01-10T02:48:07+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 745, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "6", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Men", "id": "1267", "name": "jackets" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "111", "label": "Size 3 (7-13 kg)" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "23", "name": "Lesvos Warehouse Volunteer" }, "createdOn": "2023-08-25T11:01:04+00:00", "deletedOn": null, "labelIdentifier": "79739972", "lastModifiedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lastModifiedOn": "2024-01-10T02:48:07+00:00", "location": { "__typename": "ClassicLocation", "id": "100000043", "name": "WH" }, "numberOfItems": 822, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "13", "name": "Equipment" }, "deletedOn": null, "gender": "none", "id": "1291", "name": "tents" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "Current have.", "createdBy": { "__typename": "User", "id": "31", "name": "Thessaloniki Coordinator" }, "createdOn": "2023-09-08T01:55:37+00:00", "deletedOn": null, "labelIdentifier": "68875769", "lastModifiedBy": { "__typename": "User", "id": "11", "name": "Joe Doe" }, "lastModifiedOn": "2023-09-19T15:50:59+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 968, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1327", "name": "Chickpeas" }, "shipmentDetail": null, "size": null, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "createdOn": "2023-09-08T02:55:36+00:00", "deletedOn": null, "labelIdentifier": "49871766", "lastModifiedBy": { "__typename": "User", "id": "31", "name": "Thessaloniki Coordinator" }, "lastModifiedOn": "2023-09-15T19:52:31+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 871, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1331", "name": "milk" }, "shipmentDetail": null, "size": null, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#d8ad20", "description": "Value during school voice.", "id": "77", "name": "his", "type": "All" }, { "__typename": "Tag", "color": "#b16ded", "description": "Study kind.", "id": "82", "name": "maintain", "type": "All" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "15", "name": "Joe Bloggs" }, "createdOn": "2023-09-08T03:55:35+00:00", "deletedOn": null, "labelIdentifier": "65454206", "lastModifiedBy": { "__typename": "User", "id": "33", "name": "Thessaloniki Volunteer" }, "lastModifiedOn": "2023-09-16T22:52:04+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 998, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1255", "name": "Tights" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#3ed14f", "description": "Let truth statement of.", "id": "74", "name": "good", "type": "All" }] }, { "__typename": "Box", "comment": "Next owner.", "createdBy": { "__typename": "User", "id": "31", "name": "Thessaloniki Coordinator" }, "createdOn": "2023-09-08T05:55:33+00:00", "deletedOn": null, "labelIdentifier": "20835078", "lastModifiedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lastModifiedOn": "2023-09-19T16:50:58+00:00", "location": { "__typename": "ClassicLocation", "id": "100000043", "name": "WH" }, "numberOfItems": 694, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1275", "name": "Gloves" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-08T10:55:28+00:00", "deletedOn": null, "labelIdentifier": "55747779", "lastModifiedBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "lastModifiedOn": "2023-09-08T10:55:28+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 479, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "UnisexKid", "id": "1299", "name": "Shoes" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "17", "label": "23" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#36db39", "description": "Statement medical.", "id": "71", "name": "some", "type": "All" }, { "__typename": "Tag", "color": "#96ef67", "description": "Family seat relationship television.", "id": "78", "name": "over", "type": "All" }] }, { "__typename": "Box", "comment": "Career.", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-08T11:55:27+00:00", "deletedOn": null, "labelIdentifier": "58434467", "lastModifiedBy": { "__typename": "User", "id": "33", "name": "Thessaloniki Volunteer" }, "lastModifiedOn": "2023-09-19T11:51:03+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 29, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1290", "name": "food" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-08T12:55:26+00:00", "deletedOn": null, "labelIdentifier": "08833293", "lastModifiedBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "lastModifiedOn": "2023-09-17T11:51:51+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 283, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Girl", "id": "1252", "name": "Underwear" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "5", "label": "XS" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#eda61a", "description": "Education.", "id": "65", "name": "couple", "type": "Box" }, { "__typename": "Tag", "color": "#4bea9a", "description": "Life all yet Democrat.", "id": "83", "name": "or", "type": "Box" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "11", "name": "Joe Doe" }, "createdOn": "2023-09-08T17:55:21+00:00", "deletedOn": null, "labelIdentifier": "58675984", "lastModifiedBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "lastModifiedOn": "2023-09-14T20:52:54+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 850, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Women", "id": "1274", "name": "gloves" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "47", "label": "7-12 months" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "Large beat.", "createdBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "createdOn": "2023-09-08T23:55:15+00:00", "deletedOn": null, "labelIdentifier": "77655496", "lastModifiedBy": { "__typename": "User", "id": "11", "name": "Joe Doe" }, "lastModifiedOn": "2023-09-17T21:51:41+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 516, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Men", "id": "1263", "name": "T-Shirts" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "203", "label": "XXL" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#f9f0b3", "description": "Deep pick run range fast.", "id": "67", "name": "two", "type": "Box" }, { "__typename": "Tag", "color": "#d8ad20", "description": "Value during school voice.", "id": "77", "name": "his", "type": "All" }] }, { "__typename": "Box", "comment": "If forward either.", "createdBy": { "__typename": "User", "id": "33", "name": "Thessaloniki Volunteer" }, "createdOn": "2023-09-09T02:55:12+00:00", "deletedOn": null, "labelIdentifier": "18221084", "lastModifiedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lastModifiedOn": "2024-01-12T21:47:00+00:00", "location": { "__typename": "ClassicLocation", "id": "100000043", "name": "WH" }, "numberOfItems": 158, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1312", "name": "Leggings" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#f9f0b3", "description": "Deep pick run range fast.", "id": "67", "name": "two", "type": "Box" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2023-09-09T03:55:11+00:00", "deletedOn": null, "labelIdentifier": "45308932", "lastModifiedBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "lastModifiedOn": "2023-09-17T10:51:52+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 44, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "6", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Men", "id": "1267", "name": "jackets" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "3", "label": "L" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#d8ad20", "description": "Value during school voice.", "id": "77", "name": "his", "type": "All" }] }, { "__typename": "Box", "comment": "Customer area.", "createdBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "createdOn": "2023-09-09T08:55:06+00:00", "deletedOn": null, "labelIdentifier": "59795084", "lastModifiedBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "lastModifiedOn": "2023-09-09T08:55:06+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 672, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Men", "id": "1324", "name": "Trousers" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "3", "label": "L" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "Single.", "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2023-09-09T11:55:03+00:00", "deletedOn": null, "labelIdentifier": "50436901", "lastModifiedBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "lastModifiedOn": "2023-09-18T02:51:36+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 159, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1255", "name": "Tights" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "createdOn": "2023-09-09T12:55:02+00:00", "deletedOn": null, "labelIdentifier": "48897582", "lastModifiedBy": { "__typename": "User", "id": "15", "name": "Joe Bloggs" }, "lastModifiedOn": "2023-09-15T21:52:29+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 379, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "Women", "id": "1297", "name": "Shoes" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "63", "label": "45" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#3ed14f", "description": "Let truth statement of.", "id": "74", "name": "good", "type": "All" }] }, { "__typename": "Box", "comment": "Development beat.", "createdBy": { "__typename": "User", "id": "31", "name": "Thessaloniki Coordinator" }, "createdOn": "2023-09-09T13:55:01+00:00", "deletedOn": null, "labelIdentifier": "96667556", "lastModifiedBy": { "__typename": "User", "id": "11", "name": "Joe Doe" }, "lastModifiedOn": "2023-09-18T11:51:27+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 464, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1322", "name": "Wooden cooking spoons" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#0c9196", "description": "Concern bag especially.", "id": "75", "name": "bill", "type": "Box" }, { "__typename": "Tag", "color": "#dd1c83", "description": "Large mother.", "id": "81", "name": "movement", "type": "All" }, { "__typename": "Tag", "color": "#b16ded", "description": "Study kind.", "id": "82", "name": "maintain", "type": "All" }] }, { "__typename": "Box", "comment": "Source.", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-09T14:55:00+00:00", "deletedOn": null, "labelIdentifier": "59497078", "lastModifiedBy": { "__typename": "User", "id": "11", "name": "Joe Doe" }, "lastModifiedOn": "2023-09-17T22:51:40+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 31, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Girl", "id": "1264", "name": "T-Shirts" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "71", "label": "Mixed" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#f9f0b3", "description": "Deep pick run range fast.", "id": "67", "name": "two", "type": "Box" }, { "__typename": "Tag", "color": "#36db39", "description": "Statement medical.", "id": "71", "name": "some", "type": "All" }, { "__typename": "Tag", "color": "#96ef67", "description": "Family seat relationship television.", "id": "78", "name": "over", "type": "All" }, { "__typename": "Tag", "color": "#dd1c83", "description": "Large mother.", "id": "81", "name": "movement", "type": "All" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-09T18:54:56+00:00", "deletedOn": null, "labelIdentifier": "88864983", "lastModifiedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lastModifiedOn": "2024-01-12T21:47:00+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 574, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Women", "id": "1318", "name": "Trousers" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "48", "label": "13-18 months" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#dd1c83", "description": "Large mother.", "id": "81", "name": "movement", "type": "All" }] }, { "__typename": "Box", "comment": "Television pick.", "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2023-09-09T19:54:55+00:00", "deletedOn": null, "labelIdentifier": "38773239", "lastModifiedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lastModifiedOn": "2023-09-18T15:51:23+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 512, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Women", "id": "1254", "name": "Tights" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#eda61a", "description": "Education.", "id": "65", "name": "couple", "type": "Box" }, { "__typename": "Tag", "color": "#96ef67", "description": "Family seat relationship television.", "id": "78", "name": "over", "type": "All" }] }, { "__typename": "Box", "comment": "System these.", "createdBy": { "__typename": "User", "id": "33", "name": "Thessaloniki Volunteer" }, "createdOn": "2023-09-09T22:54:52+00:00", "deletedOn": null, "labelIdentifier": "12109333", "lastModifiedBy": { "__typename": "User", "id": "33", "name": "Thessaloniki Volunteer" }, "lastModifiedOn": "2023-09-18T00:51:38+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 893, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexAdult", "id": "1282", "name": "Belts" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "5", "label": "XS" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "Take shoulder.", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-10T00:54:50+00:00", "deletedOn": null, "labelIdentifier": "28389036", "lastModifiedBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "lastModifiedOn": "2023-09-19T19:50:55+00:00", "location": { "__typename": "ClassicLocation", "id": "100000043", "name": "WH" }, "numberOfItems": 459, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1322", "name": "Wooden cooking spoons" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "31", "name": "Thessaloniki Coordinator" }, "createdOn": "2023-09-10T02:54:48+00:00", "deletedOn": null, "labelIdentifier": "42339279", "lastModifiedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lastModifiedOn": "2023-09-16T11:52:15+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 469, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Boy", "id": "1261", "name": "Trousers" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "1", "label": "S" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#dd1c83", "description": "Large mother.", "id": "81", "name": "movement", "type": "All" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "createdOn": "2023-09-10T04:54:46+00:00", "deletedOn": null, "labelIdentifier": "88013328", "lastModifiedBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "lastModifiedOn": "2023-09-10T04:54:46+00:00", "location": { "__typename": "ClassicLocation", "id": "100000043", "name": "WH" }, "numberOfItems": 406, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "20", "name": "Shelter" }, "deletedOn": null, "gender": "none", "id": "1320", "name": "Blankets" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#dd1c83", "description": "Large mother.", "id": "81", "name": "movement", "type": "All" }] }, { "__typename": "Box", "comment": "Smile arm direction.", "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2023-09-10T07:54:43+00:00", "deletedOn": null, "labelIdentifier": "99154350", "lastModifiedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lastModifiedOn": "2023-09-10T07:54:43+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 137, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexKid", "id": "1301", "name": "Thick Socks" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "Civil myself.", "createdBy": { "__typename": "User", "id": "33", "name": "Thessaloniki Volunteer" }, "createdOn": "2023-09-10T11:54:39+00:00", "deletedOn": null, "labelIdentifier": "75613091", "lastModifiedBy": { "__typename": "User", "id": "31", "name": "Thessaloniki Coordinator" }, "lastModifiedOn": "2023-09-18T23:51:15+00:00", "location": { "__typename": "ClassicLocation", "id": "100000043", "name": "WH" }, "numberOfItems": 507, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Girl", "id": "1272", "name": "Swimwear" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#b16ded", "description": "Study kind.", "id": "82", "name": "maintain", "type": "All" }, { "__typename": "Tag", "color": "#99f48b", "description": "Live learn choice hand.", "id": "84", "name": "quite", "type": "Box" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "createdOn": "2023-09-10T12:54:38+00:00", "deletedOn": null, "labelIdentifier": "58078562", "lastModifiedBy": { "__typename": "User", "id": "15", "name": "Joe Bloggs" }, "lastModifiedOn": "2023-09-15T18:52:32+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 310, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "9", "name": "Other" }, "deletedOn": null, "gender": "none", "id": "1286", "name": "Towels" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#f9f0b3", "description": "Deep pick run range fast.", "id": "67", "name": "two", "type": "Box" }, { "__typename": "Tag", "color": "#3bc436", "description": "Alone decade.", "id": "72", "name": "walk", "type": "Box" }] }, { "__typename": "Box", "comment": "Main.", "createdBy": { "__typename": "User", "id": "31", "name": "Thessaloniki Coordinator" }, "createdOn": "2023-09-10T14:54:36+00:00", "deletedOn": null, "labelIdentifier": "04055095", "lastModifiedBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "lastModifiedOn": "2023-09-19T08:51:06+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 761, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "UnisexKid", "id": "1299", "name": "Shoes" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "57", "label": "39" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "createdOn": "2023-09-10T16:54:34+00:00", "deletedOn": null, "labelIdentifier": "44893944", "lastModifiedBy": { "__typename": "User", "id": "33", "name": "Thessaloniki Volunteer" }, "lastModifiedOn": "2023-09-17T17:51:45+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 824, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Men", "id": "1263", "name": "T-Shirts" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "71", "label": "Mixed" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "Might long.", "createdBy": { "__typename": "User", "id": "31", "name": "Thessaloniki Coordinator" }, "createdOn": "2023-09-10T17:54:33+00:00", "deletedOn": null, "labelIdentifier": "66411887", "lastModifiedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lastModifiedOn": "2024-01-12T21:47:00+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 663, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1262", "name": "T-Shirts" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "3", "label": "L" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#36db39", "description": "Statement medical.", "id": "71", "name": "some", "type": "All" }, { "__typename": "Tag", "color": "#3bc436", "description": "Alone decade.", "id": "72", "name": "walk", "type": "Box" }] }, { "__typename": "Box", "comment": "Act.", "createdBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "createdOn": "2023-09-10T18:54:32+00:00", "deletedOn": null, "labelIdentifier": "73975964", "lastModifiedBy": { "__typename": "User", "id": "31", "name": "Thessaloniki Coordinator" }, "lastModifiedOn": "2023-09-19T22:50:52+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 746, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "Boy", "id": "1321", "name": "Practical Shoes" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "25", "label": "31" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-10T19:54:31+00:00", "deletedOn": null, "labelIdentifier": "72502732", "lastModifiedBy": { "__typename": "User", "id": "11", "name": "Joe Doe" }, "lastModifiedOn": "2023-09-14T05:53:09+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 344, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Girl", "id": "1252", "name": "Underwear" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "4", "label": "XL" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#f9f0b3", "description": "Deep pick run range fast.", "id": "67", "name": "two", "type": "Box" }, { "__typename": "Tag", "color": "#dd1c83", "description": "Large mother.", "id": "81", "name": "movement", "type": "All" }] }, { "__typename": "Box", "comment": "Industry simple.", "createdBy": { "__typename": "User", "id": "31", "name": "Thessaloniki Coordinator" }, "createdOn": "2023-09-10T20:54:30+00:00", "deletedOn": null, "labelIdentifier": "03797927", "lastModifiedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lastModifiedOn": "2023-09-19T06:51:08+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 947, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Girl", "id": "1256", "name": "Tights" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#3ed14f", "description": "Let truth statement of.", "id": "74", "name": "good", "type": "All" }, { "__typename": "Tag", "color": "#0c9196", "description": "Concern bag especially.", "id": "75", "name": "bill", "type": "Box" }] }, { "__typename": "Box", "comment": "Movement.", "createdBy": { "__typename": "User", "id": "33", "name": "Thessaloniki Volunteer" }, "createdOn": "2023-09-10T22:54:28+00:00", "deletedOn": null, "labelIdentifier": "89730441", "lastModifiedBy": { "__typename": "User", "id": "15", "name": "Joe Bloggs" }, "lastModifiedOn": "2023-09-19T20:50:54+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 720, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "13", "name": "Equipment" }, "deletedOn": null, "gender": "none", "id": "1292", "name": "Candles" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#d8ad20", "description": "Value during school voice.", "id": "77", "name": "his", "type": "All" }, { "__typename": "Tag", "color": "#99f48b", "description": "Live learn choice hand.", "id": "84", "name": "quite", "type": "Box" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "33", "name": "Thessaloniki Volunteer" }, "createdOn": "2023-09-10T23:54:27+00:00", "deletedOn": null, "labelIdentifier": "19027348", "lastModifiedBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "lastModifiedOn": "2023-09-16T09:52:17+00:00", "location": { "__typename": "ClassicLocation", "id": "100000043", "name": "WH" }, "numberOfItems": 68, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "UnisexKid", "id": "1281", "name": "Hats" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "5", "label": "XS" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#f9f0b3", "description": "Deep pick run range fast.", "id": "67", "name": "two", "type": "Box" }, { "__typename": "Tag", "color": "#36db39", "description": "Statement medical.", "id": "71", "name": "some", "type": "All" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "15", "name": "Joe Bloggs" }, "createdOn": "2023-09-11T04:54:22+00:00", "deletedOn": null, "labelIdentifier": "20900379", "lastModifiedBy": { "__typename": "User", "id": "15", "name": "Joe Bloggs" }, "lastModifiedOn": "2023-09-11T04:54:22+00:00", "location": { "__typename": "ClassicLocation", "id": "100000043", "name": "WH" }, "numberOfItems": 250, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Boy", "id": "1273", "name": "swimwear" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#d8ad20", "description": "Value during school voice.", "id": "77", "name": "his", "type": "All" }, { "__typename": "Tag", "color": "#b16ded", "description": "Study kind.", "id": "82", "name": "maintain", "type": "All" }] }, { "__typename": "Box", "comment": "Budget.", "createdBy": { "__typename": "User", "id": "31", "name": "Thessaloniki Coordinator" }, "createdOn": "2023-09-11T07:54:19+00:00", "deletedOn": null, "labelIdentifier": "67785470", "lastModifiedBy": { "__typename": "User", "id": "33", "name": "Thessaloniki Volunteer" }, "lastModifiedOn": "2023-09-18T20:51:18+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 435, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1303", "name": "Undershirts / Tank Tops" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "203", "label": "XXL" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#0c9196", "description": "Concern bag especially.", "id": "75", "name": "bill", "type": "Box" }, { "__typename": "Tag", "color": "#4bea9a", "description": "Life all yet Democrat.", "id": "83", "name": "or", "type": "Box" }, { "__typename": "Tag", "color": "#99f48b", "description": "Live learn choice hand.", "id": "84", "name": "quite", "type": "Box" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "31", "name": "Thessaloniki Coordinator" }, "createdOn": "2023-09-11T08:54:18+00:00", "deletedOn": null, "labelIdentifier": "52160295", "lastModifiedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lastModifiedOn": "2024-01-12T21:47:00+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 320, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1253", "name": "Underwear" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "1", "label": "S" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#d8ad20", "description": "Value during school voice.", "id": "77", "name": "his", "type": "All" }, { "__typename": "Tag", "color": "#dd1c83", "description": "Large mother.", "id": "81", "name": "movement", "type": "All" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "15", "name": "Joe Bloggs" }, "createdOn": "2023-09-11T12:54:14+00:00", "deletedOn": null, "labelIdentifier": "28504995", "lastModifiedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lastModifiedOn": "2024-01-12T21:47:00+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 343, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "15", "name": "Medication" }, "deletedOn": null, "gender": "none", "id": "1293", "name": "Inhalation device" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#f9f0b3", "description": "Deep pick run range fast.", "id": "67", "name": "two", "type": "Box" }, { "__typename": "Tag", "color": "#b16ded", "description": "Study kind.", "id": "82", "name": "maintain", "type": "All" }, { "__typename": "Tag", "color": "#4bea9a", "description": "Life all yet Democrat.", "id": "83", "name": "or", "type": "Box" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "31", "name": "Thessaloniki Coordinator" }, "createdOn": "2023-09-11T13:54:13+00:00", "deletedOn": null, "labelIdentifier": "61821799", "lastModifiedBy": { "__typename": "User", "id": "15", "name": "Joe Bloggs" }, "lastModifiedOn": "2023-09-16T08:52:18+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 568, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1257", "name": "Tights" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "15", "name": "Joe Bloggs" }, "createdOn": "2023-09-11T14:54:12+00:00", "deletedOn": null, "labelIdentifier": "82039717", "lastModifiedBy": { "__typename": "User", "id": "15", "name": "Joe Bloggs" }, "lastModifiedOn": "2023-09-11T14:54:12+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 918, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Women", "id": "1274", "name": "gloves" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#c942d6", "description": "Position her bank shoulder save.", "id": "68", "name": "run", "type": "Box" }, { "__typename": "Tag", "color": "#3ed14f", "description": "Let truth statement of.", "id": "74", "name": "good", "type": "All" }, { "__typename": "Tag", "color": "#4bea9a", "description": "Life all yet Democrat.", "id": "83", "name": "or", "type": "Box" }] }, { "__typename": "Box", "comment": "Wait.", "createdBy": { "__typename": "User", "id": "11", "name": "Joe Doe" }, "createdOn": "2023-09-11T15:54:11+00:00", "deletedOn": null, "labelIdentifier": "81955750", "lastModifiedBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "lastModifiedOn": "2023-09-19T00:51:14+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 969, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "10", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1314", "name": "Combs, Hair Ties, Brushes" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#f9f0b3", "description": "Deep pick run range fast.", "id": "67", "name": "two", "type": "Box" }, { "__typename": "Tag", "color": "#c942d6", "description": "Position her bank shoulder save.", "id": "68", "name": "run", "type": "Box" }, { "__typename": "Tag", "color": "#0c9196", "description": "Concern bag especially.", "id": "75", "name": "bill", "type": "Box" }, { "__typename": "Tag", "color": "#99f48b", "description": "Live learn choice hand.", "id": "84", "name": "quite", "type": "Box" }] }, { "__typename": "Box", "comment": "Any.", "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2023-09-11T16:54:10+00:00", "deletedOn": null, "labelIdentifier": "11362260", "lastModifiedBy": { "__typename": "User", "id": "33", "name": "Thessaloniki Volunteer" }, "lastModifiedOn": "2023-09-18T22:51:16+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 135, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Girl", "id": "1252", "name": "Underwear" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "3", "label": "L" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#f9f0b3", "description": "Deep pick run range fast.", "id": "67", "name": "two", "type": "Box" }, { "__typename": "Tag", "color": "#dd1c83", "description": "Large mother.", "id": "81", "name": "movement", "type": "All" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "createdOn": "2023-09-11T17:54:09+00:00", "deletedOn": null, "labelIdentifier": "03402401", "lastModifiedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lastModifiedOn": "2023-09-16T16:52:10+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 169, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Women", "id": "1319", "name": "Leggings" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "3", "label": "L" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "createdOn": "2023-09-11T19:54:07+00:00", "deletedOn": null, "labelIdentifier": "61360042", "lastModifiedBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "lastModifiedOn": "2023-09-11T19:54:07+00:00", "location": { "__typename": "ClassicLocation", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 991, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "9", "name": "Other" }, "deletedOn": null, "gender": "none", "id": "1287", "name": "toys" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#eda61a", "description": "Education.", "id": "65", "name": "couple", "type": "Box" }, { "__typename": "Tag", "color": "#0c9196", "description": "Concern bag especially.", "id": "75", "name": "bill", "type": "Box" }, { "__typename": "Tag", "color": "#96ef67", "description": "Family seat relationship television.", "id": "78", "name": "over", "type": "All" }] }, { "__typename": "Box", "comment": "Else we.", "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2023-09-11T22:54:04+00:00", "deletedOn": null, "labelIdentifier": "32748888", "lastModifiedBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "lastModifiedOn": "2023-09-19T21:50:53+00:00", "location": { "__typename": "ClassicLocation", "id": "100000044", "name": "WH2" }, "numberOfItems": 613, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Men", "id": "1259", "name": "trousers" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "203", "label": "XXL" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#3bc436", "description": "Alone decade.", "id": "72", "name": "walk", "type": "Box" }] }], "pageInfo": { "__typename": "PageInfo", "hasNextPage": false }, "totalCount": 48 } } },
+ "3": { "data": { "boxes": { "__typename": "BoxPage", "elements": [{ "__typename": "Box", "comment": "Opportunity.", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-22T08:49:54+00:00", "deletedOn": null, "labelIdentifier": "01433790", "lastModifiedBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "lastModifiedOn": "2023-10-03T01:45:37+00:00", "location": { "__typename": "ClassicLocation", "id": "100000050", "name": "WH2" }, "numberOfItems": 948, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "10", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1373", "name": "Deodorant" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "32", "name": "Samos Coordinator" }, "createdOn": "2023-09-22T09:49:53+00:00", "deletedOn": null, "labelIdentifier": "13059530", "lastModifiedBy": { "__typename": "User", "id": "32", "name": "Samos Coordinator" }, "lastModifiedOn": "2023-09-22T09:49:53+00:00", "location": { "__typename": "ClassicLocation", "id": "100000050", "name": "WH2" }, "numberOfItems": 198, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Women", "id": "1358", "name": "Gloves" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "116", "label": "2-5 years" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#c12dce", "description": "Method similar with.", "id": "87", "name": "third", "type": "Box" }, { "__typename": "Tag", "color": "#a9a3ed", "description": "Scientist past citizen.", "id": "88", "name": "green", "type": "Box" }] }, { "__typename": "Box", "comment": "Reach.", "createdBy": { "__typename": "User", "id": "15", "name": "Joe Bloggs" }, "createdOn": "2023-09-22T10:49:52+00:00", "deletedOn": null, "labelIdentifier": "17014360", "lastModifiedBy": { "__typename": "User", "id": "34", "name": "Samos Volunteer" }, "lastModifiedOn": "2023-10-03T21:45:17+00:00", "location": { "__typename": "ClassicLocation", "id": "100000049", "name": "WH" }, "numberOfItems": 56, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Men", "id": "1347", "name": "T-Shirts" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "4", "label": "XL" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#0e8c6e", "description": "There hope key.", "id": "91", "name": "particular", "type": "All" }] }, { "__typename": "Box", "comment": "Write.", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-22T12:49:50+00:00", "deletedOn": null, "labelIdentifier": "78751919", "lastModifiedBy": { "__typename": "User", "id": "32", "name": "Samos Coordinator" }, "lastModifiedOn": "2023-10-03T00:45:38+00:00", "location": { "__typename": "ClassicLocation", "id": "100000050", "name": "WH2" }, "numberOfItems": 804, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "UnisexBaby", "id": "1390", "name": "Baby Trousers" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "5", "label": "XS" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#d827b2", "description": "Tax choose mother bit.", "id": "102", "name": "reality", "type": "All" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "34", "name": "Samos Volunteer" }, "createdOn": "2023-09-22T16:49:46+00:00", "deletedOn": null, "labelIdentifier": "60499245", "lastModifiedBy": { "__typename": "User", "id": "34", "name": "Samos Volunteer" }, "lastModifiedOn": "2023-09-22T16:49:46+00:00", "location": { "__typename": "ClassicLocation", "id": "100000049", "name": "WH" }, "numberOfItems": 484, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "8", "name": "Baby" }, "deletedOn": null, "gender": "UnisexBaby", "id": "1378", "name": "shirts" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "138", "label": "0-6 months" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#ed538e", "description": "Song clearly.", "id": "96", "name": "collection", "type": "All" }] }, { "__typename": "Box", "comment": "Statement.", "createdBy": { "__typename": "User", "id": "12", "name": "Sam Sample" }, "createdOn": "2023-09-22T17:49:45+00:00", "deletedOn": null, "labelIdentifier": "87269272", "lastModifiedBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "lastModifiedOn": "2023-10-02T09:45:53+00:00", "location": { "__typename": "ClassicLocation", "id": "100000050", "name": "WH2" }, "numberOfItems": 413, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "10", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1372", "name": "Soap" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#ed538e", "description": "Song clearly.", "id": "96", "name": "collection", "type": "All" }] }, { "__typename": "Box", "comment": "One.", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-22T21:49:41+00:00", "deletedOn": null, "labelIdentifier": "81249458", "lastModifiedBy": { "__typename": "User", "id": "32", "name": "Samos Coordinator" }, "lastModifiedOn": "2023-10-02T23:45:39+00:00", "location": { "__typename": "ClassicLocation", "id": "100000048", "name": "Stockroom" }, "numberOfItems": 855, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "Women", "id": "1381", "name": "shoes" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "18", "label": "24" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#ed538e", "description": "Song clearly.", "id": "96", "name": "collection", "type": "All" }] }, { "__typename": "Box", "comment": "Simply.", "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2023-09-22T22:49:40+00:00", "deletedOn": null, "labelIdentifier": "29105326", "lastModifiedBy": { "__typename": "User", "id": "12", "name": "Sam Sample" }, "lastModifiedOn": "2023-10-03T05:45:33+00:00", "location": { "__typename": "ClassicLocation", "id": "100000048", "name": "Stockroom" }, "numberOfItems": 518, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1337", "name": "underwear" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "15", "name": "Joe Bloggs" }, "createdOn": "2023-09-23T05:49:33+00:00", "deletedOn": null, "labelIdentifier": "44790213", "lastModifiedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lastModifiedOn": "2023-09-29T10:47:04+00:00", "location": { "__typename": "ClassicLocation", "id": "100000048", "name": "Stockroom" }, "numberOfItems": 491, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Girl", "id": "1344", "name": "Trousers" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "4", "label": "XL" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "Rock.", "createdBy": { "__typename": "User", "id": "32", "name": "Samos Coordinator" }, "createdOn": "2023-09-23T07:49:31+00:00", "deletedOn": null, "labelIdentifier": "17574636", "lastModifiedBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "lastModifiedOn": "2023-10-03T13:45:25+00:00", "location": { "__typename": "ClassicLocation", "id": "100000050", "name": "WH2" }, "numberOfItems": 498, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1414", "name": "Sauce" }, "shipmentDetail": null, "size": null, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#c12dce", "description": "Method similar with.", "id": "87", "name": "third", "type": "Box" }, { "__typename": "Tag", "color": "#bf118d", "description": "Improve class rich reveal.", "id": "90", "name": "both", "type": "Box" }, { "__typename": "Tag", "color": "#60f29b", "description": "Surface.", "id": "103", "name": "especially", "type": "All" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-23T08:49:30+00:00", "deletedOn": null, "labelIdentifier": "48827240", "lastModifiedBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "lastModifiedOn": "2023-09-29T16:46:58+00:00", "location": { "__typename": "ClassicLocation", "id": "100000050", "name": "WH2" }, "numberOfItems": 292, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Girl", "id": "1340", "name": "Tights" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#0e8c6e", "description": "There hope key.", "id": "91", "name": "particular", "type": "All" }, { "__typename": "Tag", "color": "#b78424", "description": "Hair bring through.", "id": "94", "name": "participant", "type": "All" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-23T10:49:28+00:00", "deletedOn": null, "labelIdentifier": "18698752", "lastModifiedBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "lastModifiedOn": "2023-09-29T08:47:06+00:00", "location": { "__typename": "ClassicLocation", "id": "100000049", "name": "WH" }, "numberOfItems": 231, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "9", "name": "Other" }, "deletedOn": null, "gender": "none", "id": "1371", "name": "Toys" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#ed538e", "description": "Song clearly.", "id": "96", "name": "collection", "type": "All" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "createdOn": "2023-09-23T12:49:26+00:00", "deletedOn": null, "labelIdentifier": "67229993", "lastModifiedBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "lastModifiedOn": "2023-09-23T12:49:26+00:00", "location": { "__typename": "ClassicLocation", "id": "100000050", "name": "WH2" }, "numberOfItems": 707, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "Boy", "id": "1401", "name": "Light Shoes" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "29", "label": "35" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "Tough.", "createdBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "createdOn": "2023-09-23T14:49:24+00:00", "deletedOn": null, "labelIdentifier": "65920749", "lastModifiedBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "lastModifiedOn": "2023-10-03T08:45:30+00:00", "location": { "__typename": "ClassicLocation", "id": "100000048", "name": "Stockroom" }, "numberOfItems": 938, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "Men", "id": "1382", "name": "Shoes" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "35", "label": "41" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "Movement.", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-23T16:49:22+00:00", "deletedOn": null, "labelIdentifier": "77579033", "lastModifiedBy": { "__typename": "User", "id": "15", "name": "Joe Bloggs" }, "lastModifiedOn": "2023-10-03T17:45:21+00:00", "location": { "__typename": "ClassicLocation", "id": "100000050", "name": "WH2" }, "numberOfItems": 670, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1411", "name": "Chickpeas" }, "shipmentDetail": null, "size": null, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#c12dce", "description": "Method similar with.", "id": "87", "name": "third", "type": "Box" }, { "__typename": "Tag", "color": "#bf118d", "description": "Improve class rich reveal.", "id": "90", "name": "both", "type": "Box" }, { "__typename": "Tag", "color": "#0e8c6e", "description": "There hope key.", "id": "91", "name": "particular", "type": "All" }, { "__typename": "Tag", "color": "#b78424", "description": "Hair bring through.", "id": "94", "name": "participant", "type": "All" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2023-09-23T18:49:20+00:00", "deletedOn": null, "labelIdentifier": "77137827", "lastModifiedBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "lastModifiedOn": "2023-09-30T02:46:48+00:00", "location": { "__typename": "ClassicLocation", "id": "100000048", "name": "Stockroom" }, "numberOfItems": 962, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1411", "name": "Chickpeas" }, "shipmentDetail": null, "size": null, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "Pull though.", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-23T20:49:18+00:00", "deletedOn": null, "labelIdentifier": "51883709", "lastModifiedBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "lastModifiedOn": "2023-10-04T05:45:09+00:00", "location": { "__typename": "ClassicLocation", "id": "100000050", "name": "WH2" }, "numberOfItems": 836, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Boy", "id": "1392", "name": "Trousers" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "71", "label": "Mixed" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "Point.", "createdBy": { "__typename": "User", "id": "12", "name": "Sam Sample" }, "createdOn": "2023-09-24T00:49:14+00:00", "deletedOn": null, "labelIdentifier": "87823915", "lastModifiedBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "lastModifiedOn": "2023-10-03T16:45:22+00:00", "location": { "__typename": "ClassicLocation", "id": "100000049", "name": "WH" }, "numberOfItems": 765, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Boy", "id": "1349", "name": "T-Shirts" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "203", "label": "XXL" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#60f29b", "description": "Surface.", "id": "103", "name": "especially", "type": "All" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "32", "name": "Samos Coordinator" }, "createdOn": "2023-09-24T06:49:08+00:00", "deletedOn": null, "labelIdentifier": "00952020", "lastModifiedBy": { "__typename": "User", "id": "32", "name": "Samos Coordinator" }, "lastModifiedOn": "2023-09-24T06:49:08+00:00", "location": { "__typename": "ClassicLocation", "id": "100000049", "name": "WH" }, "numberOfItems": 894, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "8", "name": "Baby" }, "deletedOn": null, "gender": "UnisexBaby", "id": "1379", "name": "jackets" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "138", "label": "0-6 months" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "Wind.", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-24T08:49:06+00:00", "deletedOn": null, "labelIdentifier": "99190801", "lastModifiedBy": { "__typename": "User", "id": "34", "name": "Samos Volunteer" }, "lastModifiedOn": "2023-10-03T18:45:20+00:00", "location": { "__typename": "ClassicLocation", "id": "100000050", "name": "WH2" }, "numberOfItems": 628, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "6", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Boy", "id": "1386", "name": "Winter Jackets" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "1", "label": "S" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#c12dce", "description": "Method similar with.", "id": "87", "name": "third", "type": "Box" }, { "__typename": "Tag", "color": "#0e8c6e", "description": "There hope key.", "id": "91", "name": "particular", "type": "All" }, { "__typename": "Tag", "color": "#b78424", "description": "Hair bring through.", "id": "94", "name": "participant", "type": "All" }] }, { "__typename": "Box", "comment": "Ahead ready.", "createdBy": { "__typename": "User", "id": "32", "name": "Samos Coordinator" }, "createdOn": "2023-09-24T12:49:02+00:00", "deletedOn": null, "labelIdentifier": "36373145", "lastModifiedBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "lastModifiedOn": "2023-10-02T19:45:43+00:00", "location": { "__typename": "ClassicLocation", "id": "100000050", "name": "WH2" }, "numberOfItems": 316, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "UnisexKid", "id": "1383", "name": "Shoes" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "18", "label": "24" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#c12dce", "description": "Method similar with.", "id": "87", "name": "third", "type": "Box" }, { "__typename": "Tag", "color": "#d827b2", "description": "Tax choose mother bit.", "id": "102", "name": "reality", "type": "All" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-24T14:49:00+00:00", "deletedOn": null, "labelIdentifier": "71843250", "lastModifiedBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "lastModifiedOn": "2023-09-24T14:49:00+00:00", "location": { "__typename": "ClassicLocation", "id": "100000050", "name": "WH2" }, "numberOfItems": 771, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "6", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Women", "id": "1350", "name": "jackets" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "4", "label": "XL" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#b78424", "description": "Hair bring through.", "id": "94", "name": "participant", "type": "All" }, { "__typename": "Tag", "color": "#ed538e", "description": "Song clearly.", "id": "96", "name": "collection", "type": "All" }, { "__typename": "Tag", "color": "#3f2a99", "description": "It customer event he.", "id": "100", "name": "letter", "type": "All" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "createdOn": "2023-09-24T16:48:58+00:00", "deletedOn": null, "labelIdentifier": "75961678", "lastModifiedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lastModifiedOn": "2023-10-01T12:46:14+00:00", "location": { "__typename": "ClassicLocation", "id": "100000048", "name": "Stockroom" }, "numberOfItems": 670, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "9", "name": "Other" }, "deletedOn": null, "gender": "none", "id": "1371", "name": "Toys" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#bf118d", "description": "Improve class rich reveal.", "id": "90", "name": "both", "type": "Box" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "32", "name": "Samos Coordinator" }, "createdOn": "2023-09-25T00:48:50+00:00", "deletedOn": null, "labelIdentifier": "65271344", "lastModifiedBy": { "__typename": "User", "id": "12", "name": "Sam Sample" }, "lastModifiedOn": "2023-10-02T06:45:56+00:00", "location": { "__typename": "ClassicLocation", "id": "100000050", "name": "WH2" }, "numberOfItems": 402, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1409", "name": "rice" }, "shipmentDetail": null, "size": null, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#bf118d", "description": "Improve class rich reveal.", "id": "90", "name": "both", "type": "Box" }, { "__typename": "Tag", "color": "#0e8c6e", "description": "There hope key.", "id": "91", "name": "particular", "type": "All" }] }, { "__typename": "Box", "comment": "That news else.", "createdBy": { "__typename": "User", "id": "12", "name": "Sam Sample" }, "createdOn": "2023-09-25T01:48:49+00:00", "deletedOn": null, "labelIdentifier": "03221789", "lastModifiedBy": { "__typename": "User", "id": "12", "name": "Sam Sample" }, "lastModifiedOn": "2023-09-25T01:48:49+00:00", "location": { "__typename": "ClassicLocation", "id": "100000048", "name": "Stockroom" }, "numberOfItems": 46, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Women", "id": "1334", "name": "Underwear" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#c12dce", "description": "Method similar with.", "id": "87", "name": "third", "type": "Box" }, { "__typename": "Tag", "color": "#8c5bef", "description": "Pass region rich while someone.", "id": "89", "name": "performance", "type": "All" }] }, { "__typename": "Box", "comment": "System that.", "createdBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "createdOn": "2023-09-25T05:48:45+00:00", "deletedOn": null, "labelIdentifier": "61181139", "lastModifiedBy": { "__typename": "User", "id": "34", "name": "Samos Volunteer" }, "lastModifiedOn": "2023-10-02T08:45:54+00:00", "location": { "__typename": "ClassicLocation", "id": "100000050", "name": "WH2" }, "numberOfItems": 78, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Boy", "id": "1361", "name": "gloves" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#b78424", "description": "Hair bring through.", "id": "94", "name": "participant", "type": "All" }] }, { "__typename": "Box", "comment": "Than low.", "createdBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "createdOn": "2023-09-25T09:48:41+00:00", "deletedOn": null, "labelIdentifier": "23777589", "lastModifiedBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "lastModifiedOn": "2023-09-28T21:47:17+00:00", "location": { "__typename": "ClassicLocation", "id": "100000049", "name": "WH" }, "numberOfItems": 414, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "19", "name": "Water" }, "deletedOn": null, "gender": "none", "id": "1404", "name": "Water Storage Containers (<10L)" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#c12dce", "description": "Method similar with.", "id": "87", "name": "third", "type": "Box" }, { "__typename": "Tag", "color": "#bf118d", "description": "Improve class rich reveal.", "id": "90", "name": "both", "type": "Box" }, { "__typename": "Tag", "color": "#60f29b", "description": "Surface.", "id": "103", "name": "especially", "type": "All" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "34", "name": "Samos Volunteer" }, "createdOn": "2023-09-25T10:48:40+00:00", "deletedOn": null, "labelIdentifier": "74877855", "lastModifiedBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "lastModifiedOn": "2023-10-01T20:46:06+00:00", "location": { "__typename": "ClassicLocation", "id": "100000049", "name": "WH" }, "numberOfItems": 934, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "13", "name": "Equipment" }, "deletedOn": null, "gender": "none", "id": "1375", "name": "tents" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#bf118d", "description": "Improve class rich reveal.", "id": "90", "name": "both", "type": "Box" }, { "__typename": "Tag", "color": "#d72fe0", "description": "Beautiful can store.", "id": "101", "name": "everybody", "type": "All" }] }, { "__typename": "Box", "comment": "Worry economy.", "createdBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "createdOn": "2023-09-25T14:48:36+00:00", "deletedOn": null, "labelIdentifier": "37869991", "lastModifiedBy": { "__typename": "User", "id": "32", "name": "Samos Coordinator" }, "lastModifiedOn": "2023-10-04T01:45:13+00:00", "location": { "__typename": "ClassicLocation", "id": "100000050", "name": "WH2" }, "numberOfItems": 88, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "9", "name": "Other" }, "deletedOn": null, "gender": "none", "id": "1371", "name": "Toys" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "15", "name": "Joe Bloggs" }, "createdOn": "2023-09-25T15:48:35+00:00", "deletedOn": null, "labelIdentifier": "57171823", "lastModifiedBy": { "__typename": "User", "id": "15", "name": "Joe Bloggs" }, "lastModifiedOn": "2023-09-25T15:48:35+00:00", "location": { "__typename": "ClassicLocation", "id": "100000049", "name": "WH" }, "numberOfItems": 639, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "10", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1372", "name": "Soap" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#bf118d", "description": "Improve class rich reveal.", "id": "90", "name": "both", "type": "Box" }, { "__typename": "Tag", "color": "#60f29b", "description": "Surface.", "id": "103", "name": "especially", "type": "All" }] }, { "__typename": "Box", "comment": "Organization same.", "createdBy": { "__typename": "User", "id": "15", "name": "Joe Bloggs" }, "createdOn": "2023-09-25T16:48:34+00:00", "deletedOn": null, "labelIdentifier": "73638834", "lastModifiedBy": { "__typename": "User", "id": "12", "name": "Sam Sample" }, "lastModifiedOn": "2023-10-04T00:45:14+00:00", "location": { "__typename": "ClassicLocation", "id": "100000050", "name": "WH2" }, "numberOfItems": 282, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "6", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Boy", "id": "1353", "name": "Jackets" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "1", "label": "S" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#8c5bef", "description": "Pass region rich while someone.", "id": "89", "name": "performance", "type": "All" }, { "__typename": "Tag", "color": "#60f29b", "description": "Surface.", "id": "103", "name": "especially", "type": "All" }] }, { "__typename": "Box", "comment": "Left news past.", "createdBy": { "__typename": "User", "id": "15", "name": "Joe Bloggs" }, "createdOn": "2023-09-25T17:48:33+00:00", "deletedOn": null, "labelIdentifier": "61633590", "lastModifiedBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "lastModifiedOn": "2023-09-30T18:46:32+00:00", "location": { "__typename": "ClassicLocation", "id": "100000048", "name": "Stockroom" }, "numberOfItems": 680, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "Women", "id": "1381", "name": "shoes" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "59", "label": "41" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "Like drop dog.", "createdBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "createdOn": "2023-09-25T20:48:30+00:00", "deletedOn": null, "labelIdentifier": "04048420", "lastModifiedBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "lastModifiedOn": "2023-09-25T20:48:30+00:00", "location": { "__typename": "ClassicLocation", "id": "100000048", "name": "Stockroom" }, "numberOfItems": 404, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "13", "name": "Equipment" }, "deletedOn": null, "gender": "none", "id": "1376", "name": "Candles" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#c12dce", "description": "Method similar with.", "id": "87", "name": "third", "type": "Box" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "createdOn": "2023-09-25T22:48:28+00:00", "deletedOn": null, "labelIdentifier": "57205415", "lastModifiedBy": { "__typename": "User", "id": "12", "name": "Sam Sample" }, "lastModifiedOn": "2023-09-30T22:46:28+00:00", "location": { "__typename": "ClassicLocation", "id": "100000048", "name": "Stockroom" }, "numberOfItems": 857, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1346", "name": "T-Shirts" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "4", "label": "XL" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#3f2a99", "description": "It customer event he.", "id": "100", "name": "letter", "type": "All" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-25T23:48:27+00:00", "deletedOn": null, "labelIdentifier": "41172926", "lastModifiedBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "lastModifiedOn": "2023-09-25T23:48:27+00:00", "location": { "__typename": "ClassicLocation", "id": "100000049", "name": "WH" }, "numberOfItems": 346, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Boy", "id": "1357", "name": "Swimwear" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "68", "label": "One size" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#bf118d", "description": "Improve class rich reveal.", "id": "90", "name": "both", "type": "Box" }, { "__typename": "Tag", "color": "#d827b2", "description": "Tax choose mother bit.", "id": "102", "name": "reality", "type": "All" }] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "createdOn": "2023-09-26T00:48:26+00:00", "deletedOn": null, "labelIdentifier": "05840116", "lastModifiedBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "lastModifiedOn": "2023-09-26T00:48:26+00:00", "location": { "__typename": "ClassicLocation", "id": "100000050", "name": "WH2" }, "numberOfItems": 686, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1415", "name": "Milk" }, "shipmentDetail": null, "size": null, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#a9a3ed", "description": "Scientist past citizen.", "id": "88", "name": "green", "type": "Box" }, { "__typename": "Tag", "color": "#3f2a99", "description": "It customer event he.", "id": "100", "name": "letter", "type": "All" }] }, { "__typename": "Box", "comment": "On government.", "createdBy": { "__typename": "User", "id": "12", "name": "Sam Sample" }, "createdOn": "2023-09-26T01:48:25+00:00", "deletedOn": null, "labelIdentifier": "52997078", "lastModifiedBy": { "__typename": "User", "id": "16", "name": "Dev Volunteer" }, "lastModifiedOn": "2023-10-04T09:45:05+00:00", "location": { "__typename": "ClassicLocation", "id": "100000049", "name": "WH" }, "numberOfItems": 248, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "19", "name": "Water" }, "deletedOn": null, "gender": "none", "id": "1404", "name": "Water Storage Containers (<10L)" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [] }, { "__typename": "Box", "comment": "", "createdBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "createdOn": "2023-09-26T03:48:23+00:00", "deletedOn": null, "labelIdentifier": "39295822", "lastModifiedBy": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" }, "lastModifiedOn": "2023-09-26T03:48:23+00:00", "location": { "__typename": "ClassicLocation", "id": "100000049", "name": "WH" }, "numberOfItems": 271, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "10", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1373", "name": "Deodorant" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "52", "label": "Mixed" }, "state": "InStock", "tags": [] }], "pageInfo": { "__typename": "PageInfo", "hasNextPage": false }, "totalCount": 38 } } },
+ }
+ },
+ ActionOptionsForBoxesView: {
+ baseId: {
+ "2": { "data": { "base": { "__typename": "Base", "id": "2", "locations": [{ "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000043", "name": "WH", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "Donated", "id": "100000045", "name": "FreeShop", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "Donated", "id": "100000046", "name": "Donated location", "seq": null }], "tags": [{ "__typename": "Tag", "color": "#eda61a", "description": "Education.", "id": "65", "name": "couple", "type": "Box" }, { "__typename": "Tag", "color": "#f9f0b3", "description": "Deep pick run range fast.", "id": "67", "name": "two", "type": "Box" }, { "__typename": "Tag", "color": "#c942d6", "description": "Position her bank shoulder save.", "id": "68", "name": "run", "type": "Box" }, { "__typename": "Tag", "color": "#36db39", "description": "Statement medical.", "id": "71", "name": "some", "type": "All" }, { "__typename": "Tag", "color": "#3bc436", "description": "Alone decade.", "id": "72", "name": "walk", "type": "Box" }, { "__typename": "Tag", "color": "#3ed14f", "description": "Let truth statement of.", "id": "74", "name": "good", "type": "All" }, { "__typename": "Tag", "color": "#0c9196", "description": "Concern bag especially.", "id": "75", "name": "bill", "type": "Box" }, { "__typename": "Tag", "color": "#d8ad20", "description": "Value during school voice.", "id": "77", "name": "his", "type": "All" }, { "__typename": "Tag", "color": "#96ef67", "description": "Family seat relationship television.", "id": "78", "name": "over", "type": "All" }, { "__typename": "Tag", "color": "#dd1c83", "description": "Large mother.", "id": "81", "name": "movement", "type": "All" }, { "__typename": "Tag", "color": "#b16ded", "description": "Study kind.", "id": "82", "name": "maintain", "type": "All" }, { "__typename": "Tag", "color": "#4bea9a", "description": "Life all yet Democrat.", "id": "83", "name": "or", "type": "Box" }, { "__typename": "Tag", "color": "#99f48b", "description": "Live learn choice hand.", "id": "84", "name": "quite", "type": "Box" }] }, "shipments": [{ "__typename": "Shipment", "id": "1", "labelIdentifier": "S001-240109-LExTH", "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "state": "Completed", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "2", "labelIdentifier": "S002-240110-LExTH", "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "state": "Canceled", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "3", "labelIdentifier": "S003-240110-THxLE", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Lost", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "id": "4", "labelIdentifier": "S004-240111-THxLE", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Receiving", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "id": "5", "labelIdentifier": "S005-240111-SAxLE", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Preparing", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "id": "6", "labelIdentifier": "S006-240111-SAxLE", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Sent", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "id": "7", "labelIdentifier": "S007-240112-THxSA", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Preparing", "targetBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "8", "labelIdentifier": "S008-240112-THxSA", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Canceled", "targetBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "9", "labelIdentifier": "S009-240112-SAxAT", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Sent", "targetBase": { "__typename": "Base", "id": "4", "name": "Athens", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "10", "labelIdentifier": "S010-240113-ATxTH", "sourceBase": { "__typename": "Base", "id": "4", "name": "Athens", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Receiving", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }] } },
+ "3": { "data": { "base": { "__typename": "Base", "id": "3", "locations": [{ "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000048", "name": "Stockroom", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "Donated", "id": "100000051", "name": "FreeShop", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "Donated", "id": "100000052", "name": "Donated location", "seq": null }], "tags": [{ "__typename": "Tag", "color": "#c12dce", "description": "Method similar with.", "id": "87", "name": "third", "type": "Box" }, { "__typename": "Tag", "color": "#a9a3ed", "description": "Scientist past citizen.", "id": "88", "name": "green", "type": "Box" }, { "__typename": "Tag", "color": "#8c5bef", "description": "Pass region rich while someone.", "id": "89", "name": "performance", "type": "All" }, { "__typename": "Tag", "color": "#bf118d", "description": "Improve class rich reveal.", "id": "90", "name": "both", "type": "Box" }, { "__typename": "Tag", "color": "#0e8c6e", "description": "There hope key.", "id": "91", "name": "particular", "type": "All" }, { "__typename": "Tag", "color": "#b78424", "description": "Hair bring through.", "id": "94", "name": "participant", "type": "All" }, { "__typename": "Tag", "color": "#ed538e", "description": "Song clearly.", "id": "96", "name": "collection", "type": "All" }, { "__typename": "Tag", "color": "#3f2a99", "description": "It customer event he.", "id": "100", "name": "letter", "type": "All" }, { "__typename": "Tag", "color": "#d72fe0", "description": "Beautiful can store.", "id": "101", "name": "everybody", "type": "All" }, { "__typename": "Tag", "color": "#d827b2", "description": "Tax choose mother bit.", "id": "102", "name": "reality", "type": "All" }, { "__typename": "Tag", "color": "#60f29b", "description": "Surface.", "id": "103", "name": "especially", "type": "All" }] }, "shipments": [{ "__typename": "Shipment", "id": "1", "labelIdentifier": "S001-240109-LExTH", "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "state": "Completed", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "2", "labelIdentifier": "S002-240110-LExTH", "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "state": "Canceled", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "3", "labelIdentifier": "S003-240110-THxLE", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Lost", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "id": "4", "labelIdentifier": "S004-240111-THxLE", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Receiving", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "id": "5", "labelIdentifier": "S005-240111-SAxLE", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Preparing", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "id": "6", "labelIdentifier": "S006-240111-SAxLE", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Sent", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "id": "7", "labelIdentifier": "S007-240112-THxSA", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Preparing", "targetBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "8", "labelIdentifier": "S008-240112-THxSA", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Canceled", "targetBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "9", "labelIdentifier": "S009-240112-SAxAT", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Sent", "targetBase": { "__typename": "Base", "id": "4", "name": "Athens", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "id": "10", "labelIdentifier": "S010-240113-ATxTH", "sourceBase": { "__typename": "Base", "id": "4", "name": "Athens", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "state": "Receiving", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }] } }
+ }
+ },
+ BoxByLabelIdentifier: { "data": { "box": { "__typename": "Box", id: "", "comment": "", "createdOn": "2023-09-11T08:54:18+00:00", "distributionEvent": null, "history": [{ "__typename": "HistoryEntry", "changeDate": "2024-12-05T07:40:14+00:00", "changes": "changed box state from Scrap to Instock", "id": "37138", "user": { "__typename": "User", "id": "17", "name": "Dev Coordinator" } }, { "__typename": "HistoryEntry", "changeDate": "2024-12-05T07:40:01+00:00", "changes": "changed box state from Instock to Scrap", "id": "37137", "user": { "__typename": "User", "id": "17", "name": "Dev Coordinator" } }, { "__typename": "HistoryEntry", "changeDate": "2024-01-12T21:47:00+00:00", "changes": "changed box state from MarkedForShipment to Instock", "id": "37104", "user": { "__typename": "User", "id": "37", "name": "Athens Coordinator" } }, { "__typename": "HistoryEntry", "changeDate": "2024-01-12T15:47:06+00:00", "changes": "changed box state from Instock to MarkedForShipment", "id": "37099", "user": { "__typename": "User", "id": "37", "name": "Athens Coordinator" } }, { "__typename": "HistoryEntry", "changeDate": "2023-09-16T10:52:16+00:00", "changes": "changed the number of items from 533 to 320", "id": "36128", "user": { "__typename": "User", "id": "10", "name": "Jane Doe" } }, { "__typename": "HistoryEntry", "changeDate": "2023-09-11T08:54:18+00:00", "changes": "created record", "id": "35944", "user": { "__typename": "User", "id": "31", "name": "Thessaloniki Coordinator" } }], "labelIdentifier": "52160295", "lastModifiedOn": "2024-12-05T07:40:14+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "distributionEventsBeforeReturnedFromDistributionState": [], "id": "2", "locations": [{ "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000043", "name": "WH", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "Donated", "id": "100000045", "name": "FreeShop", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "Donated", "id": "100000046", "name": "Donated location", "seq": null }], "name": "Thessaloniki" }, "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 320, "product": { "__typename": "Product", "deletedOn": null, "gender": "Boy", "id": "1253", "name": "Underwear" }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "1", "label": "S" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#d8ad20", "description": "Value during school voice.", "id": "77", "name": "his", "type": "All" }, { "__typename": "Tag", "color": "#dd1c83", "description": "Large mother.", "id": "81", "name": "movement", "type": "All" }] }, "shipments": [{ "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "completedOn": "2024-01-10T03:48:06+00:00", "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "63387082", "lastModifiedOn": "2024-01-10T02:48:07+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T15:48:18+00:00", "id": "1", "lostBy": null, "lostOn": null, "receivedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivedOn": "2024-01-10T03:48:06+00:00", "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000036", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1191", "name": "gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 565, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1275", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "targetQuantity": 565, "targetSize": { "__typename": "Size", "id": "52", "label": "Mixed" } }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "90151119", "lastModifiedOn": "2024-01-10T03:48:06+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "NotDelivered" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T16:48:17+00:00", "id": "2", "lostBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lostOn": "2024-01-10T03:48:06+00:00", "receivedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivedOn": "2024-01-10T03:48:06+00:00", "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000036", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Bottoms" }, "deletedOn": null, "gender": "Boy", "id": "1177", "name": "trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 921, "sourceSize": { "__typename": "Size", "id": "3", "label": "L" }, "targetProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Bottoms" }, "deletedOn": null, "gender": "Boy", "id": "1261", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "targetQuantity": 921, "targetSize": { "__typename": "Size", "id": "3", "label": "L" } }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "16751747", "lastModifiedOn": "2024-01-10T02:48:07+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T17:48:16+00:00", "id": "3", "lostBy": null, "lostOn": null, "receivedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivedOn": "2024-01-10T03:48:06+00:00", "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000037", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Baby" }, "deletedOn": null, "gender": "UnisexBaby", "id": "1240", "name": "Baby Bibs", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 745, "sourceSize": { "__typename": "Size", "id": "111", "label": "Size 3 (7-13 kg)" }, "targetProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Men", "id": "1267", "name": "jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "targetQuantity": 745, "targetSize": { "__typename": "Size", "id": "111", "label": "Size 3 (7-13 kg)" } }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Region imagine.", "labelIdentifier": "13809479", "lastModifiedOn": "2024-01-10T00:48:09+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T18:48:15+00:00", "id": "4", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T00:48:09+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000037", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexKid", "id": "1222", "name": "Scarves", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 153, "sourceSize": { "__typename": "Size", "id": "44", "label": "19-24 months" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "79739972", "lastModifiedOn": "2024-01-10T02:48:07+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000043" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T19:48:14+00:00", "id": "5", "lostBy": null, "lostOn": null, "receivedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivedOn": "2024-01-10T03:48:06+00:00", "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000037", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Equipment" }, "deletedOn": null, "gender": "none", "id": "1207", "name": "Tents", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 822, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Equipment" }, "deletedOn": null, "gender": "none", "id": "1291", "name": "tents", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "targetQuantity": 822, "targetSize": { "__typename": "Size", "id": "68", "label": "One size" } }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "59256133", "lastModifiedOn": "2024-01-10T03:48:06+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "NotDelivered" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T20:48:13+00:00", "id": "6", "lostBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lostOn": "2024-01-10T03:48:06+00:00", "receivedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivedOn": "2024-01-10T03:48:06+00:00", "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000037", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexKid", "id": "1199", "name": "Belts", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 454, "sourceSize": { "__typename": "Size", "id": "118", "label": "11-15 years" }, "targetProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexKid", "id": "1283", "name": "belts", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "targetQuantity": 454, "targetSize": { "__typename": "Size", "id": "118", "label": "11-15 years" } }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "38216171", "lastModifiedOn": "2024-01-10T02:48:07+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T21:48:12+00:00", "id": "7", "lostBy": null, "lostOn": null, "receivedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivedOn": "2024-01-10T03:48:06+00:00", "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000038", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1235", "name": "Dry Food", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 277, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Accessories" }, "deletedOn": null, "gender": "none", "id": "1285", "name": "Pillows", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "targetQuantity": 277, "targetSize": { "__typename": "Size", "id": "52", "label": "Mixed" } }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "55671051", "lastModifiedOn": "2024-01-10T00:48:09+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T22:48:11+00:00", "id": "8", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T00:48:09+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000038", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Women", "id": "1190", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 154, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "41756063", "lastModifiedOn": "2024-01-10T03:48:06+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "NotDelivered" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T23:48:10+00:00", "id": "9", "lostBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lostOn": "2024-01-10T03:48:06+00:00", "receivedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivedOn": "2024-01-10T03:48:06+00:00", "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000038", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shoes" }, "deletedOn": null, "gender": "Girl", "id": "1216", "name": "Light Shoes", "sizeRange": { "__typename": "SizeRange", "id": "9", "label": "Shoe sizes children", "sizes": [{ "__typename": "Size", "id": "14", "label": "20" }, { "__typename": "Size", "id": "15", "label": "21" }, { "__typename": "Size", "id": "16", "label": "22" }, { "__typename": "Size", "id": "17", "label": "23" }, { "__typename": "Size", "id": "18", "label": "24" }, { "__typename": "Size", "id": "19", "label": "25" }, { "__typename": "Size", "id": "20", "label": "26" }, { "__typename": "Size", "id": "21", "label": "27" }, { "__typename": "Size", "id": "22", "label": "28" }, { "__typename": "Size", "id": "23", "label": "29" }, { "__typename": "Size", "id": "24", "label": "30" }, { "__typename": "Size", "id": "25", "label": "31" }, { "__typename": "Size", "id": "26", "label": "32" }, { "__typename": "Size", "id": "27", "label": "33" }, { "__typename": "Size", "id": "51", "label": "19" }, { "__typename": "Size", "id": "65", "label": "35" }, { "__typename": "Size", "id": "66", "label": "36 and bigger" }, { "__typename": "Size", "id": "67", "label": "34" }, { "__typename": "Size", "id": "128", "label": "17" }, { "__typename": "Size", "id": "129", "label": "18" }, { "__typename": "Size", "id": "209", "label": "Mixed" }] } }, "sourceQuantity": 517, "sourceSize": { "__typename": "Size", "id": "14", "label": "20" }, "targetProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1262", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "targetQuantity": 517, "targetSize": { "__typename": "Size", "id": "14", "label": "20" } }], "id": "1", "labelIdentifier": "S001-240109-LExTH", "receivingStartedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivingStartedOn": "2024-01-10T02:48:07+00:00", "sentBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "sentOn": "2024-01-10T01:48:08+00:00", "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "startedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "startedOn": "2024-01-09T13:48:20+00:00", "state": "Completed", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "transferAgreement": { "__typename": "TransferAgreement", "comment": null, "id": "4", "type": "Bidirectional" } }, { "__typename": "Shipment", "canceledBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "canceledOn": "2024-01-10T15:47:54+00:00", "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "83200638", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T06:48:03+00:00", "id": "10", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000036", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexKid", "id": "1230", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 139, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "22534938", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T07:48:02+00:00", "id": "11", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000036", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Girl", "id": "1180", "name": "t-shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 822, "sourceSize": { "__typename": "Size", "id": "3", "label": "L" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "35257039", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T08:48:01+00:00", "id": "12", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000036", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1206", "name": "Food", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 79, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "40648848", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T09:48:00+00:00", "id": "13", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000036", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1244", "name": "sugar", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, "sourceQuantity": 833, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "18007500", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T10:47:59+00:00", "id": "14", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000037", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1167", "name": "underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 904, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Break individual.", "labelIdentifier": "62894875", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T11:47:58+00:00", "id": "15", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000038", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Girl", "id": "1188", "name": "Swimwear", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 342, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "19251616", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T12:47:57+00:00", "id": "16", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000038", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1245", "name": "Cereal", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, "sourceQuantity": 143, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Leg similar.", "labelIdentifier": "94960482", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T13:47:56+00:00", "id": "17", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000038", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "UnisexKid", "id": "1197", "name": "Hats", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 443, "sourceSize": { "__typename": "Size", "id": "124", "label": "6-10 years" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "75418901", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T14:47:55+00:00", "id": "18", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000038", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Other" }, "deletedOn": null, "gender": "none", "id": "1203", "name": "toys", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 344, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "2", "labelIdentifier": "S002-240110-LExTH", "receivingStartedBy": null, "receivingStartedOn": null, "sentBy": null, "sentOn": null, "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "startedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "startedOn": "2024-01-10T04:48:05+00:00", "state": "Canceled", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "transferAgreement": { "__typename": "TransferAgreement", "comment": null, "id": "4", "type": "Bidirectional" } }, { "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "completedOn": "2024-01-11T00:47:45+00:00", "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "53746223", "lastModifiedOn": "2024-01-11T00:47:45+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "NotDelivered" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-10T18:47:51+00:00", "id": "19", "lostBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lostOn": "2024-01-11T00:47:45+00:00", "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1314", "name": "Combs, Hair Ties, Brushes", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 118, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "22456803", "lastModifiedOn": "2024-01-11T00:47:45+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "NotDelivered" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-10T19:47:50+00:00", "id": "20", "lostBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lostOn": "2024-01-11T00:47:45+00:00", "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Girl", "id": "1268", "name": "Jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 989, "sourceSize": { "__typename": "Size", "id": "203", "label": "XXL" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "67662373", "lastModifiedOn": "2024-01-11T00:47:45+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "NotDelivered" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-10T20:47:49+00:00", "id": "21", "lostBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lostOn": "2024-01-11T00:47:45+00:00", "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1331", "name": "milk", "sizeRange": { "__typename": "SizeRange", "id": "29", "label": "Volume", "sizes": [] } }, "sourceQuantity": 312, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Book citizen big.", "labelIdentifier": "65725764", "lastModifiedOn": "2024-01-11T00:47:45+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000043" }, "shipmentDetail": null, "state": "NotDelivered" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-10T21:47:48+00:00", "id": "22", "lostBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lostOn": "2024-01-11T00:47:45+00:00", "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000043", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1253", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 809, "sourceSize": { "__typename": "Size", "id": "124", "label": "6-10 years" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "47062931", "lastModifiedOn": "2024-01-11T00:47:45+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": null, "state": "NotDelivered" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-10T22:47:47+00:00", "id": "23", "lostBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lostOn": "2024-01-11T00:47:45+00:00", "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1251", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 458, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "3", "labelIdentifier": "S003-240110-THxLE", "receivingStartedBy": null, "receivingStartedOn": null, "sentBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "sentOn": "2024-01-10T23:47:46+00:00", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-10T16:47:53+00:00", "state": "Lost", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "transferAgreement": { "__typename": "TransferAgreement", "comment": null, "id": "4", "type": "Bidirectional" } }, { "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "11356586", "lastModifiedOn": "2024-01-11T11:47:34+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "24", "shipment": { "__typename": "Shipment", "id": "4" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T03:47:42+00:00", "id": "24", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1329", "name": "Cereal", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, "sourceQuantity": 329, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Summer play.", "labelIdentifier": "38826565", "lastModifiedOn": "2024-01-11T11:47:34+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "25", "shipment": { "__typename": "Shipment", "id": "4" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T04:47:41+00:00", "id": "25", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shoes" }, "deletedOn": null, "gender": "Boy", "id": "1321", "name": "Practical Shoes", "sizeRange": { "__typename": "SizeRange", "id": "9", "label": "Shoe sizes children", "sizes": [{ "__typename": "Size", "id": "14", "label": "20" }, { "__typename": "Size", "id": "15", "label": "21" }, { "__typename": "Size", "id": "16", "label": "22" }, { "__typename": "Size", "id": "17", "label": "23" }, { "__typename": "Size", "id": "18", "label": "24" }, { "__typename": "Size", "id": "19", "label": "25" }, { "__typename": "Size", "id": "20", "label": "26" }, { "__typename": "Size", "id": "21", "label": "27" }, { "__typename": "Size", "id": "22", "label": "28" }, { "__typename": "Size", "id": "23", "label": "29" }, { "__typename": "Size", "id": "24", "label": "30" }, { "__typename": "Size", "id": "25", "label": "31" }, { "__typename": "Size", "id": "26", "label": "32" }, { "__typename": "Size", "id": "27", "label": "33" }, { "__typename": "Size", "id": "51", "label": "19" }, { "__typename": "Size", "id": "65", "label": "35" }, { "__typename": "Size", "id": "66", "label": "36 and bigger" }, { "__typename": "Size", "id": "67", "label": "34" }, { "__typename": "Size", "id": "128", "label": "17" }, { "__typename": "Size", "id": "129", "label": "18" }, { "__typename": "Size", "id": "209", "label": "Mixed" }] } }, "sourceQuantity": 819, "sourceSize": { "__typename": "Size", "id": "17", "label": "23" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Oil party.", "labelIdentifier": "94444677", "lastModifiedOn": "2024-01-11T11:47:34+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "26", "shipment": { "__typename": "Shipment", "id": "4" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T05:47:40+00:00", "id": "26", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Bottoms" }, "deletedOn": null, "gender": "Girl", "id": "1260", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 534, "sourceSize": { "__typename": "Size", "id": "5", "label": "XS" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "39527835", "lastModifiedOn": "2024-01-11T11:47:34+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000043" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "27", "shipment": { "__typename": "Shipment", "id": "4" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T06:47:39+00:00", "id": "27", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000043", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1331", "name": "milk", "sizeRange": { "__typename": "SizeRange", "id": "29", "label": "Volume", "sizes": [] } }, "sourceQuantity": 627, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Other wife.", "labelIdentifier": "20980866", "lastModifiedOn": "2024-01-11T11:47:34+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000043" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "28", "shipment": { "__typename": "Shipment", "id": "4" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T07:47:38+00:00", "id": "28", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000043", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shoes" }, "deletedOn": null, "gender": "Women", "id": "1297", "name": "Shoes", "sizeRange": { "__typename": "SizeRange", "id": "3", "label": "Shoe sizes Female", "sizes": [{ "__typename": "Size", "id": "28", "label": "34" }, { "__typename": "Size", "id": "29", "label": "35" }, { "__typename": "Size", "id": "30", "label": "36" }, { "__typename": "Size", "id": "31", "label": "37" }, { "__typename": "Size", "id": "32", "label": "38" }, { "__typename": "Size", "id": "33", "label": "39" }, { "__typename": "Size", "id": "34", "label": "40" }, { "__typename": "Size", "id": "35", "label": "41" }, { "__typename": "Size", "id": "36", "label": "42 and bigger" }, { "__typename": "Size", "id": "205", "label": "Mixed" }] } }, "sourceQuantity": 964, "sourceSize": { "__typename": "Size", "id": "17", "label": "23" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Claim.", "labelIdentifier": "56194161", "lastModifiedOn": "2024-01-11T11:47:34+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "29", "shipment": { "__typename": "Shipment", "id": "4" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T08:47:37+00:00", "id": "29", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Equipment" }, "deletedOn": null, "gender": "none", "id": "1291", "name": "tents", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 732, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Face.", "labelIdentifier": "86494710", "lastModifiedOn": "2024-01-11T11:47:34+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "30", "shipment": { "__typename": "Shipment", "id": "4" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T09:47:36+00:00", "id": "30", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1271", "name": "Swimwear", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 783, "sourceSize": { "__typename": "Size", "id": "44", "label": "19-24 months" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "4", "labelIdentifier": "S004-240111-THxLE", "receivingStartedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivingStartedOn": "2024-01-11T11:47:34+00:00", "sentBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "sentOn": "2024-01-11T10:47:35+00:00", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-11T01:47:44+00:00", "state": "Receiving", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "transferAgreement": { "__typename": "TransferAgreement", "comment": null, "id": "4", "type": "Bidirectional" } }, { "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "31185372", "lastModifiedOn": "2024-01-11T13:47:32+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000049" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "31", "shipment": { "__typename": "Shipment", "id": "5" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T14:47:31+00:00", "id": "31", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shelter" }, "deletedOn": null, "gender": "none", "id": "1398", "name": "Tarps", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 818, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "13422831", "lastModifiedOn": "2024-01-11T13:47:32+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000049" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "32", "shipment": { "__typename": "Shipment", "id": "5" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T15:47:30+00:00", "id": "32", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1337", "name": "underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 89, "sourceSize": { "__typename": "Size", "id": "3", "label": "L" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Establish determine.", "labelIdentifier": "62155757", "lastModifiedOn": "2024-01-11T13:47:32+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000049" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "33", "shipment": { "__typename": "Shipment", "id": "5" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T16:47:29+00:00", "id": "33", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1412", "name": "sugar", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, "sourceQuantity": 271, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "A.", "labelIdentifier": "26416901", "lastModifiedOn": "2024-01-11T13:47:32+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000049" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "34", "shipment": { "__typename": "Shipment", "id": "5" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T17:47:28+00:00", "id": "34", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1402", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 320, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Family.", "labelIdentifier": "59166590", "lastModifiedOn": "2024-01-11T13:47:32+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "35", "shipment": { "__typename": "Shipment", "id": "5" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T18:47:27+00:00", "id": "35", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1395", "name": "T-Shirts / Short Sleeves", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 880, "sourceSize": { "__typename": "Size", "id": "3", "label": "L" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Film.", "labelIdentifier": "08014455", "lastModifiedOn": "2024-01-11T13:47:32+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "36", "shipment": { "__typename": "Shipment", "id": "5" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T19:47:26+00:00", "id": "36", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shelter" }, "deletedOn": null, "gender": "none", "id": "1398", "name": "Tarps", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 756, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "43790665", "lastModifiedOn": "2024-01-11T13:47:32+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "37", "shipment": { "__typename": "Shipment", "id": "5" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T20:47:25+00:00", "id": "37", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Women", "id": "1338", "name": "tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 75, "sourceSize": { "__typename": "Size", "id": "1", "label": "S" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "5", "labelIdentifier": "S005-240111-SAxLE", "receivingStartedBy": null, "receivingStartedOn": null, "sentBy": null, "sentOn": null, "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-11T12:47:33+00:00", "state": "Preparing", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "transferAgreement": { "__typename": "TransferAgreement", "comment": null, "id": "4", "type": "Bidirectional" } }, { "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Thing world.", "labelIdentifier": "80234440", "lastModifiedOn": "2024-01-12T06:47:15+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000048" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "38", "shipment": { "__typename": "Shipment", "id": "6" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T23:47:22+00:00", "id": "38", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000048", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shoes" }, "deletedOn": null, "gender": "UnisexKid", "id": "1383", "name": "Shoes", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 57, "sourceSize": { "__typename": "Size", "id": "128", "label": "17" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Way must season.", "labelIdentifier": "57898654", "lastModifiedOn": "2024-01-12T06:47:15+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000049" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "39", "shipment": { "__typename": "Shipment", "id": "6" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T00:47:21+00:00", "id": "39", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Medication" }, "deletedOn": null, "gender": "none", "id": "1377", "name": "Inhalation device", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 20, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "18990546", "lastModifiedOn": "2024-01-12T06:47:15+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000049" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "40", "shipment": { "__typename": "Shipment", "id": "6" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T01:47:20+00:00", "id": "40", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1395", "name": "T-Shirts / Short Sleeves", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 690, "sourceSize": { "__typename": "Size", "id": "1", "label": "S" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Feeling off.", "labelIdentifier": "63390691", "lastModifiedOn": "2024-01-12T06:47:15+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000049" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "41", "shipment": { "__typename": "Shipment", "id": "6" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T02:47:19+00:00", "id": "41", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1402", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 817, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Interesting enjoy.", "labelIdentifier": "93868352", "lastModifiedOn": "2024-01-12T06:47:15+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "42", "shipment": { "__typename": "Shipment", "id": "6" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T03:47:18+00:00", "id": "42", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1359", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 991, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "05869455", "lastModifiedOn": "2024-01-12T06:47:15+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "43", "shipment": { "__typename": "Shipment", "id": "6" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T04:47:17+00:00", "id": "43", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1411", "name": "Chickpeas", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, "sourceQuantity": 710, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Beautiful federal.", "labelIdentifier": "81612100", "lastModifiedOn": "2024-01-12T06:47:15+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "44", "shipment": { "__typename": "Shipment", "id": "6" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T05:47:16+00:00", "id": "44", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1341", "name": "Tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 320, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "6", "labelIdentifier": "S006-240111-SAxLE", "receivingStartedBy": null, "receivingStartedOn": null, "sentBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "sentOn": "2024-01-12T06:47:15+00:00", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-11T21:47:24+00:00", "state": "Sent", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "transferAgreement": { "__typename": "TransferAgreement", "comment": null, "id": "4", "type": "Bidirectional" } }, { "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Bad.", "labelIdentifier": "01102338", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "45", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T09:47:12+00:00", "id": "45", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1290", "name": "food", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 441, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Difference fish.", "labelIdentifier": "76410383", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "46", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T10:47:11+00:00", "id": "46", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1311", "name": "Disposable Gloves", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 914, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "47243575", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000043" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "47", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T11:47:10+00:00", "id": "47", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000043", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1262", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 191, "sourceSize": { "__typename": "Size", "id": "4", "label": "XL" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Former.", "labelIdentifier": "22088938", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "48", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T12:47:09+00:00", "id": "48", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1323", "name": "Isopropryl Alcohol", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 845, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "If.", "labelIdentifier": "84046017", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "49", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T13:47:08+00:00", "id": "49", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1289", "name": "Deodorant", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 492, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "7", "labelIdentifier": "S007-240112-THxSA", "receivingStartedBy": null, "receivingStartedOn": null, "sentBy": null, "sentOn": null, "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-12T07:47:14+00:00", "state": "Preparing", "targetBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "transferAgreement": null }, { "__typename": "Shipment", "canceledBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "canceledOn": "2024-01-12T21:47:00+00:00", "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "52160295", "lastModifiedOn": "2024-12-05T07:40:14+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T16:47:05+00:00", "id": "50", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "removedOn": "2024-01-12T21:47:00+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1253", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 320, "sourceSize": { "__typename": "Size", "id": "1", "label": "S" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "28504995", "lastModifiedOn": "2024-01-12T21:47:00+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T17:47:04+00:00", "id": "51", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "removedOn": "2024-01-12T21:47:00+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Medication" }, "deletedOn": null, "gender": "none", "id": "1293", "name": "Inhalation device", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 343, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "If forward either.", "labelIdentifier": "18221084", "lastModifiedOn": "2024-01-12T21:47:00+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000043" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T18:47:03+00:00", "id": "52", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "removedOn": "2024-01-12T21:47:00+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000043", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1312", "name": "Leggings", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 158, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "88864983", "lastModifiedOn": "2024-01-12T21:47:00+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T19:47:02+00:00", "id": "53", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "removedOn": "2024-01-12T21:47:00+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Bottoms" }, "deletedOn": null, "gender": "Women", "id": "1318", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 574, "sourceSize": { "__typename": "Size", "id": "48", "label": "13-18 months" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Might long.", "labelIdentifier": "66411887", "lastModifiedOn": "2024-01-12T21:47:00+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T20:47:01+00:00", "id": "54", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "removedOn": "2024-01-12T21:47:00+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1262", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 663, "sourceSize": { "__typename": "Size", "id": "3", "label": "L" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "8", "labelIdentifier": "S008-240112-THxSA", "receivingStartedBy": null, "receivingStartedOn": null, "sentBy": null, "sentOn": null, "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-12T14:47:07+00:00", "state": "Canceled", "targetBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "transferAgreement": null }, { "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "83178437", "lastModifiedOn": "2024-01-13T05:46:52+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000048" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "55", "shipment": { "__typename": "Shipment", "id": "9" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T00:46:57+00:00", "id": "55", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000048", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Other" }, "deletedOn": null, "gender": "none", "id": "1371", "name": "Toys", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 823, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "91328775", "lastModifiedOn": "2024-01-13T05:46:52+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000049" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "56", "shipment": { "__typename": "Shipment", "id": "9" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T01:46:56+00:00", "id": "56", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Women", "id": "1358", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 117, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Point feeling.", "labelIdentifier": "67677949", "lastModifiedOn": "2024-01-13T05:46:52+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "57", "shipment": { "__typename": "Shipment", "id": "9" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T02:46:55+00:00", "id": "57", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1416", "name": "Vegetable oil", "sizeRange": { "__typename": "SizeRange", "id": "29", "label": "Volume", "sizes": [] } }, "sourceQuantity": 190, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "At thus.", "labelIdentifier": "96408065", "lastModifiedOn": "2024-01-13T05:46:52+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "58", "shipment": { "__typename": "Shipment", "id": "9" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T03:46:54+00:00", "id": "58", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Toys & Games" }, "deletedOn": null, "gender": "none", "id": "1407", "name": "Toys", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 94, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "49161856", "lastModifiedOn": "2024-01-13T05:46:52+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "59", "shipment": { "__typename": "Shipment", "id": "9" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T04:46:53+00:00", "id": "59", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexKid", "id": "1367", "name": "Belts", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 382, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "9", "labelIdentifier": "S009-240112-SAxAT", "receivingStartedBy": null, "receivingStartedOn": null, "sentBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "sentOn": "2024-01-13T05:46:52+00:00", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-12T22:46:59+00:00", "state": "Sent", "targetBase": { "__typename": "Base", "id": "4", "name": "Athens", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "transferAgreement": null }, { "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "59986347", "lastModifiedOn": "2024-01-13T15:46:42+00:00", "location": null, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "60", "shipment": { "__typename": "Shipment", "id": "10" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T08:46:49+00:00", "id": "60", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000054", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1474", "name": "Condoms", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 420, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "47790512", "lastModifiedOn": "2024-01-13T15:46:42+00:00", "location": null, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "61", "shipment": { "__typename": "Shipment", "id": "10" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T09:46:48+00:00", "id": "61", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000054", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Women", "id": "1418", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 540, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Prepare police.", "labelIdentifier": "83731660", "lastModifiedOn": "2024-01-13T15:46:42+00:00", "location": null, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "62", "shipment": { "__typename": "Shipment", "id": "10" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T10:46:47+00:00", "id": "62", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000054", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shoes" }, "deletedOn": null, "gender": "Girl", "id": "1486", "name": "Practical Shoes", "sizeRange": { "__typename": "SizeRange", "id": "9", "label": "Shoe sizes children", "sizes": [{ "__typename": "Size", "id": "14", "label": "20" }, { "__typename": "Size", "id": "15", "label": "21" }, { "__typename": "Size", "id": "16", "label": "22" }, { "__typename": "Size", "id": "17", "label": "23" }, { "__typename": "Size", "id": "18", "label": "24" }, { "__typename": "Size", "id": "19", "label": "25" }, { "__typename": "Size", "id": "20", "label": "26" }, { "__typename": "Size", "id": "21", "label": "27" }, { "__typename": "Size", "id": "22", "label": "28" }, { "__typename": "Size", "id": "23", "label": "29" }, { "__typename": "Size", "id": "24", "label": "30" }, { "__typename": "Size", "id": "25", "label": "31" }, { "__typename": "Size", "id": "26", "label": "32" }, { "__typename": "Size", "id": "27", "label": "33" }, { "__typename": "Size", "id": "51", "label": "19" }, { "__typename": "Size", "id": "65", "label": "35" }, { "__typename": "Size", "id": "66", "label": "36 and bigger" }, { "__typename": "Size", "id": "67", "label": "34" }, { "__typename": "Size", "id": "128", "label": "17" }, { "__typename": "Size", "id": "129", "label": "18" }, { "__typename": "Size", "id": "209", "label": "Mixed" }] } }, "sourceQuantity": 381, "sourceSize": { "__typename": "Size", "id": "32", "label": "38" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Project.", "labelIdentifier": "30027051", "lastModifiedOn": "2024-01-13T15:46:42+00:00", "location": null, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "63", "shipment": { "__typename": "Shipment", "id": "10" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T11:46:46+00:00", "id": "63", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000055", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Bottoms" }, "deletedOn": null, "gender": "Boy", "id": "1429", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 423, "sourceSize": { "__typename": "Size", "id": "1", "label": "S" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Today.", "labelIdentifier": "11435613", "lastModifiedOn": "2024-01-13T15:46:42+00:00", "location": null, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "64", "shipment": { "__typename": "Shipment", "id": "10" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T12:46:45+00:00", "id": "64", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000056", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Girl", "id": "1424", "name": "Tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 594, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Still.", "labelIdentifier": "18645528", "lastModifiedOn": "2024-01-13T15:46:42+00:00", "location": null, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "65", "shipment": { "__typename": "Shipment", "id": "10" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T13:46:44+00:00", "id": "65", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000056", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1497", "name": "Cereal", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, "sourceQuantity": 545, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "10", "labelIdentifier": "S010-240113-ATxTH", "receivingStartedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivingStartedOn": "2024-01-13T15:46:42+00:00", "sentBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "sentOn": "2024-01-13T14:46:43+00:00", "sourceBase": { "__typename": "Base", "id": "4", "name": "Athens", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-13T06:46:51+00:00", "state": "Receiving", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "transferAgreement": null }] } },
+ BoxByLabelIdentifierAndAllProductsWithBaseId: {
+ baseId: {
+ "2": { "data": { "base": { "__typename": "Base", "locations": [{ "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000043", "name": "WH", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "Donated", "id": "100000045", "name": "FreeShop", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "Donated", "id": "100000046", "name": "Donated location", "seq": null }], "products": [{ "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Women", "id": "1250", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1251", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Girl", "id": "1252", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1253", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Women", "id": "1254", "name": "Tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1255", "name": "Tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Girl", "id": "1256", "name": "Tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1257", "name": "Tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Women", "id": "1258", "name": "trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Men", "id": "1259", "name": "trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Girl", "id": "1260", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Boy", "id": "1261", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1262", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Men", "id": "1263", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Girl", "id": "1264", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Boy", "id": "1265", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "6", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Women", "id": "1266", "name": "Jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "6", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Men", "id": "1267", "name": "jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "6", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Girl", "id": "1268", "name": "Jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "6", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Boy", "id": "1269", "name": "Jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Women", "id": "1270", "name": "Swimwear", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1271", "name": "Swimwear", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Girl", "id": "1272", "name": "Swimwear", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Boy", "id": "1273", "name": "swimwear", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Women", "id": "1274", "name": "gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1275", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Girl", "id": "1276", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Boy", "id": "1277", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "UnisexAdult", "id": "1278", "name": "Socks", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "UnisexKid", "id": "1279", "name": "socks", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "UnisexAdult", "id": "1280", "name": "Hats", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "UnisexKid", "id": "1281", "name": "Hats", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexAdult", "id": "1282", "name": "Belts", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexKid", "id": "1283", "name": "belts", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "4", "name": "Accessories" }, "deletedOn": null, "gender": "none", "id": "1284", "name": "Umbrellas", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "4", "name": "Accessories" }, "deletedOn": null, "gender": "none", "id": "1285", "name": "Pillows", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "9", "name": "Other" }, "deletedOn": null, "gender": "none", "id": "1286", "name": "Towels", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "9", "name": "Other" }, "deletedOn": null, "gender": "none", "id": "1287", "name": "toys", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "10", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1288", "name": "Soap", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "10", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1289", "name": "Deodorant", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1290", "name": "food", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "13", "name": "Equipment" }, "deletedOn": null, "gender": "none", "id": "1291", "name": "tents", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "13", "name": "Equipment" }, "deletedOn": null, "gender": "none", "id": "1292", "name": "Candles", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "15", "name": "Medication" }, "deletedOn": null, "gender": "none", "id": "1293", "name": "Inhalation device", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "8", "name": "Baby" }, "deletedOn": null, "gender": "UnisexBaby", "id": "1294", "name": "Shirts", "sizeRange": { "__typename": "SizeRange", "id": "22", "label": "Baby by month (0-6, 7-24)", "sizes": [{ "__typename": "Size", "id": "138", "label": "0-6 months" }, { "__typename": "Size", "id": "139", "label": "7-24 months" }, { "__typename": "Size", "id": "218", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "8", "name": "Baby" }, "deletedOn": null, "gender": "UnisexBaby", "id": "1295", "name": "Jackets", "sizeRange": { "__typename": "SizeRange", "id": "22", "label": "Baby by month (0-6, 7-24)", "sizes": [{ "__typename": "Size", "id": "138", "label": "0-6 months" }, { "__typename": "Size", "id": "139", "label": "7-24 months" }, { "__typename": "Size", "id": "218", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "8", "name": "Baby" }, "deletedOn": null, "gender": "UnisexBaby", "id": "1296", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "22", "label": "Baby by month (0-6, 7-24)", "sizes": [{ "__typename": "Size", "id": "138", "label": "0-6 months" }, { "__typename": "Size", "id": "139", "label": "7-24 months" }, { "__typename": "Size", "id": "218", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "Women", "id": "1297", "name": "Shoes", "sizeRange": { "__typename": "SizeRange", "id": "3", "label": "Shoe sizes Female", "sizes": [{ "__typename": "Size", "id": "28", "label": "34" }, { "__typename": "Size", "id": "29", "label": "35" }, { "__typename": "Size", "id": "30", "label": "36" }, { "__typename": "Size", "id": "31", "label": "37" }, { "__typename": "Size", "id": "32", "label": "38" }, { "__typename": "Size", "id": "33", "label": "39" }, { "__typename": "Size", "id": "34", "label": "40" }, { "__typename": "Size", "id": "35", "label": "41" }, { "__typename": "Size", "id": "36", "label": "42 and bigger" }, { "__typename": "Size", "id": "205", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "Men", "id": "1298", "name": "Shoes", "sizeRange": { "__typename": "SizeRange", "id": "8", "label": "Shoe sizes Male", "sizes": [{ "__typename": "Size", "id": "56", "label": "38 and smaller" }, { "__typename": "Size", "id": "57", "label": "39" }, { "__typename": "Size", "id": "58", "label": "40" }, { "__typename": "Size", "id": "59", "label": "41" }, { "__typename": "Size", "id": "60", "label": "42" }, { "__typename": "Size", "id": "61", "label": "43" }, { "__typename": "Size", "id": "62", "label": "44" }, { "__typename": "Size", "id": "63", "label": "45" }, { "__typename": "Size", "id": "64", "label": "46 and bigger" }, { "__typename": "Size", "id": "208", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "UnisexKid", "id": "1299", "name": "Shoes", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "19", "name": "Water" }, "deletedOn": null, "gender": "none", "id": "1300", "name": "Drinking Vessels", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexKid", "id": "1301", "name": "Thick Socks", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "Women", "id": "1302", "name": "Practical Shoes", "sizeRange": { "__typename": "SizeRange", "id": "3", "label": "Shoe sizes Female", "sizes": [{ "__typename": "Size", "id": "28", "label": "34" }, { "__typename": "Size", "id": "29", "label": "35" }, { "__typename": "Size", "id": "30", "label": "36" }, { "__typename": "Size", "id": "31", "label": "37" }, { "__typename": "Size", "id": "32", "label": "38" }, { "__typename": "Size", "id": "33", "label": "39" }, { "__typename": "Size", "id": "34", "label": "40" }, { "__typename": "Size", "id": "35", "label": "41" }, { "__typename": "Size", "id": "36", "label": "42 and bigger" }, { "__typename": "Size", "id": "205", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1303", "name": "Undershirts / Tank Tops", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Boy", "id": "1304", "name": "T-Shirts / Short Sleeves", "sizeRange": { "__typename": "SizeRange", "id": "18", "label": "Children by year (6-10, 11-15)", "sizes": [{ "__typename": "Size", "id": "124", "label": "6-10 years" }, { "__typename": "Size", "id": "125", "label": "11-15 years" }, { "__typename": "Size", "id": "214", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "9", "name": "Other" }, "deletedOn": null, "gender": "none", "id": "1307", "name": "Suitcases and Bags", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Girl", "id": "1309", "name": "Undershirts / Tank Tops", "sizeRange": { "__typename": "SizeRange", "id": "18", "label": "Children by year (6-10, 11-15)", "sizes": [{ "__typename": "Size", "id": "124", "label": "6-10 years" }, { "__typename": "Size", "id": "125", "label": "11-15 years" }, { "__typename": "Size", "id": "214", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "10", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1311", "name": "Disposable Gloves", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1312", "name": "Leggings", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Women", "id": "1313", "name": "Thick Socks", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "10", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1314", "name": "Combs, Hair Ties, Brushes", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "UnisexBaby", "id": "1315", "name": "Baby Trousers", "sizeRange": { "__typename": "SizeRange", "id": "21", "label": "Baby by month (0-2, 3-6, 7-12, 13-18, 19-24)", "sizes": [{ "__typename": "Size", "id": "44", "label": "19-24 months" }, { "__typename": "Size", "id": "45", "label": "3-6 months" }, { "__typename": "Size", "id": "47", "label": "7-12 months" }, { "__typename": "Size", "id": "48", "label": "13-18 months" }, { "__typename": "Size", "id": "69", "label": "0-2 months" }, { "__typename": "Size", "id": "97", "label": "All ages" }, { "__typename": "Size", "id": "217", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "10", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1317", "name": "ASTM 2 Masks ", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Women", "id": "1318", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Women", "id": "1319", "name": "Leggings", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "20", "name": "Shelter" }, "deletedOn": null, "gender": "none", "id": "1320", "name": "Blankets", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "Boy", "id": "1321", "name": "Practical Shoes", "sizeRange": { "__typename": "SizeRange", "id": "9", "label": "Shoe sizes children", "sizes": [{ "__typename": "Size", "id": "14", "label": "20" }, { "__typename": "Size", "id": "15", "label": "21" }, { "__typename": "Size", "id": "16", "label": "22" }, { "__typename": "Size", "id": "17", "label": "23" }, { "__typename": "Size", "id": "18", "label": "24" }, { "__typename": "Size", "id": "19", "label": "25" }, { "__typename": "Size", "id": "20", "label": "26" }, { "__typename": "Size", "id": "21", "label": "27" }, { "__typename": "Size", "id": "22", "label": "28" }, { "__typename": "Size", "id": "23", "label": "29" }, { "__typename": "Size", "id": "24", "label": "30" }, { "__typename": "Size", "id": "25", "label": "31" }, { "__typename": "Size", "id": "26", "label": "32" }, { "__typename": "Size", "id": "27", "label": "33" }, { "__typename": "Size", "id": "51", "label": "19" }, { "__typename": "Size", "id": "65", "label": "35" }, { "__typename": "Size", "id": "66", "label": "36 and bigger" }, { "__typename": "Size", "id": "67", "label": "34" }, { "__typename": "Size", "id": "128", "label": "17" }, { "__typename": "Size", "id": "129", "label": "18" }, { "__typename": "Size", "id": "209", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1322", "name": "Wooden cooking spoons", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "10", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1323", "name": "Isopropryl Alcohol", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Men", "id": "1324", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1325", "name": "Rice", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1326", "name": "Pasta", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1327", "name": "Chickpeas", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1328", "name": "Sugar", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1329", "name": "Cereal", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1330", "name": "Sauce", "sizeRange": { "__typename": "SizeRange", "id": "29", "label": "Volume", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1331", "name": "milk", "sizeRange": { "__typename": "SizeRange", "id": "29", "label": "Volume", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1332", "name": "Vegetable oil", "sizeRange": { "__typename": "SizeRange", "id": "29", "label": "Volume", "sizes": [] } }], "tags": [{ "__typename": "Tag", "color": "#eda61a", "label": "couple", "value": "65" }, { "__typename": "Tag", "color": "#f9f0b3", "label": "two", "value": "67" }, { "__typename": "Tag", "color": "#c942d6", "label": "run", "value": "68" }, { "__typename": "Tag", "color": "#36db39", "label": "some", "value": "71" }, { "__typename": "Tag", "color": "#3bc436", "label": "walk", "value": "72" }, { "__typename": "Tag", "color": "#3ed14f", "label": "good", "value": "74" }, { "__typename": "Tag", "color": "#0c9196", "label": "bill", "value": "75" }, { "__typename": "Tag", "color": "#d8ad20", "label": "his", "value": "77" }, { "__typename": "Tag", "color": "#96ef67", "label": "over", "value": "78" }, { "__typename": "Tag", "color": "#dd1c83", "label": "movement", "value": "81" }, { "__typename": "Tag", "color": "#b16ded", "label": "maintain", "value": "82" }, { "__typename": "Tag", "color": "#4bea9a", "label": "or", "value": "83" }, { "__typename": "Tag", "color": "#99f48b", "label": "quite", "value": "84" }] }, "box": { "__typename": "Box", "comment": "", "createdOn": "2023-09-11T08:54:18+00:00", "history": [{ "__typename": "HistoryEntry", "changeDate": "2024-01-12T21:47:00+00:00", "changes": "changed box state from MarkedForShipment to Instock", "id": "37104", "user": { "__typename": "User", "id": "37", "name": "Athens Coordinator" } }, { "__typename": "HistoryEntry", "changeDate": "2024-01-12T15:47:06+00:00", "changes": "changed box state from Instock to MarkedForShipment", "id": "37099", "user": { "__typename": "User", "id": "37", "name": "Athens Coordinator" } }, { "__typename": "HistoryEntry", "changeDate": "2023-09-16T10:52:16+00:00", "changes": "changed the number of items from 533 to 320", "id": "36128", "user": { "__typename": "User", "id": "10", "name": "Jane Doe" } }, { "__typename": "HistoryEntry", "changeDate": "2023-09-11T08:54:18+00:00", "changes": "created record", "id": "35944", "user": { "__typename": "User", "id": "31", "name": "Thessaloniki Coordinator" } }], "id": "100000829", "labelIdentifier": "52160295", "lastModifiedOn": "2024-01-12T21:47:00+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2", "name": "Thessaloniki" }, "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "numberOfItems": 320, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1253", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "1", "label": "S" }, "state": "InStock", "tags": [{ "__typename": "Tag", "color": "#d8ad20", "description": "Value during school voice.", "id": "77", "label": "his", "name": "his", "type": "All", "value": "77" }, { "__typename": "Tag", "color": "#dd1c83", "description": "Large mother.", "id": "81", "label": "movement", "name": "movement", "type": "All", "value": "81" }] } } },
+ "3": { "data": { "base": { "__typename": "Base", "locations": [{ "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000048", "name": "Stockroom", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "Donated", "id": "100000051", "name": "FreeShop", "seq": null }, { "__typename": "ClassicLocation", "defaultBoxState": "Donated", "id": "100000052", "name": "Donated location", "seq": null }], "products": [{ "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Women", "id": "1334", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1335", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Girl", "id": "1336", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1337", "name": "underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Women", "id": "1338", "name": "tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1339", "name": "Tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Girl", "id": "1340", "name": "Tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1341", "name": "Tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Women", "id": "1342", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Men", "id": "1343", "name": "trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Girl", "id": "1344", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Boy", "id": "1345", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1346", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Men", "id": "1347", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Girl", "id": "1348", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Boy", "id": "1349", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "6", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Women", "id": "1350", "name": "jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "6", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Men", "id": "1351", "name": "Jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "6", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Girl", "id": "1352", "name": "jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "6", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Boy", "id": "1353", "name": "Jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Women", "id": "1354", "name": "Swimwear", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1355", "name": "swimwear", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Girl", "id": "1356", "name": "Swimwear", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Boy", "id": "1357", "name": "Swimwear", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Women", "id": "1358", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1359", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Girl", "id": "1360", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Boy", "id": "1361", "name": "gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "UnisexAdult", "id": "1362", "name": "Socks", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "UnisexKid", "id": "1363", "name": "Socks", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "UnisexAdult", "id": "1364", "name": "hats", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "UnisexKid", "id": "1365", "name": "Hats", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexAdult", "id": "1366", "name": "Belts", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexKid", "id": "1367", "name": "Belts", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "4", "name": "Accessories" }, "deletedOn": null, "gender": "none", "id": "1368", "name": "umbrellas", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "4", "name": "Accessories" }, "deletedOn": null, "gender": "none", "id": "1369", "name": "Pillows", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "9", "name": "Other" }, "deletedOn": null, "gender": "none", "id": "1370", "name": "Towels", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "9", "name": "Other" }, "deletedOn": null, "gender": "none", "id": "1371", "name": "Toys", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "10", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1372", "name": "Soap", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "10", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1373", "name": "Deodorant", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1374", "name": "Food", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "13", "name": "Equipment" }, "deletedOn": null, "gender": "none", "id": "1375", "name": "tents", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "13", "name": "Equipment" }, "deletedOn": null, "gender": "none", "id": "1376", "name": "Candles", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "15", "name": "Medication" }, "deletedOn": null, "gender": "none", "id": "1377", "name": "Inhalation device", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "8", "name": "Baby" }, "deletedOn": null, "gender": "UnisexBaby", "id": "1378", "name": "shirts", "sizeRange": { "__typename": "SizeRange", "id": "22", "label": "Baby by month (0-6, 7-24)", "sizes": [{ "__typename": "Size", "id": "138", "label": "0-6 months" }, { "__typename": "Size", "id": "139", "label": "7-24 months" }, { "__typename": "Size", "id": "218", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "8", "name": "Baby" }, "deletedOn": null, "gender": "UnisexBaby", "id": "1379", "name": "jackets", "sizeRange": { "__typename": "SizeRange", "id": "22", "label": "Baby by month (0-6, 7-24)", "sizes": [{ "__typename": "Size", "id": "138", "label": "0-6 months" }, { "__typename": "Size", "id": "139", "label": "7-24 months" }, { "__typename": "Size", "id": "218", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "8", "name": "Baby" }, "deletedOn": null, "gender": "UnisexBaby", "id": "1380", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "22", "label": "Baby by month (0-6, 7-24)", "sizes": [{ "__typename": "Size", "id": "138", "label": "0-6 months" }, { "__typename": "Size", "id": "139", "label": "7-24 months" }, { "__typename": "Size", "id": "218", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "Women", "id": "1381", "name": "shoes", "sizeRange": { "__typename": "SizeRange", "id": "3", "label": "Shoe sizes Female", "sizes": [{ "__typename": "Size", "id": "28", "label": "34" }, { "__typename": "Size", "id": "29", "label": "35" }, { "__typename": "Size", "id": "30", "label": "36" }, { "__typename": "Size", "id": "31", "label": "37" }, { "__typename": "Size", "id": "32", "label": "38" }, { "__typename": "Size", "id": "33", "label": "39" }, { "__typename": "Size", "id": "34", "label": "40" }, { "__typename": "Size", "id": "35", "label": "41" }, { "__typename": "Size", "id": "36", "label": "42 and bigger" }, { "__typename": "Size", "id": "205", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "Men", "id": "1382", "name": "Shoes", "sizeRange": { "__typename": "SizeRange", "id": "8", "label": "Shoe sizes Male", "sizes": [{ "__typename": "Size", "id": "56", "label": "38 and smaller" }, { "__typename": "Size", "id": "57", "label": "39" }, { "__typename": "Size", "id": "58", "label": "40" }, { "__typename": "Size", "id": "59", "label": "41" }, { "__typename": "Size", "id": "60", "label": "42" }, { "__typename": "Size", "id": "61", "label": "43" }, { "__typename": "Size", "id": "62", "label": "44" }, { "__typename": "Size", "id": "63", "label": "45" }, { "__typename": "Size", "id": "64", "label": "46 and bigger" }, { "__typename": "Size", "id": "208", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "UnisexKid", "id": "1383", "name": "Shoes", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "6", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Women", "id": "1385", "name": "Winter Jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "6", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Boy", "id": "1386", "name": "Winter Jackets", "sizeRange": { "__typename": "SizeRange", "id": "18", "label": "Children by year (6-10, 11-15)", "sizes": [{ "__typename": "Size", "id": "124", "label": "6-10 years" }, { "__typename": "Size", "id": "125", "label": "11-15 years" }, { "__typename": "Size", "id": "214", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "6", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Men", "id": "1387", "name": "Summer Jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Girl", "id": "1388", "name": "Shorts", "sizeRange": { "__typename": "SizeRange", "id": "18", "label": "Children by year (6-10, 11-15)", "sizes": [{ "__typename": "Size", "id": "124", "label": "6-10 years" }, { "__typename": "Size", "id": "125", "label": "11-15 years" }, { "__typename": "Size", "id": "214", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "20", "name": "Shelter" }, "deletedOn": null, "gender": "none", "id": "1389", "name": "Tents", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "UnisexBaby", "id": "1390", "name": "Baby Trousers", "sizeRange": { "__typename": "SizeRange", "id": "21", "label": "Baby by month (0-2, 3-6, 7-12, 13-18, 19-24)", "sizes": [{ "__typename": "Size", "id": "44", "label": "19-24 months" }, { "__typename": "Size", "id": "45", "label": "3-6 months" }, { "__typename": "Size", "id": "47", "label": "7-12 months" }, { "__typename": "Size", "id": "48", "label": "13-18 months" }, { "__typename": "Size", "id": "69", "label": "0-2 months" }, { "__typename": "Size", "id": "97", "label": "All ages" }, { "__typename": "Size", "id": "217", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Boy", "id": "1392", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "18", "label": "Children by year (6-10, 11-15)", "sizes": [{ "__typename": "Size", "id": "124", "label": "6-10 years" }, { "__typename": "Size", "id": "125", "label": "11-15 years" }, { "__typename": "Size", "id": "214", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1393", "name": "Winter Hats", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1394", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "18", "label": "Children by year (6-10, 11-15)", "sizes": [{ "__typename": "Size", "id": "124", "label": "6-10 years" }, { "__typename": "Size", "id": "125", "label": "11-15 years" }, { "__typename": "Size", "id": "214", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1395", "name": "T-Shirts / Short Sleeves", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "Women", "id": "1396", "name": "Light Shoes", "sizeRange": { "__typename": "SizeRange", "id": "3", "label": "Shoe sizes Female", "sizes": [{ "__typename": "Size", "id": "28", "label": "34" }, { "__typename": "Size", "id": "29", "label": "35" }, { "__typename": "Size", "id": "30", "label": "36" }, { "__typename": "Size", "id": "31", "label": "37" }, { "__typename": "Size", "id": "32", "label": "38" }, { "__typename": "Size", "id": "33", "label": "39" }, { "__typename": "Size", "id": "34", "label": "40" }, { "__typename": "Size", "id": "35", "label": "41" }, { "__typename": "Size", "id": "36", "label": "42 and bigger" }, { "__typename": "Size", "id": "205", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1397", "name": "Thin Socks", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "20", "name": "Shelter" }, "deletedOn": null, "gender": "none", "id": "1398", "name": "Tarps", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "5", "name": "Shoes" }, "deletedOn": null, "gender": "Boy", "id": "1401", "name": "Light Shoes", "sizeRange": { "__typename": "SizeRange", "id": "9", "label": "Shoe sizes children", "sizes": [{ "__typename": "Size", "id": "14", "label": "20" }, { "__typename": "Size", "id": "15", "label": "21" }, { "__typename": "Size", "id": "16", "label": "22" }, { "__typename": "Size", "id": "17", "label": "23" }, { "__typename": "Size", "id": "18", "label": "24" }, { "__typename": "Size", "id": "19", "label": "25" }, { "__typename": "Size", "id": "20", "label": "26" }, { "__typename": "Size", "id": "21", "label": "27" }, { "__typename": "Size", "id": "22", "label": "28" }, { "__typename": "Size", "id": "23", "label": "29" }, { "__typename": "Size", "id": "24", "label": "30" }, { "__typename": "Size", "id": "25", "label": "31" }, { "__typename": "Size", "id": "26", "label": "32" }, { "__typename": "Size", "id": "27", "label": "33" }, { "__typename": "Size", "id": "51", "label": "19" }, { "__typename": "Size", "id": "65", "label": "35" }, { "__typename": "Size", "id": "66", "label": "36 and bigger" }, { "__typename": "Size", "id": "67", "label": "34" }, { "__typename": "Size", "id": "128", "label": "17" }, { "__typename": "Size", "id": "129", "label": "18" }, { "__typename": "Size", "id": "209", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "1", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1402", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "19", "name": "Water" }, "deletedOn": null, "gender": "none", "id": "1404", "name": "Water Storage Containers (<10L)", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Women", "id": "1405", "name": "Shorts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "3", "name": "Tops" }, "deletedOn": null, "gender": "Girl", "id": "1406", "name": "Long Sleeve Tops", "sizeRange": { "__typename": "SizeRange", "id": "18", "label": "Children by year (6-10, 11-15)", "sizes": [{ "__typename": "Size", "id": "124", "label": "6-10 years" }, { "__typename": "Size", "id": "125", "label": "11-15 years" }, { "__typename": "Size", "id": "214", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "14", "name": "Toys & Games" }, "deletedOn": null, "gender": "none", "id": "1407", "name": "Toys", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "12", "name": "Clothing" }, "deletedOn": null, "gender": "Women", "id": "1408", "name": "Thin Socks", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1409", "name": "rice", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1410", "name": "Pasta", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1411", "name": "Chickpeas", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1412", "name": "sugar", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1413", "name": "Cereal", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1414", "name": "Sauce", "sizeRange": { "__typename": "SizeRange", "id": "29", "label": "Volume", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1415", "name": "Milk", "sizeRange": { "__typename": "SizeRange", "id": "29", "label": "Volume", "sizes": [] } }, { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "11", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1416", "name": "Vegetable oil", "sizeRange": { "__typename": "SizeRange", "id": "29", "label": "Volume", "sizes": [] } }], "tags": [{ "__typename": "Tag", "color": "#c12dce", "label": "third", "value": "87" }, { "__typename": "Tag", "color": "#a9a3ed", "label": "green", "value": "88" }, { "__typename": "Tag", "color": "#8c5bef", "label": "performance", "value": "89" }, { "__typename": "Tag", "color": "#bf118d", "label": "both", "value": "90" }, { "__typename": "Tag", "color": "#0e8c6e", "label": "particular", "value": "91" }, { "__typename": "Tag", "color": "#b78424", "label": "participant", "value": "94" }, { "__typename": "Tag", "color": "#ed538e", "label": "collection", "value": "96" }, { "__typename": "Tag", "color": "#3f2a99", "label": "letter", "value": "100" }, { "__typename": "Tag", "color": "#d72fe0", "label": "everybody", "value": "101" }, { "__typename": "Tag", "color": "#d827b2", "label": "reality", "value": "102" }, { "__typename": "Tag", "color": "#60f29b", "label": "especially", "value": "103" }] }, "box": { "__typename": "Box", "comment": "Pull though.", "createdOn": "2023-09-23T20:49:18+00:00", "history": [{ "__typename": "HistoryEntry", "changeDate": "2023-10-04T05:45:09+00:00", "changes": "changed comments from \"Red.\" to \"Pull though.\";", "id": "36584", "user": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" } }, { "__typename": "HistoryEntry", "changeDate": "2023-10-03T10:45:28+00:00", "changes": "changed comments from \"\" to \"Red.\";", "id": "36565", "user": { "__typename": "User", "id": "17", "name": "Dev Coordinator" } }, { "__typename": "HistoryEntry", "changeDate": "2023-09-23T20:49:18+00:00", "changes": "created record", "id": "36256", "user": { "__typename": "User", "id": "18", "name": "Dev Head of Operations" } }], "id": "100000890", "labelIdentifier": "51883709", "lastModifiedOn": "2023-10-04T05:45:09+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3", "name": "Samos" }, "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "numberOfItems": 836, "product": { "__typename": "Product", "category": { "__typename": "ProductCategory", "id": "2", "name": "Bottoms" }, "deletedOn": null, "gender": "Boy", "id": "1392", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "18", "label": "Children by year (6-10, 11-15)", "sizes": [{ "__typename": "Size", "id": "124", "label": "6-10 years" }, { "__typename": "Size", "id": "125", "label": "11-15 years" }, { "__typename": "Size", "id": "214", "label": "Mixed" }] } }, "shipmentDetail": null, "size": { "__typename": "Size", "id": "71", "label": "Mixed" }, "state": "InStock", "tags": [] } } },
+ }
+ },
+ AssignBoxesToShipment: { "data": { "updateShipmentWhenPreparing": { "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Bad.", "labelIdentifier": "01102338", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "45", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T09:47:12+00:00", "id": "45", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1290", "name": "food", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 441, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Difference fish.", "labelIdentifier": "76410383", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "46", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T10:47:11+00:00", "id": "46", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1311", "name": "Disposable Gloves", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 914, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "47243575", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000043" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "47", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T11:47:10+00:00", "id": "47", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000043", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1262", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 191, "sourceSize": { "__typename": "Size", "id": "4", "label": "XL" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Former.", "labelIdentifier": "22088938", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "48", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T12:47:09+00:00", "id": "48", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1323", "name": "Isopropryl Alcohol", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 845, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "If.", "labelIdentifier": "84046017", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "49", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T13:47:08+00:00", "id": "49", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1289", "name": "Deodorant", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 492, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "52160295", "lastModifiedOn": "2024-12-13T01:05:49+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "66", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "createdOn": "2024-12-13T01:05:49+00:00", "id": "66", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1253", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 320, "sourceSize": { "__typename": "Size", "id": "1", "label": "S" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "7", "labelIdentifier": "S007-240112-THxSA", "receivingStartedBy": null, "receivingStartedOn": null, "sentBy": null, "sentOn": null, "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-12T07:47:14+00:00", "state": "Preparing", "targetBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "transferAgreement": null } } },
+ UnassignBoxesFromShipment: { "data": { "updateShipmentWhenPreparing": { "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Bad.", "labelIdentifier": "01102338", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "45", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T09:47:12+00:00", "id": "45", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1290", "name": "food", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 441, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Difference fish.", "labelIdentifier": "76410383", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "46", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T10:47:11+00:00", "id": "46", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1311", "name": "Disposable Gloves", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 914, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "47243575", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000043" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "47", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T11:47:10+00:00", "id": "47", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000043", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1262", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 191, "sourceSize": { "__typename": "Size", "id": "4", "label": "XL" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Former.", "labelIdentifier": "22088938", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "48", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T12:47:09+00:00", "id": "48", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1323", "name": "Isopropryl Alcohol", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 845, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "If.", "labelIdentifier": "84046017", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "49", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T13:47:08+00:00", "id": "49", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1289", "name": "Deodorant", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 492, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "52160295", "lastModifiedOn": "2024-12-13T01:12:11+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "createdOn": "2024-12-13T01:05:49+00:00", "id": "66", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "17", "name": "Dev Coordinator" }, "removedOn": "2024-12-13T01:12:11+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1253", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 320, "sourceSize": { "__typename": "Size", "id": "1", "label": "S" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "7", "labelIdentifier": "S007-240112-THxSA", "receivingStartedBy": null, "receivingStartedOn": null, "sentBy": null, "sentOn": null, "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-12T07:47:14+00:00", "state": "Preparing", "targetBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "transferAgreement": null } } },
+ AllOrganisationsAndBases: { "data": { "organisations": [{ "__typename": "Organisation", "bases": [{ "__typename": "Base", "id": "1", "name": "Lesvos" }], "id": "1", "name": "BoxAid" }, { "__typename": "Organisation", "bases": [{ "__typename": "Base", "id": "2", "name": "Thessaloniki" }, { "__typename": "Base", "id": "3", "name": "Samos" }, { "__typename": "Base", "id": "4", "name": "Athens" }], "id": "2", "name": "BoxCare" }, { "__typename": "Organisation", "bases": [{ "__typename": "Base", "id": "100000000", "name": "TestBase" }], "id": "100000000", "name": "TestOrganisation" }, { "__typename": "Organisation", "bases": [{ "__typename": "Base", "id": "100000001", "name": "DummyTestBaseWithBoxes" }], "id": "100000001", "name": "DummyTestOrgWithBoxes" }] } },
+ AllBasesOfCurrentOrg: { "data": { "organisation": { "__typename": "Organisation", "bases": [{ "__typename": "Base", "id": "2", "name": "Thessaloniki" }, { "__typename": "Base", "id": "3", "name": "Samos" }, { "__typename": "Base", "id": "4", "name": "Athens" }], "id": "2", "name": "BoxCare" } } },
+ Shipments: { "data": { "shipments": [{ "__typename": "Shipment", "canceledOn": null, "completedOn": "2024-01-10T03:48:06+00:00", "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "63387082" }, "createdOn": "2024-01-09T15:48:18+00:00", "id": "1", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "90151119" }, "createdOn": "2024-01-09T16:48:17+00:00", "id": "2", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "16751747" }, "createdOn": "2024-01-09T17:48:16+00:00", "id": "3", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "13809479" }, "createdOn": "2024-01-09T18:48:15+00:00", "id": "4", "removedOn": "2024-01-10T00:48:09+00:00" }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "79739972" }, "createdOn": "2024-01-09T19:48:14+00:00", "id": "5", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "59256133" }, "createdOn": "2024-01-09T20:48:13+00:00", "id": "6", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "38216171" }, "createdOn": "2024-01-09T21:48:12+00:00", "id": "7", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "55671051" }, "createdOn": "2024-01-09T22:48:11+00:00", "id": "8", "removedOn": "2024-01-10T00:48:09+00:00" }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "41756063" }, "createdOn": "2024-01-09T23:48:10+00:00", "id": "9", "removedOn": null }], "id": "1", "labelIdentifier": "S001-240109-LExTH", "receivingStartedOn": "2024-01-10T02:48:07+00:00", "sentOn": "2024-01-10T01:48:08+00:00", "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "startedOn": "2024-01-09T13:48:20+00:00", "state": "Completed", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "canceledOn": "2024-01-10T15:47:54+00:00", "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "83200638" }, "createdOn": "2024-01-10T06:48:03+00:00", "id": "10", "removedOn": "2024-01-10T15:47:54+00:00" }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "22534938" }, "createdOn": "2024-01-10T07:48:02+00:00", "id": "11", "removedOn": "2024-01-10T15:47:54+00:00" }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "35257039" }, "createdOn": "2024-01-10T08:48:01+00:00", "id": "12", "removedOn": "2024-01-10T15:47:54+00:00" }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "40648848" }, "createdOn": "2024-01-10T09:48:00+00:00", "id": "13", "removedOn": "2024-01-10T15:47:54+00:00" }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "18007500" }, "createdOn": "2024-01-10T10:47:59+00:00", "id": "14", "removedOn": "2024-01-10T15:47:54+00:00" }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "62894875" }, "createdOn": "2024-01-10T11:47:58+00:00", "id": "15", "removedOn": "2024-01-10T15:47:54+00:00" }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "19251616" }, "createdOn": "2024-01-10T12:47:57+00:00", "id": "16", "removedOn": "2024-01-10T15:47:54+00:00" }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "94960482" }, "createdOn": "2024-01-10T13:47:56+00:00", "id": "17", "removedOn": "2024-01-10T15:47:54+00:00" }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "75418901" }, "createdOn": "2024-01-10T14:47:55+00:00", "id": "18", "removedOn": "2024-01-10T15:47:54+00:00" }], "id": "2", "labelIdentifier": "S002-240110-LExTH", "receivingStartedOn": null, "sentOn": null, "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "startedOn": "2024-01-10T04:48:05+00:00", "state": "Canceled", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "canceledOn": null, "completedOn": "2024-01-11T00:47:45+00:00", "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "53746223" }, "createdOn": "2024-01-10T18:47:51+00:00", "id": "19", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "22456803" }, "createdOn": "2024-01-10T19:47:50+00:00", "id": "20", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "67662373" }, "createdOn": "2024-01-10T20:47:49+00:00", "id": "21", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "65725764" }, "createdOn": "2024-01-10T21:47:48+00:00", "id": "22", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "47062931" }, "createdOn": "2024-01-10T22:47:47+00:00", "id": "23", "removedOn": null }], "id": "3", "labelIdentifier": "S003-240110-THxLE", "receivingStartedOn": null, "sentOn": "2024-01-10T23:47:46+00:00", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedOn": "2024-01-10T16:47:53+00:00", "state": "Lost", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "canceledOn": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "11356586" }, "createdOn": "2024-01-11T03:47:42+00:00", "id": "24", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "38826565" }, "createdOn": "2024-01-11T04:47:41+00:00", "id": "25", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "94444677" }, "createdOn": "2024-01-11T05:47:40+00:00", "id": "26", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "39527835" }, "createdOn": "2024-01-11T06:47:39+00:00", "id": "27", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "20980866" }, "createdOn": "2024-01-11T07:47:38+00:00", "id": "28", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "56194161" }, "createdOn": "2024-01-11T08:47:37+00:00", "id": "29", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "86494710" }, "createdOn": "2024-01-11T09:47:36+00:00", "id": "30", "removedOn": null }], "id": "4", "labelIdentifier": "S004-240111-THxLE", "receivingStartedOn": "2024-01-11T11:47:34+00:00", "sentOn": "2024-01-11T10:47:35+00:00", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedOn": "2024-01-11T01:47:44+00:00", "state": "Receiving", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "canceledOn": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "31185372" }, "createdOn": "2024-01-11T14:47:31+00:00", "id": "31", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "13422831" }, "createdOn": "2024-01-11T15:47:30+00:00", "id": "32", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "62155757" }, "createdOn": "2024-01-11T16:47:29+00:00", "id": "33", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "26416901" }, "createdOn": "2024-01-11T17:47:28+00:00", "id": "34", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "59166590" }, "createdOn": "2024-01-11T18:47:27+00:00", "id": "35", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "08014455" }, "createdOn": "2024-01-11T19:47:26+00:00", "id": "36", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "43790665" }, "createdOn": "2024-01-11T20:47:25+00:00", "id": "37", "removedOn": null }], "id": "5", "labelIdentifier": "S005-240111-SAxLE", "receivingStartedOn": null, "sentOn": null, "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedOn": "2024-01-11T12:47:33+00:00", "state": "Preparing", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "canceledOn": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "80234440" }, "createdOn": "2024-01-11T23:47:22+00:00", "id": "38", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "57898654" }, "createdOn": "2024-01-12T00:47:21+00:00", "id": "39", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "18990546" }, "createdOn": "2024-01-12T01:47:20+00:00", "id": "40", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "63390691" }, "createdOn": "2024-01-12T02:47:19+00:00", "id": "41", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "93868352" }, "createdOn": "2024-01-12T03:47:18+00:00", "id": "42", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "05869455" }, "createdOn": "2024-01-12T04:47:17+00:00", "id": "43", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "81612100" }, "createdOn": "2024-01-12T05:47:16+00:00", "id": "44", "removedOn": null }], "id": "6", "labelIdentifier": "S006-240111-SAxLE", "receivingStartedOn": null, "sentOn": "2024-01-12T06:47:15+00:00", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedOn": "2024-01-11T21:47:24+00:00", "state": "Sent", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } } }, { "__typename": "Shipment", "canceledOn": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "01102338" }, "createdOn": "2024-01-12T09:47:12+00:00", "id": "45", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "76410383" }, "createdOn": "2024-01-12T10:47:11+00:00", "id": "46", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "47243575" }, "createdOn": "2024-01-12T11:47:10+00:00", "id": "47", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "22088938" }, "createdOn": "2024-01-12T12:47:09+00:00", "id": "48", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "84046017" }, "createdOn": "2024-01-12T13:47:08+00:00", "id": "49", "removedOn": null }], "id": "7", "labelIdentifier": "S007-240112-THxSA", "receivingStartedOn": null, "sentOn": null, "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedOn": "2024-01-12T07:47:14+00:00", "state": "Preparing", "targetBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "canceledOn": "2024-01-12T21:47:00+00:00", "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "52160295" }, "createdOn": "2024-01-12T16:47:05+00:00", "id": "50", "removedOn": "2024-01-12T21:47:00+00:00" }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "28504995" }, "createdOn": "2024-01-12T17:47:04+00:00", "id": "51", "removedOn": "2024-01-12T21:47:00+00:00" }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "18221084" }, "createdOn": "2024-01-12T18:47:03+00:00", "id": "52", "removedOn": "2024-01-12T21:47:00+00:00" }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "88864983" }, "createdOn": "2024-01-12T19:47:02+00:00", "id": "53", "removedOn": "2024-01-12T21:47:00+00:00" }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "66411887" }, "createdOn": "2024-01-12T20:47:01+00:00", "id": "54", "removedOn": "2024-01-12T21:47:00+00:00" }], "id": "8", "labelIdentifier": "S008-240112-THxSA", "receivingStartedOn": null, "sentOn": null, "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedOn": "2024-01-12T14:47:07+00:00", "state": "Canceled", "targetBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "canceledOn": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "83178437" }, "createdOn": "2024-01-13T00:46:57+00:00", "id": "55", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "91328775" }, "createdOn": "2024-01-13T01:46:56+00:00", "id": "56", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "67677949" }, "createdOn": "2024-01-13T02:46:55+00:00", "id": "57", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "96408065" }, "createdOn": "2024-01-13T03:46:54+00:00", "id": "58", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "49161856" }, "createdOn": "2024-01-13T04:46:53+00:00", "id": "59", "removedOn": null }], "id": "9", "labelIdentifier": "S009-240112-SAxAT", "receivingStartedOn": null, "sentOn": "2024-01-13T05:46:52+00:00", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedOn": "2024-01-12T22:46:59+00:00", "state": "Sent", "targetBase": { "__typename": "Base", "id": "4", "name": "Athens", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }, { "__typename": "Shipment", "canceledOn": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "59986347" }, "createdOn": "2024-01-13T08:46:49+00:00", "id": "60", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "47790512" }, "createdOn": "2024-01-13T09:46:48+00:00", "id": "61", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "83731660" }, "createdOn": "2024-01-13T10:46:47+00:00", "id": "62", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "30027051" }, "createdOn": "2024-01-13T11:46:46+00:00", "id": "63", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "11435613" }, "createdOn": "2024-01-13T12:46:45+00:00", "id": "64", "removedOn": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "labelIdentifier": "18645528" }, "createdOn": "2024-01-13T13:46:44+00:00", "id": "65", "removedOn": null }], "id": "10", "labelIdentifier": "S010-240113-ATxTH", "receivingStartedOn": "2024-01-13T15:46:42+00:00", "sentOn": "2024-01-13T14:46:43+00:00", "sourceBase": { "__typename": "Base", "id": "4", "name": "Athens", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedOn": "2024-01-13T06:46:51+00:00", "state": "Receiving", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } } }] } },
+ ShipmentById: {
+ "1": { "data": { "shipment": { "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "completedOn": "2024-01-10T03:48:06+00:00", "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "63387082", "lastModifiedOn": "2024-01-10T02:48:07+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T15:48:18+00:00", "id": "1", "lostBy": null, "lostOn": null, "receivedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivedOn": "2024-01-10T03:48:06+00:00", "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000036", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1191", "name": "gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 565, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1275", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "targetQuantity": 565, "targetSize": { "__typename": "Size", "id": "52", "label": "Mixed" } }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "90151119", "lastModifiedOn": "2024-01-10T03:48:06+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "NotDelivered" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T16:48:17+00:00", "id": "2", "lostBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lostOn": "2024-01-10T03:48:06+00:00", "receivedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivedOn": "2024-01-10T03:48:06+00:00", "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000036", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Bottoms" }, "deletedOn": null, "gender": "Boy", "id": "1177", "name": "trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 921, "sourceSize": { "__typename": "Size", "id": "3", "label": "L" }, "targetProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Bottoms" }, "deletedOn": null, "gender": "Boy", "id": "1261", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "targetQuantity": 921, "targetSize": { "__typename": "Size", "id": "3", "label": "L" } }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "16751747", "lastModifiedOn": "2024-01-10T02:48:07+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T17:48:16+00:00", "id": "3", "lostBy": null, "lostOn": null, "receivedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivedOn": "2024-01-10T03:48:06+00:00", "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000037", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Baby" }, "deletedOn": null, "gender": "UnisexBaby", "id": "1240", "name": "Baby Bibs", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 745, "sourceSize": { "__typename": "Size", "id": "111", "label": "Size 3 (7-13 kg)" }, "targetProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Men", "id": "1267", "name": "jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "targetQuantity": 745, "targetSize": { "__typename": "Size", "id": "111", "label": "Size 3 (7-13 kg)" } }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Region imagine.", "labelIdentifier": "13809479", "lastModifiedOn": "2024-01-10T00:48:09+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T18:48:15+00:00", "id": "4", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T00:48:09+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000037", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexKid", "id": "1222", "name": "Scarves", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 153, "sourceSize": { "__typename": "Size", "id": "44", "label": "19-24 months" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "79739972", "lastModifiedOn": "2024-01-10T02:48:07+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000043" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T19:48:14+00:00", "id": "5", "lostBy": null, "lostOn": null, "receivedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivedOn": "2024-01-10T03:48:06+00:00", "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000037", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Equipment" }, "deletedOn": null, "gender": "none", "id": "1207", "name": "Tents", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 822, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Equipment" }, "deletedOn": null, "gender": "none", "id": "1291", "name": "tents", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "targetQuantity": 822, "targetSize": { "__typename": "Size", "id": "68", "label": "One size" } }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "59256133", "lastModifiedOn": "2024-01-10T03:48:06+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "NotDelivered" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T20:48:13+00:00", "id": "6", "lostBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lostOn": "2024-01-10T03:48:06+00:00", "receivedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivedOn": "2024-01-10T03:48:06+00:00", "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000037", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexKid", "id": "1199", "name": "Belts", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 454, "sourceSize": { "__typename": "Size", "id": "118", "label": "11-15 years" }, "targetProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexKid", "id": "1283", "name": "belts", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "targetQuantity": 454, "targetSize": { "__typename": "Size", "id": "118", "label": "11-15 years" } }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "38216171", "lastModifiedOn": "2024-01-10T02:48:07+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T21:48:12+00:00", "id": "7", "lostBy": null, "lostOn": null, "receivedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivedOn": "2024-01-10T03:48:06+00:00", "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000038", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1235", "name": "Dry Food", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 277, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Accessories" }, "deletedOn": null, "gender": "none", "id": "1285", "name": "Pillows", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "targetQuantity": 277, "targetSize": { "__typename": "Size", "id": "52", "label": "Mixed" } }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "55671051", "lastModifiedOn": "2024-01-10T00:48:09+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T22:48:11+00:00", "id": "8", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T00:48:09+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000038", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Women", "id": "1190", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 154, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "41756063", "lastModifiedOn": "2024-01-10T03:48:06+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "NotDelivered" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-09T23:48:10+00:00", "id": "9", "lostBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lostOn": "2024-01-10T03:48:06+00:00", "receivedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivedOn": "2024-01-10T03:48:06+00:00", "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000038", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shoes" }, "deletedOn": null, "gender": "Girl", "id": "1216", "name": "Light Shoes", "sizeRange": { "__typename": "SizeRange", "id": "9", "label": "Shoe sizes children", "sizes": [{ "__typename": "Size", "id": "14", "label": "20" }, { "__typename": "Size", "id": "15", "label": "21" }, { "__typename": "Size", "id": "16", "label": "22" }, { "__typename": "Size", "id": "17", "label": "23" }, { "__typename": "Size", "id": "18", "label": "24" }, { "__typename": "Size", "id": "19", "label": "25" }, { "__typename": "Size", "id": "20", "label": "26" }, { "__typename": "Size", "id": "21", "label": "27" }, { "__typename": "Size", "id": "22", "label": "28" }, { "__typename": "Size", "id": "23", "label": "29" }, { "__typename": "Size", "id": "24", "label": "30" }, { "__typename": "Size", "id": "25", "label": "31" }, { "__typename": "Size", "id": "26", "label": "32" }, { "__typename": "Size", "id": "27", "label": "33" }, { "__typename": "Size", "id": "51", "label": "19" }, { "__typename": "Size", "id": "65", "label": "35" }, { "__typename": "Size", "id": "66", "label": "36 and bigger" }, { "__typename": "Size", "id": "67", "label": "34" }, { "__typename": "Size", "id": "128", "label": "17" }, { "__typename": "Size", "id": "129", "label": "18" }, { "__typename": "Size", "id": "209", "label": "Mixed" }] } }, "sourceQuantity": 517, "sourceSize": { "__typename": "Size", "id": "14", "label": "20" }, "targetProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1262", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "targetQuantity": 517, "targetSize": { "__typename": "Size", "id": "14", "label": "20" } }], "id": "1", "labelIdentifier": "S001-240109-LExTH", "receivingStartedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivingStartedOn": "2024-01-10T02:48:07+00:00", "sentBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "sentOn": "2024-01-10T01:48:08+00:00", "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "startedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "startedOn": "2024-01-09T13:48:20+00:00", "state": "Completed", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "transferAgreement": { "__typename": "TransferAgreement", "comment": null, "id": "4", "type": "Bidirectional" } } } },
+ "2": { "data": { "shipment": { "__typename": "Shipment", "canceledBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "canceledOn": "2024-01-10T15:47:54+00:00", "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "83200638", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T06:48:03+00:00", "id": "10", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000036", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexKid", "id": "1230", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 139, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "22534938", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T07:48:02+00:00", "id": "11", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000036", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Girl", "id": "1180", "name": "t-shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 822, "sourceSize": { "__typename": "Size", "id": "3", "label": "L" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "35257039", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T08:48:01+00:00", "id": "12", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000036", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1206", "name": "Food", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 79, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "40648848", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T09:48:00+00:00", "id": "13", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000036", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1244", "name": "sugar", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, "sourceQuantity": 833, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "18007500", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T10:47:59+00:00", "id": "14", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000037", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1167", "name": "underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 904, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Break individual.", "labelIdentifier": "62894875", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T11:47:58+00:00", "id": "15", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000038", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Girl", "id": "1188", "name": "Swimwear", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 342, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "19251616", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T12:47:57+00:00", "id": "16", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000038", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1245", "name": "Cereal", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, "sourceQuantity": 143, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Leg similar.", "labelIdentifier": "94960482", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T13:47:56+00:00", "id": "17", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000038", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "UnisexKid", "id": "1197", "name": "Hats", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 443, "sourceSize": { "__typename": "Size", "id": "124", "label": "6-10 years" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "75418901", "lastModifiedOn": "2024-01-10T15:47:54+00:00", "location": null, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "createdOn": "2024-01-10T14:47:55+00:00", "id": "18", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "removedOn": "2024-01-10T15:47:54+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000038", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Other" }, "deletedOn": null, "gender": "none", "id": "1203", "name": "toys", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 344, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "2", "labelIdentifier": "S002-240110-LExTH", "receivingStartedBy": null, "receivingStartedOn": null, "sentBy": null, "sentOn": null, "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "startedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "startedOn": "2024-01-10T04:48:05+00:00", "state": "Canceled", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "transferAgreement": { "__typename": "TransferAgreement", "comment": null, "id": "4", "type": "Bidirectional" } } } },
+ "3": { "data": { "shipment": { "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "completedOn": "2024-01-11T00:47:45+00:00", "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "53746223", "lastModifiedOn": "2024-01-11T00:47:45+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "NotDelivered" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-10T18:47:51+00:00", "id": "19", "lostBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lostOn": "2024-01-11T00:47:45+00:00", "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1314", "name": "Combs, Hair Ties, Brushes", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 118, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "22456803", "lastModifiedOn": "2024-01-11T00:47:45+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "NotDelivered" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-10T19:47:50+00:00", "id": "20", "lostBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lostOn": "2024-01-11T00:47:45+00:00", "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Jackets / Outerwear" }, "deletedOn": null, "gender": "Girl", "id": "1268", "name": "Jackets", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 989, "sourceSize": { "__typename": "Size", "id": "203", "label": "XXL" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "67662373", "lastModifiedOn": "2024-01-11T00:47:45+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "NotDelivered" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-10T20:47:49+00:00", "id": "21", "lostBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lostOn": "2024-01-11T00:47:45+00:00", "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1331", "name": "milk", "sizeRange": { "__typename": "SizeRange", "id": "29", "label": "Volume", "sizes": [] } }, "sourceQuantity": 312, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Book citizen big.", "labelIdentifier": "65725764", "lastModifiedOn": "2024-01-11T00:47:45+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000043" }, "shipmentDetail": null, "state": "NotDelivered" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-10T21:47:48+00:00", "id": "22", "lostBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lostOn": "2024-01-11T00:47:45+00:00", "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000043", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1253", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 809, "sourceSize": { "__typename": "Size", "id": "124", "label": "6-10 years" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "47062931", "lastModifiedOn": "2024-01-11T00:47:45+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": null, "state": "NotDelivered" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-10T22:47:47+00:00", "id": "23", "lostBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "lostOn": "2024-01-11T00:47:45+00:00", "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1251", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 458, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "3", "labelIdentifier": "S003-240110-THxLE", "receivingStartedBy": null, "receivingStartedOn": null, "sentBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "sentOn": "2024-01-10T23:47:46+00:00", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-10T16:47:53+00:00", "state": "Lost", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "transferAgreement": { "__typename": "TransferAgreement", "comment": null, "id": "4", "type": "Bidirectional" } } } },
+ "4": { "data": { "shipment": { "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "11356586", "lastModifiedOn": "2024-01-11T11:47:34+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "24", "shipment": { "__typename": "Shipment", "id": "4" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T03:47:42+00:00", "id": "24", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1329", "name": "Cereal", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, "sourceQuantity": 329, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Summer play.", "labelIdentifier": "38826565", "lastModifiedOn": "2024-01-11T11:47:34+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "25", "shipment": { "__typename": "Shipment", "id": "4" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T04:47:41+00:00", "id": "25", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shoes" }, "deletedOn": null, "gender": "Boy", "id": "1321", "name": "Practical Shoes", "sizeRange": { "__typename": "SizeRange", "id": "9", "label": "Shoe sizes children", "sizes": [{ "__typename": "Size", "id": "14", "label": "20" }, { "__typename": "Size", "id": "15", "label": "21" }, { "__typename": "Size", "id": "16", "label": "22" }, { "__typename": "Size", "id": "17", "label": "23" }, { "__typename": "Size", "id": "18", "label": "24" }, { "__typename": "Size", "id": "19", "label": "25" }, { "__typename": "Size", "id": "20", "label": "26" }, { "__typename": "Size", "id": "21", "label": "27" }, { "__typename": "Size", "id": "22", "label": "28" }, { "__typename": "Size", "id": "23", "label": "29" }, { "__typename": "Size", "id": "24", "label": "30" }, { "__typename": "Size", "id": "25", "label": "31" }, { "__typename": "Size", "id": "26", "label": "32" }, { "__typename": "Size", "id": "27", "label": "33" }, { "__typename": "Size", "id": "51", "label": "19" }, { "__typename": "Size", "id": "65", "label": "35" }, { "__typename": "Size", "id": "66", "label": "36 and bigger" }, { "__typename": "Size", "id": "67", "label": "34" }, { "__typename": "Size", "id": "128", "label": "17" }, { "__typename": "Size", "id": "129", "label": "18" }, { "__typename": "Size", "id": "209", "label": "Mixed" }] } }, "sourceQuantity": 819, "sourceSize": { "__typename": "Size", "id": "17", "label": "23" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Oil party.", "labelIdentifier": "94444677", "lastModifiedOn": "2024-01-11T11:47:34+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "26", "shipment": { "__typename": "Shipment", "id": "4" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T05:47:40+00:00", "id": "26", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Bottoms" }, "deletedOn": null, "gender": "Girl", "id": "1260", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 534, "sourceSize": { "__typename": "Size", "id": "5", "label": "XS" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "39527835", "lastModifiedOn": "2024-01-11T11:47:34+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000043" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "27", "shipment": { "__typename": "Shipment", "id": "4" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T06:47:39+00:00", "id": "27", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000043", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1331", "name": "milk", "sizeRange": { "__typename": "SizeRange", "id": "29", "label": "Volume", "sizes": [] } }, "sourceQuantity": 627, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Other wife.", "labelIdentifier": "20980866", "lastModifiedOn": "2024-01-11T11:47:34+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000043" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "28", "shipment": { "__typename": "Shipment", "id": "4" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T07:47:38+00:00", "id": "28", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000043", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shoes" }, "deletedOn": null, "gender": "Women", "id": "1297", "name": "Shoes", "sizeRange": { "__typename": "SizeRange", "id": "3", "label": "Shoe sizes Female", "sizes": [{ "__typename": "Size", "id": "28", "label": "34" }, { "__typename": "Size", "id": "29", "label": "35" }, { "__typename": "Size", "id": "30", "label": "36" }, { "__typename": "Size", "id": "31", "label": "37" }, { "__typename": "Size", "id": "32", "label": "38" }, { "__typename": "Size", "id": "33", "label": "39" }, { "__typename": "Size", "id": "34", "label": "40" }, { "__typename": "Size", "id": "35", "label": "41" }, { "__typename": "Size", "id": "36", "label": "42 and bigger" }, { "__typename": "Size", "id": "205", "label": "Mixed" }] } }, "sourceQuantity": 964, "sourceSize": { "__typename": "Size", "id": "17", "label": "23" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Claim.", "labelIdentifier": "56194161", "lastModifiedOn": "2024-01-11T11:47:34+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "29", "shipment": { "__typename": "Shipment", "id": "4" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T08:47:37+00:00", "id": "29", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Equipment" }, "deletedOn": null, "gender": "none", "id": "1291", "name": "tents", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 732, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Face.", "labelIdentifier": "86494710", "lastModifiedOn": "2024-01-11T11:47:34+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "30", "shipment": { "__typename": "Shipment", "id": "4" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T09:47:36+00:00", "id": "30", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1271", "name": "Swimwear", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 783, "sourceSize": { "__typename": "Size", "id": "44", "label": "19-24 months" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "4", "labelIdentifier": "S004-240111-THxLE", "receivingStartedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivingStartedOn": "2024-01-11T11:47:34+00:00", "sentBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "sentOn": "2024-01-11T10:47:35+00:00", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-11T01:47:44+00:00", "state": "Receiving", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "transferAgreement": { "__typename": "TransferAgreement", "comment": null, "id": "4", "type": "Bidirectional" } } } },
+ "5": { "data": { "shipment": { "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "31185372", "lastModifiedOn": "2024-01-11T13:47:32+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000049" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "31", "shipment": { "__typename": "Shipment", "id": "5" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T14:47:31+00:00", "id": "31", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shelter" }, "deletedOn": null, "gender": "none", "id": "1398", "name": "Tarps", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 818, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "13422831", "lastModifiedOn": "2024-01-11T13:47:32+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000049" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "32", "shipment": { "__typename": "Shipment", "id": "5" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T15:47:30+00:00", "id": "32", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1337", "name": "underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 89, "sourceSize": { "__typename": "Size", "id": "3", "label": "L" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Establish determine.", "labelIdentifier": "62155757", "lastModifiedOn": "2024-01-11T13:47:32+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000049" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "33", "shipment": { "__typename": "Shipment", "id": "5" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T16:47:29+00:00", "id": "33", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1412", "name": "sugar", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, "sourceQuantity": 271, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "A.", "labelIdentifier": "26416901", "lastModifiedOn": "2024-01-11T13:47:32+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000049" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "34", "shipment": { "__typename": "Shipment", "id": "5" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T17:47:28+00:00", "id": "34", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1402", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 320, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Family.", "labelIdentifier": "59166590", "lastModifiedOn": "2024-01-11T13:47:32+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "35", "shipment": { "__typename": "Shipment", "id": "5" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T18:47:27+00:00", "id": "35", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1395", "name": "T-Shirts / Short Sleeves", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 880, "sourceSize": { "__typename": "Size", "id": "3", "label": "L" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Film.", "labelIdentifier": "08014455", "lastModifiedOn": "2024-01-11T13:47:32+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "36", "shipment": { "__typename": "Shipment", "id": "5" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T19:47:26+00:00", "id": "36", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shelter" }, "deletedOn": null, "gender": "none", "id": "1398", "name": "Tarps", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 756, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "43790665", "lastModifiedOn": "2024-01-11T13:47:32+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "37", "shipment": { "__typename": "Shipment", "id": "5" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T20:47:25+00:00", "id": "37", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Women", "id": "1338", "name": "tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 75, "sourceSize": { "__typename": "Size", "id": "1", "label": "S" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "5", "labelIdentifier": "S005-240111-SAxLE", "receivingStartedBy": null, "receivingStartedOn": null, "sentBy": null, "sentOn": null, "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-11T12:47:33+00:00", "state": "Preparing", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "transferAgreement": { "__typename": "TransferAgreement", "comment": null, "id": "4", "type": "Bidirectional" } } } },
+ "6": { "data": { "shipment": { "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Thing world.", "labelIdentifier": "80234440", "lastModifiedOn": "2024-01-12T06:47:15+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000048" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "38", "shipment": { "__typename": "Shipment", "id": "6" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-11T23:47:22+00:00", "id": "38", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000048", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shoes" }, "deletedOn": null, "gender": "UnisexKid", "id": "1383", "name": "Shoes", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 57, "sourceSize": { "__typename": "Size", "id": "128", "label": "17" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Way must season.", "labelIdentifier": "57898654", "lastModifiedOn": "2024-01-12T06:47:15+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000049" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "39", "shipment": { "__typename": "Shipment", "id": "6" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T00:47:21+00:00", "id": "39", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Medication" }, "deletedOn": null, "gender": "none", "id": "1377", "name": "Inhalation device", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 20, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "18990546", "lastModifiedOn": "2024-01-12T06:47:15+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000049" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "40", "shipment": { "__typename": "Shipment", "id": "6" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T01:47:20+00:00", "id": "40", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1395", "name": "T-Shirts / Short Sleeves", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 690, "sourceSize": { "__typename": "Size", "id": "1", "label": "S" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Feeling off.", "labelIdentifier": "63390691", "lastModifiedOn": "2024-01-12T06:47:15+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000049" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "41", "shipment": { "__typename": "Shipment", "id": "6" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T02:47:19+00:00", "id": "41", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1402", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 817, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Interesting enjoy.", "labelIdentifier": "93868352", "lastModifiedOn": "2024-01-12T06:47:15+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "42", "shipment": { "__typename": "Shipment", "id": "6" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T03:47:18+00:00", "id": "42", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Men", "id": "1359", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 991, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "05869455", "lastModifiedOn": "2024-01-12T06:47:15+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "43", "shipment": { "__typename": "Shipment", "id": "6" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T04:47:17+00:00", "id": "43", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1411", "name": "Chickpeas", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, "sourceQuantity": 710, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Beautiful federal.", "labelIdentifier": "81612100", "lastModifiedOn": "2024-01-12T06:47:15+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "44", "shipment": { "__typename": "Shipment", "id": "6" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T05:47:16+00:00", "id": "44", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1341", "name": "Tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 320, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "6", "labelIdentifier": "S006-240111-SAxLE", "receivingStartedBy": null, "receivingStartedOn": null, "sentBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "sentOn": "2024-01-12T06:47:15+00:00", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-11T21:47:24+00:00", "state": "Sent", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos", "organisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" } }, "transferAgreement": { "__typename": "TransferAgreement", "comment": null, "id": "4", "type": "Bidirectional" } } } },
+ "7": { "data": { "shipment": { "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Bad.", "labelIdentifier": "01102338", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "45", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T09:47:12+00:00", "id": "45", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1290", "name": "food", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 441, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Difference fish.", "labelIdentifier": "76410383", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "46", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T10:47:11+00:00", "id": "46", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1311", "name": "Disposable Gloves", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 914, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "47243575", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000043" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "47", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T11:47:10+00:00", "id": "47", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000043", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1262", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 191, "sourceSize": { "__typename": "Size", "id": "4", "label": "XL" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Former.", "labelIdentifier": "22088938", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "48", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T12:47:09+00:00", "id": "48", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1323", "name": "Isopropryl Alcohol", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 845, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "If.", "labelIdentifier": "84046017", "lastModifiedOn": "2024-01-12T08:47:13+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "49", "shipment": { "__typename": "Shipment", "id": "7" } }, "state": "MarkedForShipment" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T13:47:08+00:00", "id": "49", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1289", "name": "Deodorant", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 492, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "7", "labelIdentifier": "S007-240112-THxSA", "receivingStartedBy": null, "receivingStartedOn": null, "sentBy": null, "sentOn": null, "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-12T07:47:14+00:00", "state": "Preparing", "targetBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "transferAgreement": null } } },
+ "8": { "data": { "shipment": { "__typename": "Shipment", "canceledBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "canceledOn": "2024-01-12T21:47:00+00:00", "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "52160295", "lastModifiedOn": "2024-01-12T21:47:00+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T16:47:05+00:00", "id": "50", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "removedOn": "2024-01-12T21:47:00+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Boy", "id": "1253", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 320, "sourceSize": { "__typename": "Size", "id": "1", "label": "S" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "28504995", "lastModifiedOn": "2024-01-12T21:47:00+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000042" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T17:47:04+00:00", "id": "51", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "removedOn": "2024-01-12T21:47:00+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000042", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Medication" }, "deletedOn": null, "gender": "none", "id": "1293", "name": "Inhalation device", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 343, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "If forward either.", "labelIdentifier": "18221084", "lastModifiedOn": "2024-01-12T21:47:00+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000043" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T18:47:03+00:00", "id": "52", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "removedOn": "2024-01-12T21:47:00+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000043", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Men", "id": "1312", "name": "Leggings", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 158, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "88864983", "lastModifiedOn": "2024-01-12T21:47:00+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T19:47:02+00:00", "id": "53", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "removedOn": "2024-01-12T21:47:00+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Bottoms" }, "deletedOn": null, "gender": "Women", "id": "1318", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 574, "sourceSize": { "__typename": "Size", "id": "48", "label": "13-18 months" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Might long.", "labelIdentifier": "66411887", "lastModifiedOn": "2024-01-12T21:47:00+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "2" }, "id": "100000044" }, "shipmentDetail": null, "state": "InStock" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-12T20:47:01+00:00", "id": "54", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "removedOn": "2024-01-12T21:47:00+00:00", "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000044", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Tops" }, "deletedOn": null, "gender": "Women", "id": "1262", "name": "T-Shirts", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 663, "sourceSize": { "__typename": "Size", "id": "3", "label": "L" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "8", "labelIdentifier": "S008-240112-THxSA", "receivingStartedBy": null, "receivingStartedOn": null, "sentBy": null, "sentOn": null, "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-12T14:47:07+00:00", "state": "Canceled", "targetBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "transferAgreement": null } } },
+ "9": { "data": { "shipment": { "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "83178437", "lastModifiedOn": "2024-01-13T05:46:52+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000048" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "55", "shipment": { "__typename": "Shipment", "id": "9" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T00:46:57+00:00", "id": "55", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000048", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Other" }, "deletedOn": null, "gender": "none", "id": "1371", "name": "Toys", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 823, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "91328775", "lastModifiedOn": "2024-01-13T05:46:52+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000049" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "56", "shipment": { "__typename": "Shipment", "id": "9" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T01:46:56+00:00", "id": "56", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000049", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "Women", "id": "1358", "name": "Gloves", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 117, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Point feeling.", "labelIdentifier": "67677949", "lastModifiedOn": "2024-01-13T05:46:52+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "57", "shipment": { "__typename": "Shipment", "id": "9" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T02:46:55+00:00", "id": "57", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1416", "name": "Vegetable oil", "sizeRange": { "__typename": "SizeRange", "id": "29", "label": "Volume", "sizes": [] } }, "sourceQuantity": 190, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "At thus.", "labelIdentifier": "96408065", "lastModifiedOn": "2024-01-13T05:46:52+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "58", "shipment": { "__typename": "Shipment", "id": "9" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T03:46:54+00:00", "id": "58", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Toys & Games" }, "deletedOn": null, "gender": "none", "id": "1407", "name": "Toys", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 94, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "49161856", "lastModifiedOn": "2024-01-13T05:46:52+00:00", "location": { "__typename": "ClassicLocation", "base": { "__typename": "Base", "id": "3" }, "id": "100000050" }, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "59", "shipment": { "__typename": "Shipment", "id": "9" } }, "state": "InTransit" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T04:46:53+00:00", "id": "59", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000050", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Clothing" }, "deletedOn": null, "gender": "UnisexKid", "id": "1367", "name": "Belts", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 382, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "9", "labelIdentifier": "S009-240112-SAxAT", "receivingStartedBy": null, "receivingStartedOn": null, "sentBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "sentOn": "2024-01-13T05:46:52+00:00", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-12T22:46:59+00:00", "state": "Sent", "targetBase": { "__typename": "Base", "id": "4", "name": "Athens", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "transferAgreement": null } } },
+ "10": { "data": { "shipment": { "__typename": "Shipment", "canceledBy": null, "canceledOn": null, "completedBy": null, "completedOn": null, "details": [{ "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "59986347", "lastModifiedOn": "2024-01-13T15:46:42+00:00", "location": null, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "60", "shipment": { "__typename": "Shipment", "id": "10" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T08:46:49+00:00", "id": "60", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000054", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Hygiene" }, "deletedOn": null, "gender": "none", "id": "1474", "name": "Condoms", "sizeRange": { "__typename": "SizeRange", "id": "7", "label": "One size", "sizes": [{ "__typename": "Size", "id": "68", "label": "One size" }, { "__typename": "Size", "id": "207", "label": "Mixed" }] } }, "sourceQuantity": 420, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "", "labelIdentifier": "47790512", "lastModifiedOn": "2024-01-13T15:46:42+00:00", "location": null, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "61", "shipment": { "__typename": "Shipment", "id": "10" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T09:46:48+00:00", "id": "61", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000054", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Women", "id": "1418", "name": "Underwear", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 540, "sourceSize": { "__typename": "Size", "id": "52", "label": "Mixed" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Prepare police.", "labelIdentifier": "83731660", "lastModifiedOn": "2024-01-13T15:46:42+00:00", "location": null, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "62", "shipment": { "__typename": "Shipment", "id": "10" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T10:46:47+00:00", "id": "62", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000054", "name": "Stockroom" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Shoes" }, "deletedOn": null, "gender": "Girl", "id": "1486", "name": "Practical Shoes", "sizeRange": { "__typename": "SizeRange", "id": "9", "label": "Shoe sizes children", "sizes": [{ "__typename": "Size", "id": "14", "label": "20" }, { "__typename": "Size", "id": "15", "label": "21" }, { "__typename": "Size", "id": "16", "label": "22" }, { "__typename": "Size", "id": "17", "label": "23" }, { "__typename": "Size", "id": "18", "label": "24" }, { "__typename": "Size", "id": "19", "label": "25" }, { "__typename": "Size", "id": "20", "label": "26" }, { "__typename": "Size", "id": "21", "label": "27" }, { "__typename": "Size", "id": "22", "label": "28" }, { "__typename": "Size", "id": "23", "label": "29" }, { "__typename": "Size", "id": "24", "label": "30" }, { "__typename": "Size", "id": "25", "label": "31" }, { "__typename": "Size", "id": "26", "label": "32" }, { "__typename": "Size", "id": "27", "label": "33" }, { "__typename": "Size", "id": "51", "label": "19" }, { "__typename": "Size", "id": "65", "label": "35" }, { "__typename": "Size", "id": "66", "label": "36 and bigger" }, { "__typename": "Size", "id": "67", "label": "34" }, { "__typename": "Size", "id": "128", "label": "17" }, { "__typename": "Size", "id": "129", "label": "18" }, { "__typename": "Size", "id": "209", "label": "Mixed" }] } }, "sourceQuantity": 381, "sourceSize": { "__typename": "Size", "id": "32", "label": "38" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Project.", "labelIdentifier": "30027051", "lastModifiedOn": "2024-01-13T15:46:42+00:00", "location": null, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "63", "shipment": { "__typename": "Shipment", "id": "10" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T11:46:46+00:00", "id": "63", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000055", "name": "WH" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Bottoms" }, "deletedOn": null, "gender": "Boy", "id": "1429", "name": "Trousers", "sizeRange": { "__typename": "SizeRange", "id": "1", "label": "XS, S, M, L, XL, XXL", "sizes": [{ "__typename": "Size", "id": "1", "label": "S" }, { "__typename": "Size", "id": "2", "label": "M" }, { "__typename": "Size", "id": "3", "label": "L" }, { "__typename": "Size", "id": "4", "label": "XL" }, { "__typename": "Size", "id": "5", "label": "XS" }, { "__typename": "Size", "id": "71", "label": "Mixed" }, { "__typename": "Size", "id": "203", "label": "XXL" }] } }, "sourceQuantity": 423, "sourceSize": { "__typename": "Size", "id": "1", "label": "S" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Today.", "labelIdentifier": "11435613", "lastModifiedOn": "2024-01-13T15:46:42+00:00", "location": null, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "64", "shipment": { "__typename": "Shipment", "id": "10" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T12:46:45+00:00", "id": "64", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000056", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Underwear / Nightwear" }, "deletedOn": null, "gender": "Girl", "id": "1424", "name": "Tights", "sizeRange": { "__typename": "SizeRange", "id": "6", "label": "Mixed sizes", "sizes": [{ "__typename": "Size", "id": "52", "label": "Mixed" }] } }, "sourceQuantity": 594, "sourceSize": { "__typename": "Size", "id": "68", "label": "One size" }, "targetProduct": null, "targetQuantity": null, "targetSize": null }, { "__typename": "ShipmentDetail", "box": { "__typename": "Box", "comment": "Still.", "labelIdentifier": "18645528", "lastModifiedOn": "2024-01-13T15:46:42+00:00", "location": null, "shipmentDetail": { "__typename": "ShipmentDetail", "id": "65", "shipment": { "__typename": "Shipment", "id": "10" } }, "state": "Receiving" }, "createdBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "createdOn": "2024-01-13T13:46:44+00:00", "id": "65", "lostBy": null, "lostOn": null, "receivedBy": null, "receivedOn": null, "removedBy": null, "removedOn": null, "sourceLocation": { "__typename": "ClassicLocation", "defaultBoxState": "InStock", "id": "100000056", "name": "WH2" }, "sourceProduct": { "__typename": "Product", "category": { "__typename": "ProductCategory", "name": "Food & Kitchen" }, "deletedOn": null, "gender": "none", "id": "1497", "name": "Cereal", "sizeRange": { "__typename": "SizeRange", "id": "28", "label": "Mass", "sizes": [] } }, "sourceQuantity": 545, "sourceSize": null, "targetProduct": null, "targetQuantity": null, "targetSize": null }], "id": "10", "labelIdentifier": "S010-240113-ATxTH", "receivingStartedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "receivingStartedOn": "2024-01-13T15:46:42+00:00", "sentBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "sentOn": "2024-01-13T14:46:43+00:00", "sourceBase": { "__typename": "Base", "id": "4", "name": "Athens", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "startedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "startedOn": "2024-01-13T06:46:51+00:00", "state": "Receiving", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "transferAgreement": null } } },
+ },
+ TransferAgreements: { "data": { "transferAgreements": [{ "__typename": "TransferAgreement", "acceptedBy": null, "acceptedOn": null, "comment": null, "id": "2", "requestedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "requestedOn": "2023-06-03T13:53:06+00:00", "shipments": [], "sourceBases": [{ "__typename": "Base", "id": "1", "name": "Lesvos" }], "sourceOrganisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" }, "state": "Rejected", "targetBases": [{ "__typename": "Base", "id": "2", "name": "Thessaloniki" }, { "__typename": "Base", "id": "3", "name": "Samos" }, { "__typename": "Base", "id": "4", "name": "Athens" }], "targetOrganisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" }, "terminatedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "terminatedOn": "2023-07-23T13:52:01+00:00", "type": "Bidirectional", "validFrom": "2023-05-24T13:53:19+00:00", "validUntil": null }, { "__typename": "TransferAgreement", "acceptedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "acceptedOn": "2023-10-01T13:50:30+00:00", "comment": null, "id": "3", "requestedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "requestedOn": "2023-08-12T13:51:35+00:00", "shipments": [], "sourceBases": [{ "__typename": "Base", "id": "2", "name": "Thessaloniki" }, { "__typename": "Base", "id": "4", "name": "Athens" }], "sourceOrganisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" }, "state": "Canceled", "targetBases": [{ "__typename": "Base", "id": "1", "name": "Lesvos" }], "targetOrganisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" }, "terminatedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "terminatedOn": "2023-10-11T13:50:17+00:00", "type": "Bidirectional", "validFrom": "2023-08-02T13:51:48+00:00", "validUntil": null }, { "__typename": "TransferAgreement", "acceptedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "acceptedOn": "2023-12-20T13:48:46+00:00", "comment": null, "id": "4", "requestedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "requestedOn": "2023-10-31T13:49:51+00:00", "shipments": [{ "__typename": "Shipment", "id": "1", "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos" }, "state": "Completed", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki" } }, { "__typename": "Shipment", "id": "2", "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos" }, "state": "Canceled", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki" } }, { "__typename": "Shipment", "id": "3", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki" }, "state": "Lost", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos" } }, { "__typename": "Shipment", "id": "4", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki" }, "state": "Receiving", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos" } }, { "__typename": "Shipment", "id": "5", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos" }, "state": "Preparing", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos" } }, { "__typename": "Shipment", "id": "6", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos" }, "state": "Sent", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos" } }], "sourceBases": [{ "__typename": "Base", "id": "1", "name": "Lesvos" }], "sourceOrganisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" }, "state": "Accepted", "targetBases": [{ "__typename": "Base", "id": "2", "name": "Thessaloniki" }, { "__typename": "Base", "id": "3", "name": "Samos" }], "targetOrganisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" }, "terminatedBy": null, "terminatedOn": null, "type": "Bidirectional", "validFrom": "2023-10-21T13:50:04+00:00", "validUntil": null }, { "__typename": "TransferAgreement", "acceptedBy": null, "acceptedOn": null, "comment": null, "id": "5", "requestedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "requestedOn": "2024-01-09T13:48:20+00:00", "shipments": [], "sourceBases": [{ "__typename": "Base", "id": "2", "name": "Thessaloniki" }, { "__typename": "Base", "id": "3", "name": "Samos" }, { "__typename": "Base", "id": "4", "name": "Athens" }], "sourceOrganisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" }, "state": "UnderReview", "targetBases": [{ "__typename": "Base", "id": "1", "name": "Lesvos" }], "targetOrganisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" }, "terminatedBy": null, "terminatedOn": null, "type": "Bidirectional", "validFrom": "2023-12-30T13:48:33+00:00", "validUntil": null }] } },
+ AllAcceptedTransferAgreements: { "data": { "base": { "__typename": "Base", "id": "2", "name": "Thessaloniki", "organisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" } }, "transferAgreements": [{ "__typename": "TransferAgreement", "acceptedBy": { "__typename": "User", "id": "10", "name": "Jane Doe" }, "acceptedOn": "2023-12-20T13:48:46+00:00", "comment": null, "id": "4", "requestedBy": { "__typename": "User", "id": "2", "name": "Jane Doe" }, "requestedOn": "2023-10-31T13:49:51+00:00", "shipments": [{ "__typename": "Shipment", "id": "1", "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos" }, "state": "Completed", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki" } }, { "__typename": "Shipment", "id": "2", "sourceBase": { "__typename": "Base", "id": "1", "name": "Lesvos" }, "state": "Canceled", "targetBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki" } }, { "__typename": "Shipment", "id": "3", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki" }, "state": "Lost", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos" } }, { "__typename": "Shipment", "id": "4", "sourceBase": { "__typename": "Base", "id": "2", "name": "Thessaloniki" }, "state": "Receiving", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos" } }, { "__typename": "Shipment", "id": "5", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos" }, "state": "Preparing", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos" } }, { "__typename": "Shipment", "id": "6", "sourceBase": { "__typename": "Base", "id": "3", "name": "Samos" }, "state": "Sent", "targetBase": { "__typename": "Base", "id": "1", "name": "Lesvos" } }], "sourceBases": [{ "__typename": "Base", "id": "1", "name": "Lesvos" }], "sourceOrganisation": { "__typename": "Organisation", "id": "1", "name": "BoxAid" }, "state": "Accepted", "targetBases": [{ "__typename": "Base", "id": "2", "name": "Thessaloniki" }, { "__typename": "Base", "id": "3", "name": "Samos" }], "targetOrganisation": { "__typename": "Organisation", "id": "2", "name": "BoxCare" }, "terminatedBy": null, "terminatedOn": null, "type": "Bidirectional", "validFrom": "2023-10-21T13:50:04+00:00", "validUntil": null }] } },
+}
diff --git a/tests/mswHandlers.ts b/tests/mswHandlers.ts
new file mode 100644
index 000000000..c996ae020
--- /dev/null
+++ b/tests/mswHandlers.ts
@@ -0,0 +1,479 @@
+import { delay, graphql, GraphQLResponseResolver, HttpResponse, RequestHandlerOptions } from "msw"
+import { ResultOf, TadaDocumentNode, VariablesOf } from "gql.tada";
+import { devCoordinator } from "./fixtures";
+
+import { worker } from "../front/browser"
+import { ORGANISATION_AND_BASES_QUERY, BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY, GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE, CHECK_IF_QR_EXISTS_IN_DB, MULTI_BOX_ACTION_OPTIONS_FOR_LOCATIONS_TAGS_AND_SHIPMENTS_QUERY, ALL_SHIPMENTS_QUERY } from "../front/src/queries/queries"
+import { BOXES_FOR_BOXESVIEW_QUERY, ACTION_OPTIONS_FOR_BOXESVIEW_QUERY } from "../front/src/views/Boxes/BoxesView"
+import { UPDATE_BOX_MUTATION, UPDATE_NUMBER_OF_ITEMS_IN_BOX_MUTATION, UPDATE_STATE_IN_BOX_MUTATION } from "../front/src/views/Box/BoxView"
+import { BOX_BY_LABEL_IDENTIFIER_AND_ALL_PRODUCTS_WITH_BASEID_QUERY, UPDATE_CONTENT_OF_BOX_MUTATION } from "../front/src/views/BoxEdit/BoxEditView";
+import { ALL_ORGS_AND_BASES_QUERY } from "../front/src/views/Transfers/CreateTransferAgreement/CreateTransferAgreementView";
+import { ASSIGN_BOXES_TO_SHIPMENT, UNASSIGN_BOX_FROM_SHIPMENT } from "../front/src/hooks/useAssignBoxesToShipment";
+import { ALL_PRODUCTS_AND_LOCATIONS_FOR_BASE_QUERY, CREATE_BOX_MUTATION } from "../front/src/views/BoxCreate/BoxCreateView";
+import { SHIPMENT_BY_ID_QUERY } from "../front/src/views/Transfers/ShipmentView/ShipmentView";
+import { ALL_TRANSFER_AGREEMENTS_QUERY } from "../front/src/views/Transfers/TransferAgreementOverview/TransferAgreementOverviewView";
+import { ALL_ACCEPTED_TRANSFER_AGREEMENTS_QUERY, ALL_BASES_OF_CURRENT_ORG_QUERY, CREATE_SHIPMENT_MUTATION } from "../front/src/views/Transfers/CreateShipment/CreateShipmentView";
+import { CREATED_BOXES_QUERY } from "../shared-components/statviz/components/visualizations/createdBoxes/CreatedBoxesDataContainer";
+import { MOVED_BOXES_QUERY } from "../shared-components/statviz/components/visualizations/movedBoxes/MovedBoxesDataContainer";
+import { STOCK_QUERY } from "../shared-components/statviz/components/visualizations/stock/StockDataContainer";
+import { DEMOGRAPHIC_QUERY } from "../shared-components/statviz/components/visualizations/demographic/DemographicDataContainer";
+
+// Utilities
+
+async function baseQueryHandler(
+ /** Query used for handler. */
+ operation: T,
+ /** MSW resolver, with result and variable types inferred from the operation. */
+ resolver: GraphQLResponseResolver, VariablesOf>,
+ /** MSW handler options. */
+ options?: RequestHandlerOptions
+) {
+ await delay(100);
+
+ return graphql.query, VariablesOf>(
+ operation.definitions[0]["name"].value,
+ resolver,
+ options
+ )
+}
+
+async function baseMutationHandler(
+ /** Mutation used for handler. */
+ operation: T,
+ /** MSW resolver, with result and variable types inferred from the operation. */
+ resolver: GraphQLResponseResolver, VariablesOf>,
+ /** MSW handler options. */
+ options?: RequestHandlerOptions
+) {
+ await delay(100);
+
+ return graphql.mutation, VariablesOf>(
+ operation.definitions[0]["name"].value,
+ resolver,
+ options
+ )
+}
+
+const boxByLabelIdentifierLocation = devCoordinator.BoxByLabelIdentifier.data.box.location;
+const boxByLabelIdentifierHistory = devCoordinator.BoxByLabelIdentifier.data.box.history;
+const boxByLabelIdentifierShipments = devCoordinator.BoxByLabelIdentifier.data.shipments;
+
+const findBox = (labelIdentifier: string) => Object.values(devCoordinator.BoxesForBoxesViewQuery.baseId)
+ .flatMap(res => res.data.boxes.elements)
+ .find(box => box.labelIdentifier === labelIdentifier)!;
+
+const findProduct = (id: string) => Object.values(devCoordinator.BoxByLabelIdentifierAndAllProductsWithBaseId.baseId)
+ .flatMap(res => res.data.base.products)
+ .find(product => product.id === id)!;
+
+const findLocation = (id: string) => Object.values(devCoordinator.BoxByLabelIdentifierAndAllProductsWithBaseId.baseId)
+ .flatMap(res => res.data.base.locations)
+ .find(location => location.id === id)!;
+
+const findTags = (ids: number[]) => Object.values(devCoordinator.BoxByLabelIdentifierAndAllProductsWithBaseId.baseId)
+ .flatMap(res => res.data.base.tags)
+ .filter((tag) => ids.includes(Number(tag.value)))!
+ .map(tag => ({ ...tag, id: tag.value, name: tag.label, type: "A type", description: "A label" }));
+
+// Handlers
+
+const mockCreatedBoxesHandler = baseQueryHandler(CREATED_BOXES_QUERY, () => {
+ // @ts-expect-error
+ return HttpResponse.json(devCoordinator.createdBoxes);
+});
+
+const mockMovedBoxesHandler = baseQueryHandler(MOVED_BOXES_QUERY, () => {
+ // @ts-expect-error
+ return HttpResponse.json(devCoordinator.movedBoxes);
+});
+
+const mockBeneficiaryDemographicsHandler = baseQueryHandler(DEMOGRAPHIC_QUERY, () => {
+ // @ts-expect-error
+ return HttpResponse.json(devCoordinator.BeneficiaryDemographics);
+});
+
+const mockStockOverviewHandler = baseQueryHandler(STOCK_QUERY, () => {
+ // @ts-expect-error
+ return HttpResponse.json(devCoordinator.stockOverview);
+});
+
+const mockMoveBoxesHandler = graphql.mutation("MoveBoxes", ({ variables }) => {
+ console.log(variables);
+});
+
+const mockAssignTagsHandler = graphql.mutation("AssignTags", ({ variables }) => {
+ console.log(variables);
+});
+
+const mockOrganisationsAndBasesQueryHandler = baseQueryHandler(ORGANISATION_AND_BASES_QUERY, () => {
+
+ return HttpResponse.json(devCoordinator.OrganisationAndBases);
+});
+
+const mockGetBoxLabelIdentifierForQrCodeHandler = baseQueryHandler(GET_BOX_LABEL_IDENTIFIER_BY_QR_CODE, ({ variables }) => {
+ const { qrCode } = variables;
+
+ const result = devCoordinator.GetBoxLabelIdentifierForQrCode[qrCode];
+
+ if (!result) return HttpResponse.json({ errors: [{ message: "Mock doesn't exist for this QRCode." }] });
+
+ // @ts-ignore
+ return HttpResponse.json(result);
+});
+
+const mockCheckIfQrExistsInDbHandler = baseQueryHandler(CHECK_IF_QR_EXISTS_IN_DB, ({ variables }) => {
+ const { qrCode } = variables;
+
+ const result = devCoordinator.CheckIfQrExistsInDb[qrCode];
+
+ if (!result) return HttpResponse.json({ errors: [{ message: "Mock doesn't exist for this QRCode." }] });
+
+ // @ts-ignore
+ return HttpResponse.json(result);
+});
+
+const mockMultiBoxActionOptionsForLocationsTagsAndShipmentseHandler = baseQueryHandler(
+ MULTI_BOX_ACTION_OPTIONS_FOR_LOCATIONS_TAGS_AND_SHIPMENTS_QUERY, ({ variables }) => {
+ const { baseId } = variables;
+
+ return HttpResponse.json(devCoordinator.MultiBoxActionOptionsForLocationsTagsAndShipments.baseId[baseId]);
+ });
+
+const mockAllProductsAndLocationsForBaseHandler = baseQueryHandler(ALL_PRODUCTS_AND_LOCATIONS_FOR_BASE_QUERY, ({ variables }) => {
+ const { baseId } = variables;
+
+ return HttpResponse.json(devCoordinator.AllProductsAndLocationsForBase.baseId[baseId]);
+});
+
+// TODO: include box in BoxesForBoxesViewQuery?
+const mockCreateBoxHandler = baseMutationHandler(CREATE_BOX_MUTATION, async ({ variables }) => {
+ const { locationId, numberOfItems, productId, comment, tagIds, sizeId } = variables;
+
+ const allProducts = Object.values(devCoordinator.AllProductsAndLocationsForBase.baseId)
+ .flatMap(res => res.data.base.products);
+ const size = allProducts.find(product => product.id === "" + productId)?.sizeRange.sizes.find(size => size.id === "" + sizeId)!;
+
+ const box = {
+ ...Object.values(devCoordinator.BoxesForBoxesViewQuery.baseId).flatMap(res => res.data.boxes.elements)[0]
+ }
+
+ box.numberOfItems = numberOfItems;
+ box.location = findLocation("" + locationId);
+ box.product = findProduct("" + productId);
+ box.size = size;
+ if (comment) box.comment = comment;
+ if (tagIds?.length) box.tags = findTags(tagIds);
+
+ worker.use(await baseQueryHandler(BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY, ({ variables: { labelIdentifier } }) =>
+ HttpResponse.json({
+ data: {
+ box: {
+ // @ts-expect-error
+ ...box, labelIdentifier, location: { ...box.location, ...boxByLabelIdentifierLocation, defaultBoxState: "InStock" },
+ history: boxByLabelIdentifierHistory
+ },
+ // @ts-expect-error
+ shipments: boxByLabelIdentifierShipments
+ }
+ }))
+ );
+
+ // @ts-expect-error
+ return HttpResponse.json(devCoordinator.CreateBox);
+})
+
+const mockBoxesForBoxesViewHandler = baseQueryHandler(BOXES_FOR_BOXESVIEW_QUERY, ({ variables }) => {
+ const { baseId } = variables;
+
+ return HttpResponse.json(devCoordinator.BoxesForBoxesViewQuery.baseId[baseId]);
+});
+
+const mockActionOptionsForBoxesViewHandler = baseQueryHandler(ACTION_OPTIONS_FOR_BOXESVIEW_QUERY, ({ variables }) => {
+ const { baseId } = variables;
+
+ return HttpResponse.json(devCoordinator.ActionOptionsForBoxesView.baseId[baseId]);
+});
+
+const mockBoxByLabelIdentifierHandler = baseQueryHandler(BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY, ({ variables }) => {
+ const { labelIdentifier } = variables;
+
+ const box = findBox(labelIdentifier);
+
+ return HttpResponse.json({
+ data: {
+ // @ts-expect-error
+ box: { ...box, location: { ...box.location, ...boxByLabelIdentifierLocation }, history: boxByLabelIdentifierHistory },
+ // @ts-expect-error
+ shipments: boxByLabelIdentifierShipments
+ }
+ });
+})
+
+const mockUpdateLocationOfBoxHandler = baseMutationHandler(UPDATE_BOX_MUTATION, async ({ variables }) => {
+ const { boxLabelIdentifier, newLocationId } = variables;
+
+ const box = findBox(boxLabelIdentifier);
+
+ box.location.id = "" + newLocationId;
+
+ const newLocationName = boxByLabelIdentifierLocation.base.locations.find(location => location.id === "" + newLocationId)!.name;
+
+ worker.use(await baseQueryHandler(BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY, () =>
+ HttpResponse.json({
+ data: {
+ // @ts-expect-error
+ box: { ...box, location: { ...box, name: newLocationName, base: boxByLabelIdentifierLocation.base }, history: boxByLabelIdentifierHistory },
+ // @ts-expect-error
+ shipments: boxByLabelIdentifierShipments
+ }
+ }))
+ );
+
+ // @ts-expect-error
+ return HttpResponse.json({ data: { updateBox: box } });
+})
+
+const mockUpdateStateHandler = baseMutationHandler(UPDATE_STATE_IN_BOX_MUTATION, async ({ variables }) => {
+ const { boxLabelIdentifier, newState } = variables;
+
+ const box = findBox(boxLabelIdentifier);
+
+ box.state = newState ? newState : "InStock";
+
+ worker.use(await baseQueryHandler(BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY, () =>
+ HttpResponse.json({
+ data: {
+ // @ts-expect-error
+ box: { ...box, state: box.state, location: { ...box.location, ...boxByLabelIdentifierLocation, defaultBoxState: "InStock" }, history: boxByLabelIdentifierHistory },
+ // @ts-expect-error
+ shipments: boxByLabelIdentifierShipments
+ }
+ }))
+ );
+
+ // @ts-expect-error
+ return HttpResponse.json({ data: { updateBox: box } });
+})
+
+const mockUpdateNumberOfItemsHandler = baseMutationHandler(UPDATE_NUMBER_OF_ITEMS_IN_BOX_MUTATION, async ({ variables }) => {
+ const { boxLabelIdentifier, numberOfItems } = variables;
+
+ const box = findBox(boxLabelIdentifier);
+
+ box.numberOfItems = numberOfItems;
+
+ worker.use(await baseQueryHandler(BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY, () =>
+ HttpResponse.json({
+ data: {
+ // @ts-expect-error
+ box: { ...box, location: { ...box.location, ...boxByLabelIdentifierLocation }, history: boxByLabelIdentifierHistory },
+ // @ts-expect-error
+ shipments: boxByLabelIdentifierShipments
+ }
+ }))
+ );
+
+ // @ts-expect-error
+ return HttpResponse.json({ data: { updateBox: box } });
+})
+
+const mockBoxByLabelIdentifierAndAllProductsWithBaseIdHandler = baseQueryHandler(
+ BOX_BY_LABEL_IDENTIFIER_AND_ALL_PRODUCTS_WITH_BASEID_QUERY, ({ variables }) => {
+ const { baseId, labelIdentifier } = variables;
+
+ const box = findBox(labelIdentifier);
+ const base = devCoordinator.BoxByLabelIdentifierAndAllProductsWithBaseId.baseId[baseId].data.base;
+
+ return HttpResponse.json({
+ data: {
+ // @ts-expect-error
+ base, box: { ...box, id: labelIdentifier, history: boxByLabelIdentifierHistory },
+ }
+ });
+ })
+
+const mockUpdateContentOfBoxHandler = baseMutationHandler(UPDATE_CONTENT_OF_BOX_MUTATION, async ({ variables }) => {
+ const { boxLabelIdentifier, locationId, numberOfItems, productId, sizeId, comment, tagIds } = variables;
+
+ const box = findBox(boxLabelIdentifier);
+
+ box.comment = comment!;
+ box.numberOfItems = numberOfItems;
+ box.product = findProduct("" + productId);
+ box.size = findProduct("" + productId).sizeRange.sizes.find(s => s.id === "" + sizeId)!;
+ box.tags = findTags(tagIds!);
+
+ worker.use(await baseQueryHandler(BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY, () =>
+ HttpResponse.json({
+ data: {
+ // @ts-expect-error
+ box: { ...box, location: { ...box.location, ...boxByLabelIdentifierLocation, ...findLocation("" + locationId) }, history: boxByLabelIdentifierHistory },
+ // @ts-expect-error
+ shipments: boxByLabelIdentifierShipments
+ }
+ }))
+ );
+
+ return HttpResponse.json({ data: { updateBox: box } });
+})
+
+// TODO: support multiple boxes assigment
+const mockAssignBoxesToShipmentHandler = baseMutationHandler(ASSIGN_BOXES_TO_SHIPMENT, async ({ variables }) => {
+ const { labelIdentifiers, id: resId } = variables;
+
+ const result = devCoordinator.AssignBoxesToShipment;
+ const box = findBox(labelIdentifiers![0]);
+ const lastShipmentDetailCopy = result.data.updateShipmentWhenPreparing.details.at(-1)!;
+
+ box.state = "MarkedForShipment";
+ // @ts-expect-error
+ lastShipmentDetailCopy.box = box;
+ lastShipmentDetailCopy.box.shipmentDetail = { __typename: "", id: "", shipment: { __typename: "", id: resId } };
+ result.data.updateShipmentWhenPreparing.details.push(lastShipmentDetailCopy);
+
+ worker.use(await baseQueryHandler(BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY, () =>
+ HttpResponse.json({
+ data: {
+ box: {
+ ...box,
+ // @ts-expect-error
+ location: { ...box.location, ...boxByLabelIdentifierLocation },
+ shipmentDetail: {
+ // @ts-expect-error
+ ...lastShipmentDetailCopy.box.shipmentDetail, shipment: { targetBase: result.data.updateShipmentWhenPreparing.targetBase, id: resId }
+ },
+ history: boxByLabelIdentifierHistory
+ },
+ // @ts-expect-error
+ shipments: boxByLabelIdentifierShipments
+ }
+ }))
+ );
+
+ // @ts-expect-error
+ return HttpResponse.json(result);
+});
+
+const mockUnassignBoxesFromShipmentHandler = baseMutationHandler(UNASSIGN_BOX_FROM_SHIPMENT, async ({ variables }) => {
+ const { labelIdentifiers } = variables;
+
+ const result = devCoordinator.UnassignBoxesFromShipment;
+ const box = findBox(labelIdentifiers![0]);
+ const lastShipmentDetailCopy = result.data.updateShipmentWhenPreparing.details.at(-1)!;
+
+ box.state = "InStock";
+ // @ts-expect-error
+ lastShipmentDetailCopy.box = box;
+ lastShipmentDetailCopy.box.shipmentDetail = null;
+ result.data.updateShipmentWhenPreparing.details.push(lastShipmentDetailCopy);
+
+ worker.use(await baseQueryHandler(BOX_BY_LABEL_IDENTIFIER_AND_ALL_SHIPMENTS_QUERY, () =>
+ HttpResponse.json({
+ data: {
+ // @ts-expect-error
+ box: { ...box, location: { ...box.location, ...boxByLabelIdentifierLocation }, history: boxByLabelIdentifierHistory },
+ // @ts-expect-error
+ shipments: boxByLabelIdentifierShipments
+ }
+ }))
+ );
+
+ // @ts-expect-error
+ return HttpResponse.json(result);
+});
+
+const mockAllOrganisationsAndBasesHandler = baseQueryHandler(ALL_ORGS_AND_BASES_QUERY, () => {
+ return HttpResponse.json(devCoordinator.AllOrganisationsAndBases);
+});
+
+const mockAllBasesOfCurrentOrgHandler = baseQueryHandler(ALL_BASES_OF_CURRENT_ORG_QUERY, () => {
+ return HttpResponse.json(devCoordinator.AllBasesOfCurrentOrg);
+});
+
+const mockShipmentsHandler = baseQueryHandler(ALL_SHIPMENTS_QUERY, () => {
+ // @ts-expect-error
+ return HttpResponse.json(devCoordinator.Shipments);
+});
+
+const mockShipmentByIdHandler = baseQueryHandler(SHIPMENT_BY_ID_QUERY, ({ variables }) => {
+ const { id } = variables;
+ return HttpResponse.json(devCoordinator.ShipmentById[id]);
+});
+
+const mockTransferAgreementsHandler = baseQueryHandler(ALL_TRANSFER_AGREEMENTS_QUERY, () => {
+ // @ts-expect-error
+ return HttpResponse.json(devCoordinator.TransferAgreements);
+});
+
+const mockAllAcceptedTransferAgreementsHandler = baseQueryHandler(ALL_ACCEPTED_TRANSFER_AGREEMENTS_QUERY, () => {
+ // @ts-expect-error
+ return HttpResponse.json(devCoordinator.AllAcceptedTransferAgreements);
+});
+
+const mockCreateShipmentHandler = baseMutationHandler(CREATE_SHIPMENT_MUTATION, async ({ variables }) => {
+ // const { sourceBaseId, targetBaseId, transferAgreementId } = variables;
+ const { transferAgreementId } = variables;
+
+ // TODO: labelIdentifier, user, sourceBase, targetBase
+
+ const newShipment = devCoordinator.ShipmentById[10].data.shipment;
+
+ newShipment.id = `${devCoordinator.Shipments.data.shipments.length + 1}`;
+
+ devCoordinator.Shipments.data.shipments.push(newShipment);
+
+ devCoordinator.ShipmentById[newShipment.id] = { data: { shipment: newShipment } };
+
+ // @ts-expect-error
+ if (transferAgreementId) newShipment.transferAgreement = devCoordinator.TransferAgreements.data.transferAgreements
+ .find(transferAgreement => transferAgreement.id === "" + transferAgreementId);
+
+ // @ts-expect-error
+ return HttpResponse.json({ data: { createShipment: newShipment } });
+})
+
+// box history
+// shipment history
+// CreateTransferAgreements
+// SendShipment
+// CancelShipment
+// UpdateShipmentWhenReceiving
+// RemoveBoxFromShipment
+// CancelTransferAgreements
+// DeleteBoxes
+// bug with assigning tags?
+// multibox tag, location, shipment diff base errors?
+// box not changing state 2nd time?
+
+// Exported handlers to be consumed by MSW
+export const handlers = [
+ await mockOrganisationsAndBasesQueryHandler,
+ await mockCreatedBoxesHandler,
+ await mockMovedBoxesHandler,
+ await mockBeneficiaryDemographicsHandler,
+ await mockStockOverviewHandler,
+ await mockGetBoxLabelIdentifierForQrCodeHandler,
+ await mockCheckIfQrExistsInDbHandler,
+ await mockAllProductsAndLocationsForBaseHandler,
+ await mockMultiBoxActionOptionsForLocationsTagsAndShipmentseHandler,
+ await mockCreateBoxHandler,
+ await mockBoxesForBoxesViewHandler,
+ await mockActionOptionsForBoxesViewHandler,
+ await mockBoxByLabelIdentifierHandler,
+ await mockUpdateLocationOfBoxHandler,
+ await mockUpdateStateHandler,
+ await mockUpdateNumberOfItemsHandler,
+ await mockBoxByLabelIdentifierAndAllProductsWithBaseIdHandler,
+ await mockUpdateContentOfBoxHandler,
+ await mockAssignBoxesToShipmentHandler,
+ await mockUnassignBoxesFromShipmentHandler,
+ await mockAllOrganisationsAndBasesHandler,
+ await mockAllBasesOfCurrentOrgHandler,
+ await mockShipmentsHandler,
+ await mockShipmentByIdHandler,
+ await mockTransferAgreementsHandler,
+ await mockAllAcceptedTransferAgreementsHandler,
+ await mockCreateShipmentHandler,
+ mockMoveBoxesHandler,
+ mockAssignTagsHandler,
+];
diff --git a/tests/qrCode.local.spec.ts b/tests/qrCode.local.spec.ts
new file mode 100644
index 000000000..c990050ca
--- /dev/null
+++ b/tests/qrCode.local.spec.ts
@@ -0,0 +1,56 @@
+import { test, expect, chromium } from '@playwright/test';
+import path from 'path';
+
+const QR_CODE_TIMEOUT = 30000;
+
+const fakeCamArgs = (qrCodeRelativePath: string) => ({
+ args: [
+ "--auto-accept-camera-and-microphone-capture",
+ "--use-fake-device-for-media-stream",
+ `--use-file-for-fake-video-capture=${path.join(
+ path.resolve(__dirname, '..'),
+ qrCodeRelativePath,
+ )}`,
+ ],
+});
+
+test.describe('Boxtribute Web App - Local', () => {
+ // TODO: rename qrreader specs to their actual names
+ test('QRReader 1', async () => {
+ const browser = await chromium.launch(fakeCamArgs("tests/qrCodes/boxBase1.mjpeg"));
+ const context = await browser.newContext();
+ const page = await context.newPage();
+
+ await page.goto('http://localhost:3000/bases/2/', { waitUntil: "domcontentloaded" });
+ await expect(page.getByText(/This box it at base Lesvos, which belongs to organization BoxAid./)).toBeVisible({ timeout: QR_CODE_TIMEOUT });
+ });
+
+ test('QRReader 2', async () => {
+ const browser = await chromium.launch(fakeCamArgs("tests/qrCodes/boxBase2.mjpeg"));
+ const context = await browser.newContext();
+ const page = await context.newPage();
+
+ await page.goto('http://localhost:3000/bases/2/', { waitUntil: "domcontentloaded" });
+ await expect(page.getByText("Box 38216171")).toBeVisible({ timeout: QR_CODE_TIMEOUT });
+ await expect(page).toHaveURL(/.*\/bases\/2\/boxes\/38216171/);
+ });
+
+ test('QRReader 3', async () => {
+ const browser = await chromium.launch(fakeCamArgs("tests/qrCodes/boxBase3.mjpeg"));
+ const context = await browser.newContext();
+ const page = await context.newPage();
+
+ await page.goto('http://localhost:3000/bases/2/', { waitUntil: "domcontentloaded" });
+ await expect(page.getByText("Box 81249458")).toBeVisible({ timeout: QR_CODE_TIMEOUT });
+ await expect(page).toHaveURL(/.*\/bases\/3\/boxes\/81249458/);
+ });
+
+ test('QRReader 4', async () => {
+ const browser = await chromium.launch(fakeCamArgs("tests/qrCodes/boxBase4.mjpeg"));
+ const context = await browser.newContext();
+ const page = await context.newPage();
+
+ await page.goto('http://localhost:3000/bases/2/', { waitUntil: "domcontentloaded" });
+ await expect(page.getByText(/This box it at base Athens, which belongs to organization BoxCare./)).toBeVisible({ timeout: QR_CODE_TIMEOUT });
+ });
+});
diff --git a/tests/qrCodes/boxBase1.mjpeg b/tests/qrCodes/boxBase1.mjpeg
new file mode 100644
index 000000000..69aef96b7
Binary files /dev/null and b/tests/qrCodes/boxBase1.mjpeg differ
diff --git a/tests/qrCodes/boxBase2.mjpeg b/tests/qrCodes/boxBase2.mjpeg
new file mode 100644
index 000000000..f88cc7c11
Binary files /dev/null and b/tests/qrCodes/boxBase2.mjpeg differ
diff --git a/tests/qrCodes/boxBase3.mjpeg b/tests/qrCodes/boxBase3.mjpeg
new file mode 100644
index 000000000..fdf0117c8
Binary files /dev/null and b/tests/qrCodes/boxBase3.mjpeg differ
diff --git a/tests/qrCodes/boxBase4.mjpeg b/tests/qrCodes/boxBase4.mjpeg
new file mode 100644
index 000000000..339c502b7
Binary files /dev/null and b/tests/qrCodes/boxBase4.mjpeg differ
diff --git a/tests/qrCodes/boxNotInDB.mjpeg b/tests/qrCodes/boxNotInDB.mjpeg
new file mode 100644
index 000000000..09c1bebe9
Binary files /dev/null and b/tests/qrCodes/boxNotInDB.mjpeg differ
diff --git a/tests/qrCodes/notAssociatedToBox.mjpeg b/tests/qrCodes/notAssociatedToBox.mjpeg
new file mode 100644
index 000000000..3871e936f
Binary files /dev/null and b/tests/qrCodes/notAssociatedToBox.mjpeg differ