Skip to content

Commit

Permalink
fix: connect articles to parent decision upon agendapoint initialization
Browse files Browse the repository at this point in the history
  • Loading branch information
elpoelma committed Dec 3, 2024
1 parent db6add6 commit a841179
Show file tree
Hide file tree
Showing 4 changed files with 89 additions and 2 deletions.
5 changes: 5 additions & 0 deletions .changeset/quiet-pants-greet.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
---
'frontend-gelinkt-notuleren': patch
---

Fix: automatically connect articles to parent decision upon opening an agendapoint
4 changes: 3 additions & 1 deletion app/controllers/agendapoints/edit.js
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import InsertArticleComponent from '@lblod/ember-rdfa-editor-lblod-plugins/compo
import { getActiveEditableNode } from '@lblod/ember-rdfa-editor/plugins/_private/editable-node';

import SnippetInsertRdfaComponent from '@lblod/ember-rdfa-editor-lblod-plugins/components/snippet-plugin/snippet-insert-rdfa';
import { fixArticleConnections } from '../../utils/fix-article-connections';

export default class AgendapointsEditController extends Controller {
@service store;
Expand Down Expand Up @@ -69,9 +70,10 @@ export default class AgendapointsEditController extends Controller {
}

@action
handleRdfaEditorInit(editor) {
async handleRdfaEditorInit(editor) {
this.controller = editor;
editor.initialize(this.editorDocument.content || '', { doNotClean: true });
fixArticleConnections(editor);
}

copyAgendapunt = task(async () => {
Expand Down
2 changes: 1 addition & 1 deletion app/templates/application.hbs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
}}
<AuModalContainer />
<AuApp class='{{if this.showEnvironment "au-c-app--environment"}}'>
<GlobalSystemNotification/>
<GlobalSystemNotification />
{{#if this.showEnvironment}}
<div class='au-u-hide-on-print'>
<EnvironmentBanner
Expand Down
80 changes: 80 additions & 0 deletions app/utils/fix-article-connections.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
import { SayDataFactory } from '@lblod/ember-rdfa-editor/core/say-data-factory';
import { transactionCombinator } from '@lblod/ember-rdfa-editor/utils/transaction-utils';
import { addPropertyToNode } from '@lblod/ember-rdfa-editor/utils/rdfa-utils';
import { hasOutgoingNamedNodeTriple } from '@lblod/ember-rdfa-editor-lblod-plugins/utils/namespace';
import {
RDF,
BESLUIT,
} from '@lblod/ember-rdfa-editor-lblod-plugins/utils/constants';
import { findChildren } from '@curvenote/prosemirror-utils';

export function fixArticleConnections(editorController) {
const state = editorController.mainEditorState;
const decisions = findDecisions(state.doc, editorController.schema);
if (!decisions.length) {
return false;
}
const transactionMonads = [];
const factory = new SayDataFactory();
for (const decision of decisions) {
const unconnectedArticles = findUnconnectedArticles(
decision.node,
editorController.schema,
);
for (const article of unconnectedArticles) {
transactionMonads.push(
addPropertyToNode({
resource: decision.node.attrs.subject,
property: {
predicate: 'http://data.europa.eu/eli/ontology#has_part',
object: factory.resourceNode(article.node.attrs.subject),
},
}),
);
}
}
if (!transactionMonads.length) {
return false;
}
editorController.withTransaction((tr) => {
const result = transactionCombinator(
editorController.mainEditorState,
tr,
)(transactionMonads);
result.transaction.setMeta('addToHistory', false);
return result.transaction;
});
return true;
}

function findDecisions(doc, schema) {
const decisions = findChildren(doc, (child) => {
return (
child.type === schema.nodes.block_rdfa &&
hasOutgoingNamedNodeTriple(child.attrs, RDF('type'), BESLUIT('Besluit'))
);
});
return decisions;
}

function findUnconnectedArticles(decisionNode, schema) {
const decisionURI = decisionNode.subject;
const articles = findChildren(decisionNode, (child) => {
return (
child.type === schema.nodes.structure &&
child.attrs.structureType === 'article' &&
!isConnectedTo(child, decisionURI)
);
});
return articles;
}

function isConnectedTo(articleNode, decisionURI) {
return Boolean(
(articleNode.attrs.backlinks ?? []).some(
(backlink) =>
backlink.subject === decisionURI &&
backlink.predicate == 'http://data.europa.eu/eli/ontology#has_part',
),
);
}

0 comments on commit a841179

Please sign in to comment.