@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.
- package/app/components/catalog/product/ProductAccordion/ProductAccordion.vue +41 -0
- package/app/components/catalog/product/ProductAccordion/__tests__/ProductAccordion.spec.ts +15 -0
- package/app/components/catalog/product/ProductAccordion/types.ts +5 -0
- package/app/components/catalog/product/ProductProperties/ProductProperties.vue +52 -0
- package/app/components/catalog/product/ProductProperties/__tests__/ProductProperties.spec.ts +15 -0
- package/app/components/catalog/product/ProductProperties/types.ts +5 -0
- package/app/components/catalog/product/ProductSlider/ProductSlider.vue +28 -0
- package/app/components/catalog/product/ProductSlider/__tests__/ProductSlider.spec.ts +14 -0
- package/app/components/catalog/product/ProductSlider/types.ts +7 -0
- package/app/components/catalog/product/RecommendedProducts/RecommendedProducts.vue +12 -0
- package/app/components/catalog/product/RecommendedProducts/types.ts +5 -0
- package/app/components/catalog/product/RenderContentProductSlider/RenderContentProductSlider.vue +11 -0
- package/app/components/catalog/product/add-attribute.vue +54 -0
- package/app/components/catalog/product/add-product-type.vue +54 -0
- package/app/components/catalog/product/add-product.vue +53 -0
- package/app/components/catalog/product/add-showcase.vue +52 -0
- package/app/components/catalog/product/add-station.vue +54 -0
- package/app/components/catalog/product/bestsellers.vue +69 -0
- package/app/components/catalog/product/bidding.vue +93 -0
- package/app/components/catalog/product/colorOptions.vue +58 -0
- package/app/components/catalog/product/deals.vue +61 -0
- package/app/components/catalog/product/exclusives.vue +58 -0
- package/app/components/catalog/product/featuredproducts.vue +69 -0
- package/app/components/catalog/product/giftCard.vue +63 -0
- package/app/components/catalog/product/latestproducts.vue +58 -0
- package/app/components/catalog/product/productCard.vue +71 -0
- package/app/components/catalog/product/productCompare.vue +60 -0
- package/app/components/catalog/product/productCompareTable.vue +441 -0
- package/app/components/catalog/product/productDetails.vue +120 -0
- package/app/components/catalog/product/productFaqs.vue +17 -0
- package/app/components/catalog/product/productGallery.vue +16 -0
- package/app/components/catalog/product/productQty.vue +54 -0
- package/app/components/catalog/product/productReviews.vue +56 -0
- package/app/components/catalog/product/productSpecs.vue +116 -0
- package/app/components/catalog/product/radiostation.vue +36 -0
- package/app/components/catalog/product/recentlyviewed.vue +43 -0
- package/app/components/catalog/product/relatedbrands.vue +54 -0
- package/app/components/catalog/product/relatedproducts.vue +58 -0
- package/app/components/catalog/product/relatedstations.vue +40 -0
- package/app/components/catalog/product/shippingOptions.vue +41 -0
- package/app/components/catalog/product/sizeOptions.vue +47 -0
- package/app/components/catalog/product/update-attribute-set.vue +209 -0
- package/app/components/catalog/product/update-attribute.vue +118 -0
- package/app/components/catalog/product/update-product.vue +372 -0
- package/app/components/catalog/product/update-showcase.vue +153 -0
- package/app/components/catalog/shops/relatedstores.vue +52 -0
- package/app/components/catalog/shops/restaurant.vue +66 -0
- package/app/components/catalog/shops/stores.vue +44 -0
- package/app/components/catalog/vendor/README.md +3 -0
- package/app/components/catalog/vendor/blocks/biggestcustomers.vue +33 -0
- package/app/components/catalog/vendor/blocks/lowestselling.vue +33 -0
- package/app/components/catalog/vendor/blocks/topcategories.vue +33 -0
- package/app/components/catalog/vendor/blocks/topproducts.vue +27 -0
- package/app/components/catalog/vendor/pages/attributes.vue +43 -0
- package/app/components/catalog/vendor/pages/commissions.vue +43 -0
- package/app/components/catalog/vendor/pages/crm.vue +67 -0
- package/app/components/catalog/vendor/pages/dashboard.vue +46 -0
- package/app/components/catalog/vendor/pages/emails.vue +43 -0
- package/app/components/catalog/vendor/pages/enquiries.vue +43 -0
- package/app/components/catalog/vendor/pages/invoices.vue +43 -0
- package/app/components/catalog/vendor/pages/orders.vue +68 -0
- package/app/components/catalog/vendor/pages/products.vue +55 -0
- package/app/components/catalog/vendor/pages/reviews.vue +48 -0
- package/app/components/catalog/vendor/pages/shipments.vue +43 -0
- package/app/components/catalog/vendor/pages/stores.vue +43 -0
- package/app/components/content/blocks/breadcrumbs.vue +0 -0
- package/app/components/content/blocks/currencySwitcher.vue +0 -0
- package/app/components/content/blocks/languageSwitcher.vue +0 -0
- package/app/components/content/blocks/videoproduct.vue +9 -0
- package/app/components/content/pages/checkout.vue +118 -0
- package/app/components/content/pages/meeoviGlobal.vue +68 -0
- package/app/components/content/pages/pickup-locations.vue +238 -0
- package/app/components/content/pages/showcases.vue +90 -0
- package/app/components/content/pages/success.vue +60 -0
- package/app/components/marketing/add-brand.vue +54 -0
- package/app/components/marketing/add-incentive.vue +54 -0
- package/app/components/marketing/promotions/giftcards.vue +127 -0
- package/app/components/marketing/promotions/subscriptions.vue +134 -0
- package/app/components/marketing/update-incentive.vue +326 -0
- package/app/components/menus/lowernav.vue +78 -0
- package/app/components/partials/LocaleSelector.vue +24 -0
- package/app/components/partials/ShoppingCart.vue +128 -0
- package/app/components/partials/StripePayment.vue +149 -0
- package/app/components/partials/addToCartBtn.vue +40 -0
- package/app/components/partials/cartItem.vue +124 -0
- package/app/components/partials/checkoutButton.vue +44 -0
- package/app/components/partials/compareBtn.vue +68 -0
- package/app/components/partials/ratings.vue +13 -0
- package/app/components/partials/store/CurrencySelector.vue +133 -0
- package/app/components/partials/store/StoreSwitcher.vue +13 -0
- package/app/components/related/brandCard.vue +41 -0
- package/app/components/related/incentiveCard.vue +44 -0
- package/app/components/related/invoiceCard.vue +43 -0
- package/app/components/related/orderCard.vue +43 -0
- package/app/components/related/relatedproducts.vue +17 -0
- package/app/components/sales/CartPageContent/CartPageContent.vue +43 -0
- package/app/components/sales/CheckoutAddress/CheckoutAddress.vue +50 -0
- package/app/components/sales/CheckoutAddress/__tests__/CheckoutAddress.spec.ts +16 -0
- package/app/components/sales/CheckoutAddress/types.ts +16 -0
- package/app/components/sales/CheckoutPayment/CheckoutPayment.vue +65 -0
- package/app/components/sales/CheckoutPayment/__tests__/CheckoutPayment.spec.ts +14 -0
- package/app/components/sales/CheckoutPayment/types.ts +12 -0
- package/app/components/sales/OrderSummary/OrderSummary.vue +57 -0
- package/app/components/sales/OrderSummary/__tests__/ContactInformation.spec.ts +52 -0
- package/app/components/sales/OrderSummary/types.ts +5 -0
- package/app/components/sales/incentives.vue +247 -0
- package/app/components/sales/invoices.vue +107 -0
- package/app/components/sales/orders.vue +378 -0
- package/app/components/sales/shipments.vue +65 -0
- package/app/components/sales/transactions.vue +109 -0
- package/app/components/shop/add-shop.vue +54 -0
- package/app/components/shop/cart/cartItem.vue +182 -0
- package/app/components/shop/cart/checkout.vue +415 -0
- package/app/components/shop/checkout/StripeCardElement.vue +206 -0
- package/app/components/shop/checkout/StripeCheckout.vue +49 -0
- package/app/components/shop/checkout/addressBilling.vue +263 -0
- package/app/components/shop/checkout/addressShipping.vue +175 -0
- package/app/components/shop/checkout/cart/ProductItem.vue +56 -0
- package/app/components/shop/checkout/cart/PromotionItem.vue +53 -0
- package/app/stores/cart.ts +1 -1
- package/app/types/Direction.type.ts +1 -1
- package/app/types/Global.type.ts +6 -6
- package/app/types/Layout.type.ts +1 -1
- package/app/{normalizers → types/normalizers}/Cart.query.ts +1 -1
- package/app/{normalizers → types/normalizers}/Cart.type.ts +2 -2
- package/app/{normalizers → types/normalizers}/Checkout.query.ts +2 -2
- package/app/{normalizers → types/normalizers}/Config.query.ts +1 -1
- package/app/{normalizers → types/normalizers}/Config.type.ts +1 -1
- package/app/{normalizers → types/normalizers}/ContactForm.query.ts +2 -2
- package/app/{normalizers → types/normalizers}/CreditMemo.type.ts +1 -1
- package/app/{normalizers → types/normalizers}/GiftCard.type.ts +1 -1
- package/app/{normalizers → types/normalizers}/Invoice.type.ts +1 -1
- package/app/{normalizers → types/normalizers}/MyAccount.query.ts +1 -1
- package/app/{normalizers → types/normalizers}/MyAccount.type.ts +1 -1
- package/app/{normalizers → types/normalizers}/NewsletterSubscription.query.ts +1 -1
- package/app/{normalizers → types/normalizers}/Order.query.ts +1 -1
- package/app/{normalizers → types/normalizers}/Order.type.ts +2 -2
- package/app/{normalizers → types/normalizers}/Payment.type.ts +1 -1
- package/app/{normalizers → types/normalizers}/ProductCompare.query.ts +1 -1
- package/app/{normalizers → types/normalizers}/ProductCompare.type.ts +1 -1
- package/app/{normalizers → types/normalizers}/ProductList.query.ts +2 -2
- package/app/{normalizers → types/normalizers}/ProductList.type.ts +2 -2
- package/app/{normalizers → types/normalizers}/Return.type.ts +1 -1
- package/app/{normalizers → types/normalizers}/Review.query.ts +1 -1
- package/app/{normalizers → types/normalizers}/Review.type.ts +1 -1
- package/app/{normalizers → types/normalizers}/StoreInPickUp.query.ts +1 -1
- package/app/{normalizers → types/normalizers}/Subscription.type.ts +1 -1
- package/app/{normalizers → types/normalizers}/Transaction.type.ts +1 -1
- package/app/{normalizers → types/normalizers}/UrlRewrites.query.ts +1 -1
- package/app/{normalizers → types/normalizers}/UrlRewrites.type.ts +1 -1
- package/app/{normalizers → types/normalizers}/Wishlist.query.ts +4 -4
- package/app/{normalizers → types/normalizers}/Wishlist.type.ts +1 -1
- package/app/utils/Address/Address.type.ts +1 -1
- package/app/utils/Address/index.ts +5 -5
- package/app/utils/Cart/Cart.ts +1 -1
- package/app/utils/Currency/Currency.ts +1 -1
- package/app/utils/History/History.type.ts +1 -1
- package/app/utils/Menu/Menu.ts +1 -1
- package/app/utils/Menu/Menu.type.ts +2 -2
- package/app/utils/Orders/Orders.ts +1 -1
- package/app/utils/Preload/CategoryPreload.ts +2 -2
- package/app/utils/Preload/ProductPreload.ts +1 -1
- package/app/utils/Preload/index.ts +1 -1
- package/app/utils/Price/Price.ts +1 -1
- package/app/utils/Product/Extract.ts +1 -1
- package/app/utils/Product/Product.ts +1 -1
- package/app/utils/Product/Product.type.ts +1 -1
- package/app/utils/Product/Transform.ts +1 -1
- package/app/utils/Wishlist/Wishlist.ts +1 -1
- package/app/utils/client.ts +19 -19
- package/package.json +1 -2
- package/tsconfig.json +2 -2
- package/app/cart/useCart.ts +0 -1
- /package/app/{components → composables}/ChevronIcon/ChevronIcon.config.ts +0 -0
- /package/app/{components → composables}/DateSelect/DateSelect.config.ts +0 -0
- /package/app/{components → composables}/Field/Field.config.ts +0 -0
- /package/app/{components → composables}/FieldDate/FieldDate.config.ts +0 -0
- /package/app/{components → composables}/Form/Form.type.ts +0 -0
- /package/app/{components → composables}/Product/Product.config.ts +0 -0
- /package/app/{components → composables}/Product/Stock.config.ts +0 -0
- /package/app/{components → composables}/ProductCustomizableOption/ProductCustomizableOption.config.ts +0 -0
- /package/app/{components → composables}/ProductGallery/ProductGallery.config.ts +0 -0
- /package/app/{components → composables}/ProductReviews/ProductReviews.config.ts +0 -0
- /package/app/{normalizers → types/normalizers}/Category.query.ts +0 -0
- /package/app/{normalizers → types/normalizers}/Category.type.ts +0 -0
- /package/app/{normalizers → types/normalizers}/CheckEmail.query.ts +0 -0
- /package/app/{normalizers → types/normalizers}/Checkout.type.ts +0 -0
- /package/app/{normalizers → types/normalizers}/CmsBlock.query.ts +0 -0
- /package/app/{normalizers → types/normalizers}/CmsBlock.type.ts +0 -0
- /package/app/{normalizers → types/normalizers}/CmsPage.query.ts +0 -0
- /package/app/{normalizers → types/normalizers}/CmsPage.type.ts +0 -0
- /package/app/{normalizers → types/normalizers}/Menu.query.ts +0 -0
- /package/app/{normalizers → types/normalizers}/Menu.type.ts +0 -0
- /package/app/{normalizers → types/normalizers}/ProductAlerts.query.ts +0 -0
- /package/app/{normalizers → types/normalizers}/Region.query.ts +0 -0
- /package/app/{normalizers → types/normalizers}/Region.type.ts +0 -0
- /package/app/{normalizers → types/normalizers}/Slider.query.ts +0 -0
- /package/app/{normalizers → types/normalizers}/Slider.type.ts +0 -0
- /package/app/{normalizers → types/normalizers}/StoreInPickUp.type.ts +0 -0
- /package/app/{routes → types/routes}/CategoryPage/CategoryPage.config.ts +0 -0
- /package/app/{routes → types/routes}/CategoryPage/CategoryPage.type.ts +0 -0
- /package/app/{routes → types/routes}/Checkout/Checkout.config.ts +0 -0
- /package/app/{routes → types/routes}/Checkout/Checkout.type.ts +0 -0
- /package/app/{routes → types/routes}/MyAccount/MyAccount.config.ts +0 -0
- /package/app/{routes → types/routes}/SearchPage/SearchPage.config.ts +0 -0
- /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>
|