123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236 |
- <template lang="pug">
- div
- v-dialog(v-model='isShown', max-width='650', persistent)
- v-card
- .dialog-header.is-short
- v-icon.mr-3(color='white') mdi-plus
- span {{$t('admin:api.newKeyTitle')}}
- v-card-text.pt-5
- v-text-field(
- outlined
- prepend-icon='mdi-format-title'
- v-model='name'
- :label='$t(`admin:api.newKeyName`)'
- persistent-hint
- ref='keyNameInput'
- :hint='$t(`admin:api.newKeyNameHint`)'
- counter='255'
- )
- v-select.mt-3(
- :items='expirations'
- outlined
- prepend-icon='mdi-clock'
- v-model='expiration'
- :label='$t(`admin:api.newKeyExpiration`)'
- :hint='$t(`admin:api.newKeyExpirationHint`)'
- persistent-hint
- )
- v-divider.mt-4
- v-subheader.pl-2: strong.indigo--text {{$t('admin:api.newKeyPermissionScopes')}}
- v-list.pl-8(nav)
- v-list-item-group(v-model='fullAccess')
- v-list-item(
- :value='true'
- active-class='indigo--text'
- )
- template(v-slot:default='{ active, toggle }')
- v-list-item-action
- v-checkbox(
- :input-value='active'
- :true-value='true'
- color='indigo'
- @click='toggle'
- )
- v-list-item-content
- v-list-item-title {{$t('admin:api.newKeyFullAccess')}}
- v-divider.mt-3
- v-subheader.caption.indigo--text {{$t('admin:api.newKeyGroupPermissions')}}
- v-list-item
- v-select(
- :disabled='fullAccess'
- :items='groups'
- item-text='name'
- item-value='id'
- outlined
- color='indigo'
- v-model='group'
- :label='$t(`admin:api.newKeyGroup`)'
- :hint='$t(`admin:api.newKeyGroupHint`)'
- persistent-hint
- )
- v-card-chin
- v-spacer
- v-btn(text, @click='isShown = false', :disabled='loading') {{$t('common:actions.cancel')}}
- v-btn.px-3(depressed, color='primary', @click='generate', :loading='loading')
- v-icon(left) mdi-chevron-right
- span {{$t('common:actions.generate')}}
- v-dialog(
- v-model='isCopyKeyDialogShown'
- max-width='750'
- persistent
- overlay-color='blue darken-5'
- overlay-opacity='.9'
- )
- v-card
- v-toolbar(dense, flat, color='primary', dark) {{$t('admin:api.newKeyTitle')}}
- v-card-text.pt-5
- .body-2.text-center
- i18next(tag='span', path='admin:api.newKeyCopyWarn')
- strong(place='bold') {{$t('admin:api.newKeyCopyWarnBold')}}
- v-textarea.mt-3(
- ref='keyContentsIpt'
- filled
- no-resize
- readonly
- v-model='key'
- :rows='10'
- hide-details
- )
- v-card-chin
- v-spacer
- v-btn.px-3(depressed, dark, color='primary', @click='isCopyKeyDialogShown = false') {{$t('common:actions.close')}}
- </template>
- <script>
- import _ from 'lodash'
- import gql from 'graphql-tag'
- import groupsQuery from 'gql/admin/users/users-query-groups.gql'
- export default {
- props: {
- value: {
- type: Boolean,
- default: false
- }
- },
- data() {
- return {
- loading: false,
- name: '',
- expiration: '1y',
- fullAccess: true,
- groups: [],
- group: null,
- isCopyKeyDialogShown: false,
- key: ''
- }
- },
- computed: {
- isShown: {
- get() { return this.value },
- set(val) { this.$emit('input', val) }
- },
- expirations() {
- return [
- { value: '30d', text: this.$t('admin:api.expiration30d') },
- { value: '90d', text: this.$t('admin:api.expiration90d') },
- { value: '180d', text: this.$t('admin:api.expiration180d') },
- { value: '1y', text: this.$t('admin:api.expiration1y') },
- { value: '3y', text: this.$t('admin:api.expiration3y') }
- ]
- }
- },
- watch: {
- value (newValue, oldValue) {
- if (newValue) {
- setTimeout(() => {
- this.$refs.keyNameInput.focus()
- }, 400)
- }
- }
- },
- methods: {
- async generate () {
- try {
- if (_.trim(this.name).length < 2 || this.name.length > 255) {
- throw new Error(this.$t('admin:api.newKeyNameError'))
- } else if (!this.fullAccess && !this.group) {
- throw new Error(this.$t('admin:api.newKeyGroupError'))
- } else if (!this.fullAccess && this.group === 2) {
- throw new Error(this.$t('admin:api.newKeyGuestGroupError'))
- }
- } catch (err) {
- return this.$store.commit('showNotification', {
- style: 'red',
- message: err,
- icon: 'alert'
- })
- }
- this.loading = true
- try {
- const resp = await this.$apollo.mutate({
- mutation: gql`
- mutation ($name: String!, $expiration: String!, $fullAccess: Boolean!, $group: Int) {
- authentication {
- createApiKey (name: $name, expiration: $expiration, fullAccess: $fullAccess, group: $group) {
- key
- responseResult {
- succeeded
- errorCode
- slug
- message
- }
- }
- }
- }
- `,
- variables: {
- name: this.name,
- expiration: this.expiration,
- fullAccess: (this.fullAccess === true),
- group: this.group
- },
- watchLoading (isLoading) {
- this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-api-create')
- }
- })
- if (_.get(resp, 'data.authentication.createApiKey.responseResult.succeeded', false)) {
- this.$store.commit('showNotification', {
- style: 'success',
- message: this.$t('admin:api.newKeySuccess'),
- icon: 'check'
- })
- this.name = ''
- this.expiration = '1y'
- this.fullAccess = true
- this.group = null
- this.isShown = false
- this.$emit('refresh')
- this.key = _.get(resp, 'data.authentication.createApiKey.key', '???')
- this.isCopyKeyDialogShown = true
- setTimeout(() => {
- this.$refs.keyContentsIpt.$refs.input.select()
- }, 400)
- } else {
- this.$store.commit('showNotification', {
- style: 'red',
- message: _.get(resp, 'data.authentication.createApiKey.responseResult.message', 'An unexpected error occurred.'),
- icon: 'alert'
- })
- }
- } catch (err) {
- this.$store.commit('pushGraphError', err)
- }
- this.loading = false
- }
- },
- apollo: {
- groups: {
- query: groupsQuery,
- fetchPolicy: 'network-only',
- update: (data) => data.groups.list,
- watchLoading (isLoading) {
- this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-api-groups-refresh')
- }
- }
- }
- }
- </script>
|