Последняя версия с сервера прошлого разработчика
This commit is contained in:
358
resources/js/Pages/Settings/SettingsProfile.vue
Executable file
358
resources/js/Pages/Settings/SettingsProfile.vue
Executable file
@@ -0,0 +1,358 @@
|
||||
<template>
|
||||
<meta-head title="Мои настройки"></meta-head>
|
||||
|
||||
<div class="xl:container xl:mx-auto px-2 md:px-3">
|
||||
<div class="mt-16 shadow-classic rounded-md bg-indigo-200">
|
||||
<div class="flex flex-col md:grid grid-cols-6 lg:grid-cols-5">
|
||||
<settings-menu />
|
||||
|
||||
<div class="col-span-4">
|
||||
<div class="m-4 lg:m-8">
|
||||
<div class="flex flex-col xl:flex-row">
|
||||
<div class="xl:mr-24">
|
||||
<div class="flex items-center">
|
||||
<div class="flex-shrink-0 mr-5">
|
||||
<user-avatar :user="user" class="w-20 h-20 text-lg" />
|
||||
</div>
|
||||
<div class="flex flex-col">
|
||||
<p class="text-base lg:text-xl font-semibold text-gray">
|
||||
{{ user.name }}
|
||||
</p>
|
||||
<p class="lg:mt-1 text-base text-gray-light">
|
||||
@{{ user.username }}
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<input ref="fileavatar" class="hidden"
|
||||
accept="image/png, image/jpeg, image/jpg" type="file"
|
||||
@change="previewFiles"
|
||||
>
|
||||
<input ref="filebanner" class="hidden"
|
||||
accept="image/png, image/jpeg, image/jpg" type="file"
|
||||
@change="previewFilesBanner"
|
||||
>
|
||||
<div>
|
||||
<div v-if="$page.props.errors.avatar" class="text-red lg:text-lg">
|
||||
{{ $page.props.errors.avatar }}
|
||||
</div>
|
||||
<button v-if="!user.photo_path" class="hover:underline mt-2 text-left lg:mt-5 default lg:text-lg text-orange"
|
||||
@click="changeAvatar"
|
||||
>
|
||||
Изменить фото профиля
|
||||
</button>
|
||||
<button v-else class="hover:underline mt-2 text-left lg:mt-5 default lg:text-lg text-red"
|
||||
@click="removeAvatar"
|
||||
>
|
||||
Удалить фото
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
<div class="mt-5 xl:mt-0">
|
||||
<div class="flex items-center">
|
||||
<div class="flex-shrink-0 mr-5">
|
||||
<user-banner class="w-60 lg:w-96 h-20 rounded-xl bg-indigo-300" :user="user"
|
||||
size="banner"
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div v-if="$page.props.errors.banner" class="text-red lg:text-lg">
|
||||
{{ $page.props.errors.banner }}
|
||||
</div>
|
||||
<button v-if="!user.banner_path" class="hover:underline mt-2 text-left lg:mt-5 default lg:text-lg text-orange"
|
||||
@click="changeBanner"
|
||||
>
|
||||
Изменить баннер профиля
|
||||
</button>
|
||||
<button v-else class="hover:underline mt-2 text-left lg:mt-5 default lg:text-lg text-red"
|
||||
@click="removeBanner"
|
||||
>
|
||||
Удалить баннер
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<form class="border-b border-indigo-400 pb-10 mt-10 grid grid-cols-1 lg:grid-cols-2 2xl:grid-cols-7 gap-5 lg:gap-10 items-start" @submit.prevent="submitPassword">
|
||||
<div class="2xl:col-span-3 flex flex-col">
|
||||
<text-input v-model="passwordForm.old_password" :error="passwordForm.errors.old_password"
|
||||
class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md placeholder-gray-light" label="Старый пароль"
|
||||
type="password"
|
||||
/>
|
||||
</div>
|
||||
<div class="2xl:col-span-3 flex flex-col">
|
||||
<text-input v-model="passwordForm.new_password" :error="passwordForm.errors.new_password"
|
||||
class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md placeholder-gray-light" label="Новый пароль"
|
||||
type="password"
|
||||
/>
|
||||
</div>
|
||||
<div class="lg:col-span-2 2xl:col-span-1 2xl:mt-8">
|
||||
<loading-button :loading="form.processing" class="transition shadow-none hover:shadow-classic2 inline-flex items-center px-3 py-2.5 w-full justify-center text-base rounded-md text-white bg-orange focus:outline-none"
|
||||
type="submit"
|
||||
>
|
||||
Обновить
|
||||
</loading-button>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<form class="mt-10 grid gap-4 lg:gap-10 grid-cols-1 lg:grid-cols-2" @submit.prevent="submit">
|
||||
<div class="flex flex-col">
|
||||
<text-input v-model="form.first_name" :error="form.errors.first_name"
|
||||
class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md placeholder-gray-light" label="Имя"
|
||||
/>
|
||||
</div>
|
||||
<div class="flex flex-col">
|
||||
<text-input v-model="form.last_name" :error="form.errors.last_name"
|
||||
class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md placeholder-gray-light" label="Фамилия"
|
||||
/>
|
||||
</div>
|
||||
<div class="flex flex-col">
|
||||
<text-input v-model="form.username" :error="form.errors.username"
|
||||
class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md placeholder-gray-light" label="Тег"
|
||||
/>
|
||||
</div>
|
||||
<div class="flex flex-col">
|
||||
<text-input v-model="form.date_of_birth" :error="form.errors.date_of_birth"
|
||||
type="date" class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md placeholder-gray-light"
|
||||
label="Дата рождения"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col">
|
||||
<text-input v-model="form.email" :error="form.errors.email"
|
||||
type="email" class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md placeholder-gray-light"
|
||||
label="Почта"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col">
|
||||
<text-input v-model="form.phone" :error="form.errors.phone"
|
||||
type="tel" class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md placeholder-gray-light"
|
||||
label="Телефон"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="flex flex-col">
|
||||
<text-input v-model="form.inn" :error="form.errors.inn"
|
||||
class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md placeholder-gray-light"
|
||||
label="ИНН"
|
||||
/>
|
||||
</div>
|
||||
<div class="flex flex-col">
|
||||
<text-input v-model="form.checking_account" :error="form.errors.checking_account"
|
||||
class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md placeholder-gray-light"
|
||||
label="Расчетный счет"
|
||||
/>
|
||||
</div>
|
||||
<div class="flex flex-col">
|
||||
<text-input v-model="form.bik" :error="form.errors.bik"
|
||||
class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md placeholder-gray-light"
|
||||
label="Бик банка"
|
||||
/>
|
||||
</div>
|
||||
<div>
|
||||
<div class="text-gray-light text-lg mb-2">
|
||||
Пол
|
||||
</div>
|
||||
<div class="flex space-x-6">
|
||||
<div class="flex items-center">
|
||||
<input id="user-sex-1" v-model="form.sex"
|
||||
value="1" type="radio"
|
||||
class="h-5 w-5 text-orange border-gray-light focus:ring-transparent focus:ring-offset-transparent"
|
||||
>
|
||||
<label for="user-sex-1" class="select-none ml-3 text-gray">Женский</label>
|
||||
</div>
|
||||
<div class="flex items-center">
|
||||
<input id="user-sex-2" v-model="form.sex"
|
||||
value="2" type="radio"
|
||||
class="h-5 w-5 text-orange border-gray-light focus:ring-transparent focus:ring-offset-transparent"
|
||||
>
|
||||
<label for="user-sex-2" class="select-none ml-3 text-gray">Мужской</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<div class="lg:col-span-2">
|
||||
<div class="text-gray-light text-lg mb-2">
|
||||
Тип
|
||||
</div>
|
||||
<div class="flex space-x-6">
|
||||
<div class="flex items-center">
|
||||
<input id="user-type-1" v-model="form.type"
|
||||
value="1" type="radio"
|
||||
class="h-5 w-5 text-orange border-gray-light focus:ring-transparent focus:ring-offset-transparent"
|
||||
>
|
||||
<label for="user-type-1" class="select-none ml-3 text-gray">Физ. лицо</label>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center">
|
||||
<input id="user-type-2" v-model="form.type"
|
||||
value="2" type="radio"
|
||||
class="h-5 w-5 text-orange border-gray-light focus:ring-transparent focus:ring-offset-transparent"
|
||||
>
|
||||
<label for="user-type-2" class="select-none ml-3 text-gray">Самозанятый</label>
|
||||
</div>
|
||||
<div class="flex items-center">
|
||||
<input id="user-type-3" v-model="form.type"
|
||||
value="3" type="radio"
|
||||
class="h-5 w-5 text-orange border-gray-light focus:ring-transparent focus:ring-offset-transparent"
|
||||
>
|
||||
<label for="user-type-3" class="select-none ml-3 text-gray">Юридическое лицо</label>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center">
|
||||
<input id="user-type-4" v-model="form.type"
|
||||
value="4" type="radio"
|
||||
class="h-5 w-5 text-orange border-gray-light focus:ring-transparent focus:ring-offset-transparent"
|
||||
>
|
||||
<label for="user-type-4" class="select-none ml-3 text-gray">ИП</label>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="lg:col-span-2">
|
||||
<div class="flex flex-col">
|
||||
<textarea-input v-model="form.about" label="О себе"
|
||||
:error="form.errors.about" class="focus:ring-4 focus:ring-offset-1 focus:ring-orange focus:ring-opacity-20 focus:ring-offset-orange focus:border-transparent text-gray border border-indigo-300 bg-indigo-200 rounded-md"
|
||||
cols="30" rows="2"
|
||||
></textarea-input>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="lg:col-span-2">
|
||||
<!-- <div class="text-gray-light text-lg mb-2">
|
||||
Ограничить доступ
|
||||
</div> -->
|
||||
<div class="flex items-center">
|
||||
<input id="user-private" v-model="form.private"
|
||||
type="checkbox" class="h-5 w-5 text-orange border-gray-light focus:ring-transparent focus:ring-offset-transparent"
|
||||
>
|
||||
<label for="user-private" class="select-none ml-3 text-gray">Включить эксклюзивный акаунт, доступ к контенту только по подписке</label>
|
||||
</div>
|
||||
<!-- <div class="flex items-center">
|
||||
<input id="user-commercial" v-model="form.allow_adult_content"
|
||||
type="checkbox" class="h-5 w-5 text-orange border-gray-light focus:ring-transparent focus:ring-offset-transparent"
|
||||
>
|
||||
<label for="user-commercial" class="select-none ml-3 text-gray">Разрешить контент для взрослых</label>
|
||||
</div> -->
|
||||
</div>
|
||||
|
||||
<div class="flex flex-wrap -my-1 -mx-3">
|
||||
<loading-button :loading="form.processing" class="mx-3 my-1 transition shadow-none hover:shadow-classic2 inline-flex items-center px-8 py-3 justify-center text-base rounded-md text-white bg-orange focus:outline-none"
|
||||
type="submit"
|
||||
>
|
||||
Сохранить
|
||||
</loading-button>
|
||||
<!-- <button type="button"
|
||||
class="mx-3 my-1 default text-lg text-orange"
|
||||
>
|
||||
Удалить аккаунт
|
||||
</button> -->
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { useForm } from '@inertiajs/inertia-vue3'
|
||||
import { Inertia } from '@inertiajs/inertia'
|
||||
import { toRefs } from 'vue'
|
||||
|
||||
import Layout from '@/Shared/Layout.vue'
|
||||
import SettingsMenu from '@/Shared/LayoutParts/SettingsMenu.vue'
|
||||
import LoadingButton from '@/Shared/Form/LoadingButton.vue'
|
||||
import UserAvatar from '@/Shared/Misc/UserAvatar.vue'
|
||||
import UserBanner from '@/Shared/Misc/UserBanner.vue'
|
||||
import MetaHead from '@/Shared/MetaHead.vue'
|
||||
import TextInput from '@/Shared/Form/TextInput.vue'
|
||||
import TextareaInput from '@/Shared/Form/TextareaInput.vue'
|
||||
|
||||
|
||||
export default {
|
||||
components: {
|
||||
MetaHead,
|
||||
UserAvatar,
|
||||
UserBanner,
|
||||
TextInput,
|
||||
TextareaInput,
|
||||
LoadingButton,
|
||||
SettingsMenu,
|
||||
},
|
||||
layout: Layout,
|
||||
props: {
|
||||
user: Object,
|
||||
},
|
||||
setup(props) {
|
||||
const { user } = toRefs(props)
|
||||
const form = useForm({
|
||||
first_name: user.value.first_name,
|
||||
last_name: user.value.last_name,
|
||||
username: user.value.username,
|
||||
email: user.value.email,
|
||||
phone: user.value.phone,
|
||||
sex: user.value.sex,
|
||||
type: user.value.type,
|
||||
date_of_birth: user.value.date_of_birth,
|
||||
about: user.value.about,
|
||||
private: user.value.private,
|
||||
inn: user.value.inn,
|
||||
checking_account: user.value.checking_account,
|
||||
bik: user.value.bik,
|
||||
password: null,
|
||||
})
|
||||
|
||||
const passwordForm = useForm({
|
||||
old_password: null,
|
||||
new_password: null,
|
||||
})
|
||||
|
||||
const submit = () => {
|
||||
form.put(route('users.update', user.value.id))
|
||||
}
|
||||
const submitPassword = () => {
|
||||
passwordForm.put(route('users.update.password', user.value.id), {
|
||||
onSuccess: () => passwordForm.reset(),
|
||||
})
|
||||
}
|
||||
|
||||
return { form, passwordForm, submit, submitPassword }
|
||||
},
|
||||
methods: {
|
||||
previewFilesBanner(event){
|
||||
const file = event.target.files[0]
|
||||
Inertia.post(route('image.banner'), {
|
||||
_method: 'put',
|
||||
banner: file,
|
||||
})
|
||||
},
|
||||
previewFiles(event){
|
||||
const file = event.target.files[0]
|
||||
Inertia.post(route('image.avatar'), {
|
||||
_method: 'put',
|
||||
avatar: file,
|
||||
})
|
||||
},
|
||||
changeBanner(){
|
||||
this.$refs.filebanner.click()
|
||||
},
|
||||
removeBanner(){
|
||||
Inertia.post(route('image.banner.remove'), {
|
||||
_method: 'delete',
|
||||
})
|
||||
},
|
||||
changeAvatar(){
|
||||
this.$refs.fileavatar.click()
|
||||
},
|
||||
removeAvatar(){
|
||||
Inertia.post(route('image.avatar.remove'), {
|
||||
_method: 'delete',
|
||||
})
|
||||
}
|
||||
},
|
||||
}
|
||||
</script>
|
||||
Reference in New Issue
Block a user