Skip to content

Commit

Permalink
Adding delete widget for non-JCR-managed properties, adding form to a…
Browse files Browse the repository at this point in the history
…dd properties with DC or manually-entered predicates
  • Loading branch information
escowles committed Nov 16, 2013
1 parent ece5e32 commit f9455a1
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 4 deletions.
32 changes: 32 additions & 0 deletions fcrepo-http-api/src/main/resources/views/common-node-actions.vsl
Expand Up @@ -5,6 +5,38 @@
<hr />
#end

<form id="action_addprop" onsubmit="addProperty()">
<h3>Add Property</h3>
<div class="form-group">
<label for="add-pre-menu">Property</label>
<select id="add-pre-menu" class="form-control">
<option value="http://purl.org/dc/elements/1.1/contributor">dc:contributor</option>
<option value="http://purl.org/dc/elements/1.1/coverage">dc:coverage</option>
<option value="http://purl.org/dc/elements/1.1/creator">dc:creator</option>
<option value="http://purl.org/dc/elements/1.1/date">dc:date</option>
<option value="http://purl.org/dc/elements/1.1/description">dc:description</option>
<option value="http://purl.org/dc/elements/1.1/format">dc:format</option>
<option value="http://purl.org/dc/elements/1.1/identifier">dc:identifier</option>
<option value="http://purl.org/dc/elements/1.1/language">dc:language</option>
<option value="http://purl.org/dc/elements/1.1/publisher">dc:publisher</option>
<option value="http://purl.org/dc/elements/1.1/relation">dc:relation</option>
<option value="http://purl.org/dc/elements/1.1/rights">dc:rights</option>
<option value="http://purl.org/dc/elements/1.1/source">dc:source</option>
<option value="http://purl.org/dc/elements/1.1/subject">dc:subject</option>
<option value="http://purl.org/dc/elements/1.1/title">dc:title</option>
<option value="http://purl.org/dc/elements/1.1/type">dc:type</option>
</select>
<input type="text" id="add-pre-custom" placeholder="Custom Property URI..."
class="form-control"/>
</div>
<div class="form-group">
<label for="add-val">Value</label>
<input type="text" id="add-val" class="form-control"/>
</div>
<input type="submit" class="btn btn-primary" value="Add"/>
<hr/>
</form>

<form id="action_create" method="POST" enctype="multipart/form-data">
<h3>Create New Node</h3>
<div class="form-group">
Expand Down
47 changes: 46 additions & 1 deletion fcrepo-http-api/src/main/resources/views/common.js
Expand Up @@ -208,4 +208,49 @@ function ajaxErrorHandler(xhr, textStatus, errorThrown) {
$('#errorText').text(xhr.responseText);
$('#errorModal').modal('show');

}
}

function addProperty() {
var sub = $('#main').attr('resource');
var pre = document.getElementById("add-pre-custom").value;
if ( pre == '' ) {
var preMenu = document.getElementById("add-pre-menu");
pre = preMenu.options[preMenu.selectedIndex].value;
}
var obj = quoteObject( document.getElementById("add-val").value );
var update = "insert data { <" + sub + "> <" + pre + "> " + obj + " }";

// perform sparql update
$.ajax({url: sub, type: "PATCH", contentType: "application/sparql-update", data: update, success: function(data, textStatus, request) {
window.location.reload(true);
}, error: ajaxErrorHandler});
return false;
}

function deleteProperty( id ) {
var elem = document.getElementById(id);
var sub = $('#main').attr('resource');
var pre = elem.getAttribute('property');
var obj = quoteObject( elem.firstChild.data );
if ( obj.startsWith('"') && obj.indexOf("^^") > -1 ) {
obj = obj.substring( 0, obj.indexOf("^^") );
}
var update = "delete data { <" + sub + "> <" + pre + "> " + obj + " }";

// perform sparql update
$.ajax({url: sub, type: "PATCH", contentType: "application/sparql-update", data: update, success: function(data, textStatus, request) {
window.location.reload(true);
}, error: ajaxErrorHandler});
return false;
}

function quoteObject( obj ) {
if (obj.charAt(0) != '"' && obj.charAt(0) != "'" && obj.charAt(0) != '<') {
if (obj.substring(0,4) == "http") {
obj = "<" + obj + ">";
} else {
obj = "\"" + obj.replace(/\"/g,"\\\"") + "\"";
}
}
return obj;
}
9 changes: 6 additions & 3 deletions fcrepo-http-api/src/main/resources/views/common.vsl
Expand Up @@ -19,15 +19,18 @@
#end
<dd>
#if($quad.getObject().isURI() && $quad.getObject().getURI().startsWith("http"))
<a href="$quad.getObject().getURI()" property="$quad.getPredicate().toString()">$esc.html($quad.getObject())</a>
<a id="prop$quad.hashCode()" href="$quad.getObject().getURI()" property="$quad.getPredicate().toString()">$esc.html($quad.getObject())</a>
#elseif ($quad.getObject().isLiteral())
<span property="$quad.getPredicate().toString()">$esc.html($quad.getObject().getLiteral().getLexicalForm())</span>
<span id="prop$quad.hashCode()" property="$quad.getPredicate().toString()">$esc.html($quad.getObject().getLiteral().getLexicalForm())</span>
#else
<span property="$quad.getPredicate().toString()">$esc.html($quad.getObject())</span>
<span id="prop$quad.hashCode()" property="$quad.getPredicate().toString()">$esc.html($quad.getObject())</span>
#end
#if( $quad.getPredicate().toString().equals("http://fedora.info/definitions/v4/rest-api#digest") )
<a href="$topic/fcr:fixity">check fixity</a>
#end
#if( !$rdfLexicon.isManagedPredicateURI.apply($quad.getPredicate().toString()) )
<a href="#" onClick="deleteProperty('prop$quad.hashCode()');return false;" title="Delete Property">&times;</a>
#end
</dd>
#set ($last_quad = $quad)

Expand Down
11 changes: 11 additions & 0 deletions fcrepo-kernel/src/main/java/org/fcrepo/kernel/RdfLexicon.java
Expand Up @@ -305,6 +305,17 @@ public boolean apply(final Property p) {
public static final Predicate<Property> isManagedPredicate = or(
in(managedProperties), hasJcrNamespace, hasFedoraNamespace);

/**
* Detects whether an RDF predicate URI is managed by the repository.
*/
public static Predicate<String> isManagedPredicateURI =
new Predicate<String>() {
@Override
public boolean apply(final String uri) {
return isManagedPredicate.apply( createProperty(uri) );
}
};

private RdfLexicon() {

}
Expand Down

0 comments on commit f9455a1

Please sign in to comment.