diff --git a/apps/portal/src/components/offers/table/OffersRow.tsx b/apps/portal/src/components/offers/table/OffersRow.tsx
index a5f51208..77c7ab44 100644
--- a/apps/portal/src/components/offers/table/OffersRow.tsx
+++ b/apps/portal/src/components/offers/table/OffersRow.tsx
@@ -1,5 +1,6 @@
import clsx from 'clsx';
import Link from 'next/link';
+import { JobType } from '@prisma/client';
import type { JobTitleType } from '~/components/shared/JobTitles';
import { getLabelForJobTitleType } from '~/components/shared/JobTitles';
@@ -9,25 +10,47 @@ import { formatDate } from '~/utils/offers/time';
import type { DashboardOffer } from '~/types/offers';
-export type OfferTableRowProps = Readonly<{ row: DashboardOffer }>;
+export type OfferTableRowProps = Readonly<{
+ jobType: JobType;
+ row: DashboardOffer;
+}>;
export default function OfferTableRow({
- row: { company, id, income, monthYearReceived, profileId, title, totalYoe },
+ jobType,
+ row: {
+ baseSalary,
+ bonus,
+ company,
+ id,
+ income,
+ monthYearReceived,
+ profileId,
+ stocks,
+ title,
+ totalYoe,
+ },
}: OfferTableRowProps) {
return (
-
+ |
{company.name}
|
-
+ |
{getLabelForJobTitleType(title as JobTitleType)}
|
- {totalYoe} |
- {convertMoneyToString(income)} |
- {formatDate(monthYearReceived)} |
+ {totalYoe} |
+ {convertMoneyToString(income)} |
+ {jobType === JobType.FULLTIME && (
+
+ {`${baseSalary && convertMoneyToString(baseSalary)} / ${
+ bonus && convertMoneyToString(bonus)
+ } / ${stocks && convertMoneyToString(stocks)}`}
+ |
+ )}
+ {formatDate(monthYearReceived)} |
;
export default function OffersTable({
- cityFilter,
+ countryFilter,
companyFilter,
jobTitleFilter,
}: OffersTableProps) {
const [currency, setCurrency] = useState(Currency.SGD.toString()); // TODO: Detect location
const [selectedYoe, setSelectedYoe] = useState('');
+ const [jobType, setJobType] = useState(JobType.FULLTIME);
const [pagination, setPagination] = useState({
currentPage: 0,
numOfItems: 0,
@@ -47,6 +49,7 @@ export default function OffersTable({
const { event: gaEvent } = useGoogleAnalytics();
const router = useRouter();
const { yoeCategory = '' } = router.query;
+ const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
setPagination({
@@ -55,19 +58,20 @@ export default function OffersTable({
numOfPages: 0,
totalItems: 0,
});
- }, [selectedYoe, currency]);
+ setIsLoading(true);
+ }, [selectedYoe, currency, countryFilter, companyFilter, jobTitleFilter]);
useEffect(() => {
setSelectedYoe(yoeCategory as YOE_CATEGORY);
+ event?.preventDefault();
}, [yoeCategory]);
- const offersQuery = trpc.useQuery(
+ trpc.useQuery(
[
'offers.list',
{
companyId: companyFilter,
- // Location: 'Singapore, Singapore', // TODO: Geolocation
- countryId: cityFilter,
+ countryId: countryFilter,
currency,
limit: NUMBER_OF_OFFERS_IN_PAGE,
offset: pagination.currentPage,
@@ -83,6 +87,8 @@ export default function OffersTable({
onSuccess: (response: GetOffersResponse) => {
setOffers(response.data);
setPagination(response.paging);
+ setJobType(response.jobType);
+ setIsLoading(false);
},
},
);
@@ -118,10 +124,14 @@ export default function OffersTable({
const params = new URLSearchParams({
['yoeCategory']: value,
});
- router.replace({
- pathname: location.pathname,
- search: params.toString(),
- });
+ router.replace(
+ {
+ pathname: location.pathname,
+ search: params.toString(),
+ },
+ undefined,
+ { shallow: true },
+ );
}
gaEvent({
action: `offers.table_filter_yoe_category_${value}`,
@@ -169,7 +179,7 @@ export default function OffersTable({
}
function renderHeader() {
- const columns = [
+ let columns = [
'Company',
'Title',
'YOE',
@@ -177,6 +187,18 @@ export default function OffersTable({
'Date Offered',
'Actions',
];
+ if (jobType === JobType.FULLTIME) {
+ columns = [
+ 'Company',
+ 'Title',
+ 'YOE',
+ 'Annual TC',
+ 'Annual Base / Bonus / Stocks',
+ 'Date Offered',
+ 'Actions',
+ ];
+ }
+
return (
@@ -184,7 +206,7 @@ export default function OffersTable({
{renderFilters()}
- {offersQuery.isLoading ? (
-
+ {isLoading ? (
+
) : (
-
-
+
+
{renderHeader()}
{offers.map((offer) => (
-
+
))}
+ {!offers ||
+ (offers.length === 0 && (
+
+ No data yet🥺
+
+ Please try another set of filters.
+
+
+ ))}
)}
('');
const [companyFilter, setCompanyFilter] = useState('');
- const [cityFilter, setCityFilter] = useState('');
+ const [countryFilter, setCountryFilter] = useState('');
const { event: gaEvent } = useGoogleAnalytics();
return (
@@ -26,21 +26,23 @@ export default function OffersHomePage() {
. ⭐
-
+
- {
if (option) {
- setCityFilter(option.value);
+ setCountryFilter(option.value);
gaEvent({
- action: `offers.table_filter_city_${option.value}`,
+ action: `offers.table_filter_country_${option.value}`,
category: 'engagement',
- label: 'Filter by city',
+ label: 'Filter by country',
});
+ } else {
+ setCountryFilter('');
}
}}
/>
@@ -100,8 +102,8 @@ export default function OffersHomePage() {
| |