Skip to content

Commit

Permalink
Merge pull request #261 from cabcookie:consider-activities-with-peopl…
Browse files Browse the repository at this point in the history
…e-mentioned

Partnerprojekte bei Partnerdetails zeigen
  • Loading branch information
cabcookie authored Nov 28, 2024
2 parents 42c8475 + 13af2ad commit b40f553
Show file tree
Hide file tree
Showing 3 changed files with 85 additions and 23 deletions.
93 changes: 81 additions & 12 deletions api/useAccountActivities.ts
Original file line number Diff line number Diff line change
@@ -1,44 +1,111 @@
import { type Schema } from "@/amplify/data/resource";
import { generateClient, SelectionSet } from "aws-amplify/data";
import { filter, flatMap, flow, map, sortBy } from "lodash/fp";
import { filter, flatMap, flow, map, sortBy, union, uniqBy } from "lodash/fp";
import useSWR from "swr";
import { handleApiErrors } from "./globals";
const client = generateClient<Schema>();

const selectionSet = [
const selectionSetAccount = [
"projects.activities.activity.id",
"projects.activities.activity.createdAt",
"projects.activities.activity.finishedOn",
"projects.activities.activity.forProjects.projects.id",
"projects.activities.activity.meetingActivitiesId",
] as const;

type ActivityData = SelectionSet<
type ActivityAccountData = SelectionSet<
Schema["AccountProjects"]["type"],
typeof selectionSet
typeof selectionSetAccount
>;
type ProjectActivityData =
ActivityData["projects"]["activities"][number]["activity"];
type ProjectActivityAccountData =
ActivityAccountData["projects"]["activities"][number]["activity"];

const selectionSetPartner = [
"activities.activity.id",
"activities.activity.createdAt",
"activities.activity.finishedOn",
"activities.activity.forProjects.projects.id",
"activities.activity.meetingActivitiesId",
] as const;

type ActivityPartnerData = SelectionSet<
Schema["Projects"]["type"],
typeof selectionSetPartner
>;

type ProjectActivityPartnerData =
ActivityPartnerData["activities"][number]["activity"];

type AccountActivity = {
id: string;
finishedOn: Date;
projectIds: string[];
meetingId?: string;
};

const mapActivity = ({
const mapActivityAccount = ({
id,
createdAt,
finishedOn,
}: ProjectActivityData): AccountActivity => ({
forProjects,
meetingActivitiesId,
}: ProjectActivityAccountData): AccountActivity => ({
id,
finishedOn: new Date(finishedOn || createdAt),
projectIds: forProjects?.map((p) => p.projects.id) ?? [],
meetingId: meetingActivitiesId || undefined,
});

const mapActivityPartner = ({
id,
createdAt,
finishedOn,
forProjects,
meetingActivitiesId,
}: ProjectActivityPartnerData): AccountActivity => ({
id,
finishedOn: new Date(finishedOn || createdAt),
projectIds: forProjects?.map((p) => p.projects.id) ?? [],
meetingId: meetingActivitiesId || undefined,
});

const fetchPartnerActivities = async (accountId: string) => {
const { data, errors } = await client.models.Projects.listByPartnerId(
{
partnerId: accountId,
},
{
selectionSet: selectionSetPartner,
}
);
if (errors) {
handleApiErrors(errors, "Error loading partner activities");
throw errors;
}
if (!data)
throw new Error(`Receive partner activities failed for ${accountId}`);
try {
return flow(
flatMap((d: ActivityPartnerData) => d.activities),
map("activity"),
filter((a) => !!a),
map(mapActivityPartner),
sortBy((a: AccountActivity) => -a.finishedOn.getTime())
)(data);
} catch (error) {
console.error("fetchPartnerActivities", { error });
throw error;
}
};

const fetchAccountActivities = (accountId?: string) => async () => {
if (!accountId) return;
const partnerActivities = await fetchPartnerActivities(accountId);
const { data, errors } =
await client.models.AccountProjects.listAccountProjectsByAccountId(
{ accountId },
{
selectionSet,
selectionSet: selectionSetAccount,
}
);
if (errors) {
Expand All @@ -49,11 +116,13 @@ const fetchAccountActivities = (accountId?: string) => async () => {
throw new Error(`Receive account activities failed for ${accountId}`);
try {
return flow(
flatMap((d: ActivityData) => d.projects.activities),
flatMap((d: ActivityAccountData) => d.projects.activities),
map("activity"),
filter((a) => !!a),
map(mapActivity),
sortBy((a: AccountActivity) => -a.finishedOn.getTime())
map(mapActivityAccount),
union(partnerActivities),
uniqBy<AccountActivity>("id"),
sortBy((a) => -a.finishedOn.getTime())
)(data);
} catch (error) {
console.error("fetchAccountActivities", { error });
Expand Down
10 changes: 2 additions & 8 deletions components/accounts/AccountNotes.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import useAccountActivities from "@/api/useAccountActivities";
import { FC } from "react";
import ActivityComponent from "../activities/activity";
import LeanActivitiy from "../activities/activity-lean";
import DefaultAccordionItem from "../ui-elements/accordion/DefaultAccordionItem";

type AccountNotesProps = {
Expand All @@ -13,13 +13,7 @@ const AccountNotes: FC<AccountNotesProps> = ({ accountId }) => {
return (
<DefaultAccordionItem value="notes" triggerTitle="Notes">
{activities?.map((a) => (
<ActivityComponent
key={a.id}
activityId={a.id}
showDates
showMeeting
showProjects
/>
<LeanActivitiy key={a.id} activity={a} readonly />
))}
</DefaultAccordionItem>
);
Expand Down
5 changes: 2 additions & 3 deletions docs/releases/next.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
# Partnerprojekte bei Partnerdetails zeigen (Version :VERSION)

- Bei Accounts tauchen auch Projekte auf, bei denen der Account als Partner engagiert ist
- Bei Accounts tauchen auch Projekte auf, bei denen der Account als Partner engagiert ist.
- Auch die Notizen werden angezeigt, wenn der Account als Partner im Projekt involviert ist.

## In Arbeit

- das gleiche gilt auch für die Notizen.

## Geplant

### Meetings
Expand Down

0 comments on commit b40f553

Please sign in to comment.