diff --git a/.github/workflows/renovate.yml b/.github/workflows/renovate.yml
index 417ff678..2264e60a 100644
--- a/.github/workflows/renovate.yml
+++ b/.github/workflows/renovate.yml
@@ -2,7 +2,7 @@ name: Renovate
on:
schedule:
- - cron: "0,15,30,45 3,4 * * *" # Every day eight chances for Renovate to create or rebase branches and create, rebase or merge PRs
+ - cron: "0,30 2,3,4 * * *" # Every day six chances for Renovate to create or rebase branches and create, rebase or merge PRs
workflow_dispatch: # Manually run the workflow
push: # Run the workflow on changes to the configuration
branches:
diff --git a/app/src/app/_components/CmdK/CmdKLoader.tsx b/app/src/app/_components/CmdK/CmdKLoader.tsx
index f4be895b..7d6d4a0b 100644
--- a/app/src/app/_components/CmdK/CmdKLoader.tsx
+++ b/app/src/app/_components/CmdK/CmdKLoader.tsx
@@ -19,13 +19,13 @@ export const CmdKLoader = ({ className, disableAlgolia }: Props) => {
setOpen(true)}
>
Hotkey{" "}
-
+
Strg + K
diff --git a/app/src/app/_components/Modal.tsx b/app/src/app/_components/Modal.tsx
index 71171654..d94e8806 100644
--- a/app/src/app/_components/Modal.tsx
+++ b/app/src/app/_components/Modal.tsx
@@ -30,7 +30,7 @@ export default function Modal({
return createPortal(
router.back())}
>
{
-
+
+
+
+ {/* */}
+
;
+
+export const InstallPWA = ({ className }: Props) => {
+ const installPrompt = useRef(null);
+
+ useEffect(() => {
+ window.addEventListener("beforeinstallprompt", (e) => {
+ installPrompt.current = e;
+ });
+ }, []);
+
+ const handleClick = async () => {
+ if (!installPrompt.current) return;
+ await installPrompt.current.prompt();
+ };
+
+ return (
+
+ App installieren
+
+
+
+
+
+ );
+};
diff --git a/app/src/app/_components/Sidebar/MobileActionBar.tsx b/app/src/app/_components/Sidebar/MobileActionBar.tsx
index bff3d3a3..3c68e271 100644
--- a/app/src/app/_components/Sidebar/MobileActionBar.tsx
+++ b/app/src/app/_components/Sidebar/MobileActionBar.tsx
@@ -87,6 +87,10 @@ export const MobileActionBar = async ({ className }: Props) => {
+ {/*
+
+
*/}
+
diff --git a/app/src/app/app/_components/Event.tsx b/app/src/app/app/_components/Event.tsx
index 8ca1cace..6c8cd9aa 100644
--- a/app/src/app/app/_components/Event.tsx
+++ b/app/src/app/app/_components/Event.tsx
@@ -80,13 +80,16 @@ export const Event = async ({ className, event, index }: Props) => {
-
-
+
+
{authentication.authorize("eventFleet", "read") && (
Details
diff --git a/app/src/app/app/events/[id]/_components/ParticipantsTile.tsx b/app/src/app/app/events/[id]/_components/ParticipantsTile.tsx
index 9e080957..6cba99ea 100644
--- a/app/src/app/app/events/[id]/_components/ParticipantsTile.tsx
+++ b/app/src/app/app/events/[id]/_components/ParticipantsTile.tsx
@@ -33,7 +33,7 @@ export const ParticipantsTile = async ({ className, event }: Props) => {
discord: user,
};
})
- .sort((a, b) => {
+ .toSorted((a, b) => {
return (
a.entity?.handle ||
a.discord.member.nick ||
diff --git a/app/src/app/app/events/[id]/page.tsx b/app/src/app/app/events/[id]/page.tsx
index 21370a75..d3a460ec 100644
--- a/app/src/app/app/events/[id]/page.tsx
+++ b/app/src/app/app/events/[id]/page.tsx
@@ -49,7 +49,7 @@ export default async function Page({ params }: Props) {
const { date, data: event } = await getEvent(params.id);
return (
-
+
Event /
{event.name}
diff --git a/app/src/app/app/events/error.tsx b/app/src/app/app/events/error.tsx
index 492282c3..dd53e470 100644
--- a/app/src/app/app/events/error.tsx
+++ b/app/src/app/app/events/error.tsx
@@ -9,7 +9,7 @@ interface Props {
export default function Error({ error }: Readonly
) {
return (
-
+
+
diff --git a/app/src/app/app/fleet/settings/manufacturer/layout.tsx b/app/src/app/app/fleet/settings/manufacturer/layout.tsx
index 351f0eb6..98ec95f4 100644
--- a/app/src/app/app/fleet/settings/manufacturer/layout.tsx
+++ b/app/src/app/app/fleet/settings/manufacturer/layout.tsx
@@ -7,7 +7,7 @@ type Props = Readonly<{
export default function Layout({ children, breadcrumbs }: Props) {
return (
-
+
{breadcrumbs}
{children}
diff --git a/app/src/app/app/operations/[id]/_components/SquadronFlightPositionEmpty.tsx b/app/src/app/app/operations/[id]/_components/SquadronFlightPositionEmpty.tsx
index 9432b83b..493d6bb5 100644
--- a/app/src/app/app/operations/[id]/_components/SquadronFlightPositionEmpty.tsx
+++ b/app/src/app/app/operations/[id]/_components/SquadronFlightPositionEmpty.tsx
@@ -100,7 +100,7 @@ const SquadronFlightPositionEmpty = ({ type, unit }: Readonly
) => {
const users = allOperationMembers
?.filter((member) => member.status === "confirmed")
- .sort((a, b) => a.user.name!.localeCompare(b.user.name!));
+ .toSorted((a, b) => a.user.name!.localeCompare(b.user.name!));
const memberShips = allOperationMembers?.filter(
(member) => member.status === "confirmed",
@@ -177,7 +177,7 @@ const SquadronFlightPositionEmpty = ({ type, unit }: Readonly) => {
{memberShips?.map((member) => (
{member.user.ships
- .sort((a, b) =>
+ .toSorted((a, b) =>
(a.name || a.variant.name).localeCompare(
b.name || b.variant.name,
),
diff --git a/app/src/app/app/operations/[id]/_components/SquadronTile.tsx b/app/src/app/app/operations/[id]/_components/SquadronTile.tsx
index 1572cca8..61b3e472 100644
--- a/app/src/app/app/operations/[id]/_components/SquadronTile.tsx
+++ b/app/src/app/app/operations/[id]/_components/SquadronTile.tsx
@@ -41,7 +41,7 @@ const SquadronTile = ({ className, unit }: Readonly) => {
{unit.childUnits
- .sort((a, b) => a.title.localeCompare(b.title))
+ .toSorted((a, b) => a.title.localeCompare(b.title))
.map((childUnit) => (
))}
diff --git a/app/src/app/app/operations/[id]/page.tsx b/app/src/app/app/operations/[id]/page.tsx
index 23384e6f..dd925c49 100644
--- a/app/src/app/app/operations/[id]/page.tsx
+++ b/app/src/app/app/operations/[id]/page.tsx
@@ -110,7 +110,7 @@ export default async function Page({ params }: Readonly
) {
);
return (
-
+
) {
{operation.units
.filter((unit) => unit.type === "squadron")
- .sort((a, b) => a.title.localeCompare(b.title))
+ .toSorted((a, b) => a.title.localeCompare(b.title))
.map((unit) => (
))}
@@ -162,7 +162,9 @@ export default async function Page({ params }: Readonly
) {
{confirmedMembers
- .sort((a, b) => a.user.name!.localeCompare(b.user.name!))
+ .toSorted((a, b) =>
+ a.user.name!.localeCompare(b.user.name!),
+ )
.map((member) => (
) {
{unconfirmedMembers
- .sort((a, b) => a.user.name!.localeCompare(b.user.name!))
+ .toSorted((a, b) =>
+ a.user.name!.localeCompare(b.user.name!),
+ )
.map((member) => (
+
Operationen
+
{showUwuHero ? : }
diff --git a/app/src/app/app/roles/_components/RolesTile.tsx b/app/src/app/app/roles/_components/RolesTile.tsx
index f4fdbada..7eeca674 100644
--- a/app/src/app/app/roles/_components/RolesTile.tsx
+++ b/app/src/app/app/roles/_components/RolesTile.tsx
@@ -30,7 +30,7 @@ export const RolesTile = async ({ className }: Props) => {
prisma.classificationLevel.findMany(),
]);
- const sortedRoles = roles.sort((a, b) => a.name.localeCompare(b.name));
+ const sortedRoles = roles.toSorted((a, b) => a.name.localeCompare(b.name));
const enableOperations = await dedupedGetUnleashFlag("EnableOperations");
diff --git a/app/src/app/app/roles/page.tsx b/app/src/app/app/roles/page.tsx
index 898f09be..4eec6059 100644
--- a/app/src/app/app/roles/page.tsx
+++ b/app/src/app/app/roles/page.tsx
@@ -13,7 +13,7 @@ export default async function Page() {
authentication.authorizePage("role", "manage");
return (
-
+
Rollen
}>
diff --git a/app/src/app/app/settings/_components/classification-level/ClassificationLevelsTile.tsx b/app/src/app/app/settings/_components/classification-level/ClassificationLevelsTile.tsx
index 34a71205..392ec8b7 100644
--- a/app/src/app/app/settings/_components/classification-level/ClassificationLevelsTile.tsx
+++ b/app/src/app/app/settings/_components/classification-level/ClassificationLevelsTile.tsx
@@ -12,7 +12,7 @@ interface Props {
const ClassificationLevelsTile = async ({ className }: Readonly) => {
const classificationLevels = await prisma.classificationLevel.findMany();
- const sortedClassificationLevels = classificationLevels.sort((a, b) =>
+ const sortedClassificationLevels = classificationLevels.toSorted((a, b) =>
a.name.localeCompare(b.name),
);
diff --git a/app/src/app/app/settings/_components/note-type/NoteTypesTile.tsx b/app/src/app/app/settings/_components/note-type/NoteTypesTile.tsx
index 54a11320..de1d7380 100644
--- a/app/src/app/app/settings/_components/note-type/NoteTypesTile.tsx
+++ b/app/src/app/app/settings/_components/note-type/NoteTypesTile.tsx
@@ -12,7 +12,7 @@ interface Props {
const NoteTypesTile = async ({ className }: Readonly) => {
const noteTypes = await prisma.noteType.findMany();
- const sortedNoteTypes = noteTypes.sort((a, b) =>
+ const sortedNoteTypes = noteTypes.toSorted((a, b) =>
a.name.localeCompare(b.name),
);
diff --git a/app/src/app/app/settings/page.tsx b/app/src/app/app/settings/page.tsx
index 8def507c..ad45e6ae 100644
--- a/app/src/app/app/settings/page.tsx
+++ b/app/src/app/app/settings/page.tsx
@@ -37,7 +37,7 @@ export default async function Page() {
}
return (
-
+
Einstellungen
{showNoteTypes && }
diff --git a/app/src/app/app/spynet/_components/ActivityTile/ActivityTile.tsx b/app/src/app/app/spynet/_components/ActivityTile/ActivityTile.tsx
index ab83f1da..a7f3a2d3 100644
--- a/app/src/app/app/spynet/_components/ActivityTile/ActivityTile.tsx
+++ b/app/src/app/app/spynet/_components/ActivityTile/ActivityTile.tsx
@@ -94,7 +94,7 @@ export const ActivityTile = async ({ className }: Props) => {
...(await mapOrganizationMembershipHistoryEntries(result[2])),
];
- const sortedEntries = entries.sort(
+ const sortedEntries = entries.toSorted(
(a, b) => b.date.getTime() - a.date.getTime(),
);
diff --git a/app/src/app/app/spynet/citizen/_components/Tile.tsx b/app/src/app/app/spynet/citizen/_components/Tile.tsx
index 1ce515fc..5cad94f8 100644
--- a/app/src/app/app/spynet/citizen/_components/Tile.tsx
+++ b/app/src/app/app/spynet/citizen/_components/Tile.tsx
@@ -78,7 +78,7 @@ export const Tile = async ({ searchParams }: Props) => {
return unknown && role;
});
- const sortedRows = filteredRows.sort((a, b) => {
+ const sortedRows = filteredRows.toSorted((a, b) => {
switch (searchParams.get("sort")) {
case "handle-asc":
return sortAscWithAndNullLast(a.entity.handle, b.entity.handle);
diff --git a/app/src/app/app/spynet/citizen/page.tsx b/app/src/app/app/spynet/citizen/page.tsx
index 67014096..a1a92400 100644
--- a/app/src/app/app/spynet/citizen/page.tsx
+++ b/app/src/app/app/spynet/citizen/page.tsx
@@ -23,7 +23,7 @@ export default async function Page({ searchParams: _searchParams }: Props) {
const searchParams = nextjsSearchParamsToNativeSearchParams(_searchParams);
return (
-
+
) => {
.filter((log) => log.type === "handle")
.filter((log) => {
const confirmed = log.attributes
- .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime())
+ .toSorted((a, b) => b.createdAt.getTime() - a.createdAt.getTime())
.find((attribute) => attribute.key === "confirmed");
if (confirmed && confirmed.value === "confirmed") return true;
@@ -40,7 +40,7 @@ const Handles = ({ entity }: Readonly
) => {
return authentication.authorize("handle", "confirm");
})
- .sort((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
+ .toSorted((a, b) => b.createdAt.getTime() - a.createdAt.getTime());
return (
<>
diff --git a/app/src/app/app/spynet/entity/[id]/_components/notes/Notes.tsx b/app/src/app/app/spynet/entity/[id]/_components/notes/Notes.tsx
index 4ab4ec88..f9d3a5d7 100644
--- a/app/src/app/app/spynet/entity/[id]/_components/notes/Notes.tsx
+++ b/app/src/app/app/spynet/entity/[id]/_components/notes/Notes.tsx
@@ -43,7 +43,7 @@ export const Notes = async ({ className, entity }: Props) => {
prisma.noteType.findMany(),
]);
- const sortedNotes = notes.sort(
+ const sortedNotes = notes.toSorted(
(a, b) => b.createdAt.getTime() - a.createdAt.getTime(),
);
diff --git a/app/src/app/app/spynet/entity/[id]/page.tsx b/app/src/app/app/spynet/entity/[id]/page.tsx
index fd37c715..fbc2104b 100644
--- a/app/src/app/app/spynet/entity/[id]/page.tsx
+++ b/app/src/app/app/spynet/entity/[id]/page.tsx
@@ -71,7 +71,7 @@ export default async function Page({ params }: Props) {
);
return (
-
+
) => {
return confirmation && noteType && classificationLevel;
});
- const sortedRows = filteredRows.sort((a, b) => {
+ const sortedRows = filteredRows.toSorted((a, b) => {
switch (searchParams.get("sort")) {
case "confirmed-at-asc":
return sortAscWithAndNullLast(
diff --git a/app/src/app/app/spynet/notes/page.tsx b/app/src/app/app/spynet/notes/page.tsx
index 3712f129..09979bc1 100644
--- a/app/src/app/app/spynet/notes/page.tsx
+++ b/app/src/app/app/spynet/notes/page.tsx
@@ -23,7 +23,7 @@ export default async function Page({ searchParams: _searchParams }: Props) {
const searchParams = nextjsSearchParamsToNativeSearchParams(_searchParams);
return (
-
+
+
) => {
onSubmit={handleSubmit(onSubmit)}
>
{Array.from(entityLogTypes)
- .sort((a, b) => a[1].localeCompare(b[1]))
+ .toSorted((a, b) => a[1].localeCompare(b[1]))
.map(([type, translation]) => (
) => {
return confirmation && type;
});
- const sortedRows = filteredRows.sort((a, b) => {
+ const sortedRows = filteredRows.toSorted((a, b) => {
switch (searchParams.get("sort")) {
case "confirmed-at-asc":
return sortAscWithAndNullLast(
diff --git a/app/src/app/app/spynet/other/page.tsx b/app/src/app/app/spynet/other/page.tsx
index 4d98375b..a8986d84 100644
--- a/app/src/app/app/spynet/other/page.tsx
+++ b/app/src/app/app/spynet/other/page.tsx
@@ -23,7 +23,7 @@ export default async function Page({ searchParams: _searchParams }: Props) {
const searchParams = nextjsSearchParamsToNativeSearchParams(_searchParams);
return (
-
+
+
diff --git a/app/src/app/app/users/page.tsx b/app/src/app/app/users/page.tsx
index b4455b12..fcc9a793 100644
--- a/app/src/app/app/users/page.tsx
+++ b/app/src/app/app/users/page.tsx
@@ -13,7 +13,7 @@ export default async function Page() {
authentication.authorizePage("user", "read");
return (
-
+
Benutzer
}>