Skip to content

Commit d09149a

Browse files
FussuChalicerhahao
andauthored
feat(views): add template for outgoing speakers schedule
Co-authored-by: Rasamoelina, Haja Onjatiana <26148770+rhahao@users.noreply.github.com>
1 parent 9c45bbf commit d09149a

File tree

17 files changed

+604
-150
lines changed

17 files changed

+604
-150
lines changed

src/definition/schedules.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,3 +306,13 @@ export type WeekendMeetingDataType = {
306306
wt_study: boolean;
307307
wt_study_only: boolean;
308308
};
309+
310+
export type OutgoingSpeakersScheduleItem = {
311+
opening_song: { title: string; number: number };
312+
public_talk: { title: string; number: number };
313+
speaker: string;
314+
congregation_name: string;
315+
date: { date: Date; formatted: string };
316+
};
317+
318+
export type OutgoingSpeakersScheduleType = OutgoingSpeakersScheduleItem[];

src/features/meetings/weekend_export/index.tsx

Lines changed: 26 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import Button from '@components/button';
77
import Dialog from '@components/dialog';
88
import Typography from '@components/typography';
99
import WeekRangeSelector from '../week_range_selector';
10+
import Checkbox from '@components/checkbox';
1011

1112
const WeekendExport = ({ open, onClose }: WeekendExportType) => {
1213
const { t } = useAppTranslation();
@@ -15,7 +16,11 @@ const WeekendExport = ({ open, onClose }: WeekendExportType) => {
1516
handleSetEndWeek,
1617
handleSetStartWeek,
1718
isProcessing,
18-
handleExportSchedule,
19+
handleExportSchedules,
20+
toggleExportOutgoingSpeakersSchedule,
21+
toggleExportWeekendMeetingSchedule,
22+
exportOutgoingSpeakersScheduleIsChecked,
23+
exportWeekendMeetingScheduleIsChecked,
1924
} = useWeekendExport(onClose);
2025

2126
return (
@@ -30,8 +35,6 @@ const WeekendExport = ({ open, onClose }: WeekendExportType) => {
3035
gap: '24px',
3136
flexDirection: 'column',
3237
width: '100%',
33-
marginBottom: '110px',
34-
overflow: 'auto',
3538
}}
3639
>
3740
<Box sx={{ display: 'flex', flexDirection: 'column', gap: '8px' }}>
@@ -48,23 +51,38 @@ const WeekendExport = ({ open, onClose }: WeekendExportType) => {
4851
/>
4952
</Box>
5053

54+
<Box
55+
sx={{
56+
display: 'flex',
57+
flexDirection: 'column',
58+
gap: '8px',
59+
}}
60+
>
61+
<Checkbox
62+
checked={exportWeekendMeetingScheduleIsChecked}
63+
onChange={toggleExportWeekendMeetingSchedule}
64+
label={t('tr_weekendMeetingPrint')}
65+
/>
66+
<Checkbox
67+
checked={exportOutgoingSpeakersScheduleIsChecked}
68+
onChange={toggleExportOutgoingSpeakersSchedule}
69+
label={t('tr_outgoingSpeakersSchedule')}
70+
/>
71+
</Box>
72+
5173
<Box
5274
sx={{
5375
display: 'flex',
5476
flexDirection: 'column',
5577
gap: '8px',
5678
width: '100%',
57-
position: 'absolute',
58-
bottom: 0,
59-
right: 0,
60-
padding: '24px',
6179
}}
6280
>
6381
<Button
6482
variant="main"
6583
disabled={isProcessing}
6684
endIcon={isProcessing && <IconLoading />}
67-
onClick={handleExportSchedule}
85+
onClick={handleExportSchedules}
6886
>
6987
{t('tr_export')}
7088
</Button>

src/features/meetings/weekend_export/useWeekendExport.tsx

Lines changed: 89 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,21 @@ import { WeekendExportType } from './index.types';
66
import { displaySnackNotification } from '@services/states/app';
77
import { getMessageByCode } from '@services/i18n/translation';
88
import { schedulesState } from '@states/schedules';
9-
import { WeekendMeetingDataType } from '@definition/schedules';
10-
import { schedulesWeekendData } from '@services/app/schedules';
9+
import {
10+
OutgoingSpeakersScheduleType,
11+
SchedWeekType,
12+
WeekendMeetingDataType,
13+
} from '@definition/schedules';
14+
import {
15+
groupOutgoingSpeakersByDate,
16+
scheduleOutgoingSpeakers,
17+
schedulesWeekendData,
18+
} from '@services/app/schedules';
1119
import { JWLangLocaleState, userDataViewState } from '@states/settings';
12-
import { TemplateWeekendMeeting } from '@views/index';
20+
import {
21+
TemplateOutgoingSpeakersSchedule,
22+
TemplateWeekendMeeting,
23+
} from '@views/index';
1324
import { headerForScheduleState } from '@states/field_service_groups';
1425
import { Week } from '@definition/week_type';
1526
import { WEEK_TYPE_NO_MEETING } from '@constants/index';
@@ -20,6 +31,15 @@ const useWeekendExport = (onClose: WeekendExportType['onClose']) => {
2031
const congName = useAtomValue(headerForScheduleState);
2132
const sourceLang = useAtomValue(JWLangLocaleState);
2233

34+
const [
35+
exportWeekendMeetingScheduleIsChecked,
36+
setWeekendMeetingScheduleIsChecked,
37+
] = useState(true);
38+
const [
39+
exportOutgoingSpeakersScheduleIsChecked,
40+
setOutgoingSpeakersScheduleIsChecked,
41+
] = useState(true);
42+
2343
const [startWeek, setStartWeek] = useState('');
2444
const [endWeek, setEndWeek] = useState('');
2545
const [isProcessing, setIsProcessing] = useState(false);
@@ -28,7 +48,56 @@ const useWeekendExport = (onClose: WeekendExportType['onClose']) => {
2848

2949
const handleSetEndWeek = (value: string) => setEndWeek(value);
3050

31-
const handleExportSchedule = async () => {
51+
const exportWeekendMeetingSchedule = async (weeksList: SchedWeekType[]) => {
52+
const meetingData: WeekendMeetingDataType[] = [];
53+
54+
for (const schedule of weeksList) {
55+
const data = schedulesWeekendData(schedule, dataView);
56+
meetingData.push(data);
57+
}
58+
59+
const firstWeek = meetingData.at(0).weekOf.replaceAll('/', '');
60+
const lastWeek = meetingData.at(-1).weekOf.replaceAll('/', '');
61+
62+
const blob = await pdf(
63+
<TemplateWeekendMeeting
64+
data={meetingData}
65+
cong_name={congName}
66+
lang={sourceLang}
67+
/>
68+
).toBlob();
69+
70+
const filename = `WM_${firstWeek}-${lastWeek}.pdf`;
71+
72+
saveAs(blob, filename);
73+
};
74+
75+
const exportOutgoingSpeakersSchedule = async (weeksList: SchedWeekType[]) => {
76+
const allItems: OutgoingSpeakersScheduleType = [];
77+
78+
for (const schedule of weeksList) {
79+
const data = scheduleOutgoingSpeakers(schedule);
80+
allItems.push(...data);
81+
}
82+
83+
const groupedSchedules = groupOutgoingSpeakersByDate(allItems);
84+
85+
const firstWeek = weeksList[0].weekOf.replaceAll('/', '');
86+
const lastWeek = weeksList.at(-1).weekOf.replaceAll('/', '');
87+
88+
const blob = await pdf(
89+
<TemplateOutgoingSpeakersSchedule
90+
data={groupedSchedules}
91+
congregation={congName}
92+
lang={sourceLang}
93+
/>
94+
).toBlob();
95+
96+
const filename = `OS_${firstWeek}-${lastWeek}.pdf`;
97+
saveAs(blob, filename);
98+
};
99+
100+
const handleExportSchedules = async () => {
32101
if (startWeek.length === 0 || endWeek.length === 0) return;
33102

34103
try {
@@ -54,27 +123,13 @@ const useWeekendExport = (onClose: WeekendExportType['onClose']) => {
54123
return isValid;
55124
});
56125

57-
const meetingData: WeekendMeetingDataType[] = [];
58-
59-
for (const schedule of weeksList) {
60-
const data = schedulesWeekendData(schedule, dataView);
61-
meetingData.push(data);
126+
if (exportWeekendMeetingScheduleIsChecked) {
127+
await exportWeekendMeetingSchedule(weeksList);
62128
}
63129

64-
const firstWeek = meetingData.at(0).weekOf.replaceAll('/', '');
65-
const lastWeek = meetingData.at(-1).weekOf.replaceAll('/', '');
66-
67-
const blob = await pdf(
68-
<TemplateWeekendMeeting
69-
data={meetingData}
70-
cong_name={congName}
71-
lang={sourceLang}
72-
/>
73-
).toBlob();
74-
75-
const filename = `WM_${firstWeek}-${lastWeek}.pdf`;
76-
77-
saveAs(blob, filename);
130+
if (exportOutgoingSpeakersScheduleIsChecked) {
131+
await exportOutgoingSpeakersSchedule(weeksList);
132+
}
78133

79134
setIsProcessing(false);
80135
onClose?.();
@@ -92,11 +147,21 @@ const useWeekendExport = (onClose: WeekendExportType['onClose']) => {
92147
}
93148
};
94149

150+
const toggleExportWeekendMeetingSchedule = () =>
151+
setWeekendMeetingScheduleIsChecked((prev) => !prev);
152+
153+
const toggleExportOutgoingSpeakersSchedule = () =>
154+
setOutgoingSpeakersScheduleIsChecked((prev) => !prev);
155+
95156
return {
96157
isProcessing,
97158
handleSetStartWeek,
98159
handleSetEndWeek,
99-
handleExportSchedule,
160+
handleExportSchedules,
161+
toggleExportWeekendMeetingSchedule,
162+
toggleExportOutgoingSpeakersSchedule,
163+
exportOutgoingSpeakersScheduleIsChecked,
164+
exportWeekendMeetingScheduleIsChecked,
100165
};
101166
};
102167

src/locales/ceb-PH/forms-templates.json

Lines changed: 0 additions & 113 deletions
This file was deleted.

src/locales/en/forms-templates.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
"tr_speaker": "Speaker",
6262
"tr_speakerSymposium": "Speaker (Symposium, part 1)",
6363
"tr_wtStudyReader": "Study reader",
64-
"tr_weekendMeetingPrint": "Weekend Meeting Schedule",
64+
"tr_weekendMeetingPrint": "Weekend meeting schedule",
6565
"tr_publicTalk": "Public talk",
6666
"tr_openingPrayer": "Opening prayer",
6767
"tr_noWMeetingWeek": "There is no weekend meeting for this week",

src/locales/en/meetings.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -177,5 +177,6 @@
177177
"tr_watchtowerStudyOnly": "Watchtower study only",
178178
"tr_meetingPortion": "Meeting portion",
179179
"tr_specialTalkOnly": "Special talk only",
180-
"tr_hostCongregationShort": "Host"
180+
"tr_hostCongregationShort": "Host",
181+
"tr_outgoingSpeakersSchedule": "Outgoing speakers schedule"
181182
}

0 commit comments

Comments
 (0)