192 lines
3.6 KiB
JavaScript
192 lines
3.6 KiB
JavaScript
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;
|
|
}
|
|
}
|