276 lines
7.0 KiB
Vue
276 lines
7.0 KiB
Vue
<template>
|
|
<Card title="Profile">
|
|
<div class="flex items-center border-b pb-3">
|
|
<div class="relative">
|
|
<Avatar
|
|
size="2xl"
|
|
:label="$account.user.first_name"
|
|
:image="$account.user.user_image"
|
|
/>
|
|
<FileUploader
|
|
@success="onProfilePhotoChange"
|
|
fileTypes="image/*"
|
|
:upload-args="{
|
|
pagetype: 'User',
|
|
docname: $account.user.name,
|
|
method: 'jcloud.api.account.update_profile_picture'
|
|
}"
|
|
>
|
|
<template v-slot="{ openFileSelector, uploading, progress, error }">
|
|
<div class="ml-4">
|
|
<button
|
|
@click="openFileSelector()"
|
|
class="absolute inset-0 grid w-full place-items-center rounded-full bg-black text-xs font-medium text-white opacity-0 transition hover:opacity-50 focus:opacity-50 focus:outline-none"
|
|
:class="{ 'opacity-50': uploading }"
|
|
>
|
|
<span v-if="uploading">{{ progress }}%</span>
|
|
<span v-else>Edit</span>
|
|
</button>
|
|
</div>
|
|
</template>
|
|
</FileUploader>
|
|
</div>
|
|
<div class="ml-4">
|
|
<h3 class="text-base font-semibold">
|
|
{{ $account.user.first_name }} {{ $account.user.last_name }}
|
|
</h3>
|
|
<p class="mt-1 text-base text-gray-600">{{ $account.user.email }}</p>
|
|
</div>
|
|
<div class="ml-auto">
|
|
<Button icon-left="edit" @click="showProfileEditDialog = true">
|
|
Edit
|
|
</Button>
|
|
</div>
|
|
</div>
|
|
<div>
|
|
<ListItem
|
|
title="Become Marketplace Developer"
|
|
subtitle="Become a marketplace app publisher"
|
|
v-if="showBecomePublisherButton"
|
|
>
|
|
<template #actions>
|
|
<Button @click="confirmPublisherAccount()">
|
|
<span>Become a Publisher</span>
|
|
</Button>
|
|
</template>
|
|
</ListItem>
|
|
<ListItem
|
|
:title="teamEnabled ? 'Disable Account' : 'Enable Account'"
|
|
:subtitle="
|
|
teamEnabled
|
|
? 'Disable your account and stop billing'
|
|
: 'Enable your account and resume billing'
|
|
"
|
|
>
|
|
<template #actions>
|
|
<Button
|
|
@click="
|
|
() => {
|
|
if (teamEnabled) {
|
|
showDisableAccountDialog = true;
|
|
} else {
|
|
showEnableAccountDialog = true;
|
|
}
|
|
}
|
|
"
|
|
>
|
|
<span :class="{ 'text-red-600': teamEnabled }">{{
|
|
teamEnabled ? 'Disable' : 'Enable'
|
|
}}</span>
|
|
</Button>
|
|
</template>
|
|
</ListItem>
|
|
</div>
|
|
<Dialog
|
|
:options="{
|
|
title: 'Update Profile Information',
|
|
actions: [
|
|
{
|
|
variant: 'solid',
|
|
label: 'Save Changes',
|
|
onClick: () => $resources.updateProfile.submit()
|
|
}
|
|
]
|
|
}"
|
|
v-model="showProfileEditDialog"
|
|
>
|
|
<template v-slot:body-content>
|
|
<div class="grid grid-cols-1 gap-4 sm:grid-cols-2">
|
|
<FormControl label="First Name" v-model="$account.user.first_name" />
|
|
<FormControl label="Last Name" v-model="$account.user.last_name" />
|
|
</div>
|
|
<ErrorMessage class="mt-4" :message="$resources.updateProfile.error" />
|
|
</template>
|
|
</Dialog>
|
|
|
|
<Dialog
|
|
:options="{
|
|
title: 'Disable Account',
|
|
actions: [
|
|
{
|
|
label: 'Disable Account',
|
|
variant: 'solid',
|
|
theme: 'red',
|
|
loading: $resources.disableAccount.loading,
|
|
onClick: () => $resources.disableAccount.submit()
|
|
}
|
|
]
|
|
}"
|
|
v-model="showDisableAccountDialog"
|
|
>
|
|
<template v-slot:body-content>
|
|
<div class="prose text-base">
|
|
By confirming this action:
|
|
<ul>
|
|
<li>Your account will be disabled</li>
|
|
<li>
|
|
Your active sites will be suspended immediately and will be
|
|
deleted after a week.
|
|
</li>
|
|
<li>Your account billing will be stopped</li>
|
|
</ul>
|
|
You can enable your account later anytime. Do you want to continue?
|
|
</div>
|
|
<ErrorMessage class="mt-2" :message="$resources.disableAccount.error" />
|
|
</template>
|
|
</Dialog>
|
|
|
|
<Dialog
|
|
:options="{
|
|
title: 'Enable Account',
|
|
actions: [
|
|
{
|
|
label: 'Enable Account',
|
|
variant: 'solid',
|
|
loading: $resources.enableAccount.loading,
|
|
onClick: () => $resources.enableAccount.submit()
|
|
}
|
|
]
|
|
}"
|
|
v-model="showEnableAccountDialog"
|
|
>
|
|
<template v-slot:body-content>
|
|
<div class="prose text-base">
|
|
By confirming this action:
|
|
<ul>
|
|
<li>Your account will be enabled</li>
|
|
<li>Your suspended sites will become active</li>
|
|
<li>Your account billing will be resumed</li>
|
|
</ul>
|
|
Do you want to continue?
|
|
</div>
|
|
<ErrorMessage class="mt-2" :message="$resources.enableAccount.error" />
|
|
</template>
|
|
</Dialog>
|
|
</Card>
|
|
<FinalizeInvoicesDialog v-model="showFinalizeInvoicesDialog" />
|
|
</template>
|
|
<script>
|
|
import FileUploader from '@/components/FileUploader.vue';
|
|
import FinalizeInvoicesDialog from '../billing/FinalizeInvoicesDialog.vue';
|
|
import { notify } from '@/utils/toast';
|
|
|
|
export default {
|
|
name: 'AccountProfile',
|
|
components: {
|
|
FileUploader,
|
|
FinalizeInvoicesDialog
|
|
},
|
|
data() {
|
|
return {
|
|
showProfileEditDialog: false,
|
|
showEnableAccountDialog: false,
|
|
showDisableAccountDialog: false,
|
|
showBecomePublisherButton: false,
|
|
showFinalizeInvoicesDialog: false
|
|
};
|
|
},
|
|
computed: {
|
|
teamEnabled() {
|
|
return $account.team.enabled;
|
|
}
|
|
},
|
|
resources: {
|
|
updateProfile() {
|
|
let { first_name, last_name, email } = this.$account.user;
|
|
return {
|
|
url: 'jcloud.api.account.update_profile',
|
|
params: {
|
|
first_name,
|
|
last_name,
|
|
email
|
|
},
|
|
onSuccess() {
|
|
this.showProfileEditDialog = false;
|
|
this.notifySuccess();
|
|
}
|
|
};
|
|
},
|
|
disableAccount: {
|
|
url: 'jcloud.api.account.disable_account',
|
|
onSuccess(data) {
|
|
this.showDisableAccountDialog = false;
|
|
|
|
if (data === 'Unpaid Invoices') {
|
|
this.showFinalizeInvoicesDialog = true;
|
|
} else {
|
|
notify({
|
|
title: 'Account disabled',
|
|
message: 'Your account was disabled successfully',
|
|
icon: 'check',
|
|
color: 'green'
|
|
});
|
|
this.$account.fetchAccount();
|
|
}
|
|
}
|
|
},
|
|
enableAccount: {
|
|
url: 'jcloud.api.account.enable_account',
|
|
onSuccess() {
|
|
notify({
|
|
title: 'Account enabled',
|
|
message: 'Your account was enabled successfully',
|
|
icon: 'check',
|
|
color: 'green'
|
|
});
|
|
this.$account.fetchAccount();
|
|
this.showEnableAccountDialog = false;
|
|
}
|
|
},
|
|
becomePublisher() {
|
|
return {
|
|
url: 'jcloud.api.marketplace.become_publisher',
|
|
onSuccess() {
|
|
this.$router.push('/marketplace');
|
|
}
|
|
};
|
|
}
|
|
},
|
|
methods: {
|
|
onProfilePhotoChange() {
|
|
this.$account.fetchAccount();
|
|
this.notifySuccess();
|
|
},
|
|
notifySuccess() {
|
|
notify({
|
|
title: 'Updated profile information',
|
|
icon: 'check',
|
|
color: 'green'
|
|
});
|
|
},
|
|
confirmPublisherAccount() {
|
|
this.$confirm({
|
|
title: 'Become a marketplace app developer?',
|
|
message:
|
|
'You will be able to publish apps to our Marketplace upon confirmation.',
|
|
actionLabel: 'Yes',
|
|
action: closeDialog => {
|
|
this.$resources.becomePublisher.submit();
|
|
closeDialog();
|
|
}
|
|
});
|
|
}
|
|
}
|
|
};
|
|
</script>
|