2022-01-10 12:03:57 +00:00
|
|
|
<template>
|
|
|
|
|
<a-modal
|
|
|
|
|
v-model="visible"
|
|
|
|
|
:title="trans('Create request')"
|
|
|
|
|
:after-close="() => $emit('close')"
|
|
|
|
|
:destroy-on-close="true"
|
|
|
|
|
:width="960"
|
|
|
|
|
>
|
|
|
|
|
<a-form
|
|
|
|
|
:label-col="{ span: 4 }"
|
|
|
|
|
:wrapper-col="{ span: 20 }"
|
|
|
|
|
label-align="left"
|
|
|
|
|
@keypress.enter.native="submit"
|
|
|
|
|
>
|
|
|
|
|
<div class="flex space-x-3">
|
|
|
|
|
<div class="w-8/12">
|
|
|
|
|
<a-form-item
|
|
|
|
|
:label="trans('Your name')"
|
|
|
|
|
>
|
|
|
|
|
<a-input v-model="form.name" :placeholder="trans('Your name')" />
|
2022-01-14 12:00:05 +00:00
|
|
|
<template v-if="validationErrorsObj.name">
|
|
|
|
|
<span class="validation-error" v-for="item in validationErrorsObj.name" :key="item">{{ item }}</span>
|
|
|
|
|
</template>
|
2022-01-10 12:03:57 +00:00
|
|
|
</a-form-item>
|
|
|
|
|
<a-form-item
|
|
|
|
|
:label="trans('Phone')"
|
|
|
|
|
>
|
2022-01-14 13:01:53 +00:00
|
|
|
<vue-country-code
|
|
|
|
|
@onSelect="onSelect"
|
|
|
|
|
:preferredCountries="['tm']"
|
|
|
|
|
:defaultCountry="'tm'">
|
|
|
|
|
</vue-country-code>
|
|
|
|
|
<span>{{ countryCode }}</span>
|
2022-01-10 12:03:57 +00:00
|
|
|
<a-input v-model="form.phone" :placeholder="trans('Phone')" />
|
2022-01-14 12:00:05 +00:00
|
|
|
<template v-if="validationErrorsObj.phone">
|
|
|
|
|
<span class="validation-error" v-for="item in validationErrorsObj.phone" :key="item">{{ item }}</span>
|
|
|
|
|
</template>
|
2022-01-10 12:03:57 +00:00
|
|
|
</a-form-item>
|
|
|
|
|
<a-form-item
|
|
|
|
|
:label="trans('Email')"
|
|
|
|
|
>
|
|
|
|
|
<a-input v-model="form.email" :placeholder="trans('Email')" />
|
2022-01-14 12:00:05 +00:00
|
|
|
<template v-if="validationErrorsObj.email">
|
|
|
|
|
<span class="validation-error" v-for="item in validationErrorsObj.email" :key="item">{{ item }}</span>
|
|
|
|
|
</template>
|
|
|
|
|
</a-form-item>
|
|
|
|
|
<a-form-item
|
|
|
|
|
:label="'Password'"
|
|
|
|
|
>
|
|
|
|
|
<a-input v-model="form.password" type="password" :placeholder="trans('Password')" />
|
|
|
|
|
<template v-if="validationErrorsObj.password">
|
|
|
|
|
<span class="validation-error" v-for="item in validationErrorsObj.password" :key="item">{{ item }}</span>
|
|
|
|
|
</template>
|
2022-01-10 12:03:57 +00:00
|
|
|
</a-form-item>
|
|
|
|
|
<a-form-item :label="trans('Type')">
|
|
|
|
|
<a-radio-group v-model="type" button-style="solid">
|
|
|
|
|
<a-radio-button value="local">
|
|
|
|
|
{{ trans("Local") }}
|
|
|
|
|
</a-radio-button>
|
|
|
|
|
<a-radio-button value="int">
|
|
|
|
|
{{ trans("Inter") }}
|
|
|
|
|
</a-radio-button>
|
|
|
|
|
</a-radio-group>
|
|
|
|
|
</a-form-item>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="w-2/12"></div>
|
|
|
|
|
</div>
|
|
|
|
|
<div
|
|
|
|
|
class="flex relative space-x-3"
|
|
|
|
|
v-for="(item, index) in form.items"
|
|
|
|
|
:key="item.id"
|
|
|
|
|
>
|
|
|
|
|
<div class="absolute bottom-8 -left-3 w-5 text-right">
|
|
|
|
|
{{ index + 1 }}.
|
|
|
|
|
</div>
|
|
|
|
|
<a-form-item
|
|
|
|
|
class="w-full"
|
|
|
|
|
:label-col="{ span: 24 }"
|
|
|
|
|
:wrapper-col="{ span: 24 }"
|
|
|
|
|
label-align="left"
|
|
|
|
|
>
|
|
|
|
|
<a-input :value="item.title" disabled />
|
|
|
|
|
</a-form-item>
|
|
|
|
|
<!-- <a-form-item
|
|
|
|
|
class="w-3/12"
|
|
|
|
|
:label="index === 0 ? 'Mukdary' : ''"
|
|
|
|
|
:label-col="{ span: 24 }"
|
|
|
|
|
:wrapper-col="{ span: 24 }"
|
|
|
|
|
label-align="left"
|
|
|
|
|
:validateStatus="formStatus(`items.${index}.count`)"
|
|
|
|
|
>
|
|
|
|
|
<a-input v-model.number="item.count" :addon-after="item.unit" />
|
|
|
|
|
</a-form-item> -->
|
|
|
|
|
</div>
|
|
|
|
|
</a-form>
|
|
|
|
|
<div class="border-t pt-4 border-gray-300 text-right">
|
|
|
|
|
<span class="font-bold"
|
|
|
|
|
>{{ trans("Total") }}: {{ selectedItems.length }} x {{ price }}
|
|
|
|
|
{{ currency }} =</span
|
|
|
|
|
>
|
|
|
|
|
<span class="font-bold text-primary"
|
|
|
|
|
>{{ totalPrice }} {{ currency }}</span
|
|
|
|
|
>
|
|
|
|
|
</div>
|
|
|
|
|
<div slot="footer" class="flex items-center justify-end">
|
2022-01-14 12:00:05 +00:00
|
|
|
<!-- <google-re-captcha-v3
|
2022-01-10 12:03:57 +00:00
|
|
|
ref="captcha"
|
|
|
|
|
v-model="form.captcha"
|
|
|
|
|
inline
|
|
|
|
|
action="create_request"
|
2022-01-14 12:00:05 +00:00
|
|
|
/> -->
|
2022-01-10 12:03:57 +00:00
|
|
|
<a-button
|
|
|
|
|
type="primary"
|
|
|
|
|
class="ml-5"
|
|
|
|
|
size="large"
|
|
|
|
|
@click="submit"
|
|
|
|
|
:loading="form.processing"
|
2022-01-14 12:00:05 +00:00
|
|
|
:disabled="loader"
|
|
|
|
|
>{{ loader ? '...' : trans("Create") }}</a-button
|
2022-01-10 12:03:57 +00:00
|
|
|
>
|
|
|
|
|
</div>
|
|
|
|
|
</a-modal>
|
|
|
|
|
</template>
|
|
|
|
|
|
|
|
|
|
<script>
|
2022-01-14 12:00:05 +00:00
|
|
|
// import GoogleReCaptchaV3 from "./GoogleReCaptchaV3";
|
2022-01-10 12:03:57 +00:00
|
|
|
export default {
|
|
|
|
|
props: {
|
|
|
|
|
selectedItems: { type: Array, default: () => [] },
|
|
|
|
|
},
|
|
|
|
|
|
2022-01-14 12:00:05 +00:00
|
|
|
// components: {
|
|
|
|
|
// GoogleReCaptchaV3,
|
|
|
|
|
// },
|
2022-01-10 12:03:57 +00:00
|
|
|
|
|
|
|
|
data() {
|
|
|
|
|
return {
|
|
|
|
|
visible: true,
|
|
|
|
|
type: "local",
|
|
|
|
|
form: this.$inertia.form({
|
|
|
|
|
name: undefined,
|
|
|
|
|
phone: undefined,
|
|
|
|
|
email: undefined,
|
2022-01-14 12:00:05 +00:00
|
|
|
password: undefined,
|
2022-01-10 12:03:57 +00:00
|
|
|
captcha: undefined,
|
|
|
|
|
items: [
|
|
|
|
|
{
|
|
|
|
|
id: undefined,
|
|
|
|
|
title: undefined,
|
|
|
|
|
// count: undefined,
|
|
|
|
|
},
|
|
|
|
|
],
|
|
|
|
|
}),
|
2022-01-14 12:00:05 +00:00
|
|
|
validationErrorsObj: {},
|
2022-01-14 13:01:53 +00:00
|
|
|
loader: false,
|
|
|
|
|
countryCode: '',
|
2022-01-10 12:03:57 +00:00
|
|
|
};
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
computed: {
|
|
|
|
|
currency() {
|
|
|
|
|
return this.type === "local" ? "TMT" : "USD";
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
price() {
|
|
|
|
|
const { local_price, int_price } = this.$page.props;
|
|
|
|
|
return this.type === "local" ? local_price : int_price;
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
totalPrice() {
|
|
|
|
|
return this.selectedItems.length * this.price;
|
|
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
mounted() {
|
|
|
|
|
this.fill();
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
beforeDestroy() {
|
|
|
|
|
window.location.reload();
|
|
|
|
|
},
|
|
|
|
|
|
|
|
|
|
methods: {
|
|
|
|
|
fill() {
|
|
|
|
|
this.form = {
|
|
|
|
|
...this.form,
|
|
|
|
|
items: this.selectedItems.map((item) => ({
|
|
|
|
|
...item,
|
|
|
|
|
// count: undefined,
|
|
|
|
|
})),
|
|
|
|
|
};
|
|
|
|
|
},
|
|
|
|
|
|
2022-01-14 13:01:53 +00:00
|
|
|
onSelect({name, iso2, dialCode}) {
|
|
|
|
|
console.log(name, iso2, dialCode);
|
|
|
|
|
this.countryCode = dialCode
|
|
|
|
|
},
|
|
|
|
|
|
2022-01-10 12:03:57 +00:00
|
|
|
submit() {
|
2022-01-14 12:00:05 +00:00
|
|
|
// this.form.post(this.route('requests.store'), {
|
|
|
|
|
// onSuccess: (res) => {
|
|
|
|
|
// alert('we are in success section')
|
|
|
|
|
// console.log(res.hello)
|
|
|
|
|
// this.visible = false;
|
|
|
|
|
// this.$message.success(this.trans("Success message"));
|
|
|
|
|
|
|
|
|
|
// },
|
|
|
|
|
// onError: (error) => {
|
|
|
|
|
// alert('we are in errors section')
|
|
|
|
|
// if (error) {
|
|
|
|
|
// this.$message.error('Invalida data');
|
|
|
|
|
// }
|
|
|
|
|
// },
|
|
|
|
|
// })
|
|
|
|
|
this.loader = true
|
|
|
|
|
|
|
|
|
|
fetch(this.route('requests.store'), {
|
|
|
|
|
method: 'POST',
|
|
|
|
|
headers: {
|
|
|
|
|
'Content-Type': 'application/json',
|
|
|
|
|
'X-CSRF-TOKEN': document.querySelector('meta[name="csrf-token"]').getAttribute('content')
|
2022-01-10 12:03:57 +00:00
|
|
|
},
|
2022-01-14 12:00:05 +00:00
|
|
|
body: JSON.stringify(this.form) // body data type must match "Content-Type" header
|
|
|
|
|
})
|
|
|
|
|
.then(res => res.json())
|
|
|
|
|
.then(res => {
|
|
|
|
|
alert('we are in success section')
|
|
|
|
|
switch (res.status) {
|
|
|
|
|
|
|
|
|
|
case 400: // validation failed
|
|
|
|
|
this.validationErrorsObj = {}
|
|
|
|
|
|
|
|
|
|
// this.errorsArr = []
|
|
|
|
|
|
|
|
|
|
let errorValidation = res.validationErrors
|
|
|
|
|
|
|
|
|
|
for (let key in errorValidation) {
|
|
|
|
|
|
|
|
|
|
this.validationErrorsObj[key] = []
|
|
|
|
|
|
|
|
|
|
for(let i = 0; i < errorValidation[key].length; i++) {
|
|
|
|
|
this.validationErrorsObj[key].push(errorValidation[key][i])
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
console.log(this.validationErrorsObj)
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 401: // not registered yet or invalid credentials
|
|
|
|
|
this.$message.error('Unauthorized');
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 500:
|
|
|
|
|
this.$message.error('Internal Server Error');
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 201: // success: withdraw from a balance and create a request
|
|
|
|
|
this.visible = false;
|
|
|
|
|
this.$message.success(this.trans("Success message"));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case 300: // not enough money on a balance
|
|
|
|
|
this.$message.error(res.message);
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
this.$message.error('Something went wrong. Try later.');
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
this.loader = false
|
|
|
|
|
})
|
|
|
|
|
.catch(err => {
|
|
|
|
|
alert('we are in errors section')
|
|
|
|
|
console.log(err)
|
|
|
|
|
this.loader = false
|
|
|
|
|
})
|
2022-01-10 12:03:57 +00:00
|
|
|
},
|
|
|
|
|
},
|
|
|
|
|
};
|
|
|
|
|
</script>
|
2022-01-14 12:00:05 +00:00
|
|
|
|
|
|
|
|
<style>
|
|
|
|
|
.validation-error {
|
|
|
|
|
color: rgb(255, 0, 0);
|
|
|
|
|
}
|
|
|
|
|
</style>
|