teacherAttendence.vue 9.6 KB
<template>
  <v-app id="pages-dasboard">
    <v-tabs grow slider-color="gray">
      <v-tab
        ripple
        @click="activeTab('existing')"
        v-bind:class="{ active: isActive }"
        id="tab"
        class="subheading"
      >Existing Teacher Attendence</v-tab>
      <v-tab
        ripple
        @click="activeTab('new')"
        v-bind:class="{ active: newActive }"
        id="tab1"
        User
        class="subheading"
      >Add Teachers Attendence</v-tab>
      <v-tab-item>
        <!-- ****** EXISTING TACHERS-TABLE DATA****** -->
        <v-data-table
          :headers="headers"
          :items="desserts"
          :pagination.sync="pagination"
          :search="search"
        >
          <template slot="items" slot-scope="props">
            <td id="td" class="text-xs-center">{{ props.index + 1}}</td>
            <td id="td" class="text-xs-center">
              <v-avatar>
                <img :src="props.item.profilePicUrl" v-if="props.item.profilePicUrl" />
                <img src="/static/icon/user.png" v-else-if="!props.item.profilePicUrl" />
              </v-avatar>
            </td>
            <td id="td" class="text-xs-center">{{ props.item.name}}</td>
            <td id="td" class="text-xs-center">{{ props.item.email }}</td>
            <td id="td" class="text-xs-center">{{ props.item.mobileNo }}</td>
            <td class="text-xs-center">
              <router-link :to="{ name:'ViewTeacherAttendence',params: { teacherId:props.item._id } }">
                <span>
                  <v-tooltip top>
                    <img
                      slot="activator"
                      style="cursor:pointer; width:25px; height:18px; "
                      class="mr5"
                      src="/static/icon/eye1.png"
                    />
                    <span>View</span>
                  </v-tooltip>
                </span>
              </router-link>
            </td>
          </template>
          <v-alert
            slot="no-results"
            :value="true"
            color="error"
            icon="warning"
          >Your search for "{{ search }}" found no results.</v-alert>
        </v-data-table>
      </v-tab-item>
      <!-- ****** Add Teachers Attendece****** -->
      <v-tab-item>
        <v-card flat>
          <v-flex xs12>
            <v-layout wrap>
              <v-flex xs12 md6>
                <v-layout>
                  <v-flex xs4 sm4 md2>
                    <label class="title right mr-3 mt-4">Date:</label>
                  </v-flex>
                  <v-flex xs6>
                    <v-menu
                      ref="menu"
                      :close-on-content-click="false"
                      v-model="menu"
                      :nudge-right="40"
                      lazy
                      transition="scale-transition"
                      offset-y
                      full-width
                      min-width="290px"
                    >
                      <v-text-field
                        slot="activator"
                        v-model="date"
                        label="Select Date"
                        append-icon="event"
                        readonly
                      ></v-text-field>
                      <v-date-picker
                        ref="picker"
                        v-model="date"
                        :max="new Date().toISOString().substr(0, 10)"
                        min="1950-01-01"
                        @change="save"
                      ></v-date-picker>
                    </v-menu>
                  </v-flex>
                </v-layout>
              </v-flex>
              <v-flex xs8 sm8 md6>
                <v-btn class="right mt-3 black" dark round @click="showTable">Attendence</v-btn>
              </v-flex>
            </v-layout>
          </v-flex>
        </v-card>
        <v-flex xs12 v-show="attendeceTable">
          <v-data-table
            :headers="headers"
            :items="teachersData"
            :pagination.sync="pagination"
            :search="search"
          >
            <template slot="items" slot-scope="props">
              <td id="td" class="text-xs-center">{{ props.index + 1}}</td>
              <td id="td" class="text-xs-center">
                <v-avatar>
                  <img :src="props.item.profilePicUrl" v-if="props.item.profilePicUrl" />
                  <img src="/static/icon/user.png" v-else-if="!props.item.profilePicUrl" />
                </v-avatar>
              </td>
              <td id="td" class="text-xs-center">{{ props.item.name}}</td>
              <td id="td" class="text-xs-center">{{ props.item.email }}</td>
              <td id="td" class="text-xs-center">{{ props.item.mobileNo }}</td>
              <td class="text-xs-center">
                <v-radio-group v-model="props.item.attendence" :mandatory="false" row>
                  <v-radio
                    v-for="attendences in attendenceType"
                    :key="attendences.value"
                    :label="`${attendences.label}`"
                    :value="attendences.value"
                  ></v-radio>
                </v-radio-group>
              </td>
            </template>
          </v-data-table>
          <v-btn @click="submit()" class="right black" round dark>Submit</v-btn>
        </v-flex>
      </v-tab-item>
    </v-tabs>
    <v-snackbar
      :timeout="timeout"
      :top="y === 'top'"
      :right="x === 'right'"
      :vertical="mode === 'vertical'"
      v-model="snackbar"
      color="success"
    >{{ text }}</v-snackbar>
    <div class="loader" v-if="showLoader">
      <v-progress-circular indeterminate color="white"></v-progress-circular>
    </div>
  </v-app>
</template>

<script>
import http from "@/Services/http.js";
import moment from "moment";

export default {
  data: () => ({
    snackbar: false,
    y: "top",
    x: "right",
    mode: "",
    timeout: 3000,
    text: "",
    date: null,
    menu: false,
    attendeceTable: false,
    showLoader: false,
    loading: false,
    search: "",
    valid: true,
    isActive: true,
    newActive: false,
    attendenceType: [
      {
        label: "Present",
        value: "present"
      },
      {
        label: "Late Present With Excuset",
        value: "latePresentWithExcuse"
      },
      {
        label: "Late Present",
        value: "latePresent"
      },
      {
        label: "Absent",
        value: "absent"
      }
    ],
    pagination: {
      rowsPerPage: 15
    },
    headers: [
      {
        text: "No",
        align: "center",
        sortable: false,
        value: "No"
      },
      {
        text: "Profile Pic",
        value: "profilePicUrl",
        sortable: false,
        align: "center"
      },
      { text: "Name", value: "name", sortable: false, align: "center" },
      { text: "Email", value: "email", sortable: false, align: "center" },
      {
        text: "Mobile No",
        value: "mobileNo",
        sortable: false,
        align: "center"
      },
      { text: "Attendance", value: "", sortable: false, align: "center" }
    ],
    desserts: [],
    teachersData: [],
    addTeachers: {}
  }),
  watch: {
    menu(val) {
      val && this.$nextTick(() => (this.$refs.picker.activePicker = "DAY"));
    }
  },
  methods: {
    save(date) {
      this.$refs.menu.save(date);
    },
    showTable() {
      this.attendeceTable = true;
      this.getTeacherList();
      console.log("date", this.date);
    },
    getTeacherList() {
      this.showLoader = true;
      var token = this.$store.state.token;
      http()
        .get("/getTeachersList", {
          headers: { Authorization: "Bearer " + token }
        })
        .then(response => {
          this.teachersData = response.data.data;
          this.desserts = response.data.data;
          var attendence = "";
          for (let i = 0; i < this.teachersData.length; i++) {
            this.teachersData[i].attendence = "present";
          }
          this.showLoader = false;
          // console.log("getTeacherList=====>",this.desserts)
        })
        .catch(error => {
          this.showLoader = false;
          if (error.response.status === 401) {
            this.$router.replace({ path: "/" });
            this.$store.dispatch("setToken", null);
            this.$store.dispatch("Id", null);
          }
        });
    },
    activeTab(type) {
      switch (type) {
        case "existing":
          this.newActive = false;
          this.isActive = true;
          break;

        default:
          this.newActive = true;
          this.isActive = false;
          break;
      }
    },
    submit() {
      var teachersAttendence = [];
      for (var j = 0; j < this.teachersData.length; j++) {
        teachersAttendence.push({
          teacherId: this.teachersData[j]._id,
          attendanceType: this.teachersData[j].attendence
        });
      }
      let attendanceData = {
        date: this.date,
        teachers: teachersAttendence
      };
      http()
        .post("/createTeacherAttendance", attendanceData)
        .then(response => {
          this.snackbar = true;
          this.text = response.data.message;
        })
        .catch(error => {
          this.snackbar = true;
          this.text = error.response.data.message;
        });
    },
    clear() {
      this.$refs.form.reset();
      this.imageUrl = "";
    }
  },
  mounted() {
    this.getTeacherList();
  },
  created() {
    this.$root.$on("app:search", search => {
      this.search = search;
    });
  },
  beforeDestroy() {
    // dont forget to remove the listener
    this.$root.$off("app:search");
  }
};
</script>
<style scoped>
.active {
  background-color: gray;
  color: white !important;
}
.activebtn {
  color: black !important;
}
</style>