<!-- - SPDX-FileCopyrightText: 2018 Nextcloud GmbH and Nextcloud contributors - SPDX-License-Identifier: AGPL-3.0-or-later --> <template> <NcSettingsSection :name="t('oauth2', 'OAuth 2.0 clients')" :description="t('oauth2', 'OAuth 2.0 allows external services to request access to {instanceName}.', { instanceName })" :doc-url="oauthDocLink"> <table v-if="clients.length > 0" class="grid"> <thead> <tr> <th> {{ t('oauth2', 'Name') }} </th> <th> {{ t('oauth2', 'Redirection URI') }} </th> <th> {{ t('oauth2', 'Client Identifier') }} </th> <th> {{ t('oauth2', 'Secret key') }} </th> <th> {{ t('oauth2', 'Delete client') }} </th> </tr> </thead> <tbody> <OAuthItem v-for="client in clients" :key="client.id" :client="client" @delete="deleteClient" /> </tbody> </table> <NcNoteCard v-if="showSecretWarning" type="warning"> {{ t('oauth2', 'Make sure you store the secret key, it cannot be recovered.') }} </NcNoteCard> <br> <h3>{{ t('oauth2', 'Add client') }}</h3> <span v-if="newClient.error" class="msg error">{{ newClient.errorMsg }}</span> <form class="oauth2-form" @submit.prevent="addClient"> <NcTextField id="name" :value.sync="newClient.name" type="text" class="oauth2-form--input" name="name" :label="t('oauth2', 'Name')" :placeholder="t('oauth2', 'Name')" /> <NcTextField id="redirectUri" :value.sync="newClient.redirectUri" type="url" class="oauth2-form--input" name="redirectUri" :label="t('oauth2', 'Redirection URI')" :placeholder="t('oauth2', 'Redirection URI')" /> <NcButton native-type="submit" class="inline-button"> {{ t('oauth2', 'Add') }} </NcButton> </form> </NcSettingsSection> </template> <script> import axios from '@nextcloud/axios' import OAuthItem from './components/OAuthItem.vue' import { generateUrl } from '@nextcloud/router' import { getCapabilities } from '@nextcloud/capabilities' import NcSettingsSection from '@nextcloud/vue/dist/Components/NcSettingsSection.js' import NcButton from '@nextcloud/vue/dist/Components/NcButton.js' import NcNoteCard from '@nextcloud/vue/dist/Components/NcNoteCard.js' import { loadState } from '@nextcloud/initial-state' import NcTextField from '@nextcloud/vue/dist/Components/NcTextField.js' export default { name: 'App', components: { OAuthItem, NcSettingsSection, NcButton, NcTextField, NcNoteCard, }, props: { clients: { type: Array, required: true, }, }, data() { return { newClient: { name: '', redirectUri: '', errorMsg: '', error: false, }, oauthDocLink: loadState('oauth2', 'oauth2-doc-link'), showSecretWarning: false, } }, computed: { instanceName() { return getCapabilities().theming.name }, }, methods: { deleteClient(id) { axios.delete(generateUrl('apps/oauth2/clients/{id}', { id })) .then(() => { // eslint-disable-next-line vue/no-mutating-props this.clients = this.clients.filter(client => client.id !== id) }) }, addClient() { this.newClient.error = false axios.post( generateUrl('apps/oauth2/clients'), { name: this.newClient.name, redirectUri: this.newClient.redirectUri, }, ).then(response => { // eslint-disable-next-line vue/no-mutating-props this.clients.push(response.data) this.showSecretWarning = true this.newClient.name = '' this.newClient.redirectUri = '' }).catch(reason => { this.newClient.error = true this.newClient.errorMsg = reason.response.data.message }) }, }, } </script> <style scoped> table { max-width: 800px; } /** Overwrite button height and position to be aligned with the text input */ .inline-button { min-height: 34px !important; display: inline-flex !important; } .oauth2-form { display: flex; flex-direction: row; } .oauth2-form--input { max-width: 200px; margin-inline-end: 10px; } </style>