import { inventoryApi, inventoryKeys } from "@metis/assets/client"; import { inventoryApi as resourceApi, inventoryKeys as resourceKeys, } from "@metis/resources/client"; import { Button } from "@repo/shadcn-ui/components/button"; import { EntityAction, EntityListHeader, EntityRowActions, EntityStatus, EntityTable, } from "@repo/shadcn-ui/components/entity-list"; import { FormDialog } from "@repo/shadcn-ui/components/form-dialog"; import { useQuery } from "@tanstack/react-query"; import { useState } from "react"; import { useTranslation } from "react-i18next"; import type { ApplicationConfigurationDTO, CompanyDTO } from "../../common"; import { profileApi, profileKeys } from "../profiles/work-profile-api"; import { applicationApi, applicationKeys } from "./application-api"; import { ApplicationConfigurationForm } from "./application-configuration-form"; import { ApplicationFeedback } from "./application-feedback"; export function ApplicationConfigurationsPage({ company, csrfToken, initialProfileId, }: { company: CompanyDTO; csrfToken: string; initialProfileId?: string; }) { const { t, i18n } = useTranslation("companies"); const [editor, setEditor] = useState(); const [view, setView] = useState(); const [search, setSearch] = useState(""); const query = useQuery({ queryKey: applicationKeys.company(company.id), queryFn: () => applicationApi.get(company.id), }); const profiles = useQuery({ queryKey: profileKeys.company(company.id), queryFn: () => profileApi.get(company.id), }); const inventory = useQuery({ queryKey: inventoryKeys.company(company.id), queryFn: () => inventoryApi.get(company.id), }); const resources = useQuery({ queryKey: resourceKeys.company(company.id), queryFn: () => resourceApi.get(company.id), }); const resource = (id: string) => resources.data?.resources.find((item) => item.id === id)?.values.name ?? id; const configurations = query.data?.configurations ?? []; const asset = (id: string) => inventory.data?.assets.find((item) => item.id === id)?.values.name ?? id; const profile = (id: string) => profiles.data?.profiles.find((item) => item.id === id); const label = (id: string) => { const item = profile(id); return item ? `${item.values.name} · ${company.people.find((person) => person.id === item.values.personId)?.name ?? ""} · ${asset(item.values.assetId)}` : id; }; const filtered = configurations.filter( (item) => (!initialProfileId || item.values.profileId === initialProfileId) && `${resource(item.values.resourceId)} ${label(item.values.profileId)}` .toLocaleLowerCase() .includes(search.trim().toLocaleLowerCase()) ); const edited = configurations.find((item) => item.id === editor); const viewed = configurations.find((item) => item.id === view); const ready = [query.data, profiles.data, inventory.data, resources.data].every(Boolean); const canCreate = !initialProfileId || profile(initialProfileId)?.values.active === true; return (
{" "} {" "} } locale={i18n.language} title={t("applications.title")} /> {(query.isPending || profiles.isPending || inventory.isPending || resources.isPending) && (

{t("loading")}

)} {(query.isError || profiles.isError || inventory.isError || resources.isError) && ( )} {ready && ( resource(item.values.resourceId), hideable: false, render: (item) => ( ), }, { id: "profile", label: t("profiles.title"), value: (item) => label(item.values.profileId), render: (item) => <>{label(item.values.profileId)}, }, { id: "state", label: t("status"), value: (item) => t(`mail.${item.values.state}`), render: (item) => ( {t(`mail.${item.values.state}`)} ), }, { id: "delivery", label: t("applications.delivery"), value: (item) => t(`applications.${item.values.delivery}`), render: (item) => <>{t(`applications.${item.values.delivery}`)}, }, { id: "version", label: t("applications.version"), value: (item) => item.values.version, render: (item) => <>{item.values.version || "—"}, }, { id: "review", label: t("profiles.review"), value: (item) => item.needsReview, render: (item) => <>{item.needsReview ? t("applications.review") : "—"}, }, { id: "actions", label: t("actions"), hideable: false, render: (item) => ( {" "}
setView(item.id)}> {t("mail.history")} {!["removed", "never_configured"].includes(item.values.state) && ( setEditor(item.id)}>{t("edit")} )}
{" "}
), }, ]} emptyMessage={t("applications.empty")} items={filtered} locale={i18n.language} onSearchChange={setSearch} search={search} searchPlaceholder={t("applications.search")} title={t("applications.title")} /> )} {editor && ( { if (!open) { setEditor(undefined); } }} open title={t(edited ? "applications.edit" : "applications.new")} wide > setEditor(undefined)} /> )} {viewed && ( { if (!open) { setView(undefined); } }} open title={t("mail.history")} wide > )}
); } function ApplicationHistory({ configuration }: { configuration: ApplicationConfigurationDTO }) { const { t, i18n } = useTranslation("companies"); return (
    {[...configuration.history].reverse().map((revision) => (
  1. {new Intl.DateTimeFormat(i18n.language, { dateStyle: "medium", timeStyle: "short", }).format(new Date(revision.recordedAt))}{" "} · {revision.actorName}

    {t(`applications.${revision.values.delivery}`)} · {t(`mail.${revision.values.state}`)}

    {revision.values.version && (

    {t("applications.versionValue", { version: revision.values.version })}

    )} {revision.values.notes && (

    {revision.values.notes}

    )}
  2. ))}
); }