diff --git a/dashboard/public/js/index.js b/dashboard/public/js/index.js index fe8668ae1..ab95e9ab1 100644 --- a/dashboard/public/js/index.js +++ b/dashboard/public/js/index.js @@ -77,8 +77,8 @@ app.config(['$routeProvider', function ($routeProvider) { // controller: 'NetworkController', // templateUrl: 'views/network.html?' + window.VITE_CACHE_ID }).when('/domains', { - controller: 'DomainsController', - templateUrl: 'views/domains.html?' + window.VITE_CACHE_ID + // controller: 'DomainsController', + // templateUrl: 'views/domains.html?' + window.VITE_CACHE_ID }).when('/email', { controller: 'EmailsController', templateUrl: 'views/emails.html?' + window.VITE_CACHE_ID diff --git a/dashboard/src/Index.vue b/dashboard/src/Index.vue index 94ca84030..a5af3bf46 100644 --- a/dashboard/src/Index.vue +++ b/dashboard/src/Index.vue @@ -4,6 +4,7 @@ import { Notification } from 'pankow'; import AppsView from './views/AppsView.vue'; import AppstoreView from './views/AppstoreView.vue'; +import DomainsView from './views/DomainsView.vue'; import EventlogView from './views/EventlogView.vue'; import NetworkView from './views/NetworkView.vue'; import ProfileView from './views/ProfileView.vue'; @@ -20,6 +21,7 @@ const API_ORIGIN = import.meta.env.VITE_API_ORIGIN ? import.meta.env.VITE_API_OR const VIEWS = { APPS: 'apps', APPSTORE: 'appstore', + DOMAINS: 'domains', EVENTLOG: 'eventlog', NETWORK: 'network', PROFILE: 'profile', @@ -35,6 +37,7 @@ export default { components: { AppsView, AppstoreView, + DomainsView, EventlogView, NetworkView, Notification, @@ -72,6 +75,8 @@ export default { that.view = VIEWS.APPS; } else if (view.indexOf(VIEWS.APPSTORE) === 0) { that.view = VIEWS.APPSTORE; + } else if (view === VIEWS.DOMAINS) { + that.view = VIEWS.DOMAINS; } else if (view === VIEWS.EVENTLOG) { that.view = VIEWS.EVENTLOG; } else if (view === VIEWS.NETWORK) { @@ -109,6 +114,7 @@ export default { + diff --git a/dashboard/src/components/AppInstallDialog.vue b/dashboard/src/components/AppInstallDialog.vue index d420cca2c..1e73a6cb1 100644 --- a/dashboard/src/components/AppInstallDialog.vue +++ b/dashboard/src/components/AppInstallDialog.vue @@ -122,8 +122,12 @@ function onClose() { } onMounted(async () => { - domains.value = await domainsModel.list(); - const [error, result] = await dashboardModel.getConfig(); + let [error, result] = await domainsModel.list(); + if (error) return console.error(error); + + domains.value = result; + + [error, result] = await dashboardModel.getConfig(); if (error) return console.error(error); // preselect with dashboard domain diff --git a/dashboard/src/components/Certificates.vue b/dashboard/src/components/Certificates.vue new file mode 100644 index 000000000..226f827e7 --- /dev/null +++ b/dashboard/src/components/Certificates.vue @@ -0,0 +1,85 @@ + + + \ No newline at end of file diff --git a/dashboard/src/components/DashboardDomain.vue b/dashboard/src/components/DashboardDomain.vue new file mode 100644 index 000000000..820ead679 --- /dev/null +++ b/dashboard/src/components/DashboardDomain.vue @@ -0,0 +1,109 @@ + + + \ No newline at end of file diff --git a/dashboard/src/components/ExposedLdap.vue b/dashboard/src/components/ExposedLdap.vue index b2f24a3e9..7e82f969d 100644 --- a/dashboard/src/components/ExposedLdap.vue +++ b/dashboard/src/components/ExposedLdap.vue @@ -54,8 +54,12 @@ async function onSubmit() { } onMounted(async () => { - const domains = await domainsModel.list(); - let [error, result] = await dashboardModel.getConfig(); + let [error, result] = await domainsModel.list(); + if (error) return console.error(error); + + const domains = result; + + [error, result] = await dashboardModel.getConfig(); if (error) return console.error(error); ldapUrl.value = 'ldaps://' + result.adminFqdn + ':636'; diff --git a/dashboard/src/components/SyncDns.vue b/dashboard/src/components/SyncDns.vue new file mode 100644 index 000000000..6e9253319 --- /dev/null +++ b/dashboard/src/components/SyncDns.vue @@ -0,0 +1,85 @@ + + + \ No newline at end of file diff --git a/dashboard/src/models/DashboardModel.js b/dashboard/src/models/DashboardModel.js index d33ef63ae..d50c8e062 100644 --- a/dashboard/src/models/DashboardModel.js +++ b/dashboard/src/models/DashboardModel.js @@ -14,6 +14,28 @@ function create(origin, accessToken) { if (error || result.status !== 200) return [error || result]; return [null, result.body]; }, + async prepareDomain(domain) { + let error, result; + try { + result = await fetcher.post(`${origin}/api/v1/dashboard/prepare_location`, { domain }, { access_token: accessToken }); + } catch (e) { + error = e; + } + + if (error || result.status !== 202) return [error || result]; + return [null, result.body.taskId]; + }, + async setDomain(domain) { + let error, result; + try { + result = await fetcher.post(`${origin}/api/v1/dashboard/location`, { domain }, { access_token: accessToken }); + } catch (e) { + error = e; + } + + if (error || result.status !== 204) return [error || result]; + return [null]; + }, }; } diff --git a/dashboard/src/models/DomainsModel.js b/dashboard/src/models/DomainsModel.js index 701e4a010..a1c5e15bd 100644 --- a/dashboard/src/models/DomainsModel.js +++ b/dashboard/src/models/DomainsModel.js @@ -3,7 +3,6 @@ import { fetcher } from 'pankow'; function create(origin, accessToken) { return { - name: 'DomainsModel', async list() { let error, result; try { @@ -12,13 +11,31 @@ function create(origin, accessToken) { error = e; } - if (error || result.status !== 200) { - console.error('Failed to list domains.', error || result.status); - return []; + if (error || result.status !== 200) return [error || result]; + return [null, result.body.domains]; + }, + async renewCerts(options) { + let error, result; + try { + result = await fetcher.post(`${origin}/api/v1/reverseproxy/renew_certs`, { rebuild: !!options.rebuild }, { access_token: accessToken }); + } catch (e) { + error = e; } - return result.body.domains; + if (error || result.status !== 202) return [error || result]; + return [null, result.body.taskId]; }, + async setDnsRecords(options) { + let error, result; + try { + result = await fetcher.post(`${origin}/api/v1/domains/sync_dns`, options, { access_token: accessToken }); + } catch (e) { + error = e; + } + + if (error || result.status !== 201) return [error || result]; + return [null, result.body.taskId]; + } }; } diff --git a/dashboard/src/views/AppsView.vue b/dashboard/src/views/AppsView.vue index dfa82a67b..99cd66bc0 100644 --- a/dashboard/src/views/AppsView.vue +++ b/dashboard/src/views/AppsView.vue @@ -181,7 +181,9 @@ export default { async mounted() { await this.refreshApps(); - const domains = await domainsModel.list(); + const [error, domains] = await domainsModel.list(); + if (error) return console.error(error); + this.domainFilterOptions = this.domainFilterOptions.concat(domains.map(d => { d.id = d.domain; return d; })); this.domainFilter = this.domainFilterOptions[0].id; diff --git a/dashboard/src/views/DomainsView.vue b/dashboard/src/views/DomainsView.vue new file mode 100644 index 000000000..6c85d044f --- /dev/null +++ b/dashboard/src/views/DomainsView.vue @@ -0,0 +1,127 @@ + + + \ No newline at end of file diff --git a/dashboard/src/views/ServicesView.vue b/dashboard/src/views/ServicesView.vue index d762ab7bd..bb8cbf531 100644 --- a/dashboard/src/views/ServicesView.vue +++ b/dashboard/src/views/ServicesView.vue @@ -46,7 +46,7 @@ const servicesArray = computed(() => { async function refresh(id) { const [error, result] = await servicesModel.get(id); - if (error) console.error(error); + if (error) return console.error(error); services[id] = result; services[id].id = id;