| 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 occured.'),            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>
 |