|
@@ -295,6 +295,14 @@
|
|
|
<div class="space-y-1"><label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.nameUa") }}</label><input v-model="matForm.name_ua" required class="w-full bg-background border border-border/50 rounded-xl px-4 py-3 text-sm" /></div>
|
|
<div class="space-y-1"><label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.nameUa") }}</label><input v-model="matForm.name_ua" required class="w-full bg-background border border-border/50 rounded-xl px-4 py-3 text-sm" /></div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
|
|
+ <div class="space-y-1">
|
|
|
|
|
+ <label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.technology") }}</label>
|
|
|
|
|
+ <select v-model="matForm.service_id" class="w-full bg-background border border-border/50 rounded-xl px-4 py-3 text-sm">
|
|
|
|
|
+ <option :value="null">{{ t("admin.fields.selectTechnology") }}...</option>
|
|
|
|
|
+ <option v-for="s in services" :key="s.id" :value="s.id">{{ s.name_en }} ({{ s.tech_type }})</option>
|
|
|
|
|
+ </select>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
<div class="grid grid-cols-1 md:grid-cols-2 gap-4">
|
|
|
<div class="space-y-1"><label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.longDescEn") }}</label><textarea v-model="matForm.long_desc_en" class="w-full bg-background border border-border/50 rounded-xl px-4 py-2 text-xs h-20 resize-none" /></div>
|
|
<div class="space-y-1"><label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.longDescEn") }}</label><textarea v-model="matForm.long_desc_en" class="w-full bg-background border border-border/50 rounded-xl px-4 py-2 text-xs h-20 resize-none" /></div>
|
|
|
<div class="space-y-1"><label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.longDescRu") }}</label><textarea v-model="matForm.long_desc_ru" class="w-full bg-background border border-border/50 rounded-xl px-4 py-2 text-xs h-20 resize-none" /></div>
|
|
<div class="space-y-1"><label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.longDescRu") }}</label><textarea v-model="matForm.long_desc_ru" class="w-full bg-background border border-border/50 rounded-xl px-4 py-2 text-xs h-20 resize-none" /></div>
|
|
@@ -302,7 +310,20 @@
|
|
|
<div class="space-y-1"><label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.longDescUa") }}</label><textarea v-model="matForm.long_desc_ua" class="w-full bg-background border border-border/50 rounded-xl px-4 py-2 text-xs h-20 resize-none" /></div>
|
|
<div class="space-y-1"><label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.longDescUa") }}</label><textarea v-model="matForm.long_desc_ua" class="w-full bg-background border border-border/50 rounded-xl px-4 py-2 text-xs h-20 resize-none" /></div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <div class="space-y-1"><label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.pricePerCm3") }}</label><input v-model.number="matForm.price_per_cm3" type="number" step="any" required class="w-full bg-background border border-border/50 rounded-xl px-4 py-3 text-sm" /></div>
|
|
|
|
|
|
|
+ <div class="grid grid-cols-2 gap-4">
|
|
|
|
|
+ <div class="space-y-1">
|
|
|
|
|
+ <label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.pricePerCm3") }}</label>
|
|
|
|
|
+ <input v-model.number="matForm.price_per_cm3" type="number" step="any" required class="w-full bg-background border border-border/50 rounded-xl px-4 py-3 text-sm" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="space-y-1">
|
|
|
|
|
+ <label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.pricePerHour") }} ({{ t("admin.fields.override") }})</label>
|
|
|
|
|
+ <input v-model.number="matForm.price_per_hour" type="number" step="any" class="w-full bg-background border border-border/50 rounded-xl px-4 py-3 text-sm" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="space-y-1">
|
|
|
|
|
+ <label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.speedCoeff") }}</label>
|
|
|
|
|
+ <input v-model.number="matForm.speed_coeff" type="number" step="0.01" required class="w-full bg-background border border-border/50 rounded-xl px-4 py-3 text-sm" />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
|
|
|
<div class="space-y-1">
|
|
<div class="space-y-1">
|
|
|
<label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.colors") }}</label>
|
|
<label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.colors") }}</label>
|
|
@@ -329,7 +350,10 @@
|
|
|
<form v-if="activeTab === 'services'" @submit.prevent="handleSaveService" class="space-y-4">
|
|
<form v-if="activeTab === 'services'" @submit.prevent="handleSaveService" class="space-y-4">
|
|
|
<div class="space-y-1"><label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.nameEn") }}</label><input v-model="svcForm.name_en" required class="w-full bg-background border border-border/50 rounded-xl px-4 py-3 text-sm" /></div>
|
|
<div class="space-y-1"><label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.nameEn") }}</label><input v-model="svcForm.name_en" required class="w-full bg-background border border-border/50 rounded-xl px-4 py-3 text-sm" /></div>
|
|
|
<div class="space-y-1"><label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.nameRu") }}</label><input v-model="svcForm.name_ru" required class="w-full bg-background border border-border/50 rounded-xl px-4 py-3 text-sm" /></div>
|
|
<div class="space-y-1"><label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.nameRu") }}</label><input v-model="svcForm.name_ru" required class="w-full bg-background border border-border/50 rounded-xl px-4 py-3 text-sm" /></div>
|
|
|
- <div class="space-y-1"><label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.techType") }}</label><input v-model="svcForm.tech_type" required class="w-full bg-background border border-border/50 rounded-xl px-4 py-3 text-sm" /></div>
|
|
|
|
|
|
|
+ <div class="grid grid-cols-2 gap-4">
|
|
|
|
|
+ <div class="space-y-1"><label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.techType") }}</label><input v-model="svcForm.tech_type" required class="w-full bg-background border border-border/50 rounded-xl px-4 py-3 text-sm" /></div>
|
|
|
|
|
+ <div class="space-y-1"><label class="text-[10px] font-bold uppercase ml-1">{{ t("admin.fields.pricePerHour") }}</label><input v-model.number="svcForm.price_per_hour" type="number" step="any" required class="w-full bg-background border border-border/50 rounded-xl px-4 py-3 text-sm" /></div>
|
|
|
|
|
+ </div>
|
|
|
<div class="flex gap-3 pt-6 border-t border-border/10">
|
|
<div class="flex gap-3 pt-6 border-t border-border/10">
|
|
|
<Button type="button" variant="ghost" class="flex-1" @click="closeModals">{{ t("admin.actions.cancel") }}</Button>
|
|
<Button type="button" variant="ghost" class="flex-1" @click="closeModals">{{ t("admin.actions.cancel") }}</Button>
|
|
|
<Button type="submit" variant="hero" class="flex-1">{{ t("admin.actions.save") }}</Button>
|
|
<Button type="submit" variant="hero" class="flex-1">{{ t("admin.actions.save") }}</Button>
|
|
@@ -489,9 +513,10 @@ const matForm = reactive({
|
|
|
name_en: "", name_ru: "", name_ua: "", name_me: "",
|
|
name_en: "", name_ru: "", name_ua: "", name_me: "",
|
|
|
desc_en: "", desc_ru: "", desc_ua: "", desc_me: "",
|
|
desc_en: "", desc_ru: "", desc_ua: "", desc_me: "",
|
|
|
long_desc_en: "", long_desc_ru: "", long_desc_ua: "", long_desc_me: "",
|
|
long_desc_en: "", long_desc_ru: "", long_desc_ua: "", long_desc_me: "",
|
|
|
- price_per_cm3: 0, available_colors: [] as string[], is_active: true
|
|
|
|
|
|
|
+ service_id: null as number | null,
|
|
|
|
|
+ price_per_cm3: 0, price_per_hour: 0, speed_coeff: 1.0, available_colors: [] as string[], is_active: true
|
|
|
});
|
|
});
|
|
|
-const svcForm = reactive({ name_en: "", name_ru: "", name_ua: "", name_me: "", desc_en: "", desc_ru: "", desc_ua: "", desc_me: "", tech_type: "", is_active: true });
|
|
|
|
|
|
|
+const svcForm = reactive({ name_en: "", name_ru: "", name_ua: "", name_me: "", desc_en: "", desc_ru: "", desc_ua: "", desc_me: "", tech_type: "", price_per_hour: 0, is_active: true });
|
|
|
const postForm = reactive({ slug: "", title_en: "", title_me: "", title_ru: "", title_ua: "", category: "Technology", image_url: "", is_published: true });
|
|
const postForm = reactive({ slug: "", title_en: "", title_me: "", title_ru: "", title_ua: "", category: "Technology", image_url: "", is_published: true });
|
|
|
const userForm = reactive({ email: "", password: "", first_name: "", last_name: "", phone: "" });
|
|
const userForm = reactive({ email: "", password: "", first_name: "", last_name: "", phone: "" });
|
|
|
const orderForm = reactive({ total_price: 0, material_name: "", color_name: "", quantity: 1, first_name: "", last_name: "", email: "", phone: "", shipping_address: "", notes: "", review_text: "", rating: 0 });
|
|
const orderForm = reactive({ total_price: 0, material_name: "", color_name: "", quantity: 1, first_name: "", last_name: "", email: "", phone: "", shipping_address: "", notes: "", review_text: "", rating: 0 });
|
|
@@ -716,9 +741,10 @@ function closeModals() {
|
|
|
name_en: "", name_ru: "", name_me: "", name_ua: "",
|
|
name_en: "", name_ru: "", name_me: "", name_ua: "",
|
|
|
desc_en: "", desc_ru: "", desc_ua: "", desc_me: "",
|
|
desc_en: "", desc_ru: "", desc_ua: "", desc_me: "",
|
|
|
long_desc_en: "", long_desc_ru: "", long_desc_ua: "", long_desc_me: "",
|
|
long_desc_en: "", long_desc_ru: "", long_desc_ua: "", long_desc_me: "",
|
|
|
- price_per_cm3: 0, available_colors: [], is_active: true
|
|
|
|
|
|
|
+ service_id: null,
|
|
|
|
|
+ price_per_cm3: 0, price_per_hour: 0, speed_coeff: 1.0, available_colors: [], is_active: true
|
|
|
});
|
|
});
|
|
|
- Object.assign(svcForm, { name_en: "", name_ru: "", name_me: "", name_ua: "", desc_en: "", desc_ru: "", desc_ua: "", desc_me: "", tech_type: "", is_active: true });
|
|
|
|
|
|
|
+ Object.assign(svcForm, { name_en: "", name_ru: "", name_me: "", name_ua: "", desc_en: "", desc_ru: "", desc_ua: "", desc_me: "", tech_type: "", price_per_hour: 0, is_active: true });
|
|
|
Object.assign(userForm, { email: "", password: "", first_name: "", last_name: "", phone: "" });
|
|
Object.assign(userForm, { email: "", password: "", first_name: "", last_name: "", phone: "" });
|
|
|
Object.assign(postForm, { slug: "", title_en: "", title_me: "", title_ru: "", title_ua: "", category: "Technology", image_url: "", is_published: true });
|
|
Object.assign(postForm, { slug: "", title_en: "", title_me: "", title_ru: "", title_ua: "", category: "Technology", image_url: "", is_published: true });
|
|
|
Object.assign(orderForm, { total_price: 0, material_name: "", color_name: "", quantity: 1, first_name: "", last_name: "", email: "", phone: "", shipping_address: "", notes: "", review_text: "", rating: 0 });
|
|
Object.assign(orderForm, { total_price: 0, material_name: "", color_name: "", quantity: 1, first_name: "", last_name: "", email: "", phone: "", shipping_address: "", notes: "", review_text: "", rating: 0 });
|