petra-tool / frontend / src / views / auth / Login.vue
Login.vue
Raw
<template>
  <v-row justify="center" style="height: 100%; margin: 0;">
    <v-col cols="12" md="5" style="background: rgba(255,255,255,0.3)">
      <v-row style="height: 100%">
        <v-col cols="12" align-self="center">
          <v-row class="text-center" justify="center">
            <v-col cols="12">
              <router-link :to="{name: 'pub-home'}">
              <v-img
                :src="require('../../assets/logo.png')"
                height="80"
                contain
                transition="scale-transition"
              />
              </router-link>
            </v-col>
            <v-col cols="12" class="body-1">
              Manage Your Design Process from Idea to Product Concept.
            </v-col>
            <v-col cols="12">
              <v-card flat
                      :disabled="form.loading"
                      :class="$vuetify.breakpoint.lgAndUp ? 'mx-10' : ''"
                      color="rgba(255,255,255,0)">
                <v-form ref="form" v-model="form.valid" lazy-validation @submit="onSubmit">
                  <v-card-text class="text-left">
                    <v-row no-gutters>
                      <v-col cols="12">
                        <div class="text-h5 text--primary mb-3">Log In</div>
                        <v-text-field
                          label="Team Name"
                          v-model="form.body.teamname"
                          solo flat
                          :rules="[value => !!value || 'Team Name is required.']"
                        ></v-text-field>
                      </v-col>
                      <v-col cols="12">
                        <div class="text-h5 text--primary mb-3">Password</div>
                        <v-text-field
                          label="Password"
                          v-model="form.body.password"
                          :append-icon="form.show ? 'mdi-eye' : 'mdi-eye-off'"
                          :type="form.show ? 'text' : 'password'"
                          solo flat
                          @click:append="form.show = !form.show"
                          :rules="[value => !!value || 'Password is required.']"
                        ></v-text-field>
                      </v-col>
                      <v-col cols="12">
                        <v-checkbox
                          v-model="form.staySignedIn"
                          color="accent"
                        ><span slot="label" class="black--text body-2">Stay signed in</span></v-checkbox>
                      </v-col>
                    </v-row>

                  </v-card-text>
                  <v-card-actions class="pb-0">
                    <v-row>
                      <v-col cols="6">
                        <register></register>
                      </v-col>
                      <v-col cols="6">
                        <v-btn depressed color="primary" block
                               :loading="form.loading"
                               type="submit" :disabled="!form.valid">
                          Login
                        </v-btn>
                      </v-col>
                    </v-row>
                  </v-card-actions>
                  <v-card-text class="text-left pt-1 px-2 body-2">
                    <v-row>
                      <v-col cols="6">
                        Not registered yet? Create an account.
                      </v-col>
                      <v-col cols="6" class="text-right">
                        <v-fade-transition>
                          <div v-for="error in form.errors" :key="error" class="red--text">
                            {{ error }}
                          </div>
                        </v-fade-transition>

                      </v-col>
                    </v-row>
                  </v-card-text>
                </v-form>
              </v-card>

            </v-col>
          </v-row>
        </v-col>
      </v-row>

    </v-col>

  </v-row>
</template>

<script>
import Register from "@/components/Register";

export default {
  name: "Login",
  components: {Register},
  props: ['waitingForApproval'],
  data: () => ({
    form: {
      body: {
        teamname: '',
        password: '',
      },

      valid: true,
      show: false,
      remember: true,
      staySignedIn: false,
      errors: {},
      loading: false,
    },

    fetchUser: true, // stays fixed i.e. always load team data from database (required)
  }),
  methods: {
    errors(res) {
      this.form.errors = Object.fromEntries(res.data.errors.map(item => [item.field, item.msg]))
    },

    onSubmit(e) {
      e.preventDefault()
      if (this.$refs.form.validate()) {
        this.form.loading = true

        this.$store.dispatch('auth/login', {
          data: this.form.body,
          remember: this.form.remember,
          staySignedIn: this.form.staySignedIn,
          fetchUser: this.fetchUser,
        })
          .then(null, (res) => {
            this.errors(res.response)
            this.form.loading = false
          })
      }
    },
  },
  created() {
    // Development only
    // this.form.body.teamname = 'team100'
    // this.form.body.password = 'mypassword'
    // this.form.staySignedIn = true
  }
}
</script>

<style scoped>

</style>