Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions src/constants/table_encryption_map.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,7 @@ export const TABLE_ENCRYPTION_MAP = {
format_24h_enabled: 'shared',
week_start_sunday: 'shared',
attendance_online_record: 'shared',
attendance_deaf_record: 'shared',
data_sync: 'public',
responsabilities: 'shared',
cong_role: 'public',
Expand Down
21 changes: 20 additions & 1 deletion src/definition/meeting_attendance.ts
Original file line number Diff line number Diff line change
@@ -1,10 +1,20 @@
export type AttendanceCongregation = {
present: number;
online: number;
present_deaf?: number;
online_deaf?: number;
type: string;
updatedAt: string;
};

export type AttendanceRecordField =
| 'present'
| 'online'
| 'present_deaf'
| 'online_deaf';

export type AttendanceValues = Partial<Record<AttendanceRecordField, string>>;

export type WeeklyAttendance = {
midweek: AttendanceCongregation[];
weekend: AttendanceCongregation[];
Expand All @@ -20,12 +30,21 @@ export type MeetingAttendanceType = {
week_5: WeeklyAttendance;
};

export type MeetingAttendanceStats = {
count: number;
total: number;
average: number;
average_online: number;
total_deaf: number;
average_deaf: number;
};

export type MeetingAttendanceExport = {
lang: string;
locale: string;
data: {
name: string;
years: string[];
columns: string[];
midweek_meeting: {
month: string;
table_1: {
Expand Down
6 changes: 6 additions & 0 deletions src/definition/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -168,6 +168,12 @@ export type SettingsType = {
updatedAt: string;
_deleted: boolean;
}[];
attendance_deaf_record: {
type: string;
value: boolean;
updatedAt: string;
_deleted: boolean;
}[];
data_sync: { value: boolean; updatedAt: string };
responsabilities: {
coordinator: string;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { Stack } from '@mui/material';
import { useAppTranslation, useCurrentUser } from '@hooks/index';
import useMeetingAttendance from './useMeetingAttendance';
import SwitchWithLabel from '@components/switch_with_label';
Expand All @@ -7,16 +8,31 @@ const MeetingAttendance = () => {

const { isSettingsEditor } = useCurrentUser();

const { recordOnline, handleRecordOnlineToggle } = useMeetingAttendance();
const {
recordOnline,
handleRecordOnlineToggle,
recordDeaf,
handleRecordDeafToggle,
} = useMeetingAttendance();

return (
<SwitchWithLabel
label={t('tr_recordOnlineAttendance')}
helper={t('tr_recordOnlineAttendanceDesc')}
checked={recordOnline}
onChange={handleRecordOnlineToggle}
readOnly={!isSettingsEditor}
/>
<Stack spacing="16px">
<SwitchWithLabel
label={t('tr_recordOnlineAttendance')}
helper={t('tr_recordOnlineAttendanceDesc')}
checked={recordOnline}
onChange={handleRecordOnlineToggle}
readOnly={!isSettingsEditor}
/>

<SwitchWithLabel
label={t('tr_recordDeafAttendance')}
helper={t('tr_recordDeafAttendanceDesc')}
checked={recordDeaf}
onChange={handleRecordDeafToggle}
readOnly={!isSettingsEditor}
/>
</Stack>
);
};

Expand Down
Original file line number Diff line number Diff line change
@@ -1,18 +1,48 @@
import { useEffect, useState } from 'react';
import { useAtomValue } from 'jotai';
import {
attendanceDeafRecordState,
attendanceOnlineRecordState,
settingsState,
userDataViewState,
} from '@states/settings';
import { dbAppSettingsUpdate } from '@services/dexie/settings';
import { settingSchema } from '@services/dexie/schema';

type DataViewSetting = {
type: string;
value: boolean;
updatedAt: string;
_deleted: boolean;
};

const setValueForDataView = (
records: DataViewSetting[],
dataView: string,
value: boolean
) => {
const updatedAt = new Date().toISOString();

const current = records.find((record) => record.type === dataView);

if (current) {
current.value = value;
current.updatedAt = updatedAt;
} else {
records.push({ type: dataView, _deleted: false, updatedAt, value });
}

return records;
};

const useMeetingAttendance = () => {
const settings = useAtomValue(settingsState);
const dataView = useAtomValue(userDataViewState);
const recordOnlineInitial = useAtomValue(attendanceOnlineRecordState);
const recordDeafInitial = useAtomValue(attendanceDeafRecordState);

const [recordOnline, setRecordOnline] = useState(false);
const [recordDeaf, setRecordDeaf] = useState(false);

const handleRecordOnlineToggle = async () => {
let newRecordOnline = structuredClone(
Expand All @@ -26,36 +56,43 @@ const useMeetingAttendance = () => {
newRecordOnline = [{ type: 'main', _deleted: false, updatedAt, value }];
}

const findRecord = newRecordOnline.find(
(record) => record.type === dataView
);

if (findRecord) {
findRecord.value = !recordOnline;
findRecord.updatedAt = new Date().toISOString();
}
await dbAppSettingsUpdate({
'cong_settings.attendance_online_record': setValueForDataView(
newRecordOnline,
dataView,
!recordOnline
),
});
};

if (!findRecord) {
newRecordOnline.push({
type: dataView,
_deleted: false,
updatedAt: new Date().toISOString(),
value: !recordOnline,
});
}
const handleRecordDeafToggle = async () => {
const newRecordDeaf = structuredClone(
settings.cong_settings.attendance_deaf_record ??
settingSchema.cong_settings.attendance_deaf_record
);

await dbAppSettingsUpdate({
'cong_settings.attendance_online_record': newRecordOnline,
'cong_settings.attendance_deaf_record': setValueForDataView(
newRecordDeaf,
dataView,
!recordDeaf
),
});
};

useEffect(() => {
setRecordOnline(recordOnlineInitial);
}, [recordOnlineInitial]);

useEffect(() => {
setRecordDeaf(recordDeafInitial);
}, [recordDeafInitial]);

return {
recordOnline,
handleRecordOnlineToggle,
recordDeaf,
handleRecordDeafToggle,
};
};

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -150,9 +150,20 @@ const useGroupAdd = ({ onClose }: GroupAddProps) => {
value: false,
});

const deafRecord =
appSettings.cong_settings.attendance_deaf_record ||
structuredClone(settingSchema.cong_settings.attendance_deaf_record);

deafRecord.push({
_deleted: false,
type: group.group_id,
updatedAt: new Date().toISOString(),
value: false,
});
Comment thread
ux-git marked this conversation as resolved.

const firstDayWeek =
appSettings.cong_settings.first_day_week ||
settingSchema.cong_settings.first_day_week;
structuredClone(settingSchema.cong_settings.first_day_week);

firstDayWeek.push({
_deleted: false,
Expand All @@ -163,7 +174,7 @@ const useGroupAdd = ({ onClose }: GroupAddProps) => {

const weekendSongs =
appSettings.cong_settings.schedule_songs_weekend ||
settingSchema.cong_settings.schedule_songs_weekend;
structuredClone(settingSchema.cong_settings.schedule_songs_weekend);

weekendSongs.push({
_deleted: false,
Expand Down Expand Up @@ -194,6 +205,7 @@ const useGroupAdd = ({ onClose }: GroupAddProps) => {
'cong_settings.short_date_format': shortDateFormat,
'cong_settings.format_24h_enabled': format24h,
'cong_settings.attendance_online_record': onlineRecord,
'cong_settings.attendance_deaf_record': deafRecord,
'cong_settings.first_day_week': firstDayWeek,
'cong_settings.schedule_songs_weekend': weekendSongs,
'cong_settings.midweek_meeting': midweekMeeting,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -139,6 +139,20 @@ const useGroupDelete = ({ group }: GroupDeleteProps) => {
findOnline.updatedAt = new Date().toISOString();
}

const deafRecord = structuredClone(
settings.cong_settings.attendance_deaf_record ||
settingSchema.cong_settings.attendance_deaf_record
);

const findDeaf = deafRecord.find(
(record) => record.type === group.group_id
);

if (findDeaf) {
findDeaf._deleted = true;
findDeaf.updatedAt = new Date().toISOString();
}

const midweekMeeting = structuredClone(
settings.cong_settings.midweek_meeting
);
Expand Down Expand Up @@ -205,6 +219,7 @@ const useGroupDelete = ({ group }: GroupDeleteProps) => {
'cong_settings.short_date_format': shortDateFormat,
'cong_settings.format_24h_enabled': format24h,
'cong_settings.attendance_online_record': onlineRecord,
'cong_settings.attendance_deaf_record': deafRecord,
'cong_settings.first_day_week': firstDayWeek,
'cong_settings.schedule_songs_weekend': weekendSongs,
'cong_settings.midweek_meeting': midweekMeeting,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,13 +1,9 @@
export type MeetingStatsData = {
count: number;
total: number;
average: number;
};
import { MeetingAttendanceStats } from '@definition/meeting_attendance';

export type MonthData = {
month: string;
midweek: MeetingStatsData;
weekend: MeetingStatsData;
midweek: MeetingAttendanceStats;
weekend: MeetingAttendanceStats;
};

export type YearlyData = {
Expand All @@ -20,3 +16,9 @@ export type AttendanceExport = {
name: string;
data: YearlyData[];
};

export type ColumnSource = {
label: string;
months: MonthData[];
deaf?: boolean;
};
Loading
Loading