Procházet zdrojové kódy

making admin updates

master
unknown před 9 měsíci
rodič
revize
a4be91e5f4
17 změnil soubory, kde provedl 204 přidání a 106 odebrání
  1. +1
    -1
      dist/index.html
  2. +1
    -1
      src/components/modals/Brands/addBrand.vue
  3. +1
    -1
      src/components/modals/Brands/editBrand.vue
  4. +3
    -4
      src/components/modals/attribute/addAttribute.vue
  5. +2
    -2
      src/components/modals/attribute/editAttribute.vue
  6. +2
    -2
      src/components/modals/blogCat/addBlogCat.vue
  7. +2
    -2
      src/components/modals/blogCat/editBlogCat.vue
  8. +3
    -2
      src/components/modals/categories/addCat.vue
  9. +1
    -1
      src/components/modals/categories/editCat.vue
  10. +1
    -1
      src/components/modals/identity/addIdentity.vue
  11. +2
    -4
      src/components/modals/identity/editIdentity.vue
  12. +9
    -1
      src/state/modules/user.js
  13. +1
    -1
      src/views/live-preview/pages/auth2/login.vue
  14. +1
    -1
      src/views/live-preview/pages/banners/addBanner.vue
  15. +169
    -77
      src/views/live-preview/pages/banners/editBanner.vue
  16. +4
    -4
      src/views/live-preview/pages/discounts/editDiscount.vue
  17. +1
    -1
      src/views/live-preview/pages/orders/approvedOrders.vue

+ 1
- 1
dist/index.html Zobrazit soubor

@@ -1,4 +1,4 @@
<!doctype html><html lang=""><head><meta charset="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width,initial-scale=1"/><link rel="icon" id="favicon" href="/favicon.svg"/><link rel="stylesheet" href="/fonts/vazir.css"/><script defer="defer" src="https://bazarce.liara.run/script.js" data-website-id="7baabdd5-3224-41c1-9267-d2a1abd29d01"></script><title>NovinPlast</title><script defer="defer" src="/js/chunk-vendors.1ba8209a.js"></script><script defer="defer" src="/js/app.3f68cdfe.js"></script><link href="/css/chunk-vendors.fd1119e3.css" rel="stylesheet"><link href="/css/app.cbef7f68.css" rel="stylesheet"></head><body lang><noscript><strong>We're sorry but NovinPlast doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script>document.addEventListener("DOMContentLoaded", function () {
<!doctype html><html lang=""><head><meta charset="utf-8"/><meta http-equiv="X-UA-Compatible" content="IE=edge"/><meta name="viewport" content="width=device-width,initial-scale=1"/><link rel="icon" id="favicon" href="/favicon.svg"/><link rel="stylesheet" href="/fonts/vazir.css"/><script defer="defer" src="https://bazarce.liara.run/script.js" data-website-id="7baabdd5-3224-41c1-9267-d2a1abd29d01"></script><title>NovinPlast</title><script defer="defer" src="/js/chunk-vendors.1ba8209a.js"></script><script defer="defer" src="/js/app.a6293eea.js"></script><link href="/css/chunk-vendors.fd1119e3.css" rel="stylesheet"><link href="/css/app.cbef7f68.css" rel="stylesheet"></head><body lang><noscript><strong>We're sorry but NovinPlast doesn't work properly without JavaScript enabled. Please enable it to continue.</strong></noscript><div id="app"></div><script>document.addEventListener("DOMContentLoaded", function () {
const faviconUrl = localStorage.getItem("logo");
if (faviconUrl) {
const faviconLink = document.getElementById("favicon");


+ 1
- 1
src/components/modals/Brands/addBrand.vue Zobrazit soubor

@@ -234,7 +234,7 @@ export default {
})
.catch((error) => {
console.error(error);
toast.error("!مشکلی در ایجاد برند پیش آمد", {
toast.error(`${error.response.data.message}`, {
position: "top-right",
autoClose: 1000,
});


+ 1
- 1
src/components/modals/Brands/editBrand.vue Zobrazit soubor

@@ -254,7 +254,7 @@ export default {
})
.catch((error) => {
console.error(error);
toast.error("!ویرایش برند با مشکل مواجه شد", {
toast.error(`${error.response.data.message}`, {
position: "top-right",
autoClose: 1000,
});


+ 3
- 4
src/components/modals/attribute/addAttribute.vue Zobrazit soubor

@@ -154,8 +154,8 @@ export default {
formData.append("attribute_id", 1);

ApiServiece.post(`admin/attribute-values`, formData)
.then((resp) => {
console.log(resp);
.then(() => {
toast.success("!ویژگی با موفقیت اضافه شد", {
position: "top-right",
autoClose: 1000,
@@ -170,8 +170,7 @@ export default {
}, 500);
})
.catch((error) => {
console.error(error);
toast.success("!مشکلی در ایجاد ویژگی پیش آمد", {
toast.error(`${error.response.data.message}`, {
position: "top-right",
autoClose: 1000,
});


+ 2
- 2
src/components/modals/attribute/editAttribute.vue Zobrazit soubor

@@ -195,8 +195,8 @@ export default {
}, 500);
})
.catch((error) => {
console.error(error);
toast.error("!مشکلی در ویرایش ویژگی پیش آمد", {
toast.error(`${error.response.data.message}`, {
position: "top-right",
autoClose: 1000,
});


+ 2
- 2
src/components/modals/blogCat/addBlogCat.vue Zobrazit soubor

@@ -165,8 +165,8 @@ export default {
}, 500);
})
.catch((error) => {
console.error(error);
toast.error("!مشکلی در اضافه کردن دسته پیش آمد", {
toast.error(`${error.response.data.message}`, {
position: "top-right",
autoClose: 1000,
});


+ 2
- 2
src/components/modals/blogCat/editBlogCat.vue Zobrazit soubor

@@ -197,8 +197,8 @@ export default {
}, 500);
})
.catch((error) => {
console.error(error);
toast.error("!ویرایش دسته با مشکل مواجه شد", {
toast.error(`${error.response.data.message}`, {
position: "top-right",
autoClose: 1000,
});


+ 3
- 2
src/components/modals/categories/addCat.vue Zobrazit soubor

@@ -305,15 +305,16 @@ export default {
document.getElementById("close").click();
emit("cat-updated");
title.value = "";
imagePreview.value = "";
imagePreview.value = null;
image.value = null;
description.value = "";
selectedPaernt.value = ""
selectedIcon.value = "";
}, 500);
})
.catch((error) => {
console.error(error);
toast.error("!افزودن دسته با مشکل مواجه شد", {
toast.error(`${error.response.data.message}`, {
position: "top-right",
autoClose: 1000,
});


+ 1
- 1
src/components/modals/categories/editCat.vue Zobrazit soubor

@@ -358,7 +358,7 @@ export default {
})
.catch((error) => {
console.error(error);
toast.error("!ویراش دسته با مشکل مواجه شد", {
toast.error(`${error.response.data.message}`, {
position: "top-right",
autoClose: 1000,
});


+ 1
- 1
src/components/modals/identity/addIdentity.vue Zobrazit soubor

@@ -186,7 +186,7 @@ export default {
})
.catch((error) => {
console.error(error);
toast.error("!اضافه کردن مشخصه با مشکل مواجه شد", {
toast.error(`${error.response.data.message}`, {
position: "top-right",
autoClose: 1000,
});


+ 2
- 4
src/components/modals/identity/editIdentity.vue Zobrazit soubor

@@ -53,7 +53,6 @@
:reduce="(option) => option.value"
placeholder="دسته ای را انتخاب کنید"
/>
</div>
<small v-if="errors.selectedCat" class="text-danger">
{{ errors.selectedCat }}
@@ -93,7 +92,7 @@
</template>

<script>
import { ref, toRef, watch , computed } from "vue";
import { ref, toRef, watch, computed } from "vue";
import VueSelect from "vue3-select-component";
import { toast } from "vue3-toastify";
import "vue3-toastify/dist/index.css";
@@ -199,8 +198,7 @@ export default {
}, 500);
})
.catch((error) => {
console.error(error);
toast.error("!ویرایش مشخصه با مشکل مواجه شد", {
toast.error(`${error.response.data.message}`, {
position: "top-right",
autoClose: 1000,
});


+ 9
- 1
src/state/modules/user.js Zobrazit soubor

@@ -47,13 +47,16 @@ export const actions = {
if (!data) {
throw new Error("شماره موبایل یا رمز عبور اشتباه است");
}
if (data.data.user.role !== "admin") {
throw new Error("شماره موبایل یا رمز عبور اشتباه است");
}

commit("SET_TOKEN", data.data.token);
localStorage.setItem("token", data.data.token);
} catch (error) {
console.error("Login failed:", error.response?.data || error.message);
throw new Error(
error.response?.data?.msg ||
error.response?.data?.message ||
"ورود با مشکل مواجه شد ...! لطفا دوباره امتحان کنید"
);
} finally {
@@ -77,6 +80,10 @@ export const actions = {
console.log(response.data.data);
const token = response.data.data.token;
const user = response.data.data.user;

if (user.role !== "admin") {
throw new Error("شماره موبایل یا رمز عبور نامعتبر است");
}
localStorage.setItem("token", token);
console.log(token)

@@ -153,6 +160,7 @@ export const actions = {

if (response.data.success) {
console.log(response.data.message);
} else {
console.error("Logout failed: " + response.data.message);
}


+ 1
- 1
src/views/live-preview/pages/auth2/login.vue Zobrazit soubor

@@ -109,7 +109,7 @@ export default {
});
loading.value = false;
console.log("Login successful");
router.push({ name: "dashPage" });
router.push({ name: "products" });
} catch (error) {
console.error("Login failed:", error.message);
Swal.fire({


+ 1
- 1
src/views/live-preview/pages/banners/addBanner.vue Zobrazit soubor

@@ -568,7 +568,7 @@ export default {
};

const submitForm = () => {
console.log(errors.value);
if (!validateForm()) {
toast.error("لطفا فیلد های لازم را وارد نمایید", {
position: "top-right",


+ 169
- 77
src/views/live-preview/pages/banners/editBanner.vue Zobrazit soubor

@@ -112,24 +112,43 @@
<BCol v-if="pageType === 'category' && pannel === 'web'" md="6">
<div class="form-group">
<label class="form-label">صفحه دسته</label>
<select

<VueSelect
style="--vs-min-height: 48px; --vs-border-radius: 8px"
v-model="selectedCatPage"
class="form-select"
:class="{ 'is-invalid': errors.selectedCatPage }"
aria-label="Default select example"
@change="clearError('selectedCatPage')"
placeholder="انخاب صفحه دسته"
>
<option :value="cat.id" v-for="cat in cats" :key="cat.id">
{{ cat.title }}
</option>
</select>
:isLoading="categoryPageSelectorLoader"
:reduce="(option) => option.value"
:options="formattedCatPages"
@search="handleCategoryPageSearch"
placeholder="دسته ای را انتخاب کنید"
/>
</div>
<small v-if="errors.selectedCatPage" class="text-danger">
{{ errors.selectedCatPage }}
</small>
</BCol>

<BCol v-if="pageType === 'brand' && pannel === 'web'" md="6">
<div class="form-group">
<label class="form-label">صفحه برند</label>

<VueSelect
style="--vs-min-height: 48px; --vs-border-radius: 8px"
v-model="selectedBrandPage"
:isLoading="brandSelectorLoader"
:reduce="(option) => option.value"
:options="formattedBrands"
@change="clearError(`selectedBrandPage`)"
placeholder="برندی را انتخاب کنید"
@search="handleBrandSearch"
/>
</div>
<small v-if="errors.selectedBrandPage" class="text-danger">
{{ errors.selectedBrandPage }}
</small>
</BCol>

<BCol v-if="pannel == 'web' && pannel" md="6">
<div class="form-group">
<label class="form-label">انتخاب صفحه فرود</label>
@@ -165,7 +184,10 @@
margin-top: 7px;
"
v-model="selectedLandingProduct"
:reduce="(option) => option.value"
:isLoading="productSelectorLoader"
:options="formattedProducts"
@search="handleProductSearch"
placeholder="محصولی را انتخاب کنید"
/>
<small v-if="errors.selectedLandingProduct" class="text-danger">
@@ -176,18 +198,17 @@
<BCol v-if="landingType === 'cat'" md="6">
<div class="form-group">
<label class="form-label">صفحه کدام دسته ؟</label>
<select
class="form-select"
aria-label="Default select example"
v-model="selectedLandingCat"
<VueSelect
style="--vs-min-height: 48px; --vs-border-radius: 8px"
:isLoading="categorySelectorLoader"
@change="clearError('selectedLandingCat')"
:class="{ 'is-invalid': errors.selectedLandingCat }"
placeholder="انتخاب صفحه دسته"
>
<option :value="cat.id" v-for="cat in cats" :key="cat.id">
{{ cat.title }}
</option>
</select>
v-model="selectedLandingCat"
:reduce="(option) => option.value"
:options="formattedCategories"
placeholder="دسته ای را انتخاب کنید"
@search="handleSearch"
/>
</div>
<small v-if="errors.selectedLandingCat" class="text-danger">
{{ errors.selectedLandingCat }}
@@ -262,17 +283,9 @@
@change="clearError('selectedLoc')"
:class="{ 'is-invalid': errors.selectedLoc }"
placeholder="موقعیت بنر"
:value="(selectedLoc = 'A')"
>
<option value="A">َA-Slideshow</option>
<option value="B">B-Banner</option>
<option value="C">C-Banner</option>
<option value="D">D-Banner</option>
<option value="F">E-Banner</option>
<option value="G">F-Banner</option>
<option value="H">G-Banner</option>
<option value="G">H-Banner</option>
<option value="I">I-Banner</option>
<option value="J">J-Banner</option>
<option value="A">A-Slideshow</option>
</select>
</div>
<small v-if="errors.selectedLoc" class="text-danger">
@@ -384,9 +397,10 @@ export default {
const route = useRoute();
const title = ref();
const pageType = ref();
const products = ref([]);
const brands = ref([]);
const cats = ref([]);
const products = ref([{ id: null, title: "" }]);
const brands = ref([{ id: null, title: "" }]);
const cats = ref([{ id: null, title: "" }]);
const catPages = ref([{ id: null, title: "" }]);
const landingType = ref();
const selectedCatPage = ref();
const selectedLandingCat = ref();
@@ -399,35 +413,105 @@ export default {
const loading = ref(false);
const errors = ref({});

const getCats = () => {
ApiServiece.get(`admin/categories`)
.then((resp) => {
cats.value = resp.data.data;
})
.catch((err) => {
console.log(err);
});
const categorySelectorLoader = ref(false);
const productSelectorLoader = ref(false);
const categoryPageSelectorLoader = ref(false);
const brandSelectorLoader = ref(false);

const formattedCategories = computed(() =>
Array.isArray(cats.value)
? cats.value.map((cat) => ({
value: cat.id,
label: cat.title,
}))
: []
);

const handleSearch = async (searchTerm) => {
if (searchTerm.length < 3) return;
categorySelectorLoader.value = true;
try {
const response = await ApiServiece.get(
`admin/categories?title=${searchTerm}`
);
cats.value = response.data.data;
categorySelectorLoader.value = false;
} catch (error) {
categorySelectorLoader.value = false;
cats.value = [];
}
};

const getBrands = () => {
ApiServiece.get(`admin/brands`)
.then((resp) => {
brands.value = resp.data.data;
console.log(brands.value, "brands");
})
.catch((err) => {
console.log(err);
});
const formattedProducts = computed(() =>
Array.isArray(products.value)
? products.value.map((product) => ({
value: product.id,
label: product.title,
}))
: []
);

const handleProductSearch = async (searchTerm) => {
if (searchTerm.length < 3) return;
productSelectorLoader.value = true;
try {
const response = await ApiServiece.get(
`admin/products?title=${searchTerm}`
);
products.value = response.data.data;
productSelectorLoader.value = false;
} catch (error) {
productSelectorLoader.value = false;
products.value = [];
}
};

const getProduct = () => {
ApiServiece.get(`admin/products`)
.then((resp) => {
products.value = resp.data.data;
})
.catch((err) => {
console.log(err);
});
const formattedCatPages = computed(() =>
Array.isArray(catPages.value)
? catPages.value.map((catPage) => ({
value: catPage.id,
label: catPage.title,
}))
: []
);

const handleCategoryPageSearch = async (searchTerm) => {
if (searchTerm.length < 3) return;
categoryPageSelectorLoader.value = true;
try {
const response = await ApiServiece.get(
`admin/categories?title=${searchTerm}`
);
catPages.value = response.data.data;
categoryPageSelectorLoader.value = false;
} catch (error) {
categoryPageSelectorLoader.value = false;
catPages.value = [];
}
};

const formattedBrands = computed(() =>
Array.isArray(brands.value)
? brands.value.map((brand) => ({
value: brand.id,
label: brand.title,
}))
: []
);

const handleBrandSearch = async (searchTerm) => {
if (searchTerm.length < 3) return;
brandSelectorLoader.value = true;
try {
const response = await ApiServiece.get(
`admin/brands?title=${searchTerm}`
);
brands.value = response.data.data;
brandSelectorLoader.value = false;
} catch (error) {
brandSelectorLoader.value = false;
brands.value = [];
}
};

const handleImageUpload = (event) => {
@@ -446,13 +530,6 @@ export default {
}
};

const formattedProducts = computed(() => {
return products.value.map((product) => ({
value: product.id,
label: product.title,
}));
});

const validateForm = () => {
errors.value = {};
if (!title.value) errors.value.title = "وارد کردن عنوان بنر الزامی است";
@@ -488,6 +565,18 @@ export default {
ApiServiece.get(`admin/banners/${route.params.id}`)
.then((resp) => {
const data = resp.data.data;
cats.value[0].id = resp?.data?.data?.category?.id;
cats.value[0].title = resp?.data?.data?.category?.title;

products.value[0].id = resp?.data?.data?.product?.id;
products.value[0].title = resp?.data?.data?.product?.title;

catPages.value[0].id = resp?.data?.data?.category_page?.id;
catPages.value[0].title = resp?.data?.data?.category_page?.title;

brands.value[0].id = resp?.data?.data?.brand_page?.id;
brands.value[0].title = resp?.data?.data?.brand_page?.title;

title.value = data?.title;
pannel.value = data?.panel;
imagePreview.value = data?.image;
@@ -495,15 +584,13 @@ export default {
selectedLandingCat.value = data?.category_id;
selectedLandingProduct.value = data?.product_id;
pageType.value = data.page_type;
if (data.page_id && pageType.value === 'category') {
if (data.page_id && pageType.value === "category") {
selectedCatPage.value = data?.page_id;
}


if (data.page_id && pageType.value === 'barnd') {
if (data.page_id && pageType.value === "brand") {
selectedBrandPage.value = data?.page_id;
}

if (selectedLandingProduct.value) {
landingType.value = "product";
@@ -512,10 +599,6 @@ export default {
if (selectedLandingCat.value) {
landingType.value = "cat";
}

if (!selectedCatPage.value && !selectedLandingProduct.value) {
pannel.value = "wholesale";
}
})
.catch((err) => {
console.log(err);
@@ -523,9 +606,6 @@ export default {
};

onMounted(() => {
getCats();
getBrands();
getProduct();
getBanner();
});

@@ -623,6 +703,18 @@ export default {
imagePreview,
loading,
brands,
handleSearch,
formattedCategories,
categorySelectorLoader,
handleProductSearch,
productSelectorLoader,
formattedCatPages,
handleCategoryPageSearch,
categoryPageSelectorLoader,
formattedBrands,
brandSelectorLoader,
handleBrandSearch,
selectedBrandPage,
};
},
};


+ 4
- 4
src/views/live-preview/pages/discounts/editDiscount.vue Zobrazit soubor

@@ -306,8 +306,8 @@ export default {

if (discount.value.category_id) {
whichPart.value = "cat";
categories.value[0].id = discount.value.category_id;
categories.value[0].title = "test";
categories.value[0].id = discount.value.category?.id;
categories.value[0].title = discount.value.category?.title;
selectedCat.value = discount.value.category_id;
}

@@ -318,8 +318,8 @@ export default {
selectedProduct.value = discount.value.product_id;
if (discount.value.product_id) {
whichPart.value = "product";
products.value[0].id = discount.value.product_id;
products.value[0].title = "test";
products.value[0].id = discount.value.product?.id;
products.value[0].title = discount.value.product?.title;
selectedProduct.value = discount.value.product_id;
}



+ 1
- 1
src/views/live-preview/pages/orders/approvedOrders.vue Zobrazit soubor

@@ -46,7 +46,7 @@ export default {
if (result.isConfirmed) {
const formData = new FormData();
formData.append("status", status);
ApiServiece.put(`admin/orders/${id}`, formData)
ApiServiece.put(`admin/orders/order-items/${id}`, formData)
.then(() => {
toast.success("تغییر وضعیت سبد خرید با موفقیت انجام شد", {
position: "top-right",


Načítá se…
Zrušit
Uložit