Files

172 lines
3.5 KiB
Vue

<template>
<Dialog
v-model="show"
:options="{
title: 'Install app on your site',
size: '4xl',
}"
>
<template #body-content>
<ObjectList :options="listOptions" />
</template>
</Dialog>
</template>
<script>
import { getCachedDocumentResource } from 'frappe-ui';
import { defineAsyncComponent, h } from 'vue';
import { toast } from 'vue-sonner';
import { renderDialog } from '../../utils/components';
import router from '../../router';
import ObjectList from '../ObjectList.vue';
import { getToastErrorMessage } from '../../utils/toast';
export default {
props: {
site: {
type: String,
required: true,
},
},
emits: ['installed'],
components: {
ObjectList,
},
data() {
return {
show: true,
};
},
computed: {
$site() {
return getCachedDocumentResource('Site', this.site);
},
listOptions() {
const handleInstall = (row) => {
if (this.$site.installApp.loading) return;
if (
row.plans &&
row.plans.some((plan) => plan.price_inr > 0) &&
row.team !== this.$site.doc?.team
) {
this.show = false;
let SiteAppPlanSelectDialog = defineAsyncComponent(
() => import('./SiteAppPlanSelectDialog.vue'),
);
renderDialog(
h(SiteAppPlanSelectDialog, {
app: row,
currentPlan: null,
onPlanSelected: (plan) => {
toast.promise(
this.$site.installApp.submit({
app: row.app,
plan: plan.name,
}),
{
loading: 'Installing app...',
success: (jobId) => {
router.push({
name: 'Site Job',
params: {
name: this.site,
id: jobId,
},
});
this.$emit('installed');
this.show = false;
return 'App will be installed shortly';
},
error: (e) => getToastErrorMessage(e),
},
);
},
}),
);
} else {
toast.promise(
this.$site.installApp.submit({
app: row.app,
}),
{
loading: 'Installing app...',
success: (jobId) => {
router.push({
name: 'Site Job',
params: {
name: this.site,
id: jobId,
},
});
this.$emit('installed');
this.show = false;
return 'App will be installed shortly';
},
error: (e) => getToastErrorMessage(e),
},
);
}
};
return {
label: 'App',
fieldname: 'app',
fieldtype: 'ListSelection',
emptyStateMessage:
'No apps found' +
(!this.$site.doc?.group_public
? '. Please add them from your bench.'
: ''),
columns: [
{
label: 'Title',
fieldname: 'title',
class: 'font-medium',
width: 2,
format: (value, row) => value || row.app_title,
},
{
label: 'Repo',
fieldname: 'repository_owner',
class: 'text-gray-600',
width: '10rem',
},
{
label: 'Branch',
fieldname: 'branch',
class: 'text-gray-600',
width: '10rem',
},
{
label: '',
fieldname: '',
align: 'right',
type: 'Button',
width: '5rem',
Button({ row }) {
return {
label: 'Install',
onClick: () => {
handleInstall(row);
},
};
},
},
],
resource: () => {
return {
url: 'press.api.site.available_apps',
params: {
name: this.site,
},
auto: true,
};
},
};
},
},
};
</script>