aboutsummaryrefslogtreecommitdiffstats
path: root/apps/oauth2/src/App.vue
diff options
context:
space:
mode:
Diffstat (limited to 'apps/oauth2/src/App.vue')
-rw-r--r--apps/oauth2/src/App.vue161
1 files changed, 161 insertions, 0 deletions
diff --git a/apps/oauth2/src/App.vue b/apps/oauth2/src/App.vue
new file mode 100644
index 00000000000..941317a3e64
--- /dev/null
+++ b/apps/oauth2/src/App.vue
@@ -0,0 +1,161 @@
+<!--
+ - 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/components/NcSettingsSection'
+import NcButton from '@nextcloud/vue/components/NcButton'
+import NcNoteCard from '@nextcloud/vue/components/NcNoteCard'
+import { loadState } from '@nextcloud/initial-state'
+import NcTextField from '@nextcloud/vue/components/NcTextField'
+
+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>