) {
+ const { __ } = useTranslate();
+
+ if (!evidence.fileUrl) {
+ return null;
+ }
+
+ if (evidence.mimeType.startsWith("image/")) {
+ return (
+
+ );
+ }
+
+ if (evidence.mimeType.includes("pdf")) {
+ return (
+
+ );
+ }
+
+ return (
+
+ );
+}
diff --git a/apps/console/src/pages/organizations/measures/tabs/MeasureEvidencesTab.tsx b/apps/console/src/pages/organizations/measures/tabs/MeasureEvidencesTab.tsx
index 873de4575..711876514 100644
--- a/apps/console/src/pages/organizations/measures/tabs/MeasureEvidencesTab.tsx
+++ b/apps/console/src/pages/organizations/measures/tabs/MeasureEvidencesTab.tsx
@@ -1,9 +1,10 @@
-import { useOutletContext } from "react-router";
+import { useNavigate, useOutletContext, useParams } from "react-router";
import type { MeasureEvidencesTabFragment$key } from "./__generated__/MeasureEvidencesTabFragment.graphql";
import { useTranslate } from "@probo/i18n";
import { usePageTitle } from "@probo/hooks";
import {
- Button,
+ ActionDropdown,
+ DropdownItem,
Dropzone,
IconArrowInbox,
IconTrashCan,
@@ -18,8 +19,9 @@ import { graphql } from "relay-runtime";
import { useFragment, useMutation, useRefetchableFragment } from "react-relay";
import { SortableTable } from "/components/SortableTable";
import type { MeasureEvidencesTabFragment_evidence$key } from "./__generated__/MeasureEvidencesTabFragment_evidence.graphql";
-import { fileSize, fileType } from "@probo/helpers";
-import { promisifyMutation, sprintf } from "@probo/helpers";
+import { fileSize, fileType, promisifyMutation, sprintf } from "@probo/helpers";
+import { EvidencePreviewDialog } from "../dialog/EvidencePreviewDialog";
+import { useOrganizationId } from "/hooks/useOrganizationId";
export const evidencesFragment = graphql`
fragment MeasureEvidencesTabFragment on Measure
@@ -43,6 +45,9 @@ export const evidencesFragment = graphql`
edges {
node {
id
+ filename
+ fileUrl
+ mimeType
...MeasureEvidencesTabFragment_evidence
}
}
@@ -50,7 +55,7 @@ export const evidencesFragment = graphql`
}
`;
-const evidenceFragment = graphql`
+export const evidenceFragment = graphql`
fragment MeasureEvidencesTabFragment_evidence on Evidence {
id
filename
@@ -93,12 +98,15 @@ export default function MeasureEvidencesTab() {
const { measure } = useOutletContext<{
measure: MeasureEvidencesTabFragment$key & { id: string; name: string };
}>();
+ const { evidenceId } = useParams<{ evidenceId: string }>();
const [data, refetch] = useRefetchableFragment(evidencesFragment, measure);
const connectionId = data.evidences.__id;
const evidences = data.evidences?.edges?.map((edge) => edge.node) ?? [];
-
+ const navigate = useNavigate();
const { __ } = useTranslate();
const [mutate, isUpdating] = useMutation(uploadEvidenceMutation);
+ const evidence = evidences.find((e) => e.id === evidenceId);
+ const organizationId = useOrganizationId();
usePageTitle(measure.name + " - " + __("Evidences"));
@@ -123,7 +131,7 @@ export default function MeasureEvidencesTab() {
))}
+ {evidence && (
+
+ navigate(
+ `/organizations/${organizationId}/measures/${measure.id}/evidences`,
+ )
+ }
+ evidence={evidence}
+ />
+ )}
);
}
function EvidenceRow(props: {
evidenceKey: MeasureEvidencesTabFragment_evidence$key;
+ measureId: string;
+ organizationId: string;
connectionId: string;
}) {
const evidence = useFragment(evidenceFragment, props.evidenceKey);
@@ -191,34 +214,40 @@ function EvidenceRow(props: {
{
message: sprintf(
__(
- 'This will permanently delete the evidence "%s". This action cannot be undone.'
+ 'This will permanently delete the evidence "%s". This action cannot be undone.',
),
- evidence.filename
+ evidence.filename,
),
- }
+ },
);
};
return (
-
+
| {evidence.filename} |
{fileType(__, evidence)} |
{fileSize(__, evidence.size)} |
{dateFormat(evidence.createdAt)} |
-
+ |
|
diff --git a/apps/console/src/pages/organizations/measures/tabs/__generated__/MeasureEvidencesTabFragment.graphql.ts b/apps/console/src/pages/organizations/measures/tabs/__generated__/MeasureEvidencesTabFragment.graphql.ts
index 8abdbc62a..dd90502cf 100644
--- a/apps/console/src/pages/organizations/measures/tabs/__generated__/MeasureEvidencesTabFragment.graphql.ts
+++ b/apps/console/src/pages/organizations/measures/tabs/__generated__/MeasureEvidencesTabFragment.graphql.ts
@@ -1,5 +1,5 @@
/**
- * @generated SignedSource<<70954edefec64fedbc4f8c1ec1c1efab>>
+ * @generated SignedSource<>
* @lightSyntaxTransform
* @nogrep
*/
@@ -15,7 +15,10 @@ export type MeasureEvidencesTabFragment$data = {
readonly __id: string;
readonly edges: ReadonlyArray<{
readonly node: {
+ readonly fileUrl: string | null | undefined;
+ readonly filename: string;
readonly id: string;
+ readonly mimeType: string;
readonly " $fragmentSpreads": FragmentRefs<"MeasureEvidencesTabFragment_evidence">;
};
}>;
@@ -135,6 +138,27 @@ return {
"plural": false,
"selections": [
(v1/*: any*/),
+ {
+ "alias": null,
+ "args": null,
+ "kind": "ScalarField",
+ "name": "filename",
+ "storageKey": null
+ },
+ {
+ "alias": null,
+ "args": null,
+ "kind": "ScalarField",
+ "name": "fileUrl",
+ "storageKey": null
+ },
+ {
+ "alias": null,
+ "args": null,
+ "kind": "ScalarField",
+ "name": "mimeType",
+ "storageKey": null
+ },
{
"args": null,
"kind": "FragmentSpread",
@@ -220,6 +244,6 @@ return {
};
})();
-(node as any).hash = "619655a768981a51a00a71887dbcb227";
+(node as any).hash = "abae73e44e966689cd837465f93abcb3";
export default node;
diff --git a/apps/console/src/pages/organizations/measures/tabs/__generated__/MeasureEvidencesTabQuery.graphql.ts b/apps/console/src/pages/organizations/measures/tabs/__generated__/MeasureEvidencesTabQuery.graphql.ts
index 9eddb787c..2348c2904 100644
--- a/apps/console/src/pages/organizations/measures/tabs/__generated__/MeasureEvidencesTabQuery.graphql.ts
+++ b/apps/console/src/pages/organizations/measures/tabs/__generated__/MeasureEvidencesTabQuery.graphql.ts
@@ -1,5 +1,5 @@
/**
- * @generated SignedSource<<65fd5218c9365e00e3127dfca328ad10>>
+ * @generated SignedSource<>
* @lightSyntaxTransform
* @nogrep
*/
@@ -219,6 +219,20 @@ return {
"name": "filename",
"storageKey": null
},
+ {
+ "alias": null,
+ "args": null,
+ "kind": "ScalarField",
+ "name": "fileUrl",
+ "storageKey": null
+ },
+ {
+ "alias": null,
+ "args": null,
+ "kind": "ScalarField",
+ "name": "mimeType",
+ "storageKey": null
+ },
{
"alias": null,
"args": null,
@@ -240,20 +254,6 @@ return {
"name": "createdAt",
"storageKey": null
},
- {
- "alias": null,
- "args": null,
- "kind": "ScalarField",
- "name": "fileUrl",
- "storageKey": null
- },
- {
- "alias": null,
- "args": null,
- "kind": "ScalarField",
- "name": "mimeType",
- "storageKey": null
- },
(v11/*: any*/)
],
"storageKey": null
@@ -343,16 +343,16 @@ return {
]
},
"params": {
- "cacheID": "28755a6b97ad50d18c25dea1b383d062",
+ "cacheID": "61b9596f07d5d2516f50e2f646eb21a2",
"id": null,
"metadata": {},
"name": "MeasureEvidencesTabQuery",
"operationKind": "query",
- "text": "query MeasureEvidencesTabQuery(\n $after: CursorKey = null\n $before: CursorKey = null\n $first: Int = 50\n $last: Int = null\n $order: EvidenceOrder = null\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...MeasureEvidencesTabFragment_16fISc\n id\n }\n}\n\nfragment MeasureEvidencesTabFragment_16fISc on Measure {\n id\n evidences(first: $first, after: $after, last: $last, before: $before, orderBy: $order) {\n edges {\n node {\n id\n ...MeasureEvidencesTabFragment_evidence\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n}\n\nfragment MeasureEvidencesTabFragment_evidence on Evidence {\n id\n filename\n size\n type\n createdAt\n fileUrl\n mimeType\n}\n"
+ "text": "query MeasureEvidencesTabQuery(\n $after: CursorKey = null\n $before: CursorKey = null\n $first: Int = 50\n $last: Int = null\n $order: EvidenceOrder = null\n $id: ID!\n) {\n node(id: $id) {\n __typename\n ...MeasureEvidencesTabFragment_16fISc\n id\n }\n}\n\nfragment MeasureEvidencesTabFragment_16fISc on Measure {\n id\n evidences(first: $first, after: $after, last: $last, before: $before, orderBy: $order) {\n edges {\n node {\n id\n filename\n fileUrl\n mimeType\n ...MeasureEvidencesTabFragment_evidence\n __typename\n }\n cursor\n }\n pageInfo {\n endCursor\n hasNextPage\n hasPreviousPage\n startCursor\n }\n }\n}\n\nfragment MeasureEvidencesTabFragment_evidence on Evidence {\n id\n filename\n size\n type\n createdAt\n fileUrl\n mimeType\n}\n"
}
};
})();
-(node as any).hash = "619655a768981a51a00a71887dbcb227";
+(node as any).hash = "abae73e44e966689cd837465f93abcb3";
export default node;
diff --git a/apps/console/src/routes/measureRoutes.ts b/apps/console/src/routes/measureRoutes.ts
index f5559949b..8cb7f4133 100644
--- a/apps/console/src/routes/measureRoutes.ts
+++ b/apps/console/src/routes/measureRoutes.ts
@@ -61,7 +61,7 @@ export const measureRoutes = [
),
},
{
- path: "evidences",
+ path: "evidences/:evidenceId?",
fallback: LinkCardSkeleton,
Component: lazy(
() =>
diff --git a/package.json b/package.json
index eab0f70b1..e1737d020 100644
--- a/package.json
+++ b/package.json
@@ -23,5 +23,8 @@
"schema": "./pkg/server/api/console/v1/schema.graphql"
},
"license": "MIT",
- "packageManager": "npm@11.1.0"
+ "packageManager": "npm@11.1.0",
+ "volta": {
+ "node": "22.16.0"
+ }
}
diff --git a/packages/ui/src/Molecules/Dialog/Dialog.tsx b/packages/ui/src/Molecules/Dialog/Dialog.tsx
index d7d4a8eca..75d63f45a 100644
--- a/packages/ui/src/Molecules/Dialog/Dialog.tsx
+++ b/packages/ui/src/Molecules/Dialog/Dialog.tsx
@@ -49,6 +49,7 @@ type Props = {
defaultOpen?: boolean;
className?: string;
ref?: DialogRef;
+ onClose?: () => void;
};
export const useDialogRef = (): DialogRef => {
@@ -62,6 +63,7 @@ export function Dialog({
className,
ref,
defaultOpen,
+ onClose,
}: Props) {
const { overlay, content, header, title: titleClassname } = dialog();
const [open, setOpen] = useState(!!defaultOpen);
@@ -76,8 +78,16 @@ export function Dialog({
},
};
}
+
+ const onOpenChange = (open: boolean) => {
+ setOpen(open);
+ if (!open) {
+ onClose?.();
+ }
+ };
+
return (
-
+
{trigger && {trigger}}