Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 commits
Select commit Hold shift + click to select a range
7611d30
feat(persons): add middle name to the data model
ux-git Jul 25, 2026
e178d61
feat(persons): let a middle name be entered and saved
ux-git Jul 25, 2026
4c387af
feat(persons): match middle name when searching persons
ux-git Jul 25, 2026
9863089
feat(persons): round-trip middle name through import and export
ux-git Jul 25, 2026
c0642ad
fix(persons): lay out the name rows the way the rest of the app does
ux-git Jul 25, 2026
30d3cca
fix(settings): persist the user middle name across devices
ux-git Jul 25, 2026
3191648
feat(utils): compose names that include a middle name
ux-git Jul 25, 2026
6ada756
refactor(persons): pass the middle name where names are composed
ux-git Jul 25, 2026
f79649d
feat(settings): show name formats as two-row options
ux-git Jul 25, 2026
ec829f5
feat(settings): choose a separate name format for printed forms
ux-git Jul 25, 2026
b05b9f3
feat(meetings): print names using the print name format
ux-git Jul 25, 2026
55ac344
fix(persons): keep field order and icons correct for the new formats
ux-git Jul 25, 2026
b873876
feat(demo): seed middle names into the TEST mode data
ux-git Jul 25, 2026
ea15092
feat(settings): add comma-separated name formats for sorted lists
ux-git Jul 25, 2026
7d08ec2
refactor(settings): share one hook between the two name format selects
ux-git Jul 25, 2026
c3f913d
feat(settings): give the circuit overseer a middle name
ux-git Jul 26, 2026
960fae2
tweak(demo): seed middle names for three quarters of dummy persons
ux-git Jul 26, 2026
3b879d8
fix(meetings): print the circuit overseer name with the print format
ux-git Jul 26, 2026
e9bf2fe
feat(persons): let incoming speakers have a middle name
ux-git Jul 26, 2026
21ee7c8
fix(settings): tombstone the print format when a language group goes
ux-git Jul 26, 2026
1ce65d1
feat(settings): let the print format follow the in-app format again
ux-git Jul 26, 2026
7f968ff
fix(meetings): print the default study conductor with the print format
ux-git Jul 26, 2026
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
3 changes: 3 additions & 0 deletions src/constants/table_encryption_map.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ export const TABLE_ENCRYPTION_MAP = {
_deleted: 'shared',
person_uid: 'public',
person_firstname: 'shared',
person_middlename: 'shared',
person_lastname: 'shared',
person_display_name: 'shared',
male: 'shared',
Expand Down Expand Up @@ -35,6 +36,7 @@ export const TABLE_ENCRYPTION_MAP = {
cong_circuit: 'public',
cong_discoverable: 'public',
fullname_option: 'shared',
print_fullname_option: 'shared',
short_date_format: 'shared',
display_name_enabled: 'shared',
schedule_exact_date_enabled: 'shared',
Expand Down Expand Up @@ -68,6 +70,7 @@ export const TABLE_ENCRYPTION_MAP = {
user_local_uid: 'public',
user_members_delegate: 'public',
firstname: 'public',
middlename: 'public',
lastname: 'public',
backup_automatic: 'shared',
theme_follow_os_enabled: 'shared',
Expand Down
1 change: 1 addition & 0 deletions src/definition/api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ export type UserLoginResponseType = {
app_settings: {
user_settings: {
firstname: { value: string; updatedAt: string };
middlename?: { value: string; updatedAt: string };
lastname: { value: string; updatedAt: string };
role: UserGlobalRoleType;
mfa: 'not_enabled' | 'enabled';
Expand Down
1 change: 1 addition & 0 deletions src/definition/person.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ export type PersonType = {
person_uid: string;
person_data: {
person_firstname: { value: string; updatedAt: string };
person_middlename?: { value: string; updatedAt: string };
person_lastname: { value: string; updatedAt: string };
person_display_name: { value: string; updatedAt: string };
male: { value: boolean; updatedAt: string };
Expand Down
12 changes: 12 additions & 0 deletions src/definition/settings.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@ import { AssignmentFieldType } from './assignment';
export enum FullnameOption {
FIRST_BEFORE_LAST = 1,
LAST_BEFORE_FIRST = 2,
FIRST_MIDDLE_LAST = 3,
LAST_FIRST_MIDDLE = 4,
LAST_COMMA_FIRST = 5,
LAST_COMMA_FIRST_MIDDLE = 6,
}

export type AccountTypeState = 'vip' | 'pocket';
Expand Down Expand Up @@ -69,6 +73,12 @@ export type SettingsType = {
updatedAt: string;
_deleted: boolean;
}[];
print_fullname_option?: {
type: string;
value: FullnameOption;
updatedAt: string;
_deleted: boolean;
}[];
short_date_format: {
type: string;
value: string;
Expand Down Expand Up @@ -145,6 +155,7 @@ export type SettingsType = {
}[];
circuit_overseer: {
firstname: { value: string; updatedAt: string };
middlename?: { value: string; updatedAt: string };
lastname: { value: string; updatedAt: string };
display_name: { value: string; updatedAt: string };
visits: CircuitOverseerVisitType[];
Expand Down Expand Up @@ -201,6 +212,7 @@ export type SettingsType = {
user_local_uid: string;
user_members_delegate: string[];
firstname: { value: string; updatedAt: string };
middlename?: { value: string; updatedAt: string };
lastname: { value: string; updatedAt: string };
backup_automatic: {
enabled: { value: boolean; updatedAt: string };
Expand Down
1 change: 1 addition & 0 deletions src/definition/visiting_speakers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ export type VisitingSpeakerType = {
speaker_data: {
cong_id: string;
person_firstname: { value: string; updatedAt: string };
person_middlename?: { value: string; updatedAt: string };
person_lastname: { value: string; updatedAt: string };
person_display_name: { value: string; updatedAt: string };
person_notes: { value: string; updatedAt: string };
Expand Down
3 changes: 3 additions & 0 deletions src/features/app_start/pocket/signup/useSignup.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,9 @@ const useSignup = () => {
'user_settings.account_type': 'pocket',
'user_settings.lastname': app_settings.user_settings.lastname,
'user_settings.firstname': app_settings.user_settings.firstname,
...(app_settings.user_settings.middlename && {
'user_settings.middlename': app_settings.user_settings.middlename,
}),
Comment thread
ux-git marked this conversation as resolved.
'user_settings.user_local_uid': app_settings.user_settings.user_local_uid,
'user_settings.user_members_delegate':
app_settings.user_settings.user_members_delegate,
Expand Down
3 changes: 3 additions & 0 deletions src/features/app_start/vip/hooks/useAuth.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,9 @@ const useAuth = () => {
'user_settings.account_type': 'vip',
'user_settings.lastname': app_settings.user_settings.lastname,
'user_settings.firstname': app_settings.user_settings.firstname,
...(app_settings.user_settings.middlename && {
'user_settings.middlename': app_settings.user_settings.middlename,
}),
});
}

Expand Down
3 changes: 3 additions & 0 deletions src/features/app_start/vip/verify_mfa/useVerifyMFA.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,9 @@ const useVerifyMFA = () => {
'user_settings.account_type': 'vip',
'user_settings.lastname': app_settings.user_settings.lastname,
'user_settings.firstname': app_settings.user_settings.firstname,
...(app_settings.user_settings.middlename && {
'user_settings.middlename': app_settings.user_settings.middlename,
}),
});
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,8 @@ const useAcceptRequest = ({ onConfirm }: AcceptRequestProps) => {
person_name: buildPersonFullname(
person.person_data.person_lastname.value,
person.person_data.person_firstname.value,
fullnameOption
fullnameOption,
person.person_data.person_middlename?.value
),
};
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,8 @@ const usePersonSelect = ({
person_name: buildPersonFullname(
person.person_data.person_lastname.value,
person.person_data.person_firstname.value,
fullnameOption
fullnameOption,
person.person_data.person_middlename?.value
),
Comment thread
ux-git marked this conversation as resolved.
};
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ const useProfileSettings = () => {
person_name: buildPersonFullname(
person.person_data.person_lastname.value,
person.person_data.person_firstname.value,
fullnameOption
fullnameOption,
person.person_data.person_middlename?.value
),
};
});
Expand All @@ -48,7 +49,8 @@ const useProfileSettings = () => {
person_name: buildPersonFullname(
person.person_data.person_lastname.value,
person.person_data.person_firstname.value,
fullnameOption
fullnameOption,
person.person_data.person_middlename?.value
),
};
});
Expand Down Expand Up @@ -151,7 +153,8 @@ const useProfileSettings = () => {
person_name: buildPersonFullname(
person.person_data.person_lastname.value,
person.person_data.person_firstname.value,
fullnameOption
fullnameOption,
person.person_data.person_middlename?.value
),
});
}
Expand All @@ -169,7 +172,8 @@ const useProfileSettings = () => {
person_name: buildPersonFullname(
found.person_data.person_lastname.value,
found.person_data.person_firstname.value,
fullnameOption
fullnameOption,
found.person_data.person_middlename?.value
),
});
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,8 @@ const useGroupDetails = ({ group, onChange }: GroupDetailsProps) => {
person_name: buildPersonFullname(
person.person_data.person_lastname.value,
person.person_data.person_firstname.value,
fullnameOption
fullnameOption,
person.person_data.person_middlename?.value
),
} as UsersOption;
}, [group, persons, fullnameOption]);
Expand Down Expand Up @@ -95,7 +96,8 @@ const useGroupDetails = ({ group, onChange }: GroupDetailsProps) => {
person_name: buildPersonFullname(
person.person_data.person_lastname.value,
person.person_data.person_firstname.value,
fullnameOption
fullnameOption,
person.person_data.person_middlename?.value
),
} as UsersOption;
}, [group, persons, fullnameOption]);
Expand All @@ -109,7 +111,8 @@ const useGroupDetails = ({ group, onChange }: GroupDetailsProps) => {
person_name: buildPersonFullname(
person.person_data.person_lastname.value,
person.person_data.person_firstname.value,
fullnameOption
fullnameOption,
person.person_data.person_middlename?.value
),
elder: personIsElder(person),
};
Expand All @@ -125,7 +128,8 @@ const useGroupDetails = ({ group, onChange }: GroupDetailsProps) => {
person_name: buildPersonFullname(
person.person_data.person_lastname.value,
person.person_data.person_firstname.value,
fullnameOption
fullnameOption,
person.person_data.person_middlename?.value
),
elder: personIsElder(person),
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ import { personsActiveState } from '@states/persons';
import {
JWLangLocaleState,
congNameState,
fullnameOptionState,
printFullnameOptionState,
publishersSortState,
} from '@states/settings';
import { buildPersonFullname } from '@utils/common';
Expand All @@ -26,7 +26,7 @@ const useExportGroups = () => {

const groups_list = useAtomValue(fieldWithLanguageGroupsState);
const persons = useAtomValue(personsActiveState);
const fullnameOption = useAtomValue(fullnameOptionState);
const fullnameOption = useAtomValue(printFullnameOptionState);
const congName = useAtomValue(congNameState);
const sortMethod = useAtomValue(publishersSortState);
const locale = useAtomValue(JWLangLocaleState);
Expand Down Expand Up @@ -74,7 +74,8 @@ const useExportGroups = () => {
person_name: buildPersonFullname(
person.person_data.person_lastname.value,
person.person_data.person_firstname.value,
fullnameOption
fullnameOption,
person.person_data.person_middlename?.value
),
};
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,8 @@ const useMember = ({ member, index, group_id }: GroupMemberProps) => {
return buildPersonFullname(
person.person_data.person_lastname.value,
person.person_data.person_firstname.value,
fullnameOption
fullnameOption,
person.person_data.person_middlename?.value
);
}, [person, fullnameOption]);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,8 @@ const useRemovePerson = ({ group_id, index, member }: RemovePersonProps) => {
const name = buildPersonFullname(
person.person_data.person_lastname.value,
person.person_data.person_firstname.value,
fullnameOption
fullnameOption,
person.person_data.person_middlename?.value
);

return name;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,8 @@ const useMemberItem = ({ member, onDelete }: MemberItemProps) => {
return buildPersonFullname(
person.person_data.person_lastname.value,
person.person_data.person_firstname.value,
fullnameOption
fullnameOption,
person.person_data.person_middlename?.value
);
}, [member, persons, fullnameOption]);

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,8 @@ const useGroupMembers = ({ group, onChange }: GroupMembersProps) => {
person_name: buildPersonFullname(
person.person_data.person_lastname.value,
person.person_data.person_firstname.value,
fullnameOption
fullnameOption,
person.person_data.person_middlename?.value
),
};
});
Expand Down
42 changes: 22 additions & 20 deletions src/features/congregation/settings/circuit_overseer/index.tsx
Original file line number Diff line number Diff line change
@@ -1,36 +1,30 @@
import { FullnameOption } from '@definition/settings';
import {
useAppTranslation,
useBreakpoints,
useCurrentUser,
} from '@hooks/index';
import { useAppTranslation, useCurrentUser } from '@hooks/index';
import {
CardSection,
CardSectionContent,
CardSectionHeader,
TwoColumnsRow,
} from '../shared_styles';
import useCircuitOverseer from './useCircuitOverseer';
import TextField from '@components/textfield';
import WeeksList from './weeks_list';
import { Stack } from '@mui/material';
import { Box, Stack } from '@mui/material';

const CircuitOverseer = () => {
const { t } = useAppTranslation();

const { tablet600Up } = useBreakpoints();

const { isAdmin } = useCurrentUser();

const {
fullnameOption,
displayNameEnabled,
displayname,
firstname,
handleDisplaynameChange,
handleDisplaynameSave,
handleFirstnameChange,
handleFirstnameSave,
handleMiddlenameChange,
handleMiddlenameSave,
middlename,
handleLastnameChange,
handleLastnameSave,
lastname,
Expand All @@ -45,15 +39,12 @@ const CircuitOverseer = () => {

<CardSectionContent>
<Stack spacing="16px">
<TwoColumnsRow
<Box
sx={{
flexDirection: tablet600Up
? fullnameOption === FullnameOption.FIRST_BEFORE_LAST
? 'row'
: 'row-reverse'
: fullnameOption === FullnameOption.FIRST_BEFORE_LAST
? 'column'
: 'column-reverse',
display: 'flex',
gap: '16px',
alignItems: 'center',
flexWrap: 'wrap',
}}
>
<TextField
Expand All @@ -63,6 +54,16 @@ const CircuitOverseer = () => {
onChange={(e) => handleFirstnameChange(e.target.value)}
onKeyUp={handleFirstnameSave}
slotProps={{ input: { readOnly: !isAdmin } }}
sx={{ flex: '1 0 200px' }}
/>
<TextField
type="text"
label={t('tr_middlename')}
value={middlename}
onChange={(e) => handleMiddlenameChange(e.target.value)}
onKeyUp={handleMiddlenameSave}
slotProps={{ input: { readOnly: !isAdmin } }}
sx={{ flex: '1 0 200px' }}
/>
<TextField
type="text"
Expand All @@ -71,8 +72,9 @@ const CircuitOverseer = () => {
onChange={(e) => handleLastnameChange(e.target.value)}
onKeyUp={handleLastnameSave}
slotProps={{ input: { readOnly: !isAdmin } }}
sx={{ flex: '1 0 200px' }}
/>
</TwoColumnsRow>
</Box>

{displayNameEnabled && (
<TextField
Expand Down
Loading
Loading