This commit is contained in:
alirezakarari
2021-01-30 22:35:05 +03:30
parent 8d06c89a89
commit b05899d062
14 changed files with 1735 additions and 532 deletions
+2 -2
View File
@@ -26,7 +26,7 @@
width: 100%;
height: 100%;
border: 3px solid transparent;
border-left: 3px solid #1DA57A;
border-left: 3px solid #28ace0;
border-radius: 50%;
-webkit-box-sizing: border-box;
box-sizing: border-box;
@@ -43,7 +43,7 @@
width: 100%;
height: 100%;
border: 3px solid transparent;
border-left: 3px solid #1DA57A;
border-left: 3px solid #28ace0;
-webkit-animation: rotateOpacity 1s ease infinite .2s;
animation: rotateOpacity 1s ease infinite .2s;
border-radius: 50%;
+83 -4
View File
@@ -1,3 +1,7 @@
<!-- =========================================================================================
File Name: App.vue
Description: Main vue file - APP
@@ -66,21 +70,96 @@ export default {
// Then we set the value in the --vh custom property to the root of the document
document.documentElement.style.setProperty('--vh', `${vh}px`)
},
async created () {
async created() {
//console.log("this ==> ", this);
const dict = {
attributes: {
old: "رمز عبور فعلی",
confirm_password: "تکرار رمز عبور فعلی",
password: "رمز عبور",
email: 'ایمیل',
mobile: 'موبایل',
fname: 'نام',
phone: 'تلفن',
zip: 'کد پستی',
address: 'آدرس',
state: 'استان',
city: 'شهر',
company: 'دریافت کننده',
lname: 'نام خانوادگی',
},
messages: {
required: (field) => `وارد کردن ${field} الزامی است`,
email: (field) => 'ایمیل وارد شده نامعتبر می باشد',
min: (field) => 'مقدار ورودی صحیح نیست',
max: (field) => 'مقدار ورودی صحیح نیست',
alpha_dash: (field) => 'مقدار ورودی صحیح نیست',
digits: (field) => 'مقدار ورودی صحیح نیست'
}
};
this.$validator.localize('fa', dict);
// jwt
jwt.init()
const dir = this.$vs.rtl ? 'rtl' : 'ltr'
document.documentElement.setAttribute('dir', dir)
//const dir = this.$vs.rtl ? 'rtl' : 'ltr'
// document.documentElement.setAttribute('dir', dir)
window.addEventListener('resize', this.handleWindowResize)
window.addEventListener('scroll', this.handleScroll)
// Auth0
try { await this.$auth.renewTokens() } catch (e) { console.error(e) }
try {
await this.$auth.renewTokens()
} catch (e) {
console.error(e)
}
},
// async created () {
//
// //console.log("this ==> ", this);
// const dict = {
// attributes: {
// old: "رمز عبور فعلی",
// confirm_password: "تکرار رمز عبور فعلی",
// password: "رمز عبور",
// email: 'ایمیل',
// mobile: 'موبایل',
// fname: 'نام',
// phone: 'تلفن',
// zip: 'کد پستی',
// address: 'آدرس',
// state: 'استان',
// city: 'شهر',
// company: 'دریافت کننده',
// lname: 'نام خانوادگی',
// },
// messages: {
// required: (field) => `وارد کردن ${field} الزامی است`,
// email: (field) => 'ایمیل وارد شده نامعتبر می باشد',
// min: (field) => 'مقدار ورودی صحیح نیست',
// max: (field) => 'مقدار ورودی صحیح نیست',
// alpha_dash: (field) => 'مقدار ورودی صحیح نیست',
// digits: (field) => 'مقدار ورودی صحیح نیست'
// }
// };
// this.$validator.localize('fa', dict);
//
// // jwt
// jwt.init()
//
// const dir = this.$vs.rtl ? 'rtl' : 'ltr'
// document.documentElement.setAttribute('dir', dir)
//
// window.addEventListener('resize', this.handleWindowResize)
// window.addEventListener('scroll', this.handleScroll)
//
// // Auth0
// try { await this.$auth.renewTokens() } catch (e) { console.error(e) }
//
// },
destroyed () {
window.removeEventListener('resize', this.handleWindowResize)
window.removeEventListener('scroll', this.handleScroll)
@@ -31,7 +31,7 @@
<!-- Logo -->
<router-link tag="div" class="vx-logo cursor-pointer flex items-center" to="/">
<img src="../../../../public/logo.svg" width="75px"/>
<img src="../../../../public/logo.svg" width="150px"/>
<span class="vx-logo-text text-primary" v-show="isMouseEnter || !reduce" v-if="title">{{ title }}</span>
</router-link>
<!-- /Logo -->
@@ -27,6 +27,9 @@ export default [
icon: "AlignJustifyIcon",
i18n: "اطلاعات پرسنلی",
},
{
url: "/auth/register",
},
]
+8 -8
View File
@@ -24,14 +24,14 @@ const router = new Router({
rule: 'editor'
}
},
// {
// path: '/auth/register',
// name: 'auth-register',
// component: () => import('@/views/auth/Register.vue'),
// meta: {
// rule: 'editor'
// }
// },
{
path: '/auth/register',
name: 'auth-register',
component: () => import('./views/register/Register.vue'),
meta: {
rule: 'editor'
}
},
// {
// path: '/auth/forgot-password',
// name: 'auth-forget',
+1 -1
View File
@@ -2,7 +2,7 @@
<div id="loading-bg">
<div class="loading-logo">
<img src="@/assets/images/logo/logo.svg" width="130px" alt="Logo">
<img src="@/assets/images/logo/logo.svg" width="150px" alt="Logo">
</div>
<div class="loading">
+20 -34
View File
@@ -1,15 +1,4 @@
<!-- =========================================================================================
File Name: Login.vue
Description: Login Page
----------------------------------------------------------------------------------------
Item Name: Vuexy - Vuejs, HTML & Laravel Admin Dashboard Template
Author: Pixinvent
Author URL: http://www.themeforest.net/user/pixinvent
========================================================================================== -->
<template>
<div class="h-screen flex w-full bg-img vx-row no-gutter items-center justify-center" id="page-login">
<div class="vx-col sm:w-1/2 md:w-1/2 lg:w-2/4 xl:w-1/4 sm:m-0 m-4">
<vx-card>
@@ -17,16 +6,18 @@
<div class="vx-row no-gutter justify-center items-center">
<!-- <div class="vx-col hidden lg:block lg:w-1/2">
<img src="@/assets/images/pages/login.png" alt="login" class="mx-auto">
</div>-->
<div class="vx-col sm:w-full md:w-full lg:w-full d-theme-dark-bg">
<div class="px-4 pt-1 login-tabs-container flex items-stretch flex-col justify-center ">
<img src="@/assets/images/logo.svg" width="120px" height="120px" class="mx-auto">
<div class="vx-card__title mb-4">
<h4 class="mb-4">
ورود
{{$t('Login')}}
</h4>
<p>
به آسکو خوش آمدید.
</p>
<p>{{$t('Welcome Login')}}</p>
</div>
<div>
<vs-input
@@ -36,11 +27,11 @@
icon-no-border
icon="icon icon-user"
icon-pack="feather"
label-placeholder="شماره تلفن همراه یا ایمیل"
:label-placeholder="$t('Mail or Mobile')"
v-model="email"
@keydown.enter="loginJWT"
class="w-full"/>
<span class="text-danger text-sm">شماره موبایل الزامی است.</span>
<span class="text-danger text-sm">{{ errors.first('mobile') }}</span>
<vs-input
data-vv-validate-on="blur"
@@ -50,26 +41,29 @@
icon-no-border
icon="icon icon-lock"
icon-pack="feather"
label-placeholder="رمزعبور"
:label-placeholder="$t('Password')"
v-model="password"
@keydown.enter="loginJWT"
class="w-full mt-8" />
<span class="text-danger text-sm">رمزعبور الزامی است.</span>
<span class="text-danger text-sm">{{ errors.first('password') }}</span>
<div class="flex flex-wrap justify-between my-5">
<router-link to="/auth/forgot-password">
رمز عبور خود را فراموش کردم
</router-link>
<!-- <router-link to="/auth/forgot-password">
{{$t('Forgot Password')}}
</router-link>-->
</div>
<div class="flex flex-wrap justify-between mb-3 ">
<vs-button class="mx-auto" :disabled="!validateForm" @click="loginJWT" >
ورود
{{$t('Login')}}
</vs-button>
</div>
<div>
<router-link to="/auth/register">
آیا شما ثبت نام نکرده اید ؟
</router-link>
<!-- <router-link to="/auth/register">
{{$t('Are you register')}}
</router-link>-->
<a-button type="link" @click="registerUser">
آیا هنوز ثبت نام نکرده اید؟
</a-button>
</div>
</div>
</div>
@@ -133,13 +127,6 @@
}
this.$vs.loading.close()
this.$message.error(msg);
/*this.$vs.notify({
title: 'خطا در ورود',
text: msg,
iconPack: 'feather',
icon: 'icon-alert-circle',
color: 'danger',
})*/
})
},
registerUser() {
@@ -165,4 +152,3 @@
}
</style>
+26 -27
View File
@@ -1,8 +1,9 @@
<template>
<div>
<a-card>
<a-tabs default-active-key="1" style="direction: ltr" @change="changeTab()">
<a-tabs default-active-key="1" style="direction: ltr" >
<a-tab-pane key="2" tab="مدیریت شهرها">
<div>
@@ -16,14 +17,13 @@
<div class="col-span-5">
<a-select
class="mt-3"
class="mt-5"
mode="multiple"
:default-value="[]"
style="width: 100%;direction: rtl !important;"
size="large"
style="width: 100%;direction: ltr !important;"
placeholder="انتخاب شهر"
>
<a-select-option v-for="item,index in cities" :key="item.id">
<a-select-option v-for="item,index in cities" :key="item.id" style="direction: rtl !important;">
{{item.title}}
</a-select-option>
</a-select>
@@ -39,16 +39,16 @@
<a-form-item label="شغل">
<a-input
v-decorator="['title',{rules: [{ required: false, message: 'وارد کردن شغل الزامی است' }]}]"/>
v-decorator="['title',{rules: [{ required: true, message: 'وارد کردن شغل الزامی است' }],},]"/>
</a-form-item>
<a-form-item label="شهر های همکاری">
<a-select
class="mt-3"
mode="multiple"
size="large"
style="width: 100%;direction: rtl !important;"
placeholder="انتخاب شهر"
v-decorator="['cities',{rules: [{ required: false, message: 'وارد کردن شهر های همکاری الزامی است' }]}]"
v-decorator="['cities',{rules: [{ required: true, message: 'وارد کردن شهر های همکاری الزامی است' }],},]"
>
<a-select-option v-for="item,index in cities" :key="`${item.id}`">
{{item.title}}
@@ -76,7 +76,7 @@
<template slot="cities_str_slot" slot-scope="items">
<a-tag v-for="item,index in items" >{{item}}</a-tag>
<a-tag v-for="item,index in items" :key="index" >{{item}}</a-tag>
</template>
<template slot="operator" slot-scope="id">
@@ -101,9 +101,9 @@
ویرایش
</a-button>
</template>
<a-button type="primary">
<!-- <a-button type="primary">
Primary
</a-button>
</a-button>-->
</ATable>
@@ -127,12 +127,12 @@
okText="ثبت تغییرات "
@ok="saveEditJob"
cancelText="بستن"
title="ویرایش شفل" >
title="ویرایش شغل" >
<a-form :form="fromJobEdit" @submit="saveEditJob" >
<a-form-item label="شغل">
<a-input
v-decorator="['title',{rules: [{ required: false, message: 'وارد کردن شغل الزامی است' }]}]"/>
v-decorator="['title',{rules: [{ required: true, message: 'وارد کردن شغل الزامی است' }]}]"/>
</a-form-item>
<a-form-item label="شهر های همکاری">
@@ -140,11 +140,11 @@
class="mt-3"
mode="multiple"
style="width: 100%;direction: rtl !important;"
size="large"
autocomplete="off"
placeholder="انتخاب شهر"
v-decorator="['cities',{rules: [{ required: false, message: 'وارد کردن شهر های همکاری الزامی است' }],},]"
v-decorator="['cities',{rules: [{ required: true, message: 'وارد کردن شهر های همکاری الزامی است' }]}]"
>
<a-select-option v-for="item,index in cities" :key="`${item.id}`">
<a-select-option v-for="(item,index) in cities" :key="`${item.id}`">
{{item.title}}
</a-select-option>
</a-select>
@@ -166,6 +166,7 @@
import XTable from "@/components/x-table/XTable";
import axios from "@/axios";
export default {
data() {
return {
@@ -218,18 +219,15 @@
e.preventDefault();
this.fromJobEdit.validateFields((err, values) => {
if (!err) {
values.id=this.currentJobID;
axios.post('/jobs',values)
.then((res)=>{
//console.log(res.data);
this.$message.success('اطلاعات با موفقیت ثبت شد');
this.getJobs();
this.showAddJob=false;
}).catch((error)=>{
try{
values.id=this.currentJobID;
axios.post('/jobs',values)
this.$message.success('اطلاعات با موفقیت ثبت شد');
this.getJobs();
this.showJobEditModal = false;
}catch (e) {
this.$message.error('خطا در دریافت اطلاعات');
});
// console.log('Received values of form: ', values);
//this.$store.commit('update', values);
}
}
});
},
@@ -330,6 +328,7 @@
}
</script>
<style>
.ant-pagination
{
File diff suppressed because it is too large Load Diff
+2 -3
View File
@@ -5,9 +5,8 @@ tbl.add(new Xtc('name', 'نام و نام خانوادگی').filterText());
tbl.add(new Xtc('fname', 'کد پرسنلی').filterText())
tbl.add(new Xtc('id', 'شماره بیمه').filterText())
tbl.add(new Xtc('ncode', 'کد ملی').filterText())
tbl.add(new Xtc('created_at', 'ثبت نام').filterDate().noSort())
tbl.add(new Xtc('updated_at', 'به روز رسانی').filterText().noSort())
tbl.add(new Xtc('caj', 'ثبت نام').filterDate().noSort())
tbl.add(new Xtc('uaj', 'به روز رسانی').filterText().noSort())
tbl.add(new Xtc('operator', 'عملیات').filterSwitch().renderSlot('operator').noSort())
/*tbl.addOpt()*/
export default tbl;
+87 -15
View File
@@ -6,7 +6,8 @@
<a-switch default-checked class="mr-2"/>
</a-form-item>
</div>
<x-table :model="cols" class="mt-3">
<x-table
:model="cols" class="mt-3">
<template slot="operator" slot-scope="text,record">
<a-dropdown>
<a class="ant-dropdown-link" @click="e => e.preventDefault()">
@@ -14,7 +15,7 @@
</a>
<a-menu slot="overlay">
<a-menu-item>
<a href="javascript:;" @click="showMosahebe()">مشاهده مصاحبه</a>
<a href="javascript:;" @click="showMosahebe(text.record.id)">مشاهده مصاحبه</a>
</a-menu-item>
<a-menu-item>
@@ -22,7 +23,7 @@
</a-menu-item>
<a-menu-item>
<a href="javascript:;" @click="showAddMosahebe()">ثبت مصاحبه</a>
<a href="javascript:;" @click="showAddMosahebe(text.record.id)">ثبت مصاحبه</a>
</a-menu-item>
<a-menu-item>
@@ -33,13 +34,63 @@
</template>
</x-table>
<a-modal v-model="showMosahebeModal" title="مشاهده مصاحبه ها" >
<a-modal :width="1000" v-model="showMosahebeModal" title="مشاهده مصاحبه ها" >
<div v-if="is_skeleton">
<ASkeleton/>
</div>
<div v-else>
<div v-if="interview.length == 0">
<a-card>
مصاحبه ای ثبت نشده است.
</a-card>
</div>
<div v-else>
<div v-for="item in interview" v-if="interview">
<a-card :title="item.caj" class="mt-10">
<a-descriptions>
<a-descriptions-item label="تاریخ مصاحبه">
{{ item.interview_at }}
</a-descriptions-item>
<a-descriptions-item label="مصاحبه کننده">
{{ item.interviewer }}
</a-descriptions-item>
<a-descriptions-item label="وضعیت">
{{ item.type }}
</a-descriptions-item>
</a-descriptions>
<a-card title="جزییات">
<a-list>
<a-list-item v-for="element,index in item.result" :key="index" v-if="item.result">
<div class="flex w-full flex-col">
<div class="flex justify-between w-full items-center">
<h3>{{title_interview[index]}}</h3>
<div>
<a-tag color="blue">
نمره: {{element.score}}
</a-tag>
<a-tag color="green" v-if="element.sts == 1">
قبول
</a-tag>
</div>
</div>
<a-divider/>
<p v-if="element.desc">{{ element.desc }}</p>
<p v-else>بدون توضیحات</p>
</div>
</a-list-item>
</a-list>
</a-card>
</a-card>
</div>
</div>
</div>
<template slot="footer">
<a-button key="back" @click="showMosahebeModal=false">
بستن
</a-button>
</template>
</a-modal>
@@ -73,10 +124,9 @@
<div class="steps-content">
<a-form :form="fromMosahebe">
<div v-show="current==0" class="mt-4">
<p style="font-weight: bold">موضوع بررسی</p>
<a-card title="مشاغل" :bordered="true" class="mt-3">
<div class="grid sm:grid-cols-1 md:grid-cols-2 md:gap-3 lg:grid-cols-2 lg:gap-3">
<div>
@@ -277,7 +327,6 @@
</a-modal>
<a-modal :width="800" v-model="showInformationModal" title="جزییات درخواست" >
<template slot="footer">
<a-button key="back" @click="showInformationModal=false">
@@ -291,8 +340,8 @@
<div>نام و نام خانوادگی : {{ personalInformation.name }}</div>
<div>کد ملی : {{ personalInformation.ncode }}</div>
<div>موبایل : {{ personalInformation.mobile }}</div>
<div>تاریخ ثبت نام : {{ personalInformation.created_at }}</div>
<div>تاریخ به روز رسانی : {{ personalInformation.updated_at }}</div>
<div>تاریخ ثبت نام : {{ personalInformation.caj }}</div>
<div>تاریخ به روز رسانی : {{ personalInformation.uaj }}</div>
<div>شغل متقاضی : {{ personalInformation.job_title }}</div>
<div>نام پدر : {{ personalInformation.father_name }}</div>
<div>تاریخ تولد : {{ personalInformation.birth_date }}</div>
@@ -355,7 +404,7 @@
<script>
import * as TableCol from './proposalTbl';
import XTable from "@/components/x-table/XTable.vue";
import XTable from "@/components/x-table/XTable";
import axios from "@/axios";
import VuePersianDatetimePicker from "vue-persian-datetime-picker";
@@ -375,17 +424,36 @@
current:0,
fromMosahebe: this.$form.createForm(this, {name: 'coordinated'}),
mosahebe:null,
interview_at:null
interview_at:null,
row_id:null,
interview:[],
title_interview:['دانش تخصصی','تحصیلات مرتبط','تجربه کاری مرتبط','رفتار و شخصیت عمومی','ویژگی های اختصاصی شغل'],
is_skeleton:false
}
},
methods:{
showAddMosahebe()
showAddMosahebe(id)
{
this.showAddMosahebeModal=true;
this.row_id = id
},
showMosahebe(){
showMosahebe(id){
this.showMosahebeModal=true;
this.getInterView(id)
},
async getInterView(id){
try{
this.is_skeleton = true
const {data} = await axios.post('proposal/interview',{id:id})
this.interview = data
}catch (e) {
this.$ntSetError()
}finally {
this.is_skeleton = false
}
},
savefromMosahebe(e) {
e.preventDefault();
this.fromMosahebe.validateFields(async(err, values) => {
@@ -399,9 +467,12 @@
else
{
console.log(values,'values')
const id = this.row_id
values.interview_at = this.interview_at
await axios.post('/update',values)
values.id = id
await axios.post('proposal/update',values)
this.$message.success('اطلاعات با موفقیت کامل شد')
this.fromMosahebe.resetFields()
}
}catch (e) {
this.$ntSetError()
@@ -457,6 +528,7 @@
onCancel() {
console.log('Cancel');
},
//class: 'test',
});
},
+3 -3
View File
@@ -3,11 +3,11 @@ import XTbl, {Xtc} from '../../components/x-table/index';
const tbl = new XTbl('http://hr.asco-intl.com/back/public/api/proposal', 'لیست درخواست ها');
tbl.add(new Xtc('name', 'نام و نام خانوادگی').filterText());
tbl.add(new Xtc('ncode', 'کد ملی').filterText())
tbl.add(new Xtc('fname', 'موبایل').filterText())
tbl.add(new Xtc('mobile', 'موبایل').filterText())
tbl.add(new Xtc('job_title', 'شغل').filterText())
tbl.add(new Xtc('for_cities', 'شهر').filterText().noSort())
tbl.add(new Xtc('created_at', 'ثبت نام').filterDate().noSort())
tbl.add(new Xtc('updated_at', 'به روز رسانی').filterText().noSort())
tbl.add(new Xtc('caj', 'ثبت نام').filterDate().noSort())
tbl.add(new Xtc('uaj', 'به روز رسانی').filterText().noSort())
tbl.add(new Xtc('id', 'عملیات').filterSwitch().renderSlot('operator').noSort())
/*tbl.addOpt()*/
+833
View File
@@ -0,0 +1,833 @@
<template>
<div class="mx-5">
<div class="flex justify-center">
<img src="@/assets/images/logo.svg" width="150px" class="mt-10"/>
</div>
<vx-card class="mx-auto mt-10">
<a-steps :current="current" style="direction: ltr">
<a-step title="مرحله اول" />
<a-step title="مرحله دوم" />
<a-step title="مرحله سوم" />
</a-steps>
<div v-show="current == 0">
<p class="mt-6">
متقاضی گرامی ضمن سپاس از علاقه مندی شما برای همکاری با مجموعه آسکو بین الملل، لطفا اطلاعات شخصی و شغل مورد نظر خود را به دقت تکمیل فرمایید.
</p>
<p>
درخواستها مورد بررسی قرار گرفته و در صورت هماهنگی با فرصتهای شغلی شرکت، با شما تماس گرفته خواهد شد.
</p>
<p>
با تشکر و آرزوی موفقیت
</p>
</div>
<a-divider/>
<div class="steps-content">
<ASpin :spinning="loading">
<a-form :form="formFirst">
<div v-show="current==0" class="mt-4">
<a-button type="primary" @click="addCity()">
افزودن ردیف
</a-button>
<a-card :bordered="true" class="mt-3" v-for="(item,index) in jobs">
<div class="grid sm:grid-cols-1 md:grid-cols-2 md:gap-3 lg:grid-cols-2 lg:gap-3">
<div>
<a-form-item label="انتخاب شهر">
<a-select
v-decorator="[`jobs[${index}].city`,{rules: [{ required: true, message: 'انتخاب شهر الزامی است.' }]}]"
autocomplete="off"
placeholder="لطفا شهر را انتخاب کنید."
>
<a-select-option v-for="item in city" :value="item.id">
{{ item.title }}
</a-select-option>
</a-select>
</a-form-item>
</div>
<a-form-item label="انتخاب شغل">
<a-select autocomplete="off" aria-placeholder="لطفا شغل خود را انتخاب کنید." v-decorator="[`jobs[${index}].job`,{rules: [{ required: true, message: 'انتخاب شغل الزامی است.' }]}]">
<a-select-option v-for="item in job" :value="item.id">
{{ item.title }}
</a-select-option>
</a-select>
</a-form-item>
</div>
</a-card>
</div>
</a-form>
<a-form :form="from">
<div v-show="current==1">
<a-alert message="توجه داشته باشید پس از ثبت اطلاعات، بازگشت عملیات امکان پذیر نخواهد بود." type="warning" />
<div class="grid sm:grid-cols-1 md:grid-cols-4 lg:grid-cols-4 gap-4 mt-5">
<a-form-item label="نام و نام خانوادگی">
<a-input autocomplete="off" v-decorator="['name',{initialValue: null,rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]" />
</a-form-item>
<a-form-item label="نام پدر">
<a-input autocomplete="off" v-decorator="['father_name',{initialValue: null,rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]" />
</a-form-item>
<div>
<a-form-item label="تاریخ تولد">
<!-- birth_date-->
<a-input
v-model="birth_day"
id="birth_day"
autocomplete="off"
/>
</a-form-item>
<date-picker
:auto-submit="true"
color="#4f72ab"
v-model="birth_day"
element="birth_day"
/>
</div>
<a-form-item label="کد ملی">
<a-input autocomplete="off" v-decorator="['ncode',{initialValue: null,rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]" />
</a-form-item>
</div>
<div class="grid lg:grid-cols-2 md:grid-cols-2 sm:grid-cols-1">
<a-form-item label="جنسیت">
<a-radio-group style="direction: ltr" v-decorator="['gender',{ initialValue: '1' }]" button-style="solid">
<a-radio-button value="2">
زن
</a-radio-button>
<a-radio-button value="1">
مرد
</a-radio-button>
</a-radio-group>
</a-form-item>
<a-form-item label="وضعیت تاهل">
<a-radio-group style="direction: ltr" v-decorator="['married',{initialValue: '1'}]" button-style="solid">
<a-radio-button value="1">
مجرد
</a-radio-button>
<a-radio-button value="2">
متاهل
</a-radio-button>
</a-radio-group>
</a-form-item>
</div>
<a-card :bordered="true" >
<a-alert message="توضیحات سریال شناسنامه" type="info" />
<div class="grid sm:grid-cols-1 md:grid-cols-4 lg:grid-cols-4 gap-4">
<a-form-item label="شماره شناسنامه">
<a-input autocomplete="off" v-decorator="['iden_code',{initialValue: null,rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]" />
</a-form-item>
<a-form-item label="سریال شناسنامه">
<a-input-group compact style="direction: ltr">
<a-select style="width: 15%" v-decorator="['iden_no_left',{initialValue: null}]">
<a-select-option style="width: 100% !important;" v-for="item in alphabet" :value="item">
{{ item }}
</a-select-option>
</a-select>
<a-input v-decorator="['iden_no_right',{initialValue: null}]" autocomplete="off" style="width: 85%;direction: rtl" />
</a-input-group>
</a-form-item>
<a-form-item label="محل صدور">
<a-input autocomplete="off" v-decorator="['iden_where',{initialValue: null,rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]" />
</a-form-item>
<a-form-item label="محل تولد">
<a-input autocomplete="off" v-decorator="['birth_where',{initialValue: null,rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]" />
</a-form-item>
</div>
</a-card>
<br/>
<a-card title="اطلاعات سکونت" :bordered="true" >
<a-form-item label="وضعیت مسکن">
<a-radio-group style="direction: ltr" v-decorator="['house_status',{initialValue: '1'}]" button-style="solid">
<a-radio-button value="2">
مستاجر
</a-radio-button>
<a-radio-button value="1">
مالک
</a-radio-button>
</a-radio-group>
</a-form-item>
<a-form-item label="آدرس">
<a-input autocomplete="off" v-decorator="['address',{initialValue: null,rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]" />
</a-form-item>
<div class="md:flex">
<div class="md:w-1/4 md:pl-4">
<a-row >
<a-form-item label="ایمیل">
<a-input style="direction: rtl !important;" v-decorator="['email',{initialValue: null,rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]">
<!-- <feather-icon style="direction: ltr !important;" icon="MailIcon" slot="addonAfter" class="pt-1" svgClasses="w-5 h-5" />-->
</a-input>
</a-form-item>
</a-row>
</div>
<div class="md:w-1/4 md:pl-4">
<a-row >
<a-form-item label="موبایل">
<a-input autocomplete="off" v-decorator="['mobile',{initialValue: null,rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]" >
<!--<feather-icon style="direction: ltr !important;" icon="SmartPhoneIcon" slot="addonAfter" class="pt-1" svgClasses="w-5 h-5" />-->
</a-input>
</a-form-item>
</a-row>
</div>
<div class="md:w-1/4 md:pl-4">
<a-row >
<a-form-item label="تلفن ثابت">
<a-input autocomplete="off" v-decorator="['phone',{initialValue: null,rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]" >
<!--<feather-icon style="direction: ltr !important;" icon="PhoneIcon" slot="addonAfter" class="pt-1" svgClasses="w-5 h-5" />-->
</a-input>
</a-form-item>
</a-row>
</div>
</div>
<a-divider/>
<div class="md:flex">
<div class="md:w-1/4 md:pl-4">
<a-row >
<a-form-item label="تلفن ضروری">
<a-input style="direction: rtl !important;" v-decorator="['phone_emergency',{initialValue: null,rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]">
<!-- <feather-icon style="direction: ltr !important;" icon="MailIcon" slot="addonAfter" class="pt-1" svgClasses="w-5 h-5" />-->
</a-input>
</a-form-item>
</a-row>
</div>
<div class="md:w-1/4 md:pl-4">
<a-row >
<a-form-item label="نام طرف">
<a-input autocomplete="off" v-decorator="['phone_emergency_name',{initialValue: null}]" >
<!--<feather-icon style="direction: ltr !important;" icon="SmartPhoneIcon" slot="addonAfter" class="pt-1" svgClasses="w-5 h-5" />-->
</a-input>
</a-form-item>
</a-row>
</div>
<div class="md:w-1/4 md:pl-4">
<a-row >
<a-form-item label="نسبت">
<a-input autocomplete="off" v-decorator="['phone_emergency_related',{initialValue: null}]" >
<!--<feather-icon style="direction: ltr !important;" icon="PhoneIcon" slot="addonAfter" class="pt-1" svgClasses="w-5 h-5" />-->
</a-input>
</a-form-item>
</a-row>
</div>
</div>
</a-card>
<a-divider>دیگر اطلاعات</a-divider>
<a-card title="سابقه بیمه" :bordered="true" >
<a-form-item label="سابقه بیمه">
<a-radio-group style="direction: ltr" v-decorator="['has_insurance',{initialValue: '1'}]" button-style="solid" @change="number_insurance">
<a-radio-button value="1">
دارم
</a-radio-button>
<a-radio-button value="-1">
ندارم
</a-radio-button>
</a-radio-group>
</a-form-item>
<a-form-item label="شماره بیمه" v-if="has_instructor == '-1' ">
<a-input autocomplete="off" style="width: 40%" v-decorator="['insurance_no',{initialValue: null,rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]" />
</a-form-item>
</a-card>
<br/>
<a-card title="سوابق تحصیلی" :bordered="true" >
<a-list class="mb-5" v-if="edu.length > 0" :locale="{emptyText:'رکوردی وجود ندارد.'}" bordered item-layout="horizontal" >
<a-list-item class="grid grid-cols-4" v-for="(item,index) in edu" :key="index" >
<div>
<div style="direction: ltr" v-if="item.grade"> مقطع :{{ item.grade.title }}</div>
<div style="direction: rtl">دانشگاه : {{ item.university }}</div>
</div>
<div>
<div style="direction: rtl">سال شروع : {{ item.start }}</div>
<div style="direction: rtl">سال خاتمه : {{ item.end }}</div>
</div>
<div>
<div style="direction: rtl">رشته تحصیلی : {{ item.major }}</div>
<div style="direction: rtl">گرایش تحصیلی : {{ item.orientation }}</div>
</div>
<div>
<a-popconfirm
placement="right"
title="آیا می خواهید حذف کنید؟"
ok-text="بله"
cancel-text="خیر"
@confirm="removeEdu(item)"
>
<a-button type="danger" class="mr-3">حذف</a-button>
</a-popconfirm>
<a-button class="mr-3" @click="openModalEduModeEDit(item)">
مشاهده و ویرایش
</a-button>
</div>
</a-list-item>
</a-list>
<a-button type="dashed" icon="plus" @click="openModalEdu">
افزودن سابقه تحصیلی
</a-button>
</a-card>
<br/>
<a-card title="سوابق آموزشی" :bordered="true" >
<a-list class="mb-5" v-if="educational.length > 0" :locale="{emptyText:'رکوردی وجود ندارد.'}" bordered item-layout="horizontal" >
<a-list-item class="grid grid-cols-3" v-for="(item,index) in educational" :key="index" >
<div>
<div style="direction: rtl"> مرکز برگزار کننده : {{ item.university }}</div>
<div style="direction: rtl">عنوان دوره : {{ item.major }}</div>
</div>
<div>
<div style="direction: rtl">سال : {{ item.start }}</div>
<div style="direction: rtl">
امکان ارائه گواهینامه دارم:
<feather-icon icon="CheckIcon" v-if="item.has_file" svgClasses="w-5 h-5 text-success"/>
<feather-icon icon="XIcon" v-else svgClasses="w-5 h-5 text-danger"/>
</div>
</div>
<div>
<a-popconfirm
placement="right"
title="آیا می خواهید حذف کنید؟"
ok-text="بله"
cancel-text="خیر"
@confirm="removeEducational(item)"
>
<a-button type="danger" class="mr-3">حذف</a-button>
</a-popconfirm>
<a-button class="mr-3" @click="openModalEducationalEDit(item)">
مشاهده و ویرایش
</a-button>
</div>
</a-list-item>
</a-list>
<a-button type="dashed" icon="plus" @click="openModalEducational">
افزودن سابقه آموزشی
</a-button>
</a-card>
<br/>
<a-card title="سوابق کاری" :bordered="true" >
<a-list class="mb-5" v-if="work.length > 0" :locale="{emptyText:'رکوردی وجود ندارد.'}" bordered item-layout="horizontal" >
<a-list-item class="grid grid-cols-4" v-for="(item,index) in work" :key="index" >
<div>
<div style="direction: rtl"> نام سازمان : {{ item.university }}</div>
<div style="direction: rtl">عنوان شغل : {{ item.major }}</div>
</div>
<div>
<div style="direction: rtl">سال شروع : {{ item.start }}</div>
<div style="direction: rtl">سال خاتمه : {{ item.end }}</div>
</div>
<div>
<div style="direction: rtl">دلیل خاتمه : {{ item.note }}</div>
<div style="direction: rtl">
تاکنون:
<feather-icon icon="CheckIcon" v-if="item.end_now" svgClasses="w-5 h-5 text-success"/>
<feather-icon icon="XIcon" v-else svgClasses="w-5 h-5 text-danger"/>
</div>
</div>
<div>
<a-popconfirm
placement="right"
title="آیا می خواهید حذف کنید؟"
ok-text="بله"
cancel-text="خیر"
@confirm="removeWork(item)"
>
<a-button type="danger" class="mr-3">حذف</a-button>
</a-popconfirm>
<a-button class="mr-3" @click="openModalWorkEDit(item)">
مشاهده و ویرایش
</a-button>
</div>
</a-list-item>
</a-list>
<a-button type="dashed" icon="plus" @click="openModalWork">
افزودن سابقه کاری
</a-button>
</a-card>
<br/>
<a-form-item>
<a-checkbox v-decorator="['commitment',{initialValue:false,rules: [{ required: true, message: 'تعهد الزامی است.' }]}]">
با آگاهی از قوانین و مقررات و صحت اطلاعات تایید میکنم.
</a-checkbox>
</a-form-item>
<a-alert type="warning">
<div slot="message">
<a-button @click="openAccept" class="font-bold" type="link" style="color: #0091ae">
مشاهده قوانین و مقررات
</a-button>
</div>
</a-alert>
</div>
<div v-show="current==2">
<a-result
status="success"
title="اطلاعات با موفقیت ثبت شد"
sub-title="لورم ایپسوم متن ساختگی با تولید سادگی نامفهوم از صنعت چاپ و با استفاده از طراحان گرافیک است."
>
<template #extra>
<a-button>
اتمام
</a-button>
</template>
</a-result>
</div>
</a-form>
</ASpin>
</div>
<a-modal :visible="visibleEdu" title="افزودن سابقه تحصیلی" @ok="createEdu" @cancel="cancelEdu" ok-text="ایجاد" cancel-text="انصراف">
<a-form :form="formEdu">
<a-form-item label="مقطع">
<a-select
class="mt-3"
style="width: 100%;direction: rtl !important;"
v-decorator="['level',{rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]"
@change="changeGrade"
allowClear
>
<a-select-option v-for="item in grade" :value="item.level">
{{ item.title }}
</a-select-option>
</a-select>
</a-form-item>
<a-form-item label="دانشگاه">
<a-input autocomplete="off" v-decorator="['university',{rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]"/>
</a-form-item>
<a-form-item label="رشته تحصیلی">
<a-input autocomplete="off" v-decorator="['major',{rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]"/>
</a-form-item>
<a-form-item label="گرایش تحصیلی">
<a-input autocomplete="off" v-decorator="['orientation',{rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]"/>
</a-form-item>
<div class="md:flex">
<div class="md:w-1/2">
<a-form-item label="سال شروع">
<a-input-number autocomplete="off" :min="1350" :max="1401" v-decorator="['start',{rules: [{ required: true, message: 'لطفا مقدار سال شروع را به درستی بین 1350 تا 1401 وارد کنید.' }]}]"/>
</a-form-item>
</div>
<div class="md:w-1/2">
<a-form-item label="سال خاتمه">
<a-input-number autocomplete="off" :disabled="is_check" :min="1350" :max="1401" v-decorator="['end',{rules: [{ required: is_check ? false : true, message: 'لطفا مقدار سال خاتمه را به درستی بین 1350 تا 1401 وارد کنید.' }]}]"/>
</a-form-item>
</div>
<div class="md:w-1/3">
<a-form-item label="تاکنون">
<a-checkbox v-decorator="['end_now',{initialValue:false,valuePropName: 'checked'}]" @change="isChecked"/>
</a-form-item>
</div>
</div>
</a-form>
</a-modal>
<a-modal :visible="visibleEducational" title="افزودن سابقه آموزشی" @ok="createEducational" @cancel="cancelEducational" ok-text="ایجاد" cancel-text="انصراف">
<a-form :form="formEducational">
<a-form-item label="مرکز برگزار کننده">
<a-input autocomplete="off" v-decorator="['university',{rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]"/>
</a-form-item>
<a-form-item label="عنوان دوره">
<a-input autocomplete="off" v-decorator="['major',{rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]"/>
</a-form-item>
<div class="md:flex">
<div class="md:w-1/2">
<a-form-item label="سال">
<a-input-number autocomplete="off" :min="1350" :max="1401" v-decorator="['start',{rules: [{ required: true, message: 'لطفا مقدار سال شروع را به درستی بین 1350 تا 1401 وارد کنید.' }]}]"/>
</a-form-item>
</div>
<div class="md:w-1/3">
<a-form-item label="امکان ارائه گواهینامه دارم">
<a-checkbox v-decorator="['has_file',{initialValue:false,valuePropName: 'checked'}]"/>
</a-form-item>
</div>
</div>
</a-form>
</a-modal>
<a-modal :visible="visibleWork" title="افزودن سابقه کاری" @ok="createWork" @cancel="cancelWork" ok-text="ایجاد" cancel-text="انصراف">
<a-form :form="formWork">
<a-form-item label="نام سازمان">
<a-input autocomplete="off" v-decorator="['university',{rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]"/>
</a-form-item>
<a-form-item label="عنوان شغل">
<a-input autocomplete="off" v-decorator="['major',{rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]"/>
</a-form-item>
<a-form-item label="دلیل خاتمه">
<a-input autocomplete="off" v-decorator="['note',{rules: [{ required: true, message: 'این فیلد نمیتواند خالی باشد.' }]}]"/>
</a-form-item>
<div class="md:flex">
<div class="md:w-1/2">
<a-form-item label="سال شروع">
<a-input-number autocomplete="off" :min="1350" :max="1401" v-decorator="['start',{rules: [{ required: true, message: 'لطفا مقدار سال شروع را به درستی بین 1350 تا 1401 وارد کنید.' }]}]"/>
</a-form-item>
</div>
<div class="md:w-1/2">
<a-form-item label="سال خاتمه">
<a-input-number :disabled="is_work_check" autocomplete="off" :min="1350" :max="1401" v-decorator="['end',{rules: [{ required: is_work_check ? false : true, message: 'لطفا مقدار سال خاتمه را به درستی بین 1350 تا 1401 وارد کنید.' }]}]"/>
</a-form-item>
</div>
<div class="md:w-1/3">
<a-form-item label="تاکنون">
<a-checkbox v-decorator="['end_now',{initialValue:false,valuePropName: 'checked'}]" @change="isCheckedWork"/>
</a-form-item>
</div>
</div>
</a-form>
</a-modal>
<a-modal :visible="visibleAccept" title="شرایط و مقررات" @ok="visibleAccept = false" @cancel="visibleAccept = false" ok-text="باشه" cancel-text="انصراف">
اینجانب.... در تاریخ......... فرم بالا را تکمیل نموده و صحت کلیه اطلاعات تکمیل شده را تأیید می نمایم
</a-modal>
<div class="mt-5">
<a-button v-if="current < 2" type="primary" @click="handleSubmit">
مرحله بعدی
</a-button>
<!-- <a-button-->
<!-- v-if="current == 2"-->
<!-- type="primary"-->
<!-- @click="handleSubmit"-->
<!-- >-->
<!-- ثبت اطلاعات-->
<!-- </a-button>-->
<!-- <a-button v-if="current > 0" style="margin-left: 8px" @click="prev">-->
<!-- قبلی-->
<!-- </a-button>-->
</div>
</vx-card>
</div>
</template>
<script>
import axios from '@/axios'
import VuePersianDatetimePicker from 'vue-persian-datetime-picker';
export default {
name: "Register",
components:{
datePicker: VuePersianDatetimePicker
},
data(){
return{
current: 0,
from: this.$form.createForm(this, {name: 'coordinated'}),
formEdu: this.$form.createForm(this, {name: 'coordinated'}),
formEducational: this.$form.createForm(this, {name: 'coordinated'}),
formWork: this.$form.createForm(this, {name: 'coordinated'}),
formFirst: this.$form.createForm(this, {name: 'coordinated'}),
city:[],
job:[],
edu:[],
work:[],
jobs:[{city:null,job:null}],
//model:[],
educational:[],
birth_day:'',
has_instructor: '-1',
visibleEdu: false,
visibleEducational: false,
visibleWork: false,
visibleAccept: false,
is_check:false,
is_work_check:false,
find_grade:null,
grade:[
{ level: 1, title:'کاردانی' },
{ level: 2, title:'کارشناسی' },
{ level: 3, title:'کارشناسی ارشد' },
{ level: 4, title:'دکتری' }
],
alphabet:['الف','ب','پ','ت','ث','ج','چ','ح','خ','د','ذ','ر','ز','ژ','س','ش','ص','ض','ط','ظ','ع','غ','ف','ق','ک','گ','ل','م','ن','و','ه','ی'],
loading:false,
editMode:false,
id:0,
tempRow:{}
}
},
methods:{
addCity()
{
this.jobs.push({city:null,job:null})
//this.model.push(jobs);
//console.log(this.model);
},
number_insurance(e){
this.has_instructor = e.target.value
},
handleSubmit(e) {
e.preventDefault();
//console.log(this.formFirst.getFieldsValue(),'this.formFirst.getFieldsValue()');
if(this.current ==0)
{
this.formFirst.validateFields(async(err, values) => {
if (!err) {
this.current++;
console.log(values,'first')
}
});
}
else
{
this.from.validateFields(async(err, values) => {
if (!err) {
try{
this.loading = true
console.log(values,'values')
values.model = this.formFirst.getFieldsValue();
//Object.assign(values,this.formFirst.getFieldsValue());
console.log(this.formFirst.getFieldsValue(),'this.formFirst.getFieldsValue()')
values.birth_date = this.birth_day
values.work = this.work
values.training = this.educational
values.academic = this.edu
await axios.post('register/save', values)
this.$message.success('اطلاعات با موفقیت کامل شد')
this.fromMosahebe.resetFields()
this.current++
}catch (e) {
this.$ntSetError()
throw e
}finally {
this.loading = false
}
}
});
}
},
async getCity(){
try{
const {data} = await axios.get('/register/cities')
this.city = data
}catch (e) {
this.$ntSetError()
}
},
async getJob(){
try{
const {data} = await axios.post('/register/jobs')
this.job = data
}catch (e) {
this.$ntSetError()
}
},
openModalEdu(){
this.visibleEdu = true
this.editMode = false
this.formEdu.resetFields()
},
openModalEducational(){
this.visibleEducational = true
this.formEducational.resetFields()
},
openModalWork(){
this.visibleWork = true
this.formWork.resetFields()
},
openModalEduModeEDit(item){
console.log(item,'item')
this.visibleEdu = true
this.editMode = true
this.tempRow = item
this.formEdu.setFieldsValue(item)
},
openModalEducationalEDit(item){
this.visibleEducational = true
this.formEducational.setFieldsValue(item)
},
openModalWorkEDit(item){
this.visibleWork = true
this.formWork.setFieldsValue(item)
},
cancelEdu(){
this.visibleEdu = false
},
cancelEducational(){
this.visibleEducational = false
},
cancelWork(){
this.visibleWork = false
},
createEdu(e){
e.preventDefault();
this.formEdu.validateFields(async(err, values) => {
if (!err) {
try{
if(this.find_grade) values.grade = this.find_grade
if(this.editMode){
const find = this.edu.findIndex(item=> item.id == this.tempRow.id)
Object.assign(this.edu[find],values);
this.visibleEdu = false
}else{
values.id = this.id
this.edu.push(values)
this.id +=1
///console.log(values,'values')
this.formEdu.resetFields()
this.visibleEdu = false
}
}catch (e) {
this.$ntSetError()
throw e
}finally {
}
}
});
},
createEducational(e){
e.preventDefault();
this.formEducational.validateFields(async(err, values) => {
if (!err) {
try{
this.educational.push(values)
console.log(values,'values')
this.formEducational.resetFields()
this.visibleEducational = false
}catch (e) {
this.$ntSetError()
throw e
}finally {
}
}
});
},
createWork(e){
e.preventDefault();
this.formWork.validateFields(async(err, values) => {
if (!err) {
try{
this.work.push(values)
console.log(values,'values')
this.formWork.resetFields()
this.visibleWork = false
}catch (e) {
this.$ntSetError()
throw e
}
}
});
},
isChecked(e){
this.is_check = e.target.checked
// if(this.is_check){
// this.formEdu.resetField('end_now')
// }
},
isCheckedWork(e){
this.is_work_check = e.target.checked
},
removeEdu(item){
const index = this.edu.indexOf(item)
this.edu.splice(index,1)
},
removeEducational(item){
const index = this.educational.indexOf(item)
this.educational.splice(index,1)
},
removeWork(item){
const index = this.work.indexOf(item)
this.work.splice(index,1)
},
changeGrade(id){
console.log(id,'id')
this.find_grade = this.grade.find(item=>item.level == id)
},
openAccept(){
this.visibleAccept = true
},
next() {
this.current++;
},
prev() {
this.current--;
},
},
mounted() {
this.getCity()
this.getJob()
}
}
</script>
<style scoped>
[dir=rtl] .anticon.anticon-plus{
position: relative;
top: 4px;
left: 5px;
}
.ant-modal-title{
margin-right: 1rem;
}
</style>
+1 -1
View File
@@ -9,7 +9,7 @@
// MAIN COLORS - VUESAX THEME COLORS
export const colors = {
primary : '#1DA57A',
primary : '#41b883',
// primary : '#7367F0',
success : '#28C76F',
danger : '#EA5455',