corporate-frontend-mithril
Version:
Corporate frontend MithrilJS modules
243 lines (207 loc) • 7.65 kB
JavaScript
const _ = require('lodash');
const config = require('../advanced-search-form/advanced-search-form-constant');
const optionTransformFn = ({id, name}) => {
return { name, value: id};
};
let _faculty = config.FACULTIES[0];
let formDropDowns = {
theme: {
label: 'Theme',
// getThemeOptions only works with domainId to show the same values
api: `${config.WS_BASE_URL}/getThemeOptions/${_faculty.domainId}`,
options: null,
optionTransformFn: optionTransformFn,
queryKey: '+themeId',
visible: [config.PAGE_TYPE_ADVANCED_SEARCH],
},
keyword : {
label: 'Keyword',
api: `${config.WS_BASE_URL}/getKeywordOptions/${_faculty.orgUnitCode}`,
options: null,
optionTransformFn: optionTransformFn,
queryKey: '+keywordId',
visible: [config.PAGE_TYPE_ADVANCED_SEARCH],
},
clinicalspecialty : {
label: 'Clinical Specialty',
// getNewKeywordsByGroup only works with domainId
api: `${config.WS_BASE_URL}/getNewKeywordsByGroup/${_faculty.domainId}`,
options: null,
optionTransformFn: optionTransformFn,
queryKey: '+clinicalSpecialtyId',
visible: [config.PAGE_TYPE_ADVANCED_SEARCH],
},
approach : {
label: 'Approach',
api: `${config.WS_BASE_URL}/getApproachOptions/${_faculty.orgUnitCode}`,
options: null,
optionTransformFn: optionTransformFn,
queryKey: '+approachId',
visible: [config.PAGE_TYPE_ADVANCED_SEARCH],
},
internationallinkage: {
label: 'International linkage',
api: `${config.WS_BASE_URL}/getCountryOptions/${_faculty.orgUnitCode}`,
options: null,
optionTransformFn: optionTransformFn,
queryKey: '+countryId',
visible: [config.PAGE_TYPE_ADVANCED_SEARCH],
},
};
Promise.all(_.map(formDropDowns, (dropdown) => {
return new Promise((resolved) => {
m.request({
method: 'GET',
url: dropdown.api,
headers: {
'Content-Type': 'application/json',
},
}).then(response => {
dropdown.options = _.map(response, dropdown.optionTransformFn);
dropdown.options.splice(0, 0, {name: 'Select', value: config.SELECTOR_IGNORE_INDEX});
resolved();
});
});
})).then(m.redraw).catch((error) =>{
console.error('APO fail to fetch dropdown options from web service: ', error);
});
const setFaculty = (faculty) => _faculty = faculty;
const totalMatchPerformSearch = (queryOptions, startIndex = config.START_INDEX, range = config.ITEMS_PER_PAGE, isReverse = 'false') => {
console.log('totalMatchPerformSearch()', queryOptions);
console.log('_faculty', _faculty);
console.log('_faculty.domainId', _faculty.domainId);
console.log('_faculty.orgUnitCode', _faculty.orgUnitCode);
let queryString = createQueryString(_faculty.orgUnitCode, queryOptions);
let sort = getSortBy(queryOptions);
return Promise.all([
totalMatch(queryString),
doSearch(queryString, startIndex, range, sort, isReverse)]
);
};
const totalMatch = (queryString) => {
return new Promise((resolve) => {
m.request({
method: 'GET',
url: `${config.WS_BASE_URL}/${config.WS_SEARCH_RESULT_SIZE_METHOD}/${queryString}`,
headers: {
'Content-Type': 'application/json',
},
}).then(response => {
resolve(response);
}).catch(error => {
console.error('APO fail to fetch from web service: ', error);
});
});
};
const doSearch = (queryString, startIndex, range, sort, isReverse) => {
return new Promise((resolve) => {
console.log('doSearch() queryString', queryString);
console.log('sort', sort);
console.log('startIndex', startIndex);
console.log('range', range);
console.log('isReverse', isReverse);
console.log('queryString', queryString);
m.request({
method: 'GET',
url: `${config.WS_BASE_URL}/${config.WS_SEARCH_METHOD}/${queryString}/${startIndex}/${range}/${sort}/${isReverse}`,
headers: {
'Content-Type': 'application/json',
},
}).then(response => {
resolve(response);
}).catch(error => {
console.error('APO fail to fetch from web service: ', error);
});
});
};
const getSortBy = (queryOptions) => {
return _.pick(queryOptions, 'sortBy').sortBy || 'byRelevance';
};
const createQueryString = (orgUnitCode, queryOptions) => {
let options = [];
let jobType = getJobType(queryOptions);
let searchTerms = getSearchTerms(queryOptions);
let dropdownOption = getDropdownOption(queryOptions);
console.log('jobType', jobType);
console.log('searchTerms', searchTerms);
console.log('dropdownOption', dropdownOption);
if (jobType && jobType.length > 0) {
options.push(jobType);
}
if (dropdownOption && dropdownOption.length > 0) {
options.push(dropdownOption);
}
if (searchTerms && searchTerms.length > 0) {
options.push(searchTerms);
}
console.log('options', options.flat());
return `+orgUnitCode:${orgUnitCode} ${options.flat().join(' ')}`;
};
const getJobType = (queryOptions) => {
let options = [];
if (_.pick(queryOptions, 'Academic').Academic) {
options.push('+jobType:1');
}
if (_.pick(queryOptions, 'HDR').HDR) {
options.push('+jobType:2');
}
// always set 'Academic' as default even if user not select it
// if (options.length == 0) {
// options.push('+jobType:1');
// }
console.log('getJobType options', options);
return options;
};
const getSearchOption = (queryOptions) => {
return _.pick(queryOptions, 'searchType').searchType || '1';
};
const getSearchTerms = (queryOptions) => {
let searchTerms = _.pick(queryOptions, 'searchTerms').searchTerms;
let options = [];
if (searchTerms) {
let searchOption = getSearchOption(queryOptions);
console.log('searchOption', searchOption);
let searchFields = config.SEARCH_FIELDS;
let keywords = searchTerms.split(' ');
// at least one word - OR
if (searchOption == '1') {
keywords.forEach(word => {
searchFields.forEach(searchField => {
options.push(`${searchField}:${word}`);
});
});
}
// all the words - AND
else if (searchOption == '2') {
let flattenKeyword = keywords.map(keyword => `+${keyword}`).join(' ');
searchFields.forEach(searchField => {
options.push(`${searchField}:(${flattenKeyword})`);
});
}
// exact phrase
else {
searchFields.forEach(searchField => {
options.push(`${searchField}:'${searchTerms}'`);
});
}
return `+(${options.join(' ')})`;
}
else {
return null;
}
};
const getDropdownOption = (queryOptions) => {
let options = [];
Object.keys(queryOptions).forEach(key => {
// dropdown keys will have + in the key name and we ignore the default 'Select' option with -1 value
if (key.indexOf('+') >= 0 && queryOptions[key] != config.SELECTOR_IGNORE_INDEX) {
options.push(`${key}:${queryOptions[key]}`);
}
});
return options;
};
module.exports = {
formDropDowns,
totalMatchPerformSearch,
setFaculty,
};