corporate-frontend-mithril
Version:
Corporate frontend MithrilJS modules
209 lines (160 loc) • 5.49 kB
JavaScript
const model = require('./advanced-search-form-model');
const formStateLoading = 'formStateLoading';
const formStateDefault = 'formStateDefault';
const formStateResult = 'formStateResult';
const config = require('../advanced-search-form/advanced-search-form-constant');
const service = require('./../service/advance-search-service');
const util = require('./advance-search-util');
module.exports = function() {
let _formState = formStateDefault;
let _resultMsg = '';
let _queryOptions = {};
let _totalMatch = 0;
let _responseSearchResult = {};
let _sortedBy = model.sortBy[0];
// search pagination parameters
let _totalPages = 0;
let _startIndex = config.START_INDEX;
let _currentPage = config.FIRST_PAGE;
let _pageType = config.PAGE_TYPE_ADVANCED_SEARCH;
let _faculty = config.FACULTIES[0];
let vm = {
get pageType() {
return _pageType;
},
set pageType(pageType) {
_pageType = pageType;
},
get faculty() {
return _faculty;
},
set faculty(faculty) {
_faculty = faculty;
service.setFaculty(_faculty);
},
get pageLinks() {
let pages = [];
for (let page = config.FIRST_PAGE; page <= _totalPages; page++) {
pages.push({ title: page});
}
return pages;
},
get currentPage() {
// within the range of first and last page
if (_currentPage >= config.FIRST_PAGE && _currentPage <= _totalPages) {
return _currentPage;
}
// beyond last page, reset to last page
else if (_currentPage > _totalPages) {
return _totalPages;
}
// beyond first page, reset to first page
else {
return config.FIRST_PAGE;
}
},
get lastPage() {
return _totalPages;
},
get profiletype() {
return model.profileTypes;
},
get searchType() {
return model.searchTypes;
},
get sortedBy() {
console.log('_sortedBy', _sortedBy);
return model.sortBy.find(item => item.value == _sortedBy.value).name;
},
get sortByList() {
return model.sortBy;
},
get totalMatch() {
return _totalMatch;
},
get responseSearchResult() {
return _responseSearchResult;
},
get resultMsg() {
return _resultMsg;
},
get formState() {
return _formState;
},
get theme() {
return service.formDropDowns.theme;
},
get keyword() {
return service.formDropDowns.keyword;
},
get clinicalspecialty() {
return service.formDropDowns.clinicalspecialty;
},
get approach() {
return service.formDropDowns.approach;
},
get internationallinkage() {
return service.formDropDowns.internationallinkage;
},
formStateLoading,
formStateDefault,
formStateResult,
};
//------------------- View Handlers ---------------------
vm.generatePageLinks = function() {
return util.pagination(vm.currentPage, vm.lastPage).map(page => {
return m(`a.pagination__item.${vm.active(page)}`, {
innerHTML: page,
style: 'cursor: pointer;',
onclick: () => vm.moveToPage(page),
});
});
};
vm.active = function(title) {
return vm.currentPage == title ? 'pagination__item--active' : '';
};
vm.searchTerms = function({v}) {
_queryOptions.searchTerms = v;
};
vm.selectOptions = function({queryKey, obj}) {
console.log(`selectOptions and key - ${queryKey} -`, obj);
_queryOptions[queryKey] = obj.value;
};
vm.selectSort = function({queryKey, e, obj}) {
// TODO: need to retain the selected value in the dropdown
console.log(`selectSort and key - ${queryKey} -`, obj);
console.log('e', e);
_sortedBy = obj;
// let selected = obj;
_queryOptions[queryKey] = obj.value;
vm.submit();
// reset to the first page
_currentPage = 1;
// obj = selected;
};
vm.selectProfile = function({queryKey, profile, v}) {
console.log(`selectProfile and key - ${queryKey} -`, v);
profile.checked = v;
_queryOptions[queryKey] = v;
};
vm.moveToPage = (page) => {
console.log('moveToPage()', page);
_currentPage = page;
if (page > 0 && page <= _totalPages) {
_startIndex = (page - config.FIRST_PAGE) * config.ITEMS_PER_PAGE;
}
vm.submit(null, _startIndex);
};
vm.visible = (visible) => visible.includes(_pageType);
vm.submit = (e, startIndex = 0) => {
_formState = formStateLoading;
service.totalMatchPerformSearch(_queryOptions, startIndex).then((response) => {
console.log('submit() response', response);
_formState = formStateResult;
_totalMatch = response[0];
_responseSearchResult = response[1];
_totalPages = Math.ceil(_totalMatch / config.ITEMS_PER_PAGE);
});
};
return vm;
};