sr-npm 3.1.10 → 3.1.12

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,4 +1,5 @@
1
1
  const CAREERS_MULTI_BOXES_PAGE_CONSTS={
2
+ JOBS_DATASET: '#jobsDataset',
2
3
  FILTER_REPEATER: '#filterReapter',
3
4
  JOBS_REPEATER: '#jobsReapter',
4
5
  JOBS_REPEATER_ITEM_TITLE: '#jobTitle',
@@ -68,10 +69,16 @@ const possibleUrlParams=[
68
69
  "storename",
69
70
  ]
70
71
 
72
+
73
+ const LINK_JOBS_TITLE = "link-jobs-title";
74
+ const LINK_JOBS_REF_ID_SLUG = "link-jobs-refId-slug";
75
+
71
76
  module.exports = {
72
77
  CAREERS_MULTI_BOXES_PAGE_CONSTS,
73
78
  FiltersIds,
74
79
  fieldTitlesInCMS,
75
80
  CATEGORY_CUSTOM_FIELD_ID_IN_CMS,
76
81
  possibleUrlParams,
82
+ LINK_JOBS_TITLE,
83
+ LINK_JOBS_REF_ID_SLUG,
77
84
  }
package/backend/utils.js CHANGED
@@ -61,7 +61,8 @@ function normalizeString(str) {
61
61
  return str
62
62
  .normalize('NFD')
63
63
  .replace(/\p{Diacritic}/gu, '')
64
- .replace(/[^A-Za-z0-9-]/g, '')
64
+ .replace(/-/g, '') // remove all hyphens
65
+ .replace(/[^A-Za-z0-9]/g, '') // allow only alphanumerics (no hyphens now)
65
66
  .trim();
66
67
  }
67
68
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sr-npm",
3
- "version": "3.1.10",
3
+ "version": "3.1.12",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {
@@ -6,18 +6,17 @@ async function boardPeoplePageOnReady(_$w,) {
6
6
  }
7
7
 
8
8
  async function bindBoardPeopleRepeaters(_$w) {
9
-
10
9
  _$w('#directorsRepeaterItem').onClick((event) => {
11
10
  const $item = _$w.at(event.context);
12
11
  const clickedItemData = $item('#dynamicDataset').getCurrentItem();
13
- location.to(`/${clickedItemData['link-board-people-title_fld']}`);
12
+ location.to(`${clickedItemData['link-board-people-title_fld']}`);
14
13
 
15
14
  });
16
15
 
17
16
  _$w('#executivesRepeaterItem').onClick((event) => {
18
17
  const $item = _$w.at(event.context);
19
18
  const clickedItemData = $item('#dataset1').getCurrentItem();
20
- location.to(`/${clickedItemData['link-board-people-title_fld']}`);
19
+ location.to(`${clickedItemData['link-board-people-title_fld']}`);
21
20
 
22
21
  });
23
22
  }
@@ -5,7 +5,18 @@ const { window } = require('@wix/site-window');
5
5
  const { queryParams,onChange} = require('wix-location-frontend');
6
6
  const { location } = require("@wix/site-location");
7
7
  const {CAREERS_MULTI_BOXES_PAGE_CONSTS,FiltersIds,fieldTitlesInCMS,possibleUrlParams} = require('../backend/careersMultiBoxesPageIds');
8
- const { groupValuesByField, debounce, getAllRecords, getFieldById, getFieldByTitle,getCorrectOption,getOptionIndexFromCheckBox,loadPrimarySearchRepeater,bindPrimarySearch,primarySearch } = require('./pagesUtils');
8
+ const { groupValuesByField,
9
+ debounce,
10
+ getAllRecords,
11
+ getFieldById,
12
+ getFieldByTitle,
13
+ getCorrectOption,
14
+ getOptionIndexFromCheckBox,
15
+ loadPrimarySearchRepeater,
16
+ bindPrimarySearch,
17
+ primarySearch,
18
+ getAllDatasetItems
19
+ } = require('./pagesUtils');
9
20
 
10
21
 
11
22
  let dontUpdateThisCheckBox;
@@ -132,10 +143,13 @@ async function handleUrlParams(_$w,urlParams,handleBackAndForth=false) {
132
143
  let currentApplyFilterFlag=false;
133
144
  //apply this first to determine all jobs
134
145
  if(urlParams.keyword) {
135
- applyFiltering=await primarySearch(_$w, decodeURIComponent(urlParams.keyword), alljobs);
136
- _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value=decodeURIComponent(urlParams.keyword);
137
- currentJobs=_$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.JOB_RESULTS_REPEATER).data;
138
- keywordAllJobs=_$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.JOB_RESULTS_REPEATER).data;
146
+ applyFiltering = await primarySearch(_$w, decodeURIComponent(urlParams.keyword));
147
+ _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value = decodeURIComponent(urlParams.keyword);
148
+
149
+ const items = await getAllDatasetItems(_$w, CAREERS_MULTI_BOXES_PAGE_CONSTS.JOBS_DATASET);
150
+
151
+ currentJobs = items;
152
+ keywordAllJobs = items;
139
153
  }
140
154
 
141
155
  for (const url of possibleUrlParams)
@@ -149,10 +163,11 @@ async function handleUrlParams(_$w,urlParams,handleBackAndForth=false) {
149
163
  }
150
164
  currentApplyFilterFlag=false;
151
165
  }
152
- if(applyFiltering || keywordAllJobs || handleBackAndForth) {
153
- await updateJobsAndNumbersAndFilters(_$w);
154
-
155
- }
166
+
167
+ if(applyFiltering || keywordAllJobs || handleBackAndForth) {
168
+ await updateJobsAndNumbersAndFilters(_$w);
169
+
170
+ }
156
171
 
157
172
  if(urlParams.page) {
158
173
  if(Number.isNaN(Number(urlParams.page)) || Number(urlParams.page)<=1 || Number(urlParams.page)>Math.ceil(currentJobs.length/pagination.pageSize)) {
@@ -297,7 +312,7 @@ async function loadJobsRepeater(_$w) {
297
312
  _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.JOBS_REPEATER).onItemReady(($item, itemData) => {
298
313
  $item(CAREERS_MULTI_BOXES_PAGE_CONSTS.JOBS_REPEATER_ITEM_TITLE).text = itemData.title;
299
314
  $item(CAREERS_MULTI_BOXES_PAGE_CONSTS.JOBS_REPEATER_ITEM_TITLE).onClick(() => {
300
- location.to(itemData["link-jobs-title"] || itemData["link-jobs-refId-slug"]);
315
+ location.to(itemData[CAREERS_MULTI_BOXES_PAGE_CONSTS.LINK_JOBS_TITLE] || itemData[CAREERS_MULTI_BOXES_PAGE_CONSTS.LINK_JOBS_REF_ID_SLUG]);
301
316
  });
302
317
  $item(CAREERS_MULTI_BOXES_PAGE_CONSTS.JOBS_REPEATER_ITEM_LOCATION).text=itemData.location.fullLocation
303
318
  $item(CAREERS_MULTI_BOXES_PAGE_CONSTS.JOBS_REPEATER_ITEM_EMPLOYMENT_TYPE).text=itemData.employmentType
@@ -461,8 +476,7 @@ function getValueFromValueId(valueIds, value) {
461
476
  }
462
477
  }
463
478
 
464
- async function applyJobFilters(_$w,clearAll=false) {
465
- // if(!clearAll) {
479
+ async function applyJobFilters(_$w) {
466
480
  let tempFilteredJobs=[];
467
481
  let finalFilteredJobs=[];
468
482
  secondarySearchIsFilled? finalFilteredJobs=allsecondarySearchJobs:finalFilteredJobs=alljobs;
@@ -484,7 +498,7 @@ function getValueFromValueId(valueIds, value) {
484
498
  }
485
499
  else{
486
500
  //if it is not location then we check if selecred values (which is an array) have one of the job values (whcih is also an array)
487
- if(job[JOBS_COLLECTION_FIELDS.MULTI_REF_JOBS_CUSTOM_VALUES].some(value=>values.includes(value._id))) {
501
+ if(job[JOBS_COLLECTION_FIELDS.MULTI_REF_JOBS_CUSTOM_VALUES].some(value=>values.includes(value.valueId))) {
488
502
  if(!addedJobsIds.has(job._id)) {
489
503
  tempFilteredJobs.push(job);
490
504
  addedJobsIds.add(job._id);
@@ -514,8 +528,7 @@ function getValueFromValueId(valueIds, value) {
514
528
  }
515
529
  pagination.currentPage=1;
516
530
  handlePaginationButtons(_$w);
517
- }
518
- // }
531
+ }
519
532
 
520
533
  function handlePaginationButtons(_$w)
521
534
  {
@@ -622,16 +635,15 @@ async function secondarySearch(_$w,query) {
622
635
  await refreshFacetCounts(_$w);
623
636
  return allsecondarySearchJobs;
624
637
  }
625
- function bindSearchInput(_$w) {
638
+ function bindSearchInput(_$w) {
626
639
  try {
627
- bindPrimarySearch(_$w,allvaluesobjects,alljobs);
640
+ bindPrimarySearch(_$w, allvaluesobjects);
628
641
 
629
- const secondarySearchDebounced = debounce(async () => {
642
+ const secondarySearchDebounced = debounce(async () => {
630
643
  const query = (_$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.SECONDARY_SEARCH_INPUT).value || '').toLowerCase().trim();
631
644
  await secondarySearch(_$w, query);
632
645
  }, 150);
633
646
 
634
-
635
647
  _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.SECONDARY_SEARCH_INPUT).onInput(secondarySearchDebounced);
636
648
 
637
649
  } catch (error) {
package/pages/homePage.js CHANGED
@@ -1,28 +1,23 @@
1
- const {
2
- debounce,
3
- getFilter,
4
- } = require('../public/filterUtils');
5
- const { handleOnLocationClick } = require('../public/mapUtils');
6
- const { filterBrokenMarkers } = require('../public/utils');
1
+ const { debounce, getFilter } = require('../public/filterUtils');
2
+ const { handleOnLocationClick } = require('../public/mapUtils');
3
+ const { filterBrokenMarkers } = require('../public/utils');
7
4
  const { location } = require('@wix/site-location');
8
5
  const {wixData} = require('wix-data');
9
6
  const { COLLECTIONS } = require('../backend/collectionConsts');
10
- const { bindPrimarySearch,getAllRecords,loadPrimarySearchRepeater } = require('./pagesUtils');
11
-
7
+ const { bindPrimarySearch, getAllRecords, loadPrimarySearchRepeater } = require('./pagesUtils');
12
8
 
13
9
  let thisObjectVar;
14
10
  let searchByCityFlag=false;
15
11
  let loadedCategories=false;
16
12
 
17
- async function homePageOnReady(_$w,thisObject=null) {
13
+ async function homePageOnReady(_$w,thisObject = null) {
18
14
  const queryResult = await wixData.query(COLLECTIONS.SITE_CONFIGS).find();
19
15
  const siteconfig = queryResult.items[0];
20
16
 
21
- if(siteconfig.twg) {
22
- const allJobs = await getAllRecords(COLLECTIONS.JOBS);
23
- const allvaluesobjects = await getAllRecords(COLLECTIONS.CUSTOM_VALUES);
24
17
 
25
- bindPrimarySearch(_$w, allvaluesobjects, allJobs);
18
+ if(siteconfig.twg) {
19
+ const allvaluesobjects = await getAllRecords(COLLECTIONS.CUSTOM_VALUES);
20
+ bindPrimarySearch(_$w, allvaluesobjects);
26
21
  loadPrimarySearchRepeater(_$w)
27
22
  console.log("siteconfig.twg: ",siteconfig.twg);
28
23
 
@@ -32,17 +27,16 @@ async function homePageOnReady(_$w,thisObject=null) {
32
27
  }
33
28
  }
34
29
  else{
35
- thisObjectVar=thisObject;
30
+ thisObjectVar = thisObject;
36
31
  bind(_$w);
37
32
  init(_$w);
38
33
  }
39
- }
34
+
35
+ }
40
36
 
41
37
  function bind(_$w) {
42
-
43
38
  bindTeamRepeater(_$w);
44
39
 
45
-
46
40
  _$w('#citiesDataset').onReady(async () => {
47
41
  const numOfItems = await _$w('#citiesDataset').getTotalCount();
48
42
  const items = await _$w('#citiesDataset').getItems(0, numOfItems);
@@ -56,8 +50,8 @@ function bind(_$w) {
56
50
  latitude: location.latitude,
57
51
  longitude: location.longitude
58
52
  },
59
- address: item.locationAddress.formatted,
60
- title: item.title,
53
+ address: item.locationAddress.formatted,
54
+ title: item.title,
61
55
  link: cityLinkUrl,
62
56
  linkTitle:`View ${item.count} Open Positions`
63
57
  };
@@ -106,7 +100,6 @@ function bindTeamRepeater(_$w) {
106
100
  }
107
101
 
108
102
  function bindViewAllButton(_$w) {
109
-
110
103
  _$w('#viewAllCategoriesButton').onClick(()=>{
111
104
  if(!loadedCategories) {
112
105
  loadedCategories=true;
@@ -125,11 +118,11 @@ function bindViewAllButton(_$w) {
125
118
 
126
119
 
127
120
  function init(_$w) {
128
- const debouncedInput = debounce(()=>handleSearchInput(_$w), 400,thisObjectVar);
121
+ const debouncedInput = debounce(() => handleSearchInput(_$w), 400, thisObjectVar);
129
122
 
130
123
  _$w('#searchInput').onInput(debouncedInput);
131
124
  _$w('#searchInput').maxLength = 40;
132
- _$w('#searchButton').onClick(()=>handleSearch(_$w('#searchInput').value));
125
+ _$w('#searchButton').onClick(() => handleSearch(_$w('#searchInput').value));
133
126
 
134
127
  _$w('#searchInput').onKeyPress((event) => {
135
128
  if (event.key === 'Enter') {
@@ -174,17 +167,17 @@ async function handleSearchInput(_$w) {
174
167
  count = _$w('#jobsDataset').getTotalCount();
175
168
 
176
169
  if (count > 0) {
177
- searchByCityFlag=false;
170
+ searchByCityFlag = false;
178
171
  _$w('#resultsContainer').expand();
179
172
  _$w('#searchMultiStateBox').changeState('results');
180
173
  } else {
181
- filter=await getFilter(searchByCity);
174
+ filter = await getFilter(searchByCity);
182
175
  await _$w('#jobsDataset').setFilter(filter);
183
176
  await _$w('#jobsDataset').refresh();
184
177
  count = _$w('#jobsDataset').getTotalCount();
185
- if(count > 0)
178
+ if( count > 0 )
186
179
  {
187
- searchByCityFlag=true;
180
+ searchByCityFlag = true;
188
181
  _$w('#resultsContainer').expand();
189
182
  _$w('#searchMultiStateBox').changeState('results');
190
183
  }
@@ -3,6 +3,7 @@ const { JOBS_COLLECTION_FIELDS,COLLECTIONS } = require('../backend/collectionCon
3
3
  const { CAREERS_MULTI_BOXES_PAGE_CONSTS,CATEGORY_CUSTOM_FIELD_ID_IN_CMS } = require('../backend/careersMultiBoxesPageIds');
4
4
  const { location } = require("@wix/site-location");
5
5
  const { normalizeString } = require('../backend/utils');
6
+ const { getFilter } = require('../public/filterUtils');
6
7
 
7
8
  function groupValuesByField(values, refKey) {
8
9
  const map = new Map();
@@ -15,71 +16,86 @@ function groupValuesByField(values, refKey) {
15
16
  });
16
17
  }
17
18
  return map;
18
- }
19
+ }
19
20
 
20
- const debounce = (fn, ms = 150) => {
21
- let t;
22
- return (...args) => {
23
- clearTimeout(t);
24
- t = setTimeout(() => fn(...args), ms);
25
- };
21
+ const debounce = (fn, ms = 150) => {
22
+ let t;
23
+ return (...args) => {
24
+ clearTimeout(t);
25
+ t = setTimeout(() => fn(...args), ms);
26
26
  };
27
+ };
27
28
 
28
- async function getAllRecords(collectionId) {
29
- const q = wixData.query(collectionId).include(JOBS_COLLECTION_FIELDS.MULTI_REF_JOBS_CUSTOM_VALUES)
30
-
31
-
32
- const items = [];
33
- let res = await q.limit(1000).find();
34
- items.push(...res.items);
35
-
36
- while (res.hasNext()) {
37
- res = await res.next();
38
- items.push(...res.items);
39
- }
40
- return items;
29
+ async function getAllDatasetItems(_$w, datasetSelector) {
30
+ await _$w(datasetSelector).onReadyAsync();
31
+
32
+ let items = [];
33
+ let data = await _$w(datasetSelector).getItems(0, 1000);
34
+ items.push(...data.items);
35
+
36
+ while (_$w(datasetSelector).hasNextPage()) {
37
+ const nextItems = await _$w(datasetSelector).nextPage();
38
+ items.push(...nextItems);
41
39
  }
42
40
 
43
- async function getAllRecordsWithoutMultiRef(collectionId) {
44
- const q = wixData.query(collectionId)
45
-
46
-
47
- const items = [];
48
- let res = await q.limit(1000).find();
41
+ return items;
42
+ }
43
+
44
+ async function getAllRecords(collectionId) {
45
+ const q = wixData.query(collectionId).include(JOBS_COLLECTION_FIELDS.MULTI_REF_JOBS_CUSTOM_VALUES)
46
+
47
+
48
+ const items = [];
49
+ let res = await q.limit(1000).find();
50
+ items.push(...res.items);
51
+
52
+ while (res.hasNext()) {
53
+ res = await res.next();
49
54
  items.push(...res.items);
50
-
51
- while (res.hasNext()) {
52
- res = await res.next();
53
- items.push(...res.items);
54
- }
55
- return items;
56
55
  }
56
+ return items;
57
+ }
57
58
 
58
- function getFieldById(fieldId,allFields) {
59
- return allFields.find(field=>field._id===fieldId);
60
- }
59
+ async function getAllRecordsWithoutMultiRef(collectionId) {
60
+ const q = wixData.query(collectionId)
61
+
62
+
63
+ const items = [];
64
+ let res = await q.limit(1000).find();
65
+ items.push(...res.items);
61
66
 
62
- function getFieldByTitle(title,allFields) {
63
- return allFields.find(field=>field.title===title);
67
+ while (res.hasNext()) {
68
+ res = await res.next();
69
+ items.push(...res.items);
64
70
  }
71
+ return items;
72
+ }
65
73
 
66
- function getCorrectOption(value,options,param) {
67
- const standardizedValue = normalizeString(value.toLowerCase())
68
- if(param==="employmenttype") //employmenttype have a problematic value
69
- {
70
- return options.find(option=>normalizeString(option.value.toLowerCase())===standardizedValue);
71
- }
72
- return options.find(option=>normalizeString(option.label.toLowerCase())===standardizedValue);
74
+ function getFieldById(fieldId,allFields) {
75
+ return allFields.find(field=>field._id===fieldId);
76
+ }
77
+
78
+ function getFieldByTitle(title,allFields) {
79
+ return allFields.find(field=>field.title===title);
80
+ }
81
+
82
+ function getCorrectOption(value,options,param) {
83
+ const standardizedValue = normalizeString(value.toLowerCase())
84
+ if(param==="employmenttype") //employmenttype have a problematic value
85
+ {
86
+ return options.find(option=>normalizeString(option.value.toLowerCase())===standardizedValue);
73
87
  }
88
+ return options.find(option=>normalizeString(option.label.toLowerCase())===standardizedValue);
89
+ }
74
90
 
75
- function getOptionIndexFromCheckBox(options,value) {
76
- const normalizedValue=normalizeString(value.toLowerCase());
77
- for(let index=0;index<options.length;index++) {
78
- if(normalizeString(options[index].value.toLowerCase())===normalizedValue) {
79
- return index;
80
- }
91
+ function getOptionIndexFromCheckBox(options,value) {
92
+ const normalizedValue=normalizeString(value.toLowerCase());
93
+ for(let index=0;index<options.length;index++) {
94
+ if(normalizeString(options[index].value.toLowerCase())===normalizedValue) {
95
+ return index;
81
96
  }
82
97
  }
98
+ }
83
99
 
84
100
  function loadPrimarySearchRepeater(_$w) {
85
101
 
@@ -93,159 +109,168 @@ function loadPrimarySearchRepeater(_$w) {
93
109
  (item) => item._id === event.context.itemId,
94
110
 
95
111
  );
96
- // 'link-jobs-title' or 'link-copy-of-jobs-title'
97
- const linkKey = Object.keys(clickedItemData).find(
98
- key => key.startsWith('link') && key.includes('jobs') && key.includes('title')
99
- );
100
- if (linkKey && clickedItemData[linkKey] ) {
101
- if(clickedItemData[linkKey].includes("copy-of-jobs")) {
102
- clickedItemData[linkKey]=clickedItemData[linkKey].replace("copy-of-jobs","jobs")
103
- }
104
- location.to(clickedItemData[linkKey]);
112
+ if(!clickedItemData[CAREERS_MULTI_BOXES_PAGE_CONSTS.LINK_JOBS_TITLE] && !clickedItemData[CAREERS_MULTI_BOXES_PAGE_CONSTS.LINK_JOBS_REF_ID_SLUG]) {
113
+ console.error("clickedItemData does not have link-jobs-title or link-jobs-refId-slug");
114
+ return;
105
115
  }
106
116
 
107
- });
108
- _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.CATEGORY_RESULTS_REPEATER).onItemReady(async ($item, itemData) => {
109
- $item(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_CATEGORY_BUTTON).label = itemData.title || '';
110
- });
117
+ location.to(clickedItemData[CAREERS_MULTI_BOXES_PAGE_CONSTS.LINK_JOBS_TITLE]||clickedItemData[CAREERS_MULTI_BOXES_PAGE_CONSTS.LINK_JOBS_REF_ID_SLUG]);
118
+
111
119
 
112
- _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.CATEGORY_RESULTS_REPEATER_ITEM).onClick(async (event) => {
113
- const data = _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.CATEGORY_RESULTS_REPEATER).data;
114
- const clickedItemData = data.find(
115
- (item) => item._id === event.context.itemId,
116
- );
117
- const baseUrl = await location.baseUrl();
118
- const encodedCategory=encodeURIComponent(clickedItemData._id);
119
- location.to(`${baseUrl}/search?category=${encodedCategory}`);
120
- });
120
+ });
121
+ _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.CATEGORY_RESULTS_REPEATER).onItemReady(async ($item, itemData) => {
122
+ $item(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_CATEGORY_BUTTON).label = itemData.title || '';
123
+ });
124
+
125
+ _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.CATEGORY_RESULTS_REPEATER_ITEM).onClick(async (event) => {
126
+ const data = _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.CATEGORY_RESULTS_REPEATER).data;
127
+ const clickedItemData = data.find(
128
+ (item) => item._id === event.context.itemId,
129
+ );
130
+ const baseUrl = await location.baseUrl();
131
+ const encodedCategory=encodeURIComponent(clickedItemData._id);
132
+ location.to(`${baseUrl}/search?category=${encodedCategory}`);
133
+ });
121
134
 
122
135
  }
123
136
 
124
- function bindPrimarySearch(_$w, allvaluesobjects, alljobs) {
137
+ function bindPrimarySearch(_$w, allvaluesobjects) {
125
138
 
126
- const primarySearchDebounced = debounce(async () => {
127
- const query = (_$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value || '').toLowerCase().trim();
128
- await primarySearch(_$w, query, alljobs);
129
- }, 300);
139
+ const handleSearchInput = async () => {
140
+ const query = _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value?.toLowerCase().trim() || '';
141
+ await primarySearch(_$w, query);
142
+ }
130
143
 
131
- _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).onInput(async () => {
132
- await primarySearchDebounced();
133
- });
144
+ const primarySearchDebounced = debounce(() => handleSearchInput(), 400);
134
145
 
135
- _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).onClick(async () => {
136
- _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.RESULTS_CONTAINER).expand();
146
+ _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).onInput(async () => {
147
+ await primarySearchDebounced();
148
+ });
137
149
 
138
- if(_$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value.trim()!=='') {
139
- await primarySearch(_$w, _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value.trim(), alljobs);
140
- }
141
- else {
142
- await loadCategoriesListPrimarySearch(_$w, allvaluesobjects);
143
- }
144
- });
145
-
146
- _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.RESULTS_CONTAINER).onMouseOut(async () => {
147
- _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.RESULTS_CONTAINER).collapse();
148
- });
150
+ _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).onClick(async () => {
151
+ _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.RESULTS_CONTAINER).expand();
149
152
 
150
- _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).onKeyPress(async (event) => {
151
- if( event.key==='Enter') {
152
- console.log("primary search input key pressed");
153
- console.log("_$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value: ",_$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value);
154
-
155
- if(_$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value.trim()==='') {
156
- // _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.RESULTS_CONTAINER).collapse();
157
- const baseUrl = await location.baseUrl();
158
- location.to(`${baseUrl}/search`);
159
-
160
- }
161
- else {
162
- let encodedKeyWord=encodeURIComponent(_$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value);
163
- const baseUrl = await location.baseUrl();
164
- location.to(`${baseUrl}/search?keyword=${encodedKeyWord}`);
165
- }
166
- }
167
- });
153
+ if(_$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value.trim()!=='') {
154
+ const query = _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value?.toLowerCase().trim() || '';
155
+ await primarySearch(_$w, query);
156
+ }
157
+ else {
158
+ await loadCategoriesListPrimarySearch(_$w,allvaluesobjects);
159
+ }
160
+ });
168
161
 
169
- _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_BUTTON).onClick(async () => {
170
- console.log("primary search button clicked");
171
- console.log("_$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value: ",_$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value);
162
+ _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.RESULTS_CONTAINER).onMouseOut(async () => {
163
+ _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.RESULTS_CONTAINER).collapse();
164
+ });
172
165
 
166
+ _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).onKeyPress(async (event) => {
167
+ if( event.key === 'Enter') {
173
168
  if(_$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value.trim()==='') {
169
+ // _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.RESULTS_CONTAINER).collapse();
174
170
  const baseUrl = await location.baseUrl();
175
171
  location.to(`${baseUrl}/search`);
176
- }
172
+
173
+ }
177
174
  else {
178
175
  let encodedKeyWord=encodeURIComponent(_$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value);
179
176
  const baseUrl = await location.baseUrl();
180
177
  location.to(`${baseUrl}/search?keyword=${encodedKeyWord}`);
181
178
  }
182
- });
179
+ }
180
+ });
181
+
182
+ _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_BUTTON).onClick(async () => {
183
+ if(_$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value.trim()==='') {
184
+ const baseUrl = await location.baseUrl();
185
+ location.to(`${baseUrl}/search`);
186
+ }
187
+ else {
188
+ let encodedKeyWord=encodeURIComponent(_$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_INPUT).value);
189
+ const baseUrl = await location.baseUrl();
190
+ location.to(`${baseUrl}/search?keyword=${encodedKeyWord}`);
191
+ }
192
+ });
183
193
  }
184
194
 
185
195
  async function loadCategoriesListPrimarySearch(_$w, allvaluesobjects) {
186
- _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_MULTI_BOX).changeState("categoryResults");
196
+ _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_MULTI_BOX).changeState("categoryResults");
187
197
 
188
- let categoryValues=[]
189
- for(const value of allvaluesobjects) {
190
- if(value.customField === CATEGORY_CUSTOM_FIELD_ID_IN_CMS) {
191
- categoryValues.push({title: value.title+` (${value.count})` , _id: value.valueId});
192
- }
198
+ let categoryValues=[]
199
+ for(const value of allvaluesobjects) {
200
+ if(value.customField === CATEGORY_CUSTOM_FIELD_ID_IN_CMS) {
201
+ categoryValues.push({title: value.title+` (${value.count})` , _id: value.valueId});
193
202
  }
194
- _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.CATEGORY_RESULTS_REPEATER).data = categoryValues;
203
+ }
204
+ _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.CATEGORY_RESULTS_REPEATER).data = categoryValues;
195
205
  }
196
206
 
197
- async function primarySearch(_$w,query,alljobs) {
198
- if(query.length===0 || query===undefined || query==='') {
199
- _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_MULTI_BOX).changeState("categoryResults");
200
- return false;
201
- }
202
- let filteredJobs=alljobs.filter(job=>job.title.toLowerCase().includes(query));
203
- if(filteredJobs.length>0) {
207
+ async function primarySearch(_$w, query) {
208
+ if(query === undefined || query === '') {
209
+ _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_MULTI_BOX).changeState("categoryResults");
210
+ return false;
211
+ }
212
+
213
+ const searchByTitle = [{field: 'title', searchTerm: query}];
214
+ const searchByCity = [{field: 'location.fullLocation', searchTerm: query}];
215
+
216
+ let filter = await getFilter(searchByTitle);
217
+
218
+ await _$w('#jobsDataset').setFilter(filter);
219
+ await _$w('#jobsDataset').refresh();
220
+
221
+ let count = _$w('#jobsDataset').getTotalCount();
222
+
223
+ if( count > 0 ) {
224
+ _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.RESULTS_CONTAINER).expand();
225
+ _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_MULTI_BOX).changeState("jobResults");
226
+ }
227
+ else {
228
+ filter = await getFilter(searchByCity);
229
+ await _$w('#jobsDataset').setFilter(filter);
230
+ await _$w('#jobsDataset').refresh();
231
+
232
+ count = _$w('#jobsDataset').getTotalCount();
233
+ if (count > 0) {
234
+ _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.RESULTS_CONTAINER).expand();
204
235
  _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_MULTI_BOX).changeState("jobResults");
205
236
  }
206
- else {
207
- console.log("searching by location")
208
- filteredJobs=alljobs.filter(job=>job.location.fullLocation.toLowerCase().includes(query));
209
- if(filteredJobs.length>0) {
210
- _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_MULTI_BOX).changeState("jobResults");
211
- }
212
- else{
237
+ else{
213
238
  _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.PRIMARY_SEARCH_MULTI_BOX).changeState("noResults");
214
- }
215
239
  }
216
- _$w(CAREERS_MULTI_BOXES_PAGE_CONSTS.JOB_RESULTS_REPEATER).data = filteredJobs
217
- return filteredJobs.length>0;
218
-
240
+ }
241
+
242
+ return count > 0;
219
243
  }
220
244
 
221
245
  async function getValueFromValueId(valueId) {
222
- const result = await getAllRecords(COLLECTIONS.CUSTOM_VALUES);
223
- console.log("result: ",result);
224
- console.log("valueId: ",valueId);
246
+ const result = await getAllRecords(COLLECTIONS.CUSTOM_VALUES);
247
+ console.log("result: ",result);
248
+ console.log("valueId: ",valueId);
225
249
 
226
- return result.find(value => value.valueId === valueId);
250
+ return result.find(value => value.valueId === valueId);
227
251
  }
228
252
 
229
- async function getLatestJobsByValue(Value) {
230
- const jobs=Value.multiRefJobsCustomValues;
231
- const latestJobs = jobs
232
- .sort((a, b) => new Date(b.releasedDate) - new Date(a.releasedDate))
233
- .slice(0, 5);
234
- return latestJobs;
235
- }
253
+ async function getLatestJobsByValue(Value) {
254
+ const jobs=Value.multiRefJobsCustomValues;
255
+ const latestJobs = jobs
256
+ .sort((a, b) => new Date(b.releasedDate) - new Date(a.releasedDate))
257
+ .slice(0, 5);
258
+ return latestJobs;
259
+ }
236
260
 
237
- module.exports = {
238
- groupValuesByField,
239
- debounce,
240
- getAllRecords,
241
- getFieldById,
242
- getFieldByTitle,
243
- getCorrectOption,
244
- getOptionIndexFromCheckBox,
245
- loadPrimarySearchRepeater,
246
- bindPrimarySearch,
247
- primarySearch,
248
- getLatestJobsByValue,
249
- getValueFromValueId,
250
- getAllRecordsWithoutMultiRef
261
+ module.exports = {
262
+ groupValuesByField,
263
+ debounce,
264
+ getAllRecords,
265
+ getFieldById,
266
+ getFieldByTitle,
267
+ getCorrectOption,
268
+ getOptionIndexFromCheckBox,
269
+ loadPrimarySearchRepeater,
270
+ bindPrimarySearch,
271
+ primarySearch,
272
+ getLatestJobsByValue,
273
+ getValueFromValueId,
274
+ getAllRecordsWithoutMultiRef,
275
+ getAllDatasetItems
251
276
  }
@@ -1,6 +1,7 @@
1
1
  const { query } = require("wix-location-frontend");
2
2
  const { getPositionWithMultiRefField } = require('../backend/queries');
3
3
  const { COLLECTIONS,JOBS_COLLECTION_FIELDS,CUSTOM_FIELDS_COLLECTION_FIELDS } = require('../backend/collectionConsts');
4
+ const { CAREERS_MULTI_BOXES_PAGE_CONSTS } = require('../backend/careersMultiBoxesPageIds');
4
5
  const { items: wixData } = require('@wix/data');
5
6
  const { location } = require("@wix/site-location");
6
7
  const{isElementExistOnPage} = require('psdev-utils');
@@ -73,7 +74,7 @@ async function getCategoryValue(customValues) {
73
74
  const clickedItemData = data.find(
74
75
  (item) => item._id === event.context.itemId,
75
76
  );
76
- location.to(clickedItemData["link-jobs-title"]);
77
+ location.to(clickedItemData[CAREERS_MULTI_BOXES_PAGE_CONSTS.LINK_JOBS_TITLE] || clickedItemData[CAREERS_MULTI_BOXES_PAGE_CONSTS.LINK_JOBS_REF_ID_SLUG]);
77
78
  });
78
79
  }
79
80
  if(isElementExistOnPage(_$w('#relatedJobsDataset')))
@@ -1,6 +1,7 @@
1
1
  const { getLatestJobsByValue, getValueFromValueId } = require('./pagesUtils');
2
2
  const { location } = require("@wix/site-location");
3
3
  const { supportTeamsPageIds,supportTeamsPageSections } = require('../backend/consts');
4
+ const { CAREERS_MULTI_BOXES_PAGE_CONSTS } = require('../backend/careersMultiBoxesPageIds');
4
5
  const { getAllRecordsWithoutMultiRef } = require('./pagesUtils');
5
6
 
6
7
  let currentItem;
@@ -60,7 +61,7 @@ async function handleRecentJobsSection(_$w) {
60
61
  const clickedItemData = data.find(
61
62
  (item) => item._id === event.context.itemId,
62
63
  );
63
- location.to(clickedItemData["link-jobs-title"]);
64
+ location.to(clickedItemData[CAREERS_MULTI_BOXES_PAGE_CONSTS.LINK_JOBS_TITLE] || clickedItemData[CAREERS_MULTI_BOXES_PAGE_CONSTS.LINK_JOBS_REF_ID_SLUG]);
64
65
  });
65
66
 
66
67
  _$w(supportTeamsPageIds.RECENT_JOBS_BUTTON).onClick( () => {
@@ -23,7 +23,7 @@ function getFilter(fieldsToSearch = [], mode = 'or') {
23
23
  return filter;
24
24
  }
25
25
 
26
- function debounce(fn, delay = 400,thisObject) {
26
+ function debounce(fn, delay = 400, thisObject) {
27
27
  let timeout;
28
28
  return function (...args) {
29
29
  clearTimeout(timeout);