@mframework/layer-commerce 0.0.7 → 0.0.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (206) hide show
  1. package/app/components/catalog/product/ProductAccordion/ProductAccordion.vue +41 -0
  2. package/app/components/catalog/product/ProductAccordion/__tests__/ProductAccordion.spec.ts +15 -0
  3. package/app/components/catalog/product/ProductAccordion/types.ts +5 -0
  4. package/app/components/catalog/product/ProductProperties/ProductProperties.vue +52 -0
  5. package/app/components/catalog/product/ProductProperties/__tests__/ProductProperties.spec.ts +15 -0
  6. package/app/components/catalog/product/ProductProperties/types.ts +5 -0
  7. package/app/components/catalog/product/ProductSlider/ProductSlider.vue +28 -0
  8. package/app/components/catalog/product/ProductSlider/__tests__/ProductSlider.spec.ts +14 -0
  9. package/app/components/catalog/product/ProductSlider/types.ts +7 -0
  10. package/app/components/catalog/product/RecommendedProducts/RecommendedProducts.vue +12 -0
  11. package/app/components/catalog/product/RecommendedProducts/types.ts +5 -0
  12. package/app/components/catalog/product/RenderContentProductSlider/RenderContentProductSlider.vue +11 -0
  13. package/app/components/catalog/product/add-attribute.vue +54 -0
  14. package/app/components/catalog/product/add-product-type.vue +54 -0
  15. package/app/components/catalog/product/add-product.vue +53 -0
  16. package/app/components/catalog/product/add-showcase.vue +52 -0
  17. package/app/components/catalog/product/add-station.vue +54 -0
  18. package/app/components/catalog/product/bestsellers.vue +69 -0
  19. package/app/components/catalog/product/bidding.vue +93 -0
  20. package/app/components/catalog/product/colorOptions.vue +58 -0
  21. package/app/components/catalog/product/deals.vue +61 -0
  22. package/app/components/catalog/product/exclusives.vue +58 -0
  23. package/app/components/catalog/product/featuredproducts.vue +69 -0
  24. package/app/components/catalog/product/giftCard.vue +63 -0
  25. package/app/components/catalog/product/latestproducts.vue +58 -0
  26. package/app/components/catalog/product/productCard.vue +71 -0
  27. package/app/components/catalog/product/productCompare.vue +60 -0
  28. package/app/components/catalog/product/productCompareTable.vue +441 -0
  29. package/app/components/catalog/product/productDetails.vue +120 -0
  30. package/app/components/catalog/product/productFaqs.vue +17 -0
  31. package/app/components/catalog/product/productGallery.vue +16 -0
  32. package/app/components/catalog/product/productQty.vue +54 -0
  33. package/app/components/catalog/product/productReviews.vue +56 -0
  34. package/app/components/catalog/product/productSpecs.vue +116 -0
  35. package/app/components/catalog/product/radiostation.vue +36 -0
  36. package/app/components/catalog/product/recentlyviewed.vue +43 -0
  37. package/app/components/catalog/product/relatedbrands.vue +54 -0
  38. package/app/components/catalog/product/relatedproducts.vue +58 -0
  39. package/app/components/catalog/product/relatedstations.vue +40 -0
  40. package/app/components/catalog/product/shippingOptions.vue +41 -0
  41. package/app/components/catalog/product/sizeOptions.vue +47 -0
  42. package/app/components/catalog/product/update-attribute-set.vue +209 -0
  43. package/app/components/catalog/product/update-attribute.vue +118 -0
  44. package/app/components/catalog/product/update-product.vue +372 -0
  45. package/app/components/catalog/product/update-showcase.vue +153 -0
  46. package/app/components/catalog/shops/relatedstores.vue +52 -0
  47. package/app/components/catalog/shops/restaurant.vue +66 -0
  48. package/app/components/catalog/shops/stores.vue +44 -0
  49. package/app/components/catalog/vendor/README.md +3 -0
  50. package/app/components/catalog/vendor/blocks/biggestcustomers.vue +33 -0
  51. package/app/components/catalog/vendor/blocks/lowestselling.vue +33 -0
  52. package/app/components/catalog/vendor/blocks/topcategories.vue +33 -0
  53. package/app/components/catalog/vendor/blocks/topproducts.vue +27 -0
  54. package/app/components/catalog/vendor/pages/attributes.vue +43 -0
  55. package/app/components/catalog/vendor/pages/commissions.vue +43 -0
  56. package/app/components/catalog/vendor/pages/crm.vue +67 -0
  57. package/app/components/catalog/vendor/pages/dashboard.vue +46 -0
  58. package/app/components/catalog/vendor/pages/emails.vue +43 -0
  59. package/app/components/catalog/vendor/pages/enquiries.vue +43 -0
  60. package/app/components/catalog/vendor/pages/invoices.vue +43 -0
  61. package/app/components/catalog/vendor/pages/orders.vue +68 -0
  62. package/app/components/catalog/vendor/pages/products.vue +55 -0
  63. package/app/components/catalog/vendor/pages/reviews.vue +48 -0
  64. package/app/components/catalog/vendor/pages/shipments.vue +43 -0
  65. package/app/components/catalog/vendor/pages/stores.vue +43 -0
  66. package/app/components/content/blocks/breadcrumbs.vue +0 -0
  67. package/app/components/content/blocks/currencySwitcher.vue +0 -0
  68. package/app/components/content/blocks/languageSwitcher.vue +0 -0
  69. package/app/components/content/blocks/videoproduct.vue +9 -0
  70. package/app/components/content/pages/checkout.vue +118 -0
  71. package/app/components/content/pages/meeoviGlobal.vue +68 -0
  72. package/app/components/content/pages/pickup-locations.vue +238 -0
  73. package/app/components/content/pages/showcases.vue +90 -0
  74. package/app/components/content/pages/success.vue +60 -0
  75. package/app/components/marketing/add-brand.vue +54 -0
  76. package/app/components/marketing/add-incentive.vue +54 -0
  77. package/app/components/marketing/promotions/giftcards.vue +127 -0
  78. package/app/components/marketing/promotions/subscriptions.vue +134 -0
  79. package/app/components/marketing/update-incentive.vue +326 -0
  80. package/app/components/menus/lowernav.vue +78 -0
  81. package/app/components/partials/LocaleSelector.vue +24 -0
  82. package/app/components/partials/ShoppingCart.vue +128 -0
  83. package/app/components/partials/StripePayment.vue +149 -0
  84. package/app/components/partials/addToCartBtn.vue +40 -0
  85. package/app/components/partials/cartItem.vue +124 -0
  86. package/app/components/partials/checkoutButton.vue +44 -0
  87. package/app/components/partials/compareBtn.vue +68 -0
  88. package/app/components/partials/ratings.vue +13 -0
  89. package/app/components/partials/store/CurrencySelector.vue +133 -0
  90. package/app/components/partials/store/StoreSwitcher.vue +13 -0
  91. package/app/components/related/brandCard.vue +41 -0
  92. package/app/components/related/incentiveCard.vue +44 -0
  93. package/app/components/related/invoiceCard.vue +43 -0
  94. package/app/components/related/orderCard.vue +43 -0
  95. package/app/components/related/relatedproducts.vue +17 -0
  96. package/app/components/sales/CartPageContent/CartPageContent.vue +43 -0
  97. package/app/components/sales/CheckoutAddress/CheckoutAddress.vue +50 -0
  98. package/app/components/sales/CheckoutAddress/__tests__/CheckoutAddress.spec.ts +16 -0
  99. package/app/components/sales/CheckoutAddress/types.ts +16 -0
  100. package/app/components/sales/CheckoutPayment/CheckoutPayment.vue +65 -0
  101. package/app/components/sales/CheckoutPayment/__tests__/CheckoutPayment.spec.ts +14 -0
  102. package/app/components/sales/CheckoutPayment/types.ts +12 -0
  103. package/app/components/sales/OrderSummary/OrderSummary.vue +57 -0
  104. package/app/components/sales/OrderSummary/__tests__/ContactInformation.spec.ts +52 -0
  105. package/app/components/sales/OrderSummary/types.ts +5 -0
  106. package/app/components/sales/incentives.vue +247 -0
  107. package/app/components/sales/invoices.vue +107 -0
  108. package/app/components/sales/orders.vue +378 -0
  109. package/app/components/sales/shipments.vue +65 -0
  110. package/app/components/sales/transactions.vue +109 -0
  111. package/app/components/shop/add-shop.vue +54 -0
  112. package/app/components/shop/cart/cartItem.vue +182 -0
  113. package/app/components/shop/cart/checkout.vue +415 -0
  114. package/app/components/shop/checkout/StripeCardElement.vue +206 -0
  115. package/app/components/shop/checkout/StripeCheckout.vue +49 -0
  116. package/app/components/shop/checkout/addressBilling.vue +263 -0
  117. package/app/components/shop/checkout/addressShipping.vue +175 -0
  118. package/app/components/shop/checkout/cart/ProductItem.vue +56 -0
  119. package/app/components/shop/checkout/cart/PromotionItem.vue +53 -0
  120. package/app/stores/cart.ts +1 -1
  121. package/app/types/Direction.type.ts +1 -1
  122. package/app/types/Global.type.ts +6 -6
  123. package/app/types/Layout.type.ts +1 -1
  124. package/app/{normalizers → types/normalizers}/Cart.query.ts +1 -1
  125. package/app/{normalizers → types/normalizers}/Cart.type.ts +2 -2
  126. package/app/{normalizers → types/normalizers}/Checkout.query.ts +2 -2
  127. package/app/{normalizers → types/normalizers}/Config.query.ts +1 -1
  128. package/app/{normalizers → types/normalizers}/Config.type.ts +1 -1
  129. package/app/{normalizers → types/normalizers}/ContactForm.query.ts +2 -2
  130. package/app/{normalizers → types/normalizers}/CreditMemo.type.ts +1 -1
  131. package/app/{normalizers → types/normalizers}/GiftCard.type.ts +1 -1
  132. package/app/{normalizers → types/normalizers}/Invoice.type.ts +1 -1
  133. package/app/{normalizers → types/normalizers}/MyAccount.query.ts +1 -1
  134. package/app/{normalizers → types/normalizers}/MyAccount.type.ts +1 -1
  135. package/app/{normalizers → types/normalizers}/NewsletterSubscription.query.ts +1 -1
  136. package/app/{normalizers → types/normalizers}/Order.query.ts +1 -1
  137. package/app/{normalizers → types/normalizers}/Order.type.ts +2 -2
  138. package/app/{normalizers → types/normalizers}/Payment.type.ts +1 -1
  139. package/app/{normalizers → types/normalizers}/ProductCompare.query.ts +1 -1
  140. package/app/{normalizers → types/normalizers}/ProductCompare.type.ts +1 -1
  141. package/app/{normalizers → types/normalizers}/ProductList.query.ts +2 -2
  142. package/app/{normalizers → types/normalizers}/ProductList.type.ts +2 -2
  143. package/app/{normalizers → types/normalizers}/Return.type.ts +1 -1
  144. package/app/{normalizers → types/normalizers}/Review.query.ts +1 -1
  145. package/app/{normalizers → types/normalizers}/Review.type.ts +1 -1
  146. package/app/{normalizers → types/normalizers}/StoreInPickUp.query.ts +1 -1
  147. package/app/{normalizers → types/normalizers}/Subscription.type.ts +1 -1
  148. package/app/{normalizers → types/normalizers}/Transaction.type.ts +1 -1
  149. package/app/{normalizers → types/normalizers}/UrlRewrites.query.ts +1 -1
  150. package/app/{normalizers → types/normalizers}/UrlRewrites.type.ts +1 -1
  151. package/app/{normalizers → types/normalizers}/Wishlist.query.ts +4 -4
  152. package/app/{normalizers → types/normalizers}/Wishlist.type.ts +1 -1
  153. package/app/utils/Address/Address.type.ts +1 -1
  154. package/app/utils/Address/index.ts +5 -5
  155. package/app/utils/Cart/Cart.ts +1 -1
  156. package/app/utils/Currency/Currency.ts +1 -1
  157. package/app/utils/History/History.type.ts +1 -1
  158. package/app/utils/Menu/Menu.ts +1 -1
  159. package/app/utils/Menu/Menu.type.ts +2 -2
  160. package/app/utils/Orders/Orders.ts +1 -1
  161. package/app/utils/Preload/CategoryPreload.ts +2 -2
  162. package/app/utils/Preload/ProductPreload.ts +1 -1
  163. package/app/utils/Preload/index.ts +1 -1
  164. package/app/utils/Price/Price.ts +1 -1
  165. package/app/utils/Product/Extract.ts +1 -1
  166. package/app/utils/Product/Product.ts +1 -1
  167. package/app/utils/Product/Product.type.ts +1 -1
  168. package/app/utils/Product/Transform.ts +1 -1
  169. package/app/utils/Wishlist/Wishlist.ts +1 -1
  170. package/app/utils/client.ts +19 -19
  171. package/package.json +1 -2
  172. package/tsconfig.json +2 -2
  173. package/app/cart/useCart.ts +0 -1
  174. /package/app/{components → composables}/ChevronIcon/ChevronIcon.config.ts +0 -0
  175. /package/app/{components → composables}/DateSelect/DateSelect.config.ts +0 -0
  176. /package/app/{components → composables}/Field/Field.config.ts +0 -0
  177. /package/app/{components → composables}/FieldDate/FieldDate.config.ts +0 -0
  178. /package/app/{components → composables}/Form/Form.type.ts +0 -0
  179. /package/app/{components → composables}/Product/Product.config.ts +0 -0
  180. /package/app/{components → composables}/Product/Stock.config.ts +0 -0
  181. /package/app/{components → composables}/ProductCustomizableOption/ProductCustomizableOption.config.ts +0 -0
  182. /package/app/{components → composables}/ProductGallery/ProductGallery.config.ts +0 -0
  183. /package/app/{components → composables}/ProductReviews/ProductReviews.config.ts +0 -0
  184. /package/app/{normalizers → types/normalizers}/Category.query.ts +0 -0
  185. /package/app/{normalizers → types/normalizers}/Category.type.ts +0 -0
  186. /package/app/{normalizers → types/normalizers}/CheckEmail.query.ts +0 -0
  187. /package/app/{normalizers → types/normalizers}/Checkout.type.ts +0 -0
  188. /package/app/{normalizers → types/normalizers}/CmsBlock.query.ts +0 -0
  189. /package/app/{normalizers → types/normalizers}/CmsBlock.type.ts +0 -0
  190. /package/app/{normalizers → types/normalizers}/CmsPage.query.ts +0 -0
  191. /package/app/{normalizers → types/normalizers}/CmsPage.type.ts +0 -0
  192. /package/app/{normalizers → types/normalizers}/Menu.query.ts +0 -0
  193. /package/app/{normalizers → types/normalizers}/Menu.type.ts +0 -0
  194. /package/app/{normalizers → types/normalizers}/ProductAlerts.query.ts +0 -0
  195. /package/app/{normalizers → types/normalizers}/Region.query.ts +0 -0
  196. /package/app/{normalizers → types/normalizers}/Region.type.ts +0 -0
  197. /package/app/{normalizers → types/normalizers}/Slider.query.ts +0 -0
  198. /package/app/{normalizers → types/normalizers}/Slider.type.ts +0 -0
  199. /package/app/{normalizers → types/normalizers}/StoreInPickUp.type.ts +0 -0
  200. /package/app/{routes → types/routes}/CategoryPage/CategoryPage.config.ts +0 -0
  201. /package/app/{routes → types/routes}/CategoryPage/CategoryPage.type.ts +0 -0
  202. /package/app/{routes → types/routes}/Checkout/Checkout.config.ts +0 -0
  203. /package/app/{routes → types/routes}/Checkout/Checkout.type.ts +0 -0
  204. /package/app/{routes → types/routes}/MyAccount/MyAccount.config.ts +0 -0
  205. /package/app/{routes → types/routes}/SearchPage/SearchPage.config.ts +0 -0
  206. /package/app/{routes → types/routes}/UrlRewrites/UrlRewrites.config.ts +0 -0
@@ -0,0 +1,118 @@
1
+ <template>
2
+ <v-row justify="center">
3
+ <v-dialog v-model="dialog" :scrim="false" transition="dialog-bottom-transition">
4
+ <template v-slot:activator="{ props }">
5
+ <v-btn v-bind="props" class="rightAddBtn">
6
+ <v-icon start icon="fas:fa fa-plus"></v-icon>Add Attribute
7
+ </v-btn>
8
+ </template>
9
+ <v-card>
10
+ <form method="post" @v-on:submit.prevent="addAttribute()">
11
+ <v-toolbar dark color="primary">
12
+ <v-btn icon dark @click="dialog = false">
13
+ <v-icon icon="fas:fa fa-circle-xmark"></v-icon>
14
+ </v-btn>
15
+ <v-card-title>
16
+ <span class="text-h6">Create new Attribute</span>
17
+ </v-card-title>
18
+ </v-toolbar>
19
+ <v-card-text>
20
+ <v-container>
21
+ <v-row>
22
+ <v-col cols="12">
23
+ <v-text-field v-model="name" id="addressName" label="Attribute Name*" required></v-text-field>
24
+ </v-col>
25
+ <v-col cols="12">
26
+ <v-textarea v-model="content" label="Description" id="addressDescription">
27
+ </v-textarea>
28
+ </v-col>
29
+ <v-col cols="6">
30
+ <v-text-field v-model="meta_title" label="Meta Name" id="addressName"></v-text-field>
31
+ </v-col>
32
+ <v-col cols="6">
33
+ <v-text-field v-model="meta_keywords" label="Meta Keywords"></v-text-field>
34
+ </v-col>
35
+ <v-col cols="12">
36
+ <v-textarea v-model="meta_description" label="Meta Description" id="addressDescription"></v-textarea>
37
+ </v-col>
38
+ </v-row>
39
+ </v-container>
40
+ <small>*indicates required field</small>
41
+ </v-card-text>
42
+ <v-card-actions>
43
+ <v-spacer></v-spacer>
44
+ <v-btn color="blue-darken-1" variant="text" @click="dialog = false">
45
+ Close
46
+ </v-btn>
47
+ <v-btn color="blue-darken-1" variant="text" @click="dialog = false">
48
+ Save
49
+ </v-btn>
50
+ </v-card-actions>
51
+ </form>
52
+ </v-card>
53
+ </v-dialog>
54
+ </v-row>
55
+ </template>
56
+
57
+ <script setup>
58
+ import {
59
+ ref
60
+ } from 'vue'
61
+
62
+
63
+ const config = useRuntimeConfig();
64
+ const name = ref('');
65
+ const content = ref('');
66
+ const dialog = ref(false);
67
+ const notifications = ref(false);
68
+ const sound = ref(true);
69
+ const widgets = ref(false);
70
+ const slug = ref('');
71
+ const type = ref('');
72
+ const errorMessage = ref('');
73
+ const successMessage = ref('');
74
+
75
+ const createAttribute = async () => {
76
+ try {
77
+ const response = await $fetch(`${config.public.wordpressUrl}/wp-json/dokan/v1/products/attributes`, {
78
+ method: 'POST',
79
+ headers: {
80
+ 'Content-Type': 'application/json',
81
+ 'Authorization': `Bearer ${config.public.wordpressToken}`
82
+ },
83
+ body: JSON.stringify({
84
+ name: name.value,
85
+ slug: slug.value,
86
+ type: type.value,
87
+ status: 'publish',
88
+ })
89
+ })
90
+
91
+ console.log(response);
92
+
93
+ if (response.id) {
94
+ successMessage.value = 'Attribute created successfully!'
95
+ errorMessage.value = ''
96
+ } else {
97
+ throw new Error('Failed to create attribute')
98
+ }
99
+ } catch (error) {
100
+ console.error('Error creating attribute:', error);
101
+ if (error.response) {
102
+ console.error('Error response:', error.response);
103
+ if (error.response.status === 403) {
104
+ errorMessage.value = 'You do not have permission to create a attribute.'
105
+ } else {
106
+ errorMessage.value = `Error: ${error.response.status} ${error.response.statusText}`
107
+ }
108
+ } else {
109
+ errorMessage.value = error.message
110
+ }
111
+ successMessage.value = ''
112
+ }
113
+ }
114
+
115
+ useHead({
116
+ title: 'Create Attribute',
117
+ })
118
+ </script>
@@ -0,0 +1,372 @@
1
+ <template>
2
+ <div>
3
+ <form>
4
+ <v-toolbar dark color="rgb(var(--v-theme-primary))!important">
5
+ <v-card-title>
6
+ <span class="text-h6">Update Product</span>
7
+ </v-card-title>
8
+ </v-toolbar>
9
+ <v-card-text>
10
+ <v-container>
11
+ <v-row>
12
+ <v-col cols="12">
13
+ <v-text-field v-model="searchSku" label="Search Product by SKU" append-icon="mdi-magnify"
14
+ @click:append="fetchProduct(searchSku)"></v-text-field>
15
+ </v-col>
16
+ <v-col cols="12">
17
+ <h5>Basic Information</h5>
18
+ </v-col>
19
+ <v-divider></v-divider>
20
+ <v-col cols="6">
21
+ <v-select v-model="status" :items="['Enable', 'Disable']" label="Status*"></v-select>
22
+ </v-col>
23
+ <v-col cols="6">
24
+ <v-select v-model="type" :items="['simple', 'configurable', 'virtual', 'downloadable']"
25
+ label="Product Type*"></v-select>
26
+ </v-col>
27
+ <v-col cols="12">
28
+ <v-text-field v-model="name" label="Product Name*" required></v-text-field>
29
+ </v-col>
30
+ <v-col cols="12">
31
+ <v-text-field v-model="sku" type="number" label="SKU*" required></v-text-field>
32
+ </v-col>
33
+ <v-col cols="12">
34
+ <v-text-field v-model="price" type="number" label="Price*" required></v-text-field>
35
+ </v-col>
36
+ <v-col cols="6">
37
+ <v-select v-model="tax_class" :items="[
38
+ { text: 'None', value: 0 },
39
+ { text: 'Taxable Goods', value: 2 },
40
+ { text: 'Shipping', value: 4 }
41
+ ]" label="Tax Class"></v-select>
42
+
43
+ </v-col>
44
+ <v-col cols="6">
45
+ <v-text-field v-model="quantity_per_source" type="number" label="Quantity"></v-text-field>
46
+ </v-col>
47
+ <v-col cols="6">
48
+ <v-text-field v-model="weight" type="number" label="Weight"></v-text-field>
49
+ </v-col>
50
+ <v-col cols="6">
51
+ <v-text-field v-model="height" type="number" label="Height"></v-text-field>
52
+ </v-col>
53
+ <v-col cols="6">
54
+ <v-autocomplete v-model="catalog_visibility" :items="['public', 'private']"
55
+ label="Visibility">
56
+ </v-autocomplete>
57
+ </v-col>
58
+ <v-col cols="6">
59
+ <v-autocomplete v-model="categories" :items="['public']" label="Categories">
60
+ </v-autocomplete>
61
+ </v-col>
62
+ <v-col cols="6">
63
+ <v-autocomplete v-model="manufacture" :items="['public']" label="Manufacture">
64
+ </v-autocomplete>
65
+ </v-col>
66
+ <v-col cols="6">
67
+ <v-autocomplete v-model="country" :items="['public']" label="Country of Manufacture">
68
+ </v-autocomplete>
69
+ </v-col>
70
+ <v-col cols="6">
71
+ <v-select v-model="tax_status" :items="['0-17']" label="Tags">
72
+ </v-select>
73
+ </v-col>
74
+
75
+ <v-col cols="12">
76
+ <h5>Content</h5>
77
+ </v-col>
78
+ <v-divider></v-divider>
79
+
80
+ <v-col cols="12">
81
+ <v-textarea v-model="short_description" label="Short Description*"></v-textarea>
82
+ </v-col>
83
+ <v-col cols="12">
84
+ <h6>Description</h6>
85
+ <editor />
86
+ </v-col>
87
+
88
+ <v-col cols="12">
89
+ <h5>Images and Files</h5>
90
+ </v-col>
91
+ <v-divider></v-divider>
92
+
93
+ <v-col cols="12">
94
+ <v-file-input label="Product Image*" multiple required></v-file-input>
95
+ </v-col>
96
+ <v-col cols="12">
97
+ <v-file-input label="Product Thumbnails" multiple></v-file-input>
98
+ </v-col>
99
+ <v-col cols="12">
100
+ <v-file-input label="Product Files" multiple></v-file-input>
101
+ </v-col>
102
+
103
+ <v-col cols="12">
104
+ <h5>Related Products, Up-Sells, and Cross-Sells</h5>
105
+ </v-col>
106
+ <v-divider></v-divider>
107
+
108
+ <v-col cols="12">
109
+ <v-select v-model="related_ids" :items="['0-17']" label="Related Products">
110
+ </v-select>
111
+ </v-col>
112
+
113
+ <v-col cols="12">
114
+ <h5>Other Information</h5>
115
+ </v-col>
116
+ <v-divider></v-divider>
117
+
118
+ <v-col cols="6">
119
+ <v-text-field v-model="width" type="number" label="Part Number"></v-text-field>
120
+ </v-col>
121
+ <v-col cols="6">
122
+ <v-text-field v-model="manufacturer_part_number" type="number"
123
+ label="Manufacturer Part Number"></v-text-field>
124
+ </v-col>
125
+
126
+ <v-col cols="12">
127
+ <h5>Downloadable Information</h5>
128
+ </v-col>
129
+ <v-divider></v-divider>
130
+
131
+ <v-col cols="6">
132
+ <v-select v-model="format" :items="['Downloadable', 'Not Downloadable']" label="format">
133
+ </v-select>
134
+ </v-col>
135
+ </v-row>
136
+ </v-container>
137
+ <small>*indicates required field</small>
138
+ </v-card-text>
139
+ <v-card-actions>
140
+ <v-spacer></v-spacer>
141
+ <v-btn color="red-darken-1" variant="text" @click="deleteProduct">
142
+ Delete
143
+ </v-btn>
144
+ <v-btn color="blue-darken-1" variant="text" @click="dialog = false">
145
+ Close
146
+ </v-btn>
147
+ <v-btn color="blue-darken-1" variant="text" @click="updateProduct">
148
+ Update Product
149
+ </v-btn>
150
+ </v-card-actions>
151
+
152
+ </form>
153
+ </div>
154
+ </template>
155
+
156
+ <script setup>
157
+ import {
158
+ ref
159
+ } from 'vue'
160
+
161
+ import editor from '~/components/partials/globals/editor.vue'
162
+
163
+ const config = useRuntimeConfig();
164
+ const name = ref('');
165
+ const status = ref('');
166
+ const short_description = ref('');
167
+ const description = ref('');
168
+ const type = ref('');
169
+ const sku = ref('');
170
+ const image = ref('');
171
+ const height = ref('');
172
+ const weight = ref('');
173
+ const tax_status = ref('');
174
+ const price = ref('');
175
+ const tax_class = ref('');
176
+ const catalog_visibility = ref('');
177
+ const related_ids = ref('');
178
+ const categories = ref('');
179
+ const manufacture = ref('');
180
+ const country = ref('');
181
+ const brand = ref('');
182
+ const width = ref('');
183
+ const format = ref('');
184
+ const errorMessage = ref('');
185
+ const successMessage = ref('');
186
+ const searchSku = ref('');
187
+
188
+ const updateProduct = async () => {
189
+ try {
190
+ const UPDATE_PRODUCT = `
191
+ mutation updateProduct(
192
+ $sku: String!
193
+ $name: String
194
+ $price: Float
195
+ $status: Int
196
+ $weight: Float
197
+ $description: String
198
+ $short_description: String
199
+ $tax_class_id: Int
200
+ ) {
201
+ updateSimpleProduct(
202
+ input: {
203
+ sku: $sku
204
+ name: $name
205
+ price: $price
206
+ status: $status
207
+ weight: $weight
208
+ description: { html: $description }
209
+ short_description: { html: $short_description }
210
+ tax_class_id: $tax_class_id
211
+ }
212
+ ) {
213
+ product {
214
+ id
215
+ name
216
+ sku
217
+ price {
218
+ regularPrice {
219
+ amount {
220
+ value
221
+ }
222
+ }
223
+ }
224
+ }
225
+ }
226
+ }
227
+ `;
228
+
229
+ const variables = {
230
+ sku: sku.value,
231
+ name: name.value,
232
+ price: parseFloat(price.value),
233
+ status: status.value === 'Enable' ? 1 : 2,
234
+ weight: parseFloat(weight.value),
235
+ description: description.value,
236
+ short_description: short_description.value,
237
+ tax_class_id: parseInt(tax_class.value)
238
+ };
239
+
240
+ const response = await fetch(`${config.public.commerceUrl}/graphql`, {
241
+ method: 'POST',
242
+ headers: {
243
+ 'Content-Type': 'application/json',
244
+ 'Authorization': `Bearer ${config.public.commerceApiToken}`
245
+ },
246
+ body: JSON.stringify({
247
+ query: UPDATE_PRODUCT,
248
+ variables
249
+ })
250
+ });
251
+
252
+ const result = await response.json();
253
+ if (result.errors) {
254
+ throw new Error(result.errors[0].message);
255
+ }
256
+
257
+ successMessage.value = 'Product updated successfully';
258
+ } catch (error) {
259
+ errorMessage.value = error.message;
260
+ }
261
+ };
262
+
263
+ const deleteProduct = async () => {
264
+ try {
265
+ const DELETE_PRODUCT = `
266
+ mutation deleteProduct($sku: String!) {
267
+ deleteProducts(
268
+ skus: [$sku]
269
+ ) {
270
+ result
271
+ }
272
+ }
273
+ `;
274
+
275
+ const variables = {
276
+ sku: sku.value
277
+ };
278
+
279
+ const response = await fetch(`${config.public.commerceUrl}/graphql`, {
280
+ method: 'POST',
281
+ headers: {
282
+ 'Content-Type': 'application/json',
283
+ 'Authorization': `Bearer ${config.public.commerceApiToken}`
284
+ },
285
+ body: JSON.stringify({
286
+ query: DELETE_PRODUCT,
287
+ variables
288
+ })
289
+ });
290
+
291
+ const result = await response.json();
292
+ if (result.errors) {
293
+ throw new Error(result.errors[0].message);
294
+ }
295
+
296
+ successMessage.value = 'Product deleted successfully';
297
+ } catch (error) {
298
+ errorMessage.value = error.message;
299
+ }
300
+ };
301
+
302
+ // Add a method to fetch product data for editing
303
+ const fetchProduct = async (sku) => {
304
+ try {
305
+ const GET_PRODUCT = `
306
+ query getProduct($sku: String!) {
307
+ products(filter: { sku: { eq: $sku } }) {
308
+ items {
309
+ name
310
+ sku
311
+ price {
312
+ regularPrice {
313
+ amount {
314
+ value
315
+ }
316
+ }
317
+ }
318
+ status
319
+ weight
320
+ description {
321
+ html
322
+ }
323
+ short_description {
324
+ html
325
+ }
326
+ tax_class_id
327
+ }
328
+ }
329
+ }
330
+ `;
331
+
332
+ const response = await fetch(`${config.public.commerceUrl}/graphql`, {
333
+ method: 'POST',
334
+ headers: {
335
+ 'Content-Type': 'application/json',
336
+ 'Authorization': `Bearer ${config.public.commerceApiToken}`
337
+ },
338
+ body: JSON.stringify({
339
+ query: GET_PRODUCT,
340
+ variables: {
341
+ sku
342
+ }
343
+ })
344
+ });
345
+
346
+ const result = await response.json();
347
+ if (result.errors) {
348
+ throw new Error(result.errors[0].message);
349
+ }
350
+
351
+ const product = result.data.products.items[0];
352
+ if (product) {
353
+ // After successful update or delete
354
+ dialog.value = false;
355
+ name.value = product.name;
356
+ sku.value = product.sku;
357
+ price.value = product.price.regularPrice.amount.value;
358
+ status.value = product.status === 1 ? 'Enable' : 'Disable';
359
+ weight.value = product.weight;
360
+ description.value = product.description.html;
361
+ short_description.value = product.short_description.html;
362
+ tax_class.value = product.tax_class_id;
363
+ }
364
+ } catch (error) {
365
+ errorMessage.value = error.message;
366
+ }
367
+ };
368
+
369
+ useHead({
370
+ title: 'Update Product',
371
+ })
372
+ </script>
@@ -0,0 +1,153 @@
1
+ <template>
2
+ <div>
3
+ <v-card elevation="0">
4
+ <v-toolbar title="Update A Showcase"></v-toolbar>
5
+ <v-form @submit.prevent="updateShowcase">
6
+ <v-container>
7
+ <v-row>
8
+ <v-col cols="6">
9
+ <v-text-field v-model="title" label="Showcase Name" required></v-text-field>
10
+ </v-col>
11
+ <v-col cols="6">
12
+ <v-combobox v-model="type" label="Status" :items="['Public', 'Private']"></v-combobox>
13
+ </v-col>
14
+ <v-col cols="12">
15
+ <v-file-input clearable label="Showcase Image"></v-file-input>
16
+ </v-col>
17
+ <v-col cols="12">
18
+ <v-textarea v-model="description" label="Showcase Description"></v-textarea>
19
+ </v-col>
20
+ <v-col cols="12">
21
+ <v-card title="Choose a Product for your Showcase">
22
+ <v-card-text>
23
+ <v-text-field density="compact" variant="solo" label="Search Meeovi for products"
24
+ append-inner-icon="fas:fa fa-search" single-line hide-details
25
+ @click:append-inner="onClick"></v-text-field>
26
+ <v-spacer></v-spacer>
27
+ <div class="d-flex pa-4">
28
+ <v-checkbox-btn v-model="includeFiles" class="pe-2" color="orange">
29
+ </v-checkbox-btn>
30
+ <!--<NuxtLink :to="`/product/${products.id}`">
31
+ <v-card class="ma-4" height="580" width="250" @click="toggle">
32
+ <NuxtImg loading="lazy" class="align-end text-white" height="280"
33
+ :src="`${products.featuredAsset.preview}`" :alt="products.name" cover />
34
+
35
+ <v-card-title class="pt-4">
36
+ {{ products.name }}
37
+ </v-card-title>
38
+
39
+ <v-card-text>
40
+ <div>Sku: {{ products.variants.sku }}</div>
41
+ </v-card-text>
42
+
43
+ <v-card-actions>
44
+ <v-card-title>$ {{ products.variants.price }}
45
+ </v-card-title>
46
+ </v-card-actions>
47
+ <div class="d-flex fill-height align-center justify-center">
48
+ <v-scale-transition>
49
+ <v-icon v-if="isSelected" color="white" size="48"
50
+ icon="mdi-close-circle-outline"></v-icon>
51
+ </v-scale-transition>
52
+ </div>
53
+ </v-card>
54
+ </NuxtLink>-->
55
+ </div>
56
+ </v-card-text>
57
+ </v-card>
58
+ </v-col>
59
+ </v-row>
60
+ </v-container>
61
+
62
+ <v-divider class="mt-12"></v-divider>
63
+ <v-card-actions>
64
+ <v-btn color="blue-darken-1" variant="text" type="submit" @click.prevent="deleteShowcaseAndRefresh">
65
+ Delete
66
+ </v-btn>
67
+ <v-spacer></v-spacer>
68
+ <v-btn color="blue-darken-1" variant="text" type="submit" @click.prevent="updateShowcaseAndRefresh">
69
+ Update
70
+ </v-btn>
71
+ </v-card-actions>
72
+ </v-form>
73
+ </v-card>
74
+ </div>
75
+ </template>
76
+
77
+ <script setup>
78
+ import { ref } from 'vue';
79
+
80
+ import { useRoute, useRouter } from 'vue-router';
81
+ /*import { UPDATE_SHOWCASE, DELETE_SHOWCASE } from '#graphql/cms/queries/showcases'
82
+
83
+ const route = useRoute();
84
+ const router = useRouter();
85
+ const id = route.params.id;
86
+
87
+ const dialog = ref(false)
88
+ const includeFiles = ref(true)
89
+ const enabled = ref(false)
90
+ const name = ref('');
91
+ const title = ref('');
92
+ const color = ref('');
93
+ const colortext = ref('');
94
+ const showcaseFields = ref('');
95
+ const description = ref('');
96
+ const image = ref('');
97
+ const rating = ref('');
98
+ const products = ref('');
99
+
100
+ const { client: apolloClient } = useApolloClient();
101
+
102
+ const updateShowcase = async () => {
103
+ try {
104
+ const { data } = await apolloClient.mutate({
105
+ mutation: UPDATE_SHOWCASE,
106
+ variables: {
107
+ name: name.value,
108
+ title: title.value,
109
+ color: showcaseFields.color.value,
110
+ colortext: showcaseFields.colortext.value,
111
+ description: showcaseFields.description.value,
112
+ image: showcaseFields.image.node.sourceUrl,
113
+ id: id,
114
+ },
115
+ });
116
+ console.log('Showcase updated:', data.updateShowcase.showcase);
117
+ } catch (error) {
118
+ console.error('Error updating showcase:', error);
119
+ }
120
+ };
121
+
122
+ const deleteShowcase = async () => {
123
+ try {
124
+ const { data } = await apolloClient.mutate({
125
+ mutation: DELETE_SHOWCASE,
126
+ variables: {
127
+ id: id,
128
+ },
129
+ });
130
+ console.log('Showcase deleted:', data.deleteShowcase.showcase.id);
131
+ } catch (error) {
132
+ console.error('Error deleting showcase:', error);
133
+ }
134
+ };
135
+
136
+ const deleteShowcaseAndRefresh = async () => {
137
+ await deleteShowcase();
138
+ router.push('/product/showcase/showcases'); // Refresh the current route
139
+ };
140
+
141
+ const updateShowcaseAndRefresh = async () => {
142
+ await updateShowcase();
143
+ router.go(0); // Refresh the current route
144
+ };
145
+
146
+ const reset = () => {
147
+ router.go(0);
148
+ };*/
149
+
150
+ useHead({
151
+ title: 'Update Showcase',
152
+ })
153
+ </script>