From bd40a041d62f5291444e59a5aadafc0f1e9f26a5 Mon Sep 17 00:00:00 2001 From: njkim Date: Sat, 11 Jan 2025 23:38:23 -0800 Subject: [PATCH] Add statement report, #151 --- arches_lingo/serializers.py | 10 +- arches_lingo/src/arches_lingo/api.ts | 26 +++++ .../scheme/report/SchemeLicense.vue | 104 ++++++++++++++++-- arches_lingo/src/arches_lingo/types.ts | 10 ++ arches_lingo/urls.py | 18 +++ arches_lingo/views/api/pythonic_models.py | 16 +++ 6 files changed, 175 insertions(+), 9 deletions(-) diff --git a/arches_lingo/serializers.py b/arches_lingo/serializers.py index 551aa39f..b0f63197 100644 --- a/arches_lingo/serializers.py +++ b/arches_lingo/serializers.py @@ -37,7 +37,7 @@ class SchemeRightsSerializer(ArchesModelSerializer): class Meta: model = ResourceInstance graph_slug = "scheme" - nodegroups = ["rights"] + nodegroups = ["rights", "right_statement"] fields = "__all__" @@ -49,6 +49,14 @@ class Meta: fields = "__all__" +class SchemeRightStatementTileSerializer(ArchesTileSerializer): + class Meta: + model = TileModel + graph_slug = "scheme" + root_node = "right_statement" + fields = "__all__" + + class SchemeLabelSerializer(ArchesModelSerializer): class Meta: model = ResourceInstance diff --git a/arches_lingo/src/arches_lingo/api.ts b/arches_lingo/src/arches_lingo/api.ts index 02c6b9f6..f63ffcf0 100644 --- a/arches_lingo/src/arches_lingo/api.ts +++ b/arches_lingo/src/arches_lingo/api.ts @@ -223,6 +223,13 @@ export const updateSchemeNamespace = async ( return parsed; }; +export const fetchSchemeRightStatement = async (schemeId: string) => { + const response = await fetch(arches.urls.api_scheme_right_statement_tile(schemeId, tileid1, tileid2)); + const parsed = await response.json(); + if (!response.ok) throw new Error(parsed.message || response.statusText); + return parsed; +}; + export const updateSchemeRights = async ( schemeId: string, tileId: string, @@ -241,6 +248,25 @@ export const updateSchemeRights = async ( return parsed; }; +export const updateSchemeRightStatement = async ( + schemeId: string, + tileId: string, + childTileId: string, + schemeRightStatementValue: SchemeRightStatement, +) => { + const response = await fetch(arches.urls.api_scheme_right_statement_tile(schemeId, tileId, childTileId), { + method: "PATCH", + headers: { + "X-CSRFTOKEN": getToken(), + "Content-Type": "application/json", + }, + body: JSON.stringify(schemeRightStatementValue), + }); + const parsed = await response.json(); + if (!response.ok) throw new Error(parsed.message || response.statusText); + return parsed; +}; + export const fetchSearchResults = async ( searchTerm: string, items: number, diff --git a/arches_lingo/src/arches_lingo/components/scheme/report/SchemeLicense.vue b/arches_lingo/src/arches_lingo/components/scheme/report/SchemeLicense.vue index 43c2319a..05212b33 100644 --- a/arches_lingo/src/arches_lingo/components/scheme/report/SchemeLicense.vue +++ b/arches_lingo/src/arches_lingo/components/scheme/report/SchemeLicense.vue @@ -2,7 +2,9 @@ import { inject, onMounted, ref, toRaw, type Ref } from "vue"; import { useRoute } from "vue-router"; import { useGettext } from "vue3-gettext"; +import { useToast } from "primevue/usetoast"; import Button from "primevue/button"; +import MetaStringViewer from "@/arches_lingo/components/generic/MetaStringViewer.vue"; import SchemeReportSection from "@/arches_lingo/components/scheme/report/SchemeSection.vue"; import { fetchSchemeRights, @@ -12,15 +14,18 @@ import { fetchControlledListOptions, } from "@/arches_lingo/api.ts"; import type { + ControlledListItem, + ControlledListItemResult, DataComponentMode, + MetaStringText, ResourceInstanceReference, ResourceInstanceResult, - ControlledListItem, - ControlledListItemResult, SchemeRights, + SchemeRightStatement, } from "@/arches_lingo/types"; import { selectedLanguageKey, + NEW, VIEW, EDIT, OPEN_EDITOR, @@ -30,6 +35,7 @@ import { import ResourceInstanceRelationships from "@/arches_lingo/components/generic/ResourceInstanceRelationships.vue"; import ReferenceDatatype from "@/arches_lingo/components/generic/ReferenceDatatype.vue"; import type { Language } from "@/arches_vue_utils/types.ts"; +import NonLocalizedString from "../../generic/NonLocalizedString.vue"; onMounted(async () => { getSectionValue(); @@ -42,12 +48,23 @@ defineProps<{ const emit = defineEmits([OPEN_EDITOR, UPDATED]); const schemeRight = ref(); -const tileid = ref(); +const schemeRightStatement = ref(); +const schemeRightTileid = ref(); +const schemeRightStatementTileid = ref(); const route = useRoute(); +const { $gettext } = useGettext(); const actorRdmOptions = ref(); const selectedLanguage = inject(selectedLanguageKey) as Ref; const rightTypeOptions = ref(); +const metaStringLabel: MetaStringText = { + deleteConfirm: $gettext("Are you sure you want to delete this label?"), + language: $gettext("Statement Language"), + name: $gettext("Statement"), + type: $gettext("Statement Type"), + noRecords: $gettext("No scheme right statement were found."), +}; + async function getActorOptions(): Promise { const options_person = await fetchPersonRdmSystemList(); const options_group = await fetchGroupRdmSystemList(); @@ -99,16 +116,24 @@ function onUpdateResourceInstance( async function save() { await updateSchemeRights( route.params.id as string, - tileid.value as string, + schemeRightTileid.value as string, schemeRight.value as SchemeRights, ); emit(UPDATED); }; async function getSectionValue() { + if (route.params.id === NEW) { + return; + } const actorOptions = await getActorOptions(); - const scheme = await fetchSchemeRights(route.params.id as string); - schemeRight.value = scheme?.rights; - tileid.value = schemeRight.value?.tileid; + const schemeInstance = await fetchSchemeRights(route.params.id as string); + if (schemeInstance?.right_statement && !Array.isArray(schemeInstance?.right_statement)) { + schemeInstance.right_statement = [schemeInstance.right_statement]; + } + schemeRight.value = schemeInstance?.rights; + schemeRightStatement.value = schemeInstance?.right_statement; + schemeRightTileid.value = schemeRight.value?.tileid; + schemeRightStatementTileid.value = schemeRightStatement.value?.tileid; actorRdmOptions.value = actorOptions.map((option) => { const savedSource = schemeRight.value?.right_holder?.find( (source: ResourceInstanceReference) => @@ -123,8 +148,15 @@ async function getSectionValue() { rightTypeOptions.value = await getControlledListOptions(RIGHT_TYPE_CONTROLLED_LIST); }; +async function deleteSectionValue() { + console.log("deleting"); +}; + +function editSectionValue() { + console.log("editing"); +}; + defineExpose({ getSectionValue }); -const { $gettext } = useGettext();