mirror of
https://github.com/hanzo-io/cloud.git
synced 2026-10-30 18:57:42 +00:00
172 lines
3.5 KiB
Vue
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>
|