Repository: mirumee/saleor-dashboard
Pull request #99 (2019-08-12 13:18:57)

Add switch to make attribute available in product list column selection
I want to merge this change because it adds switch "Add to Column Options".

### Screenshots
<img width="419" alt="Screenshot 2019-08-12 at 15 17 57" src="https://user-images.githubusercontent.com/6833443/62867801-6f8cba00-bd14-11e9-943b-ef719bf8ea21.png">


### Pull Request Checklist

<!-- Please keep this section. It will make maintainer's life easier. -->

1. [x] All visible strings are translated with proper context.
1. [x] All data-formatting is locale-aware (dates, numbers, and so on).
1. [x] Number of API calls is optimized.
1. [x] The changes are tested.
1. [x] Type definitions are up to date.
1. [x] Changes are mentioned in the changelog.


codecov[bot]: # [Codecov](https://codecov.io/gh/mirumee/saleor-dashboard/pull/99?src=pr&el=h1) Report
> Merging [#99](https://codecov.io/gh/mirumee/saleor-dashboard/pull/99?src=pr&el=desc) into [master](https://codecov.io/gh/mirumee/saleor-dashboard/commit/671b895d81cda4f26422e9f385d7b8edffc3e96f?src=pr&el=desc) will **increase** coverage by `<.01%`.
> The diff coverage is `100%`.

[![Impacted file tree graph](https://codecov.io/gh/mirumee/saleor-dashboard/pull/99/graphs/tree.svg?width=650&token=GuvRMxAgM1&height=150&src=pr)](https://codecov.io/gh/mirumee/saleor-dashboard/pull/99?src=pr&el=tree)

```diff
@@            Coverage Diff             @@
##           master      #99      +/-   ##
==========================================
+ Coverage   88.09%   88.09%   +<.01%     
==========================================
  Files         703      703              
  Lines       11053    11055       +2     
  Branches      927      927              
==========================================
+ Hits         9737     9739       +2     
  Misses       1161     1161              
  Partials      155      155
```


| [Impacted Files](https://codecov.io/gh/mirumee/saleor-dashboard/pull/99?src=pr&el=tree) | Coverage Δ | |
|---|---|---|
| [...onents/AttributeProperties/AttributeProperties.tsx](https://codecov.io/gh/mirumee/saleor-dashboard/pull/99/diff?src=pr&el=tree#diff-c3JjL2F0dHJpYnV0ZXMvY29tcG9uZW50cy9BdHRyaWJ1dGVQcm9wZXJ0aWVzL0F0dHJpYnV0ZVByb3BlcnRpZXMudHN4) | `100% <ø> (ø)` | :arrow_up: |
| [...ributes/components/AttributePage/AttributePage.tsx](https://codecov.io/gh/mirumee/saleor-dashboard/pull/99/diff?src=pr&el=tree#diff-c3JjL2F0dHJpYnV0ZXMvY29tcG9uZW50cy9BdHRyaWJ1dGVQYWdlL0F0dHJpYnV0ZVBhZ2UudHN4) | `95.91% <100%> (+0.08%)` | :arrow_up: |
| [src/attributes/fixtures.ts](https://codecov.io/gh/mirumee/saleor-dashboard/pull/99/diff?src=pr&el=tree#diff-c3JjL2F0dHJpYnV0ZXMvZml4dHVyZXMudHM=) | `100% <100%> (ø)` | :arrow_up: |
| [src/types/globalTypes.ts](https://codecov.io/gh/mirumee/saleor-dashboard/pull/99/diff?src=pr&el=tree#diff-c3JjL3R5cGVzL2dsb2JhbFR5cGVzLnRz) | `100% <100%> (ø)` | :arrow_up: |

------

[Continue to review full report at Codecov](https://codecov.io/gh/mirumee/saleor-dashboard/pull/99?src=pr&el=continue).
> **Legend** - [Click here to learn more](https://docs.codecov.io/docs/codecov-delta)
> `Δ = absolute <relative> (impact)`, `ø = not affected`, `? = missing data`
> Powered by [Codecov](https://codecov.io/gh/mirumee/saleor-dashboard/pull/99?src=pr&el=footer). Last update [671b895...4f4a345](https://codecov.io/gh/mirumee/saleor-dashboard/pull/99?src=pr&el=lastupdated). Read the [comment docs](https://docs.codecov.io/docs/pull-request-comments).


Patch:
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 3ecc4b825..40e05c9e5 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -7,3 +7,4 @@ All notable, unreleased changes to this project will be documented in this file.
 - Add changelog and github issue/PR templates - #97 by @dominik-zeglen
 - Update dependencies to suppress storybook build errors - #98 by @dominik-zeglen
 - Fix configure menu section - #109 by @benekex2
+- Add switch to make attribute available in product list as a column - #99 by @dominik-zeglen
\ No newline at end of file
diff --git a/apollo.config.js b/apollo.config.js
index f044084a1..27c3980e6 100644
--- a/apollo.config.js
+++ b/apollo.config.js
@@ -4,7 +4,7 @@ module.exports = {
     includes: ["src/**/*.ts", "src/**/*.tsx"],
     name: "dashboard",
     service: {
-      endpoint: "localhost:8000/graphql/",
+      localSchemaFile: "schema.graphql",
       name: "saleor"
     }
   }
diff --git a/schema.graphql b/schema.graphql
new file mode 100644
index 000000000..5490d13e7
--- /dev/null
+++ b/schema.graphql
@@ -0,0 +1,3711 @@
+schema {
+  query: Query
+  mutation: Mutations
+}
+
+type AccountAddressCreate {
+  errors: [Error!]
+  user: User
+  address: Address
+}
+
+type AccountAddressDelete {
+  errors: [Error!]
+  user: User
+  address: Address
+}
+
+type AccountAddressUpdate {
+  errors: [Error!]
+  user: User
+  address: Address
+}
+
+type AccountDelete {
+  errors: [Error!]
+  user: User
+}
+
+input AccountInput {
+  firstName: String
+  lastName: String
+  defaultBillingAddress: AddressInput
+  defaultShippingAddress: AddressInput
+}
+
+type AccountRegister {
+  errors: [Error!]
+  user: User
+}
+
+input AccountRegisterInput {
+  email: String!
+  password: String!
+}
+
+type AccountRequestDeletion {
+  errors: [Error!]
+}
+
+type AccountSetDefaultAddress {
+  errors: [Error!]
+  user: User
+}
+
+type AccountUpdate {
+  errors: [Error!]
+  user: User
+}
+
+type Address implements Node {
+  id: ID!
+  firstName: String!
+  lastName: String!
+  companyName: String!
+  streetAddress1: String!
+  streetAddress2: String!
+  city: String!
+  cityArea: String!
+  postalCode: String!
+  country: CountryDisplay!
+  countryArea: String!
+  phone: String
+  isDefaultShippingAddress: Boolean
+  isDefaultBillingAddress: Boolean
+}
+
+type AddressCreate {
+  errors: [Error!]
+  user: User
+  address: Address
+}
+
+type AddressDelete {
+  errors: [Error!]
+  user: User
+  address: Address
+}
+
+input AddressInput {
+  firstName: String
+  lastName: String
+  companyName: String
+  streetAddress1: String
+  streetAddress2: String
+  city: String
+  cityArea: String
+  postalCode: String
+  country: String
+  countryArea: String
+  phone: String
+}
+
+type AddressSetDefault {
+  errors: [Error!]
+  user: User
+}
+
+enum AddressTypeEnum {
+  BILLING
+  SHIPPING
+}
+
+type AddressUpdate {
+  errors: [Error!]
+  user: User
+  address: Address
+}
+
+type AddressValidationData {
+  countryCode: String
+  countryName: String
+  addressFormat: String
+  addressLatinFormat: String
+  allowedFields: [String]
+  requiredFields: [String]
+  upperFields: [String]
+  countryAreaType: String
+  countryAreaChoices: [ChoiceValue]
+  cityType: String
+  cityChoices: [ChoiceValue]
+  cityAreaType: String
+  cityAreaChoices: [ChoiceValue]
+  postalCodeType: String
+  postalCodeMatchers: [String]
+  postalCodeExamples: [String]
+  postalCodePrefix: String
+}
+
+type AssignNavigation {
+  errors: [Error!]
+  menu: Menu
+}
+
+type Attribute implements Node {
+  id: ID!
+  productTypes(before: String, after: String, first: Int, last: Int): ProductTypeCountableConnection
+  productVariantTypes(before: String, after: String, first: Int, last: Int): ProductTypeCountableConnection
+  privateMeta: [MetaStore]!
+  meta: [MetaStore]!
+  inputType: AttributeInputTypeEnum
+  name: String
+  slug: String
+  values: [AttributeValue]
+  valueRequired: Boolean!
+  visibleInStorefront: Boolean!
+  filterableInStorefront: Boolean!
+  filterableInDashboard: Boolean!
+  availableInGrid: Boolean!
+  translation(languageCode: LanguageCodeEnum!): AttributeTranslation
+  storefrontSearchPosition: Int!
+}
+
+type AttributeAssign {
+  errors: [Error!]
+  productType: ProductType
+}
+
+input AttributeAssignInput {
+  id: ID!
+  type: AttributeTypeEnum!
+}
+
+type AttributeBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type AttributeClearMeta {
+  errors: [Error!]
+  attribute: Attribute
+}
+
+type AttributeClearPrivateMeta {
+  errors: [Error!]
+  attribute: Attribute
+}
+
+type AttributeCountableConnection {
+  pageInfo: PageInfo!
+  edges: [AttributeCountableEdge!]!
+  totalCount: Int
+}
+
+type AttributeCountableEdge {
+  node: Attribute!
+  cursor: String!
+}
+
+type AttributeCreate {
+  errors: [Error!]
+  attribute: Attribute
+}
+
+input AttributeCreateInput {
+  inputType: AttributeInputTypeEnum
+  name: String!
+  slug: String
+  values: [AttributeValueCreateInput]
+  valueRequired: Boolean
+  isVariantOnly: Boolean
+  visibleInStorefront: Boolean
+  filterableInStorefront: Boolean
+  filterableInDashboard: Boolean
+  storefrontSearchPosition: Int
+  availableInGrid: Boolean
+}
+
+type AttributeDelete {
+  errors: [Error!]
+  attribute: Attribute
+}
+
+input AttributeFilterInput {
+  valueRequired: Boolean
+  isVariantOnly: Boolean
+  visibleInStorefront: Boolean
+  filterableInStorefront: Boolean
+  filterableInDashboard: Boolean
+  availableInGrid: Boolean
+  search: String
+}
+
+input AttributeInput {
+  slug: String!
+  value: String!
+}
+
+enum AttributeInputTypeEnum {
+  DROPDOWN
+  MULTISELECT
+}
+
+type AttributeReorderValues {
+  errors: [Error!]
+  attribute: Attribute
+}
+
+scalar AttributeScalar
+
+enum AttributeSortField {
+  NAME
+  SLUG
+  VALUE_REQUIRED
+  IS_VARIANT_ONLY
+  VISIBLE_IN_STOREFRONT
+  FILTERABLE_IN_STOREFRONT
+  FILTERABLE_IN_DASHBOARD
+  DASHBOARD_VARIANT_POSITION
+  DASHBOARD_PRODUCT_POSITION
+  STOREFRONT_SEARCH_POSITION
+  AVAILABLE_IN_GRID
+}
+
+input AttributeSortingInput {
+  field: AttributeSortField!
+  direction: OrderDirection!
+}
+
+type AttributeTranslate {
+  errors: [Error!]
+  attribute: Attribute
+}
+
+type AttributeTranslation implements Node {
+  id: ID!
+  name: String!
+  language: LanguageDisplay!
+}
+
+enum AttributeTypeEnum {
+  PRODUCT
+  VARIANT
+}
+
+type AttributeUnassign {
+  errors: [Error!]
+  productType: ProductType
+}
+
+type AttributeUpdate {
+  errors: [Error!]
+  attribute: Attribute
+}
+
+input AttributeUpdateInput {
+  name: String
+  slug: String
+  removeValues: [ID]
+  addValues: [AttributeValueCreateInput]
+  valueRequired: Boolean
+  isVariantOnly: Boolean
+  visibleInStorefront: Boolean
+  filterableInStorefront: Boolean
+  filterableInDashboard: Boolean
+  storefrontSearchPosition: Int
+  availableInGrid: Boolean
+}
+
+type AttributeUpdateMeta {
+  errors: [Error!]
+  attribute: Attribute
+}
+
+type AttributeUpdatePrivateMeta {
+  errors: [Error!]
+  attribute: Attribute
+}
+
+type AttributeValue implements Node {
+  id: ID!
+  name: String
+  slug: String
+  type: AttributeValueType
+  value: String @deprecated(reason: "This field is deprecated")
+  translation(languageCode: LanguageCodeEnum!): AttributeValueTranslation
+  inputType: AttributeInputTypeEnum
+}
+
+type AttributeValueBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type AttributeValueCreate {
+  errors: [Error!]
+  attribute: Attribute
+  attributeValue: AttributeValue
+}
+
+input AttributeValueCreateInput {
+  name: String!
+  value: String
+}
+
+type AttributeValueDelete {
+  errors: [Error!]
+  attribute: Attribute
+  attributeValue: AttributeValue
+}
+
+input AttributeValueInput {
+  id: ID
+  name: String
+  slug: String
+  values: [String]!
+}
+
+type AttributeValueTranslate {
+  errors: [Error!]
+  attributeValue: AttributeValue
+}
+
+type AttributeValueTranslation implements Node {
+  id: ID!
+  name: String!
+  language: LanguageDisplay!
+}
+
+enum AttributeValueType {
+  COLOR
+  GRADIENT
+  URL
+  STRING
+}
+
+type AttributeValueUpdate {
+  errors: [Error!]
+  attribute: Attribute
+  attributeValue: AttributeValue
+}
+
+type AuthorizationKey {
+  name: AuthorizationKeyType!
+  key: String!
+}
+
+type AuthorizationKeyAdd {
+  errors: [Error!]
+  authorizationKey: AuthorizationKey
+  shop: Shop
+}
+
+type AuthorizationKeyDelete {
+  errors: [Error!]
+  authorizationKey: AuthorizationKey
+  shop: Shop
+}
+
+input AuthorizationKeyInput {
+  key: String!
+  password: String!
+}
+
+enum AuthorizationKeyType {
+  FACEBOOK
+  GOOGLE_OAUTH2
+}
+
+input CatalogueInput {
+  products: [ID]
+  categories: [ID]
+  collections: [ID]
+}
+
+type Category implements Node {
+  seoTitle: String
+  seoDescription: String
+  id: ID!
+  name: String!
+  slug: String!
+  description: String!
+  descriptionJson: JSONString!
+  parent: Category
+  level: Int!
+  privateMeta: [MetaStore]!
+  meta: [MetaStore]!
+  ancestors(before: String, after: String, first: Int, last: Int): CategoryCountableConnection
+  products(before: String, after: String, first: Int, last: Int): ProductCountableConnection
+  url: String
+  children(before: String, after: String, first: Int, last: Int): CategoryCountableConnection
+  backgroundImage(size: Int): Image
+  translation(languageCode: LanguageCodeEnum!): CategoryTranslation
+}
+
+type CategoryBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type CategoryClearMeta {
+  errors: [Error!]
+  category: Category
+}
+
+type CategoryClearPrivateMeta {
+  errors: [Error!]
+  category: Category
+}
+
+type CategoryCountableConnection {
+  pageInfo: PageInfo!
+  edges: [CategoryCountableEdge!]!
+  totalCount: Int
+}
+
+type CategoryCountableEdge {
+  node: Category!
+  cursor: String!
+}
+
+type CategoryCreate {
+  errors: [Error!]
+  category: Category
+}
+
+type CategoryDelete {
+  errors: [Error!]
+  category: Category
+}
+
+input CategoryInput {
+  description: String
+  descriptionJson: JSONString
+  name: String
+  slug: String
+  seo: SeoInput
+  backgroundImage: Upload
+  backgroundImageAlt: String
+}
+
+type CategoryTranslate {
+  errors: [Error!]
+  category: Category
+}
+
+type CategoryTranslation implements Node {
+  seoTitle: String
+  seoDescription: String
+  id: ID!
+  name: String!
+  description: String!
+  descriptionJson: JSONString!
+  language: LanguageDisplay!
+}
+
+type CategoryUpdate {
+  errors: [Error!]
+  category: Category
+}
+
+type CategoryUpdateMeta {
+  errors: [Error!]
+  category: Category
+}
+
+type CategoryUpdatePrivateMeta {
+  errors: [Error!]
+  category: Category
+}
+
+type Checkout implements Node {
+  created: DateTime!
+  lastChange: DateTime!
+  user: User
+  token: UUID!
+  quantity: Int!
+  billingAddress: Address
+  shippingAddress: Address
+  shippingMethod: ShippingMethod
+  note: String!
+  discountAmount: Money
+  discountName: String
+  translatedDiscountName: String
+  voucherCode: String
+  giftCards: [GiftCard]
+  id: ID!
+  privateMeta: [MetaStore]!
+  meta: [MetaStore]!
+  availableShippingMethods: [ShippingMethod]!
+  availablePaymentGateways: [GatewaysEnum]!
+  email: String!
+  isShippingRequired: Boolean!
+  lines: [CheckoutLine]
+  shippingPrice: TaxedMoney
+  subtotalPrice: TaxedMoney
+  totalPrice: TaxedMoney
+}
+
+type CheckoutAddPromoCode {
+  errors: [Error!]
+  checkout: Checkout
+}
+
+type CheckoutBillingAddressUpdate {
+  errors: [Error!]
+  checkout: Checkout
+}
+
+type CheckoutClearStoredMeta {
+  errors: [Error!]
+  checkout: Checkout
+}
+
+type CheckoutClearStoredPrivateMeta {
+  errors: [Error!]
+  checkout: Checkout
+}
+
+type CheckoutComplete {
+  errors: [Error!]
+  order: Order
+}
+
+type CheckoutCountableConnection {
+  pageInfo: PageInfo!
+  edges: [CheckoutCountableEdge!]!
+  totalCount: Int
+}
+
+type CheckoutCountableEdge {
+  node: Checkout!
+  cursor: String!
+}
+
+type CheckoutCreate {
+  errors: [Error!]
+  created: Boolean
+  checkout: Checkout
+}
+
+input CheckoutCreateInput {
+  lines: [CheckoutLineInput]!
+  email: String
+  shippingAddress: AddressInput
+  billingAddress: AddressInput
+}
+
+type CheckoutCustomerAttach {
+  errors: [Error!]
+  checkout: Checkout
+}
+
+type CheckoutCustomerDetach {
+  errors: [Error!]
+  checkout: Checkout
+}
+
+type CheckoutEmailUpdate {
+  errors: [Error!]
+  checkout: Checkout
+}
+
+type CheckoutLine implements Node {
+  id: ID!
+  variant: ProductVariant!
+  quantity: Int!
+  totalPrice: TaxedMoney
+  requiresShipping: Boolean
+}
+
+type CheckoutLineCountableConnection {
+  pageInfo: PageInfo!
+  edges: [CheckoutLineCountableEdge!]!
+  totalCount: Int
+}
+
+type CheckoutLineCountableEdge {
+  node: CheckoutLine!
+  cursor: String!
+}
+
+type CheckoutLineDelete {
+  errors: [Error!]
+  checkout: Checkout
+}
+
+input CheckoutLineInput {
+  quantity: Int!
+  variantId: ID!
+}
+
+type CheckoutLinesAdd {
+  errors: [Error!]
+  checkout: Checkout
+}
+
+type CheckoutLinesUpdate {
+  errors: [Error!]
+  checkout: Checkout
+}
+
+type CheckoutPaymentCreate {
+  errors: [Error!]
+  checkout: Checkout
+  payment: Payment
+}
+
+type CheckoutRemovePromoCode {
+  errors: [Error!]
+  checkout: Checkout
+}
+
+type CheckoutShippingAddressUpdate {
+  errors: [Error!]
+  checkout: Checkout
+}
+
+type CheckoutShippingMethodUpdate {
+  errors: [Error!]
+  checkout: Checkout
+}
+
+type CheckoutUpdateMeta {
+  errors: [Error!]
+  checkout: Checkout
+}
+
+type CheckoutUpdatePrivateMeta {
+  errors: [Error!]
+  checkout: Checkout
+}
+
+type CheckoutUpdateVoucher {
+  errors: [Error!]
+  checkout: Checkout
+}
+
+type ChoiceValue {
+  raw: String
+  verbose: String
+}
+
+type Collection implements Node {
+  publicationDate: Date
+  isPublished: Boolean!
+  seoTitle: String
+  seoDescription: String
+  id: ID!
+  name: String!
+  slug: String!
+  description: String!
+  descriptionJson: JSONString!
+  privateMeta: [MetaStore]!
+  meta: [MetaStore]!
+  products(before: String, after: String, first: Int, last: Int): ProductCountableConnection
+  backgroundImage(size: Int): Image
+  publishedDate: Date @deprecated(reason: "publishedDate is deprecated, use publicationDate instead")
+  translation(languageCode: LanguageCodeEnum!): CollectionTranslation
+}
+
+type CollectionAddProducts {
+  errors: [Error!]
+  collection: Collection
+}
+
+type CollectionBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type CollectionBulkPublish {
+  errors: [Error!]
+  count: Int!
+}
+
+type CollectionClearMeta {
+  errors: [Error!]
+  collection: Collection
+}
+
+type CollectionClearPrivateMeta {
+  errors: [Error!]
+  collection: Collection
+}
+
+type CollectionCountableConnection {
+  pageInfo: PageInfo!
+  edges: [CollectionCountableEdge!]!
+  totalCount: Int
+}
+
+type CollectionCountableEdge {
+  node: Collection!
+  cursor: String!
+}
+
+type CollectionCreate {
+  errors: [Error!]
+  collection: Collection
+}
+
+input CollectionCreateInput {
+  isPublished: Boolean
+  name: String
+  slug: String
+  description: String
+  descriptionJson: JSONString
+  backgroundImage: Upload
+  backgroundImageAlt: String
+  seo: SeoInput
+  publicationDate: Date
+  products: [ID]
+}
+
+type CollectionDelete {
+  errors: [Error!]
+  collection: Collection
+}
+
+input CollectionFilterInput {
+  published: CollectionPublished
+  search: String
+}
+
+input CollectionInput {
+  isPublished: Boolean
+  name: String
+  slug: String
+  description: String
+  descriptionJson: JSONString
+  backgroundImage: Upload
+  backgroundImageAlt: String
+  seo: SeoInput
+  publicationDate: Date
+}
+
+enum CollectionPublished {
+  PUBLISHED
+  HIDDEN
+}
+
+type CollectionRemoveProducts {
+  errors: [Error!]
+  collection: Collection
+}
+
+type CollectionReorderProducts {
+  errors: [Error!]
+  collection: Collection
+}
+
+type CollectionTranslate {
+  errors: [Error!]
+  collection: Collection
+}
+
+type CollectionTranslation implements Node {
+  seoTitle: String
+  seoDescription: String
+  id: ID!
+  name: String!
+  description: String!
+  descriptionJson: JSONString!
+  language: LanguageDisplay!
+}
+
+type CollectionUpdate {
+  errors: [Error!]
+  collection: Collection
+}
+
+type CollectionUpdateMeta {
+  errors: [Error!]
+  collection: Collection
+}
+
+type CollectionUpdatePrivateMeta {
+  errors: [Error!]
+  collection: Collection
+}
+
+type ConfigurationItem {
+  name: String!
+  value: String!
+  type: ConfigurationTypeFieldEnum
+  helpText: String
+  label: String
+}
+
+input ConfigurationItemInput {
+  name: String!
+  value: String!
+}
+
+enum ConfigurationTypeFieldEnum {
+  STRING
+  BOOLEAN
+}
+
+enum CountryCode {
+  AF
+  AX
+  AL
+  DZ
+  AS
+  AD
+  AO
+  AI
+  AQ
+  AG
+  AR
+  AM
+  AW
+  AU
+  AT
+  AZ
+  BS
+  BH
+  BD
+  BB
+  BY
+  BE
+  BZ
+  BJ
+  BM
+  BT
+  BO
+  BQ
+  BA
+  BW
+  BV
+  BR
+  IO
+  BN
+  BG
+  BF
+  BI
+  CV
+  KH
+  CM
+  CA
+  KY
+  CF
+  TD
+  CL
+  CN
+  CX
+  CC
+  CO
+  KM
+  CG
+  CD
+  CK
+  CR
+  CI
+  HR
+  CU
+  CW
+  CY
+  CZ
+  DK
+  DJ
+  DM
+  DO
+  EC
+  EG
+  SV
+  GQ
+  ER
+  EE
+  SZ
+  ET
+  EU
+  FK
+  FO
+  FJ
+  FI
+  FR
+  GF
+  PF
+  TF
+  GA
+  GM
+  GE
+  DE
+  GH
+  GI
+  GR
+  GL
+  GD
+  GP
+  GU
+  GT
+  GG
+  GN
+  GW
+  GY
+  HT
+  HM
+  VA
+  HN
+  HK
+  HU
+  IS
+  IN
+  ID
+  IR
+  IQ
+  IE
+  IM
+  IL
+  IT
+  JM
+  JP
+  JE
+  JO
+  KZ
+  KE
+  KI
+  KW
+  KG
+  LA
+  LV
+  LB
+  LS
+  LR
+  LY
+  LI
+  LT
+  LU
+  MO
+  MK
+  MG
+  MW
+  MY
+  MV
+  ML
+  MT
+  MH
+  MQ
+  MR
+  MU
+  YT
+  MX
+  FM
+  MD
+  MC
+  MN
+  ME
+  MS
+  MA
+  MZ
+  MM
+  NA
+  NR
+  NP
+  NL
+  NC
+  NZ
+  NI
+  NE
+  NG
+  NU
+  NF
+  KP
+  MP
+  NO
+  OM
+  PK
+  PW
+  PS
+  PA
+  PG
+  PY
+  PE
+  PH
+  PN
+  PL
+  PT
+  PR
+  QA
+  RE
+  RO
+  RU
+  RW
+  BL
+  SH
+  KN
+  LC
+  MF
+  PM
+  VC
+  WS
+  SM
+  ST
+  SA
+  SN
+  RS
+  SC
+  SL
+  SG
+  SX
+  SK
+  SI
+  SB
+  SO
+  ZA
+  GS
+  KR
+  SS
+  ES
+  LK
+  SD
+  SR
+  SJ
+  SE
+  CH
+  SY
+  TW
+  TJ
+  TZ
+  TH
+  TL
+  TG
+  TK
+  TO
+  TT
+  TN
+  TR
+  TM
+  TC
+  TV
+  UG
+  UA
+  AE
+  GB
+  UM
+  US
+  UY
+  UZ
+  VU
+  VE
+  VN
+  VG
+  VI
+  WF
+  EH
+  YE
+  ZM
+  ZW
+}
+
+type CountryDisplay {
+  code: String!
+  country: String!
+  vat: VAT
+}
+
+type CreateToken {
+  token: String
+  errors: [Error]!
+  user: User
+}
+
+type CreditCard {
+  brand: String!
+  firstDigits: String!
+  lastDigits: String!
+  expMonth: Int!
+  expYear: Int!
+}
+
+type CustomerAddressCreate {
+  errors: [Error!]
+  user: User
+  address: Address
+}
+
+type CustomerBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type CustomerCreate {
+  errors: [Error!]
+  user: User
+}
+
+type CustomerDelete {
+  errors: [Error!]
+  user: User
+}
+
+type CustomerEvent implements Node {
+  id: ID!
+  date: DateTime
+  type: CustomerEventsEnum
+  user(id: ID): User
+  message: String
+  count: Int
+  order: Order
+  orderLine: OrderLine
+}
+
+enum CustomerEventsEnum {
+  ACCOUNT_CREATED
+  PASSWORD_RESET_LINK_SENT
+  PASSWORD_RESET
+  PLACED_ORDER
+  NOTE_ADDED_TO_ORDER
+  DIGITAL_LINK_DOWNLOADED
+  CUSTOMER_DELETED
+  NAME_ASSIGNED
+  EMAIL_ASSIGNED
+  NOTE_ADDED
+}
+
+input CustomerFilterInput {
+  dateJoined: DateRangeInput
+  moneySpent: PriceRangeInput
+  numberOfOrders: IntRangeInput
+  placedOrders: DateRangeInput
+  search: String
+}
+
+input CustomerInput {
+  defaultBillingAddress: AddressInput
+  defaultShippingAddress: AddressInput
+  firstName: String
+  lastName: String
+  email: String
+  isActive: Boolean
+  note: String
+}
+
+type CustomerPasswordReset {
+  errors: [Error!]
+}
+
+input CustomerPasswordResetInput {
+  email: String!
+}
+
+type CustomerRegister {
+  errors: [Error!]
+  user: User
+}
+
+input CustomerRegisterInput {
+  email: String!
+  password: String!
+}
+
+type CustomerSetDefaultAddress {
+  errors: [Error!]
+  user: User
+}
+
+type CustomerUpdate {
+  errors: [Error!]
+  user: User
+}
+
+scalar Date
+
+input DateRangeInput {
+  gte: Date
+  lte: Date
+}
+
+scalar DateTime
+
+input DateTimeRangeInput {
+  gte: DateTime
+  lte: DateTime
+}
+
+scalar Decimal
+
+type DigitalContent implements Node {
+  useDefaultSettings: Boolean!
+  automaticFulfillment: Boolean!
+  productVariant: ProductVariant!
+  contentFile: String!
+  maxDownloads: Int
+  urlValidDays: Int
+  urls: [DigitalContentUrl]
+  id: ID!
+  privateMeta: [MetaStore]!
+  meta: [MetaStore]!
+}
+
+type DigitalContentCountableConnection {
+  pageInfo: PageInfo!
+  edges: [DigitalContentCountableEdge!]!
+  totalCount: Int
+}
+
+type DigitalContentCountableEdge {
+  node: DigitalContent!
+  cursor: String!
+}
+
+type DigitalContentCreate {
+  errors: [Error!]
+  variant: ProductVariant
+  content: DigitalContent
+}
+
+type DigitalContentDelete {
+  errors: [Error!]
+  variant: ProductVariant
+}
+
+input DigitalContentInput {
+  useDefaultSettings: Boolean!
+  maxDownloads: Int
+  urlValidDays: Int
+  automaticFulfillment: Boolean
+}
+
+type DigitalContentUpdate {
+  errors: [Error!]
+  variant: ProductVariant
+  content: DigitalContent
+}
+
+input DigitalContentUploadInput {
+  useDefaultSettings: Boolean!
+  maxDownloads: Int
+  urlValidDays: Int
+  automaticFulfillment: Boolean
+  contentFile: Upload!
+}
+
+type DigitalContentUrl implements Node {
+  token: UUID!
+  content: DigitalContent!
+  created: DateTime!
+  downloadNum: Int!
+  id: ID!
+  url: String
+}
+
+type DigitalContentUrlCreate {
+  errors: [Error!]
+  digitalContentUrl: DigitalContentUrl
+}
+
+input DigitalContentUrlCreateInput {
+  content: ID!
+}
+
+enum DiscountStatusEnum {
+  ACTIVE
+  EXPIRED
+  SCHEDULED
+}
+
+enum DiscountValueTypeEnum {
+  FIXED
+  PERCENTAGE
+}
+
+type Domain {
+  host: String!
+  sslEnabled: Boolean!
+  url: String!
+}
+
+type DraftOrderBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type DraftOrderComplete {
+  errors: [Error!]
+  order: Order
+}
+
+type DraftOrderCreate {
+  errors: [Error!]
+  order: Order
+}
+
+input DraftOrderCreateInput {
+  billingAddress: AddressInput
+  user: ID
+  userEmail: String
+  discount: Decimal
+  shippingAddress: AddressInput
+  shippingMethod: ID
+  voucher: ID
+  lines: [OrderLineCreateInput]
+}
+
+type DraftOrderDelete {
+  errors: [Error!]
+  order: Order
+}
+
+input DraftOrderInput {
+  billingAddress: AddressInput
+  user: ID
+  userEmail: String
+  discount: Decimal
+  shippingAddress: AddressInput
+  shippingMethod: ID
+  voucher: ID
+}
+
+type DraftOrderLineDelete {
+  errors: [Error!]
+  order: Order
+  orderLine: OrderLine
+}
+
+type DraftOrderLineUpdate {
+  errors: [Error!]
+  order: Order
+  orderLine: OrderLine
+}
+
+type DraftOrderLinesBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type DraftOrderLinesCreate {
+  errors: [Error!]
+  order: Order
+  orderLines: [OrderLine!]
+}
+
+type DraftOrderUpdate {
+  errors: [Error!]
+  order: Order
+}
+
+type Error {
+  field: String
+  message: String
+}
+
+type Fulfillment implements Node {
+  id: ID!
+  fulfillmentOrder: Int!
+  status: FulfillmentStatus!
+  trackingNumber: String!
+  shippingDate: DateTime!
+  lines: [FulfillmentLine]
+  statusDisplay: String
+}
+
+type FulfillmentCancel {
+  errors: [Error!]
+  fulfillment: Fulfillment
+  order: Order
+}
+
+input FulfillmentCancelInput {
+  restock: Boolean
+}
+
+type FulfillmentCreate {
+  errors: [Error!]
+  fulfillment: Fulfillment
+  order: Order
+}
+
+input FulfillmentCreateInput {
+  trackingNumber: String
+  notifyCustomer: Boolean
+  lines: [FulfillmentLineInput]!
+}
+
+type FulfillmentLine implements Node {
+  id: ID!
+  quantity: Int!
+  orderLine: OrderLine
+}
+
+input FulfillmentLineInput {
+  orderLineId: ID
+  quantity: Int
+}
+
+enum FulfillmentStatus {
+  FULFILLED
+  CANCELED
+}
+
+type FulfillmentUpdateTracking {
+  errors: [Error!]
+  fulfillment: Fulfillment
+  order: Order
+}
+
+input FulfillmentUpdateTrackingInput {
+  trackingNumber: String
+  notifyCustomer: Boolean
+}
+
+enum GatewaysEnum {
+  DUMMY
+  BRAINTREE
+  RAZORPAY
+  STRIPE
+}
+
+scalar GenericScalar
+
+type Geolocalization {
+  country: CountryDisplay
+}
+
+type GiftCard implements Node {
+  code: String
+  user: User
+  created: DateTime!
+  startDate: Date!
+  endDate: Date
+  lastUsedOn: DateTime
+  isActive: Boolean!
+  initialBalance: Money
+  currentBalance: Money
+  id: ID!
+  displayCode: String
+}
+
+type GiftCardActivate {
+  errors: [Error!]
+  giftCard: GiftCard
+}
+
+type GiftCardCountableConnection {
+  pageInfo: PageInfo!
+  edges: [GiftCardCountableEdge!]!
+  totalCount: Int
+}
+
+type GiftCardCountableEdge {
+  node: GiftCard!
+  cursor: String!
+}
+
+type GiftCardCreate {
+  errors: [Error!]
+  giftCard: GiftCard
+}
+
+input GiftCardCreateInput {
+  startDate: Date
+  endDate: Date
+  balance: Decimal
+  userEmail: String
+  code: String
+}
+
+type GiftCardDeactivate {
+  errors: [Error!]
+  giftCard: GiftCard
+}
+
+type GiftCardUpdate {
+  errors: [Error!]
+  giftCard: GiftCard
+}
+
+input GiftCardUpdateInput {
+  startDate: Date
+  endDate: Date
+  balance: Decimal
+  userEmail: String
+}
+
+type HomepageCollectionUpdate {
+  errors: [Error!]
+  shop: Shop
+}
+
+type Image {
+  url: String!
+  alt: String
+}
+
+input IntRangeInput {
+  gte: Int
+  lte: Int
+}
+
+scalar JSONString
+
+enum LanguageCodeEnum {
+  AR
+  AZ
+  BG
+  BN
+  CA
+  CS
+  DA
+  DE
+  EL
+  EN
+  ES
+  ES_CO
+  ET
+  FA
+  FR
+  HI
+  HU
+  HY
+  ID
+  IS
+  IT
+  JA
+  KO
+  LT
+  MN
+  NB
+  NL
+  PL
+  PT
+  PT_BR
+  RO
+  RU
+  SK
+  SQ
+  SR
+  SW
+  SV
+  TH
+  TR
+  UK
+  VI
+  ZH_HANS
+  ZH_HANT
+}
+
+type LanguageDisplay {
+  code: LanguageCodeEnum!
+  language: String!
+}
+
+type LoggedUserUpdate {
+  errors: [Error!]
+  user: User
+}
+
+type Margin {
+  start: Int
+  stop: Int
+}
+
+type Menu implements Node {
+  id: ID!
+  name: String!
+  items: [MenuItem]
+}
+
+type MenuBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type MenuCountableConnection {
+  pageInfo: PageInfo!
+  edges: [MenuCountableEdge!]!
+  totalCount: Int
+}
+
+type MenuCountableEdge {
+  node: Menu!
+  cursor: String!
+}
+
+type MenuCreate {
+  errors: [Error!]
+  menu: Menu
+}
+
+input MenuCreateInput {
+  name: String!
+  items: [MenuItemInput]
+}
+
+type MenuDelete {
+  errors: [Error!]
+  menu: Menu
+}
+
+input MenuInput {
+  name: String
+}
+
+type MenuItem implements Node {
+  id: ID!
+  sortOrder: Int
+  menu: Menu!
+  name: String!
+  parent: MenuItem
+  category: Category
+  collection: Collection
+  page: Page
+  level: Int!
+  children: [MenuItem]
+  url: String
+  translation(languageCode: LanguageCodeEnum!): MenuItemTranslation
+}
+
+type MenuItemBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type MenuItemCountableConnection {
+  pageInfo: PageInfo!
+  edges: [MenuItemCountableEdge!]!
+  totalCount: Int
+}
+
+type MenuItemCountableEdge {
+  node: MenuItem!
+  cursor: String!
+}
+
+type MenuItemCreate {
+  errors: [Error!]
+  menuItem: MenuItem
+}
+
+input MenuItemCreateInput {
+  name: String!
+  url: String
+  category: ID
+  collection: ID
+  page: ID
+  menu: ID!
+  parent: ID
+}
+
+type MenuItemDelete {
+  errors: [Error!]
+  menuItem: MenuItem
+}
+
+input MenuItemInput {
+  name: String
+  url: String
+  category: ID
+  collection: ID
+  page: ID
+}
+
+type MenuItemMove {
+  errors: [Error!]
+  menu: Menu
+}
+
+input MenuItemMoveInput {
+  itemId: ID!
+  parentId: ID
+  sortOrder: Int
+}
+
+type MenuItemTranslate {
+  errors: [Error!]
+  menuItem: MenuItem
+}
+
+type MenuItemTranslation implements Node {
+  id: ID!
+  name: String!
+  language: LanguageDisplay!
+}
+
+type MenuItemUpdate {
+  errors: [Error!]
+  menuItem: MenuItem
+}
+
+type MenuUpdate {
+  errors: [Error!]
+  menu: Menu
+}
+
+type MetaClientStore {
+  name: String!
+  metadata: [MetaItem]!
+}
+
+input MetaInput {
+  namespace: String!
+  clientName: String!
+  key: String!
+  value: String!
+}
+
+type MetaItem {
+  key: String!
+  value: String!
+}
+
+input MetaPath {
+  namespace: String!
+  clientName: String!
+  key: String!
+}
+
+type MetaStore {
+  namespace: String!
+  clients: [MetaClientStore]!
+}
+
+type Money {
+  currency: String!
+  amount: Float!
+  localized: String!
+}
+
+type MoneyRange {
+  start: Money
+  stop: Money
+}
+
+input MoveProductInput {
+  productId: ID!
+  sortOrder: Int
+}
+
+type Mutations {
+  authorizationKeyAdd(input: AuthorizationKeyInput!, keyType: AuthorizationKeyType!): AuthorizationKeyAdd
+  authorizationKeyDelete(keyType: AuthorizationKeyType!): AuthorizationKeyDelete
+  homepageCollectionUpdate(collection: ID): HomepageCollectionUpdate
+  shopDomainUpdate(input: SiteDomainInput): ShopDomainUpdate
+  shopSettingsUpdate(input: ShopSettingsInput!): ShopSettingsUpdate
+  shopFetchTaxRates: ShopFetchTaxRates
+  shopSettingsTranslate(input: ShopSettingsTranslationInput!, languageCode: LanguageCodeEnum!): ShopSettingsTranslate
+  shopAddressUpdate(input: AddressInput): ShopAddressUpdate
+  shippingPriceCreate(input: ShippingPriceInput!): ShippingPriceCreate
+  shippingPriceDelete(id: ID!): ShippingPriceDelete
+  shippingPriceBulkDelete(ids: [ID]!): ShippingPriceBulkDelete
+  shippingPriceUpdate(id: ID!, input: ShippingPriceInput!): ShippingPriceUpdate
+  shippingPriceTranslate(id: ID!, input: NameTranslationInput!, languageCode: LanguageCodeEnum!): ShippingPriceTranslate
+  shippingZoneCreate(input: ShippingZoneInput!): ShippingZoneCreate
+  shippingZoneDelete(id: ID!): ShippingZoneDelete
+  shippingZoneBulkDelete(ids: [ID]!): ShippingZoneBulkDelete
+  shippingZoneUpdate(id: ID!, input: ShippingZoneInput!): ShippingZoneUpdate
+  attributeCreate(input: AttributeCreateInput!): AttributeCreate
+  attributeDelete(id: ID!): AttributeDelete
+  attributeBulkDelete(ids: [ID]!): AttributeBulkDelete
+  attributeAssign(operations: [AttributeAssignInput]!, productTypeId: ID!): AttributeAssign
+  attributeUnassign(attributeIds: [ID]!, productTypeId: ID!): AttributeUnassign
+  attributeUpdate(id: ID!, input: AttributeUpdateInput!): AttributeUpdate
+  attributeTranslate(id: ID!, input: NameTranslationInput!, languageCode: LanguageCodeEnum!): AttributeTranslate
+  attributeUpdateMetadata(id: ID!, input: MetaInput!): AttributeUpdateMeta
+  attributeClearMetadata(id: ID!, input: MetaPath!): AttributeClearMeta
+  attributeUpdatePrivateMetadata(id: ID!, input: MetaInput!): AttributeUpdatePrivateMeta
+  attributeClearPrivateMetadata(id: ID!, input: MetaPath!): AttributeClearPrivateMeta
+  attributeValueCreate(attribute: ID!, input: AttributeValueCreateInput!): AttributeValueCreate
+  attributeValueDelete(id: ID!): AttributeValueDelete
+  attributeValueBulkDelete(ids: [ID]!): AttributeValueBulkDelete
+  attributeValueUpdate(id: ID!, input: AttributeValueCreateInput!): AttributeValueUpdate
+  attributeValueTranslate(id: ID!, input: NameTranslationInput!, languageCode: LanguageCodeEnum!): AttributeValueTranslate
+  attributeReorderValues(attributeId: ID!, moves: [ReorderInput]!): AttributeReorderValues
+  categoryCreate(input: CategoryInput!, parent: ID): CategoryCreate
+  categoryDelete(id: ID!): CategoryDelete
+  categoryBulkDelete(ids: [ID]!): CategoryBulkDelete
+  categoryUpdate(id: ID!, input: CategoryInput!): CategoryUpdate
+  categoryTranslate(id: ID!, input: TranslationInput!, languageCode: LanguageCodeEnum!): CategoryTranslate
+  categoryUpdateMetadata(id: ID!, input: MetaInput!): CategoryUpdateMeta
+  categoryClearMetadata(id: ID!, input: MetaPath!): CategoryClearMeta
+  categoryUpdatePrivateMetadata(id: ID!, input: MetaInput!): CategoryUpdatePrivateMeta
+  categoryClearPrivateMetadata(id: ID!, input: MetaPath!): CategoryClearPrivateMeta
+  collectionAddProducts(collectionId: ID!, products: [ID]!): CollectionAddProducts
+  collectionCreate(input: CollectionCreateInput!): CollectionCreate
+  collectionDelete(id: ID!): CollectionDelete
+  collectionReorderProducts(collectionId: ID!, moves: [MoveProductInput]!): CollectionReorderProducts
+  collectionBulkDelete(ids: [ID]!): CollectionBulkDelete
+  collectionBulkPublish(ids: [ID]!, isPublished: Boolean!): CollectionBulkPublish
+  collectionRemoveProducts(collectionId: ID!, products: [ID]!): CollectionRemoveProducts
+  collectionUpdate(id: ID!, input: CollectionInput!): CollectionUpdate
+  collectionTranslate(id: ID!, input: TranslationInput!, languageCode: LanguageCodeEnum!): CollectionTranslate
+  collectionUpdateMetadata(id: ID!, input: MetaInput!): CollectionUpdateMeta
+  collectionClearMetadata(id: ID!, input: MetaPath!): CollectionClearMeta
+  collectionUpdatePrivateMetadata(id: ID!, input: MetaInput!): CollectionUpdatePrivateMeta
+  collectionClearPrivateMetadata(id: ID!, input: MetaPath!): CollectionClearPrivateMeta
+  productCreate(input: ProductCreateInput!): ProductCreate
+  productDelete(id: ID!): ProductDelete
+  productBulkDelete(ids: [ID]!): ProductBulkDelete
+  productBulkPublish(ids: [ID]!, isPublished: Boolean!): ProductBulkPublish
+  productUpdate(id: ID!, input: ProductInput!): ProductUpdate
+  productTranslate(id: ID!, input: TranslationInput!, languageCode: LanguageCodeEnum!): ProductTranslate
+  productUpdateMetadata(id: ID!, input: MetaInput!): ProductUpdateMeta
+  productClearMetadata(id: ID!, input: MetaPath!): ProductClearMeta
+  productUpdatePrivateMetadata(id: ID!, input: MetaInput!): ProductUpdatePrivateMeta
+  productClearPrivateMetadata(id: ID!, input: MetaPath!): ProductClearPrivateMeta
+  productImageCreate(input: ProductImageCreateInput!): ProductImageCreate
+  productImageDelete(id: ID!): ProductImageDelete
+  productImageBulkDelete(ids: [ID]!): ProductImageBulkDelete
+  productImageReorder(imagesIds: [ID]!, productId: ID!): ProductImageReorder
+  productImageUpdate(id: ID!, input: ProductImageUpdateInput!): ProductImageUpdate
+  productTypeCreate(input: ProductTypeInput!): ProductTypeCreate
+  productTypeDelete(id: ID!): ProductTypeDelete
+  productTypeBulkDelete(ids: [ID]!): ProductTypeBulkDelete
+  productTypeUpdate(id: ID!, input: ProductTypeInput!): ProductTypeUpdate
+  productTypeReorderAttributes(moves: [ReorderInput]!, productTypeId: ID!, type: AttributeTypeEnum!): ProductTypeReorderAttributes
+  productTypeUpdateMetadata(id: ID!, input: MetaInput!): ProductTypeUpdateMeta
+  productTypeClearMetadata(id: ID!, input: MetaPath!): ProductTypeClearMeta
+  productTypeUpdatePrivateMetadata(id: ID!, input: MetaInput!): ProductTypeUpdatePrivateMeta
+  productTypeClearPrivateMetadata(id: ID!, input: MetaPath!): ProductTypeClearPrivateMeta
+  digitalContentCreate(input: DigitalContentUploadInput!, variantId: ID!): DigitalContentCreate
+  digitalContentDelete(variantId: ID!): DigitalContentDelete
+  digitalContentUpdate(input: DigitalContentInput!, variantId: ID!): DigitalContentUpdate
+  digitalContentUrlCreate(input: DigitalContentUrlCreateInput!): DigitalContentUrlCreate
+  productVariantCreate(input: ProductVariantCreateInput!): ProductVariantCreate
+  productVariantDelete(id: ID!): ProductVariantDelete
+  productVariantBulkDelete(ids: [ID]!): ProductVariantBulkDelete
+  productVariantUpdate(id: ID!, input: ProductVariantInput!): ProductVariantUpdate
+  productVariantTranslate(id: ID!, input: NameTranslationInput!, languageCode: LanguageCodeEnum!): ProductVariantTranslate
+  productVariantUpdateMetadata(id: ID!, input: MetaInput!): ProductVariantUpdateMeta
+  productVariantClearMetadata(id: ID!, input: MetaPath!): ProductVariantClearMeta
+  productVariantUpdatePrivateMetadata(id: ID!, input: MetaInput!): ProductVariantUpdatePrivateMeta
+  productVariantClearPrivateMetadata(id: ID!, input: MetaPath!): ProductVariantClearPrivateMeta
+  variantImageAssign(imageId: ID!, variantId: ID!): VariantImageAssign
+  variantImageUnassign(imageId: ID!, variantId: ID!): VariantImageUnassign
+  paymentCapture(amount: Decimal, paymentId: ID!): PaymentCapture
+  paymentRefund(amount: Decimal, paymentId: ID!): PaymentRefund
+  paymentVoid(paymentId: ID!): PaymentVoid
+  pageCreate(input: PageInput!): PageCreate
+  pageDelete(id: ID!): PageDelete
+  pageBulkDelete(ids: [ID]!): PageBulkDelete
+  pageBulkPublish(ids: [ID]!, isPublished: Boolean!): PageBulkPublish
+  pageUpdate(id: ID!, input: PageInput!): PageUpdate
+  pageTranslate(id: ID!, input: PageTranslationInput!, languageCode: LanguageCodeEnum!): PageTranslate
+  draftOrderComplete(id: ID!): DraftOrderComplete
+  draftOrderCreate(input: DraftOrderCreateInput!): DraftOrderCreate
+  draftOrderDelete(id: ID!): DraftOrderDelete
+  draftOrderBulkDelete(ids: [ID]!): DraftOrderBulkDelete
+  draftOrderLinesBulkDelete(ids: [ID]!): DraftOrderLinesBulkDelete
+  draftOrderLinesCreate(id: ID!, input: [OrderLineCreateInput]!): DraftOrderLinesCreate
+  draftOrderLineDelete(id: ID!): DraftOrderLineDelete
+  draftOrderLineUpdate(id: ID!, input: OrderLineInput!): DraftOrderLineUpdate
+  draftOrderUpdate(id: ID!, input: DraftOrderInput!): DraftOrderUpdate
+  orderAddNote(order: ID!, input: OrderAddNoteInput!): OrderAddNote
+  orderCancel(id: ID!, restock: Boolean!): OrderCancel
+  orderCapture(amount: Decimal!, id: ID!): OrderCapture
+  orderFulfillmentCancel(id: ID!, input: FulfillmentCancelInput!): FulfillmentCancel
+  orderFulfillmentCreate(input: FulfillmentCreateInput!, order: ID): FulfillmentCreate
+  orderFulfillmentUpdateTracking(id: ID!, input: FulfillmentUpdateTrackingInput!): FulfillmentUpdateTracking
+  orderMarkAsPaid(id: ID!): OrderMarkAsPaid
+  orderRefund(amount: Decimal!, id: ID!): OrderRefund
+  orderUpdate(id: ID!, input: OrderUpdateInput!): OrderUpdate
+  orderUpdateShipping(order: ID!, input: OrderUpdateShippingInput): OrderUpdateShipping
+  orderVoid(id: ID!): OrderVoid
+  orderBulkCancel(ids: [ID]!, restock: Boolean!): OrderBulkCancel
+  assignNavigation(menu: ID, navigationType: NavigationType!): AssignNavigation
+  menuCreate(input: MenuCreateInput!): MenuCreate
+  menuDelete(id: ID!): MenuDelete
+  menuBulkDelete(ids: [ID]!): MenuBulkDelete
+  menuUpdate(id: ID!, input: MenuInput!): MenuUpdate
+  menuItemCreate(input: MenuItemCreateInput!): MenuItemCreate
+  menuItemDelete(id: ID!): MenuItemDelete
+  menuItemBulkDelete(ids: [ID]!): MenuItemBulkDelete
+  menuItemUpdate(id: ID!, input: MenuItemInput!): MenuItemUpdate
+  menuItemTranslate(id: ID!, input: NameTranslationInput!, languageCode: LanguageCodeEnum!): MenuItemTranslate
+  menuItemMove(menu: ID!, moves: [MenuItemMoveInput]!): MenuItemMove
+  giftCardActivate(id: ID!): GiftCardActivate
+  giftCardCreate(input: GiftCardCreateInput!): GiftCardCreate
+  giftCardDeactivate(id: ID!): GiftCardDeactivate
+  giftCardUpdate(id: ID!, input: GiftCardUpdateInput!): GiftCardUpdate
+  pluginConfigurationUpdate(id: ID!, input: PluginConfigurationUpdateInput!): PluginConfigurationUpdate
+  saleCreate(input: SaleInput!): SaleCreate
+  saleDelete(id: ID!): SaleDelete
+  saleBulkDelete(ids: [ID]!): SaleBulkDelete
+  saleUpdate(id: ID!, input: SaleInput!): SaleUpdate
+  saleCataloguesAdd(id: ID!, input: CatalogueInput!): SaleAddCatalogues
+  saleCataloguesRemove(id: ID!, input: CatalogueInput!): SaleRemoveCatalogues
+  saleTranslate(id: ID!, input: NameTranslationInput!, languageCode: LanguageCodeEnum!): SaleTranslate
+  voucherCreate(input: VoucherInput!): VoucherCreate
+  voucherDelete(id: ID!): VoucherDelete
+  voucherBulkDelete(ids: [ID]!): VoucherBulkDelete
+  voucherUpdate(id: ID!, input: VoucherInput!): VoucherUpdate
+  voucherCataloguesAdd(id: ID!, input: CatalogueInput!): VoucherAddCatalogues
+  voucherCataloguesRemove(id: ID!, input: CatalogueInput!): VoucherRemoveCatalogues
+  voucherTranslate(id: ID!, input: NameTranslationInput!, languageCode: LanguageCodeEnum!): VoucherTranslate
+  tokenCreate(email: String!, password: String!): CreateToken
+  tokenRefresh(token: String!): Refresh
+  tokenVerify(token: String!): VerifyToken
+  checkoutAddPromoCode(checkoutId: ID!, promoCode: String!): CheckoutAddPromoCode
+  checkoutBillingAddressUpdate(billingAddress: AddressInput!, checkoutId: ID!): CheckoutBillingAddressUpdate
+  checkoutComplete(checkoutId: ID!, storeSource: Boolean = false): CheckoutComplete
+  checkoutCreate(input: CheckoutCreateInput!): CheckoutCreate
+  checkoutCustomerAttach(checkoutId: ID!, customerId: ID!): CheckoutCustomerAttach
+  checkoutCustomerDetach(checkoutId: ID!): CheckoutCustomerDetach
+  checkoutEmailUpdate(checkoutId: ID, email: String!): CheckoutEmailUpdate
+  checkoutLineDelete(checkoutId: ID!, lineId: ID): CheckoutLineDelete
+  checkoutLinesAdd(checkoutId: ID!, lines: [CheckoutLineInput]!): CheckoutLinesAdd
+  checkoutLinesUpdate(checkoutId: ID!, lines: [CheckoutLineInput]!): CheckoutLinesUpdate
+  checkoutRemovePromoCode(checkoutId: ID!, promoCode: String!): CheckoutRemovePromoCode
+  checkoutPaymentCreate(checkoutId: ID!, input: PaymentInput!): CheckoutPaymentCreate
+  checkoutShippingAddressUpdate(checkoutId: ID!, shippingAddress: AddressInput!): CheckoutShippingAddressUpdate
+  checkoutShippingMethodUpdate(checkoutId: ID, shippingMethodId: ID!): CheckoutShippingMethodUpdate
+  checkoutUpdateVoucher(checkoutId: ID!, voucherCode: String): CheckoutUpdateVoucher
+  checkoutUpdateMetadata(id: ID!, input: MetaInput!): CheckoutUpdateMeta
+  checkoutClearMetadata(id: ID!, input: MetaPath!): CheckoutClearStoredMeta
+  checkoutUpdatePrivateMetadata(id: ID!, input: MetaInput!): CheckoutUpdatePrivateMeta
+  checkoutClearPrivateMetadata(id: ID!, input: MetaPath!): CheckoutClearStoredPrivateMeta
+  requestPasswordReset(email: String!): RequestPasswordReset
+  setPassword(id: ID!, input: SetPasswordInput!): SetPassword
+  userUpdateMetadata(id: ID!, input: MetaInput!): UserUpdateMeta
+  userClearStoredMetadata(id: ID!, input: MetaPath!): UserClearStoredMeta
+  accountAddressCreate(input: AddressInput!, type: AddressTypeEnum): AccountAddressCreate
+  accountAddressUpdate(id: ID!, input: AddressInput!): AccountAddressUpdate
+  accountAddressDelete(id: ID!): AccountAddressDelete
+  accountSetDefaultAddress(id: ID!, type: AddressTypeEnum!): AccountSetDefaultAddress
+  accountRegister(input: AccountRegisterInput!): AccountRegister
+  accountUpdate(input: AccountInput!): AccountUpdate
+  accountRequestDeletion: AccountRequestDeletion
+  accountDelete(token: String!): AccountDelete
+  customerPasswordReset(input: CustomerPasswordResetInput!): CustomerPasswordReset
+  customerAddressCreate(input: AddressInput!, type: AddressTypeEnum): CustomerAddressCreate
+  customerSetDefaultAddress(id: ID!, type: AddressTypeEnum!): CustomerSetDefaultAddress
+  customerRegister(input: CustomerRegisterInput!): CustomerRegister
+  loggedUserUpdate(input: UserAddressInput!): LoggedUserUpdate
+  addressCreate(input: AddressInput!, userId: ID!): AddressCreate
+  addressUpdate(id: ID!, input: AddressInput!): AddressUpdate
+  addressDelete(id: ID!): AddressDelete
+  addressSetDefault(addressId: ID!, type: AddressTypeEnum!, userId: ID!): AddressSetDefault
+  customerCreate(input: UserCreateInput!): CustomerCreate
+  customerUpdate(id: ID!, input: CustomerInput!): CustomerUpdate
+  customerDelete(id: ID!): CustomerDelete
+  customerBulkDelete(ids: [ID]!): CustomerBulkDelete
+  staffCreate(input: StaffCreateInput!): StaffCreate
+  staffUpdate(id: ID!, input: StaffInput!): StaffUpdate
+  staffDelete(id: ID!): StaffDelete
+  staffBulkDelete(ids: [ID]!): StaffBulkDelete
+  userAvatarUpdate(image: Upload!): UserAvatarUpdate
+  userAvatarDelete: UserAvatarDelete
+  userBulkSetActive(ids: [ID]!, isActive: Boolean!): UserBulkSetActive
+  userUpdatePrivateMetadata(id: ID!, input: MetaInput!): UserUpdatePrivateMeta
+  userClearStoredPrivateMetadata(id: ID!, input: MetaPath!): UserClearStoredPrivateMeta
+  passwordReset(email: String!): PasswordReset
+}
+
+input NameTranslationInput {
+  name: String
+}
+
+type Navigation {
+  main: Menu
+  secondary: Menu
+}
+
+enum NavigationType {
+  MAIN
+  SECONDARY
+}
+
+interface Node {
+  id: ID!
+}
+
+type Order implements Node {
+  id: ID!
+  created: DateTime!
+  status: OrderStatus!
+  user: User
+  languageCode: String!
+  trackingClientId: String!
+  billingAddress: Address
+  shippingAddress: Address
+  shippingMethod: ShippingMethod
+  shippingPrice: TaxedMoney
+  shippingMethodName: String
+  token: String!
+  voucher: Voucher
+  giftCards: [GiftCard]
+  discountAmount: Money
+  discountName: String!
+  translatedDiscountName: String!
+  displayGrossPrices: Boolean!
+  customerNote: String!
+  weight: Weight
+  fulfillments: [Fulfillment]!
+  lines: [OrderLine]!
+  actions: [OrderAction]!
+  availableShippingMethods: [ShippingMethod]
+  number: String
+  isPaid: Boolean
+  paymentStatus: PaymentChargeStatusEnum
+  paymentStatusDisplay: String
+  payments: [Payment]
+  total: TaxedMoney
+  subtotal: TaxedMoney
+  statusDisplay: String
+  canFinalize: Boolean!
+  totalAuthorized: Money
+  totalCaptured: Money
+  events: [OrderEvent]
+  totalBalance: Money!
+  userEmail: String
+  isShippingRequired: Boolean!
+}
+
+enum OrderAction {
+  CAPTURE
+  MARK_AS_PAID
+  REFUND
+  VOID
+}
+
+type OrderAddNote {
+  errors: [Error!]
+  order: Order
+  event: OrderEvent
+}
+
+input OrderAddNoteInput {
+  message: String
+}
+
+type OrderBulkCancel {
+  errors: [Error!]
+  count: Int!
+}
+
+type OrderCancel {
+  errors: [Error!]
+  order: Order
+}
+
+type OrderCapture {
+  errors: [Error!]
+  order: Order
+}
+
+type OrderCountableConnection {
+  pageInfo: PageInfo!
+  edges: [OrderCountableEdge!]!
+  totalCount: Int
+}
+
+type OrderCountableEdge {
+  node: Order!
+  cursor: String!
+}
+
+enum OrderDirection {
+  ASC
+  DESC
+}
+
+input OrderDraftFilterInput {
+  customer: String
+  created: DateRangeInput
+}
+
+type OrderEvent implements Node {
+  id: ID!
+  date: DateTime
+  type: OrderEventsEnum
+  user(id: ID): User
+  message: String
+  email: String
+  emailType: OrderEventsEmailsEnum
+  amount: Float
+  paymentId: String
+  paymentGateway: String
+  quantity: Int
+  composedId: String
+  orderNumber: String
+  oversoldItems: [String]
+  lines: [OrderEventOrderLineObject]
+  fulfilledItems: [FulfillmentLine]
+}
+
+type OrderEventCountableConnection {
+  pageInfo: PageInfo!
+  edges: [OrderEventCountableEdge!]!
+  totalCount: Int
+}
+
+type OrderEventCountableEdge {
+  node: OrderEvent!
+  cursor: String!
+}
+
+type OrderEventOrderLineObject {
+  quantity: Int
+  orderLine: OrderLine
+  itemName: String
+}
+
+enum OrderEventsEmailsEnum {
+  PAYMENT_CONFIRMATION
+  SHIPPING_CONFIRMATION
+  TRACKING_UPDATED
+  ORDER_CONFIRMATION
+  FULFILLMENT_CONFIRMATION
+  DIGITAL_LINKS
+}
+
+enum OrderEventsEnum {
+  DRAFT_CREATED
+  DRAFT_ADDED_PRODUCTS
+  DRAFT_REMOVED_PRODUCTS
+  PLACED
+  PLACED_FROM_DRAFT
+  OVERSOLD_ITEMS
+  CANCELED
+  ORDER_MARKED_AS_PAID
+  ORDER_FULLY_PAID
+  UPDATED_ADDRESS
+  EMAIL_SENT
+  PAYMENT_CAPTURED
+  PAYMENT_REFUNDED
+  PAYMENT_VOIDED
+  PAYMENT_FAILED
+  FULFILLMENT_CANCELED
+  FULFILLMENT_RESTOCKED_ITEMS
+  FULFILLMENT_FULFILLED_ITEMS
+  TRACKING_UPDATED
+  NOTE_ADDED
+  OTHER
+}
+
+input OrderFilterInput {
+  paymentStatus: [PaymentChargeStatusEnum]
+  status: [OrderStatusFilter]
+  customer: String
+  created: DateRangeInput
+}
+
+type OrderLine implements Node {
+  id: ID!
+  productName: String!
+  translatedProductName: String!
+  productSku: String!
+  isShippingRequired: Boolean!
+  quantity: Int!
+  quantityFulfilled: Int!
+  taxRate: Float!
+  digitalContentUrl: DigitalContentUrl
+  thumbnailUrl(size: Int): String @deprecated(reason: "thumbnailUrl is deprecated, use thumbnail instead")
+  thumbnail(size: Int): Image
+  unitPrice: TaxedMoney
+  variant: ProductVariant
+}
+
+input OrderLineCreateInput {
+  quantity: Int!
+  variantId: ID!
+}
+
+input OrderLineInput {
+  quantity: Int!
+}
+
+type OrderMarkAsPaid {
+  errors: [Error!]
+  order: Order
+}
+
+type OrderRefund {
+  errors: [Error!]
+  order: Order
+}
+
+enum OrderStatus {
+  DRAFT
+  UNFULFILLED
+  PARTIALLY_FULFILLED
+  FULFILLED
+  CANCELED
+}
+
+enum OrderStatusFilter {
+  READY_TO_FULFILL
+  READY_TO_CAPTURE
+  UNFULFILLED
+  PARTIALLY_FULFILLED
+  FULFILLED
+  CANCELED
+}
+
+type OrderUpdate {
+  errors: [Error!]
+  order: Order
+}
+
+input OrderUpdateInput {
+  billingAddress: AddressInput
+  userEmail: String
+  shippingAddress: AddressInput
+}
+
+type OrderUpdateShipping {
+  errors: [Error!]
+  order: Order
+}
+
+input OrderUpdateShippingInput {
+  shippingMethod: ID
+}
+
+type OrderVoid {
+  errors: [Error!]
+  order: Order
+}
+
+type Page implements Node {
+  publicationDate: Date
+  isPublished: Boolean!
+  seoTitle: String
+  seoDescription: String
+  id: ID!
+  slug: String!
+  title: String!
+  content: String!
+  contentJson: JSONString!
+  created: DateTime!
+  availableOn: Date @deprecated(reason: "availableOn is deprecated, use publicationDate instead")
+  isVisible: Boolean @deprecated(reason: "isVisible is deprecated, use isPublished instead")
+  translation(languageCode: LanguageCodeEnum!): PageTranslation
+}
+
+type PageBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type PageBulkPublish {
+  errors: [Error!]
+  count: Int!
+}
+
+type PageCountableConnection {
+  pageInfo: PageInfo!
+  edges: [PageCountableEdge!]!
+  totalCount: Int
+}
+
+type PageCountableEdge {
+  node: Page!
+  cursor: String!
+}
+
+type PageCreate {
+  errors: [Error!]
+  page: Page
+}
+
+type PageDelete {
+  errors: [Error!]
+  page: Page
+}
+
+type PageInfo {
+  hasNextPage: Boolean!
+  hasPreviousPage: Boolean!
+  startCursor: String
+  endCursor: String
+}
+
+input PageInput {
+  slug: String
+  title: String
+  content: String
+  contentJson: JSONString
+  isPublished: Boolean
+  publicationDate: String
+  seo: SeoInput
+}
+
+type PageTranslate {
+  errors: [Error!]
+  page: Page
+}
+
+type PageTranslation implements Node {
+  seoTitle: String
+  seoDescription: String
+  id: ID!
+  title: String!
+  content: String!
+  contentJson: JSONString!
+  language: LanguageDisplay!
+}
+
+input PageTranslationInput {
+  seoTitle: String
+  seoDescription: String
+  title: String
+  content: String
+  contentJson: JSONString
+}
+
+type PageUpdate {
+  errors: [Error!]
+  page: Page
+}
+
+type PasswordReset {
+  errors: [Error!]
+}
+
+type Payment implements Node {
+  id: ID!
+  gateway: String!
+  isActive: Boolean!
+  created: DateTime!
+  modified: DateTime!
+  token: String!
+  checkout: Checkout
+  order: Order
+  billingEmail: String!
+  customerIpAddress: String
+  extraData: String!
+  chargeStatus: PaymentChargeStatusEnum!
+  actions: [OrderAction]!
+  total: Money
+  capturedAmount: Money
+  billingAddress: Address
+  transactions: [Transaction]
+  availableCaptureAmount: Money
+  availableRefundAmount: Money
+  creditCard: CreditCard
+}
+
+type PaymentCapture {
+  errors: [Error!]
+  payment: Payment
+}
+
+enum PaymentChargeStatusEnum {
+  NOT_CHARGED
+  PARTIALLY_CHARGED
+  FULLY_CHARGED
+  PARTIALLY_REFUNDED
+  FULLY_REFUNDED
+}
+
+type PaymentCountableConnection {
+  pageInfo: PageInfo!
+  edges: [PaymentCountableEdge!]!
+  totalCount: Int
+}
+
+type PaymentCountableEdge {
+  node: Payment!
+  cursor: String!
+}
+
+input PaymentInput {
+  gateway: GatewaysEnum!
+  token: String!
+  amount: Decimal
+  billingAddress: AddressInput
+}
+
+type PaymentRefund {
+  errors: [Error!]
+  payment: Payment
+}
+
+type PaymentSource {
+  gateway: String!
+  creditCardInfo: CreditCard
+}
+
+type PaymentVoid {
+  errors: [Error!]
+  payment: Payment
+}
+
+type PermissionDisplay {
+  code: PermissionEnum!
+  name: String!
+}
+
+enum PermissionEnum {
+  MANAGE_USERS
+  MANAGE_STAFF
+  IMPERSONATE_USERS
+  MANAGE_DISCOUNTS
+  MANAGE_GIFT_CARD
+  MANAGE_PLUGINS
+  MANAGE_MENUS
+  MANAGE_ORDERS
+  MANAGE_PAGES
+  MANAGE_PRODUCTS
+  MANAGE_SHIPPING
+  MANAGE_SETTINGS
+  MANAGE_TRANSLATIONS
+}
+
+type PluginConfiguration implements Node {
+  name: String!
+  description: String!
+  active: Boolean!
+  configuration: [ConfigurationItem]
+  id: ID!
+}
+
+type PluginConfigurationCountableConnection {
+  pageInfo: PageInfo!
+  edges: [PluginConfigurationCountableEdge!]!
+  totalCount: Int
+}
+
+type PluginConfigurationCountableEdge {
+  node: PluginConfiguration!
+  cursor: String!
+}
+
+type PluginConfigurationUpdate {
+  errors: [Error!]
+  pluginConfiguration: PluginConfiguration
+}
+
+input PluginConfigurationUpdateInput {
+  active: Boolean
+  configuration: [ConfigurationItemInput]
+}
+
+input PriceRangeInput {
+  gte: Float
+  lte: Float
+}
+
+type Product implements Node {
+  id: ID!
+  publicationDate: Date
+  isPublished: Boolean!
+  seoTitle: String
+  seoDescription: String
+  productType: ProductType!
+  name: String!
+  description: String!
+  descriptionJson: JSONString!
+  category: Category!
+  updatedAt: DateTime
+  chargeTaxes: Boolean!
+  weight: Weight
+  privateMeta: [MetaStore]!
+  meta: [MetaStore]!
+  url: String!
+  thumbnailUrl(size: Int): String @deprecated(reason: "thumbnailUrl is deprecated, use\\n         thumbnail instead")
+  thumbnail(size: Int): Image
+  availability: ProductPricingInfo @deprecated(reason: "Has been renamed to 'pricing'.")
+  pricing: ProductPricingInfo
+  isAvailable: Boolean
+  basePrice: Money
+  price: Money @deprecated(reason: "Has been replaced by 'basePrice'")
+  taxRate: TaxRateType @deprecated(reason: "taxRate is deprecated. Use taxType to obtain taxCode for given tax gateway")
+  taxType: TaxType
+  attributes: [SelectedAttribute!]!
+  purchaseCost: MoneyRange
+  margin: Margin
+  imageById(id: ID): ProductImage
+  variants: [ProductVariant]
+  images: [ProductImage]
+  collections: [Collection]
+  availableOn: Date @deprecated(reason: "availableOn is deprecated, use publicationDate instead")
+  translation(languageCode: LanguageCodeEnum!): ProductTranslation
+  slug: String!
+}
+
+type ProductBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type ProductBulkPublish {
+  errors: [Error!]
+  count: Int!
+}
+
+type ProductClearMeta {
+  errors: [Error!]
+  product: Product
+}
+
+type ProductClearPrivateMeta {
+  errors: [Error!]
+  product: Product
+}
+
+type ProductCountableConnection {
+  pageInfo: PageInfo!
+  edges: [ProductCountableEdge!]!
+  totalCount: Int
+}
+
+type ProductCountableEdge {
+  node: Product!
+  cursor: String!
+}
+
+type ProductCreate {
+  errors: [Error!]
+  product: Product
+}
+
+input ProductCreateInput {
+  attributes: [AttributeValueInput]
+  publicationDate: Date
+  category: ID
+  chargeTaxes: Boolean
+  collections: [ID]
+  description: String
+  descriptionJson: JSONString
+  isPublished: Boolean
+  name: String
+  price: Decimal
+  basePrice: Decimal
+  taxRate: TaxRateType
+  taxCode: String
+  seo: SeoInput
+  weight: WeightScalar
+  sku: String
+  quantity: Int
+  trackInventory: Boolean
+  productType: ID!
+}
+
+type ProductDelete {
+  errors: [Error!]
+  product: Product
+}
+
+input ProductFilterInput {
+  isPublished: Boolean
+  collections: [ID]
+  categories: [ID]
+  price: PriceRangeInput
+  attributes: [AttributeInput]
+  stockAvailability: StockAvailability
+  productType: ID
+  search: String
+}
+
+type ProductImage implements Node {
+  sortOrder: Int
+  id: ID!
+  alt: String!
+  url(size: Int): String!
+}
+
+type ProductImageBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type ProductImageCreate {
+  errors: [Error!]
+  product: Product
+  image: ProductImage
+}
+
+input ProductImageCreateInput {
+  alt: String
+  image: Upload!
+  product: ID!
+}
+
+type ProductImageDelete {
+  errors: [Error!]
+  product: Product
+  image: ProductImage
+}
+
+type ProductImageReorder {
+  errors: [Error!]
+  product: Product
+  images: [ProductImage]
+}
+
+type ProductImageUpdate {
+  errors: [Error!]
+  product: Product
+  image: ProductImage
+}
+
+input ProductImageUpdateInput {
+  alt: String
+}
+
+input ProductInput {
+  attributes: [AttributeValueInput]
+  publicationDate: Date
+  category: ID
+  chargeTaxes: Boolean
+  collections: [ID]
+  description: String
+  descriptionJson: JSONString
+  isPublished: Boolean
+  name: String
+  price: Decimal
+  basePrice: Decimal
+  taxRate: TaxRateType
+  taxCode: String
+  seo: SeoInput
+  weight: WeightScalar
+  sku: String
+  quantity: Int
+  trackInventory: Boolean
+}
+
+input ProductOrder {
+  field: ProductOrderField!
+  direction: OrderDirection!
+}
+
+enum ProductOrderField {
+  NAME
+  PRICE
+  DATE
+}
+
+type ProductPricingInfo {
+  available: Boolean @deprecated(reason: "This has been moved to the parent type as 'is_available'.")
+  onSale: Boolean
+  discount: TaxedMoney
+  discountLocalCurrency: TaxedMoney
+  priceRange: TaxedMoneyRange
+  priceRangeUndiscounted: TaxedMoneyRange
+  priceRangeLocalCurrency: TaxedMoneyRange
+}
+
+type ProductTranslate {
+  errors: [Error!]
+  product: Product
+}
+
+type ProductTranslation implements Node {
+  id: ID!
+  seoTitle: String
+  seoDescription: String
+  name: String!
+  description: String!
+  descriptionJson: JSONString!
+  language: LanguageDisplay!
+}
+
+type ProductType implements Node {
+  id: ID!
+  name: String!
+  hasVariants: Boolean!
+  isShippingRequired: Boolean!
+  isDigital: Boolean!
+  weight: Weight
+  privateMeta: [MetaStore]!
+  meta: [MetaStore]!
+  products(before: String, after: String, first: Int, last: Int): ProductCountableConnection
+  taxRate: TaxRateType
+  taxType: TaxType
+  variantAttributes: [Attribute]
+  productAttributes: [Attribute]
+  availableAttributes(filter: AttributeFilterInput, before: String, after: String, first: Int, last: Int): AttributeCountableConnection
+}
+
+type ProductTypeBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type ProductTypeClearMeta {
+  errors: [Error!]
+  productType: ProductType
+}
+
+type ProductTypeClearPrivateMeta {
+  errors: [Error!]
+  productType: ProductType
+}
+
+enum ProductTypeConfigurable {
+  CONFIGURABLE
+  SIMPLE
+}
+
+type ProductTypeCountableConnection {
+  pageInfo: PageInfo!
+  edges: [ProductTypeCountableEdge!]!
+  totalCount: Int
+}
+
+type ProductTypeCountableEdge {
+  node: ProductType!
+  cursor: String!
+}
+
+type ProductTypeCreate {
+  errors: [Error!]
+  productType: ProductType
+}
+
+type ProductTypeDelete {
+  errors: [Error!]
+  productType: ProductType
+}
+
+enum ProductTypeEnum {
+  DIGITAL
+  SHIPPABLE
+}
+
+input ProductTypeFilterInput {
+  configurable: ProductTypeConfigurable
+  productType: ProductTypeEnum
+}
+
+input ProductTypeInput {
+  name: String
+  hasVariants: Boolean
+  productAttributes: [ID]
+  variantAttributes: [ID]
+  isShippingRequired: Boolean
+  isDigital: Boolean
+  weight: WeightScalar
+  taxRate: TaxRateType
+  taxCode: String
+}
+
+type ProductTypeReorderAttributes {
+  errors: [Error!]
+  productType: ProductType
+}
+
+type ProductTypeUpdate {
+  errors: [Error!]
+  productType: ProductType
+}
+
+type ProductTypeUpdateMeta {
+  errors: [Error!]
+  productType: ProductType
+}
+
+type ProductTypeUpdatePrivateMeta {
+  errors: [Error!]
+  productType: ProductType
+}
+
+type ProductUpdate {
+  errors: [Error!]
+  product: Product
+}
+
+type ProductUpdateMeta {
+  errors: [Error!]
+  product: Product
+}
+
+type ProductUpdatePrivateMeta {
+  errors: [Error!]
+  product: Product
+}
+
+type ProductVariant implements Node {
+  id: ID!
+  sku: String!
+  name: String!
+  product: Product!
+  trackInventory: Boolean!
+  quantity: Int!
+  quantityAllocated: Int!
+  weight: Weight
+  privateMeta: [MetaStore]!
+  meta: [MetaStore]!
+  stockQuantity: Int!
+  priceOverride: Money
+  price: Money @deprecated(reason: "Has been replaced by 'pricing.price_undiscounted'")
+  availability: VariantPricingInfo @deprecated(reason: "Has been renamed to 'pricing'.")
+  pricing: VariantPricingInfo
+  isAvailable: Boolean
+  attributes: [SelectedAttribute!]!
+  costPrice: Money
+  margin: Int
+  quantityOrdered: Int
+  revenue(period: ReportingPeriod): TaxedMoney
+  images: [ProductImage]
+  translation(languageCode: LanguageCodeEnum!): ProductVariantTranslation
+  digitalContent: DigitalContent
+}
+
+type ProductVariantBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type ProductVariantClearMeta {
+  errors: [Error!]
+  productVariant: ProductVariant
+}
+
+type ProductVariantClearPrivateMeta {
+  errors: [Error!]
+  productVariant: ProductVariant
+}
+
+type ProductVariantCountableConnection {
+  pageInfo: PageInfo!
+  edges: [ProductVariantCountableEdge!]!
+  totalCount: Int
+}
+
+type ProductVariantCountableEdge {
+  node: ProductVariant!
+  cursor: String!
+}
+
+type ProductVariantCreate {
+  errors: [Error!]
+  productVariant: ProductVariant
+}
+
+input ProductVariantCreateInput {
+  attributes: [AttributeValueInput]!
+  costPrice: Decimal
+  priceOverride: Decimal
+  sku: String
+  quantity: Int
+  trackInventory: Boolean
+  weight: WeightScalar
+  product: ID!
+}
+
+type ProductVariantDelete {
+  errors: [Error!]
+  productVariant: ProductVariant
+}
+
+input ProductVariantInput {
+  attributes: [AttributeValueInput]
+  costPrice: Decimal
+  priceOverride: Decimal
+  sku: String
+  quantity: Int
+  trackInventory: Boolean
+  weight: WeightScalar
+}
+
+type ProductVariantTranslate {
+  errors: [Error!]
+  productVariant: ProductVariant
+}
+
+type ProductVariantTranslation implements Node {
+  id: ID!
+  name: String!
+  language: LanguageDisplay!
+}
+
+type ProductVariantUpdate {
+  errors: [Error!]
+  productVariant: ProductVariant
+}
+
+type ProductVariantUpdateMeta {
+  errors: [Error!]
+  productVariant: ProductVariant
+}
+
+type ProductVariantUpdatePrivateMeta {
+  errors: [Error!]
+  productVariant: ProductVariant
+}
+
+type Query {
+  translations(kind: TranslatableKinds!, before: String, after: String, first: Int, last: Int): TranslatableItemConnection
+  shop: Shop
+  shippingZone(id: ID!): ShippingZone
+  shippingZones(before: String, after: String, first: Int, last: Int): ShippingZoneCountableConnection
+  digitalContent(id: ID!): DigitalContent
+  digitalContents(query: String, level: Int, before: String, after: String, first: Int, last: Int): DigitalContentCountableConnection
+  attributes(query: String, inCategory: ID, inCollection: ID, filter: AttributeFilterInput, sortBy: AttributeSortingInput, before: String, after: String, first: Int, last: Int): AttributeCountableConnection
+  attribute(id: ID!): Attribute
+  categories(query: String, level: Int, before: String, after: String, first: Int, last: Int): CategoryCountableConnection
+  category(id: ID!): Category
+  collection(id: ID!): Collection
+  collections(filter: CollectionFilterInput, query: String, before: String, after: String, first: Int, last: Int): CollectionCountableConnection
+  product(id: ID!): Product
+  products(filter: ProductFilterInput, attributes: [AttributeScalar], categories: [ID], collections: [ID], priceLte: Float, priceGte: Float, sortBy: ProductOrder, stockAvailability: StockAvailability, query: String, before: String, after: String, first: Int, last: Int): ProductCountableConnection
+  productType(id: ID!): ProductType
+  productTypes(filter: ProductTypeFilterInput, before: String, after: String, first: Int, last: Int): ProductTypeCountableConnection
+  productVariant(id: ID!): ProductVariant
+  productVariants(ids: [ID], before: String, after: String, first: Int, last: Int): ProductVariantCountableConnection
+  reportProductSales(period: ReportingPeriod!, before: String, after: String, first: Int, last: Int): ProductVariantCountableConnection
+  payment(id: ID): Payment
+  payments(before: String, after: String, first: Int, last: Int): PaymentCountableConnection
+  paymentClientToken(gateway: GatewaysEnum): String
+  page(id: ID, slug: String): Page
+  pages(query: String, before: String, after: String, first: Int, last: Int): PageCountableConnection
+  homepageEvents(before: String, after: String, first: Int, last: Int): OrderEventCountableConnection
+  order(id: ID!): Order
+  orders(filter: OrderFilterInput, query: String, created: ReportingPeriod, status: OrderStatusFilter, before: String, after: String, first: Int, last: Int): OrderCountableConnection
+  draftOrders(filter: OrderDraftFilterInput, query: String, created: ReportingPeriod, before: String, after: String, first: Int, last: Int): OrderCountableConnection
+  ordersTotal(period: ReportingPeriod): TaxedMoney
+  orderByToken(token: String!): Order
+  menu(id: ID, name: String): Menu
+  menus(query: String, before: String, after: String, first: Int, last: Int): MenuCountableConnection
+  menuItem(id: ID!): MenuItem
+  menuItems(query: String, before: String, after: String, first: Int, last: Int): MenuItemCountableConnection
+  giftCard(id: ID!): GiftCard
+  giftCards(before: String, after: String, first: Int, last: Int): GiftCardCountableConnection
+  pluginConfiguration(id: ID!): PluginConfiguration
+  pluginConfigurations(before: String, after: String, first: Int, last: Int): PluginConfigurationCountableConnection
+  sale(id: ID!): Sale
+  sales(filter: SaleFilterInput, query: String, before: String, after: String, first: Int, last: Int): SaleCountableConnection
+  voucher(id: ID!): Voucher
+  vouchers(filter: VoucherFilterInput, query: String, before: String, after: String, first: Int, last: Int): VoucherCountableConnection
+  taxTypes: [TaxType]
+  checkout(token: UUID): Checkout
+  checkouts(before: String, after: String, first: Int, last: Int): CheckoutCountableConnection
+  checkoutLine(id: ID): CheckoutLine
+  checkoutLines(before: String, after: String, first: Int, last: Int): CheckoutLineCountableConnection
+  addressValidationRules(countryCode: CountryCode, countryArea: String, cityArea: String): AddressValidationData
+  customers(filter: CustomerFilterInput, query: String, before: String, after: String, first: Int, last: Int): UserCountableConnection
+  me: User
+  staffUsers(filter: StaffUserInput, query: String, before: String, after: String, first: Int, last: Int): UserCountableConnection
+  user(id: ID!): User
+  node(id: ID!): Node
+}
+
+type ReducedRate {
+  rate: Float!
+  rateType: TaxRateType!
+}
+
+type Refresh {
+  token: String
+  payload: GenericScalar
+}
+
+input ReorderInput {
+  id: ID!
+  sortOrder: Int
+}
+
+enum ReportingPeriod {
+  TODAY
+  THIS_MONTH
+}
+
+type RequestPasswordReset {
+  errors: [Error!]
+}
+
+type Sale implements Node {
+  id: ID!
+  name: String!
+  type: SaleType!
+  value: Float!
+  startDate: DateTime!
+  endDate: DateTime
+  categories(before: String, after: String, first: Int, last: Int): CategoryCountableConnection
+  collections(before: String, after: String, first: Int, last: Int): CollectionCountableConnection
+  products(before: String, after: String, first: Int, last: Int): ProductCountableConnection
+  translation(languageCode: LanguageCodeEnum!): SaleTranslation
+}
+
+type SaleAddCatalogues {
+  errors: [Error!]
+  sale: Sale
+}
+
+type SaleBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type SaleCountableConnection {
+  pageInfo: PageInfo!
+  edges: [SaleCountableEdge!]!
+  totalCount: Int
+}
+
+type SaleCountableEdge {
+  node: Sale!
+  cursor: String!
+}
+
+type SaleCreate {
+  errors: [Error!]
+  sale: Sale
+}
+
+type SaleDelete {
+  errors: [Error!]
+  sale: Sale
+}
+
+input SaleFilterInput {
+  status: [DiscountStatusEnum]
+  saleType: DiscountValueTypeEnum
+  started: DateTimeRangeInput
+  search: String
+}
+
+input SaleInput {
+  name: String
+  type: DiscountValueTypeEnum
+  value: Decimal
+  products: [ID]
+  categories: [ID]
+  collections: [ID]
+  startDate: DateTime
+  endDate: DateTime
+}
+
+type SaleRemoveCatalogues {
+  errors: [Error!]
+  sale: Sale
+}
+
+type SaleTranslate {
+  errors: [Error!]
+  sale: Sale
+}
+
+type SaleTranslation implements Node {
+  id: ID!
+  name: String
+  language: LanguageDisplay!
+}
+
+enum SaleType {
+  FIXED
+  PERCENTAGE
+}
+
+type SaleUpdate {
+  errors: [Error!]
+  sale: Sale
+}
+
+type SelectedAttribute {
+  attribute: Attribute!
+  value: AttributeValue @deprecated(reason: "Use values instead.")
+  values: [AttributeValue]!
+}
+
+input SeoInput {
+  title: String
+  description: String
+}
+
+type SetPassword {
+  errors: [Error!]
+  user: User
+}
+
+input SetPasswordInput {
+  token: String!
+  password: String!
+}
+
+type ShippingMethod implements Node {
+  id: ID!
+  name: String!
+  price: Money
+  minimumOrderPrice: Money
+  maximumOrderPrice: Money
+  minimumOrderWeight: Weight
+  maximumOrderWeight: Weight
+  type: ShippingMethodTypeEnum
+  translation(languageCode: LanguageCodeEnum!): ShippingMethodTranslation
+}
+
+type ShippingMethodTranslation implements Node {
+  id: ID!
+  name: String
+  language: LanguageDisplay!
+}
+
+enum ShippingMethodTypeEnum {
+  PRICE
+  WEIGHT
+}
+
+type ShippingPriceBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type ShippingPriceCreate {
+  errors: [Error!]
+  shippingZone: ShippingZone
+  shippingMethod: ShippingMethod
+}
+
+type ShippingPriceDelete {
+  errors: [Error!]
+  shippingMethod: ShippingMethod
+  shippingZone: ShippingZone
+}
+
+input ShippingPriceInput {
+  name: String
+  price: Decimal
+  minimumOrderPrice: Decimal
+  maximumOrderPrice: Decimal
+  minimumOrderWeight: WeightScalar
+  maximumOrderWeight: WeightScalar
+  type: ShippingMethodTypeEnum
+  shippingZone: ID
+}
+
+type ShippingPriceTranslate {
+  errors: [Error!]
+  shippingMethod: ShippingMethod
+}
+
+type ShippingPriceUpdate {
+  errors: [Error!]
+  shippingZone: ShippingZone
+  shippingMethod: ShippingMethod
+}
+
+type ShippingZone implements Node {
+  id: ID!
+  name: String!
+  default: Boolean!
+  priceRange: MoneyRange
+  countries: [CountryDisplay]
+  shippingMethods: [ShippingMethod]
+}
+
+type ShippingZoneBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type ShippingZoneCountableConnection {
+  pageInfo: PageInfo!
+  edges: [ShippingZoneCountableEdge!]!
+  totalCount: Int
+}
+
+type ShippingZoneCountableEdge {
+  node: ShippingZone!
+  cursor: String!
+}
+
+type ShippingZoneCreate {
+  errors: [Error!]
+  shippingZone: ShippingZone
+}
+
+type ShippingZoneDelete {
+  errors: [Error!]
+  shippingZone: ShippingZone
+}
+
+input ShippingZoneInput {
+  name: String
+  countries: [String]
+  default: Boolean
+}
+
+type ShippingZoneUpdate {
+  errors: [Error!]
+  shippingZone: ShippingZone
+}
+
+type Shop {
+  geolocalization: Geolocalization
+  authorizationKeys: [AuthorizationKey]!
+  countries: [CountryDisplay]!
+  currencies: [String]!
+  defaultCurrency: String!
+  defaultCountry: CountryDisplay
+  description: String
+  domain: Domain!
+  homepageCollection: Collection
+  languages: [LanguageDisplay]!
+  name: String!
+  navigation: Navigation
+  permissions: [PermissionDisplay]!
+  phonePrefixes: [String]!
+  headerText: String
+  includeTaxesInPrices: Boolean!
+  displayGrossPrices: Boolean!
+  chargeTaxesOnShipping: Boolean!
+  trackInventoryByDefault: Boolean
+  defaultWeightUnit: WeightUnitsEnum
+  translation(languageCode: LanguageCodeEnum!): ShopTranslation
+  automaticFulfillmentDigitalProducts: Boolean
+  defaultDigitalMaxDownloads: Int
+  defaultDigitalUrlValidDays: Int
+  companyAddress: Address
+}
+
+type ShopAddressUpdate {
+  errors: [Error!]
+  shop: Shop
+}
+
+type ShopDomainUpdate {
+  errors: [Error!]
+  shop: Shop
+}
+
+type ShopFetchTaxRates {
+  errors: [Error!]
+  shop: Shop
+}
+
+input ShopSettingsInput {
+  headerText: String
+  description: String
+  includeTaxesInPrices: Boolean
+  displayGrossPrices: Boolean
+  chargeTaxesOnShipping: Boolean
+  trackInventoryByDefault: Boolean
+  defaultWeightUnit: WeightUnitsEnum
+  automaticFulfillmentDigitalProducts: Boolean
+  defaultDigitalMaxDownloads: Int
+  defaultDigitalUrlValidDays: Int
+}
+
+type ShopSettingsTranslate {
+  errors: [Error!]
+  shop: Shop
+}
+
+input ShopSettingsTranslationInput {
+  headerText: String
+  description: String
+}
+
+type ShopSettingsUpdate {
+  errors: [Error!]
+  shop: Shop
+}
+
+type ShopTranslation implements Node {
+  id: ID!
+  headerText: String!
+  description: String!
+  language: LanguageDisplay!
+}
+
+input SiteDomainInput {
+  domain: String
+  name: String
+}
+
+type StaffBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type StaffCreate {
+  errors: [Error!]
+  user: User
+}
+
+input StaffCreateInput {
+  firstName: String
+  lastName: String
+  email: String
+  isActive: Boolean
+  note: String
+  permissions: [PermissionEnum]
+  sendPasswordEmail: Boolean
+}
+
+type StaffDelete {
+  errors: [Error!]
+  user: User
+}
+
+input StaffInput {
+  firstName: String
+  lastName: String
+  email: String
+  isActive: Boolean
+  note: String
+  permissions: [PermissionEnum]
+}
+
+enum StaffMemberStatus {
+  ACTIVE
+  DEACTIVATED
+}
+
+type StaffUpdate {
+  errors: [Error!]
+  user: User
+}
+
+input StaffUserInput {
+  status: StaffMemberStatus
+  search: String
+}
+
+enum StockAvailability {
+  IN_STOCK
+  OUT_OF_STOCK
+}
+
+enum TaxRateType {
+  ACCOMMODATION
+  ADMISSION_TO_CULTURAL_EVENTS
+  ADMISSION_TO_ENTERTAINMENT_EVENTS
+  ADMISSION_TO_SPORTING_EVENTS
+  ADVERTISING
+  AGRICULTURAL_SUPPLIES
+  BABY_FOODSTUFFS
+  BIKES
+  BOOKS
+  CHILDRENS_CLOTHING
+  DOMESTIC_FUEL
+  DOMESTIC_SERVICES
+  E_BOOKS
+  FOODSTUFFS
+  HOTELS
+  MEDICAL
+  NEWSPAPERS
+  PASSENGER_TRANSPORT
+  PHARMACEUTICALS
+  PROPERTY_RENOVATIONS
+  RESTAURANTS
+  SOCIAL_HOUSING
+  STANDARD
+  WATER
+  WINE
+}
+
+type TaxType {
+  description: String
+  taxCode: String
+}
+
+type TaxedMoney {
+  currency: String!
+  gross: Money!
+  net: Money!
+  tax: Money!
+}
+
+type TaxedMoneyRange {
+  start: TaxedMoney
+  stop: TaxedMoney
+}
+
+type Transaction implements Node {
+  id: ID!
+  created: DateTime!
+  payment: Payment!
+  token: String!
+  kind: TransactionKind!
+  isSuccess: Boolean!
+  error: TransactionError
+  gatewayResponse: JSONString!
+  amount: Money
+}
+
+enum TransactionError {
+  TRANSACTIONERROR_INCORRECT_NUMBER
+  TRANSACTIONERROR_INVALID_NUMBER
+  TRANSACTIONERROR_INCORRECT_CVV
+  TRANSACTIONERROR_INVALID_CVV
+  TRANSACTIONERROR_INCORRECT_ZIP
+  TRANSACTIONERROR_INCORRECT_ADDRESS
+  TRANSACTIONERROR_INVALID_EXPIRY_DATE
+  TRANSACTIONERROR_EXPIRED
+  TRANSACTIONERROR_PROCESSING_ERROR
+  TRANSACTIONERROR_DECLINED
+}
+
+enum TransactionKind {
+  AUTH
+  REFUND
+  CAPTURE
+  VOID
+}
+
+union TranslatableItem = Product | Category | Collection | Attribute | AttributeValue | ProductVariant | Page | ShippingMethod | Sale | Voucher | MenuItem
+
+type TranslatableItemConnection {
+  pageInfo: PageInfo!
+  edges: [TranslatableItemEdge!]!
+  totalCount: Int
+}
+
+type TranslatableItemEdge {
+  node: TranslatableItem!
+  cursor: String!
+}
+
+enum TranslatableKinds {
+  ATTRIBUTE
+  ATTRIBUTE_VALUE
+  CATEGORY
+  COLLECTION
+  MENU_ITEM
+  PAGE
+  PRODUCT
+  SALE
+  SHIPPING_METHOD
+  VARIANT
+  VOUCHER
+}
+
+input TranslationInput {
+  seoTitle: String
+  seoDescription: String
+  name: String
+  description: String
+  descriptionJson: JSONString
+}
+
+scalar UUID
+
+scalar Upload
+
+type User implements Node {
+  id: ID!
+  lastLogin: DateTime
+  email: String!
+  firstName: String!
+  lastName: String!
+  isStaff: Boolean!
+  token: UUID!
+  isActive: Boolean!
+  note: String
+  dateJoined: DateTime!
+  defaultShippingAddress: Address
+  defaultBillingAddress: Address
+  privateMeta: [MetaStore]!
+  meta: [MetaStore]!
+  addresses: [Address]
+  checkout: Checkout
+  giftCards(before: String, after: String, first: Int, last: Int): GiftCardCountableConnection
+  orders(before: String, after: String, first: Int, last: Int): OrderCountableConnection
+  permissions: [PermissionDisplay]
+  avatar(size: Int): Image
+  events: [CustomerEvent]
+  storedPaymentSources: [PaymentSource]
+}
+
+input UserAddressInput {
+  defaultBillingAddress: AddressInput
+  defaultShippingAddress: AddressInput
+}
+
+type UserAvatarDelete {
+  errors: [Error!]
+  user: User
+}
+
+type UserAvatarUpdate {
+  errors: [Error!]
+  user: User
+}
+
+type UserBulkSetActive {
+  errors: [Error!]
+  count: Int!
+}
+
+type UserClearStoredMeta {
+  errors: [Error!]
+  user: User
+}
+
+type UserClearStoredPrivateMeta {
+  errors: [Error!]
+  user: User
+}
+
+type UserCountableConnection {
+  pageInfo: PageInfo!
+  edges: [UserCountableEdge!]!
+  totalCount: Int
+}
+
+type UserCountableEdge {
+  node: User!
+  cursor: String!
+}
+
+input UserCreateInput {
+  defaultBillingAddress: AddressInput
+  defaultShippingAddress: AddressInput
+  firstName: String
+  lastName: String
+  email: String
+  isActive: Boolean
+  note: String
+  sendPasswordEmail: Boolean
+}
+
+type UserUpdateMeta {
+  errors: [Error!]
+  user: User
+}
+
+type UserUpdatePrivateMeta {
+  errors: [Error!]
+  user: User
+}
+
+type VAT {
+  countryCode: String!
+  standardRate: Float
+  reducedRates: [ReducedRate]!
+}
+
+type VariantImageAssign {
+  errors: [Error!]
+  productVariant: ProductVariant
+  image: ProductImage
+}
+
+type VariantImageUnassign {
+  errors: [Error!]
+  productVariant: ProductVariant
+  image: ProductImage
+}
+
+type VariantPricingInfo {
+  available: Boolean @deprecated(reason: "This has been moved to the parent type as 'is_available'.")
+  onSale: Boolean
+  discount: TaxedMoney
+  discountLocalCurrency: TaxedMoney
+  price: TaxedMoney
+  priceUndiscounted: TaxedMoney
+  priceLocalCurrency: TaxedMoney
+}
+
+type VerifyToken {
+  payload: GenericScalar
+  user: User
+}
+
+type Voucher implements Node {
+  id: ID!
+  type: VoucherTypeEnum!
+  name: String
+  code: String!
+  usageLimit: Int
+  used: Int!
+  startDate: DateTime!
+  endDate: DateTime
+  applyOncePerOrder: Boolean!
+  applyOncePerCustomer: Boolean!
+  discountValueType: DiscountValueTypeEnum!
+  discountValue: Float!
+  minAmountSpent: Money
+  minCheckoutItemsQuantity: Int
+  categories(before: String, after: String, first: Int, last: Int): CategoryCountableConnection
+  collections(before: String, after: String, first: Int, last: Int): CollectionCountableConnection
+  products(before: String, after: String, first: Int, last: Int): ProductCountableConnection
+  countries: [CountryDisplay]
+  translation(languageCode: LanguageCodeEnum!): VoucherTranslation
+}
+
+type VoucherAddCatalogues {
+  errors: [Error!]
+  voucher: Voucher
+}
+
+type VoucherBulkDelete {
+  errors: [Error!]
+  count: Int!
+}
+
+type VoucherCountableConnection {
+  pageInfo: PageInfo!
+  edges: [VoucherCountableEdge!]!
+  totalCount: Int
+}
+
+type VoucherCountableEdge {
+  node: Voucher!
+  cursor: String!
+}
+
+type VoucherCreate {
+  errors: [Error!]
+  voucher: Voucher
+}
+
+type VoucherDelete {
+  errors: [Error!]
+  voucher: Voucher
+}
+
+enum VoucherDiscountType {
+  FIXED
+  PERCENTAGE
+  SHIPPING
+}
+
+input VoucherFilterInput {
+  status: [DiscountStatusEnum]
+  timesUsed: IntRangeInput
+  discountType: [VoucherDiscountType]
+  started: DateTimeRangeInput
+  search: String
+}
+
+input VoucherInput {
+  type: VoucherTypeEnum
+  name: String
+  code: String
+  startDate: DateTime
+  endDate: DateTime
+  discountValueType: DiscountValueTypeEnum
+  discountValue: Decimal
+  products: [ID]
+  collections: [ID]
+  categories: [ID]
+  minAmountSpent: Decimal
+  minCheckoutItemsQuantity: Int
+  countries: [String]
+  applyOncePerOrder: Boolean
+  applyOncePerCustomer: Boolean
+  usageLimit: Int
+}
+
+type VoucherRemoveCatalogues {
+  errors: [Error!]
+  voucher: Voucher
+}
+
+type VoucherTranslate {
+  errors: [Error!]
+  voucher: Voucher
+}
+
+type VoucherTranslation implements Node {
+  id: ID!
+  name: String
+  language: LanguageDisplay!
+}
+
+enum VoucherTypeEnum {
+  PRODUCT
+  COLLECTION
+  CATEGORY
+  SHIPPING
+  VALUE
+  ENTIRE_ORDER
+  SPECIFIC_PRODUCT
+}
+
+type VoucherUpdate {
+  errors: [Error!]
+  voucher: Voucher
+}
+
+type Weight {
+  unit: String!
+  value: Float!
+}
+
+scalar WeightScalar
+
+enum WeightUnitsEnum {
+  KG
+  LB
+  OZ
+  G
+}
diff --git a/src/attributes/components/AttributePage/AttributePage.tsx b/src/attributes/components/AttributePage/AttributePage.tsx
index 6cc875c90..209397676 100644
--- a/src/attributes/components/AttributePage/AttributePage.tsx
+++ b/src/attributes/components/AttributePage/AttributePage.tsx
@@ -37,6 +37,7 @@ export interface AttributePageProps {
 }
 
 export interface AttributePageFormData {
+  availableInGrid: boolean;
   filterableInDashboard: boolean;
   inputType: AttributeInputTypeEnum;
   filterableInStorefront: boolean;
@@ -64,6 +65,7 @@ const AttributePage: React.FC<AttributePageProps> = ({
   const initialForm: AttributePageFormData =
     attribute === null
       ? {
+          availableInGrid: true,
           filterableInDashboard: true,
           filterableInStorefront: true,
           inputType: AttributeInputTypeEnum.DROPDOWN,
@@ -74,6 +76,7 @@ const AttributePage: React.FC<AttributePageProps> = ({
           visibleInStorefront: true
         }
       : {
+          availableInGrid: maybe(() => attribute.availableInGrid, true),
           filterableInDashboard: maybe(
             () => attribute.filterableInDashboard,
             true
diff --git a/src/attributes/components/AttributeProperties/AttributeProperties.tsx b/src/attributes/components/AttributeProperties/AttributeProperties.tsx
index 078d16882..e61df33be 100644
--- a/src/attributes/components/AttributeProperties/AttributeProperties.tsx
+++ b/src/attributes/components/AttributeProperties/AttributeProperties.tsx
@@ -105,6 +105,21 @@ const AttributeProperties: React.FC<AttributePropertiesProps> = ({
         }
         onChange={onChange}
       />
+      <FormSpacer />
+      <ControlledSwitch
+        name={"availableInGrid" as keyof AttributePageFormData}
+        checked={data.availableInGrid}
+        disabled={disabled}
+        label={i18n.t("Add to Column Options")}
+        secondLabel={
+          <Typography variant="caption">
+            {i18n.t(
+              "If enable this attribute can be used as a column in product table."
+            )}
+          </Typography>
+        }
+        onChange={onChange}
+      />
     </CardContent>
   </Card>
 );
diff --git a/src/attributes/fixtures.ts b/src/attributes/fixtures.ts
index b55cfa134..118cf9936 100644
--- a/src/attributes/fixtures.ts
+++ b/src/attributes/fixtures.ts
@@ -2,10 +2,12 @@ import {
   AttributeInputTypeEnum,
   AttributeValueType
 } from "@saleor/types/globalTypes";
+import { AttributeDetailsFragment } from "./types/AttributeDetailsFragment";
 import { AttributeList_attributes_edges_node } from "./types/AttributeList";
 
-export const attribute = {
+export const attribute: AttributeDetailsFragment = {
   __typename: "Attribute" as "Attribute",
+  availableInGrid: true,
   filterableInDashboard: false,
   filterableInStorefront: true,
   id: "UHJvZHVjdEF0dHJpYnV0ZTo5",
@@ -20,7 +22,6 @@ export const attribute = {
       id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjI0",
       name: "John Doe",
       slug: "john-doe",
-      sortOrder: 0,
       type: AttributeValueType.STRING,
       value: ""
     },
@@ -29,7 +30,6 @@ export const attribute = {
       id: "UHJvZHVjdEF0dHJpYnV0ZVZhbHVlOjI1",
       name: "Milionare Pirate",
       slug: "milionare-pirate",
-      sortOrder: 1,
       type: AttributeValueType.STRING,
       value: ""
     }
diff --git a/src/attributes/queries.ts b/src/attributes/queries.ts
index e18d7c8c0..5e38d6bec 100644
--- a/src/attributes/queries.ts
+++ b/src/attributes/queries.ts
@@ -22,6 +22,7 @@ export const attributeDetailsFragment = gql`
   ${attributeFragment}
   fragment AttributeDetailsFragment on Attribute {
     ...AttributeFragment
+    availableInGrid
     inputType
     storefrontSearchPosition
     valueRequired
diff --git a/src/attributes/types/AttributeCreate.ts b/src/attributes/types/AttributeCreate.ts
index 9d8eab0a0..9c88aceeb 100644
--- a/src/attributes/types/AttributeCreate.ts
+++ b/src/attributes/types/AttributeCreate.ts
@@ -31,6 +31,7 @@ export interface AttributeCreate_attributeCreate_attribute {
   visibleInStorefront: boolean;
   filterableInDashboard: boolean;
   filterableInStorefront: boolean;
+  availableInGrid: boolean;
   inputType: AttributeInputTypeEnum | null;
   storefrontSearchPosition: number;
   valueRequired: boolean;
diff --git a/src/attributes/types/AttributeDetails.ts b/src/attributes/types/AttributeDetails.ts
index b1826d42e..bacb7d99f 100644
--- a/src/attributes/types/AttributeDetails.ts
+++ b/src/attributes/types/AttributeDetails.ts
@@ -25,6 +25,7 @@ export interface AttributeDetails_attribute {
   visibleInStorefront: boolean;
   filterableInDashboard: boolean;
   filterableInStorefront: boolean;
+  availableInGrid: boolean;
   inputType: AttributeInputTypeEnum | null;
   storefrontSearchPosition: number;
   valueRequired: boolean;
diff --git a/src/attributes/types/AttributeDetailsFragment.ts b/src/attributes/types/AttributeDetailsFragment.ts
index f4c9375f2..1ff07f04e 100644
--- a/src/attributes/types/AttributeDetailsFragment.ts
+++ b/src/attributes/types/AttributeDetailsFragment.ts
@@ -25,6 +25,7 @@ export interface AttributeDetailsFragment {
   visibleInStorefront: boolean;
   filterableInDashboard: boolean;
   filterableInStorefront: boolean;
+  availableInGrid: boolean;
   inputType: AttributeInputTypeEnum | null;
   storefrontSearchPosition: number;
   valueRequired: boolean;
diff --git a/src/attributes/types/AttributeUpdate.ts b/src/attributes/types/AttributeUpdate.ts
index 7ec2e5e7c..5939e98d0 100644
--- a/src/attributes/types/AttributeUpdate.ts
+++ b/src/attributes/types/AttributeUpdate.ts
@@ -31,6 +31,7 @@ export interface AttributeUpdate_attributeUpdate_attribute {
   visibleInStorefront: boolean;
   filterableInDashboard: boolean;
   filterableInStorefront: boolean;
+  availableInGrid: boolean;
   inputType: AttributeInputTypeEnum | null;
   storefrontSearchPosition: number;
   valueRequired: boolean;
diff --git a/src/attributes/types/AttributeValueCreate.ts b/src/attributes/types/AttributeValueCreate.ts
index c5450d981..27eac390a 100644
--- a/src/attributes/types/AttributeValueCreate.ts
+++ b/src/attributes/types/AttributeValueCreate.ts
@@ -31,6 +31,7 @@ export interface AttributeValueCreate_attributeValueCreate_attribute {
   visibleInStorefront: boolean;
   filterableInDashboard: boolean;
   filterableInStorefront: boolean;
+  availableInGrid: boolean;
   inputType: AttributeInputTypeEnum | null;
   storefrontSearchPosition: number;
   valueRequired: boolean;
diff --git a/src/attributes/types/AttributeValueDelete.ts b/src/attributes/types/AttributeValueDelete.ts
index 10c5924e0..9495f4fa7 100644
--- a/src/attributes/types/AttributeValueDelete.ts
+++ b/src/attributes/types/AttributeValueDelete.ts
@@ -31,6 +31,7 @@ export interface AttributeValueDelete_attributeValueDelete_attribute {
   visibleInStorefront: boolean;
   filterableInDashboard: boolean;
   filterableInStorefront: boolean;
+  availableInGrid: boolean;
   inputType: AttributeInputTypeEnum | null;
   storefrontSearchPosition: number;
   valueRequired: boolean;
diff --git a/src/attributes/types/AttributeValueUpdate.ts b/src/attributes/types/AttributeValueUpdate.ts
index d1ccbee1f..ee2856eed 100644
--- a/src/attributes/types/AttributeValueUpdate.ts
+++ b/src/attributes/types/AttributeValueUpdate.ts
@@ -31,6 +31,7 @@ export interface AttributeValueUpdate_attributeValueUpdate_attribute {
   visibleInStorefront: boolean;
   filterableInDashboard: boolean;
   filterableInStorefront: boolean;
+  availableInGrid: boolean;
   inputType: AttributeInputTypeEnum | null;
   storefrontSearchPosition: number;
   valueRequired: boolean;
diff --git a/src/types/globalTypes.ts b/src/types/globalTypes.ts
index 9c48020e2..ee1d14bb7 100644
--- a/src/types/globalTypes.ts
+++ b/src/types/globalTypes.ts
@@ -161,6 +161,7 @@ export enum PermissionEnum {
   MANAGE_MENUS = "MANAGE_MENUS",
   MANAGE_ORDERS = "MANAGE_ORDERS",
   MANAGE_PAGES = "MANAGE_PAGES",
+  MANAGE_PLUGINS = "MANAGE_PLUGINS",
   MANAGE_PRODUCTS = "MANAGE_PRODUCTS",
   MANAGE_SETTINGS = "MANAGE_SETTINGS",
   MANAGE_SHIPPING = "MANAGE_SHIPPING",


Test patch:
diff --git a/src/storybook/__snapshots__/Stories.test.ts.snap b/src/storybook/__snapshots__/Stories.test.ts.snap
index c0f2853af..75311b4d5 100644
--- a/src/storybook/__snapshots__/Stories.test.ts.snap
+++ b/src/storybook/__snapshots__/Stories.test.ts.snap
@@ -7058,6 +7058,57 @@ exports[`Storyshots Views / Attributes / Attribute details create 1`] = `
                   </div>
                 </span>
               </label>
+              <div
+                class="FormSpacer-spacer-id"
+              />
+              <label
+                class="MuiFormControlLabel-root-id"
+              >
+                <span
+                  class="MuiSwitch-root-id"
+                >
+                  <span
+                    class="MuiButtonBase-root-id MuiIconButton-root-id MuiPrivateSwitchBase-root-id MuiSwitch-switchBase-id MuiSwitch-colorPrimary-id MuiPrivateSwitchBase-checked-id MuiSwitch-checked-id"
+                  >
+                    <span
+                      class="MuiIconButton-label-id"
+                    >
+                      <span
+                        class="MuiSwitch-icon-id MuiSwitch-iconChecked-id"
+                      />
+                      <input
+                        checked=""
+                        class="MuiPrivateSwitchBase-input-id"
+                        name="availableInGrid"
+                        type="checkbox"
+                      />
+                    </span>
+                  </span>
+                  <span
+                    class="MuiSwitch-bar-id"
+                  />
+                </span>
+                <span
+                  class="MuiTypography-root-id MuiTypography-body2-id MuiFormControlLabel-label-id"
+                >
+                  <div
+                    class="ControlledSwitch-label-id"
+                  >
+                    <span
+                      class="ControlledSwitch-labelText-id"
+                    >
+                      Add to Column Options
+                    </span>
+                    <div>
+                      <span
+                        class="MuiTypography-root-id MuiTypography-caption-id"
+                      >
+                        If enable this attribute can be used as a column in product table.
+                      </span>
+                    </div>
+                  </div>
+                </span>
+              </label>
             </div>
           </div>
         </div>
@@ -7741,6 +7792,57 @@ exports[`Storyshots Views / Attributes / Attribute details default 1`] = `
                   </div>
                 </span>
               </label>
+              <div
+                class="FormSpacer-spacer-id"
+              />
+              <label
+                class="MuiFormControlLabel-root-id"
+              >
+                <span
+                  class="MuiSwitch-root-id"
+                >
+                  <span
+                    class="MuiButtonBase-root-id MuiIconButton-root-id MuiPrivateSwitchBase-root-id MuiSwitch-switchBase-id MuiSwitch-colorPrimary-id MuiPrivateSwitchBase-checked-id MuiSwitch-checked-id"
+                  >
+                    <span
+                      class="MuiIconButton-label-id"
+                    >
+                      <span
+                        class="MuiSwitch-icon-id MuiSwitch-iconChecked-id"
+                      />
+                      <input
+                        checked=""
+                        class="MuiPrivateSwitchBase-input-id"
+                        name="availableInGrid"
+                        type="checkbox"
+                      />
+                    </span>
+                  </span>
+                  <span
+                    class="MuiSwitch-bar-id"
+                  />
+                </span>
+                <span
+                  class="MuiTypography-root-id MuiTypography-body2-id MuiFormControlLabel-label-id"
+                >
+                  <div
+                    class="ControlledSwitch-label-id"
+                  >
+                    <span
+                      class="ControlledSwitch-labelText-id"
+                    >
+                      Add to Column Options
+                    </span>
+                    <div>
+                      <span
+                        class="MuiTypography-root-id MuiTypography-caption-id"
+                      >
+                        If enable this attribute can be used as a column in product table.
+                      </span>
+                    </div>
+                  </div>
+                </span>
+              </label>
             </div>
           </div>
         </div>
@@ -8434,6 +8536,57 @@ exports[`Storyshots Views / Attributes / Attribute details form errors 1`] = `
                   </div>
                 </span>
               </label>
+              <div
+                class="FormSpacer-spacer-id"
+              />
+              <label
+                class="MuiFormControlLabel-root-id"
+              >
+                <span
+                  class="MuiSwitch-root-id"
+                >
+                  <span
+                    class="MuiButtonBase-root-id MuiIconButton-root-id MuiPrivateSwitchBase-root-id MuiSwitch-switchBase-id MuiSwitch-colorPrimary-id MuiPrivateSwitchBase-checked-id MuiSwitch-checked-id"
+                  >
+                    <span
+                      class="MuiIconButton-label-id"
+                    >
+                      <span
+                        class="MuiSwitch-icon-id MuiSwitch-iconChecked-id"
+                      />
+                      <input
+                        checked=""
+                        class="MuiPrivateSwitchBase-input-id"
+                        name="availableInGrid"
+                        type="checkbox"
+                      />
+                    </span>
+                  </span>
+                  <span
+                    class="MuiSwitch-bar-id"
+                  />
+                </span>
+                <span
+                  class="MuiTypography-root-id MuiTypography-body2-id MuiFormControlLabel-label-id"
+                >
+                  <div
+                    class="ControlledSwitch-label-id"
+                  >
+                    <span
+                      class="ControlledSwitch-labelText-id"
+                    >
+                      Add to Column Options
+                    </span>
+                    <div>
+                      <span
+                        class="MuiTypography-root-id MuiTypography-caption-id"
+                      >
+                        If enable this attribute can be used as a column in product table.
+                      </span>
+                    </div>
+                  </div>
+                </span>
+              </label>
             </div>
           </div>
         </div>
@@ -9061,6 +9214,59 @@ exports[`Storyshots Views / Attributes / Attribute details loading 1`] = `
                   </div>
                 </span>
               </label>
+              <div
+                class="FormSpacer-spacer-id"
+              />
+              <label
+                class="MuiFormControlLabel-root-id MuiFormControlLabel-disabled-id"
+              >
+                <span
+                  class="MuiSwitch-root-id"
+                >
+                  <span
+                    class="MuiButtonBase-root-id MuiButtonBase-disabled-id MuiIconButton-root-id MuiIconButton-disabled-id MuiPrivateSwitchBase-root-id MuiSwitch-switchBase-id MuiSwitch-colorPrimary-id MuiPrivateSwitchBase-checked-id MuiSwitch-checked-id MuiPrivateSwitchBase-disabled-id MuiSwitch-disabled-id"
+                    tabindex="-1"
+                  >
+                    <span
+                      class="MuiIconButton-label-id"
+                    >
+                      <span
+                        class="MuiSwitch-icon-id MuiSwitch-iconChecked-id"
+                      />
+                      <input
+                        checked=""
+                        class="MuiPrivateSwitchBase-input-id"
+                        disabled=""
+                        name="availableInGrid"
+                        type="checkbox"
+                      />
+                    </span>
+                  </span>
+                  <span
+                    class="MuiSwitch-bar-id"
+                  />
+                </span>
+                <span
+                  class="MuiTypography-root-id MuiTypography-body2-id MuiFormControlLabel-label-id MuiFormControlLabel-disabled-id"
+                >
+                  <div
+                    class="ControlledSwitch-label-id"
+                  >
+                    <span
+                      class="ControlledSwitch-labelText-id"
+                    >
+                      Add to Column Options
+                    </span>
+                    <div>
+                      <span
+                        class="MuiTypography-root-id MuiTypography-caption-id"
+                      >
+                        If enable this attribute can be used as a column in product table.
+                      </span>
+                    </div>
+                  </div>
+                </span>
+              </label>
             </div>
           </div>
         </div>
@@ -9744,6 +9950,57 @@ exports[`Storyshots Views / Attributes / Attribute details multiple select input
                   </div>
                 </span>
               </label>
+              <div
+                class="FormSpacer-spacer-id"
+              />
+              <label
+                class="MuiFormControlLabel-root-id"
+              >
+                <span
+                  class="MuiSwitch-root-id"
+                >
+                  <span
+                    class="MuiButtonBase-root-id MuiIconButton-root-id MuiPrivateSwitchBase-root-id MuiSwitch-switchBase-id MuiSwitch-colorPrimary-id MuiPrivateSwitchBase-checked-id MuiSwitch-checked-id"
+                  >
+                    <span
+                      class="MuiIconButton-label-id"
+                    >
+                      <span
+                        class="MuiSwitch-icon-id MuiSwitch-iconChecked-id"
+                      />
+                      <input
+                        checked=""
+                        class="MuiPrivateSwitchBase-input-id"
+                        name="availableInGrid"
+                        type="checkbox"
+                      />
+                    </span>
+                  </span>
+                  <span
+                    class="MuiSwitch-bar-id"
+                  />
+                </span>
+                <span
+                  class="MuiTypography-root-id MuiTypography-body2-id MuiFormControlLabel-label-id"
+                >
+                  <div
+                    class="ControlledSwitch-label-id"
+                  >
+                    <span
+                      class="ControlledSwitch-labelText-id"
+                    >
+                      Add to Column Options
+                    </span>
+                    <div>
+                      <span
+                        class="MuiTypography-root-id MuiTypography-caption-id"
+                      >
+                        If enable this attribute can be used as a column in product table.
+                      </span>
+                    </div>
+                  </div>
+                </span>
+              </label>
             </div>
           </div>
         </div>
@@ -10355,6 +10612,57 @@ exports[`Storyshots Views / Attributes / Attribute details no values 1`] = `
                   </div>
                 </span>
               </label>
+              <div
+                class="FormSpacer-spacer-id"
+              />
+              <label
+                class="MuiFormControlLabel-root-id"
+              >
+                <span
+                  class="MuiSwitch-root-id"
+                >
+                  <span
+                    class="MuiButtonBase-root-id MuiIconButton-root-id MuiPrivateSwitchBase-root-id MuiSwitch-switchBase-id MuiSwitch-colorPrimary-id MuiPrivateSwitchBase-checked-id MuiSwitch-checked-id"
+                  >
+                    <span
+                      class="MuiIconButton-label-id"
+                    >
+                      <span
+                        class="MuiSwitch-icon-id MuiSwitch-iconChecked-id"
+                      />
+                      <input
+                        checked=""
+                        class="MuiPrivateSwitchBase-input-id"
+                        name="availableInGrid"
+                        type="checkbox"
+                      />
+                    </span>
+                  </span>
+                  <span
+                    class="MuiSwitch-bar-id"
+                  />
+                </span>
+                <span
+                  class="MuiTypography-root-id MuiTypography-body2-id MuiFormControlLabel-label-id"
+                >
+                  <div
+                    class="ControlledSwitch-label-id"
+                  >
+                    <span
+                      class="ControlledSwitch-labelText-id"
+                    >
+                      Add to Column Options
+                    </span>
+                    <div>
+                      <span
+                        class="MuiTypography-root-id MuiTypography-caption-id"
+                      >
+                        If enable this attribute can be used as a column in product table.
+                      </span>
+                    </div>
+                  </div>
+                </span>
+              </label>
             </div>
           </div>
         </div>