UNPKG

corporate-frontend-mithril

Version:

Corporate frontend MithrilJS modules

243 lines (207 loc) 7.65 kB
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, };