123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256 |
- <template lang="pug">
- v-dialog(v-model='isShown', max-width='650', persistent)
- v-card
- .dialog-header.is-short
- v-icon.mr-3(color='white') mdi-plus
- span New User
- v-spacer
- v-btn.mx-0(color='white', outlined, disabled, dark)
- v-icon(left) mdi-database-import
- span Bulk Import
- v-card-text.pt-5
- v-select(
- :items='providers'
- item-text='displayName'
- item-value='key'
- outlined
- prepend-icon='mdi-domain'
- v-model='provider'
- label='Provider'
- )
- v-text-field(
- outlined
- prepend-icon='mdi-at'
- v-model='email'
- label='Email Address'
- key='newUserEmail'
- persistent-hint
- ref='emailInput'
- )
- v-text-field(
- v-if='provider === `local`'
- outlined
- prepend-icon='mdi-lock-outline'
- append-icon='mdi-dice-5'
- v-model='password'
- :label='mustChangePwd ? `Temporary Password` : `Password`'
- counter='255'
- @click:append='generatePwd'
- key='newUserPassword'
- persistent-hint
- )
- v-text-field(
- outlined
- prepend-icon='mdi-account-outline'
- v-model='name'
- label='Name'
- :hint='provider === `local` ? `Can be changed by the user.` : `May be overwritten by the provider during login.`'
- key='newUserName'
- persistent-hint
- )
- v-select.mt-2(
- :items='groups'
- item-text='name'
- item-value='id'
- item-disabled='isSystem'
- outlined
- prepend-icon='mdi-account-group'
- v-model='group'
- label='Assign to Group(s)...'
- hint='Note that you cannot assign users to the Administrators or Guests groups from this dialog.'
- persistent-hint
- clearable
- multiple
- )
- v-divider
- v-checkbox(
- color='primary'
- label='Require password change on first login'
- v-if='provider === `local`'
- v-model='mustChangePwd'
- hide-details
- )
- v-checkbox(
- color='primary'
- label='Send a welcome email'
- hide-details
- v-model='sendWelcomeEmail'
- disabled
- )
- v-card-chin
- v-spacer
- v-btn(text, @click='isShown = false') Cancel
- v-btn.px-3(depressed, color='primary', @click='newUser(false)')
- v-icon(left) mdi-chevron-right
- span Create
- v-btn.px-3(depressed, color='primary', @click='newUser(true)')
- v-icon(left) mdi-chevron-double-right
- span Create and Close
- </template>
- <script>
- import _ from 'lodash'
- import validate from 'validate.js'
- import gql from 'graphql-tag'
- import createUserMutation from 'gql/admin/users/users-mutation-create.gql'
- import groupsQuery from 'gql/admin/users/users-query-groups.gql'
- export default {
- props: {
- value: {
- type: Boolean,
- default: false
- }
- },
- data() {
- return {
- providers: [],
- provider: 'local',
- email: '',
- password: '',
- name: '',
- groups: [],
- group: [],
- mustChangePwd: false,
- sendWelcomeEmail: false
- }
- },
- computed: {
- isShown: {
- get() { return this.value },
- set(val) { this.$emit('input', val) }
- }
- },
- watch: {
- value(newValue, oldValue) {
- if (newValue) {
- this.$nextTick(() => {
- this.$refs.emailInput.focus()
- })
- }
- }
- },
- methods: {
- async newUser(close = false) {
- let rules = {
- email: {
- presence: {
- allowEmpty: false
- },
- email: true
- },
- name: {
- presence: {
- allowEmpty: false
- },
- length: {
- minimum: 2,
- maximum: 255
- }
- }
- }
- if (this.provider === `local`) {
- rules.password = {
- presence: {
- allowEmpty: false
- },
- length: {
- minimum: 6,
- maximum: 255
- }
- }
- }
- const validationResults = validate({
- email: this.email,
- password: this.password,
- name: this.name
- }, rules, { format: 'flat' })
- if (validationResults) {
- this.$store.commit('showNotification', {
- style: 'red',
- message: validationResults[0],
- icon: 'alert'
- })
- return
- }
- try {
- const resp = await this.$apollo.mutate({
- mutation: createUserMutation,
- variables: {
- providerKey: this.provider,
- email: this.email,
- passwordRaw: this.password,
- name: this.name,
- groups: this.group,
- mustChangePassword: this.mustChangePwd,
- sendWelcomeEmail: this.sendWelcomeEmail
- },
- watchLoading (isLoading) {
- this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-users-create')
- }
- })
- if (_.get(resp, 'data.users.create.responseResult.succeeded', false)) {
- this.$store.commit('showNotification', {
- style: 'success',
- message: 'New user created successfully.',
- icon: 'check'
- })
- this.email = ''
- this.password = ''
- this.name = ''
- if (close) {
- this.isShown = false
- this.$emit('refresh')
- } else {
- this.$refs.emailInput.focus()
- }
- } else {
- this.$store.commit('showNotification', {
- style: 'red',
- message: _.get(resp, 'data.users.create.responseResult.message', 'An unexpected error occurred.'),
- icon: 'alert'
- })
- }
- } catch (err) {
- this.$store.commit('pushGraphError', err)
- }
- },
- generatePwd() {
- const pwdChars = 'abcdefghkmnpqrstuvwxyzABCDEFHJKLMNPQRSTUVWXYZ23456789_*=?#!()+'
- this.password = _.sampleSize(pwdChars, 12).join('')
- }
- },
- apollo: {
- providers: {
- query: gql`
- query {
- authentication {
- activeStrategies {
- key
- displayName
- }
- }
- }
- `,
- fetchPolicy: 'network-only',
- update: (data) => data.authentication.activeStrategies,
- watchLoading (isLoading) {
- this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-users-strategies-refresh')
- }
- },
- groups: {
- query: groupsQuery,
- fetchPolicy: 'network-only',
- update: (data) => data.groups.list,
- watchLoading (isLoading) {
- this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'admin-auth-groups-refresh')
- }
- }
- }
- }
- </script>
|