Skip to content
Snippets Groups Projects
UpdateItemTable.vue 7.19 KiB
<template>
  <div
    class="flex items-center justify-center panel-table w-full md:w-auto pt-10"
  >
    <table
      :id="id"
      class="table table-striped table-bordered table-hover"
    ></table>
  </div>
</template>

<script>
const _ = require('lodash');
let host = require('./js/const').apiHost

const $ = window.jQuery = require('jquery');
require('@/components/js/datatable');

let table;

export default {
  name: 'update-item-table',
  props: ['id', 'data', 'meta'],
  data() {
    return {
      rows: [],
      header: [],
      total: 0,
      isDev: process.env.NODE_ENV === 'development',
    };
  },
  computed: {
    jwt: function () {
      return this.$store.getters['User/jwt']
    },
  },
  methods: {
    editUpdateItem(id) {
      // eslint-disable-next-line
      this.$router.push("/updateitem/" + id);
    },
    createTable(id) {
      const vm = this;

      const columns = [
        {
          title: "ID",
          data: "id",
          fnCreatedCell: (nTd, sData, oData) => {
            $(nTd).html(`<a href="" class="edit-link"> ${sData}</a>`);
          },
        },
        {
          title: "Resource Name",
          data: "attributes.Entity",
        },
        {
          title: "Resource ID",
          data: "attributes.EntityId",
        },
        {
          title: "Attribute",
          data: "attributes.Attribute",
        },
        {
          title: "Value",
          data: "attributes.Value",
        },
        {
          title: "Change Operation",
          data: "attributes.ChangeOperation",
        },
        {
          title: "Status",
          data: "attributes.Status",
        },
        {
          title: "Submitted at",
          data: "attributes.SubmittedAt",
          render: function (data, type, row, meta) {
            return new Date(Date.parse(data)).toLocaleString();
          },
        },
        {
          title: "Submitted by",
          data: "attributes.submittedBy",
          render: function (data, type, row, meta) {
            if (data.data) {
              return data.data.attributes.username;
            } else {
              return "";
            }
          },
        },
        {
          title: "Reviewer",
          data: "attributes.reviewedBy",
          render: function (data, type, row, meta) {
            if (data.data) {
              return data.data.attributes.username;
            } else {
              return "";
            }
          },
        },
      ];

      vm.headers = columns

      const nTableOptions = {
        columns,
        // aaSorting: [[ 0, 'asc' ]],
        lengthMenu: [[10, 25, 50, 100], [10, 25, 50, 100]],
        paging: true,
        searching: true,
        info: true,
        bProcessing: true,
        bServerSide: true,
        order: [], // order: [[0, 'asc']],
        bDestroy: true, // Add this property to new setting,
        oLanguage: {
          sSearch: "Filter",
        },
        fnServerData: function (sSource, aoData, fnCallback, oSettings) {
          oSettings.jqXHR = vm.fetchCallback(vm.rows, aoData, fnCallback)
        },
        dom: '<"row"<"col-sm-2"l><"col-sm-2"f><"col-sm-8"p>><"row"t><"row"<"col-sm-4"i><"col-sm-8"p>>'
      };

      const tableId = `#${id}`;
      if (table) {
        table.destroy();
        $(tableId).empty();
      }

      table = $(tableId).DataTable(nTableOptions);

      const tableBody = `${tableId} tbody`;

      $(tableBody).on("click", "tr td a.edit-link", (e) => {
        e.preventDefault();
        const tr = $(e.target).parent().parent();
        const row = table.row(tr);
        vm.editUpdateItem(row.data().id);
      });
    },
    async fetchCallback (data, aoData, fnCallback) {
      let vm = this

      // console.log(aoData)
      let orderItem = aoData.find(x => x.name === 'order')
      let startItem = aoData.find(x => x.name === 'start')
      let lengthItem = aoData.find(x => x.name === 'length')
      let searchItem = aoData.find(x => x.name === 'search')
      // console.log(`length = ${lengthItem.value}, offset = ${startItem.value}`)
      // console.log(`orderItem = ${orderItem.value}, searchItem = ${searchItem.value.value}`)

      const page = startItem.value / lengthItem.value + 1

      let search = searchItem.value.value

      if(vm.isDev) {
        host = require('./js/const').devApiHost;
      }

      const qs = require('qs');
      const query = {
        pagination: {
          pageSize: lengthItem.value,
          page: page,
        },
      };

      const columns = ['id', 'Entity', 'EntityId', 'Attribute', 'Value', 'ChangeOperation', 'Status', 'SubmittedAt', 'submittedBy.username', 'reviewedBy.username']

      let order = ['id:asc']
      if (orderItem.value.length > 0) {
        orderItem.value.forEach(function (data) {
          // console.log(data)
          order = `${columns[data.column]}:${data.dir}`
        })
        // console.log(order)
      }

      query['sort'] = order

      if (searchItem.value.value) {
        query['filters'] = {
          $or: [
            {
              Entity: {
                $containsi: search,
              }
            },
            {
              EntityId: {
                $containsi: search,
              },
            },
            {
              ChangeOperation: {
                $containsi: search,
              },
            },
            {
              Attribute: {
                $containsi: search,
              },
            },
            {
              Value: {
                $containsi: search,
              }
            }]
        }
      }

      const queryString = qs.stringify(query, {
        encodeValuesOnly: true,
      });

      let url = `${host}/api/update-items?${queryString}`;

      const jwt = vm.jwt;
      if(jwt === null) {
        return
      }

      try {
        const res = await this.axios.get(url, {
          headers: {
            Authorization: `Bearer ${jwt}`
          }
        });

        // console.log(res);

        if(res.data) {
          // vm.meta = res.meta;
          // vm.data = res.data;
          let dat = {
            draw: aoData.draw,
            recordsTotal: query['filters'] ? vm.total: vm.total = res.data.meta.pagination.total,
            recordsFiltered: res.data.meta.pagination.total,
            data: res.data.data
          }

          fnCallback(dat)
        }
      } catch(error) {
        // console.error(error)
        this.error = true
        this.errorMsg = "You are not authorized to access this item."
        // setTimeout(() => vm.$router.go(-1), 2000);
      }
    },
    exportTsv() {
      // const vm = this;
    },
  },
  mounted() {
    const vm = this;
    vm.createTable(vm.id);
  },
};
</script>

<style scoped>
@import url("~@/assets/datatable.css");

select.form-control {
  font-size: 12px;
  padding: 3px 12px;
}

ul.pagination {
  font-size: 1rem;
}

.form-inline .form-control {
  height: 25px;
  line-height: 25px;
  vertical-align: middle;
}

.edit-link {
  font-weight: bold;
  color: #0065b9;
}

.pagination {
  font-size: 1.2rem;
}

.panel-table {
  font-size: 1.4rem;
  margin-bottom: 20px;
  background-color: #fff;
  border: 1px solid rgba(0, 0, 0, 0.05);
  border-radius: 4px;
  -webkit-box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.05);
}
</style>