From 3f496f94d9fbec4a407640dd5dee70d00e52762a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Jusevi=C4=8Dius?= Date: Tue, 18 Aug 2026 12:28:26 +0200 Subject: [PATCH 1/6] [maven-release-plugin] prepare for next development iteration --- pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pom.xml b/pom.xml index 02fd2ad2f..86e40adcb 100644 --- a/pom.xml +++ b/pom.xml @@ -3,7 +3,7 @@ com.atomgraph linkeddatahub - 5.9.0 + 5.9.1-SNAPSHOT ${packaging.type} AtomGraph LinkedDataHub @@ -46,7 +46,7 @@ https://github.com/AtomGraph/LinkedDataHub scm:git:git://github.com/AtomGraph/LinkedDataHub.git scm:git:git@github.com:AtomGraph/LinkedDataHub.git - linkeddatahub-5.9.0 + linkeddatahub-5.5.4 From 67ed0c79d53af60207d5c56881afc3471f060ec2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Jusevi=C4=8Dius?= Date: Wed, 19 Aug 2026 00:08:17 +0200 Subject: [PATCH 2/6] Match owl:Class in type/class typeahead lookups Ontologies are served without inference since #337, so owl:Class subjects do not carry the rdfs:Class type and were dropped by the client-side rdf:type filter in typeahead:process (typeahead.xsl). Co-Authored-By: Claude Fable 5 --- .../linkeddatahub/xsl/bootstrap/2.3.2/client/constructor.xsl | 3 ++- .../linkeddatahub/xsl/bootstrap/2.3.2/imports/rdf.xsl | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/constructor.xsl b/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/constructor.xsl index 706e9d1f6..86a2526bc 100644 --- a/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/constructor.xsl +++ b/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/constructor.xsl @@ -6,6 +6,7 @@ + @@ -406,7 +407,7 @@ exclude-result-prefixes="#all" - + diff --git a/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/imports/rdf.xsl b/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/imports/rdf.xsl index a45152d01..3300e1cfc 100644 --- a/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/imports/rdf.xsl +++ b/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/imports/rdf.xsl @@ -115,7 +115,7 @@ exclude-result-prefixes="#all"> - + @@ -124,7 +124,7 @@ exclude-result-prefixes="#all"> - + From 9bc1933305fd606359889fcd1fe17d4c1293e273 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Jusevi=C4=8Dius?= Date: Wed, 19 Aug 2026 14:41:31 +0200 Subject: [PATCH 3/6] SKOS package URLs moved to LinkedDataHub-Apps master The develop branch of LinkedDataHub-Apps was deleted after being merged into master, which 404ed the package stylesheet/ontology downloads and broke the package install tests. Co-Authored-By: Claude Fable 5 --- .../admin/packages/install-uninstall-package-ontology.sh | 2 +- .../resources/com/linkeddatahub/packages/skos/package.ttl | 4 ++-- src/main/resources/location-mapping.ttl | 2 +- src/main/resources/prefix-mapping.ttl | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/http-tests/admin/packages/install-uninstall-package-ontology.sh b/http-tests/admin/packages/install-uninstall-package-ontology.sh index 9f5fa2330..7623b577c 100755 --- a/http-tests/admin/packages/install-uninstall-package-ontology.sh +++ b/http-tests/admin/packages/install-uninstall-package-ontology.sh @@ -9,7 +9,7 @@ purge_cache "$FRONTEND_VARNISH_SERVICE" # test package URI (SKOS package) package_uri="https://packages.linkeddatahub.com/skos/#this" -package_ontology_uri="https://raw.githubusercontent.com/AtomGraph/LinkedDataHub-Apps/refs/heads/develop/packages/skos/ns.ttl#" +package_ontology_uri="https://raw.githubusercontent.com/AtomGraph/LinkedDataHub-Apps/refs/heads/master/packages/skos/ns.ttl#" namespace_ontology_uri="${END_USER_BASE_URL}ns#" # verify owl:imports triple does NOT exist before install diff --git a/src/main/resources/com/linkeddatahub/packages/skos/package.ttl b/src/main/resources/com/linkeddatahub/packages/skos/package.ttl index b906f9619..f1e0681a4 100644 --- a/src/main/resources/com/linkeddatahub/packages/skos/package.ttl +++ b/src/main/resources/com/linkeddatahub/packages/skos/package.ttl @@ -12,8 +12,8 @@ dct:title "SKOS Package for LinkedDataHub" ; dct:description "Provides SKOS (Simple Knowledge Organization System) vocabulary support with custom templates for concept hierarchies, schemes, and collections." ; dct:creator ; - ldt:ontology ; - ac:stylesheet . + ldt:ontology ; + ac:stylesheet . a foaf:Organization ; foaf:name "AtomGraph" ; diff --git a/src/main/resources/location-mapping.ttl b/src/main/resources/location-mapping.ttl index 91856575c..df0dbeb8b 100644 --- a/src/main/resources/location-mapping.ttl +++ b/src/main/resources/location-mapping.ttl @@ -18,5 +18,5 @@ [ lm:name "http://spinrdf.org/spl#" ; lm:altName "etc/spl.spin.ttl" ] , [ lm:name "http://spinrdf.org/spl" ; lm:altName "etc/spl.spin.ttl" ] , [ lm:name "https://packages.linkeddatahub.com/skos/" ; lm:altName "com/linkeddatahub/packages/skos/package.ttl" ] , - [ lm:name "https://raw.githubusercontent.com/AtomGraph/LinkedDataHub-Apps/refs/heads/develop/packages/skos/ns.ttl" ; lm:altName "com/linkeddatahub/packages/skos/ns.ttl" ] + [ lm:name "https://raw.githubusercontent.com/AtomGraph/LinkedDataHub-Apps/refs/heads/master/packages/skos/ns.ttl" ; lm:altName "com/linkeddatahub/packages/skos/ns.ttl" ] . \ No newline at end of file diff --git a/src/main/resources/prefix-mapping.ttl b/src/main/resources/prefix-mapping.ttl index 872c5b932..cf4565809 100644 --- a/src/main/resources/prefix-mapping.ttl +++ b/src/main/resources/prefix-mapping.ttl @@ -73,5 +73,5 @@ [ lm:prefix "http://spinrdf.org/spin" ; lm:altName "etc/spin.ttl" ] , [ lm:prefix "http://spinrdf.org/spl" ; lm:altName "etc/spl.spin.ttl" ] , [ lm:prefix "https://packages.linkeddatahub.com/skos/" ; lm:altName "com/linkeddatahub/packages/skos/package.ttl" ] , - [ lm:prefix "https://raw.githubusercontent.com/AtomGraph/LinkedDataHub-Apps/refs/heads/develop/packages/skos/ns.ttl" ; lm:altName "com/linkeddatahub/packages/skos/ns.ttl" ] + [ lm:prefix "https://raw.githubusercontent.com/AtomGraph/LinkedDataHub-Apps/refs/heads/master/packages/skos/ns.ttl" ; lm:altName "com/linkeddatahub/packages/skos/ns.ttl" ] . \ No newline at end of file From 6624f4685a85e77bf895c8a441d460c1928a23e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Jusevi=C4=8Dius?= Date: Wed, 19 Aug 2026 14:44:58 +0200 Subject: [PATCH 4/6] Inline creation in views (#351) * Inline creation in views Implements the Inline-Creation-in-Views proposal: views attached via ldh:view/ldh:inverseView get a Create button in the view toolbar when the View carries the new ldh:container metadata. The modal constructor form PUTs the new instance document into the container; forward views PATCH the linking triple into the current document (INSERT/WHERE form), inverse views ship it inside the PUT body. Property, direction and constructed class are inferred from the ontology (rdfs:domain/rdfs:range incl. rdfs:subPropertyOf paths); the Create button is gated on acl:Write obtained by HEADing the container for its acl:mode Link headers. Also adds optional ldh:showWhenEmpty (default true). Co-Authored-By: Claude Fable 5 * Inline creation fixes: row-form rendering, cache-driven view refresh The creation modal now renders through the document-level bs2:Form pipeline over the instantiated resource (ldh:set-typeahead-form-resource), producing the full row-form UI with the form shell; the instance is minted as a fragment within the new document and the description ships as the PUT body. The post-creation refresh rebuilds the results context from the contents cache like the pager listeners (the view's spin:query RDFa is consumed by the initial render, so ldh:RenderRow re-entry cannot match). Also resets the progress cursor on terminal paths and floats the Create button (now btn-primary) left of the mandatory order-by/mode controls. Co-Authored-By: Claude Fable 5 * SKOS package views tolerate untagged prefLabels LDH forms submit plain xsd:string literals, which the hardcoded langMatches(lang(?prefLabel), "en") filters excluded from every package view. Co-Authored-By: Claude Fable 5 * Keep the progress cursor while the view refreshes after inline creation ldh:render-view restores the default cursor once the results render, same as the pager/order/mode interactions. Co-Authored-By: Claude Fable 5 --------- Co-authored-by: Claude Fable 5 --- CLAUDE.md | 4 + .../com/atomgraph/linkeddatahub/ldh.ttl | 22 +- .../com/linkeddatahub/packages/skos/ns.ttl | 8 +- .../xsl/bootstrap/2.3.2/client/block.xsl | 112 ++++++- .../xsl/bootstrap/2.3.2/client/block/view.xsl | 309 +++++++++++++++++- .../xsl/bootstrap/2.3.2/client/modal.xsl | 7 +- 6 files changed, 444 insertions(+), 18 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index 9e7ee8ae5..5a9b979f0 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -123,6 +123,10 @@ Key implementation files: The SPARQL endpoint forwarding chain ensures ContentMode blocks (charts, maps) query the **remote** app's SPARQL endpoint, not the local one. `LinkedDataHub.endpoint` is reset to the local endpoint by `ldh:HTMLDocumentLoaded` on every HTML page navigation, so there is no stale state when navigating back to local documents. +### UI Conventions + +**Form placement follows document membership.** A creation/edit form for a resource that lives (or will live) in its **own document** renders as a modal (`div.modal.modal-constructor` — Container/Item creation, document edit, inline creation in views); a form for a resource being added **to the current document** renders inline in the content body (`ldh:render-add-row-form`, content-block forms). The main content body renders only the current document's content. + ### Key Extension Points - **Vocabulary definitions** in `com.atomgraph.linkeddatahub.vocabulary` - **Custom resource handlers** in `com.atomgraph.linkeddatahub.resource` diff --git a/src/main/resources/com/atomgraph/linkeddatahub/ldh.ttl b/src/main/resources/com/atomgraph/linkeddatahub/ldh.ttl index fce8071bb..c6a2c8523 100644 --- a/src/main/resources/com/atomgraph/linkeddatahub/ldh.ttl +++ b/src/main/resources/com/atomgraph/linkeddatahub/ldh.ttl @@ -22,7 +22,7 @@ owl:imports dh:, ac:, , foaf:, sd:, nfo:, owl: ; rdfs:label "LinkedDataHub ontology" ; rdfs:comment "Should be imported and reused by all extending applications" ; - owl:versionInfo "1.1.6" . + owl:versionInfo "1.1.7" . # PROPERTIES @@ -105,6 +105,20 @@ rdfs:comment "Attaches a view to a property for inverse relationships (?value property $about)" ; rdfs:isDefinedBy : . +:container a owl:ObjectProperty ; + rdfs:domain :View ; + rdfs:range dh:Container ; + rdfs:label "Item container" ; + rdfs:comment "Container under which instances created inline from the view are stored as child documents" ; + rdfs:isDefinedBy : . + +:showWhenEmpty a owl:DatatypeProperty ; + rdfs:domain :View ; + rdfs:range xsd:boolean ; + rdfs:label "Show when empty" ; + rdfs:comment "Whether the view block is shown when its query returns no results. Defaults to true" ; + rdfs:isDefinedBy : . + # CLASSES # constructor @@ -324,11 +338,15 @@ PREFIX spin: PREFIX sp: PREFIX rdfs: + PREFIX xsd: PREFIX ac: + PREFIX ldh: CONSTRUCT { $this spin:query [ a sp:Select ] ; - ac:mode [ a rdfs:Resource ] . + ac:mode [ a rdfs:Resource ] ; + ldh:container [ a rdfs:Resource ] ; + ldh:showWhenEmpty [ a xsd:boolean ] . } WHERE {}""" ; rdfs:label "View constructor" ; diff --git a/src/main/resources/com/linkeddatahub/packages/skos/ns.ttl b/src/main/resources/com/linkeddatahub/packages/skos/ns.ttl index e82cc117b..698357797 100644 --- a/src/main/resources/com/linkeddatahub/packages/skos/ns.ttl +++ b/src/main/resources/com/linkeddatahub/packages/skos/ns.ttl @@ -55,7 +55,7 @@ WHERE GRAPH ?narrowerGraph { ?narrower skos:prefLabel ?prefLabel . - FILTER (langMatches(lang(?prefLabel), "en")) + FILTER (langMatches(lang(?prefLabel), "en") || lang(?prefLabel) = "") } } } @@ -84,7 +84,7 @@ WHERE GRAPH ?broaderGraph { ?broader skos:prefLabel ?prefLabel . - FILTER (langMatches(lang(?prefLabel), "en")) + FILTER (langMatches(lang(?prefLabel), "en") || lang(?prefLabel) = "") } } } @@ -130,7 +130,7 @@ WHERE GRAPH ?memberGraph { ?member skos:prefLabel ?prefLabel . - FILTER (langMatches(lang(?prefLabel), "en")) + FILTER (langMatches(lang(?prefLabel), "en") || lang(?prefLabel) = "") } } } @@ -174,7 +174,7 @@ WHERE { GRAPH ?graph { ?concept skos:inScheme $about ; skos:prefLabel ?prefLabel . - FILTER (langMatches(lang(?prefLabel), "en")) + FILTER (langMatches(lang(?prefLabel), "en") || lang(?prefLabel) = "") } } ORDER BY ?prefLabel diff --git a/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/block.xsl b/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/block.xsl index f02bb7970..9cb256959 100644 --- a/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/block.xsl +++ b/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/block.xsl @@ -116,19 +116,28 @@ exclude-result-prefixes="#all" ]]> - + PREFIX ldh: - SELECT DISTINCT ?block + SELECT DISTINCT ?block ?property ?inverse ?forClass ?container ?showWhenEmpty WHERE { { ?property ldh:view ?block . { ?property rdfs:domain ?type } UNION { ?property rdfs:subPropertyOf+/rdfs:domain ?type } + BIND(false AS ?inverse) + OPTIONAL { + { ?property rdfs:range ?forClass } + UNION + { ?property rdfs:subPropertyOf+/rdfs:range ?forClass } + } } UNION { @@ -136,7 +145,15 @@ exclude-result-prefixes="#all" { ?property rdfs:range ?type } UNION { ?property rdfs:subPropertyOf+/rdfs:range ?type } + BIND(true AS ?inverse) + OPTIONAL { + { ?property rdfs:domain ?forClass } + UNION + { ?property rdfs:subPropertyOf+/rdfs:domain ?forClass } + } } + OPTIONAL { ?block ldh:container ?container } + OPTIONAL { ?block ldh:showWhenEmpty ?showWhenEmpty } } ]]> @@ -673,13 +690,31 @@ exclude-result-prefixes="#all" - - - + + + - + + + + + + + + + + + + + + + + + + + - + - + + + ldh:ontology-view-render-thunk + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - ldh:ontology-view-render-thunk + ldh:ontology-view-insert @@ -738,6 +811,27 @@ exclude-result-prefixes="#all" + + + + + + + + + + + + + + + + + + + + + diff --git a/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/block/view.xsl b/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/block/view.xsl index fd06e20ca..752a54ec9 100644 --- a/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/block/view.xsl +++ b/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/block/view.xsl @@ -809,7 +809,7 @@ exclude-result-prefixes="#all" - + @@ -881,6 +881,20 @@ exclude-result-prefixes="#all" + + + + + +
+ +
+
+

@@ -895,6 +909,18 @@ exclude-result-prefixes="#all" + + + + + + + + + + + + @@ -2268,4 +2294,285 @@ exclude-result-prefixes="#all" + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ldh:render-view-instance-modal-form + + + + + + + + + + + + + + + + + + + + +

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ldh:view-instance-form-response + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + ldh:view-instance-link-response + + + + + + + + + + + + + + + + + + + + + + + + + ldh:refresh-view block-id: '' matched views: + + + + + + ldh:refresh-view block URI: cache found: + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/modal.xsl b/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/modal.xsl index 9e130a159..984db0b64 100644 --- a/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/modal.xsl +++ b/src/main/webapp/static/com/atomgraph/linkeddatahub/xsl/bootstrap/2.3.2/client/modal.xsl @@ -718,9 +718,12 @@ LIMIT 10 + + + - - + + From 97df8d5333657943e334bda596994cb5f69d5ae5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Jusevi=C4=8Dius?= Date: Wed, 19 Aug 2026 16:57:41 +0200 Subject: [PATCH 5/6] 5.9.1 changelog Co-Authored-By: Claude Fable 5 --- CHANGELOG.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 96941df83..cfa967b76 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,16 @@ +## [5.9.1] - 2026-08-19 +### Added +- Inline creation in views: views carrying the new `ldh:container` metadata render a Create button that creates a linked instance in that container (#351) +- `ldh:showWhenEmpty` hides a view while its query returns no results +- Version diffs in the history modal, rendered on the document page + +### Changed +- Bundled SKOS package view queries tolerate untagged `skos:prefLabel` literals + +### Fixed +- Type/class typeaheads dropped `owl:Class`-typed classes under inference-free ontology serving +- SKOS package URLs moved to LinkedDataHub-Apps `master` after the `develop` branch was deleted (package installs 404ed) + ## [5.9.0] - 2026-08-18 ### Added - GitHub-backed graph versioning: writes mirror each document into a repository as a sorted N-Triples commit authored with the agent's WebID (per-dataspace `lapp:versioningRepository` → `doap:GitRepository` in `system.trig`; token as `a:authToken` in `secrets/credentials.trig`) (#350) From 273cfd85407a89bd011f621062db3ce615d3d6c9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martynas=20Jusevi=C4=8Dius?= Date: Wed, 19 Aug 2026 18:01:09 +0200 Subject: [PATCH 6/6] Version diffs deferred to 5.9.2 Co-Authored-By: Claude Fable 5 --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index cfa967b76..079089152 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,6 @@ ### Added - Inline creation in views: views carrying the new `ldh:container` metadata render a Create button that creates a linked instance in that container (#351) - `ldh:showWhenEmpty` hides a view while its query returns no results -- Version diffs in the history modal, rendered on the document page ### Changed - Bundled SKOS package view queries tolerate untagged `skos:prefLabel` literals