[#440] changed behavior for localised default name to be only a display thing (#556)

This commit is contained in:
Camille Moussu
2026-02-18 17:26:39 +01:00
committed by GitHub
parent 5d9eb8e19d
commit f520a9b6fe
9 changed files with 56 additions and 32 deletions
+27 -19
View File
@@ -2,6 +2,8 @@ import { useAppDispatch, useAppSelector } from "@/app/hooks";
import { getCalendars } from "@/features/Calendars/CalendarApi"; import { getCalendars } from "@/features/Calendars/CalendarApi";
import { Calendar } from "@/features/Calendars/CalendarTypes"; import { Calendar } from "@/features/Calendars/CalendarTypes";
import { addSharedCalendarAsync } from "@/features/Calendars/services"; import { addSharedCalendarAsync } from "@/features/Calendars/services";
import { CalendarData } from "@/features/Calendars/types/CalendarData";
import { renameDefault } from "@/utils/renameDefault";
import { import {
Avatar, Avatar,
Box, Box,
@@ -21,7 +23,7 @@ import { ColorPicker } from "./CalendarColorPicker";
import { defaultColors, getAccessiblePair } from "./utils/calendarColorsUtils"; import { defaultColors, getAccessiblePair } from "./utils/calendarColorsUtils";
interface CalendarWithOwner { interface CalendarWithOwner {
cal: Record<string, unknown>; cal: CalendarData;
owner: User; owner: User;
} }
@@ -35,7 +37,7 @@ function CalendarItem({
onColorChange: (color: Record<string, string>) => void; onColorChange: (color: Record<string, string>) => void;
}) { }) {
const theme = useTheme(); const theme = useTheme();
const { t } = useI18n();
return ( return (
<Box <Box
key={cal.owner.email + cal.cal["dav:name"]} key={cal.owner.email + cal.cal["dav:name"]}
@@ -61,9 +63,12 @@ function CalendarItem({
/> />
<Box> <Box>
<Typography variant="body1"> <Typography variant="body1">
{cal.cal["dav:name"] === "#default" {renameDefault(
? cal.owner.displayName + "'s calendar" cal.cal["dav:name"],
: cal.cal["dav:name"]} cal.owner.displayName,
t,
false
)}
</Typography> </Typography>
<Typography variant="body2" color="textSecondary"> <Typography variant="body2" color="textSecondary">
{cal.owner.email} {cal.owner.email}
@@ -120,7 +125,7 @@ function SelectedCalendarsList({
(existing: Calendar) => (existing: Calendar) =>
existing.id === existing.id ===
cal.cal?._links?.self?.href cal.cal?._links?.self?.href
.replace("/calendars/", "") ?.replace("/calendars/", "")
.replace(".json", "") .replace(".json", "")
); );
@@ -218,7 +223,7 @@ export default function CalendarSearch({
(existing: Calendar) => (existing: Calendar) =>
existing.id === existing.id ===
cal.cal?._links?.self?.href cal.cal?._links?.self?.href
.replace("/calendars/", "") ?.replace("/calendars/", "")
.replace(".json", "") .replace(".json", "")
); );
if (!exists && cal.cal) { if (!exists && cal.cal) {
@@ -237,15 +242,15 @@ export default function CalendarSearch({
}, },
}) })
); );
return cal.cal._links.self.href return cal.cal._links.self?.href
.replace("/calendars/", "") ?.replace("/calendars/", "")
.replace(".json", ""); .replace(".json", "");
} }
return null; return null;
}) })
); );
onClose(idList.filter(Boolean)); onClose(idList.filter(Boolean) as string[]);
setSelectedCalendars([]); setSelectedCalendars([]);
setSelectedUsers([]); setSelectedUsers([]);
} }
@@ -286,20 +291,23 @@ export default function CalendarSearch({
const cals = await Promise.all( const cals = await Promise.all(
value.map(async (user: User) => { value.map(async (user: User) => {
if (user?.openpaasId) { if (user?.openpaasId) {
const cals = (await getCalendars( const cals = await getCalendars(
user.openpaasId, user.openpaasId,
"sharedPublic=true&" "sharedPublic=true&"
)) as Record<string, unknown>; );
return cals._embedded?.["dav:calendar"] return cals._embedded?.["dav:calendar"]
? cals._embedded["dav:calendar"].map( ? cals._embedded["dav:calendar"].map((cal) => ({
(cal: Record<string, unknown>) => ({ cal, owner: user }) cal,
) owner: user,
}))
: { cal: undefined, owner: user }; : { cal: undefined, owner: user };
} }
return null; return null;
}) })
); );
setSelectedCalendars(cals.flat().filter(Boolean)); setSelectedCalendars(
cals.flat().filter(Boolean) as CalendarWithOwner[]
);
}} }}
/> />
@@ -310,14 +318,14 @@ export default function CalendarSearch({
if (!cal.cal?._links?.self?.href) return; if (!cal.cal?._links?.self?.href) return;
setSelectedCalendars((prev) => setSelectedCalendars((prev) =>
prev.filter( prev.filter(
(c) => c.cal?._links?.self?.href !== cal.cal._links.self.href (c) => c.cal?._links?.self?.href !== cal.cal._links.self?.href
) )
); );
if ( if (
!selectedCal.find( !selectedCal.find(
(c) => (c) =>
cal.owner.email === c.owner.email && cal.owner.email === c.owner.email &&
c.cal?._links?.self?.href !== cal.cal._links.self.href c.cal?._links?.self?.href !== cal.cal._links.self?.href
) )
) { ) {
setSelectedUsers((prev) => setSelectedUsers((prev) =>
@@ -329,7 +337,7 @@ export default function CalendarSearch({
setSelectedCalendars((prev) => setSelectedCalendars((prev) =>
prev.map((prevcal) => prev.map((prevcal) =>
prevcal.owner.email === cal.owner.email && prevcal.owner.email === cal.owner.email &&
prevcal.cal._links.self.href === cal.cal._links.self.href prevcal.cal._links.self?.href === cal.cal._links.self?.href
? { ? {
...prevcal, ...prevcal,
cal: { cal: {
@@ -2,6 +2,7 @@ import { useAppDispatch, useAppSelector } from "@/app/hooks";
import { Calendar } from "@/features/Calendars/CalendarTypes"; import { Calendar } from "@/features/Calendars/CalendarTypes";
import { removeCalendarAsync } from "@/features/Calendars/services"; import { removeCalendarAsync } from "@/features/Calendars/services";
import { extractEventBaseUuid } from "@/utils/extractEventBaseUuid"; import { extractEventBaseUuid } from "@/utils/extractEventBaseUuid";
import { renameDefault } from "@/utils/renameDefault";
import { trimLongTextWithoutSpace } from "@/utils/textUtils"; import { trimLongTextWithoutSpace } from "@/utils/textUtils";
import { import {
Accordion, Accordion,
@@ -298,7 +299,7 @@ function CalendarSelector({
wordBreak: "break-word", wordBreak: "break-word",
}} }}
> >
{trimmedName} {renameDefault(trimmedName, calendars[id].owner, t, isPersonal)}
</span> </span>
</label> </label>
<IconButton className="MoreBtn" onClick={handleClick}> <IconButton className="MoreBtn" onClick={handleClick}>
@@ -36,12 +36,7 @@ export const addSharedCalendarAsync = createAsyncThunk<
color: cal.color, color: cal.color,
link: `/calendars/${userId}/${calId}.json`, link: `/calendars/${userId}/${calId}.json`,
desc: cal.cal["caldav:description"] ?? "", desc: cal.cal["caldav:description"] ?? "",
name: name: cal.cal["dav:name"] ?? "",
ownerData.id !== userId && cal.cal["dav:name"] === "#default"
? `${ownerData.firstname ? `${ownerData.firstname} ` : ""}${
ownerData.lastname ?? ""
}` + "'s calendar"
: (cal.cal["dav:name"] ?? ""),
owner: `${ownerData.firstname ? `${ownerData.firstname} ` : ""}${ owner: `${ownerData.firstname ? `${ownerData.firstname} ` : ""}${
ownerData.lastname ?? "" ownerData.lastname ?? ""
}`, }`,
@@ -65,11 +65,6 @@ export const getCalendarsListAsync = createAsyncThunk<
lastname: "Unknown User", lastname: "Unknown User",
emails: [], emails: [],
}; };
const name =
ownerId !== user.id && cal["dav:name"] === "#default"
? `${ownerData.firstname ? `${ownerData.firstname} ` : ""}${ownerData.lastname}` +
"'s calendar"
: cal["dav:name"];
const color = { const color = {
light: cal["apple:color"] ?? "#006BD8", light: cal["apple:color"] ?? "#006BD8",
@@ -77,7 +72,7 @@ export const getCalendarsListAsync = createAsyncThunk<
}; };
fetchedCalendars[id] = { fetchedCalendars[id] = {
id, id,
name, name: cal["dav:name"] ?? "",
link, link,
owner: `${ownerData.firstname ? `${ownerData.firstname} ` : ""}${ownerData.lastname}`, owner: `${ownerData.firstname ? `${ownerData.firstname} ` : ""}${ownerData.lastname}`,
ownerEmails: ownerData.emails, ownerEmails: ownerData.emails,
+2
View File
@@ -2,6 +2,8 @@
"locale": "en-gb", "locale": "en-gb",
"calendar": { "calendar": {
"personal": "My calendars", "personal": "My calendars",
"defaultPersonalCalendarName": "My calendar",
"defaultCalendarName": "%{name}'s calendar",
"delegated": "Delegated calendars", "delegated": "Delegated calendars",
"other": "Other calendars", "other": "Other calendars",
"caldav_access": "CalDAV access", "caldav_access": "CalDAV access",
+2
View File
@@ -2,6 +2,8 @@
"locale": "fr-fr", "locale": "fr-fr",
"calendar": { "calendar": {
"personal": "Mes calendriers", "personal": "Mes calendriers",
"defaultPersonalCalendarName": "Mon calendrier",
"defaultCalendarName": "Calendrier de %{name}",
"delegated": "Calendriers délégués", "delegated": "Calendriers délégués",
"other": "Autres calendriers", "other": "Autres calendriers",
"caldav_access": "Accès CalDAV", "caldav_access": "Accès CalDAV",
+2
View File
@@ -2,6 +2,8 @@
"locale": "ru-ru", "locale": "ru-ru",
"calendar": { "calendar": {
"personal": "Личные", "personal": "Личные",
"defaultPersonalCalendarName": "Мой календарь",
"defaultCalendarName": "Календарь %{name}",
"delegated": "Делегированные", "delegated": "Делегированные",
"other": "Другие", "other": "Другие",
"caldav_access": "Доступ CalDAV", "caldav_access": "Доступ CalDAV",
+2
View File
@@ -2,6 +2,8 @@
"locale": "vi", "locale": "vi",
"calendar": { "calendar": {
"personal": "Lịch cá nhân", "personal": "Lịch cá nhân",
"defaultPersonalCalendarName": "Lịch của tôi",
"defaultCalendarName": "Lịch của %{name}",
"delegated": "Lịch được ủy quyền", "delegated": "Lịch được ủy quyền",
"other": "Lịch khác", "other": "Lịch khác",
"caldav_access": "Truy cập CalDAV", "caldav_access": "Truy cập CalDAV",
+17
View File
@@ -0,0 +1,17 @@
export function renameDefault(
davName: string | undefined,
ownerName: string,
t: (key: string, params?: object) => string,
isOwnCalendar?: boolean
) {
if (!davName) {
return t("calendar.defaultCalendarName", { name: ownerName });
}
if (davName !== "#default") {
return davName;
}
if (isOwnCalendar) {
return t("calendar.defaultPersonalCalendarName");
}
return t("calendar.defaultCalendarName", { name: ownerName });
}