You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by cl...@apache.org on 2010/12/08 17:01:55 UTC
svn commit: r1043469 - in
/sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling:
explorer/js/ servlet/default/explorer/
Author: clemens
Date: Wed Dec 8 16:01:55 2010
New Revision: 1043469
URL: http://svn.apache.org/viewvc?rev=1043469&view=rev
Log:
fixing SLING-1890 "JCR Explorer - improvements"
Modified:
sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/explorer/js/explorer.js
sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/edit.esp
sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/explorer.esp
sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/item.esp
sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/node.esp
sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/search.esp
Modified: sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/explorer/js/explorer.js
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/explorer/js/explorer.js?rev=1043469&r1=1043468&r2=1043469&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/explorer/js/explorer.js (original)
+++ sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/explorer/js/explorer.js Wed Dec 8 16:01:55 2010
@@ -19,6 +19,9 @@
/** replace the default get and post jQuery utility functions */
(function($) {
+ $.ajaxSetup({
+ timeout: 5 * 60 * 1000 // in ms, 5 minutes
+ });
$.getRaw = $.get;
$.getJSONRaw = $.getJSON;
$.postRaw = $.post;
@@ -50,21 +53,28 @@ init_load = function(path) {
type: 'GET',
// data: params,
success: function( data, textStatus, xmlHttpRequest ) {
+ try
+ {
// load others
- var paths = path.split("/");
- paths.splice(0, 1); // remove first slash
- var rPath = "";
- for (p in paths) {
- rPath += paths[p];
- load_branch(rPath);
- rPath += "/";
- }
+ var paths = path.split("/");
+ paths.splice(0, 1); // remove first slash
+ var rPath = "";
+ for (p in paths) {
+ rPath += paths[p];
+ load_branch(rPath);
+ rPath += "/";
+ }
- // load properties
- load_props( path );
+ // load properties
+ load_props( path );
+ }
+ catch(e)
+ {
+ show_error( e );
+ }
},
error: function( xmlHttpRequest, textStatus, errorThrown ) {
- show_error( xmlHttpRequest.responseText );
+ show_error( "(" + textStatus + ")" + xmlHttpRequest.responseText );
}
});
}
@@ -82,10 +92,9 @@ explorer_toggle = function( path ) {
}
else
{
- // toggle
-
+ // toggle
if (is_open) {
- // remove children
+ // close, i.e. remove children
$('p#'+id).parent().find('ul').each(function(){
$(this).empty();
this.parentNode.removeChild( this )
@@ -94,14 +103,24 @@ explorer_toggle = function( path ) {
$('p#'+id).parent().removeClass('branch'); // remove css class
load_props( path );
} else {
+ // just reload properties
load_branch(path, function(){ load_props( path ); });
}
}
}
+var loadingbranch = false;
+var lastloaded = null;
+
/** load branch/subtree **/
load_branch = function( path, callback, reload ) {
- if (path != '') {
+ if ( loadingbranch ) {
+ alert("busy...");
+ return;
+ }
+ if ( path != '' )
+ {
+ loadingbranch = true;
var id = path_2_id( path );
$('p#' + id + ">a").removeAttr('href'); // remove onclick
@@ -115,27 +134,47 @@ load_branch = function( path, callback,
url: uri,
type: 'GET',
success: function( data, textStatus, xmlHttpRequest ) {
- if ( data.length > 0 ) {
- $('p#' + id).parent().addClass('branch'); // add css class
- if ( reload )
- {
- $('ul', $('p#' + id).parent()).remove();
- }
- $('p#' + id).after(data); // add data
- $('p#' + id + ">a").attr('href', "#"); // reactivate onclick
- $('p#' + id + ">a").addClass('open'); // open
- $('p#' + id).addClass('loaded');
- if ( callback ) { callback() };
- }
+ try
+ {
+ if ( data.length > 0 ) {
+ $('p#' + id).parent().addClass('branch'); // add css class
+ if ( reload )
+ {
+ $('ul', $('p#' + id).parent()).remove();
+ }
+ $('p#' + id).after( data ); // add data
+ $('p#' + id + ">a").attr('href', "#"); // reactivate onclick
+ $('p#' + id + ">a").addClass('open'); // open
+ $('p#' + id).addClass('loaded');
+ lastloaded = path;
+ if ( callback ) {
+ loadingbranch = false;
+ callback()
+ };
+ }
+ }
+ catch(e)
+ {
+ show_error( e + data );
+ }
+
},
error: function( xmlHttpRequest, textStatus, errorThrown ) {
- show_error( xmlHttpRequest.responseText );
- }
+ show_error( "(" + textStatus + ")" + xmlHttpRequest.responseText );
+ },
+ complete: function( xmlHttpRequest, textStatus) {
+ loadingbranch = false;
+ if ( textStatus.equals("timeout") )
+ {
+ show_error("Timeout!");
+ }
+ }
});
}
}
var currentPath = null;
+
load_props = function( path ) {
var id = path_2_id( path );
$('#expl_content').data("currently_selected_node", id);
@@ -176,26 +215,54 @@ add_prop = function( node ) {
type: 'POST',
data: params,
success: function( data, textStatus, xmlHttpRequest ) {
- reload_properties();
+ try
+ {
+ reload_properties();
+ }
+ catch(e)
+ {
+ show_error( e );
+ }
+
},
error: function( xmlHttpRequest, textStatus, errorThrown ) {
- show_error( xmlHttpRequest.responseText );
+ show_error( "(" + textStatus + ")" + xmlHttpRequest.responseText );
}
});
}
search = function( language, expression, page ) {
+ if ( page != null )
+ {
+ // $('#sql_search_result').html( "" );
+ // adjust_height();
+ }
+ $('#searchButton').attr("value", "Please Wait...");
+ $('#searchButton').attr('disabled', true);
// search and load search results
$.ajax({
url: "/.explorer.search.html",
type: 'GET',
data: { "language" : language, "expression" : expression, "page" : page },
success: function( data, textStatus, xmlHttpRequest ) {
- $('#sql_search_result').html( data );
- adjust_height();
+ try
+ {
+ $('#sql_search_result').html( data );
+ adjust_height();
+ }
+ catch(e)
+ {
+ show_error( e );
+ }
+
},
error: function( xmlHttpRequest, textStatus, errorThrown ) {
- show_error( xmlHttpRequest.responseText );
+
+ show_error( "(" + textStatus + ")" + xmlHttpRequest.responseText );
+ },
+ complete: function( xmlHttpRequest, textStatus) {
+ $('#searchButton').attr("value", "Execute!");
+ $('#searchButton').removeAttr('disabled');
}
});
}
@@ -216,8 +283,15 @@ expand_tree = function( path, callback )
var id = path_2_id( partialPath ); // replacing / with _
if (($('p#' + id).length === 0) || !$('p#' + id).hasClass('loaded'))
{
- // asynchronous recursion: expand_tree is re-called after ajax call has finished
- load_branch( partialPath, function() { expand_tree( path, callback ); } );
+ if ( partialPath == lastloaded )
+ {
+ show_error("failed to expand path " + partialPath);
+ }
+ else
+ {
+ // asynchronous recursion: expand_tree is re-called after ajax call has finished
+ load_branch( partialPath, function() { expand_tree( path, callback ); } );
+ }
return;
}
}
@@ -233,10 +307,15 @@ path_2_id = function( path ) {
id = id.replace(/^_/, ""); // remove trailing _
}
id = id.replace(/\./g, '_');// due to the css selectors
+ id = id.replace(/\,/g, '_');// due to the css selectors
id = id.replace(/:/g, '_');// due to the css selectors
id = id.replace(/\[/g, '_');// due to the css selectors
id = id.replace(/\]/g, '_');// due to the css selectors
id = id.replace(/\+/g, '_');// due to the css selectors
+ id = id.replace(/\-/g, '_');// due to the css selectors
+ id = id.replace(/\(/g, '_');// due to the css selectors
+ id = id.replace(/\)/g, '_');// due to the css selectors
+ id = id.replace(/\s/g, '_');// due to the css selectors
return id;
}
Modified: sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/edit.esp
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/edit.esp?rev=1043469&r1=1043468&r2=1043469&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/edit.esp (original)
+++ sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/edit.esp Wed Dec 8 16:01:55 2010
@@ -84,7 +84,7 @@
<fieldset>
<label for="<%= mixinTypesId %>"><%= mixinTypesId %></label>
<%
- create_multivalueinput_for_type( mixinTypesId, "Name", mixinTypes, false );
+ create_multivalueinput_for_type( mixinTypesId, Packages.javax.jcr.PropertyType.NAME, mixinTypes, false );
%>
<% if (canModifyProperties) { %>
<select id="<%= mixinTypesId %>_new_entry" >
@@ -102,12 +102,17 @@
</form>
</div>
<%
- }
- var propKeys = properties.keySet().toArray();
- if ( (propKeys.length > 0) || canModifyProperties ) { %>
+ }
+ // sort properties
+ var propKeys = Packages.java.util.Arrays.asList( properties.keySet().toArray() );
+ Packages.java.util.Collections.sort( propKeys );
+ propKeys = propKeys.toArray();
+ if ( (propKeys.length > 0) || canModifyProperties )
+ {
+%>
<h3>properties</h3>
- <%
- for (var idx in propKeys) {
+<%
+ for ( var idx in propKeys ) {
var id = propKeys[idx];
var isProperty = false;
var isMultivalueProperty = false;
@@ -128,21 +133,30 @@
<div id="property_element_<%= id %>" class="<% if ( isMultivalueProperty ) {%> multivalued <% } %> property_element">
<form id="properties_form_<%= id %>" action="<%=path%>" method="post">
<fieldset>
- <label for="<%= id %>"><%= id %> [ <%= type %> <% if ( isMultivalueProperty ) {%>MULTIVALUE<% } %>] </label>
- <% if ( isMultivalueProperty )
- {
- create_multivalueinput_for_type( id, type, val, true );
- } else {
- if ( isProperty )
- {
- create_input_for_type( id, val.getType(), val, ( canModifyProperties && !val.getDefinition().isProtected() ), false );
- }
- else {
- %>
- <input class="prop_value text" id="<%= id %>" name="<%= id %>" value="<%= val %>" /> [not a property!]
- <%
+ <label for="<%= id %>"><%= id %>
+ <% if (isProperty) { %>
+ [ <%= type %> <% if ( isMultivalueProperty ) {%>MULTIVALUE<% } %>]
+ <% } else { %>
+ [not a property!]
+ <% } %>
+ </label>
+ <%
+ if ( isProperty )
+ {
+ if ( isMultivalueProperty )
+ {
+ create_multivalueinput_for_type( id, val.type, val, true );
+ } else {
+ if ( isProperty )
+ {
+ create_input_for_type( id, val.getType(), val, ( canModifyProperties && !val.getDefinition().isProtected() ), false );
+ }
}
- }
+ }
+ else {
+ // used to output: <input class="prop_value text" id="<%= id %>" name="<%= id %>" value="<%= val %>" />
+ }
+
%>
<input name=":redirect" type="hidden" value="<%=request.getContextPath()%><%=path%>.explorer.html">
</fieldset>
@@ -404,7 +418,7 @@
break;
case Packages.javax.jcr.PropertyType.BOOLEAN : %>
<input type="hidden" name="<%= id %>" id="<%= id %>_cb" value="<%= val %>" >
- <input type="checkbox" class="checkbox" id="<%= id %>" <% if(!editable) { %> class="protected" <%}%> <% if ( val.getBoolean() ) { %>checked<% } %> onchange="$('[id=<%= id %>_cb]').val( this.checked ? 'true' : 'false' );">
+ <input type="checkbox" class="checkbox" id="<%= id %>" <% if ( val.getBoolean() ) { %>checked<% } %> onchange="$('[id=<%= id %>_cb]').val( this.checked ? 'true' : 'false' );" <% if(!editable) { %> class="protected" disabled<%}%>>
<%
break;
case Packages.javax.jcr.PropertyType.REFERENCE :
@@ -430,19 +444,42 @@
} // switch
} %>
-<% function create_multivalueinput_for_type( id, type, multivalue_property, include_add_field ) {
+<%
+function create_multivalueinput_for_type( id, type, multivalue_property, include_add_field ) {
+ var typeStr = Packages.javax.jcr.PropertyType.nameFromValue( type );
%>
- <input type="hidden" name="<%= id %>@TypeHint" value="<%= type %>[]" />
+ <input type="hidden" name="<%= id %>@TypeHint" value="<%= typeStr %>[]" />
<ul id="<%= id %>_entries">
<%
if ( multivalue_property ) {
+ var editable = canModifyProperties && !multivalue_property.getDefinition().isProtected()
for ( var idx in multivalue_property.getValues() )
{
var entry = multivalue_property.getValues()[idx]; %>
<li>
<input type="hidden" name="<%= id %>" value="<%= entry.getString() %>" />
+ <%
+ switch (type)
+ {
+ case Packages.javax.jcr.PropertyType.REFERENCE :
+ case Packages.javax.jcr.PropertyType.WEAKREFERENCE :
+ case Packages.javax.jcr.PropertyType.PATH :
+ try {
+ var refNode = session.getNodeByIdentifier(entry.getQValue().getString());
+ %>
+ -> <a href="#" onclick="skip_to('<%= refNode.getPath() %>');"><%= refNode.getPath() %> (<%= refNode.getIdentifier() %>)</a>
+
+ <%
+ } catch ( ex ) {
+ }
+ break;
+ default:
+ %>
<%= entry.getString() %>
- <% if ( canModifyProperties && !multivalue_property.getDefinition().isProtected() ) { %>
+ <%
+ } // switch
+ %>
+ <% if ( editable ) { %>
<a href="#" class="button" onclick="$(this).parent().remove();update_property('<%= id %>');">delete</a>
<% } %>
</li>
@@ -453,7 +490,7 @@
</ul>
<div class="addMultivalueproperty">
<% if ( include_add_field && canModifyProperties && !multivalue_property.getDefinition().isProtected() ) {
- create_input_for_type( id+"_new_entry", type, '', true, true );
+ create_input_for_type( id+"_new_entry", typeStr, '', true, true );
%>
<a href="#" onclick="add_property_entry('<%= id %>')" class="button">add</a>
<div class="clear"></div>
Modified: sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/explorer.esp
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/explorer.esp?rev=1043469&r1=1043468&r2=1043469&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/explorer.esp (original)
+++ sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/explorer.esp Wed Dec 8 16:01:55 2010
@@ -23,7 +23,7 @@
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
-<title>Sling || JCR Explorer</title>
+<title>Sling || JCR Explorer 1.0.0</title>
<link rel="stylesheet" href="<%= request.getContextPath() %>/libs/sling/explorer/css/explorer.css" type="text/css"/>
<link rel="stylesheet" href="<%= request.getContextPath() %>/libs/sling/explorer/css/jquery-ui.css" type="text/css" media="all" />
@@ -109,8 +109,8 @@
<input type="text" class="text" name="search_expression" id="search_expression" ></input>
<br class="clear" />
</p>
- <p>
- <input class="button" type="submit" value="Execute!" onclick="search($('#query_language').val(), $('#search_expression').val(), 1 ); return false;" />
+ <p>
+ <input class="button" type="submit" id="searchButton" value="Execute!" onclick="search($('#query_language').val(), $('#search_expression').val(), 1 ); return false;" />
<br class="clear" />
</p>
</form>
Modified: sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/item.esp
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/item.esp?rev=1043469&r1=1043468&r2=1043469&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/item.esp (original)
+++ sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/item.esp Wed Dec 8 16:01:55 2010
@@ -19,51 +19,59 @@
*/
--%>
<%
-var nodes = request.resourceResolver.listChildren( resource );
-if (nodes.hasNext()) {
- %>
- <ul>
- <%
- while (nodes.hasNext()) {
- var child = nodes.next();
- var name = Packages.org.apache.sling.api.resource.ResourceUtil.getName(child);
-
- var path = child.path;
-
- var wsSepPos = path.indexOf(":/", 0);
- if (wsSepPos != -1) {
- path = path.substring(wsSepPos + 1);
- }
-
- path = path.substr(1);
- // WARNING: have a look at explorer.js - duplicate code!
- var id = path.replace(/\//g, "_");
- if ( path.length > 1 )
- {
- id = id.replace(/^_/, ""); // remove trailing _
- }
- id = id.replace(/\./g, '_');// due to the css selectors
- id = id.replace(/:/g, '_');// due to the css selectors
- id = id.replace(/\[/g, '_');// due to the css selectors
- id = id.replace(/\]/g, '_');// due to the css selectors
- id = id.replace(/\+/g, '_');// due to the css selectors
- %>
- <li>
- <p id="<%= id %>">
- <%
- var resourceType = '';
- var node = child.adaptTo(Packages.javax.jcr.Node);
- if ( node && node.hasProperty( 'sling:resourceType' ) ) {
- resourceType = node.getProperty('sling:resourceType');
- }
+if ( resource )
+{
+ var nodes = request.resourceResolver.listChildren( resource );
+ if ( nodes && nodes.hasNext() )
+ {
+ %>
+ <ul>
+ <%
+ while (nodes.hasNext()) {
+ var child = nodes.next();
+ var name = Packages.org.apache.sling.api.resource.ResourceUtil.getName(child);
+ var path = child.path;
+
+ var wsSepPos = path.indexOf(":/", 0);
+ if (wsSepPos != -1) {
+ path = path.substring(wsSepPos + 1);
+ }
+
+ path = path.substr(1);
+ // WARNING: have a look at explorer.js - duplicate code!
+ var id = path.replace(/\//g, "_");
+ if ( path.length > 1 )
+ {
+ id = id.replace(/^_/, ""); // remove trailing _
+ }
+ id = id.replace(/\./g, '_');// due to the css selectors
+ id = id.replace(/\,/g, '_');// due to the css selectors
+ id = id.replace(/:/g, '_');// due to the css selectors
+ id = id.replace(/\[/g, '_');// due to the css selectors
+ id = id.replace(/\]/g, '_');// due to the css selectors
+ id = id.replace(/\+/g, '_');// due to the css selectors
+ id = id.replace(/\-/g, '_');// due to the css selectors
+ id = id.replace(/\(/g, '_');// due to the css selectors
+ id = id.replace(/\)/g, '_');// due to the css selectors
+ id = id.replace(/\s/g, '_');// due to the css selectors
%>
- <a href="#" onclick="explorer_toggle('<%= path %>', '<%= resourceType %>')" ><%= name %></a>
- </p>
- </li>
+ <li>
+ <p id="<%= id %>">
+ <%
+ var resourceType = '';
+ var node = child.adaptTo(Packages.javax.jcr.Node);
+ if ( node && node.hasProperty( 'sling:resourceType' ) ) {
+ resourceType = node.getProperty('sling:resourceType');
+ }
+ %>
+ <a href="#" onclick="explorer_toggle('<%= path %>', '<%= resourceType %>')" ><%= name %></a>
+ </p>
+ </li>
+ <%
+ } // while
+ %>
+ </ul>
<%
- } // while
-%>
-</ul>
-<%
-} // if (nodes.hasNext())
+ } // if (nodes.hasNext())
+} // if (resource)
%>
\ No newline at end of file
Modified: sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/node.esp
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/node.esp?rev=1043469&r1=1043468&r2=1043469&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/node.esp (original)
+++ sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/node.esp Wed Dec 8 16:01:55 2010
@@ -185,7 +185,7 @@
function add_new_child_node()
{
$.ajax({
- url: '<%=path%>/*',
+ url: '<%=(path == '/') ? '' : path%>/*',
type: 'POST',
data: $("form[id='new_child_node_form']" ).serialize(),
success: function( data, textStatus, xmlHttpRequest )
@@ -269,44 +269,74 @@
}
</script>
<%
- function create_input_for_type( id, type, val, editable, omitName ) {
- switch ( type ) {
- case Packages.javax.jcr.PropertyType.DATE :
- %>
+function create_input_for_type( id, type, val, editable, omitName ) {
+ switch ( type ) {
+ case Packages.javax.jcr.PropertyType.DATE :
+%>
<form>
<input class="prop_value text datepicker<% if(!editable) { %> protected<%}%>" <% if (!omitName) { %> name="<%= id %>" <% } %> id="<%= id %>" value="<%= dateFormatter.format( val.getDate().getTime() ) %>"> <%
break;
- case Packages.javax.jcr.PropertyType.BOOLEAN : %> <input type="hidden" name="<%= id %>" id="<%= id %>_cb" value="<%= val %>"> <input type="checkbox" id="<%= id %>" <% if(!editable) { %> class="protected" <%}%> <% if ( val.getBoolean() ) { %> checked <% } %> onchange="$('[id=<%= id %>_cb]').val( this.checked ? 'true' : 'false' );"> <%
- break;
- case Packages.javax.jcr.PropertyType.REFERENCE :
- case Packages.javax.jcr.PropertyType.WEAKREFERENCE :
- case Packages.javax.jcr.PropertyType.PATH :
- try {
- var refNode = val.getNode();
- %> -> <a href="#" onclick="skip_to('<%= refNode.getPath() %>')"><%= refNode.getPath() %> (<%= refNode.getIdentifier() %>)</a> <input class="prop_value text <% if(!editable) { %> protected <%}%>" id="<%= id %>" <% if (!omitName) { %> name="<%= id %>" <% } %> value="<%= val %>"> <%
- } catch ( ex ) {}
- break;
- case Packages.javax.jcr.PropertyType.BINARY :
- %> <a class="saveAs" href="%3C%=%20path%20%%3E" target="_blank">Download content (use "Save as...")</a> <%
- break;
- default: %> <input class="prop_value text <% if(!editable) { %> protected <%}%>" id="<%= id %>" <% if (!omitName) { %> name="<%= id %>" <% } %> value="<%= val %>"> <%
- break;
- } // switch
- } %> <% function create_multivalueinput_for_type( id, type, multivalue_property, include_add_field ) {
- %> <input type="hidden" name="<%= id %>@TypeHint" value="<%= type %>[]">
- </form>
+ case Packages.javax.jcr.PropertyType.BOOLEAN :
+%> <input type="hidden" name="<%= id %>" id="<%= id %>_cb" value="<%= val %>"> <input type="checkbox" id="<%= id %>" <% if(!editable) { %> class="protected" <%}%> <% if ( val.getBoolean() ) { %> checked <% } %> onchange="$('[id=<%= id %>_cb]').val( this.checked ? 'true' : 'false' );">
+<%
+ break;
+ case Packages.javax.jcr.PropertyType.REFERENCE :
+ case Packages.javax.jcr.PropertyType.WEAKREFERENCE :
+ case Packages.javax.jcr.PropertyType.PATH :
+ try {
+ var refNode = val.getNode();
+%> -> <a href="#" onclick="skip_to('<%= refNode.getPath() %>')"><%= refNode.getPath() %> (<%= refNode.getIdentifier() %>)</a> <input class="prop_value text <% if(!editable) { %> protected <%}%>" id="<%= id %>" <% if (!omitName) { %> name="<%= id %>" <% } %> value="<%= val %>"> <%
+ } catch ( ex ) {}
+ break;
+ case Packages.javax.jcr.PropertyType.BINARY :
+%> <a class="saveAs" href="%3C%=%20path%20%%3E" target="_blank">Download content (use "Save as...")</a> <%
+ break;
+ default: %> <input class="prop_value text <% if(!editable) { %> protected <%}%>" id="<%= id %>" <% if (!omitName) { %> name="<%= id %>" <% } %> value="<%= val %>"> <%
+ break;
+ } // switch
+}
+
+function create_multivalueinput_for_type( id, type, multivalue_property, include_add_field ) {
+%>
+ <input type="hidden" name="<%= id %>@TypeHint" value="<%= type %>[]">
+ </form>
<ul id="<%= id %>_entries">
- <%
- if ( multivalue_property ) {
- for ( var idx in multivalue_property.getValues() )
- {
- var entry = multivalue_property.getValues()[idx]; %>
- <li>
- <input type="hidden" name="<%= id %>" value="<%= entry.getString() %>"> <%= entry.getString() %> <% if ( canModifyProperties && !multivalue_property.getDefinition().isProtected() ) { %> <a href="#" class="button" onclick="$(this).parent().remove();update_property('<%= id %>');">delete</a> <% } %>
- </li><%
- } // for
- } // if
- %>
+<%
+ if ( multivalue_property )
+ {
+ var editable = canModifyProperties && !multivalue_property.getDefinition().isProtected()
+ for ( var idx in multivalue_property.getValues() )
+ {
+ var entry = multivalue_property.getValues()[idx];
+%>
+<li><input type="hidden" name="<%= id %>" value="<%= entry.getString() %>">
+<%
+ switch (type)
+ {
+ case Packages.javax.jcr.PropertyType.REFERENCE :
+ case Packages.javax.jcr.PropertyType.WEAKREFERENCE :
+ case Packages.javax.jcr.PropertyType.PATH :
+ try {
+ var refNode = entry.getNode();
+%> -> <a href="#" onclick="skip_to('<%= refNode.getPath() %>')"><%= refNode.getPath() %> (<%= refNode.getIdentifier() %>)</a> <input class="prop_value text <% if(!editable) { %> protected <%}%>" id="<%= id %>" <% if (!include_add_field) { %> name="<%= id %>" <% } %> value="<%= entry %>"> <%
+ } catch ( ex ) {}
+ break;
+ default:
+%>
+ <%= entry.getString() %>
+<%
+ } // switch
+ if ( editable )
+ {
+%>
+<a href="#" class="button" onclick="$(this).parent().remove();update_property('<%= id %>');">delete</a>
+<%
+ } // if
+%></li>
+<%
+ } // for
+ } // if ( multivalue_property )
+%>
</ul>
<div class="addMultivalueproperty">
<% if ( include_add_field && canModifyProperties && !multivalue_property.getDefinition().isProtected() ) {
@@ -318,4 +348,4 @@
<%
}
}
- %>
+ %>
\ No newline at end of file
Modified: sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/search.esp
URL: http://svn.apache.org/viewvc/sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/search.esp?rev=1043469&r1=1043468&r2=1043469&view=diff
==============================================================================
--- sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/search.esp (original)
+++ sling/trunk/bundles/extensions/explorer/src/main/resources/libs/sling/servlet/default/explorer/search.esp Wed Dec 8 16:01:55 2010
@@ -23,10 +23,11 @@
--%>
<%
var entriesPerPage = 10;
+var maxEntries = 100;
var session = request.resourceResolver.adaptTo(Packages.javax.jcr.Session);
if ( session )
{
- var expression = request.getParameter("expression");
+ var expression = unescape(request.getParameter("expression"));
var language = request.getParameter("language");
var page = parseInt(request.getParameter("page") || 1);
var queryManager = session.getWorkspace().getQueryManager();
@@ -38,17 +39,6 @@ if ( session )
var knownNumberOfHits = false;
if ( !countExpression.toLowerCase().match(/order\s*by/) )
{
- /* this switch does not seem to work...
- switch ( language ) {
- case 'JCR-SQL2' :
- countExpression += ' order by [jcr:score] desc';
- break;
- case 'xpath' :
- countExpression += ' order by @jcr:score descending';
- break;
- default:
- }; // switch
- */
if ( language == 'JCR-SQL2' ) {
countExpression += ' order by [jcr:score] desc';
}
@@ -56,93 +46,125 @@ if ( session )
countExpression += ' order by @jcr:score descending';
}
}
- var overallEntryCount = 'unknown';
- var durationInMs = 'unknown';
+ var overallEntryCount = 'unknown ';
+ var durationInMs = 'unknown ';
+ var results = null;
+ var start = new Date();
if ( countExpression.toLowerCase().match(/order\s*by/) )
{
var countQuery = queryManager.createQuery( countExpression , language );
- var start = new Date();
- var results = countQuery.execute();
- var end = new Date();
- var durationInMs = end.getTime() - start.getTime();
+ results = countQuery.execute();
overallEntryCount = results.getRows().getSize();
- knownNumberOfHits = true;
+ knownNumberOfHits = (overallEntryCount != -1);
+ overallEntryCount = knownNumberOfHits ? overallEntryCount.toString() : 'unknown';
}
- %>
- <h4>Hits: <%= overallEntryCount %> (took <%= durationInMs %>ms)</h4>
- <%
+ else
+ {
+ var query = queryManager.createQuery( expression , language );
+ results = query.execute();
+ }
+
+ /* WE DON'T REPERFORM THE QUERY ANYMORE!
+ var query = queryManager.createQuery( expression, language );
+ if ( overallEntryCount != 'unknown')
+ {
+ query.setOffset( (page - 1) * entriesPerPage );
+ query.setLimit( entriesPerPage );
+ }
+ else
+ {
+ query.setLimit( maxEntries );
+ }
+ results = query.execute();
+ */
- var query = queryManager.createQuery( expression, language );
- query.setOffset( (page - 1) * entriesPerPage );
- query.setLimit(entriesPerPage);
- var results = query.execute();
- var ri = results.getRows(); // RowIterator
var count = 0;
- while ( ri.hasNext() ) {
- var row = ri.nextRow(); // row
- var score = row.getScore(); // double
- /*
- var values = row.getValues();
- var excerpt = '';
- for (idx in values)
- {
- excerpt += (values[idx]).getString();
- }
- */
- var resourceType = '';
- var node = row.getNode();
- if ( node && node.hasProperty( 'sling:resourceType' ) ) {
- resourceType = node.getProperty('sling:resourceType');
- }
+ var ri = results.getRows(); // RowIterator
+ try
+ {
+ ri.skip((page - 1) * entriesPerPage);
+ var end = new Date();
+ durationInMs = end.getTime() - start.getTime();
+ %>
+ <h4>Hits: <%= overallEntryCount %> (took <%= durationInMs %>ms)</h4>
+ <%
+ while ( ri.hasNext() && count < entriesPerPage ) {
+ var row = ri.nextRow(); // row
+ var score = row.getScore(); // double
+ var resourceType = '';
+ var node = row.getNode();
+ if ( node && node.hasProperty( 'sling:resourceType' ) ) {
+ resourceType = node.getProperty('sling:resourceType');
+ }
%>
<li>
<a href="#" onclick="skip_to('<%= row.getPath() %>', '<%= resourceType %>')"><%= row.getPath() %></a> (score: <%= score %>)
</li>
<%
- count++;
- } // while
+ count++;
+ } // while
+ }
+ catch( noSuchElementException )
+ {
+ }
+
var moreToCome = (count == entriesPerPage);
+ var lastPage = 0;
if ( knownNumberOfHits )
{
- var lastPage = Math.round(overallEntryCount / entriesPerPage) + (((overallEntryCount % 10) < 5 && (overallEntryCount % 10) > 0) ? 1 : 0);
+ lastPage = Math.round(overallEntryCount / entriesPerPage) + (((overallEntryCount % 10) < 5 && (overallEntryCount % 10) > 0) ? 1 : 0);
moreToCome = ((lastPage > 0) && lastPage != page);
}
%>
</ul>
<div id="page_navigation">
-<% if (page > 1) { %>
+<%
+ if (page > 1) {
+%>
<a href="#" class="button" id="first_page" title="first page">|<</a>
<a href="#" class="button" id="previous_page" title="previous page">
<%= ((page - 2) * entriesPerPage) + 1 %>..<%= ((page - 1) * entriesPerPage) %>
</a>
<script>
$('#previous_page').click( function(e) {
- search('<%= language %>', '<%= expression %>', <%= page - 1 %> );
+ search('<%= language %>', '<%= escape(expression) %>', <%= page - 1 %> );
});
$('#first_page').click( function(e) {
- search('<%= language %>', '<%= expression %>', 1 );
+ search('<%= language %>', '<%= escape(expression) %>', 1 );
});
</script>
-<% } %>
+<%
+ } // if (page > 1)
+%>
+
<%= ((page - 1) * entriesPerPage) + 1 %>..<%= ((page - 1) * entriesPerPage) + count %>
-<% if ( moreToCome ) { %>
+<%
+ if ( moreToCome )
+ {
+%>
<a href="#" class="button" id="next_page" title="next page">
<%= (page * entriesPerPage) + 1 %>..<%= ((page + 1) * entriesPerPage) %>
</a>
-<% if (lastPage) { %>
+<%
+ if (lastPage > 0) {
+%>
<a href="#" class="button" id="last_page">>|</a>
-<% } %>
+<%
+ }
+%>
</div>
<script>
-$('#next_page').click( function(e) {
- search('<%= language %>', '<%= expression %>', <%= page + 1 %> );
-});
-$('#last_page').click( function(e) {
- search('<%= language %>', '<%= expression %>', <%= lastPage %> );
-});
-</script>
+ $('#next_page').click( function(e) {
+ search('<%= language %>', '<%= escape(expression) %>', <%= page + 1 %> );
+ });
+<% if (lastPage > 0) { %>
+ $('#last_page').click( function(e) {
+ search('<%= language %>', '<%= escape(expression) %>', <%= lastPage %> );
+ });
<% } %>
-<%
+</script>
+<%
+ } // if (moreToCome)
} // if
%>