diff --git a/client/src/api/datasetCollections.ts b/client/src/api/datasetCollections.ts index cb09d46c66b5..527fb993515f 100644 --- a/client/src/api/datasetCollections.ts +++ b/client/src/api/datasetCollections.ts @@ -1,4 +1,4 @@ -import { CollectionEntry, DCESummary, HDCADetailed, isHDCA } from "@/api"; +import { CollectionEntry, DCESummary, HDCADetailed, HDCASummary, isHDCA } from "@/api"; import { fetcher } from "@/api/schema"; const DEFAULT_LIMIT = 50; @@ -11,7 +11,16 @@ const getCollectionDetails = fetcher.path("/api/dataset_collections/{id}").metho */ export async function fetchCollectionDetails(params: { id: string }): Promise { const { data } = await getCollectionDetails({ id: params.id }); - return data; + return data as HDCADetailed; +} + +/** + * Fetches the details of a collection. + * @param params.id The ID of the collection (HDCA) to fetch. + */ +export async function fetchCollectionSummary(params: { id: string }): Promise { + const { data } = await getCollectionDetails({ id: params.id, view: "collection" }); + return data as HDCASummary; } const getCollectionContents = fetcher diff --git a/client/src/api/histories.ts b/client/src/api/histories.ts index 65ad7e2d6b1d..9d3788a9505d 100644 --- a/client/src/api/histories.ts +++ b/client/src/api/histories.ts @@ -4,3 +4,6 @@ export const historiesFetcher = fetcher.path("/api/histories").method("get").cre export const archivedHistoriesFetcher = fetcher.path("/api/histories/archived").method("get").create(); export const undeleteHistory = fetcher.path("/api/histories/deleted/{history_id}/undelete").method("post").create(); export const purgeHistory = fetcher.path("/api/histories/{history_id}").method("delete").create(); + +export const sharing = fetcher.path("/api/histories/{history_id}/sharing").method("get").create(); +export const enableLink = fetcher.path("/api/histories/{history_id}/enable_link_access").method("put").create(); diff --git a/client/src/api/jobs.ts b/client/src/api/jobs.ts index e915a9179098..3263bf904f86 100644 --- a/client/src/api/jobs.ts +++ b/client/src/api/jobs.ts @@ -2,6 +2,8 @@ import { components, fetcher } from "@/api/schema"; export type JobDestinationParams = components["schemas"]["JobDestinationParams"]; +export const getJobDetails = fetcher.path("/api/jobs/{job_id}").method("get").create(); + export const jobLockStatus = fetcher.path("/api/job_lock").method("get").create(); export const jobLockUpdate = fetcher.path("/api/job_lock").method("put").create(); diff --git a/client/src/api/workflows.ts b/client/src/api/workflows.ts new file mode 100644 index 000000000000..6ab018abe1cb --- /dev/null +++ b/client/src/api/workflows.ts @@ -0,0 +1,4 @@ +import { fetcher } from "@/api/schema"; + +export const sharing = fetcher.path("/api/workflows/{workflow_id}/sharing").method("get").create(); +export const enableLink = fetcher.path("/api/workflows/{workflow_id}/enable_link_access").method("put").create(); diff --git a/client/src/components/Markdown/parse.ts b/client/src/components/Markdown/parse.ts index 900bbd3135db..3eb11ae54f89 100644 --- a/client/src/components/Markdown/parse.ts +++ b/client/src/components/Markdown/parse.ts @@ -77,3 +77,48 @@ export function getArgs(content: string) { content: content, }; } + +class ReferencedObjects { + jobs: Set = new Set(); + historyDatasets: Set = new Set(); + historyDatasetCollections: Set = new Set(); + workflows: Set = new Set(); + invocations: Set = new Set(); +} + +export function referencedObjects(markdown: string) { + const { sections } = splitMarkdown(markdown); + const objects = new ReferencedObjects(); + for (const section of sections) { + if (!("args" in section)) { + continue; + } + const args = section.args; + if (!args) { + continue; + } + if ("job_id" in args) { + addToSetIfHasValue(args.job_id, objects.jobs); + } + if ("history_dataset_id" in args) { + addToSetIfHasValue(args.history_dataset_id, objects.historyDatasets); + } + if ("history_dataset_collection_id" in args) { + addToSetIfHasValue(args.history_dataset_collection_id, objects.historyDatasetCollections); + } + if ("invocation_id" in args) { + addToSetIfHasValue(args.invocation_id, objects.invocations); + } + if ("workflow_id" in args) { + addToSetIfHasValue(args.workflow_id, objects.workflows); + } + // TODO: implicit collect job ids + } + return objects; +} + +function addToSetIfHasValue(value: string, toSet: Set): void { + if (value) { + toSet.add(value); + } +} diff --git a/client/src/components/PageEditor/ObjectPermissions.vue b/client/src/components/PageEditor/ObjectPermissions.vue new file mode 100644 index 000000000000..f5ab4da9f3db --- /dev/null +++ b/client/src/components/PageEditor/ObjectPermissions.vue @@ -0,0 +1,305 @@ + + + diff --git a/client/src/components/PageEditor/ObjectPermissionsModal.vue b/client/src/components/PageEditor/ObjectPermissionsModal.vue new file mode 100644 index 000000000000..cb250f1884e6 --- /dev/null +++ b/client/src/components/PageEditor/ObjectPermissionsModal.vue @@ -0,0 +1,15 @@ + + + diff --git a/client/src/components/PageEditor/PageEditorMarkdown.vue b/client/src/components/PageEditor/PageEditorMarkdown.vue index 7ef80fe89225..e422a3c8855d 100644 --- a/client/src/components/PageEditor/PageEditorMarkdown.vue +++ b/client/src/components/PageEditor/PageEditorMarkdown.vue @@ -1,6 +1,20 @@