@mframework/layer-commerce 0.0.5 → 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 (209) 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/composables/useCustomer/__tests__/useCustomer.spec.ts +1 -1
  121. package/app/composables/useProductReviews/__tests__/useProductReviews.spec.ts +1 -1
  122. package/app/stores/cart.ts +1 -1
  123. package/app/types/Direction.type.ts +1 -1
  124. package/app/types/Global.type.ts +6 -6
  125. package/app/types/Layout.type.ts +1 -1
  126. package/app/types/index.ts +1 -1
  127. package/app/{normalizers → types/normalizers}/Cart.query.ts +1 -1
  128. package/app/{normalizers → types/normalizers}/Cart.type.ts +2 -2
  129. package/app/{normalizers → types/normalizers}/Checkout.query.ts +2 -2
  130. package/app/{normalizers → types/normalizers}/Config.query.ts +1 -1
  131. package/app/{normalizers → types/normalizers}/Config.type.ts +1 -1
  132. package/app/{normalizers → types/normalizers}/ContactForm.query.ts +2 -2
  133. package/app/{normalizers → types/normalizers}/CreditMemo.type.ts +1 -1
  134. package/app/{normalizers → types/normalizers}/GiftCard.type.ts +1 -1
  135. package/app/{normalizers → types/normalizers}/Invoice.type.ts +1 -1
  136. package/app/{normalizers → types/normalizers}/MyAccount.query.ts +1 -1
  137. package/app/{normalizers → types/normalizers}/MyAccount.type.ts +1 -1
  138. package/app/{normalizers → types/normalizers}/NewsletterSubscription.query.ts +1 -1
  139. package/app/{normalizers → types/normalizers}/Order.query.ts +1 -1
  140. package/app/{normalizers → types/normalizers}/Order.type.ts +2 -2
  141. package/app/{normalizers → types/normalizers}/Payment.type.ts +1 -1
  142. package/app/{normalizers → types/normalizers}/ProductCompare.query.ts +1 -1
  143. package/app/{normalizers → types/normalizers}/ProductCompare.type.ts +1 -1
  144. package/app/{normalizers → types/normalizers}/ProductList.query.ts +2 -2
  145. package/app/{normalizers → types/normalizers}/ProductList.type.ts +2 -2
  146. package/app/{normalizers → types/normalizers}/Return.type.ts +1 -1
  147. package/app/{normalizers → types/normalizers}/Review.query.ts +1 -1
  148. package/app/{normalizers → types/normalizers}/Review.type.ts +1 -1
  149. package/app/{normalizers → types/normalizers}/StoreInPickUp.query.ts +1 -1
  150. package/app/{normalizers → types/normalizers}/Subscription.type.ts +1 -1
  151. package/app/{normalizers → types/normalizers}/Transaction.type.ts +1 -1
  152. package/app/{normalizers → types/normalizers}/UrlRewrites.query.ts +1 -1
  153. package/app/{normalizers → types/normalizers}/UrlRewrites.type.ts +1 -1
  154. package/app/{normalizers → types/normalizers}/Wishlist.query.ts +4 -4
  155. package/app/{normalizers → types/normalizers}/Wishlist.type.ts +1 -1
  156. package/app/utils/Address/Address.type.ts +1 -1
  157. package/app/utils/Address/index.ts +5 -5
  158. package/app/utils/Cart/Cart.ts +1 -1
  159. package/app/utils/Currency/Currency.ts +1 -1
  160. package/app/utils/History/History.type.ts +1 -1
  161. package/app/utils/Menu/Menu.ts +1 -1
  162. package/app/utils/Menu/Menu.type.ts +2 -2
  163. package/app/utils/Orders/Orders.ts +1 -1
  164. package/app/utils/Preload/CategoryPreload.ts +2 -2
  165. package/app/utils/Preload/ProductPreload.ts +1 -1
  166. package/app/utils/Preload/index.ts +1 -1
  167. package/app/utils/Price/Price.ts +1 -1
  168. package/app/utils/Product/Extract.ts +1 -1
  169. package/app/utils/Product/Product.ts +1 -1
  170. package/app/utils/Product/Product.type.ts +1 -1
  171. package/app/utils/Product/Transform.ts +1 -1
  172. package/app/utils/Wishlist/Wishlist.ts +1 -1
  173. package/app/utils/client.ts +20 -20
  174. package/package.json +1 -3
  175. package/tsconfig.json +2 -2
  176. package/app/cart/useCart.ts +0 -1
  177. /package/app/{components → composables}/ChevronIcon/ChevronIcon.config.ts +0 -0
  178. /package/app/{components → composables}/DateSelect/DateSelect.config.ts +0 -0
  179. /package/app/{components → composables}/Field/Field.config.ts +0 -0
  180. /package/app/{components → composables}/FieldDate/FieldDate.config.ts +0 -0
  181. /package/app/{components → composables}/Form/Form.type.ts +0 -0
  182. /package/app/{components → composables}/Product/Product.config.ts +0 -0
  183. /package/app/{components → composables}/Product/Stock.config.ts +0 -0
  184. /package/app/{components → composables}/ProductCustomizableOption/ProductCustomizableOption.config.ts +0 -0
  185. /package/app/{components → composables}/ProductGallery/ProductGallery.config.ts +0 -0
  186. /package/app/{components → composables}/ProductReviews/ProductReviews.config.ts +0 -0
  187. /package/app/{normalizers → types/normalizers}/Category.query.ts +0 -0
  188. /package/app/{normalizers → types/normalizers}/Category.type.ts +0 -0
  189. /package/app/{normalizers → types/normalizers}/CheckEmail.query.ts +0 -0
  190. /package/app/{normalizers → types/normalizers}/Checkout.type.ts +0 -0
  191. /package/app/{normalizers → types/normalizers}/CmsBlock.query.ts +0 -0
  192. /package/app/{normalizers → types/normalizers}/CmsBlock.type.ts +0 -0
  193. /package/app/{normalizers → types/normalizers}/CmsPage.query.ts +0 -0
  194. /package/app/{normalizers → types/normalizers}/CmsPage.type.ts +0 -0
  195. /package/app/{normalizers → types/normalizers}/Menu.query.ts +0 -0
  196. /package/app/{normalizers → types/normalizers}/Menu.type.ts +0 -0
  197. /package/app/{normalizers → types/normalizers}/ProductAlerts.query.ts +0 -0
  198. /package/app/{normalizers → types/normalizers}/Region.query.ts +0 -0
  199. /package/app/{normalizers → types/normalizers}/Region.type.ts +0 -0
  200. /package/app/{normalizers → types/normalizers}/Slider.query.ts +0 -0
  201. /package/app/{normalizers → types/normalizers}/Slider.type.ts +0 -0
  202. /package/app/{normalizers → types/normalizers}/StoreInPickUp.type.ts +0 -0
  203. /package/app/{routes → types/routes}/CategoryPage/CategoryPage.config.ts +0 -0
  204. /package/app/{routes → types/routes}/CategoryPage/CategoryPage.type.ts +0 -0
  205. /package/app/{routes → types/routes}/Checkout/Checkout.config.ts +0 -0
  206. /package/app/{routes → types/routes}/Checkout/Checkout.type.ts +0 -0
  207. /package/app/{routes → types/routes}/MyAccount/MyAccount.config.ts +0 -0
  208. /package/app/{routes → types/routes}/SearchPage/SearchPage.config.ts +0 -0
  209. /package/app/{routes → types/routes}/UrlRewrites/UrlRewrites.config.ts +0 -0
@@ -0,0 +1,116 @@
1
+ <template>
2
+ <v-table>
3
+ <tbody>
4
+ <tr>
5
+ <th>Released</th>
6
+ <td>{{ new Date(product?.created_at).toLocaleDateString() }}</td>
7
+ </tr>
8
+ <tr>
9
+ <th>Updated</th>
10
+ <td>{{ new Date(product?.updated_at).toLocaleDateString() }}</td>
11
+ </tr>
12
+ <tr>
13
+ <th>Name</th>
14
+ <td>{{ product?.name }}</td>
15
+ </tr>
16
+ <tr>
17
+ <th>Category Name</th>
18
+ <td><div style="display: inline-block;" v-for="categories in product?.categories" :key="categories">{{ categories?.categories_id?.name.join(', ') }}</div></td>
19
+ </tr>
20
+ <tr>
21
+ <th>Price</th>
22
+ <td>
23
+ <strong><div style="display: inline-block;" v-for="currency in product?.currency" :key="currency">{{ currency?.currency_id?.symbol }}</div></strong>
24
+ {{ product?.price }}
25
+ </td>
26
+ </tr>
27
+ <tr>
28
+ <th>Average Rating</th>
29
+ <td><ratings :rating="product?.rating" /></td>
30
+ </tr>
31
+ <tr>
32
+ <th># of Reviews</th>
33
+ <td>{{ product?.review_count }}</td>
34
+ </tr>
35
+ <tr>
36
+ <th>Sku</th>
37
+ <td>{{ product?.sku }}</td>
38
+ </tr>
39
+ <tr>
40
+ <th>How many items are left?</th>
41
+ <td>{{ product?.stock }}</td>
42
+ </tr>
43
+ <tr>
44
+ <th>Visibility</th>
45
+ <td>{{ product?.visibility }}</td>
46
+ </tr>
47
+ <tr>
48
+ <th>Weight</th>
49
+ <td>{{ product?.weight }}</td>
50
+ </tr>
51
+ <tr>
52
+ <th>Height</th>
53
+ <td>{{ product?.height }}</td>
54
+ </tr>
55
+ <tr>
56
+ <th>Format</th>
57
+ <td v-dompurify-html="product?.format"></td>
58
+ </tr>
59
+ <tr>
60
+ <th>Product Color</th>
61
+ <td>{{ product?.color }}</td>
62
+ </tr>
63
+ <tr>
64
+ <th>Product Size</th>
65
+ <td>{{ product?.size }}</td>
66
+ </tr>
67
+ <tr>
68
+ <th>Product Manufacturer</th>
69
+ <td>{{ product?.manufacturer?.manufacturer_id?.name }}</td>
70
+ </tr>
71
+ <tr>
72
+ <th>Product Description</th>
73
+ <td><div v-dompurify-html="product?.content"></div></td>
74
+ </tr>
75
+ <tr>
76
+ <th>Is Gift Message Available</th>
77
+ <td>{{ product?.gift_message_available }}</td>
78
+ </tr>
79
+ <tr>
80
+ <th>Special to Date</th>
81
+ <td><div style="display: inline-block;" v-for="currency in product?.currency" :key="currency">{{ currency?.currency_id?.symbol }}</div> {{ product?.special_to_date }}</td>
82
+ </tr>
83
+ <tr>
84
+ <th>Special Price</th>
85
+ <td><div style="display: inline-block;" v-for="currency in product?.currency" :key="currency">{{ currency?.currency_id?.symbol }}</div> {{ product?.special_price }}</td>
86
+ </tr>
87
+ <tr>
88
+ <th>Is Featured</th>
89
+ <td>{{ product?.is_featured }}</td>
90
+ </tr>
91
+ <tr>
92
+ <th>Product URL Key</th>
93
+ <td>{{ product?.url_key }}</td>
94
+ </tr>
95
+ <tr>
96
+ <th>Product URL Path</th>
97
+ <td>{{ product?.url_path }}</td>
98
+ </tr>
99
+ <tr>
100
+ <th>Product Gift Message Availability</th>
101
+ <td>{{ product?.gift_message_available }}</td>
102
+ </tr>
103
+ </tbody>
104
+ </v-table>
105
+ </template>
106
+
107
+ <script setup>
108
+ import ratings from '../../partials/ratings.vue'
109
+
110
+ const props = defineProps({
111
+ product: {
112
+ type: Object,
113
+ required: true,
114
+ },
115
+ });
116
+ </script>
@@ -0,0 +1,36 @@
1
+ <template>
2
+ <div>
3
+ <v-card color="#b02564">
4
+ <div class="d-flex flex-no-wrap justify-space-between">
5
+ <div>
6
+ <v-card-title class="text-h5">
7
+ {{ radio?.name }}
8
+ </v-card-title>
9
+
10
+ <v-card-subtitle>{{ radio?.description }}</v-card-subtitle>
11
+
12
+ <v-card-actions>
13
+ <v-btn class="ms-2" size="small" text="LISTEN" variant="outlined"
14
+ :href="`/departments/categories/station/${radio?.id}`"></v-btn>
15
+ </v-card-actions>
16
+ </div>
17
+
18
+ <v-avatar class="ma-3" rounded="0" size="125">
19
+ <NuxtImg :src="`${$directus.url}/assets/${radio?.image?.filename_disk}`" />
20
+ </v-avatar>
21
+ </div>
22
+ </v-card>
23
+ </div>
24
+ </template>
25
+
26
+ <script setup>
27
+ const props = defineProps({
28
+ radio: {
29
+ type: Object,
30
+ required: true,
31
+ },
32
+ });
33
+ const {
34
+ radio
35
+ } = props;
36
+ </script>
@@ -0,0 +1,43 @@
1
+ <template>
2
+ <div>
3
+ <section data-bs-version="5.1" class="mbr-section features20 cid-txNnCwzel4" id="features20-4t"
4
+ data-sortbtn="btn-primary">
5
+ <div class="container-fluid">
6
+ <h2 class="mbr-section-title align-left mbr-fonts-style display-5">
7
+ Recently Viewed</h2>
8
+ <div class="underline align-left pb-3">
9
+ <div class="line"></div>
10
+ </div>
11
+ <v-sheet class="mx-auto">
12
+ <v-slide-group v-model="model" class="pa-4" show-arrows>
13
+ <v-slide-group-item v-slot="{ isSelected, toggle, selectedClass }"
14
+ v-for="(products, index) in recentlyViewed" :key="index">
15
+ <productCard :product="products" :class="['ma-4', selectedClass]" @click="toggle" />
16
+
17
+ <div class="d-flex fill-height align-center justify-center">
18
+ <v-scale-transition>
19
+ <v-icon v-if="isSelected" color="white" icon="mdi-close-circle-outline" size="48"></v-icon>
20
+ </v-scale-transition>
21
+ </div>
22
+ </v-slide-group-item>
23
+ </v-slide-group>
24
+ </v-sheet>
25
+ </div>
26
+ </section>
27
+ </div>
28
+ </template>
29
+
30
+ <script setup>
31
+ import productCard from './productCard.vue'
32
+
33
+ const model = ref(null)
34
+
35
+ import { onMounted } from 'vue'
36
+ import { useRecentlyViewed } from '#commerce/app/composables/products/useRecentlyViewed'
37
+
38
+ const { products: recentlyViewed, load } = useRecentlyViewed()
39
+
40
+ onMounted(() => {
41
+ load()
42
+ })
43
+ </script>
@@ -0,0 +1,54 @@
1
+ <template>
2
+ <div>
3
+ <section data-bs-version="5.1" class="mbr-section features20 cid-txNnCwzel4" id="features20-4t"
4
+ data-sortbtn="btn-primary">
5
+ <div class="container-fluid">
6
+ <h2 class="mbr-section-title align-left mbr-fonts-style display-5">
7
+ Related Brands</h2>
8
+ <div class="underline align-left pb-3">
9
+ <div class="line"></div>
10
+ </div>
11
+ <v-sheet class="mx-auto">
12
+ <v-slide-group v-model="model" class="pa-4" selected-class="bg-success" show-arrows>
13
+ <v-slide-group-item v-slot="{ isSelected, toggle, selectedClass }"
14
+ v-for="(brand, index) in relatedbrands" :key="index">
15
+ <brandCard :product="brand" :class="['ma-4', selectedClass]" @click="toggle" />
16
+
17
+ <div class="d-flex fill-height align-center justify-center">
18
+ <v-scale-transition>
19
+ <v-icon v-if="isSelected" color="white" icon="mdi-close-circle-outline" size="48"></v-icon>
20
+ </v-scale-transition>
21
+ </div>
22
+ </v-slide-group-item>
23
+ </v-slide-group>
24
+ </v-sheet>
25
+ </div>
26
+ </section>
27
+ </div>
28
+ </template>
29
+
30
+ <script setup>
31
+ import brandCard from '../../related/brandCard.vue'
32
+
33
+ const model = ref(null)
34
+ const {
35
+ $directus,
36
+ $readItems
37
+ } = useNuxtApp()
38
+
39
+ const {
40
+ data: relatedbrands
41
+ } = await useAsyncData('relatedbrands', () => {
42
+ return $directus.request($readItems('brands', {
43
+ fields: ['*',
44
+ 'image.*',
45
+ ],
46
+ limit: 10,
47
+ filter: {
48
+ status: {
49
+ _eq: "published"
50
+ }
51
+ }
52
+ }))
53
+ })
54
+ </script>
@@ -0,0 +1,58 @@
1
+ <template>
2
+ <div>
3
+ <section data-bs-version="5.1" class="mbr-section features20 cid-txNnCwzel4" id="features20-4t"
4
+ data-sortbtn="btn-primary">
5
+ <div class="container-fluid">
6
+ <h2 class="mbr-section-title align-left mbr-fonts-style display-5">
7
+ Related Products</h2>
8
+ <div class="underline align-left pb-3">
9
+ <div class="line"></div>
10
+ </div>
11
+ <v-sheet class="mx-auto">
12
+ <v-slide-group v-model="model" class="pa-4" selected-class="bg-success" show-arrows>
13
+ <v-slide-group-item v-slot="{ isSelected, toggle, selectedClass }"
14
+ v-for="(products, index) in related" :key="index">
15
+ <productCard :product="products" :class="['ma-4', selectedClass]" @click="toggle" />
16
+
17
+ <div class="d-flex fill-height align-center justify-center">
18
+ <v-scale-transition>
19
+ <v-icon v-if="isSelected" color="white" icon="mdi-close-circle-outline" size="48"></v-icon>
20
+ </v-scale-transition>
21
+ </div>
22
+ </v-slide-group-item>
23
+ </v-slide-group>
24
+ </v-sheet>
25
+ </div>
26
+ </section>
27
+ </div>
28
+ </template>
29
+
30
+ <script setup>
31
+ import productCard from './productCard.vue'
32
+
33
+ const model = ref(null)
34
+ const {
35
+ $directus,
36
+ $readItems
37
+ } = useNuxtApp()
38
+
39
+ const {
40
+ data: related
41
+ } = await useAsyncData('related', () => {
42
+ return $directus.request($readItems('products', {
43
+ fields: ['*',
44
+ 'products.products_id.*',
45
+ 'products.products_id.image.*',
46
+ 'currency.currency_id.*',
47
+ 'brands.brands_id.*',
48
+ 'image.*',
49
+ ],
50
+ limit: 10,
51
+ filter: {
52
+ status: {
53
+ _eq: "published"
54
+ }
55
+ }
56
+ }))
57
+ })
58
+ </script>
@@ -0,0 +1,40 @@
1
+ <template>
2
+ <div>
3
+ <v-sheet class="mx-auto row align-items-stretch items-row">
4
+ <v-toolbar title="Radio Stations from the community" color="transparent">
5
+ <NuxtLink to="/departments/categories/stations/">All Radio Stations</NuxtLink>
6
+ </v-toolbar>
7
+ <v-slide-group v-model="model" class="pa-4" selected-class="bg-success" show-arrows>
8
+ <v-slide-group-item v-slot="{ toggle, selectedClass }" v-for="(result, index) in stationSlide" :key="index">
9
+ <stations style="margin: 10px;" :radio="result" :class="['ma-4', selectedClass]" @click="toggle" />
10
+ </v-slide-group-item>
11
+ </v-slide-group>
12
+ </v-sheet>
13
+ </div>
14
+ </template>
15
+
16
+ <script setup>
17
+ import {
18
+ ref,
19
+ } from 'vue';
20
+ import stations from './radiostation.vue'
21
+
22
+ const model = ref(null);
23
+ const {
24
+ $directus,
25
+ $readItems
26
+ } = useNuxtApp()
27
+
28
+ const {
29
+ data: stationSlide
30
+ } = await useAsyncData('stationSlide', () => {
31
+ return $directus.request($readItems('radios', {
32
+ fields: ['*', { '*': ['*'] }],
33
+ filter: {
34
+ status: {
35
+ _eq: "published"
36
+ }
37
+ }
38
+ }))
39
+ })
40
+ </script>
@@ -0,0 +1,41 @@
1
+ <template>
2
+ <v-row>
3
+ <v-col cols="12">
4
+ <h6>Delivery</h6>
5
+ </v-col>
6
+
7
+ <v-col cols="12">
8
+ <v-select v-model="selected" :items="shippingOptions" item-title="name" item-value="id"
9
+ label="Select Delivery Method" single-line variant="solo" :loading="loading"
10
+ :disabled="loading || shippingOptions.length === 0"></v-select>
11
+ </v-col>
12
+ </v-row>
13
+ </template>
14
+
15
+ <script setup>
16
+ import { onMounted, watch } from 'vue'
17
+ import { useShippingSelection } from '~/app/composables/cart/useShippingSelection'
18
+
19
+ const props = defineProps({
20
+ modelValue: { type: [String, Number, null], default: null }
21
+ })
22
+ const emit = defineEmits(['shippingOption-selected', 'update:modelValue'])
23
+
24
+ const { shippingOptions, selected, loading, load } = useShippingSelection(props.modelValue)
25
+
26
+ onMounted(() => {
27
+ load()
28
+ })
29
+
30
+ watch(() => props.modelValue, (val) => {
31
+ if (val === selected.value) return
32
+ selected.value = val
33
+ })
34
+
35
+ watch(selected, async (val) => {
36
+ const option = shippingOptions.value.find((s) => s.id === val) || null
37
+ // update parent v-model
38
+ emit('update:modelValue', val)
39
+ emit('shippingOption-selected', option)
40
+ })
41
+ </script>
@@ -0,0 +1,47 @@
1
+ <template>
2
+ <v-row>
3
+ <v-col cols="12">
4
+ <h6>Size</h6>
5
+ </v-col>
6
+
7
+ <v-col cols="12">
8
+ <v-select v-model="selectedSize" :items="sizes" label="Select Size" item-value="id" item-title="name" single-line variant="solo" />
9
+ </v-col>
10
+ </v-row>
11
+ </template>
12
+
13
+ <script setup>
14
+ import { ref, onMounted, watch } from 'vue'
15
+ const emit = defineEmits(['size-selected'])
16
+ const sizes = ref([])
17
+ const selectedSize = ref(null)
18
+
19
+
20
+ const nuxtApp = useNuxtApp()
21
+ const { $directus, $readItems } = nuxtApp
22
+
23
+ const loadSizes = async () => {
24
+ try {
25
+ const res = await $directus.request($readItems('attributes', {
26
+ filter: {
27
+ attribute_code: { _eq: 'size' }
28
+ },
29
+ sort: ['id']
30
+ }))
31
+
32
+ const attr = (res && res[0]) || null
33
+ const opts = attr?.options || []
34
+ sizes.value = opts.map((o, i) => ({ id: `${attr?.id || 'size'}-${i}`, name: o.name }))
35
+ } catch (e) {
36
+ // eslint-disable-next-line no-console
37
+ console.warn('Failed to load size attributes', e)
38
+ sizes.value = []
39
+ }
40
+ }
41
+
42
+ watch(selectedSize, (newSize) => emit('size-selected', newSize))
43
+
44
+ onMounted(() => {
45
+ loadSizes()
46
+ })
47
+ </script>
@@ -0,0 +1,209 @@
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 Set
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 Set</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>
58
+ /* import gql from "graphql-tag";
59
+ import findManyCategories from "#graphql/query/findManyCategories"
60
+
61
+ const ADD_CATEGORIES = gql `
62
+ mutation createOneCategories($name: String!, $content: String, $image: String, $meta_title: String, $meta_keywords: String, $meta_description:String){
63
+ createOneCategories(data: {name: $name, content: $content, image: $image, meta_description: $meta_description, meta_keywords: $meta_keywords, meta_title: $meta_title}) {
64
+ name
65
+ content
66
+ image
67
+ meta_description
68
+ meta_keywords
69
+ meta_title
70
+ }
71
+ }`; */
72
+
73
+ export default {
74
+ data() {
75
+ return {
76
+ dialog: false,
77
+ notifications: false,
78
+ sound: true,
79
+ widgets: false,
80
+ /* name: ' ',
81
+ content: ' ',
82
+ image: ' ',
83
+ meta_description: ' ',
84
+ meta_keywords: ' ',
85
+ meta_title: ' ' */
86
+ }
87
+ },
88
+ /* methods: {
89
+ addAttribute() {
90
+ const name = this.name;
91
+ const content = this.content;
92
+ const image = this.image;
93
+ // eslint-disable-next-line camelcase
94
+ const meta_title = this.meta_title;
95
+ // eslint-disable-next-line camelcase
96
+ const meta_keywords = this.meta_keywords;
97
+ // eslint-disable-next-line camelcase
98
+ const meta_description = this.meta_description;
99
+ this.$apollo.mutate({
100
+ mutation: ADD_CATEGORIES,
101
+ variables: {
102
+ name,
103
+ content,
104
+ image,
105
+ meta_description,
106
+ meta_keywords,
107
+ meta_title,
108
+ },
109
+ update: (store, {
110
+ data: {
111
+ addAttribute
112
+ }
113
+ }) => {
114
+ // Read data from store for this query
115
+ const data = store.readQuery({
116
+ query: findManyCategories,
117
+ variables: {
118
+ first: 5,
119
+ skip: 0,
120
+ orderBy: 'createdAt_DESC'
121
+ }
122
+ })
123
+ data.allCategories.push(addAttribute)
124
+ store.writeQuery({
125
+ query: findManyCategories,
126
+ variables: {
127
+ first: 5,
128
+ skip: 0,
129
+ orderBy: 'createdAt_DESC'
130
+ },
131
+ data
132
+ })
133
+ }
134
+ }).then((_data) => {
135
+ this.$router.push({
136
+ path: '~/content/categories'
137
+ })
138
+ }).catch(error => console.error(error));
139
+ this.name = ' ';
140
+ this.content = ' ';
141
+ this.image = ' ';
142
+ this.meta_description = ' ';
143
+ this.meta_keywords = ' ';
144
+ this.meta_title = ' ';
145
+ },
146
+ }, */
147
+ }
148
+ </script>
149
+
150
+ <script setup>
151
+ import {
152
+ ref
153
+ } from 'vue'
154
+
155
+
156
+ const config = useRuntimeConfig();
157
+ const name = ref('');
158
+ const slug = ref('');
159
+ const type = ref('');
160
+ const description = ref('');
161
+ const errorMessage = ref('');
162
+ const successMessage = ref('');
163
+
164
+ const createAttribute = async () => {
165
+ try {
166
+ const response = await $fetch(`${config.public.wordpressUrl}/wp-json/dokan/v1/products/attributes/${attribute.id}/terms`, {
167
+ method: 'POST',
168
+ headers: {
169
+ 'Content-Type': 'application/json',
170
+ 'Authorization': `Bearer ${config.public.wordpressToken}`
171
+ },
172
+ body: JSON.stringify({
173
+ name: name.value,
174
+ slug: slug.value,
175
+ type: type.value,
176
+ description: description.value,
177
+ description: description.value,
178
+ status: 'publish',
179
+ })
180
+ })
181
+
182
+ console.log(response);
183
+
184
+ if (response.id) {
185
+ successMessage.value = 'Attribute Term created successfully!'
186
+ errorMessage.value = ''
187
+ } else {
188
+ throw new Error('Failed to create attribute term')
189
+ }
190
+ } catch (error) {
191
+ console.error('Error creating attribute term:', error);
192
+ if (error.response) {
193
+ console.error('Error response:', error.response);
194
+ if (error.response.status === 403) {
195
+ errorMessage.value = 'You do not have permission to create a attribute term.'
196
+ } else {
197
+ errorMessage.value = `Error: ${error.response.status} ${error.response.statusText}`
198
+ }
199
+ } else {
200
+ errorMessage.value = error.message
201
+ }
202
+ successMessage.value = ''
203
+ }
204
+ }
205
+
206
+ useHead({
207
+ title: 'Create Attribute Term',
208
+ })
209
+ </script>