@abcagency/hc-ui-components 1.3.27 → 1.3.29
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.
- package/dist/components/HireControlMap.js +9 -1
- package/dist/components/HireControlMap.js.map +1 -1
- package/dist/components/containers/accordions/filter-item-container.js +4 -1
- package/dist/components/containers/accordions/filter-item-container.js.map +1 -1
- package/dist/components/containers/jobListing/listing-details-container.js.map +1 -1
- package/dist/components/containers/list/list-item/list-item-container.js.map +1 -1
- package/dist/components/containers/maps/info-window-content-container.js +9 -4
- package/dist/components/containers/maps/info-window-content-container.js.map +1 -1
- package/dist/components/containers/maps/map-container.js +34 -35
- package/dist/components/containers/maps/map-container.js.map +1 -1
- package/dist/components/containers/maps/map-list-container.js +2 -2
- package/dist/components/containers/maps/map-list-container.js.map +1 -1
- package/dist/components/containers/maps/map-marker-container.js +3 -5
- package/dist/components/containers/maps/map-marker-container.js.map +1 -1
- package/dist/components/modules/jobListing/listing-details.js +2 -23
- package/dist/components/modules/jobListing/listing-details.js.map +1 -1
- package/dist/components/modules/list/list-item/list-item.js.map +1 -1
- package/dist/components/modules/maps/info-window-content.js +4 -2
- package/dist/components/modules/maps/info-window-content.js.map +1 -1
- package/dist/components/modules/maps/map.js +4 -13
- package/dist/components/modules/maps/map.js.map +1 -1
- package/dist/contexts/mapListContext.js +6 -0
- package/dist/contexts/mapListContext.js.map +1 -1
- package/dist/contexts/themeContext.js +33 -0
- package/dist/contexts/themeContext.js.map +1 -0
- package/dist/styles/index.css +1 -1
- package/dist/types/components/modules/jobListing/listing-details.d.ts +1 -1
- package/dist/types/contexts/mapListContext.d.ts +1 -0
- package/dist/types/contexts/themeContext.d.ts +11 -0
- package/dist/util/urlFilterUtil.js +0 -10
- package/dist/util/urlFilterUtil.js.map +1 -1
- package/package.json +1 -1
- package/src/components/HireControlMap.js +58 -55
- package/src/components/containers/accordions/filter-item-container.js +69 -66
- package/src/components/containers/jobListing/listing-details-container.js +40 -40
- package/src/components/containers/list/list-item/list-item-container.js +43 -43
- package/src/components/containers/maps/info-window-content-container.js +5 -3
- package/src/components/containers/maps/map-container.js +37 -35
- package/src/components/containers/maps/map-list-container.js +1 -1
- package/src/components/containers/maps/map-marker-container.js +2 -2
- package/src/components/modules/jobListing/listing-details.js +109 -109
- package/src/components/modules/list/list-item/list-item.js +130 -130
- package/src/components/modules/maps/info-window-content.js +36 -35
- package/src/components/modules/maps/map.js +5 -17
- package/src/contexts/mapListContext.tsx +319 -311
- package/src/contexts/themeContext.js +40 -0
- package/src/styles/index.css +33 -24
|
@@ -1,12 +1,7 @@
|
|
|
1
1
|
import { createForOfIteratorHelper as _createForOfIteratorHelper, slicedToArray as _slicedToArray } from '../_virtual/_rollupPluginBabelHelpers.js';
|
|
2
2
|
|
|
3
3
|
var updateURLWithFilters = function updateURLWithFilters(filters, location, query) {
|
|
4
|
-
console.log("updating with filters");
|
|
5
|
-
console.log(filters);
|
|
6
|
-
console.log(query);
|
|
7
4
|
var searchParams = new URLSearchParams(location.search);
|
|
8
|
-
|
|
9
|
-
// Remove keys with a '.' or those equal to 'query'
|
|
10
5
|
var filteredSearchParams = new URLSearchParams();
|
|
11
6
|
var _iterator = _createForOfIteratorHelper(searchParams.entries()),
|
|
12
7
|
_step;
|
|
@@ -19,8 +14,6 @@ var updateURLWithFilters = function updateURLWithFilters(filters, location, quer
|
|
|
19
14
|
filteredSearchParams.set(_key, value);
|
|
20
15
|
}
|
|
21
16
|
}
|
|
22
|
-
|
|
23
|
-
// Add the query parameter if it exists
|
|
24
17
|
} catch (err) {
|
|
25
18
|
_iterator.e(err);
|
|
26
19
|
} finally {
|
|
@@ -29,8 +22,6 @@ var updateURLWithFilters = function updateURLWithFilters(filters, location, quer
|
|
|
29
22
|
if (query) {
|
|
30
23
|
filteredSearchParams.set('query', query);
|
|
31
24
|
}
|
|
32
|
-
|
|
33
|
-
// Add the filters back to the search params
|
|
34
25
|
for (var category in filters) {
|
|
35
26
|
for (var filter in filters[category]) {
|
|
36
27
|
var key = "".concat(category, ".").concat(filter);
|
|
@@ -40,7 +31,6 @@ var updateURLWithFilters = function updateURLWithFilters(filters, location, quer
|
|
|
40
31
|
}
|
|
41
32
|
}
|
|
42
33
|
var newUrl = "".concat(location.pathname, "?").concat(filteredSearchParams.toString());
|
|
43
|
-
console.log(newUrl);
|
|
44
34
|
window.history.replaceState({}, '', newUrl);
|
|
45
35
|
};
|
|
46
36
|
var parseQueryParams = function parseQueryParams(search) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"urlFilterUtil.js","sources":["../../src/util/urlFilterUtil.js"],"sourcesContent":["export const updateURLWithFilters = (filters, location, query) => {\n\
|
|
1
|
+
{"version":3,"file":"urlFilterUtil.js","sources":["../../src/util/urlFilterUtil.js"],"sourcesContent":["export const updateURLWithFilters = (filters, location, query) => {\n\tconst searchParams = new URLSearchParams(location.search);\n\n\tconst filteredSearchParams = new URLSearchParams();\n\tfor (const [key, value] of searchParams.entries()) {\n\t\tif (!key.includes('.') && key !== 'query') {\n\t\t\tfilteredSearchParams.set(key, value);\n\t\t}\n\t}\n\n\tif (query) {\n\t\tfilteredSearchParams.set('query', query);\n\t}\n\n\tfor (const category in filters) {\n\t\tfor (const filter in filters[category]) {\n\t\t\tconst key = `${category}.${filter}`;\n\t\t\tif (filters[category][filter]) {\n\t\t\t\tfilteredSearchParams.set(key, 'true');\n\t\t\t}\n\t\t}\n\t}\n\n\tconst newUrl = `${location.pathname}?${filteredSearchParams.toString()}`;\n\twindow.history.replaceState({}, '', newUrl);\n};\n\nfunction notifyParentOfUrlChange() {\n\tsetTimeout(() => {\n\t\tvar message = {\n\t\t\ttype: 'URL_CHANGE',\n\t\t\turl: window.location.href\n\t\t};\n\t\twindow.parent.postMessage(message, \"*\");\n\t}, 500);\n}\n\nexport const parseQueryParams = search => {\n\tconst queryParams = {};\n\tif (!search) return queryParams;\n\tlet queryString = search.split('?')[1];\n\tif (!queryString) {\n\t\treturn queryParams;\n\t}\n\tqueryString = queryString.replaceAll('+', ' ');\n\tqueryString.split('&').forEach(param => {\n\t\tconst [key, value] = param.split('=');\n\t\tqueryParams[decodeURIComponent(key)] = decodeURIComponent(value);\n\t});\n\treturn queryParams;\n};\n\nexport const filtersFromURL = location => {\n\tif (!location || !location.search) return;\n\tconst filters = {};\n\tlet queryParam = null;\n\tconst queryParams = parseQueryParams(location.search);\n\tif (!queryParams) return;\n\tObject.keys(queryParams).forEach(key => {\n\t\tif (key && key.includes('.')) {\n\t\t\tconst [category, filter] = key.split('.');\n\t\t\tif (!filters[category]) {\n\t\t\t\tfilters[category] = {};\n\t\t\t}\n\t\t\tfilters[category][filter] = queryParams[key] === 'true';\n\t\t} else if (key === 'query') {\n\t\t\tqueryParam = queryParams[key];\n\t\t}\n\t});\n\n\treturn { filters, query: queryParam };\n};\n\nexport const hasFiltersInURL = location => {\n\tif (!location || !location.search) return;\n\tconst queryParams = parseQueryParams(location.search);\n\tif (!queryParams) return;\n\treturn Object.keys(queryParams).some(key => key.includes('.'));\n};\n\nexport const hasQueryInUrl = location => {\n\tif (!location || !location.search) return;\n\tconst queryParams = parseQueryParams(location.search);\n\tif (!queryParams) return;\n\treturn Object.keys(queryParams).includes('query');\n};\n"],"names":["updateURLWithFilters","filters","location","query","searchParams","URLSearchParams","search","filteredSearchParams","_iterator","_createForOfIteratorHelper","entries","_step","s","n","done","_step$value","_slicedToArray","value","key","includes","set","err","e","f","category","filter","concat","newUrl","pathname","toString","window","history","replaceState","parseQueryParams","queryParams","queryString","split","replaceAll","forEach","param","_param$split","_param$split2","decodeURIComponent","filtersFromURL","queryParam","Object","keys","_key$split","_key$split2"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -14,6 +14,7 @@ import { getMapConfig } from '~/services/configService';
|
|
|
14
14
|
import { setClientAuthKey } from '~/clientToken.js';
|
|
15
15
|
|
|
16
16
|
import '../styles/index.css';
|
|
17
|
+
import { ThemeProvider } from '~/contexts/themeContext';
|
|
17
18
|
|
|
18
19
|
const libraries = ['places'];
|
|
19
20
|
|
|
@@ -72,62 +73,64 @@ const HomeBody = ({ siteConfig, navigateToDetails, navigateToEasyApply, Link, li
|
|
|
72
73
|
|
|
73
74
|
return (
|
|
74
75
|
<TrackEventProvider trackEvent={trackEvent}>
|
|
75
|
-
<
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
<
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
<Grid
|
|
100
|
-
as='section'
|
|
101
|
-
id='job-search-interface'
|
|
102
|
-
columns='md:hc-grid-cols-[1fr_2.5fr] lg:hc-grid-cols-[1fr_3.5fr]'
|
|
103
|
-
gap='hc-gap-0'
|
|
104
|
-
autoRows={false}
|
|
105
|
-
className='hc-bundle hc-items-stretch hc-h-screen hc-min-h-[30rem] hc-divide-x hc-divide-uiAccent/20'
|
|
76
|
+
<ThemeProvider uiText={siteConfig.colors.uiText} uiAccent={siteConfig.colors.uiAccent} primary={siteConfig.colors.primary} primaryDark={siteConfig.colors.primaryDark} secondary={siteConfig.colors.secondary} secondaryDark={siteConfig.colors.secondaryDark}>
|
|
77
|
+
<MapListProvider
|
|
78
|
+
siteConfig={siteConfig}
|
|
79
|
+
resetFilters={resetFilters}
|
|
80
|
+
avigateToDetails={navigateToDetails}
|
|
81
|
+
navigateToEasyApply={navigateToEasyApply}
|
|
82
|
+
Link={Link}
|
|
83
|
+
linkFormat={linkFormat}
|
|
84
|
+
listings={listings}
|
|
85
|
+
setFiltersUrl={setFiltersUrl}
|
|
86
|
+
>
|
|
87
|
+
<MapProvider resetFilters={resetFilters}>
|
|
88
|
+
<PlacesProvider
|
|
89
|
+
placeMappings={siteConfig.pointsOfInterestConfig.placeMappings ?? {}}
|
|
90
|
+
markerColors={{
|
|
91
|
+
fillColor: siteConfig.colors.primary,
|
|
92
|
+
strokeColor: siteConfig.colors.primaryDark,
|
|
93
|
+
selectedFillColor: siteConfig.colors.secondary,
|
|
94
|
+
selectedStrokeColor: siteConfig.colors.secondaryDark,
|
|
95
|
+
placeMarkers: {
|
|
96
|
+
colors: siteConfig.pointsOfInterestConfig.placeMarkerColors,
|
|
97
|
+
size: siteConfig.pointsOfInterestConfig.placeMarkerSize
|
|
98
|
+
}
|
|
99
|
+
}}
|
|
106
100
|
>
|
|
107
|
-
<Grid
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
101
|
+
<Grid
|
|
102
|
+
as='section'
|
|
103
|
+
id='job-search-interface'
|
|
104
|
+
columns='md:hc-grid-cols-[1fr_2.5fr] lg:hc-grid-cols-[1fr_3.5fr]'
|
|
105
|
+
gap='hc-gap-0'
|
|
106
|
+
autoRows={false}
|
|
107
|
+
className='hc-bundle hc-items-stretch hc-h-screen hc-min-h-[30rem] hc-divide-x hc-divide-uiAccent/20'
|
|
108
|
+
>
|
|
109
|
+
<Grid.Item className='hc-bg-gray-100'>
|
|
110
|
+
<Filter showMap={siteConfig.showMap} className='hc-hidden md:hc-block' />
|
|
111
|
+
</Grid.Item>
|
|
112
|
+
<MapList
|
|
113
|
+
markerConfigs={{
|
|
114
|
+
fillColor: siteConfig.colors.primary,
|
|
115
|
+
strokeColor: siteConfig.colors.primaryDark,
|
|
116
|
+
selectedFillColor: siteConfig.colors.secondary,
|
|
117
|
+
selectedStrokeColor: siteConfig.colors.secondaryDark,
|
|
118
|
+
placeMarkers: {
|
|
119
|
+
colors: siteConfig.pointsOfInterestConfig.placeMarkerColors,
|
|
120
|
+
size: siteConfig.pointsOfInterestConfig.placeMarkerSize
|
|
121
|
+
}
|
|
122
|
+
}}
|
|
123
|
+
showMap={siteConfig.showMap}
|
|
124
|
+
fieldsShown={siteConfig.fieldsShown}
|
|
125
|
+
specialFeatures={siteConfig.specialFeatures}
|
|
126
|
+
fieldNames={siteConfig.fieldNames}
|
|
127
|
+
placeMappings={siteConfig.pointsOfInterestConfig.placeMappings ?? {}}
|
|
128
|
+
/>
|
|
129
|
+
</Grid>
|
|
130
|
+
</PlacesProvider>
|
|
131
|
+
</MapProvider>
|
|
132
|
+
</MapListProvider>
|
|
133
|
+
</ThemeProvider>
|
|
131
134
|
</TrackEventProvider>
|
|
132
135
|
);
|
|
133
136
|
};
|
|
@@ -1,66 +1,69 @@
|
|
|
1
|
-
import React, { memo } from 'react';
|
|
2
|
-
import AccordionFilterItem from '~/components/modules/accordions/filterItem';
|
|
3
|
-
import FilterItem from '~/components/containers/filter/filter-item-container';
|
|
4
|
-
import ItemsPill from '~/components/modules/buttons/items-pill';
|
|
5
|
-
|
|
6
|
-
const FilterItemContainer = ({
|
|
7
|
-
filter,
|
|
8
|
-
setDefaultValue,
|
|
9
|
-
setSelectedFilters,
|
|
10
|
-
selectedFilters,
|
|
11
|
-
subcategoryRequireCategory = false
|
|
12
|
-
}) => {
|
|
13
|
-
const fieldKey = filter.id;
|
|
14
|
-
const activeItemsCount = selectedFilters != null && selectedFilters[fieldKey]
|
|
15
|
-
? Object.keys(selectedFilters[fieldKey]).length
|
|
16
|
-
: 0;
|
|
17
|
-
|
|
18
|
-
const handleClearFilters = event => {
|
|
19
|
-
event.stopPropagation();
|
|
20
|
-
setSelectedFilters(prevFilters => {
|
|
21
|
-
const updatedFilters = { ...prevFilters };
|
|
22
|
-
if(subcategoryRequireCategory && fieldKey == 'categoryClass'){
|
|
23
|
-
delete updatedFilters['category'];
|
|
24
|
-
}
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
|
|
1
|
+
import React, { memo } from 'react';
|
|
2
|
+
import AccordionFilterItem from '~/components/modules/accordions/filterItem';
|
|
3
|
+
import FilterItem from '~/components/containers/filter/filter-item-container';
|
|
4
|
+
import ItemsPill from '~/components/modules/buttons/items-pill';
|
|
5
|
+
|
|
6
|
+
const FilterItemContainer = ({
|
|
7
|
+
filter,
|
|
8
|
+
setDefaultValue,
|
|
9
|
+
setSelectedFilters,
|
|
10
|
+
selectedFilters,
|
|
11
|
+
subcategoryRequireCategory = false
|
|
12
|
+
}) => {
|
|
13
|
+
const fieldKey = filter.id;
|
|
14
|
+
const activeItemsCount = selectedFilters != null && selectedFilters[fieldKey]
|
|
15
|
+
? Object.keys(selectedFilters[fieldKey]).length
|
|
16
|
+
: 0;
|
|
17
|
+
|
|
18
|
+
const handleClearFilters = event => {
|
|
19
|
+
event.stopPropagation();
|
|
20
|
+
setSelectedFilters(prevFilters => {
|
|
21
|
+
const updatedFilters = { ...prevFilters };
|
|
22
|
+
if(subcategoryRequireCategory && fieldKey == 'categoryClass'){
|
|
23
|
+
delete updatedFilters['category'];
|
|
24
|
+
}
|
|
25
|
+
if(fieldKey == 'state' || fieldKey == 'city' || fieldKey == 'cityState'){
|
|
26
|
+
delete updatedFilters.entityId;
|
|
27
|
+
delete updatedFilters[fieldKey];
|
|
28
|
+
}
|
|
29
|
+
return updatedFilters;
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
const header = (
|
|
34
|
+
<>
|
|
35
|
+
{filter.title}
|
|
36
|
+
{activeItemsCount > 0 && (
|
|
37
|
+
<ItemsPill
|
|
38
|
+
activeItemsCount={activeItemsCount}
|
|
39
|
+
onClick={handleClearFilters}
|
|
40
|
+
/>
|
|
41
|
+
)}
|
|
42
|
+
</>
|
|
43
|
+
);
|
|
44
|
+
|
|
45
|
+
const body = (
|
|
46
|
+
<>
|
|
47
|
+
{filter.items.sort().map(item => (
|
|
48
|
+
<FilterItem
|
|
49
|
+
key={item.name}
|
|
50
|
+
item={item}
|
|
51
|
+
field={filter.id}
|
|
52
|
+
selectedFilters={selectedFilters}
|
|
53
|
+
setSelectedFilters={setSelectedFilters}
|
|
54
|
+
/>
|
|
55
|
+
))}
|
|
56
|
+
</>
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
return (
|
|
60
|
+
<AccordionFilterItem
|
|
61
|
+
id={filter.id}
|
|
62
|
+
setDefaultValue={setDefaultValue}
|
|
63
|
+
header={header}
|
|
64
|
+
body={body}
|
|
65
|
+
/>
|
|
66
|
+
);
|
|
67
|
+
};
|
|
68
|
+
|
|
69
|
+
export default memo(FilterItemContainer);
|
|
@@ -1,40 +1,40 @@
|
|
|
1
|
-
import React from 'react';
|
|
2
|
-
import { useMap } from '~/contexts/mapContext';
|
|
3
|
-
import { useMapList } from '~/contexts/mapListContext';
|
|
4
|
-
import { useTrackEvent } from '~/contexts/trackEventContext';
|
|
5
|
-
import ListingDetails from '~/components/modules/jobListing/listing-details';
|
|
6
|
-
|
|
7
|
-
const ListingDetailsContainer = ({ item, recruiter }) => {
|
|
8
|
-
const { trackEvent, eventTypes } = useTrackEvent();
|
|
9
|
-
const { travelTime } = useMap();
|
|
10
|
-
const { siteConfig, navigateToDetails, navigateToEasyApply, Link, linkFormat } = useMapList();
|
|
11
|
-
|
|
12
|
-
const {
|
|
13
|
-
useDetailsPostMessage,
|
|
14
|
-
useApplyDialog,
|
|
15
|
-
internalApplyLink,
|
|
16
|
-
companyName,
|
|
17
|
-
jobsDomain
|
|
18
|
-
} = siteConfig;
|
|
19
|
-
|
|
20
|
-
return (
|
|
21
|
-
<ListingDetails
|
|
22
|
-
item={item}
|
|
23
|
-
recruiter={recruiter}
|
|
24
|
-
travelTime={travelTime}
|
|
25
|
-
useDetailsPostMessage={useDetailsPostMessage}
|
|
26
|
-
navigateToDetails={navigateToDetails}
|
|
27
|
-
navigateToEasyApply={navigateToEasyApply}
|
|
28
|
-
Link={Link}
|
|
29
|
-
linkFormat={linkFormat}
|
|
30
|
-
useApplyDialog={useApplyDialog}
|
|
31
|
-
internalApplyLink={internalApplyLink}
|
|
32
|
-
companyName={companyName}
|
|
33
|
-
jobsDomain={jobsDomain}
|
|
34
|
-
trackEvent={trackEvent}
|
|
35
|
-
eventTypes={eventTypes}
|
|
36
|
-
/>
|
|
37
|
-
);
|
|
38
|
-
};
|
|
39
|
-
|
|
40
|
-
export default ListingDetailsContainer;
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import { useMap } from '~/contexts/mapContext';
|
|
3
|
+
import { useMapList } from '~/contexts/mapListContext';
|
|
4
|
+
import { useTrackEvent } from '~/contexts/trackEventContext';
|
|
5
|
+
import ListingDetails from '~/components/modules/jobListing/listing-details';
|
|
6
|
+
|
|
7
|
+
const ListingDetailsContainer = ({ item, recruiter }) => {
|
|
8
|
+
const { trackEvent, eventTypes } = useTrackEvent();
|
|
9
|
+
const { travelTime } = useMap();
|
|
10
|
+
const { siteConfig, navigateToDetails, navigateToEasyApply, Link, linkFormat } = useMapList();
|
|
11
|
+
|
|
12
|
+
const {
|
|
13
|
+
useDetailsPostMessage,
|
|
14
|
+
useApplyDialog,
|
|
15
|
+
internalApplyLink,
|
|
16
|
+
companyName,
|
|
17
|
+
jobsDomain
|
|
18
|
+
} = siteConfig;
|
|
19
|
+
|
|
20
|
+
return (
|
|
21
|
+
<ListingDetails
|
|
22
|
+
item={item}
|
|
23
|
+
recruiter={recruiter}
|
|
24
|
+
travelTime={travelTime}
|
|
25
|
+
useDetailsPostMessage={useDetailsPostMessage}
|
|
26
|
+
navigateToDetails={navigateToDetails}
|
|
27
|
+
navigateToEasyApply={navigateToEasyApply}
|
|
28
|
+
Link={Link}
|
|
29
|
+
linkFormat={linkFormat}
|
|
30
|
+
useApplyDialog={useApplyDialog}
|
|
31
|
+
internalApplyLink={internalApplyLink}
|
|
32
|
+
companyName={companyName}
|
|
33
|
+
jobsDomain={jobsDomain}
|
|
34
|
+
trackEvent={trackEvent}
|
|
35
|
+
eventTypes={eventTypes}
|
|
36
|
+
/>
|
|
37
|
+
);
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
export default ListingDetailsContainer;
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
import React, { useState } from 'react';
|
|
2
|
-
import { useMapList } from '~/contexts/mapListContext';
|
|
3
|
-
import { useTrackEvent } from '~/contexts/trackEventContext';
|
|
4
|
-
import ListItem from '~/components/modules/list/list-item/list-item';
|
|
5
|
-
|
|
6
|
-
const ListItemContainer = ({
|
|
7
|
-
isActive,
|
|
8
|
-
showMap,
|
|
9
|
-
item,
|
|
10
|
-
itemRefs,
|
|
11
|
-
fieldsShown,
|
|
12
|
-
specialFeatures,
|
|
13
|
-
className,
|
|
14
|
-
bodyClassName,
|
|
15
|
-
onItemSelected,
|
|
16
|
-
...props
|
|
17
|
-
}) => {
|
|
18
|
-
const { siteConfig, favorites, handleSettingFavorites, setMobileTab } = useMapList();
|
|
19
|
-
const { trackEvent, eventTypes } = useTrackEvent();
|
|
20
|
-
|
|
21
|
-
return (
|
|
22
|
-
<ListItem
|
|
23
|
-
isActive={isActive}
|
|
24
|
-
showMap={showMap}
|
|
25
|
-
item={item}
|
|
26
|
-
itemRefs={itemRefs}
|
|
27
|
-
fieldsShown={fieldsShown}
|
|
28
|
-
specialFeatures={specialFeatures}
|
|
29
|
-
className={isActive ? "!hc-border-secondary hc-border hc-border-b-0" : "hc-opacity-85"}
|
|
30
|
-
bodyClassName={bodyClassName}
|
|
31
|
-
onItemSelected={onItemSelected}
|
|
32
|
-
setMobileTab={setMobileTab}
|
|
33
|
-
siteConfig={siteConfig}
|
|
34
|
-
trackEvent={trackEvent}
|
|
35
|
-
eventTypes={eventTypes}
|
|
36
|
-
favorites={favorites}
|
|
37
|
-
handleSettingFavorites={handleSettingFavorites}
|
|
38
|
-
{...props}
|
|
39
|
-
/>
|
|
40
|
-
);
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
export default ListItemContainer;
|
|
1
|
+
import React, { useState } from 'react';
|
|
2
|
+
import { useMapList } from '~/contexts/mapListContext';
|
|
3
|
+
import { useTrackEvent } from '~/contexts/trackEventContext';
|
|
4
|
+
import ListItem from '~/components/modules/list/list-item/list-item';
|
|
5
|
+
|
|
6
|
+
const ListItemContainer = ({
|
|
7
|
+
isActive,
|
|
8
|
+
showMap,
|
|
9
|
+
item,
|
|
10
|
+
itemRefs,
|
|
11
|
+
fieldsShown,
|
|
12
|
+
specialFeatures,
|
|
13
|
+
className,
|
|
14
|
+
bodyClassName,
|
|
15
|
+
onItemSelected,
|
|
16
|
+
...props
|
|
17
|
+
}) => {
|
|
18
|
+
const { siteConfig, favorites, handleSettingFavorites, setMobileTab } = useMapList();
|
|
19
|
+
const { trackEvent, eventTypes } = useTrackEvent();
|
|
20
|
+
|
|
21
|
+
return (
|
|
22
|
+
<ListItem
|
|
23
|
+
isActive={isActive}
|
|
24
|
+
showMap={showMap}
|
|
25
|
+
item={item}
|
|
26
|
+
itemRefs={itemRefs}
|
|
27
|
+
fieldsShown={fieldsShown}
|
|
28
|
+
specialFeatures={specialFeatures}
|
|
29
|
+
className={isActive ? "!hc-border-secondary hc-border hc-border-b-0" : "hc-opacity-85"}
|
|
30
|
+
bodyClassName={bodyClassName}
|
|
31
|
+
onItemSelected={onItemSelected}
|
|
32
|
+
setMobileTab={setMobileTab}
|
|
33
|
+
siteConfig={siteConfig}
|
|
34
|
+
trackEvent={trackEvent}
|
|
35
|
+
eventTypes={eventTypes}
|
|
36
|
+
favorites={favorites}
|
|
37
|
+
handleSettingFavorites={handleSettingFavorites}
|
|
38
|
+
{...props}
|
|
39
|
+
/>
|
|
40
|
+
);
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
export default ListItemContainer;
|
|
@@ -8,8 +8,8 @@ const InfoWindowContentContainer = ({
|
|
|
8
8
|
filterListingsByLocation
|
|
9
9
|
}) => {
|
|
10
10
|
const { trackEvent, eventTypes } = useTrackEvent();
|
|
11
|
-
const { setSelectedFilters, setMobileTab, selectedFilters, siteConfig } = useMapList();
|
|
12
|
-
const fieldsShown = siteConfig.
|
|
11
|
+
const { setSelectedFilters, setMobileTab, selectedFilters, siteConfig, filteredListings } = useMapList();
|
|
12
|
+
const fieldsShown = siteConfig.locationFiltersShown;
|
|
13
13
|
let items = item && item.items ? Object.values(item.items) : null;
|
|
14
14
|
|
|
15
15
|
const addressParts = [
|
|
@@ -40,9 +40,11 @@ const InfoWindowContentContainer = ({
|
|
|
40
40
|
filters.push({ filterType: 'state', filterChecked: items[0].fields.state });
|
|
41
41
|
}
|
|
42
42
|
|
|
43
|
+
newFilters.entityId = { [items[0].fields.entityId]: true };
|
|
44
|
+
filters.push({ filterType: 'entityId', filterChecked: items[0].fields.entityId });
|
|
45
|
+
|
|
43
46
|
trackEvent(eventTypes.VIEW_JOBS_AT_Location, { filtersApplied: filters });
|
|
44
47
|
setSelectedFilters(newFilters);
|
|
45
|
-
filterListingsByLocation();
|
|
46
48
|
};
|
|
47
49
|
|
|
48
50
|
return <InfoWindowContent items={items} fullAddress={fullAddress} applyFilters={applyFilters} />;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
/* eslint-disable no-undef */
|
|
2
1
|
import React, { useEffect, useRef } from 'react';
|
|
3
2
|
|
|
4
3
|
import MapMarker from "~/components/containers/maps/map-marker-container";
|
|
@@ -11,17 +10,18 @@ import { useMapList } from "~/contexts/mapListContext";
|
|
|
11
10
|
import { markerIconSelected, markerIcon, pinIcon } from "~/util/mapIconUtil";
|
|
12
11
|
|
|
13
12
|
import Map from "~/components/modules/maps/map";
|
|
13
|
+
import { MarkerClustererF } from "@react-google-maps/api";
|
|
14
|
+
import { clusterOptions } from "~/util/mapUtil";
|
|
14
15
|
|
|
15
16
|
const MapContainer = ({
|
|
16
17
|
markerConfigs,
|
|
17
18
|
infoWindowClasses,
|
|
18
|
-
clusterGridSize =
|
|
19
|
+
clusterGridSize = 10
|
|
19
20
|
}) => {
|
|
20
21
|
const {
|
|
21
22
|
location,
|
|
22
23
|
zoom,
|
|
23
24
|
center,
|
|
24
|
-
commuteLocation,
|
|
25
25
|
selectLocationEntity,
|
|
26
26
|
setLocation,
|
|
27
27
|
mapInteracted,
|
|
@@ -151,33 +151,6 @@ const MapContainer = ({
|
|
|
151
151
|
strokeColor: markerConfigs.strokeColor
|
|
152
152
|
});
|
|
153
153
|
|
|
154
|
-
const mapMarkers = mapItems.map(item => (
|
|
155
|
-
<MapMarker
|
|
156
|
-
key={item.id}
|
|
157
|
-
item={item}
|
|
158
|
-
selectedLocation={location}
|
|
159
|
-
markerRefs={markerRefs}
|
|
160
|
-
infoWindowClasses={infoWindowClasses}
|
|
161
|
-
setSelectedLocation={setLocation}
|
|
162
|
-
markerClickHandler={markerClickHandler}
|
|
163
|
-
markerIcon={markerIcon(markerConfigs)}
|
|
164
|
-
markerIconSelected={markerIconSelected(markerConfigs)}
|
|
165
|
-
setMapInteracted={setMapInteracted}
|
|
166
|
-
/>
|
|
167
|
-
));
|
|
168
|
-
|
|
169
|
-
const placeMarkers = poiMarkers.markers.map((marker, index) => (
|
|
170
|
-
<PlaceMarker
|
|
171
|
-
key={`marker-${marker.title}-${index}`}
|
|
172
|
-
marker={marker}
|
|
173
|
-
index={index}
|
|
174
|
-
selectedPlaceMarker={selectedPlaceMarker}
|
|
175
|
-
placesWindow={placesWindow}
|
|
176
|
-
setPlacesWindow={setPlacesWindow}
|
|
177
|
-
setSelectedPlaceMarker={setSelectedPlaceMarker}
|
|
178
|
-
/>
|
|
179
|
-
));
|
|
180
|
-
|
|
181
154
|
return (
|
|
182
155
|
<Map
|
|
183
156
|
zoom={zoom}
|
|
@@ -185,10 +158,6 @@ const MapContainer = ({
|
|
|
185
158
|
mapContainerRef={mapContainerRef}
|
|
186
159
|
onLoad={onLoad}
|
|
187
160
|
onIdle={onIdle}
|
|
188
|
-
clusterGridSize={clusterGridSize}
|
|
189
|
-
markerConfigs={markerConfigs}
|
|
190
|
-
mapMarkers={mapMarkers}
|
|
191
|
-
placeMarkers={placeMarkers}
|
|
192
161
|
mapInteracted={mapInteracted}
|
|
193
162
|
pinIconUrl={pinIconUrl}
|
|
194
163
|
setMapInteracted={setMapInteracted}
|
|
@@ -197,7 +166,40 @@ const MapContainer = ({
|
|
|
197
166
|
setQuery={setQuery}
|
|
198
167
|
filteredListingsLength={filteredListings.length}
|
|
199
168
|
setSelectedFilters={setSelectedFilters}
|
|
200
|
-
|
|
169
|
+
>
|
|
170
|
+
<MarkerClustererF options={clusterOptions(clusterGridSize, markerConfigs.fillColor)}>
|
|
171
|
+
{clusterer => (
|
|
172
|
+
<>
|
|
173
|
+
{mapItems.map(item => (
|
|
174
|
+
<MapMarker
|
|
175
|
+
key={item.id}
|
|
176
|
+
item={item}
|
|
177
|
+
selectedLocation={location}
|
|
178
|
+
markerRefs={markerRefs}
|
|
179
|
+
infoWindowClasses={infoWindowClasses}
|
|
180
|
+
setSelectedLocation={setLocation}
|
|
181
|
+
markerClickHandler={markerClickHandler}
|
|
182
|
+
clusterer={clusterer}
|
|
183
|
+
markerIcon={markerIcon(markerConfigs)}
|
|
184
|
+
markerIconSelected={markerIconSelected(markerConfigs)}
|
|
185
|
+
setMapInteracted={setMapInteracted}
|
|
186
|
+
/>
|
|
187
|
+
))}
|
|
188
|
+
{poiMarkers && poiMarkers.markers.map((marker, index) => (
|
|
189
|
+
<PlaceMarker
|
|
190
|
+
key={`marker-${marker.title}-${index}`}
|
|
191
|
+
marker={marker}
|
|
192
|
+
index={index}
|
|
193
|
+
selectedPlaceMarker={selectedPlaceMarker}
|
|
194
|
+
placesWindow={placesWindow}
|
|
195
|
+
setPlacesWindow={setPlacesWindow}
|
|
196
|
+
setSelectedPlaceMarker={setSelectedPlaceMarker}
|
|
197
|
+
/>
|
|
198
|
+
))}
|
|
199
|
+
</>
|
|
200
|
+
)}
|
|
201
|
+
</MarkerClustererF>
|
|
202
|
+
</Map>
|
|
201
203
|
);
|
|
202
204
|
};
|
|
203
205
|
|
|
@@ -2,7 +2,7 @@ import React from 'react';
|
|
|
2
2
|
|
|
3
3
|
import List from '~/components/containers/list/item-list-container';
|
|
4
4
|
import Map from '~/components/containers/maps/map-container';
|
|
5
|
-
import Filter from '~/components/
|
|
5
|
+
import Filter from '~/components/containers/filter/filter-container';
|
|
6
6
|
import MapList from '~/components/modules/maps/map-list';
|
|
7
7
|
|
|
8
8
|
const MapListContainer = ({
|