diff --git a/arches_lingo/serializers.py b/arches_lingo/serializers.py index 95ca4f07..59d0dc19 100644 --- a/arches_lingo/serializers.py +++ b/arches_lingo/serializers.py @@ -34,6 +34,38 @@ class Meta: fields = "__all__" +class SchemeLabelSerializer(ArchesModelSerializer): + class Meta: + model = ResourceInstance + graph_slug = "scheme" + nodegroups = ["appellative_status"] + fields = "__all__" + + +class SchemeLabelTileSerializer(ArchesTileSerializer): + class Meta: + model = TileModel + graph_slug = "scheme" + root_node = "appellative_status" + fields = "__all__" + + +class SchemeNoteSerializer(ArchesModelSerializer): + class Meta: + model = ResourceInstance + graph_slug = "scheme" + nodegroups = ["statement"] + fields = "__all__" + + +class SchemeNoteTileSerializer(ArchesTileSerializer): + class Meta: + model = TileModel + graph_slug = "scheme" + root_node = "statement" + fields = "__all__" + + class TextualWorkRdmSystemSerializer(ArchesModelSerializer): class Meta: model = ResourceInstance diff --git a/arches_lingo/src/arches_lingo/api.ts b/arches_lingo/src/arches_lingo/api.ts index 318dfcb3..f063956a 100644 --- a/arches_lingo/src/arches_lingo/api.ts +++ b/arches_lingo/src/arches_lingo/api.ts @@ -59,6 +59,60 @@ export const fetchSchemeCreation = async (schemeId: string) => { return parsed; }; +export const fetchSchemeLabel = async (schemeId: string) => { + const response = await fetch(arches.urls.api_scheme_label(schemeId)); + const parsed = await response.json(); + if (!response.ok) throw new Error(parsed.message || response.statusText); + return parsed; +}; + +export const deleteSchemeLabelTile = async ( + schemeId: string, + tileId: string, +) => { + const response = await fetch( + arches.urls.api_scheme_label_tile(schemeId, tileId), + { + method: "DELETE", + headers: { "X-CSRFTOKEN": getToken() }, + }, + ); + + if (!response.ok) { + const parsed = await response.json(); + throw new Error(parsed.message || response.statusText); + } else { + return true; + } +}; + +export const fetchSchemeNotes = async (schemeId: string) => { + const response = await fetch(arches.urls.api_scheme_note(schemeId)); + const parsed = await response.json(); + if (!response.ok) throw new Error(parsed.message || response.statusText); + return parsed; +}; + +export const deleteSchemeNoteTile = async ( + schemeId: string, + tileId: string, +) => { + const response = await fetch( + arches.urls.api_scheme_note_tile(schemeId, tileId), + { + method: "DELETE", + headers: { "X-CSRFTOKEN": getToken() }, + }, + ); + + if (!response.ok) { + const parsed = await response.json(); + throw new Error(parsed.message || response.statusText); + } else { + return true; + } +}; + export const updateSchemeCreation = async ( schemeId: string, schemeInstance: SchemeInstance, diff --git a/arches_lingo/src/arches_lingo/components/generic/ControlledListItem.vue b/arches_lingo/src/arches_lingo/components/generic/ControlledListItem.vue index 695c0398..2dc64268 100644 --- a/arches_lingo/src/arches_lingo/components/generic/ControlledListItem.vue +++ b/arches_lingo/src/arches_lingo/components/generic/ControlledListItem.vue @@ -3,12 +3,12 @@ import type { ControlledListItem, DataComponentMode, } from "@/arches_lingo/types"; -import ControlledListItemViewer from "@/arches_lingo/components/generic/ControlledListItemViewer.vue"; +import ControlledListItemViewer from "@/arches_lingo/components/generic/controlled-list-item/ControlledListItemViewer.vue"; import { EDIT, VIEW } from "@/arches_lingo/constants.ts"; -const { mode = EDIT } = defineProps<{ +const { mode = VIEW } = defineProps<{ mode?: DataComponentMode; - value?: ControlledListItem; + value?: ControlledListItem | ControlledListItem[]; }>(); defineEmits(["update"]); diff --git a/arches_lingo/src/arches_lingo/components/generic/ControlledListItemViewer.vue b/arches_lingo/src/arches_lingo/components/generic/ControlledListItemViewer.vue deleted file mode 100644 index 063e6465..00000000 --- a/arches_lingo/src/arches_lingo/components/generic/ControlledListItemViewer.vue +++ /dev/null @@ -1,8 +0,0 @@ - - diff --git a/arches_lingo/src/arches_lingo/components/generic/LabelViewer.vue b/arches_lingo/src/arches_lingo/components/generic/LabelViewer.vue deleted file mode 100644 index e69de29b..00000000 diff --git a/arches_lingo/src/arches_lingo/components/generic/MetaStringViewer.vue b/arches_lingo/src/arches_lingo/components/generic/MetaStringViewer.vue new file mode 100644 index 00000000..a95aa3cd --- /dev/null +++ b/arches_lingo/src/arches_lingo/components/generic/MetaStringViewer.vue @@ -0,0 +1,142 @@ + + + + diff --git a/arches_lingo/src/arches_lingo/components/generic/NonLocalizedString.vue b/arches_lingo/src/arches_lingo/components/generic/NonLocalizedString.vue index cf2ae836..0f665e19 100644 --- a/arches_lingo/src/arches_lingo/components/generic/NonLocalizedString.vue +++ b/arches_lingo/src/arches_lingo/components/generic/NonLocalizedString.vue @@ -1,10 +1,10 @@ - diff --git a/arches_lingo/src/arches_lingo/components/generic/controlled-list-item/ControlledListItemViewer.vue b/arches_lingo/src/arches_lingo/components/generic/controlled-list-item/ControlledListItemViewer.vue new file mode 100644 index 00000000..a863750f --- /dev/null +++ b/arches_lingo/src/arches_lingo/components/generic/controlled-list-item/ControlledListItemViewer.vue @@ -0,0 +1,28 @@ + + diff --git a/arches_lingo/src/arches_lingo/components/generic/NonLocalizedStringEditor.vue b/arches_lingo/src/arches_lingo/components/generic/non-localized-string/NonLocalizedStringEditor.vue similarity index 100% rename from arches_lingo/src/arches_lingo/components/generic/NonLocalizedStringEditor.vue rename to arches_lingo/src/arches_lingo/components/generic/non-localized-string/NonLocalizedStringEditor.vue diff --git a/arches_lingo/src/arches_lingo/components/generic/NonLocalizedStringViewer.vue b/arches_lingo/src/arches_lingo/components/generic/non-localized-string/NonLocalizedStringViewer.vue similarity index 100% rename from arches_lingo/src/arches_lingo/components/generic/NonLocalizedStringViewer.vue rename to arches_lingo/src/arches_lingo/components/generic/non-localized-string/NonLocalizedStringViewer.vue diff --git a/arches_lingo/src/arches_lingo/components/generic/ResourceInstanceRelationshipsEditor.vue b/arches_lingo/src/arches_lingo/components/generic/resource-instance-relationships/ResourceInstanceRelationshipsEditor.vue similarity index 100% rename from arches_lingo/src/arches_lingo/components/generic/ResourceInstanceRelationshipsEditor.vue rename to arches_lingo/src/arches_lingo/components/generic/resource-instance-relationships/ResourceInstanceRelationshipsEditor.vue diff --git a/arches_lingo/src/arches_lingo/components/generic/resource-instance-relationships/ResourceInstanceRelationshipsViewer.vue b/arches_lingo/src/arches_lingo/components/generic/resource-instance-relationships/ResourceInstanceRelationshipsViewer.vue new file mode 100644 index 00000000..f5757350 --- /dev/null +++ b/arches_lingo/src/arches_lingo/components/generic/resource-instance-relationships/ResourceInstanceRelationshipsViewer.vue @@ -0,0 +1,31 @@ + + + + diff --git a/arches_lingo/src/arches_lingo/components/scheme/editor/SchemeEditor.vue b/arches_lingo/src/arches_lingo/components/scheme/editor/SchemeEditor.vue index 11ca725a..8beadd54 100644 --- a/arches_lingo/src/arches_lingo/components/scheme/editor/SchemeEditor.vue +++ b/arches_lingo/src/arches_lingo/components/scheme/editor/SchemeEditor.vue @@ -1,37 +1,64 @@ @@ -91,38 +108,16 @@ async function updateScheme() { -
- - - - - - - - - +
+

{{ currentEditor.editorName }}

+
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 90ba3748..02d1892e 100644 --- a/arches_lingo/src/arches_lingo/components/scheme/report/SchemeLicense.vue +++ b/arches_lingo/src/arches_lingo/components/scheme/report/SchemeLicense.vue @@ -14,6 +14,6 @@ const { $gettext } = useGettext(); diff --git a/arches_lingo/src/arches_lingo/components/scheme/report/SchemeNamespace.vue b/arches_lingo/src/arches_lingo/components/scheme/report/SchemeNamespace.vue index c5b01449..d50eb9da 100644 --- a/arches_lingo/src/arches_lingo/components/scheme/report/SchemeNamespace.vue +++ b/arches_lingo/src/arches_lingo/components/scheme/report/SchemeNamespace.vue @@ -2,50 +2,85 @@ import { onMounted, ref } from "vue"; import { useRoute } from "vue-router"; import { useGettext } from "vue3-gettext"; - +import Button from "primevue/button"; import SchemeReportSection from "@/arches_lingo/components/scheme/report/SchemeSection.vue"; import NonLocalizedString from "@/arches_lingo/components/generic/NonLocalizedString.vue"; import { fetchSchemeNamespace, updateSchemeNamespace, } from "@/arches_lingo/api.ts"; +import { + VIEW, + EDIT, + OPEN_EDITOR, + ERROR, + UPDATED, +} from "@/arches_lingo/constants.ts"; +import { useToast } from "primevue/usetoast"; import type { DataComponentMode, SchemeNamespaceUpdate, SchemeInstance, } from "@/arches_lingo/types"; -import { VIEW, EDIT } from "@/arches_lingo/constants.ts"; +const toast = useToast(); const { $gettext } = useGettext(); -const schemeNamespace = ref(); +const schemeInstance = ref(); const route = useRoute(); defineProps<{ mode?: DataComponentMode; }>(); -defineEmits(["openEditor"]); +const emit = defineEmits([OPEN_EDITOR, UPDATED]); -defineExpose({ save, getSectionValue }); +defineExpose({ getSectionValue }); onMounted(async () => { getSectionValue(); }); async function save() { - await updateSchemeNamespace( - route.params.id as string, - schemeNamespace.value as SchemeInstance, - ); + try { + await updateSchemeNamespace( + route.params.id as string, + schemeInstance.value as SchemeInstance, + ); + emit(UPDATED); + } catch (error) { + toast.add({ + severity: ERROR, + summary: $gettext("Error"), + detail: + error instanceof Error + ? error.message + : $gettext( + "Could not update the namespace for the resource", + ), + }); + } } async function getSectionValue() { - const response = await fetchSchemeNamespace(route.params.id as string); - schemeNamespace.value = response; + try { + const response = await fetchSchemeNamespace(route.params.id as string); + schemeInstance.value = response; + } catch (error) { + toast.add({ + severity: ERROR, + summary: $gettext("Error"), + detail: + error instanceof Error + ? error.message + : $gettext( + "Could not fetch the namespace for the resource", + ), + }); + } } function onNamespaceNameUpdate(val: string) { - const namespaceValue = schemeNamespace.value as SchemeNamespaceUpdate; + const namespaceValue = schemeInstance.value as SchemeNamespaceUpdate; if (!namespaceValue?.namespace) { namespaceValue.namespace = { namespace_name: val, @@ -63,10 +98,10 @@ function onNamespaceNameUpdate(val: string) {
@@ -118,5 +173,9 @@ function onCreationUpdate(val: string[]) { :mode="EDIT" @update="onCreationUpdate" /> +
diff --git a/arches_lingo/src/arches_lingo/components/scheme/report/SchemeUri.vue b/arches_lingo/src/arches_lingo/components/scheme/report/SchemeUri.vue index b31483f3..072b92c2 100644 --- a/arches_lingo/src/arches_lingo/components/scheme/report/SchemeUri.vue +++ b/arches_lingo/src/arches_lingo/components/scheme/report/SchemeUri.vue @@ -6,6 +6,6 @@ const { $gettext } = useGettext(); diff --git a/arches_lingo/src/arches_lingo/constants.ts b/arches_lingo/src/arches_lingo/constants.ts index 28f684f6..c1b4c758 100644 --- a/arches_lingo/src/arches_lingo/constants.ts +++ b/arches_lingo/src/arches_lingo/constants.ts @@ -8,6 +8,8 @@ export const SECONDARY = "secondary"; export const CONTRAST = "contrast"; export const EDIT = "edit"; export const VIEW = "view"; +export const OPEN_EDITOR = "openEditor"; +export const UPDATED = "updated"; export const DEFAULT_ERROR_TOAST_LIFE = 8000; export const SEARCH_RESULTS_PER_PAGE = 25; diff --git a/arches_lingo/src/arches_lingo/pages/SchemePage.vue b/arches_lingo/src/arches_lingo/pages/SchemePage.vue index 77b7f925..ba9f2d93 100644 --- a/arches_lingo/src/arches_lingo/pages/SchemePage.vue +++ b/arches_lingo/src/arches_lingo/pages/SchemePage.vue @@ -2,23 +2,21 @@ import { ref } from "vue"; import Splitter from "primevue/splitter"; import SplitterPanel from "primevue/splitterpanel"; +import SchemeLabel from "@/arches_lingo/components/scheme/report/SchemeLabel.vue"; import SchemeLicense from "@/arches_lingo/components/scheme/report/SchemeLicense.vue"; import SchemeNote from "@/arches_lingo/components/scheme/report/SchemeNote.vue"; import SchemeNamespace from "@/arches_lingo/components/scheme/report/SchemeNamespace.vue"; import SchemeStandard from "@/arches_lingo/components/scheme/report/SchemeStandard.vue"; import SchemeAuthority from "@/arches_lingo/components/scheme/report/SchemeAuthority.vue"; import SchemeEditor from "@/arches_lingo/components/scheme/editor/SchemeEditor.vue"; +import type { SectionTypes } from "@/arches_lingo/types.ts"; const editorVisible = ref(false); const sectionVisible = ref(true); -const editorTab = ref(); -type sectionTypes = - | typeof SchemeNamespace - | typeof SchemeLicense - | typeof SchemeStandard - | typeof SchemeAuthority - | typeof SchemeNote; -const childRefs = ref>([]); +const editorForm = ref(); +const editorTileId = ref(); + +const childRefs = ref>([]); const onMaximize = () => { editorVisible.value = true; sectionVisible.value = false; @@ -35,10 +33,11 @@ const onClose = () => { sectionVisible.value = true; }; -const onOpenEditor = (tab: string) => { - editorTab.value = tab; +const onOpenEditor = (form: string, tileId: string) => { + editorForm.value = form; editorVisible.value = true; sectionVisible.value = true; + editorTileId.value = tileId; }; const onUpdated = () => { childRefs.value.forEach((ref) => { @@ -47,6 +46,7 @@ const onUpdated = () => { }; const components = [ + { component: SchemeLabel, id: "label", props: {} }, { component: SchemeNote, id: "note", props: {} }, { component: SchemeAuthority, id: "authority", props: {} }, { component: SchemeStandard, id: "standard", props: {} }, @@ -55,7 +55,7 @@ const components = [ ]; const getRef = (el: object | null, index: number) => { - if (el != null) childRefs.value[index] = el as sectionTypes; + if (el != null) childRefs.value[index] = el as SectionTypes; }; @@ -74,7 +74,11 @@ const getRef = (el: object | null, index: number) => { :is="component.component" :ref="(el) => getRef(el, index)" v-bind="component.props" - @open-editor="onOpenEditor(component.id)" + @open-editor=" + (tileId: string) => { + onOpenEditor(component.id, tileId); + } + " /> @@ -84,9 +88,10 @@ const getRef = (el: object | null, index: number) => { :min-size="33" >
{% endblock arches_urls %} diff --git a/arches_lingo/urls.py b/arches_lingo/urls.py index 2f7f96d4..6f379680 100644 --- a/arches_lingo/urls.py +++ b/arches_lingo/urls.py @@ -12,8 +12,12 @@ ConceptStatementListCreateView, SchemeCreationView, SchemeDetailView, + SchemeLabelTileView, + SchemeLabelView, SchemeListCreateView, SchemeNamespaceView, + SchemeNoteTileView, + SchemeNoteView, SchemeStatementDetailView, SchemeStatementListCreateView, TextualWorkRdmSystemSerializerView, @@ -53,6 +57,26 @@ SchemeCreationView.as_view(), name="api-scheme-creation", ), + path( + "api/scheme//label", + SchemeLabelView.as_view(), + name="api-scheme-label", + ), + path( + "api/scheme//label/", + SchemeLabelTileView.as_view(), + name="api-scheme-label-tile", + ), + path( + "api/scheme//note", + SchemeNoteView.as_view(), + name="api-scheme-note", + ), + path( + "api/scheme//note/", + SchemeNoteTileView.as_view(), + name="api-scheme-note-tile", + ), path( "api/textual-work", TextualWorkRdmSystemSerializerView.as_view(), diff --git a/arches_lingo/views/api/pythonic_models.py b/arches_lingo/views/api/pythonic_models.py index 7567d942..439da420 100644 --- a/arches_lingo/views/api/pythonic_models.py +++ b/arches_lingo/views/api/pythonic_models.py @@ -10,7 +10,11 @@ from arches_lingo.serializers import ( ConceptSerializer, SchemeCreationSerializer, + SchemeLabelSerializer, + SchemeLabelTileSerializer, SchemeNamespaceSerializer, + SchemeNoteSerializer, + SchemeNoteTileSerializer, SchemeSerializer, ConceptStatementSerializer, SchemeStatementSerializer, @@ -54,6 +58,26 @@ class SchemeCreationView(ArchesModelAPIMixin, RetrieveUpdateDestroyAPIView): serializer_class = SchemeCreationSerializer +class SchemeLabelView(ArchesModelAPIMixin, RetrieveUpdateDestroyAPIView): + permission_classes = [RDMAdministrator] + serializer_class = SchemeLabelSerializer + + +class SchemeLabelTileView(ArchesModelAPIMixin, RetrieveUpdateDestroyAPIView): + permission_classes = [RDMAdministrator] + serializer_class = SchemeLabelTileSerializer + + +class SchemeNoteView(ArchesModelAPIMixin, RetrieveUpdateDestroyAPIView): + permission_classes = [RDMAdministrator] + serializer_class = SchemeNoteSerializer + + +class SchemeNoteTileView(ArchesModelAPIMixin, RetrieveUpdateDestroyAPIView): + permission_classes = [RDMAdministrator] + serializer_class = SchemeNoteTileSerializer + + class TextualWorkRdmSystemSerializerView(ArchesModelAPIMixin, ListAPIView): permission_classes = [RDMAdministrator] serializer_class = TextualWorkRdmSystemSerializer