Функция сортировки триггера в datatable vuetify - PullRequest
0 голосов
/ 04 октября 2019

Я пытаюсь реализовать поисковый фильтр, который отображает данные со стороны сервера, а также сортирует и разбивает на страницы.

В нем было модальное поле для добавления редактирования.

 
 
	new Vue({
  el: '#app',
  vuetify: new Vuetify(),
  data: vm => ({
    rangeDates: ['', ''],
    date: new Date().toISOString().substr(0, 10),
    dateFormatted: vm.formatDate(new Date().toISOString().substr(0, 10)),
    txt:'',
   
    menu1: false,
    dialog: false,
    headers: [ 
      {
        text: 'ID',
        align: 'left',
        sortable: false,
        value: 'id',
      },
      { text: 'description', value: 'description' },
      { text: 'Mail Id', value: 'mail_id' },
      { text: 'Reply Date', value: 'replyDate' },
      { text: 'Status', value: 'name' },
      { text: 'Actions', value: 'action', sortable: false },
    ],
    desserts: [],
    options: {},
    totalDesserts: 0,
    loading:false,
    editedIndex: -1,
    editedItem: {
      mail_id: '',
      replyDate: vm.formatDate(new Date().toISOString().substr(0, 10)),
      status: 'Select',
      description: '',
      
    },
    defaultItem: {
     mail_id: '',
      replyDate: vm.formatDate(new Date().toISOString().substr(0, 10)),
      status: 'Select',
      description: '',
    },
  }),

  computed: {
    formTitle () {
      return this.editedIndex === -1 ? 'New Item' : 'Edit Item'
    } 
  },

  watch: {

    date (val) {
       
      this.dateFormatted = this.formatDate(this.date)
      this.editedItem.replyDate=this.formatDate(this.date)
     
    },
     desserts(val){
      this.desserts=val
        console.log('desse',val);

      },
    options: {

      handler () {console.log("handerrler");
        this.getDataFromApi()
          .then(data => {console.log("handeler");
          	console.log(data);
            this.desserts = data.items
            this.totalDesserts = data.total
          })
      },
      deep: true,
    },
  
    dialog (val) {
      val || this.close()
    },
  } ,
   mounted () {
    this.getDataFromApi()
      .then(data => {
      	console.log(this.options);
      	console.log("mounted");
      	console.log(data);
        this.desserts = data.items
        this.totalDesserts = data.total
      })
  },

  created () {
    this.initialize()
  },

  methods: {
     formatDate (date) {
      if (!date) return null

      const [year, month, day] = date.split('-')
      return `${month}/${day}/${year}`
    },   parseDate (date) {
      if (!date) return null
        console.log(date);
      const [month, day, year] = date.split('/')

      return `${year}-${month.padStart(2, '0')}-${day.padStart(2, '0')}`
    },
    initialize () {
    	this.getDataFromApi();
     },

    editItem (item) {
    
      this.editedIndex = this.desserts.indexOf(item)
      this.editedItem = Object.assign({}, item)
      this.editedItem.replyDate=this.formatDate(this.editedItem.replyDate)
     
      this.dialog = true
    },

    deleteItem (item) {
      const index = this.desserts.indexOf(item)
      confirm('Are you sure you want to delete this item?') && this.desserts.splice(index, 1)
    },

    close () {
      this.dialog = false
      setTimeout(() => {
        this.editedItem = Object.assign({}, this.defaultItem)
        this.editedIndex = -1
      }, 300)
    },

    save () {

       axios({
        method: 'POST',
        url: "<?php echo site_url('mail_manage/get_reply_list')?>",
        data: {data:this.editedItem },
        config: { headers: {'Content-Type': 'multipart/form-data' }}
        })
        .then(function (response) { 
               if (this.editedIndex > -1) {
      this.editedItem.replyDate=this.parseDate(this.editedItem.replyDate)
      this.defaultItem.replyDate=this.parseDate(this.defaultItem.replyDate) 

        Object.assign(this.desserts[this.editedIndex], this.editedItem)
      } else {
        this.desserts.push(this.editedItem)
      }
      this.close()

        })
        .catch(function (response) {
            //handle error
            console.log(response);
            this.loading=false;
        });
     
    },

       getDataFromApi () {

      
  
      var date = this.rangeDates;

      console.log(date);

        return new Promise((resolve, reject) => {
        
        
        const dataOpts=this.options;
          axios({
        method: 'POST',
        url: "<?php echo site_url('mail_manage/get_reply_list')?>",
        data: {data:{date},options:this.options},
        config: { headers: {'Content-Type': 'multipart/form-data' }}
        })
        .then(function (response) {
           console.log(response);
        let items = response.data.data
        const total = response.data.recordsTotal
         console.log("===_____===");
        console.log(items,total,dataOpts);
        console.log("======");
         console.log(this.options);

      this.desserts =  items
      this.totalDesserts =  total
  
        console.log(this.desserts,this.totalDesserts);
       
        this.loading = false
        resolve({
            items,
            total,
          })
      this.options=dataOpts;
                      this.$forceUpdate();


        })
        .catch(function (response) {
            //handle error
            console.log(response);
            this.loading=false;
        });
      //this.loading = true
      })
    }
  }
   
})  
				<v-data-table 
			:headers="headers"
        :items="desserts"
        :options.sync="options"
        :server-items-length="totalDesserts"
        :loading="loading"
     
		sort-by="id"
		class="elevation-1"
    >
      <template v-slot:top>
        <v-toolbar flat color="white">
          <v-toolbar-title>Replies</v-toolbar-title>
          <v-divider
            class="mx-4"
            inset
            vertical
          ></v-divider>
          <div class="flex-grow-1"></div>
          <v-dialog v-model="dialog" max-width="500px">
            <template v-slot:activator="{ on }">
              <v-btn color="primary" dark class="mb-2" v-on="on">ADD REPLY</v-btn>
            </template>
            <v-card>
              <v-card-title>
                <span class="headline">{{ formTitle }}</span>
              </v-card-title>
  
              <v-card-text>
                <v-container>
                  <v-row>
                    <v-col cols="12" sm="6" md="4">
                     
   
                    <v-menu
                      ref="menu1"
                      v-model="menu1"
                      :close-on-content-click="false"
                      transition="scale-transition"
                      offset-y
                      full-width
                      max-width="290px"
                      min-width="290px"
                    >
                      <template v-slot:activator="{ on }">
                        <v-text-field
                          v-model="editedItem.replyDate"
                          label="Date"
                          hint="MM/DD/YYYY format"
                          persistent-hint
                          prepend-icon="event"
                          @blur="date = parseDate(editedItem.replyDate)"
                          v-on="on"
                        ></v-text-field>
                      </template>
                      <v-date-picker v-model="date" no-title @input="menu1 = false"></v-date-picker>
                    </v-menu>
        
                    </v-col>
                    <v-col cols="12" sm="6" md="4">
                      <v-text-field v-model="editedItem.status" label="Status"></v-text-field>
                    </v-col>
                    <v-col cols="12" sm="6" md="4">
                      <v-text-field v-model="editedItem.description" label="Descriprion"></v-text-field>
                    </v-col>
                  
                  </v-row>
                </v-container>
              </v-card-text>
  
              <v-card-actions>
                <div class="flex-grow-1"></div>
                <v-btn color="blue darken-1" text @click="close">Cancel</v-btn>
                <v-btn color="blue darken-1" text @click="save">Save</v-btn>
              </v-card-actions>
            </v-card>
          </v-dialog>
        </v-toolbar>
      </template>
      <template v-slot:item.action="{ item }">
        <v-icon
          small
          class="mr-2"
          @click="editItem(item)"
        >
          edit
        </v-icon>
        <v-icon
          small
          @click="deleteItem(item)"
        >
          delete
        </v-icon>
      </template>
      <template v-slot:no-data>
        <v-btn color="primary" @click="initialize">Reset</v-btn>
      </template>
    </v-data-table>
  

Это было взято из примера сервера vuetify LINK . Все отлично работает, кроме фильтра диапазона дат. Ответ данных также правильный. Данные устанавливаются только в том случае, если функции сортировки и разбивки на страницы, которые можно датировать, работают, когда я пытаюсь нажать один и тот же getDataFromApi() при щелчке фильтра, никаких изменений не происходит и таблица не обновляется. Я попытался изменить массив dessets тогда тоже бесполезно. Options не запускается и отслеживание десертов также не запускается.
, который запускается при обновлении сортировки или нумерации страниц.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...