@abcagency/hc-ui-components 1.1.1 → 1.2.0

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 (234) hide show
  1. package/.editorconfig +12 -0
  2. package/.eslintrc +144 -0
  3. package/.prettierignore +3 -0
  4. package/dist/_virtual/_rollupPluginBabelHelpers.js +516 -0
  5. package/dist/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  6. package/dist/apis/hcApi.js +189 -0
  7. package/dist/apis/hcApi.js.map +1 -0
  8. package/dist/clientToken.js +10 -0
  9. package/dist/clientToken.js.map +1 -0
  10. package/dist/components/HireControlMap.js +129 -0
  11. package/dist/components/HireControlMap.js.map +1 -0
  12. package/dist/components/modules/accordions/MapAccordionItem.js +76 -0
  13. package/dist/components/modules/accordions/MapAccordionItem.js.map +1 -0
  14. package/dist/components/modules/accordions/default.js +108 -0
  15. package/dist/components/modules/accordions/default.js.map +1 -0
  16. package/dist/components/modules/accordions/filterItem.js +50 -0
  17. package/dist/components/modules/accordions/filterItem.js.map +1 -0
  18. package/dist/components/modules/accordions/filters.js +46 -0
  19. package/dist/components/modules/accordions/filters.js.map +1 -0
  20. package/dist/components/modules/buttons/button-group-apply.js +84 -0
  21. package/dist/components/modules/buttons/button-group-apply.js.map +1 -0
  22. package/dist/components/modules/buttons/commute-pill.js +18 -0
  23. package/dist/components/modules/buttons/commute-pill.js.map +1 -0
  24. package/dist/components/modules/buttons/default.js +145 -0
  25. package/dist/components/modules/buttons/default.js.map +1 -0
  26. package/dist/components/modules/buttons/items-pill.js +23 -0
  27. package/dist/components/modules/buttons/items-pill.js.map +1 -0
  28. package/dist/components/modules/buttons/pill-wrapper.js +20 -0
  29. package/dist/components/modules/buttons/pill-wrapper.js.map +1 -0
  30. package/dist/components/modules/buttons/show-all-button.js +39 -0
  31. package/dist/components/modules/buttons/show-all-button.js.map +1 -0
  32. package/dist/components/modules/cards/default.js +102 -0
  33. package/dist/components/modules/cards/default.js.map +1 -0
  34. package/dist/components/modules/cards/filter.js +38 -0
  35. package/dist/components/modules/cards/filter.js.map +1 -0
  36. package/dist/components/modules/dialogs/apply-dialog.js +46 -0
  37. package/dist/components/modules/dialogs/apply-dialog.js.map +1 -0
  38. package/dist/components/modules/filter/commute.js +184 -0
  39. package/dist/components/modules/filter/commute.js.map +1 -0
  40. package/dist/components/modules/filter/index.js +79 -0
  41. package/dist/components/modules/filter/index.js.map +1 -0
  42. package/dist/components/modules/filter/item.js +71 -0
  43. package/dist/components/modules/filter/item.js.map +1 -0
  44. package/dist/components/modules/filter/location.js +68 -0
  45. package/dist/components/modules/filter/location.js.map +1 -0
  46. package/dist/components/modules/filter/points-of-interest.js +38 -0
  47. package/dist/components/modules/filter/points-of-interest.js.map +1 -0
  48. package/dist/components/modules/filter/radio-item.js +46 -0
  49. package/dist/components/modules/filter/radio-item.js.map +1 -0
  50. package/dist/components/modules/filter/search.js +83 -0
  51. package/dist/components/modules/filter/search.js.map +1 -0
  52. package/dist/components/modules/filter/sort.js +93 -0
  53. package/dist/components/modules/filter/sort.js.map +1 -0
  54. package/dist/components/modules/grid.js +39 -0
  55. package/dist/components/modules/grid.js.map +1 -0
  56. package/dist/components/modules/icon.js +23 -0
  57. package/dist/components/modules/icon.js.map +1 -0
  58. package/dist/components/modules/jobListing/listing-details.js +69 -0
  59. package/dist/components/modules/jobListing/listing-details.js.map +1 -0
  60. package/dist/components/modules/maps/info-window-card.js +14 -0
  61. package/dist/components/modules/maps/info-window-card.js.map +1 -0
  62. package/dist/components/modules/maps/info-window-content.js +39 -0
  63. package/dist/components/modules/maps/info-window-content.js.map +1 -0
  64. package/dist/components/modules/maps/list/field-mapper.js +88 -0
  65. package/dist/components/modules/maps/list/field-mapper.js.map +1 -0
  66. package/dist/components/modules/maps/list/header-item.js +59 -0
  67. package/dist/components/modules/maps/list/header-item.js.map +1 -0
  68. package/dist/components/modules/maps/list/header.js +37 -0
  69. package/dist/components/modules/maps/list/header.js.map +1 -0
  70. package/dist/components/modules/maps/list/index.js +93 -0
  71. package/dist/components/modules/maps/list/index.js.map +1 -0
  72. package/dist/components/modules/maps/list/item-expand-card/index.js +16 -0
  73. package/dist/components/modules/maps/list/item-expand-card/index.js.map +1 -0
  74. package/dist/components/modules/maps/list/item-expand-card/recruiter-contact-nav.js +38 -0
  75. package/dist/components/modules/maps/list/item-expand-card/recruiter-contact-nav.js.map +1 -0
  76. package/dist/components/modules/maps/list/item-expand-card/recruiter-details.js +40 -0
  77. package/dist/components/modules/maps/list/item-expand-card/recruiter-details.js.map +1 -0
  78. package/dist/components/modules/maps/list/item-expand-card/recruiter-headshot.js +20 -0
  79. package/dist/components/modules/maps/list/item-expand-card/recruiter-headshot.js.map +1 -0
  80. package/dist/components/modules/maps/list/list-item/index.js +98 -0
  81. package/dist/components/modules/maps/list/list-item/index.js.map +1 -0
  82. package/dist/components/modules/maps/map-list.js +57 -0
  83. package/dist/components/modules/maps/map-list.js.map +1 -0
  84. package/dist/components/modules/maps/map-marker.js +85 -0
  85. package/dist/components/modules/maps/map-marker.js.map +1 -0
  86. package/dist/components/modules/maps/map.js +201 -0
  87. package/dist/components/modules/maps/map.js.map +1 -0
  88. package/dist/components/modules/maps/place-marker.js +37 -0
  89. package/dist/components/modules/maps/place-marker.js.map +1 -0
  90. package/dist/components/modules/maps/tabs.js +84 -0
  91. package/dist/components/modules/maps/tabs.js.map +1 -0
  92. package/dist/constants/placeTypes.js +11 -0
  93. package/dist/constants/placeTypes.js.map +1 -0
  94. package/dist/contexts/mapContext.js +133 -0
  95. package/dist/contexts/mapContext.js.map +1 -0
  96. package/dist/contexts/mapListContext.js +278 -0
  97. package/dist/contexts/mapListContext.js.map +1 -0
  98. package/dist/contexts/placesContext.js +152 -0
  99. package/dist/contexts/placesContext.js.map +1 -0
  100. package/dist/hooks/useList.js +119 -0
  101. package/dist/hooks/useList.js.map +1 -0
  102. package/dist/index.js +2 -4536
  103. package/dist/index.js.map +1 -0
  104. package/dist/services/_virtual/_rollupPluginBabelHelpers.js +372 -0
  105. package/dist/services/_virtual/_rollupPluginBabelHelpers.js.map +1 -0
  106. package/dist/services/apis/hcApi.js +189 -0
  107. package/dist/services/apis/hcApi.js.map +1 -0
  108. package/dist/services/clientToken.js +7 -0
  109. package/dist/services/clientToken.js.map +1 -0
  110. package/dist/services/configService.js +33 -0
  111. package/dist/services/configService.js.map +1 -0
  112. package/dist/services/googlePlacesNearbyService.js +61 -0
  113. package/dist/services/googlePlacesNearbyService.js.map +1 -0
  114. package/dist/services/listingAggregatorService.js +56 -0
  115. package/dist/services/listingAggregatorService.js.map +1 -0
  116. package/dist/services/listingEntityService.js +36 -0
  117. package/dist/services/listingEntityService.js.map +1 -0
  118. package/dist/services/listingService.js +60 -112
  119. package/dist/services/listingService.js.map +1 -0
  120. package/dist/services/recruiterService.js +36 -0
  121. package/dist/services/recruiterService.js.map +1 -0
  122. package/dist/services/styles/index.css +3 -0
  123. package/dist/styles/index.css +3 -0
  124. package/dist/util/filterUtil.js +213 -0
  125. package/dist/util/filterUtil.js.map +1 -0
  126. package/dist/util/loading.js +16 -0
  127. package/dist/util/loading.js.map +1 -0
  128. package/dist/util/localStorageUtil.js +32 -0
  129. package/dist/util/localStorageUtil.js.map +1 -0
  130. package/dist/util/mapIconUtil.js +73 -0
  131. package/dist/util/mapIconUtil.js.map +1 -0
  132. package/dist/util/mapUtil.js +76 -0
  133. package/dist/util/mapUtil.js.map +1 -0
  134. package/dist/util/sortUtil.js +33 -0
  135. package/dist/util/sortUtil.js.map +1 -0
  136. package/dist/util/stringUtils.js +9 -0
  137. package/dist/util/stringUtils.js.map +1 -0
  138. package/jsconfig.json +7 -0
  139. package/package.json +51 -38
  140. package/postcss.config.js +13 -15
  141. package/{src/tailwind/preset.default.js → preset.default.js} +15 -15
  142. package/rollup.config.mjs +87 -0
  143. package/src/apis/hcApi.js +93 -87
  144. package/src/clientToken.js +9 -9
  145. package/src/components/HireControlMap.js +120 -0
  146. package/src/components/modules/accordions/MapAccordionItem.js +72 -69
  147. package/src/components/modules/accordions/default.js +171 -173
  148. package/src/components/modules/accordions/filterItem.js +53 -53
  149. package/src/components/modules/accordions/filters.js +47 -44
  150. package/src/components/modules/buttons/button-group-apply.js +113 -85
  151. package/src/components/modules/buttons/commute-pill.js +22 -21
  152. package/src/components/modules/buttons/default.js +196 -196
  153. package/src/components/modules/buttons/items-pill.js +32 -31
  154. package/src/components/modules/buttons/pill-wrapper.js +27 -26
  155. package/src/components/modules/buttons/show-all-button.js +20 -20
  156. package/src/components/modules/cards/default.js +167 -168
  157. package/src/components/modules/cards/filter.js +56 -55
  158. package/src/components/modules/dialogs/apply-dialog.js +48 -47
  159. package/src/components/modules/filter/commute.js +148 -151
  160. package/src/components/modules/filter/index.js +87 -86
  161. package/src/components/modules/filter/item.js +76 -77
  162. package/src/components/modules/filter/location.js +71 -69
  163. package/src/components/modules/filter/points-of-interest.js +44 -43
  164. package/src/components/modules/filter/radio-item.js +53 -51
  165. package/src/components/modules/filter/search.js +92 -91
  166. package/src/components/modules/filter/sort.js +83 -83
  167. package/src/components/modules/grid.js +55 -56
  168. package/src/components/modules/icon.js +33 -33
  169. package/src/components/modules/jobListing/listing-details.js +94 -88
  170. package/src/components/modules/maps/info-window-card.js +17 -17
  171. package/src/components/modules/maps/info-window-content.js +58 -60
  172. package/src/components/modules/maps/list/field-mapper.js +112 -111
  173. package/src/components/modules/maps/list/header-item.js +91 -90
  174. package/src/components/modules/maps/list/header.js +47 -46
  175. package/src/components/modules/maps/list/index.js +107 -104
  176. package/src/components/modules/maps/list/item-expand-card/index.js +22 -21
  177. package/src/components/modules/maps/list/item-expand-card/recruiter-contact-nav.js +50 -48
  178. package/src/components/modules/maps/list/item-expand-card/recruiter-details.js +68 -67
  179. package/src/components/modules/maps/list/item-expand-card/recruiter-headshot.js +22 -22
  180. package/src/components/modules/maps/list/list-item/index.js +134 -133
  181. package/src/components/modules/maps/map-list.js +74 -73
  182. package/src/components/modules/maps/map-marker.js +86 -84
  183. package/src/components/modules/maps/map.js +229 -226
  184. package/src/components/modules/maps/place-marker.js +1 -1
  185. package/src/components/modules/maps/tabs.js +81 -79
  186. package/src/constants/placeTypes.js +8 -8
  187. package/src/contexts/mapContext.js +20 -19
  188. package/src/contexts/mapListContext.js +20 -15
  189. package/src/contexts/placesContext.js +4 -0
  190. package/src/hooks/useList.js +12 -10
  191. package/src/index.js +3 -103
  192. package/src/services/configService.js +16 -16
  193. package/src/services/googlePlacesNearbyService.js +33 -33
  194. package/src/services/listingAggregatorService.js +5 -4
  195. package/src/services/listingEntityService.js +2 -1
  196. package/src/services/listingService.js +27 -28
  197. package/src/services/recruiterService.js +17 -17
  198. package/src/styles/{globals.css → index.css} +23 -23
  199. package/src/util/arrayUtil.js +3 -3
  200. package/src/util/fieldMapper.js +22 -19
  201. package/src/util/filterUtil.js +19 -19
  202. package/src/util/loading.js +17 -17
  203. package/src/util/localStorageUtil.js +26 -26
  204. package/src/util/mapIconUtil.js +3 -3
  205. package/src/util/sortUtil.js +32 -32
  206. package/src/util/stringUtils.js +6 -6
  207. package/{src/tailwind/tailwind.config.js → tailwind.config.js} +126 -127
  208. package/dist/globals.css +0 -3
  209. package/dist/output.css +0 -784
  210. package/dist/services/globals.css +0 -3
  211. package/rollup.config.js +0 -68
  212. package/src/components/layout/footer.js +0 -34
  213. package/src/components/layout/header.js +0 -23
  214. package/src/components/layout/layout.js +0 -36
  215. package/src/components/modules/animations/slidein.js +0 -41
  216. package/src/components/modules/navigation/nav-link.js +0 -65
  217. package/src/components/modules/navigation/navbar.js +0 -106
  218. package/src/components/modules/navigation/skip-link.js +0 -21
  219. package/src/components/modules/navigation/social.js +0 -29
  220. package/src/components/modules/sections/default.js +0 -59
  221. package/src/components/modules/sections/sectionContext.js +0 -4
  222. package/src/hooks/useClickOutside.js +0 -16
  223. package/src/hooks/useEventListener.js +0 -25
  224. package/src/hooks/useEventTracker.js +0 -19
  225. package/src/hooks/useRefScrollProgress.js +0 -24
  226. package/src/hooks/useScript.js +0 -63
  227. package/src/hooks/useScrollDirection.js +0 -39
  228. package/src/hooks/useSectionTracker.js +0 -95
  229. package/src/hooks/useUserAgent.js +0 -43
  230. package/src/hooks/useWindowSize.js +0 -28
  231. package/src/index.css +0 -25
  232. package/src/styles/fonts.js +0 -0
  233. package/src/util/page-head.js +0 -62
  234. package/src/util/provider.js +0 -12
@@ -1,60 +1,58 @@
1
- import React from "react";
2
- import { DistanceMatrixService } from "@react-google-maps/api";
3
- import { useMapList } from "~/contexts/mapListContext";
4
- import { useMap } from "~/contexts/mapContext";
5
- import CommutePill from "../buttons/commute-pill";
6
-
7
- const InfoWindowContent = ({
8
- item,
9
- filterListingsByLocation
10
- }) => {
11
- const { setSelectedFilters, setQuery, setMobileTab, selectedFilters } = useMapList();
12
- let items = item && item.items ? Object.values(item.items) : null;
13
-
14
- if (!items || items.length < 0) {
15
- return;
16
- }
17
- const addressParts = [
18
- items[0].mapDetails?.address?.street,
19
- items[0].mapDetails?.address?.city,
20
- items[0].mapDetails?.address?.state,
21
- items[0].mapDetails?.address?.zip
22
- ];
23
- const fullAddress = addressParts.filter(Boolean).join(', ');
24
-
25
- return (
26
- <div className="hc-flex-auto hc-p-2">
27
- <div>
28
- <div>
29
- <h4 className="hc-text-lg hc-font-bold hc-leading-tight hc-mb-3">
30
- {items[0].mapDetails?.entityDisplayName}
31
- </h4>
32
- <p>
33
- {fullAddress}
34
- </p>
35
- <div className="hc-pt-2">
36
- <button
37
- className="hc-cursor-pointer hover:hc-opacity-70 hc-text-primary"
38
- onClick={() => {
39
- setMobileTab("listTab");
40
- setSelectedFilters({
41
- ...selectedFilters,
42
- cityState: {
43
- [items[0].fields.cityState]: true
44
- }
45
- });
46
- filterListingsByLocation();
47
- }}
48
- >
49
- {items.length > 1
50
- ? `View All ${items.length} jobs at this location`
51
- : `View job at this location`}
52
- </button>
53
- </div>
54
- </div>
55
- </div>
56
- </div>
57
- );
58
- };
59
-
60
- export default InfoWindowContent;
1
+ import React from 'react';
2
+
3
+ import { useMapList } from '~/contexts/mapListContext';
4
+
5
+ const InfoWindowContent = ({
6
+ item,
7
+ filterListingsByLocation
8
+ }) => {
9
+ const { setSelectedFilters, setQuery, setMobileTab, selectedFilters } = useMapList();
10
+ let items = item && item.items ? Object.values(item.items) : null;
11
+
12
+ if (!items || items.length < 0) {
13
+ return;
14
+ }
15
+ const addressParts = [
16
+ items[0].mapDetails?.address?.street,
17
+ items[0].mapDetails?.address?.city,
18
+ items[0].mapDetails?.address?.state,
19
+ items[0].mapDetails?.address?.zip
20
+ ];
21
+ const fullAddress = addressParts.filter(Boolean).join(', ');
22
+
23
+ return (
24
+ <div className="hc-flex-auto hc-p-2">
25
+ <div>
26
+ <div>
27
+ <h4 className="hc-text-lg hc-font-bold hc-leading-tight hc-mb-3">
28
+ {items[0].mapDetails?.entityDisplayName}
29
+ </h4>
30
+ <p>
31
+ {fullAddress}
32
+ </p>
33
+ <div className="hc-pt-2">
34
+ <button
35
+ className="hc-cursor-pointer hover:hc-opacity-70 hc-text-primary"
36
+ onClick={() => {
37
+ setMobileTab("listTab");
38
+ setSelectedFilters({
39
+ ...selectedFilters,
40
+ cityState: {
41
+ [items[0].fields.cityState]: true
42
+ }
43
+ });
44
+ filterListingsByLocation();
45
+ }}
46
+ >
47
+ {items.length > 1
48
+ ? `View All ${items.length} jobs at this location`
49
+ : `View job at this location`}
50
+ </button>
51
+ </div>
52
+ </div>
53
+ </div>
54
+ </div>
55
+ );
56
+ };
57
+
58
+ export default InfoWindowContent;
@@ -1,111 +1,112 @@
1
- import Grid from '~/components/modules/grid';
2
- import Icon from '~/components/modules/icon';
3
- import { capitalize } from '~/util/stringUtils';
4
- import PillWrapper from '~/components/modules/buttons/pill-wrapper';
5
- import CommutePill from "~/components/modules/buttons/commute-pill";
6
- import React from 'react'
7
-
8
- const FieldMapper = ({
9
- item,
10
- fieldsShown,
11
- specialFeatures,
12
- handleFavouriteClick,
13
- isFavorite
14
- }) => {
15
- const orderedFields = fieldsShown.filter(field => field in item.fields);
16
-
17
- const specialFeaturePills = (field, mobile = false) => {
18
- return field === 'position' && specialFeatures &&
19
- Object.entries(specialFeatures).map(([featureKey, featureLabel]) => {
20
- return item.fields[featureKey] === 1 && (
21
- <PillWrapper key={featureKey}>{featureLabel}</PillWrapper>
22
- );
23
- });
24
- };
25
-
26
- return (
27
- <>
28
- {orderedFields.map(field => {
29
- let value = item.fields[field];
30
- return (
31
- <Grid.Item
32
- key={field}
33
- className="hc-hidden md:hc-block"
34
- >
35
- <span className="hc-sr-only">{capitalize(field)}</span>
36
- {value}
37
- <br />
38
- {specialFeaturePills(field)}
39
- </Grid.Item>
40
- );
41
- })}
42
- <Grid.Item className="md:hc-hidden">
43
- {fieldsShown.includes("position") &&
44
- <> <div className="hc-flex hc-items-start">
45
- <div className="hc-flex hc-justify-between hc-items-center hc-min-w-[100%]"> {/* Use percentage for minimum width */}
46
- <h3 className="hc-font-bold hc-mb-3 hc-flex-1">{item.fields.position}</h3>
47
- <div className="hc-flex hc-justify-end hc-pb-2">
48
- <Icon
49
- icon={isFavorite ? "mdi:heart" : "mdi:heart-outline"}
50
- size="hc-size-3.5"
51
- iconClasses={isFavorite ? "hc-text-primary" : ""}
52
- className={`hc-transition-opacity hc-duration-300 hc-cursor-pointer
53
- ${isFavorite ? "hc-opacity-100" : "hc-text-uiText/60 group-hover:hc-opacity-100"}
54
- `}
55
- onClick={e => handleFavouriteClick(e)}
56
- />
57
- </div>
58
- </div>
59
-
60
- </div>
61
- {specialFeatures && <div className='hc-pb-4'>{specialFeaturePills("position", true)} </div>}
62
-
63
- </>
64
-
65
- }
66
-
67
- <ul className="hc-space-y-2 hc-text-xs">
68
-
69
- {[
70
- {
71
- field: "category",
72
- name: "Category",
73
- icon: "icon-park-solid:tree-list"
74
- },
75
- {
76
- field: "schedule",
77
- name: "Schedule",
78
- icon: "gravity-ui:clock-fill"
79
- },
80
- {
81
- field: "cityState",
82
- name: "Location",
83
- icon: "fluent:location-16-filled"
84
- },
85
- {
86
- field: "travelTime",
87
- name: "Commute",
88
- icon: "ri:pin-distance-fill"
89
- }
90
- ].map(listItem => (
91
- (fieldsShown.includes(listItem.field) && item.fields[listItem.field]) &&
92
- <li
93
- key={listItem.field}
94
- className="hc-flex hc-gap-2"
95
- >
96
- <Icon
97
- icon={listItem.icon}
98
- size="hc-size-3.5"
99
- className="hc-text-uiAccent/30"
100
- />
101
- <span className="hc-sr-only">{listItem.name}</span>
102
- {item.fields[listItem.field]}
103
- </li>
104
- ))}
105
- </ul>
106
- </Grid.Item>
107
- </>
108
- );
109
- };
110
-
111
- 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
+ }) => {
16
+ const orderedFields = fieldsShown.filter(field => field in item.fields);
17
+
18
+ const specialFeaturePills = (field, mobile = false) => {
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-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,90 +1,91 @@
1
- import Button from "~/components/modules/buttons/default";
2
- import { useState, useEffect } from "react";
3
- import React from 'react'
4
-
5
- const SORT_STATE = {
6
- notSorted: "not-sorted",
7
- sortedAsc: "sorted-asc",
8
- sortedDesc: "sorted-desc"
9
- };
10
-
11
- const HeaderItem = ({
12
- className,
13
- children,
14
- field,
15
- setSortSetting,
16
- sortSetting,
17
- isSortable,
18
- ...rest
19
- }) => {
20
- const [isSorted, setIsSorted] = useState(SORT_STATE.notSorted);
21
-
22
- const handleChange = field => {
23
- if (isSortable === false)
24
- return;
25
- let setting = {
26
- field: field,
27
- type: isSorted === SORT_STATE.sortedAsc ? "desc" : "asc"
28
- };
29
- setSortSetting(setting);
30
- isSorted === SORT_STATE.notSorted
31
- ? setIsSorted(SORT_STATE.sortedAsc)
32
- : isSorted === SORT_STATE.sortedAsc
33
- ? setIsSorted(SORT_STATE.sortedDesc)
34
- : setIsSorted(SORT_STATE.sortedAsc);
35
- };
36
-
37
- useEffect(() => {
38
- if (sortSetting?.field != null && sortSetting.field != field) {
39
- setIsSorted(SORT_STATE.notSorted);
40
- } else if (
41
- sortSetting?.field != null &&
42
- isSorted == SORT_STATE.notSorted &&
43
- sortSetting.field == field
44
- ) {
45
- setIsSorted(
46
- sortSetting.type == "asc"
47
- ? SORT_STATE.sortedAsc
48
- : SORT_STATE.sortedDesc,
49
- );
50
- }
51
- }, [sortSetting, isSorted, field]);
52
-
53
- return (
54
- <Button.Btn
55
- onClick={() => handleChange(field)}
56
- variant="none"
57
- className={`
58
- hc-p-2 hc-rounded-none hc-text-left hc-normal-case hc-font-bold hover:hc-bg-uiAccent/5 focus:hc-bg-uiAccent/5
59
- ${className ?? ""}
60
- `}
61
- {...rest}
62
- >
63
- <Button.Body>
64
- {children}
65
- {isSortable && (
66
- <div className="hc-flex hc-flex-col hc-pr-2">
67
- <Button.Icon
68
- icon="bi:caret-up-fill"
69
- size="hc-size-2.5"
70
- className={`
71
- hc-transition-opacity
72
- ${isSorted === "sorted-asc" ? "hc-opacity-100 hc-text-primary" : "hc-opacity-30"}
73
- `}
74
- />
75
- <Button.Icon
76
- icon="bi:caret-down-fill"
77
- size="hc-size-2.5"
78
- className={`
79
- transition-opacity
80
- ${isSorted === "sorted-desc" ? "hc-opacity-100" : "hc-opacity-30"}
81
- `}
82
- />
83
- </div>
84
- )}
85
- </Button.Body>
86
- </Button.Btn>
87
- );
88
- };
89
-
90
- export default HeaderItem;
1
+ import React, { useState, useEffect } from "react";
2
+
3
+ import Button from '~/components/modules/buttons/default';
4
+
5
+ const SORT_STATE = {
6
+ notSorted: "not-sorted",
7
+ sortedAsc: "sorted-asc",
8
+ sortedDesc: "sorted-desc"
9
+ };
10
+
11
+ const HeaderItem = ({
12
+ className,
13
+ children,
14
+ field,
15
+ setSortSetting,
16
+ sortSetting,
17
+ isSortable,
18
+ ...rest
19
+ }) => {
20
+ const [isSorted, setIsSorted] = useState(SORT_STATE.notSorted);
21
+
22
+ const handleChange = field => {
23
+ if (isSortable === false)
24
+ return;
25
+ let setting = {
26
+ field: field,
27
+ type: isSorted === SORT_STATE.sortedAsc ? "desc" : "asc"
28
+ };
29
+ setSortSetting(setting);
30
+ isSorted === SORT_STATE.notSorted
31
+ ? setIsSorted(SORT_STATE.sortedAsc)
32
+ : isSorted === SORT_STATE.sortedAsc
33
+ ? setIsSorted(SORT_STATE.sortedDesc)
34
+ : setIsSorted(SORT_STATE.sortedAsc);
35
+ };
36
+
37
+ useEffect(() => {
38
+ if (sortSetting?.field != null && sortSetting.field != field) {
39
+ setIsSorted(SORT_STATE.notSorted);
40
+ } else if (
41
+ sortSetting?.field != null &&
42
+ isSorted == SORT_STATE.notSorted &&
43
+ sortSetting.field == field
44
+ ) {
45
+ setIsSorted(
46
+ sortSetting.type == "asc"
47
+ ? SORT_STATE.sortedAsc
48
+ : SORT_STATE.sortedDesc,
49
+ );
50
+ }
51
+ }, [sortSetting, isSorted, field]);
52
+
53
+ return (
54
+ <Button.Btn
55
+ onClick={() => handleChange(field)}
56
+ variant="none"
57
+ className={`
58
+ hc-p-2 hc-rounded-none hc-text-left hc-normal-case hc-font-bold hover:hc-bg-uiAccent/5 focus:hc-bg-uiAccent/5
59
+ ${field.toLowerCase() === "position" ? "hc-col-span-2" : "hc-col-span-1"}
60
+ ${className ?? ""}
61
+ `}
62
+ {...rest}
63
+ >
64
+ <Button.Body>
65
+ {children}
66
+ {isSortable && (
67
+ <div className="hc-flex hc-flex-col hc-pr-2">
68
+ <Button.Icon
69
+ icon="bi:caret-up-fill"
70
+ size="hc-size-2.5"
71
+ className={`
72
+ hc-transition-opacity
73
+ ${isSorted === "sorted-asc" ? "hc-opacity-100 hc-text-primary" : "hc-opacity-30"}
74
+ `}
75
+ />
76
+ <Button.Icon
77
+ icon="bi:caret-down-fill"
78
+ size="hc-size-2.5"
79
+ className={`
80
+ transition-opacity
81
+ ${isSorted === "sorted-desc" ? "hc-opacity-100" : "hc-opacity-30"}
82
+ `}
83
+ />
84
+ </div>
85
+ )}
86
+ </Button.Body>
87
+ </Button.Btn>
88
+ );
89
+ };
90
+
91
+ export default HeaderItem;
@@ -1,46 +1,47 @@
1
- import { twMerge } from "tailwind-merge";
2
- import Grid from "~/components/modules/grid";
3
- import HeaderItem from "~/components/modules/maps/list/header-item";
4
- import React from 'react'
5
-
6
- const ListHeader = ({
7
- className,
8
- fieldsShown,
9
- fieldNames,
10
- fieldIsSortable = true,
11
- setSortSetting,
12
- sortSetting
13
- }) => {
14
- return (
15
- <Grid
16
- columns="hc-grid-flow-col hc-auto-cols-fr"
17
- gap="hc-gap-0"
18
- isAnimated={false}
19
- className={twMerge`
20
- hc-pl-6 hc-pr-8 hc-hidden hc-md:grid hc-flex-auto hc-bg-uiAccent/10 hc-border-b hc-border-uiAccent/10 hc-sticky hc-top-0 hc-z-10 hc-pb-[20px]
21
- ${className ?? ""}
22
- `}
23
- >
24
- {fieldsShown.map(field => (
25
- <HeaderItem
26
- key={field}
27
- isSortable={fieldIsSortable}
28
- sortSetting={sortSetting}
29
- field={field}
30
- setSortSetting={setSortSetting}
31
- >
32
- {fieldNames[field]}
33
- </HeaderItem>
34
- ))}
35
- <HeaderItem key={"favorite"}
36
- isSortable={false}
37
- field={"favorite"}
38
- >
39
- Favorite
40
- </HeaderItem>
41
-
42
- </Grid>
43
- );
44
- };
45
-
46
- 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/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;