Skip to content

Commit

Permalink
feat: customer filter
Browse files Browse the repository at this point in the history
  • Loading branch information
nevo-david committed Jan 3, 2025
1 parent 8b6f65e commit 7bb6c46
Show file tree
Hide file tree
Showing 7 changed files with 184 additions and 110 deletions.
46 changes: 19 additions & 27 deletions apps/frontend/src/components/launches/add.edit.model.tsx
Original file line number Diff line number Diff line change
@@ -1,7 +1,17 @@
'use client';

import React, {
ClipboardEventHandler, FC, Fragment, MouseEventHandler, useCallback, useEffect, useMemo, useRef, ClipboardEvent, useState, memo
ClipboardEventHandler,
FC,
Fragment,
MouseEventHandler,
useCallback,
useEffect,
useMemo,
useRef,
ClipboardEvent,
useState,
memo,
} from 'react';
import dayjs from 'dayjs';
import { Integrations } from '@gitroom/frontend/components/launches/calendar.context';
Expand Down Expand Up @@ -50,6 +60,7 @@ import { useClickOutside } from '@gitroom/frontend/components/layout/click.outsi
import { useUppyUploader } from '@gitroom/frontend/components/media/new.uploader';
import { LoadingComponent } from '@gitroom/frontend/components/layout/loading';
import { DropFiles } from '@gitroom/frontend/components/layout/drop.files';
import { SelectCustomer } from '@gitroom/frontend/components/launches/select.customer';

function countCharacters(text: string, type: string): number {
if (type !== 'x') {
Expand Down Expand Up @@ -94,10 +105,6 @@ export const AddEditModal: FC<{
return list;
}, [customer, ints]);

const totalCustomers = useMemo(() => {
return uniqBy(ints, (i) => i?.customer?.id).length;
}, [ints]);

const [dateState, setDateState] = useState(date);

// hook to open a new modal
Expand Down Expand Up @@ -519,28 +526,13 @@ export const AddEditModal: FC<{
information={data}
onChange={setPostFor}
/>
{totalCustomers > 1 && (
<Select
hideErrors={true}
label=""
name="customer"
value={customer}
onChange={(e) => {
setCustomer(e.target.value);
setSelectedIntegrations([]);
}}
disableForm={true}
>
<option value="">Selected Customer</option>
{uniqBy(ints, (u) => u?.customer?.name)
.filter((f) => f.customer?.name)
.map((p) => (
<option key={p.customer?.id} value={p.customer?.id}>
Customer: {p.customer?.name}
</option>
))}
</Select>
)}
<SelectCustomer
integrations={ints}
onChange={(val) => {
setCustomer(val);
setSelectedIntegrations([]);
}}
/>
<DatePicker onChange={setDateState} date={dateState} />
{!selectedIntegrations.length && (
<svg
Expand Down
11 changes: 9 additions & 2 deletions apps/frontend/src/components/launches/calendar.context.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,9 @@ export const CalendarContext = createContext({
currentWeek: dayjs().week(),
currentYear: dayjs().year(),
currentMonth: dayjs().month(),
customer: null as string | null,
comments: [] as Array<{ date: string; total: number }>,
integrations: [] as (Integrations & {refreshNeeded?: boolean})[],
integrations: [] as (Integrations & { refreshNeeded?: boolean })[],
trendings: [] as string[],
posts: [] as Array<Post & { integration: Integration }>,
reloadCalendarView: () => {
Expand All @@ -42,6 +43,7 @@ export const CalendarContext = createContext({
currentDay: 0 | 1 | 2 | 3 | 4 | 5 | 6;
currentMonth: number;
display: 'week' | 'month' | 'day';
customer: string | null;
}) => {
/** empty **/
},
Expand All @@ -66,7 +68,7 @@ export interface Integrations {
customer?: {
name?: string;
id?: string;
}
};
}

function getWeekNumber(date: Date) {
Expand Down Expand Up @@ -94,6 +96,7 @@ export const CalendarWeekProvider: FC<{
const fetch = useFetch();
const [internalData, setInternalData] = useState([] as any[]);
const [trendings] = useState<string[]>([]);

const searchParams = useSearchParams();

const display = searchParams.get('display') || 'week';
Expand All @@ -110,6 +113,7 @@ export const CalendarWeekProvider: FC<{
currentWeek: +(searchParams.get('week') || getWeekNumber(new Date())),
currentMonth: +(searchParams.get('month') || dayjs().month()),
currentYear: +(searchParams.get('year') || dayjs().year()),
customer: (searchParams.get('customer') as string) || null,
display,
});

Expand All @@ -120,6 +124,7 @@ export const CalendarWeekProvider: FC<{
week: filters.currentWeek.toString(),
month: (filters.currentMonth + 1).toString(),
year: filters.currentYear.toString(),
customer: filters?.customer?.toString() || '',
}).toString();
}, [filters, display]);

Expand All @@ -142,6 +147,7 @@ export const CalendarWeekProvider: FC<{
currentYear: number;
currentMonth: number;
display: 'week' | 'month' | 'day';
customer: string | null;
}) => {
setFilters(filters);
setInternalData([]);
Expand All @@ -152,6 +158,7 @@ export const CalendarWeekProvider: FC<{
`month=${filters.currentMonth}`,
`year=${filters.currentYear}`,
`display=${filters.display}`,
filters.customer ? `customer=${filters.customer}` : ``,
].filter((f) => f);
window.history.replaceState(null, '', `/launches?${path.join('&')}`);
},
Expand Down
177 changes: 101 additions & 76 deletions apps/frontend/src/components/launches/filters.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import clsx from 'clsx';
import dayjs from 'dayjs';
import { useCallback } from 'react';
import { isUSCitizen } from './helpers/isuscitizen.utils';
import { SelectCustomer } from '@gitroom/frontend/components/launches/select.customer';

export const Filters = () => {
const week = useCalendar();
Expand All @@ -13,30 +14,30 @@ export const Filters = () => {
.year(week.currentYear)
.isoWeek(week.currentWeek)
.day(week.currentDay)
.format(isUSCitizen() ? 'MM/DD/YYYY' :'DD/MM/YYYY')
.format(isUSCitizen() ? 'MM/DD/YYYY' : 'DD/MM/YYYY')
: week.display === 'week'
? dayjs()
.year(week.currentYear)
.isoWeek(week.currentWeek)
.startOf('isoWeek')
.format(isUSCitizen() ? 'MM/DD/YYYY' :'DD/MM/YYYY') +
.format(isUSCitizen() ? 'MM/DD/YYYY' : 'DD/MM/YYYY') +
' - ' +
dayjs()
.year(week.currentYear)
.isoWeek(week.currentWeek)
.endOf('isoWeek')
.format(isUSCitizen() ? 'MM/DD/YYYY' :'DD/MM/YYYY')
.format(isUSCitizen() ? 'MM/DD/YYYY' : 'DD/MM/YYYY')
: dayjs()
.year(week.currentYear)
.month(week.currentMonth)
.startOf('month')
.format(isUSCitizen() ? 'MM/DD/YYYY' :'DD/MM/YYYY') +
.format(isUSCitizen() ? 'MM/DD/YYYY' : 'DD/MM/YYYY') +
' - ' +
dayjs()
.year(week.currentYear)
.month(week.currentMonth)
.endOf('month')
.format(isUSCitizen() ? 'MM/DD/YYYY' :'DD/MM/YYYY');
.format(isUSCitizen() ? 'MM/DD/YYYY' : 'DD/MM/YYYY');

const setDay = useCallback(() => {
week.setFilters({
Expand All @@ -45,6 +46,7 @@ export const Filters = () => {
currentYear: dayjs().year(),
currentMonth: dayjs().month(),
display: 'day',
customer: week.customer,
});
}, [week]);

Expand All @@ -55,6 +57,7 @@ export const Filters = () => {
currentYear: dayjs().year(),
currentMonth: dayjs().month(),
display: 'week',
customer: week.customer,
});
}, [week]);

Expand All @@ -65,9 +68,24 @@ export const Filters = () => {
currentWeek: dayjs().isoWeek(),
currentYear: dayjs().year(),
display: 'month',
customer: week.customer,
});
}, [week]);

const setCustomer = useCallback(
(customer: string) => {
week.setFilters({
currentDay: week.currentDay,
currentMonth: week.currentMonth,
currentWeek: week.currentWeek,
currentYear: week.currentYear,
display: week.display as any,
customer: customer,
});
},
[week]
);

const next = useCallback(() => {
const increaseDay = week.display === 'day';
const increaseWeek =
Expand All @@ -77,6 +95,7 @@ export const Filters = () => {
week.display === 'month' || (increaseWeek && week.currentWeek === 52);

week.setFilters({
customer: week.customer,
currentDay: (!increaseDay
? 0
: week.currentDay === 6
Expand Down Expand Up @@ -116,6 +135,7 @@ export const Filters = () => {
week.display === 'month' || (decreaseWeek && week.currentWeek === 1);

week.setFilters({
customer: week.customer,
currentDay: (!decreaseDay
? 0
: week.currentDay === 0
Expand Down Expand Up @@ -147,77 +167,82 @@ export const Filters = () => {
]);
return (
<div className="text-textColor flex flex-col md:flex-row gap-[8px] items-center select-none">
<div className = "flex flex-grow flex-row">
<div onClick={previous} className="cursor-pointer">
<svg
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
>
<path
d="M13.1644 15.5866C13.3405 15.7628 13.4395 16.0016 13.4395 16.2507C13.4395 16.4998 13.3405 16.7387 13.1644 16.9148C12.9883 17.0909 12.7494 17.1898 12.5003 17.1898C12.2513 17.1898 12.0124 17.0909 11.8363 16.9148L5.58629 10.6648C5.49889 10.5777 5.42954 10.4742 5.38222 10.3602C5.3349 10.2463 5.31055 10.1241 5.31055 10.0007C5.31055 9.87732 5.3349 9.75515 5.38222 9.64119C5.42954 9.52724 5.49889 9.42375 5.58629 9.33665L11.8363 3.08665C12.0124 2.91053 12.2513 2.81158 12.5003 2.81158C12.7494 2.81158 12.9883 2.91053 13.1644 3.08665C13.3405 3.26277 13.4395 3.50164 13.4395 3.75071C13.4395 3.99978 13.3405 4.23865 13.1644 4.41477L7.57925 9.99993L13.1644 15.5866Z"
fill="#E9E9F1"
/>
</svg>
</div>
<div className="w-[80px] text-center">
{week.display === 'day'
? `${dayjs()
.month(week.currentMonth)
.week(week.currentWeek)
.day(week.currentDay)
.format('dddd')}`
: week.display === 'week'
? `Week ${week.currentWeek}`
: `${dayjs().month(week.currentMonth).format('MMMM')}`}
</div>
<div onClick={next} className="cursor-pointer">
<svg
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
>
<path
d="M14.4137 10.6633L8.16374 16.9133C7.98761 17.0894 7.74874 17.1884 7.49967 17.1884C7.2506 17.1884 7.01173 17.0894 6.83561 16.9133C6.65949 16.7372 6.56055 16.4983 6.56055 16.2492C6.56055 16.0002 6.65949 15.7613 6.83561 15.5852L12.4223 10L6.83717 4.41331C6.74997 4.3261 6.68079 4.22257 6.6336 4.10863C6.5864 3.99469 6.56211 3.87257 6.56211 3.74925C6.56211 3.62592 6.5864 3.5038 6.6336 3.38986C6.68079 3.27592 6.74997 3.17239 6.83717 3.08518C6.92438 2.99798 7.02791 2.9288 7.14185 2.88161C7.25579 2.83441 7.37791 2.81012 7.50124 2.81012C7.62456 2.81012 7.74668 2.83441 7.86062 2.88161C7.97456 2.9288 8.07809 2.99798 8.1653 3.08518L14.4153 9.33518C14.5026 9.42238 14.5718 9.52596 14.619 9.63997C14.6662 9.75398 14.6904 9.87618 14.6903 9.99957C14.6901 10.123 14.6656 10.2451 14.6182 10.359C14.5707 10.4729 14.5012 10.5763 14.4137 10.6633Z"
fill="#E9E9F1"
/>
</svg>
</div>
<div className="flex-1">{betweenDates}</div>
</div>
<div className="flex flex-row">
<div
className={clsx(
'border border-tableBorder p-[10px] cursor-pointer',
week.display === 'day' && 'bg-tableBorder'
)}
onClick={setDay}
>
Day
</div>
<div
className={clsx(
'border border-tableBorder p-[10px] cursor-pointer',
week.display === 'week' && 'bg-tableBorder'
)}
onClick={setWeek}
>
Week
</div>
<div
className={clsx(
'border border-tableBorder p-[10px] cursor-pointer',
week.display === 'month' && 'bg-tableBorder'
)}
onClick={setMonth}
>
Month
</div>
</div>
<div className="flex flex-grow flex-row">
<div onClick={previous} className="cursor-pointer">
<svg
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
>
<path
d="M13.1644 15.5866C13.3405 15.7628 13.4395 16.0016 13.4395 16.2507C13.4395 16.4998 13.3405 16.7387 13.1644 16.9148C12.9883 17.0909 12.7494 17.1898 12.5003 17.1898C12.2513 17.1898 12.0124 17.0909 11.8363 16.9148L5.58629 10.6648C5.49889 10.5777 5.42954 10.4742 5.38222 10.3602C5.3349 10.2463 5.31055 10.1241 5.31055 10.0007C5.31055 9.87732 5.3349 9.75515 5.38222 9.64119C5.42954 9.52724 5.49889 9.42375 5.58629 9.33665L11.8363 3.08665C12.0124 2.91053 12.2513 2.81158 12.5003 2.81158C12.7494 2.81158 12.9883 2.91053 13.1644 3.08665C13.3405 3.26277 13.4395 3.50164 13.4395 3.75071C13.4395 3.99978 13.3405 4.23865 13.1644 4.41477L7.57925 9.99993L13.1644 15.5866Z"
fill="#E9E9F1"
/>
</svg>
</div>
<div className="w-[80px] text-center">
{week.display === 'day'
? `${dayjs()
.month(week.currentMonth)
.week(week.currentWeek)
.day(week.currentDay)
.format('dddd')}`
: week.display === 'week'
? `Week ${week.currentWeek}`
: `${dayjs().month(week.currentMonth).format('MMMM')}`}
</div>
<div onClick={next} className="cursor-pointer">
<svg
xmlns="http://www.w3.org/2000/svg"
width="20"
height="20"
viewBox="0 0 20 20"
fill="none"
>
<path
d="M14.4137 10.6633L8.16374 16.9133C7.98761 17.0894 7.74874 17.1884 7.49967 17.1884C7.2506 17.1884 7.01173 17.0894 6.83561 16.9133C6.65949 16.7372 6.56055 16.4983 6.56055 16.2492C6.56055 16.0002 6.65949 15.7613 6.83561 15.5852L12.4223 10L6.83717 4.41331C6.74997 4.3261 6.68079 4.22257 6.6336 4.10863C6.5864 3.99469 6.56211 3.87257 6.56211 3.74925C6.56211 3.62592 6.5864 3.5038 6.6336 3.38986C6.68079 3.27592 6.74997 3.17239 6.83717 3.08518C6.92438 2.99798 7.02791 2.9288 7.14185 2.88161C7.25579 2.83441 7.37791 2.81012 7.50124 2.81012C7.62456 2.81012 7.74668 2.83441 7.86062 2.88161C7.97456 2.9288 8.07809 2.99798 8.1653 3.08518L14.4153 9.33518C14.5026 9.42238 14.5718 9.52596 14.619 9.63997C14.6662 9.75398 14.6904 9.87618 14.6903 9.99957C14.6901 10.123 14.6656 10.2451 14.6182 10.359C14.5707 10.4729 14.5012 10.5763 14.4137 10.6633Z"
fill="#E9E9F1"
/>
</svg>
</div>
<div className="flex-1">{betweenDates}</div>
</div>
<SelectCustomer
customer={week.customer as string}
onChange={(customer: string) => setCustomer(customer)}
integrations={week.integrations}
/>
<div className="flex flex-row">
<div
className={clsx(
'border border-tableBorder p-[10px] cursor-pointer',
week.display === 'day' && 'bg-tableBorder'
)}
onClick={setDay}
>
Day
</div>
<div
className={clsx(
'border border-tableBorder p-[10px] cursor-pointer',
week.display === 'week' && 'bg-tableBorder'
)}
onClick={setWeek}
>
Week
</div>
<div
className={clsx(
'border border-tableBorder p-[10px] cursor-pointer',
week.display === 'month' && 'bg-tableBorder'
)}
onClick={setMonth}
>
Month
</div>
</div>
</div>
);
};
Loading

0 comments on commit 7bb6c46

Please sign in to comment.