Initial commit
This commit is contained in:
		
							
								
								
									
										191
									
								
								src/common/stores/base_store.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										191
									
								
								src/common/stores/base_store.js
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,191 @@
 | 
			
		||||
import {
 | 
			
		||||
  action,
 | 
			
		||||
  observable,
 | 
			
		||||
  computed
 | 
			
		||||
} from 'mobx';
 | 
			
		||||
import { queryStringBuilder } from '../util/index';
 | 
			
		||||
 | 
			
		||||
export class BaseStore {
 | 
			
		||||
  
 | 
			
		||||
  url = '';
 | 
			
		||||
  mode = 'multi';
 | 
			
		||||
  
 | 
			
		||||
  @observable data = this.mode === 'multi' ? [] : {};
 | 
			
		||||
  // @observable data =  [] ;
 | 
			
		||||
  @observable selectedId = '';
 | 
			
		||||
  @observable selectedData = {};
 | 
			
		||||
 | 
			
		||||
  @observable isSearching = false;
 | 
			
		||||
  @observable dataFiltered = [];
 | 
			
		||||
  @observable searchResult = [];
 | 
			
		||||
  @observable isLoading = false;
 | 
			
		||||
 | 
			
		||||
  @observable currentPage = 1;
 | 
			
		||||
  @observable maxPage = 1;
 | 
			
		||||
  @observable dataPerPage = 30;
 | 
			
		||||
 | 
			
		||||
  @observable reqQuery = {};
 | 
			
		||||
  constructor(context) {
 | 
			
		||||
    this.context = context;
 | 
			
		||||
    this.http = context.http;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  filterData = (query) => {
 | 
			
		||||
    return this.data.filter((data) => data.id.indexOf(query) > -1 || data.name.toLowerCase().indexOf(query.toLowerCase()) > -1 );
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
  @action
 | 
			
		||||
  search(text){
 | 
			
		||||
    this.dataFiltered = this.filterData(text);
 | 
			
		||||
    console.log("dataFiltered" ,this.filterData(text));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @action 
 | 
			
		||||
  nextPage(reload=false) {
 | 
			
		||||
    if(this.currentPage == this.maxPage){
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    this.currentPage++;
 | 
			
		||||
    if (reload) {
 | 
			
		||||
      return this.getAll(true);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return Promise.resolve(true);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  @action 
 | 
			
		||||
  prevPage(reload=false) {
 | 
			
		||||
    if(this.currentPage == 1){
 | 
			
		||||
      return;
 | 
			
		||||
    }
 | 
			
		||||
    this.currentPage--;
 | 
			
		||||
 | 
			
		||||
    if (reload) {
 | 
			
		||||
      return this.getAll();
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return Promise.resolve(true);
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  @action
 | 
			
		||||
  async getAll(append=false) {
 | 
			
		||||
    this.isLoading = true;
 | 
			
		||||
 | 
			
		||||
    const q = queryStringBuilder(Object.assign({
 | 
			
		||||
      page: this.currentPage,
 | 
			
		||||
      per_page: this.dataPerPage,
 | 
			
		||||
    },this.reqQuery));
 | 
			
		||||
 | 
			
		||||
    const res = await this.http.get(`${this.url}?${q}`) 
 | 
			
		||||
      .catch(err => {
 | 
			
		||||
        this.isLoading = false;
 | 
			
		||||
        throw err;
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
    this.maxPage = Math.ceil(res.max/this.dataPerPage);
 | 
			
		||||
 | 
			
		||||
    if (!append) {
 | 
			
		||||
      if(!res.data){
 | 
			
		||||
        this.data = res;
 | 
			
		||||
      }
 | 
			
		||||
      else{
 | 
			
		||||
        this.data = res.data;
 | 
			
		||||
      }
 | 
			
		||||
    } else {
 | 
			
		||||
      if(!res.data){
 | 
			
		||||
        this.data.replace(this.data.concat(res));
 | 
			
		||||
      }
 | 
			
		||||
      else{
 | 
			
		||||
        this.data.replace(this.data.concat(res.data));
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    this.selectedData = {};
 | 
			
		||||
    this.selectedId = '';
 | 
			
		||||
 | 
			
		||||
    this.isLoading = false;
 | 
			
		||||
    return res;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @action
 | 
			
		||||
  async getDetail(id) {
 | 
			
		||||
    this.isLoading = true;
 | 
			
		||||
    const res = await this.http.get(`${this.url}/${id}`)
 | 
			
		||||
      .catch(err => {
 | 
			
		||||
        this.isLoading = false;
 | 
			
		||||
        throw err;
 | 
			
		||||
      });
 | 
			
		||||
 | 
			
		||||
    this.isLoading = false;
 | 
			
		||||
    this.setSelectedData(res);
 | 
			
		||||
    return res;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @action
 | 
			
		||||
  setSelectedData(data) {
 | 
			
		||||
    this.selectedData = data;
 | 
			
		||||
    this.selectedId = data.id;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @action
 | 
			
		||||
  create(data) {
 | 
			
		||||
    this.isLoading = true;
 | 
			
		||||
    return this.http.post(this.url, data)
 | 
			
		||||
      .then(res => {
 | 
			
		||||
        this.isLoading = false;
 | 
			
		||||
        this.getAll();
 | 
			
		||||
        return res;
 | 
			
		||||
      })
 | 
			
		||||
      .catch(err => {
 | 
			
		||||
        this.isLoading = false;
 | 
			
		||||
        throw err;
 | 
			
		||||
      })
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @action
 | 
			
		||||
  update(id, data) {
 | 
			
		||||
    this.isLoading = true;
 | 
			
		||||
    return this.http.put(this.url + "/" + id, data)
 | 
			
		||||
      .then(res => {
 | 
			
		||||
        this.isLoading = false;
 | 
			
		||||
        this.getAll();
 | 
			
		||||
        return res;
 | 
			
		||||
      })
 | 
			
		||||
      .catch(err => {
 | 
			
		||||
        this.isLoading = false;
 | 
			
		||||
        throw err;
 | 
			
		||||
      })
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @action
 | 
			
		||||
  delete(id) {
 | 
			
		||||
    this.isLoading = true;
 | 
			
		||||
    return this.http.delete(this.url + "/" + id)
 | 
			
		||||
      .then(res => {
 | 
			
		||||
        this.isLoading = false;
 | 
			
		||||
        return res;
 | 
			
		||||
      })
 | 
			
		||||
      .catch(err => {
 | 
			
		||||
        this.isLoading = false;
 | 
			
		||||
        throw err;
 | 
			
		||||
      });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @action
 | 
			
		||||
  setRequestQuery(q){
 | 
			
		||||
    //q is an object
 | 
			
		||||
    this.reqQuery = q;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @action
 | 
			
		||||
  reset(num=false){
 | 
			
		||||
    this.currentPage = 1;
 | 
			
		||||
    this.reqQuery = {};
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  @computed
 | 
			
		||||
  get isEmpty(){
 | 
			
		||||
    return this.data.length === 0;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user