diff --git a/dashboard/src/components/OpenIdClients.vue b/dashboard/src/components/OpenIdClients.vue index 79a7db24b..0ff46954a 100644 --- a/dashboard/src/components/OpenIdClients.vue +++ b/dashboard/src/components/OpenIdClients.vue @@ -6,8 +6,9 @@ import { useI18n } from 'vue-i18n'; const i18n = useI18n(); const t = i18n.t; -import { ref, onMounted, useTemplateRef } from 'vue'; -import { Button, TableView, InputDialog } from 'pankow'; +import { ref, onMounted, useTemplateRef, computed } from 'vue'; +import { Button, Dialog, TableView, FormGroup, TextInput, InputDialog } from 'pankow'; +import { copyToClipboard } from 'pankow/utils'; import Section from './Section.vue'; import DashboardModel from '../models/DashboardModel.js'; import UserDirectoryModel from '../models/UserDirectoryModel.js'; @@ -21,17 +22,65 @@ const columns = { }; const inputDialog = useTemplateRef('inputDialog'); +const editDialog = useTemplateRef('editDialog'); const clients = ref([]); const adminFqdn = ref(''); -// TODO below +// edit or add +const submitBusy = ref(false); +const submitError = ref(''); +const clientId = ref(''); +const clientSecret = ref(''); +const clientName = ref(''); +const clientLoginRedirectUri = ref(''); +const clientTokenSignatureAlgorithm = ref('RS256'); + +const isValid = computed(() => { + if (!clientName.value) return false; + if (!clientLoginRedirectUri.value) return false; + if (!clientTokenSignatureAlgorithm.value) return false; + + return true; +}); + async function onAdd() { - console.log('add') + submitBusy.value = false; + clientId.value = ''; + clientSecret.value = ''; + clientName.value = ''; + clientLoginRedirectUri.value = ''; + clientTokenSignatureAlgorithm.value = 'RS256'; + + editDialog.value.open(); } async function onEdit(client) { - console.log('edit', client) + submitBusy.value = false; + clientId.value = client.id; + clientSecret.value = client.secret; + clientName.value = client.name; + clientLoginRedirectUri.value = client.loginRedirectUri; + clientTokenSignatureAlgorithm.value = client.tokenSignatureAlgorithm; + + editDialog.value.open(); +} + +async function onSubmit() { + if (!isValid.value) return; + + submitBusy.value = true; + const [error] = await userDirectoryModel.updateOpenIdClient(clientId.value, clientName.value, clientLoginRedirectUri.value, clientTokenSignatureAlgorithm.value); + if (error) { + submitBusy.value = false; + submitError.value = error.body ? error.body.message : 'Internal error'; + return console.error(error); + } + + await refresh(); + editDialog.value.close(); + + submitBusy.value = false; } async function onRemove(client) { @@ -54,6 +103,11 @@ async function refresh() { clients.value = result; } +function onCopyToClipboard(value) { + copyToClipboard(value); + window.pankow.notify({ type: 'success', text: 'Copied to clipboard!' }); +} + onMounted(async () => { const config = await dashboardModel.getConfig(); adminFqdn.value = config.adminFqdn; @@ -66,39 +120,68 @@ onMounted(async () => { - - diff --git a/dashboard/src/style.css b/dashboard/src/style.css index 9b787b173..a21c953e0 100644 --- a/dashboard/src/style.css +++ b/dashboard/src/style.css @@ -134,6 +134,11 @@ tr:hover .table-actions { display: flex; } +.info-row:first-of-type:not(:last-of-type), +.info-row:last-of-type { + margin-bottom: 15px; +} + .info-label { font-weight: bold; flex-basis: 50%;