@abcagency/hc-ui-components 1.3.18 → 1.3.20

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.
Files changed (190) hide show
  1. package/dist/apis/hcApi.js +85 -183
  2. package/dist/apis/hcApi.js.map +1 -1
  3. package/dist/components/HireControlMap.js +10 -5
  4. package/dist/components/HireControlMap.js.map +1 -1
  5. package/dist/components/modules/accordions/MapAccordionItem.js +10 -67
  6. package/dist/components/modules/accordions/MapAccordionItem.js.map +1 -1
  7. package/dist/components/modules/filter/index.js.map +1 -1
  8. package/dist/components/modules/filter/radio-item.js +1 -2
  9. package/dist/components/modules/filter/radio-item.js.map +1 -1
  10. package/dist/components/modules/jobListing/listing-details-container.js +45 -0
  11. package/dist/components/modules/jobListing/listing-details-container.js.map +1 -0
  12. package/dist/components/modules/jobListing/listing-details.js +25 -24
  13. package/dist/components/modules/jobListing/listing-details.js.map +1 -1
  14. package/dist/components/modules/{maps/list → list}/field-mapper.js +8 -7
  15. package/dist/components/modules/list/field-mapper.js.map +1 -0
  16. package/dist/components/modules/{maps/list → list}/header-item.js +2 -2
  17. package/dist/components/modules/list/header-item.js.map +1 -0
  18. package/dist/components/modules/{maps/list → list}/header.js +6 -4
  19. package/dist/components/modules/list/header.js.map +1 -0
  20. package/dist/components/modules/list/index.js +36 -0
  21. package/dist/components/modules/list/index.js.map +1 -0
  22. package/dist/components/modules/{maps/list → list}/item-expand-card/index.js +3 -1
  23. package/dist/components/modules/list/item-expand-card/index.js.map +1 -0
  24. package/dist/components/modules/{maps/list → list}/item-expand-card/recruiter-contact-nav.js +2 -2
  25. package/dist/components/modules/list/item-expand-card/recruiter-contact-nav.js.map +1 -0
  26. package/dist/components/modules/{maps/list → list}/item-expand-card/recruiter-details.js +1 -1
  27. package/dist/components/modules/list/item-expand-card/recruiter-details.js.map +1 -0
  28. package/dist/components/modules/list/item-expand-card/recruiter-headshot.js.map +1 -0
  29. package/dist/components/modules/list/item-list.js +131 -0
  30. package/dist/components/modules/list/item-list.js.map +1 -0
  31. package/dist/components/modules/list/list-item/index.js +75 -0
  32. package/dist/components/modules/list/list-item/index.js.map +1 -0
  33. package/dist/components/modules/list/list-item/list-item-container.js +47 -0
  34. package/dist/components/modules/list/list-item/list-item-container.js.map +1 -0
  35. package/dist/components/modules/{maps/list/list-item/index.js → list/list-item/list-item.js} +29 -33
  36. package/dist/components/modules/list/list-item/list-item.js.map +1 -0
  37. package/dist/components/modules/maps/map-list.js +3 -3
  38. package/dist/components/modules/maps/map-list.js.map +1 -1
  39. package/dist/contexts/mapContext.js +84 -113
  40. package/dist/contexts/mapContext.js.map +1 -1
  41. package/dist/contexts/mapListContext.js +181 -293
  42. package/dist/contexts/mapListContext.js.map +1 -1
  43. package/dist/contexts/trackEventContext.js +1 -1
  44. package/dist/services/configService.js +10 -28
  45. package/dist/services/configService.js.map +1 -1
  46. package/dist/services/googlePlacesNearbyService.js +33 -58
  47. package/dist/services/googlePlacesNearbyService.js.map +1 -1
  48. package/dist/services/listingAggregatorService.js +35 -75
  49. package/dist/services/listingAggregatorService.js.map +1 -1
  50. package/dist/services/listingEntityService.js +10 -31
  51. package/dist/services/listingEntityService.js.map +1 -1
  52. package/dist/services/listingService.js +26 -60
  53. package/dist/services/listingService.js.map +1 -1
  54. package/dist/services/recruiterService.js +11 -31
  55. package/dist/services/recruiterService.js.map +1 -1
  56. package/dist/types/apis/hcApi.d.ts +5 -0
  57. package/dist/types/clientToken.d.ts +2 -0
  58. package/dist/types/components/modules/accordions/MapAccordionItem.d.ts +9 -0
  59. package/dist/types/components/modules/accordions/default.d.ts +19 -0
  60. package/dist/types/components/modules/buttons/button-group-apply.d.ts +24 -0
  61. package/dist/types/components/modules/buttons/commute-pill.d.ts +5 -0
  62. package/dist/types/components/modules/buttons/default.d.ts +48 -0
  63. package/dist/types/components/modules/buttons/pill-wrapper.d.ts +3 -0
  64. package/dist/types/components/modules/dialogs/apply-dialog.d.ts +8 -0
  65. package/dist/types/components/modules/filter/sort.d.ts +8 -0
  66. package/dist/types/components/modules/grid.d.ts +8 -0
  67. package/dist/types/components/modules/icon.d.ts +10 -0
  68. package/dist/types/components/modules/jobListing/listing-details-container.d.ts +6 -0
  69. package/dist/types/components/modules/jobListing/listing-details.d.ts +18 -0
  70. package/dist/types/components/modules/list/field-mapper.d.ts +10 -0
  71. package/dist/types/components/modules/list/header-item.d.ts +11 -0
  72. package/dist/types/components/modules/list/header.d.ts +11 -0
  73. package/dist/types/components/modules/list/index.d.ts +9 -0
  74. package/dist/types/components/modules/list/item-expand-card/index.d.ts +7 -0
  75. package/dist/types/components/modules/list/item-expand-card/recruiter-contact-nav.d.ts +17 -0
  76. package/dist/types/components/modules/list/item-expand-card/recruiter-details.d.ts +21 -0
  77. package/dist/types/components/modules/list/item-expand-card/recruiter-headshot.d.ts +8 -0
  78. package/dist/types/components/modules/list/item-list.d.ts +21 -0
  79. package/dist/types/components/modules/list/list-item/index.d.ts +12 -0
  80. package/dist/types/components/modules/list/list-item/list-item-container.d.ts +14 -0
  81. package/dist/types/components/modules/list/list-item/list-item.d.ts +3 -0
  82. package/dist/types/constants/eventTypes.d.ts +13 -0
  83. package/dist/types/contexts/mapContext.d.ts +29 -0
  84. package/dist/types/contexts/mapListContext.d.ts +58 -0
  85. package/dist/types/contexts/trackEventContext.d.ts +6 -0
  86. package/dist/types/enums/SectionType.d.ts +9 -0
  87. package/dist/types/hooks/useList.d.ts +13 -0
  88. package/dist/types/services/configService.d.ts +6 -0
  89. package/dist/types/services/googlePlacesNearbyService.d.ts +5 -0
  90. package/dist/types/services/listingAggregatorService.d.ts +12 -0
  91. package/dist/types/services/listingEntityService.d.ts +6 -0
  92. package/dist/types/services/listingService.d.ts +9 -0
  93. package/dist/types/services/recruiterService.d.ts +6 -0
  94. package/dist/types/types/Address.d.ts +7 -0
  95. package/dist/types/types/ContentSection.d.ts +8 -0
  96. package/dist/types/types/GetListingParams.d.ts +8 -0
  97. package/dist/types/types/LatLng.d.ts +4 -0
  98. package/dist/types/types/ListingEntity.d.ts +10 -0
  99. package/dist/types/types/ListingFields.d.ts +20 -0
  100. package/dist/types/types/Listings.d.ts +31 -0
  101. package/dist/types/types/Recruiter.d.ts +9 -0
  102. package/dist/types/types/SimilarListing.d.ts +24 -0
  103. package/dist/types/types/config/Colors.d.ts +8 -0
  104. package/dist/types/types/config/MapConfig.d.ts +29 -0
  105. package/dist/types/types/config/PointsOfInterestConfig.d.ts +13 -0
  106. package/dist/types/types/config/SearchConfig.d.ts +4 -0
  107. package/dist/types/util/filterUtil.d.ts +28 -0
  108. package/dist/types/util/loading.d.ts +3 -0
  109. package/dist/types/util/localStorageUtil.d.ts +3 -0
  110. package/dist/types/util/mapUtil.d.ts +15 -0
  111. package/dist/types/util/sortUtil.d.ts +1 -0
  112. package/dist/types/util/stringUtils.d.ts +1 -0
  113. package/dist/util/filterUtil.js +1 -3
  114. package/dist/util/filterUtil.js.map +1 -1
  115. package/dist/util/localStorageUtil.js +37 -28
  116. package/dist/util/localStorageUtil.js.map +1 -1
  117. package/dist/util/mapUtil.js.map +1 -1
  118. package/package.json +23 -17
  119. package/rollup.config.mjs +23 -19
  120. package/src/apis/{hcApi.js → hcApi.ts} +27 -11
  121. package/src/components/HireControlMap.js +132 -129
  122. package/src/components/modules/accordions/MapAccordionItem.js +32 -74
  123. package/src/components/modules/filter/index.js +89 -89
  124. package/src/components/modules/filter/radio-item.js +0 -1
  125. package/src/components/modules/jobListing/listing-details-container.js +40 -0
  126. package/src/components/modules/jobListing/listing-details.js +209 -99
  127. package/src/components/modules/{maps/list → list}/field-mapper.js +114 -112
  128. package/src/components/modules/{maps/list → list}/header.js +49 -47
  129. package/src/components/modules/list/index.tsx +83 -0
  130. package/src/components/modules/{maps/list → list}/item-expand-card/index.js +24 -22
  131. package/src/components/modules/list/item-list.tsx +198 -0
  132. package/src/components/modules/list/list-item/index.js +70 -0
  133. package/src/components/modules/list/list-item/list-item-container.js +43 -0
  134. package/src/components/modules/{maps/list/list-item/index.js → list/list-item/list-item.js} +32 -38
  135. package/src/components/modules/maps/map-list.js +74 -74
  136. package/src/contexts/mapContext.tsx +129 -0
  137. package/src/contexts/mapListContext.tsx +297 -0
  138. package/src/enums/SectionType.ts +9 -0
  139. package/src/services/{configService.js → configService.ts} +16 -16
  140. package/src/services/{googlePlacesNearbyService.js → googlePlacesNearbyService.ts} +11 -2
  141. package/src/services/listingAggregatorService.ts +76 -0
  142. package/src/services/listingEntityService.ts +16 -0
  143. package/src/services/listingService.ts +40 -0
  144. package/src/services/{recruiterService.js → recruiterService.ts} +18 -17
  145. package/src/types/Address.ts +7 -0
  146. package/src/types/ContentSection.ts +9 -0
  147. package/src/types/GetListingParams.ts +8 -0
  148. package/src/types/LatLng.ts +4 -0
  149. package/src/types/ListingEntity.ts +11 -0
  150. package/src/types/ListingFields.ts +20 -0
  151. package/src/types/Listings.ts +32 -0
  152. package/src/types/Recruiter.ts +9 -0
  153. package/src/types/SimilarListing.ts +24 -0
  154. package/src/types/config/Colors.ts +8 -0
  155. package/src/types/config/MapConfig.ts +30 -0
  156. package/src/types/config/PointsOfInterestConfig.ts +13 -0
  157. package/src/types/config/SearchConfig.ts +4 -0
  158. package/src/util/filterUtil.js +239 -239
  159. package/src/util/localStorageUtil.ts +34 -0
  160. package/src/util/mapUtil.js +91 -91
  161. package/tsconfig.json +23 -0
  162. package/dist/components/modules/maps/list/field-mapper.js.map +0 -1
  163. package/dist/components/modules/maps/list/header-item.js.map +0 -1
  164. package/dist/components/modules/maps/list/header.js.map +0 -1
  165. package/dist/components/modules/maps/list/index.js +0 -102
  166. package/dist/components/modules/maps/list/index.js.map +0 -1
  167. package/dist/components/modules/maps/list/item-expand-card/index.js.map +0 -1
  168. package/dist/components/modules/maps/list/item-expand-card/recruiter-contact-nav.js.map +0 -1
  169. package/dist/components/modules/maps/list/item-expand-card/recruiter-details.js.map +0 -1
  170. package/dist/components/modules/maps/list/item-expand-card/recruiter-headshot.js.map +0 -1
  171. package/dist/components/modules/maps/list/list-item/index.js.map +0 -1
  172. package/dist/services/_virtual/_rollupPluginBabelHelpers.js +0 -372
  173. package/dist/services/_virtual/_rollupPluginBabelHelpers.js.map +0 -1
  174. package/dist/services/apis/hcApi.js +0 -189
  175. package/dist/services/apis/hcApi.js.map +0 -1
  176. package/dist/services/clientToken.js +0 -7
  177. package/dist/services/clientToken.js.map +0 -1
  178. package/dist/services/styles/index.css +0 -3
  179. package/src/components/modules/maps/list/index.js +0 -112
  180. package/src/contexts/mapContext.js +0 -101
  181. package/src/contexts/mapListContext.js +0 -242
  182. package/src/services/listingAggregatorService.js +0 -50
  183. package/src/services/listingEntityService.js +0 -15
  184. package/src/services/listingService.js +0 -26
  185. package/src/util/localStorageUtil.js +0 -27
  186. /package/dist/components/modules/{maps/list → list}/item-expand-card/recruiter-headshot.js +0 -0
  187. /package/src/components/modules/{maps/list → list}/header-item.js +0 -0
  188. /package/src/components/modules/{maps/list → list}/item-expand-card/recruiter-contact-nav.js +0 -0
  189. /package/src/components/modules/{maps/list → list}/item-expand-card/recruiter-details.js +0 -0
  190. /package/src/components/modules/{maps/list → list}/item-expand-card/recruiter-headshot.js +0 -0
@@ -1,112 +1,114 @@
1
- import React from 'react';
2
-
3
- import Grid from '~/components/modules/grid';
4
- import Icon from '~/components/modules/icon';
5
- import PillWrapper from '~/components/modules/buttons/pill-wrapper';
6
-
7
- import { capitalize } from '~/util/stringUtils';
8
-
9
- const FieldMapper = ({
10
- item,
11
- fieldsShown,
12
- specialFeatures,
13
- handleFavouriteClick,
14
- isFavorite
15
- }) => {
16
- const orderedFields = fieldsShown.filter(field => field in item.fields);
17
-
18
- const specialFeaturePills = field => {
19
- return field === 'position' && specialFeatures &&
20
- Object.entries(specialFeatures).map(([featureKey, featureLabel]) => {
21
- return item.fields[featureKey] === 1 && (
22
- <PillWrapper key={featureKey}>{featureLabel}</PillWrapper>
23
- );
24
- });
25
- };
26
-
27
- return (
28
- <>
29
- {orderedFields.map(field => {
30
- let value = item.fields[field];
31
- return (
32
- <Grid.Item
33
- key={field}
34
- className={`
35
- hc-hidden md:hc-block
36
- ${field.toLowerCase() === "position" ? "hc-col-span-2 hc-text-balance hc-pr-2 hc-font-semibold" : "hc-col-span-1"}
37
- `}
38
- >
39
- <span className="hc-sr-only">{capitalize(field)}</span>
40
- {value}
41
- <br />
42
- {specialFeaturePills(field)}
43
- </Grid.Item>
44
- );
45
- })}
46
- <Grid.Item className="md:hc-hidden">
47
- {fieldsShown.includes("position") &&
48
- <>
49
- <div className="hc-flex hc-items-start">
50
- <div className="hc-flex hc-justify-between hc-items-center hc-min-w-[100%]"> {/* Use percentage for minimum width */}
51
- <h3 className="hc-font-bold hc-mb-3 hc-flex-1">{item.fields.position}</h3>
52
- <div className="hc-flex hc-justify-end hc-pb-2">
53
- <Icon
54
- icon={isFavorite ? "mdi:heart" : "mdi:heart-outline"}
55
- size="hc-size-3.5"
56
- iconClasses={isFavorite ? "hc-text-primary" : ""}
57
- className={`hc-transition-opacity hc-duration-300 hc-cursor-pointer
58
- ${isFavorite ? "hc-opacity-100" : "hc-text-uiText/60 group-hover:hc-opacity-100"}
59
- `}
60
- onClick={e => handleFavouriteClick(e)}
61
- />
62
- </div>
63
- </div>
64
- </div>
65
- {specialFeatures && <div className='hc-pb-4'>{specialFeaturePills("position", true)} </div>}
66
- </>
67
- }
68
-
69
- <ul className="hc-space-y-2 hc-text-xs">
70
- {[
71
- {
72
- field: "category",
73
- name: "Category",
74
- icon: "icon-park-solid:tree-list"
75
- },
76
- {
77
- field: "schedule",
78
- name: "Schedule",
79
- icon: "gravity-ui:clock-fill"
80
- },
81
- {
82
- field: "cityState",
83
- name: "Location",
84
- icon: "fluent:location-16-filled"
85
- },
86
- {
87
- field: "travelTime",
88
- name: "Commute",
89
- icon: "ri:pin-distance-fill"
90
- }
91
- ].map(listItem => (
92
- (fieldsShown.includes(listItem.field) && item.fields[listItem.field]) &&
93
- <li
94
- key={listItem.field}
95
- className="hc-flex hc-gap-2"
96
- >
97
- <Icon
98
- icon={listItem.icon}
99
- size="hc-size-3.5"
100
- className="hc-text-uiAccent/30"
101
- />
102
- <span className="hc-sr-only">{listItem.name}</span>
103
- {item.fields[listItem.field]}
104
- </li>
105
- ))}
106
- </ul>
107
- </Grid.Item>
108
- </>
109
- );
110
- };
111
-
112
- export default FieldMapper;
1
+ import React from 'react';
2
+
3
+ import Grid from '~/components/modules/grid';
4
+ import Icon from '~/components/modules/icon';
5
+ import PillWrapper from '~/components/modules/buttons/pill-wrapper';
6
+
7
+ import { capitalize } from '~/util/stringUtils';
8
+
9
+ const FieldMapper = ({
10
+ item,
11
+ fieldsShown,
12
+ specialFeatures,
13
+ handleFavouriteClick,
14
+ isFavorite,
15
+ includeFavorite
16
+ }) => {
17
+ const orderedFields = fieldsShown.filter(field => field in item.fields);
18
+
19
+ const specialFeaturePills = field => {
20
+ return field === 'position' && specialFeatures &&
21
+ Object.entries(specialFeatures).map(([featureKey, featureLabel]) => {
22
+ return item.fields[featureKey] === 1 && (
23
+ <PillWrapper key={featureKey}>{featureLabel}</PillWrapper>
24
+ );
25
+ });
26
+ };
27
+
28
+ return (
29
+ <>
30
+ {orderedFields.map(field => {
31
+ let value = item.fields[field];
32
+ return (
33
+ <Grid.Item
34
+ key={field}
35
+ className={`
36
+ hc-hidden md:hc-block
37
+ ${field.toLowerCase() === "position" ? "hc-col-span-2 hc-text-balance hc-pr-2 hc-font-semibold" : "hc-col-span-1"}
38
+ `}
39
+ >
40
+ <span className="hc-sr-only">{capitalize(field)}</span>
41
+ {value}
42
+ <br />
43
+ {specialFeaturePills(field)}
44
+ </Grid.Item>
45
+ );
46
+ })}
47
+ <Grid.Item className="md:hc-hidden">
48
+ {fieldsShown.includes("position") &&
49
+ <>
50
+ <div className="hc-flex hc-items-start">
51
+ <div className="hc-flex hc-justify-between hc-items-center hc-min-w-[100%]"> {/* Use percentage for minimum width */}
52
+ <h3 className="hc-font-bold hc-mb-3 hc-flex-1">{item.fields.position}</h3>
53
+ {includeFavorite && <div className="hc-flex hc-justify-end hc-pb-2">
54
+ <Icon
55
+ icon={isFavorite ? "mdi:heart" : "mdi:heart-outline"}
56
+ size="hc-size-3.5"
57
+ iconClasses={isFavorite ? "hc-text-primary" : ""}
58
+ className={`hc-transition-opacity hc-duration-300 hc-cursor-pointer
59
+ ${isFavorite ? "hc-opacity-100" : "hc-text-uiText/60 group-hover:hc-opacity-100"}
60
+ `}
61
+ onClick={e => handleFavouriteClick(e)}
62
+ />
63
+ </div>
64
+ }
65
+ </div>
66
+ </div>
67
+ {specialFeatures && <div className='hc-pb-4'>{specialFeaturePills("position", true)} </div>}
68
+ </>
69
+ }
70
+
71
+ <ul className="hc-space-y-2 hc-text-xs">
72
+ {[
73
+ {
74
+ field: "category",
75
+ name: "Category",
76
+ icon: "icon-park-solid:tree-list"
77
+ },
78
+ {
79
+ field: "schedule",
80
+ name: "Schedule",
81
+ icon: "gravity-ui:clock-fill"
82
+ },
83
+ {
84
+ field: "cityState",
85
+ name: "Location",
86
+ icon: "fluent:location-16-filled"
87
+ },
88
+ {
89
+ field: "travelTime",
90
+ name: "Commute",
91
+ icon: "ri:pin-distance-fill"
92
+ }
93
+ ].map(listItem => (
94
+ (fieldsShown.includes(listItem.field) && item.fields[listItem.field]) &&
95
+ <li
96
+ key={listItem.field}
97
+ className="hc-flex hc-gap-2"
98
+ >
99
+ <Icon
100
+ icon={listItem.icon}
101
+ size="hc-size-3.5"
102
+ className="hc-text-uiAccent/30"
103
+ />
104
+ <span className="hc-sr-only">{listItem.name}</span>
105
+ {item.fields[listItem.field]}
106
+ </li>
107
+ ))}
108
+ </ul>
109
+ </Grid.Item>
110
+ </>
111
+ );
112
+ };
113
+
114
+ export default FieldMapper;
@@ -1,47 +1,49 @@
1
- import React from 'react';
2
- import { twMerge } from 'tailwind-merge';
3
-
4
- import Grid from '~/components/modules/grid';
5
- import HeaderItem from '~/components/modules/maps/list/header-item';
6
-
7
- const ListHeader = ({
8
- className,
9
- fieldsShown,
10
- fieldNames,
11
- fieldIsSortable = true,
12
- setSortSetting,
13
- sortSetting
14
- }) => {
15
- return (
16
- <Grid
17
- columns="hc-grid-flow-col hc-auto-cols-fr"
18
- gap="hc-gap-0"
19
- isAnimated={false}
20
- className={twMerge`
21
- hc-hidden md:hc-grid hc-bg-uiAccent/10 hc-border-b hc-border-uiAccent/10 hc-sticky hc-top-0 hc-z-10
22
- ${className ?? ""}
23
- `}
24
- >
25
- {fieldsShown.map(field => (
26
- <HeaderItem
27
- key={field}
28
- isSortable={fieldIsSortable}
29
- sortSetting={sortSetting}
30
- field={field}
31
- setSortSetting={setSortSetting}
32
- >
33
- {fieldNames[field]}
34
- </HeaderItem>
35
- ))}
36
- <HeaderItem key={"favorite"}
37
- isSortable={false}
38
- field={"favorite"}
39
- >
40
- Favorite
41
- </HeaderItem>
42
-
43
- </Grid>
44
- );
45
- };
46
-
47
- export default ListHeader;
1
+ import React from 'react';
2
+ import { twMerge } from 'tailwind-merge';
3
+
4
+ import Grid from '~/components/modules/grid';
5
+ import HeaderItem from '~/components/modules/list/header-item';
6
+
7
+ const ListHeader = ({
8
+ className,
9
+ fieldsShown,
10
+ fieldNames,
11
+ fieldIsSortable = true,
12
+ setSortSetting,
13
+ sortSetting,
14
+ includeFavorite = false
15
+ }) => {
16
+ return (
17
+ <Grid
18
+ columns="hc-grid-flow-col hc-auto-cols-fr"
19
+ gap="hc-gap-0"
20
+ isAnimated={false}
21
+ className={twMerge`
22
+ hc-hidden md:hc-grid hc-bg-uiAccent/10 hc-border-b hc-border-uiAccent/10 hc-sticky hc-top-0 hc-z-10
23
+ ${className ?? ""}
24
+ `}
25
+ >
26
+ {fieldsShown.map(field => (
27
+ <HeaderItem
28
+ key={field}
29
+ isSortable={fieldIsSortable}
30
+ sortSetting={sortSetting}
31
+ field={field}
32
+ setSortSetting={setSortSetting}
33
+ >
34
+ {fieldNames[field]}
35
+ </HeaderItem>
36
+ ))}
37
+ { includeFavorite == true &&
38
+ <HeaderItem key={"favorite"}
39
+ isSortable={false}
40
+ field={"favorite"}
41
+ >
42
+ Favorite
43
+ </HeaderItem>
44
+ }
45
+ </Grid>
46
+ );
47
+ };
48
+
49
+ export default ListHeader;
@@ -0,0 +1,83 @@
1
+ import React from 'react';
2
+ import useListLogic from '~/hooks/useList';
3
+ import { useMap } from '~/contexts/mapContext';
4
+ import { useMapList } from '~/contexts/mapListContext';
5
+ import { useTrackEvent } from '~/contexts/trackEventContext';
6
+ import ItemsList from '~/components/modules/list/item-list';
7
+ import Accordion from '~/components/modules/accordions/default';
8
+ import MapAccordionItemContainer from '~/components/modules/list/list-item';
9
+ import { dynamicSort } from '~/util/sortUtil';
10
+ import { Listing } from '~/types/Listings';
11
+ import ListingDetailsContainer from '../jobListing/listing-details-container';
12
+
13
+ interface ItemsListContainerProps {
14
+ fieldNames: Record<string, string>;
15
+ showMap: boolean;
16
+ fieldsShown: string[];
17
+ specialFeatures: any;
18
+ }
19
+
20
+ const ItemsListContainer: React.FC<ItemsListContainerProps> = ({
21
+ fieldNames,
22
+ showMap,
23
+ fieldsShown,
24
+ specialFeatures
25
+ }) => {
26
+ const { mapItems, filteredListings, loading, commuteLocation, sortSetting, setSortSetting } = useMapList();
27
+ const { itemLimit, loader, scrollContainerRef, itemRefs } = useListLogic(filteredListings as any);
28
+ const { selectedListItem } = useMap();
29
+ const { trackEvent, eventTypes } = useTrackEvent() as any;
30
+ const itemExpandedContent = (item: any, recruiters: any) =>
31
+ item ? <ListingDetailsContainer item={item} recruiters={recruiters} /> : null;
32
+
33
+ if (!fieldsShown.includes('travelTime') && commuteLocation != null && Object.entries(commuteLocation).length > 0) {
34
+ fieldsShown.push('travelTime');
35
+ fieldNames['travelTime'] = 'Commute';
36
+ } else if (fieldsShown.includes('travelTime') && !commuteLocation) {
37
+ fieldsShown = fieldsShown.filter(x => x !== 'travelTime');
38
+ }
39
+
40
+ const setTrackedSortSetting = (sortSetting: { field: string; type: string }) => {
41
+ trackEvent(eventTypes.LIST_SORTED, sortSetting);
42
+ setSortSetting(sortSetting);
43
+ };
44
+
45
+ return (
46
+ <ItemsList
47
+ fieldNames={fieldNames}
48
+ showMap={showMap}
49
+ fieldsShown={fieldsShown}
50
+ filteredListings={filteredListings}
51
+ loading={loading}
52
+ sortSetting={sortSetting}
53
+ setSortSetting={setTrackedSortSetting}
54
+ itemLimit={itemLimit}
55
+ loader={loader}
56
+ scrollContainerRef={scrollContainerRef}
57
+ itemRefs={itemRefs}
58
+ selectedListItem={selectedListItem}
59
+ itemExpandedContent={itemExpandedContent}
60
+ includeFavorite={true}
61
+ >
62
+ <Accordion className="hc-divide-y hc-divide-uiAccent/10 hc-z-[1000]" defaultValue={selectedListItem?.id}>
63
+ {(sortSetting ? dynamicSort(filteredListings, sortSetting.field, sortSetting.type) : filteredListings)
64
+ .slice(0, itemLimit)
65
+ .map((item: Listing) => (
66
+ <MapAccordionItemContainer
67
+ key={item.id}
68
+ showMap={showMap}
69
+ item={item}
70
+ itemRefs={itemRefs}
71
+ fieldsShown={fieldsShown}
72
+ itemExpandedContent={itemExpandedContent}
73
+ specialFeatures={specialFeatures}
74
+ isActive={selectedListItem?.id === item.id}
75
+ hasListItemSelected={selectedListItem != null}
76
+ />
77
+ ))}
78
+ </Accordion>
79
+ </ItemsList>
80
+ );
81
+ };
82
+
83
+ export default ItemsListContainer;
@@ -1,22 +1,24 @@
1
- import React from 'react';
2
- import { twMerge } from 'tailwind-merge';
3
-
4
- const CardItemExpand = ({
5
- className,
6
- content,
7
- ...props
8
- }) => {
9
- return (
10
- <div
11
- className={twMerge(
12
- 'hc-flex hc-flex-col lg:hc-flex-row hc-flex-wrap hc-items-stretch hc-gap-x-4 hc-w-full lg:hc-pt-2 hc-border-t hc-border-uiAccent/20',
13
- className ?? ''
14
- )}
15
- {...props}
16
- >
17
- {content}
18
- </div>
19
- );
20
- };
21
-
22
- export default CardItemExpand;
1
+ import React from 'react';
2
+ import { twMerge } from 'tailwind-merge';
3
+
4
+ const CardItemExpand = ({
5
+ className,
6
+ content,
7
+ ...props
8
+ }) => {
9
+ console.log(content);
10
+ console.log("cardItem render");
11
+ return (
12
+ <div
13
+ className={twMerge(
14
+ 'hc-flex hc-flex-col lg:hc-flex-row hc-flex-wrap hc-items-stretch hc-gap-x-4 hc-w-full lg:hc-pt-2 hc-border-t hc-border-uiAccent/20',
15
+ className ?? ''
16
+ )}
17
+ {...props}
18
+ >
19
+ {content}
20
+ </div>
21
+ );
22
+ };
23
+
24
+ export default CardItemExpand;
@@ -0,0 +1,198 @@
1
+ // import React, { RefObject } from 'react';
2
+ // import Accordion from '~/components/modules/accordions/default';
3
+ // import Header from '~/components/modules/list/header';
4
+ // import MapAccordionItemContainer from '~/components/modules/list/list-item';
5
+ // import Sort from '~/components/modules/filter/sort';
6
+ // import ListingDetails from '~/components/modules/jobListing/listing-details';
7
+ // import Loading from "~/util/loading";
8
+ // import { dynamicSort } from '~/util/sortUtil';
9
+ // import { IListing } from '~/interfaces/IListings';
10
+ // import { IMapConfig } from '~/interfaces/config/IMapConfig';
11
+
12
+ // interface ItemsListProps {
13
+ // fieldNames: Record<string, string>;
14
+ // showMap: boolean;
15
+ // fieldsShown: string[];
16
+ // specialFeatures: any;
17
+ // mapItems: any;
18
+ // filteredListings: IListing[];
19
+ // loading: boolean;
20
+ // sortSetting: any;
21
+ // setSortSetting: (setting: any) => void;
22
+ // itemLimit: number;
23
+ // loader: RefObject<HTMLDivElement>;
24
+ // scrollContainerRef: RefObject<HTMLDivElement>;
25
+ // itemRefs: any;
26
+ // selectedListItem: IListing | null;
27
+ // itemExpandedContent: (item: IListing, recruiters: any) => JSX.Element | null;
28
+ // }
29
+
30
+ // const ItemsList: React.FC<ItemsListProps> = ({
31
+ // fieldNames,
32
+ // showMap,
33
+ // fieldsShown,
34
+ // specialFeatures,
35
+ // mapItems,
36
+ // filteredListings,
37
+ // loading,
38
+ // sortSetting,
39
+ // setSortSetting,
40
+ // itemLimit,
41
+ // loader,
42
+ // scrollContainerRef,
43
+ // itemRefs,
44
+ // selectedListItem,
45
+ // itemExpandedContent
46
+ // }) => (
47
+ // <div className="hc-relative hc-bg-white md:hc-px-4 hc-flex hc-flex-col">
48
+ // <div className="hc-flex hc-flex-wrap hc-items-center hc-justify-between hc-gap-4 md:hc-mb-2 hc-p-3 md:hc-p-0 hc-bg-uiAccent/10 md:hc-bg-transparent hc-border-b md:hc-border-none hc-border-uiAccent/20">
49
+ // <h2 className="hc-text-gray-500 hc-font-semibold hc-text-xs md:hc-text-sm">
50
+ // {loading && <span>Loading...</span>}
51
+ // {!loading && <span>{filteredListings.length} results</span>}
52
+ // </h2>
53
+ // <div className="hc-block md:hc-hidden">
54
+ // <Sort
55
+ // className={''}
56
+ // fields={fieldsShown}
57
+ // setSortSetting={setSortSetting}
58
+ // fieldNames={fieldNames}
59
+ // />
60
+ // </div>
61
+ // </div>
62
+ // <div>
63
+ // <Header
64
+ // className={''}
65
+ // setSortSetting={setSortSetting}
66
+ // sortSetting={sortSetting}
67
+ // fieldsShown={fieldsShown}
68
+ // fieldNames={fieldNames}
69
+ // />
70
+ // </div>
71
+ // <div
72
+ // ref={scrollContainerRef}
73
+ // className={`
74
+ // hc-flex-grow hc-overflow-y-auto
75
+ // ${showMap ? "md:hc-max-h-45vh hc-max-h-[100vh]" : "md:hc-max-h-95vh hc-max-h-[95vh]"}
76
+ // `}
77
+ // >
78
+ // {loading ? (
79
+ // <div className="hc-flex hc-justify-center hc-items-center hc-pt-20">
80
+ // <Loading />
81
+ // </div>
82
+ // ) : (
83
+ // <Accordion className="hc-divide-y hc-divide-uiAccent/10 hc-z-[1000]" defaultValue={selectedListItem?.id}>
84
+ // {(sortSetting ? dynamicSort(filteredListings, sortSetting.field, sortSetting.type) : filteredListings).slice(0, itemLimit).map((item: IListing) => (
85
+ // <MapAccordionItemContainer
86
+ // key={item.id}
87
+ // showMap={showMap}
88
+ // item={item}
89
+ // itemRefs={itemRefs}
90
+ // fieldsShown={fieldsShown}
91
+ // itemExpandedContent={itemExpandedContent}
92
+ // specialFeatures={specialFeatures}
93
+ // mapItems={mapItems}
94
+ // isActive={selectedListItem?.id === item.id}
95
+ // hasListItemSelected={selectedListItem != null}
96
+ // />
97
+ // ))}
98
+
99
+ // </Accordion>
100
+ // )}
101
+ // <div ref={loader} style={{ height: "100px", textAlign: "center" }}>
102
+ // {filteredListings.length >= itemLimit && <Loading />}
103
+ // </div>
104
+ // </div>
105
+ // </div>
106
+ // );
107
+
108
+ // export default ItemsList;
109
+ import React, { RefObject, ReactNode } from 'react';
110
+ import Header from '~/components/modules/list/header';
111
+ import MapAccordionItemContainer from '~/components/modules/list/list-item';
112
+ import Sort from '~/components/modules/filter/sort';
113
+ import Loading from "~/util/loading";
114
+ import { dynamicSort } from '~/util/sortUtil';
115
+ import { Listing } from '~/types/Listings';
116
+
117
+ interface ItemsListProps {
118
+ fieldNames: Record<string, string>;
119
+ showMap: boolean;
120
+ fieldsShown: string[];
121
+ filteredListings: Listing[];
122
+ loading: boolean;
123
+ sortSetting: any;
124
+ setSortSetting: (setting: any) => void;
125
+ itemLimit: number;
126
+ loader: RefObject<HTMLDivElement>;
127
+ scrollContainerRef: RefObject<HTMLDivElement>;
128
+ itemRefs: any;
129
+ selectedListItem: Listing | null;
130
+ itemExpandedContent: (item: Listing, recruiters: any) => JSX.Element | null;
131
+ children: ReactNode;
132
+ includeFavorite: boolean;
133
+ }
134
+
135
+ const ItemsList: React.FC<ItemsListProps> = ({
136
+ fieldNames,
137
+ showMap,
138
+ fieldsShown,
139
+ filteredListings,
140
+ loading,
141
+ sortSetting,
142
+ setSortSetting,
143
+ itemLimit,
144
+ loader,
145
+ scrollContainerRef,
146
+ itemRefs,
147
+ selectedListItem,
148
+ itemExpandedContent,
149
+ includeFavorite = false,
150
+ children // Destructure children
151
+ }) => (
152
+ <div className="hc-relative hc-bg-white md:hc-px-4 hc-flex hc-flex-col">
153
+ <div className="hc-flex hc-flex-wrap hc-items-center hc-justify-between hc-gap-4 md:hc-mb-2 hc-p-3 md:hc-p-0 hc-bg-uiAccent/10 md:hc-bg-transparent hc-border-b md:hc-border-none hc-border-uiAccent/20">
154
+ <h2 className="hc-text-gray-500 hc-font-semibold hc-text-xs md:hc-text-sm">
155
+ {loading && <span>Loading...</span>}
156
+ {!loading && <span>{filteredListings.length} results</span>}
157
+ </h2>
158
+ <div className="hc-block md:hc-hidden">
159
+ <Sort
160
+ className={''}
161
+ fields={fieldsShown}
162
+ setSortSetting={setSortSetting}
163
+ fieldNames={fieldNames}
164
+ />
165
+ </div>
166
+ </div>
167
+ <div>
168
+ <Header
169
+ className={''}
170
+ setSortSetting={setSortSetting}
171
+ sortSetting={sortSetting}
172
+ fieldsShown={fieldsShown}
173
+ fieldNames={fieldNames}
174
+ includeFavorite={includeFavorite}
175
+ />
176
+ </div>
177
+ <div
178
+ ref={scrollContainerRef}
179
+ className={`
180
+ hc-flex-grow hc-overflow-y-auto
181
+ ${showMap ? "md:hc-max-h-45vh hc-max-h-[100vh]" : "md:hc-max-h-95vh hc-max-h-[95vh]"}
182
+ `}
183
+ >
184
+ {loading ? (
185
+ <div className="hc-flex hc-justify-center hc-items-center hc-pt-20">
186
+ <Loading />
187
+ </div>
188
+ ) : (
189
+ children
190
+ )}
191
+ <div ref={loader} style={{ height: "100px", textAlign: "center" }}>
192
+ {filteredListings.length >= itemLimit && <Loading />}
193
+ </div>
194
+ </div>
195
+ </div>
196
+ );
197
+
198
+ export default ItemsList;