You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@sling.apache.org by sb...@apache.org on 2016/11/05 23:32:32 UTC

svn commit: r1768284 - in /sling/trunk/contrib/explorers/resourceeditor/src/main: less/ resources/SLING-INF/libs/sling/resource-editor-static-content/js/ resources/SLING-INF/libs/sling/resource-editor-static-content/js/scriptpathchooser/ resources/SLIN...

Author: sboehme
Date: Sat Nov  5 23:32:32 2016
New Revision: 1768284

URL: http://svn.apache.org/viewvc?rev=1768284&view=rev
Log:
SLING-6248 Resource Editor :: Create a simple Resource Type Editor

Added:
    sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/scriptpathchooser/
    sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/scriptpathchooser/scriptfilechooser.js
Modified:
    sling/trunk/contrib/explorers/resourceeditor/src/main/less/reseditor.less
    sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/MainController.js
    sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/tree/JSTreeAdapter.js
    sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/tree/TreeController.js
    sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor/html.jsp
    sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor/node-content.jsp
    sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor/rootnodes.json.jsp

Modified: sling/trunk/contrib/explorers/resourceeditor/src/main/less/reseditor.less
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/explorers/resourceeditor/src/main/less/reseditor.less?rev=1768284&r1=1768283&r2=1768284&view=diff
==============================================================================
--- sling/trunk/contrib/explorers/resourceeditor/src/main/less/reseditor.less (original)
+++ sling/trunk/contrib/explorers/resourceeditor/src/main/less/reseditor.less Sat Nov  5 23:32:32 2016
@@ -160,7 +160,7 @@ body
 	width: 200px;
 }
 
-#tree
+.tree-and-props
 {
     overflow: auto;
     height: 100%;
@@ -204,14 +204,14 @@ body
     clear: both
 }
 
-#tree a, #tree :visited, #tree :link {
+.tree-and-props a, .tree-and-props :visited, .tree-and-props :link {
 	border:1px solid transparent; 
 	padding:0px 1px;
 	font-family: arial, helvetica, sans-serif, times;
 	color: @textColor
 }
 
-#tree .jstree-hovered, #tree .jstree-hovered.jstree-clicked { 
+.tree-and-props .jstree-hovered, .tree-and-props .jstree-hovered.jstree-clicked{ 
 	.plate-selected-text-shadow;
 	color: #FFF;
 	background: transparent; 
@@ -291,8 +291,9 @@ body
   box-shadow: none;
 }
 
-#tree .jstree-clicked 
+.tree-and-props .jstree-clicked, #page-script-chooser-row .files>tr:hover 
 {
+	.rounded;
 	background: @selectedBackground; 
 	border:1px solid black; 
 	padding:0px 1px;
@@ -373,4 +374,14 @@ input.jstree-rename-input{
 
 #properties-info-icon {
 	margin-top: 5px;
+}
+
+#page-script-chooser-row {
+	.rounded;
+	border: 1px solid @textColor;
+	margin: 10px;
+}
+
+#page-script-chooser-row .table > tbody > tr > td {
+    border-top: 0;
 }
\ No newline at end of file

Modified: sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/MainController.js
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/MainController.js?rev=1768284&r1=1768283&r2=1768284&view=diff
==============================================================================
--- sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/MainController.js (original)
+++ sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/MainController.js Sat Nov  5 23:32:32 2016
@@ -157,13 +157,13 @@ org.apache.sling.reseditor.MainControlle
 		var alert_height = $("#alerts").outerHeight(true);
 		var content_tab_height = $("#content-tabs").outerHeight(true);
 		var footer_height = $("#footer").outerHeight(true);
-		var sidebar_margin = $("#sidebar").outerHeight(true)-$("#sidebar").outerHeight(false);
+		var tree_margin = $("#tree").outerHeight(true)-$("#tree").outerHeight(false);
 		var mainrow_margin = $("#main-row").outerHeight(true)-$("#main-row").outerHeight(false);
-		var usable_height = $(window).height() - login_height - header_height - alert_height - sidebar_margin - mainrow_margin - 15;
+		var usable_height = $(window).height() - login_height - header_height - alert_height - tree_margin - mainrow_margin - 15;
 		
 	// activate again if the footer is needed	
-//	 	var usable_height = $(window).height() - header_height - footer_height - sidebar_margin - 1;
-		$("#sidebar").height( usable_height );
+//	 	var usable_height = $(window).height() - header_height - footer_height - tree_margin - 1;
+		$("#tree").height( usable_height );
 		$("#outer_content").height( usable_height-content_tab_height );
 	}
 

Added: sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/scriptpathchooser/scriptfilechooser.js
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/scriptpathchooser/scriptfilechooser.js?rev=1768284&view=auto
==============================================================================
--- sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/scriptpathchooser/scriptfilechooser.js (added)
+++ sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/scriptpathchooser/scriptfilechooser.js Sat Nov  5 23:32:32 2016
@@ -0,0 +1,48 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+/*
+ * Represents the functionality for the file chooser within the script path chooser.
+ */
+
+// creating the namespace
+var org = org || {};
+org.apache = org.apache || {};
+org.apache.sling = org.apache.sling || {};
+org.apache.sling.sitebuilder = org.apache.sling.sitebuilder || {};
+
+//defining the module
+org.apache.sling.sitebuilder.Scriptfilechooser = (function() {
+
+	function Scriptfilechooser(){
+		this.selectedScriptResourcePath = "";
+		var thisScriptfilechooser = this;
+		$('#page-script-chooser-row .files').on("click", "td", function(e) {
+			thisScriptfilechooser.selectedPageScriptPath = $(this).text();
+			var selectedPageScriptFilePath = thisScriptfilechooser.selectedScriptResourcePath+"/"+$(this).text()
+			$('#selected-script-path-row input[name="selectedScriptFilePath"]').val(selectedPageScriptFilePath);
+			$('#selected-script-path-row input[name="resourceSuperType"]').val(thisScriptfilechooser.selectedScriptResourcePath);
+		});
+	}
+	Scriptfilechooser.prototype.setSelectedScriptResourcePath = function(selectedScriptResourcePath) {
+		this.selectedScriptResourcePath = selectedScriptResourcePath;
+	}
+
+	return Scriptfilechooser;
+}());
\ No newline at end of file

Modified: sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/tree/JSTreeAdapter.js
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/tree/JSTreeAdapter.js?rev=1768284&r1=1768283&r2=1768284&view=diff
==============================================================================
--- sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/tree/JSTreeAdapter.js (original)
+++ sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/tree/JSTreeAdapter.js Sat Nov  5 23:32:32 2016
@@ -52,30 +52,34 @@ $(document).ready(function() {
 	
 	// TO CREATE AN INSTANCE
 	// select the tree container using jQuery
-	$("#tree")
+	$(thisJSTreeAdapter.treeController.settings.treeAndPropsSelector)
 	.bind("loaded.jstree", function (event, data) {
-		var pathElements = treeController.getPathElements(settings.resourcePath);
-		
-		if (pathElements.length >= 1 && pathElements[0] != "") {
-			treeController.openElement($("#tree > ul > li[nodename=''] > ul"), pathElements);
+		if (thisJSTreeAdapter.treeController.settings.rootPath == null) {
+			var pathElements = treeController.getPathElements(settings.resourcePath);
+			if (pathElements.length >= 1 && pathElements[0] != "") {
+				treeController.openElement($(thisJSTreeAdapter.treeController.settings.treeAndPropsSelector+" > ul > li[nodename=''] > ul"), pathElements);
+			}
 		}
 		
 		// position the info-icon
-		$('#tree-info-icon').show();
-		$('#root i:first').before($('#tree-info-icon'));
+		if (thisJSTreeAdapter.treeController.settings.treeSelector != null) {
+			$(thisJSTreeAdapter.treeController.settings.treeRootElementSelector+' i:first').before($('.tree-info-icon:last').clone().show());
+			thisJSTreeAdapter.treeController.initTreeEvents();
+		}
 	})
 	// call `.jstree` with the options object
 	.jstree({
 		"core"      : {
 		    "check_callback" : true,
-		    multiple: true,
+		    multiple: thisJSTreeAdapter.treeController.settings.multipleSelection == null ? true : thisJSTreeAdapter.treeController.settings.multipleSelection,
 			animation: 600,
 			'dblclick_toggle': false,
 			'data' : {
 				'url' : function (liJson) {
 					// initial call for the root element
 					if (liJson.id === '#'){
-						return settings.contextPath+"/reseditor/.rootnodes.json";
+						var rootPath = thisJSTreeAdapter.treeController.settings.rootPath == null ? "/" : thisJSTreeAdapter.treeController.settings.rootPath;
+						return settings.contextPath+"/reseditor"+rootPath+".rootnodes.json";
 					} else {
 						// the li the user clicked on.
 						var li = $('#'+liJson.id);
@@ -159,12 +163,17 @@ $(document).ready(function() {
     }).on('keydown.jstree', 'a.jstree-anchor', function (e) {
     	treeController.configureKeyListeners(e);
     }).on('select_node.jstree', function (e, data) {
-    	//noop
-    	;
+    	if (thisJSTreeAdapter.treeController.settings.selectCallback != null) {
+    		thisJSTreeAdapter.treeController.settings.selectCallback(e, data);
+    	}
     }).on('after_open.jstree', function(e, data){
     	treeController.afterOpen(data.node);
     }).on('close_node.jstree', function(e, data){
     	treeController.beforeClose(data.node);
+    }).on('ready.jstree', function(e, data){
+    	if (thisJSTreeAdapter.treeController.settings.readyCallback != null) {
+    		thisJSTreeAdapter.treeController.settings.readyCallback(e, data);
+    	}
     });
 });
 

Modified: sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/tree/TreeController.js
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/tree/TreeController.js?rev=1768284&r1=1768283&r2=1768284&view=diff
==============================================================================
--- sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/tree/TreeController.js (original)
+++ sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor-static-content/js/tree/TreeController.js Sat Nov  5 23:32:32 2016
@@ -40,32 +40,38 @@ org.apache.sling.reseditor.TreeControlle
 		var addNodeControllerSettings = {};
 		this.addNodeController = new org.apache.sling.reseditor.AddNodeController(addNodeControllerSettings, mainController);
 		
-		$(document).ready(function() {
-			$("#tree").on("click", "#root",function(e) {
-				var target = $(e.target);
-				if (target.hasClass("open-icon")){
-					thatTreeController.openNodeTarget(e);
-				} else if (target.hasClass("add-icon")){
-					thatTreeController.openAddNodeDialog(target.parents("li"));
-				}else if (target.hasClass("remove-icon")){
-					thatTreeController.deleteSingleNode(target.parents("li"));
-				}
-			});
-			$("#tree").on("dblclick", "#root",function(e) {
-				var target = $(e.target);
-				if (target.hasClass("jstree-anchor") || target.hasClass("node-type")){
-					var id = target.parents("li:first").attr("id");
-					thatTreeController.openRenameNodeDialog(id);
-				}
-			});
-			$("#tree-info-icon").on("click", function(e, data) {
-				$('#sidebar .info-content-container').slideToggle();
+	};
+	
+	TreeController.prototype.initTreeEvents = function(root, paths) {
+		var thatTreeController = this;
+		$(thatTreeController.settings.treeAndPropsSelector).on("click", function(e) {
+			var target = $(e.target);
+			if (target.hasClass("open-icon")){
+				thatTreeController.openNodeTarget(e);
+			} else if (target.hasClass("add-icon")){
+				thatTreeController.openAddNodeDialog(target.parents("li"));
+			}else if (target.hasClass("remove-icon")){
+				thatTreeController.deleteSingleNode(target.parents("li"));
+			}
+		});
+		$(thatTreeController.settings.treeAndPropsSelector).on("dblclick", thatTreeController.settings.treeRootElementSelector,function(e) {
+			var target = $(e.target);
+			if (target.hasClass("jstree-anchor") || target.hasClass("node-type")){
+				var id = target.parents("li:first").attr("id");
+				thatTreeController.openRenameNodeDialog(id);
+			}
+		});
+		if (thatTreeController.settings.treeSelector != null) {
+			$(thatTreeController.settings.treeSelector+" .tree-info-icon").on("click", function(e, data) {
+				console.log($(thatTreeController.settings.treeSelector+' .info-content-container').parentsUntil("body"));
+				$(thatTreeController.settings.treeSelector+' .info-content-container').slideToggle();
 			});
-			$("#sidebar .info-content-container .close").on("click", function(e, data) {
-				$('#sidebar .info-content-container').slideToggle();
+			$(thatTreeController.settings.treeSelector+" .info-content-container .close").on("click", function(e, data) {
+				console.log($(thatTreeController.settings.treeSelector+' .info-content-container').parentsUntil("body"));
+				$(thatTreeController.settings.treeSelector+' .info-content-container').slideToggle();
 			});
-		});
-	};
+		}
+	}
 
 	TreeController.prototype.configureKeyListeners = function(e) {
     	// see http://www.javascripter.net/faq/keycodes.htm
@@ -129,7 +135,7 @@ org.apache.sling.reseditor.TreeControlle
 
 	TreeController.prototype.openRenameNodeDialog = function(id) {
 		var liElement = $('#'+id);
-		$("#tree").jstree("edit", $('#'+id), this.mainController.decodeFromHTML(liElement.attr("nodename")));
+		$(this.settings.treeAndPropsSelector).jstree("edit", $('#'+id), this.mainController.decodeFromHTML(liElement.attr("nodename")));
 	}
 	
 	TreeController.prototype.renameNode = function(e, data) {
@@ -176,7 +182,7 @@ org.apache.sling.reseditor.TreeControlle
 	}
 
 	TreeController.prototype.getPathFromLi = function(li){
-		var path = $(li).parentsUntil(".root").andSelf().map(
+		var path = $(li).parentsUntil(this.settings.treeAndPropsSelector).andSelf().map(
 				function() {
 					return this.tagName == "LI"
 							? $(this).attr("nodename") 
@@ -199,12 +205,12 @@ org.apache.sling.reseditor.TreeControlle
 		if (pathElementLi.length === 0){
 			alert("Couldn't find "+pathElementName+" under the path "+this.getPathFromLi(root.parent()));
 		} else {
-			$('#tree').jstree('open_node', pathElementLi,
+			$(this.settings.treeAndPropsSelector).jstree('open_node', pathElementLi,
 					function(){
 						if (paths.length>0){
 							thisTreeController.openElement($("#"+pathElementLi.attr('id')).children("ul"), paths);
 						} else  {
-							$('#tree').jstree('select_node', pathElementLi.attr('id'), 'true');
+							$(thisTreeController.settings.treeAndPropsSelector).jstree('select_node', pathElementLi.attr('id'), 'true');
 					        var target = $('#'+pathElementLi.attr('id')+' a:first');
 					        target.focus();
 						}
@@ -217,13 +223,14 @@ org.apache.sling.reseditor.TreeControlle
 		var path = this.getPathFromLi(li);
 		path = this.mainController.decodeFromHTML(path);
 		path = this.mainController.encodeURL(path);
-		return this.settings.contextPath+"/reseditor"+path+extension;
+		var rootPath = this.settings.rootPath == null ? "" : this.settings.rootPath ; 
+		return this.settings.contextPath+"/reseditor"+rootPath+path+extension;
 	}
 
 	TreeController.prototype.deleteNodes = function() {
 		var thatTreeController = this;
 		var lastDeletedLI;
-		var selectedIds = $("#tree").jstree('get_selected');
+		var selectedIds = $(this.settings.treeAndPropsSelector).jstree('get_selected');
 		var firstId = selectedIds[0];
 		var parentLi = $('#'+firstId).parents('li');
 		var parentPath = this.getURLEncodedPathFromLi(parentLi);
@@ -245,7 +252,7 @@ org.apache.sling.reseditor.TreeControlle
 			        	  type: 'POST',
 						  url: parentPath,
 			        	  success: function(server_data) {
-							var tree = $('#tree').jstree(true);
+							var tree = $(thatTreeController.settings.treeAndPropsSelector).jstree(true);
 							for (var i=0; i<selectedIds.length; i++){
 								var id = selectedIds[i];
 								tree.delete_node(id);
@@ -280,7 +287,7 @@ org.apache.sling.reseditor.TreeControlle
 					  url: encodedResourcePathToDelete,
 		        	  success: function(server_data) {
 		        		var id = li.attr("id");
-						var tree = $('#tree').jstree(true);
+						var tree = $(thatTreeController.settings.treeAndPropsSelector).jstree(true);
 						tree.delete_node(id);
 		      		  },
 		        	  error: function(errorJson) {

Modified: sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor/html.jsp
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor/html.jsp?rev=1768284&r1=1768283&r2=1768284&view=diff
==============================================================================
--- sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor/html.jsp (original)
+++ sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor/html.jsp Sat Nov  5 23:32:32 2016
@@ -64,6 +64,9 @@ original
 <script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/js/LoginController.js"></script>
 <script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/js/MainController.js"></script>
 
+
+<script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/js/scriptpathchooser/scriptfilechooser.js"></script>
+
 <!-- 
 <script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/generated/3rd_party/js/jquery.scrollTo-min.js"></script>
 <script type="text/javascript" src="<%= request.getContextPath() %>/libs/sling/resource-editor-static-content/generated/3rd_party/js/urlEncode.js"></script>
@@ -99,7 +102,10 @@ var mainControllerSettings = {
 var mainController = new org.apache.sling.reseditor.MainController(mainControllerSettings, ntManager);
 
 var treeControllerSettings = {
-		contextPath: "<%= request.getContextPath() %>"
+		contextPath: "<%= request.getContextPath() %>",
+		treeAndPropsSelector: "#tree-and-props",
+		treeSelector: "#tree",
+		treeRootElementSelector: "#tree-and-props .root-element"
 };
 var treeController = new org.apache.sling.reseditor.TreeController(treeControllerSettings, mainController);
 
@@ -193,7 +199,7 @@ new org.apache.sling.reseditor.PropertyC
 		</div>
 		<div id="main-row" class="row">
 			<div id="sidebar-col" class="col-sm-4">
-				<div id="sidebar" class="plate">
+				<div id="tree" class="plate">
 					<div class="ie9filter-plate-div">
 						<div style="display:none;" class="info-content-container" >
 							<div class="well well-sm info-content">
@@ -212,7 +218,7 @@ new org.apache.sling.reseditor.PropertyC
 						  		</ul>
 							</div>
 					  	</div>	
-						<div id="tree" class="root" ></div>
+						<div id="tree-and-props" class="root tree-and-props" ></div>
 					</div>
 				</div>
 			</div>
@@ -226,7 +232,7 @@ new org.apache.sling.reseditor.PropertyC
 			</div>
 		</div>
 	</div>
-	<span id="tree-info-icon" class="info-icon info-icon-lightgray pull-right clearfix" style="display:none;"></span>
+	<span class="tree-info-icon info-icon info-icon-lightgray pull-right clearfix" style="display:none;"></span>
 	<!-- Add node dialog -->
 	<div class="modal fade" id="addNodeDialog" tabindex="-1" role="dialog" aria-labelledby="addNodeDialogLabel" aria-hidden="true">
 	  <div class="modal-dialog modal-sm">

Modified: sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor/node-content.jsp
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor/node-content.jsp?rev=1768284&r1=1768283&r2=1768284&view=diff
==============================================================================
--- sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor/node-content.jsp (original)
+++ sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor/node-content.jsp Sat Nov  5 23:32:32 2016
@@ -8,21 +8,145 @@
 <sling:defineObjects />
 			<div id="node-content" class="col-sm-8">
 				<c:set var="scriptResource" scope="request" value="${sling:getResource(resourceResolver,sling:getResource(resourceResolver,resource.path).resourceType)}"/>
-				<% Resource theResource = (Resource) request.getAttribute("scriptResource");%>
-				<c:set var="isWebPage" value="<%=theResource != null ? theResource.isResourceType("sling/web-page") : false %>"/>
+				<% 
+				Resource scriptResourceReqAttr = (Resource) request.getAttribute("scriptResource");
+				boolean hasScriptResource = scriptResourceReqAttr != null;
+				%>
+				<%--
+				Has to inherit from sling/resource-editor/node-content and has to have a "name" string property
+				When should it be displayed as active?
+				 --%>
+				<c:set var="isWebPage" value="<%=hasScriptResource ? scriptResourceReqAttr.isResourceType("sling/web-page") : false %>"/>
 			    <c:if test="${isWebPage}">
 					<ul id="content-tabs" class="nav nav-pills" role="tablist">
 					    <li role="presentation" class="active"><a href="#page-editor" aria-controls="page-editor" role="tab" data-toggle="pill">Web Page Editor</a></li>
 					    <li role="presentation"><a href="#page-preview" aria-controls="page-preview" role="tab" data-toggle="pill">Page Preview</a></li>
+					    <li role="presentation"><a href="#resource-type-editor" aria-controls="resource-type-editor" role="tab" data-toggle="pill">Resource Type Editor</a></li>
 					    <li role="presentation"><a href="#properties" aria-controls="properties" role="tab" data-toggle="pill">Properties</a></li>
 					</ul>
 			    </c:if>
+			    <c:if test="${!isWebPage}">
+					<ul id="content-tabs" class="nav nav-pills" role="tablist">
+					    <li role="presentation" class="active"><a href="#properties" aria-controls="properties" role="tab" data-toggle="pill">Properties</a></li>
+					    <li role="presentation"><a href="#resource-type-editor" aria-controls="resource-type-editor" role="tab" data-toggle="pill">Resource Type Editor</a></li>
+					</ul>
+				</c:if>
 				<div id="outer_content" class="plate">
 					<div class="ie9filter-plate-div">
 						<div id="inner_content_margin" class="full-height">
 							<div class="row full-height" >
 								<div class="col-sm-12 full-height" >
 									<div class="tab-content full-height" >
+									<%-- TODO: move the resource-type-editor to the Sitebuilder project --%>
+									    <div style="color: #c0c0c0;" role="tabpanel" class="tab-pane" id="resource-type-editor">
+											<script type="text/javascript">
+											var superTypeTreeController = null;
+											var selectedScriptResourcePath = "";
+											var scriptFileChooser = null;
+											function selectCallback(e, data) {
+												// https://www.jstree.com/api/#/?q=.jstree%20Event&f=select_node.jstree
+												var id = data.selected[0];
+												var li = $('#'+id);
+												var selectedPath = superTypeTreeController.get_uri_from_li(li,".json");
+												
+												scriptFileChooser.setSelectedScriptResourcePath($('#'+id+" .node-type:first").text());
+												
+												$.getJSON(selectedPath).done(function(propertyJson) {
+														$('#page-script-chooser-row .files').empty();
+														for (var key in propertyJson) { 
+															$('#page-script-chooser-row .files').append("<tr><td>"+key+"</td></tr>");
+														}
+													}).fail(function(data) {
+														superTypeTreeController.mainController.displayAlertHtml(data.responseText);
+													});
+											};
+											var superTypeTreeControllerSettings = {
+													contextPath : "<%= request.getContextPath() %>",
+													treeAndPropsSelector: "#resource-super-type-tree-and-props",
+													treeSelector: null,
+													treeRootElementSelector: "#resource-super-type-tree-and-props .root-element",
+													rootPath:"/apps/inheritedresources",
+													multipleSelection: false,
+													selectCallback: selectCallback,
+													readyCallback: pageScriptChooserReady
+											};
+											superTypeTreeController = new org.apache.sling.reseditor.TreeController(superTypeTreeControllerSettings, mainController);
+
+											function pageScriptChooserReady(){
+												scriptFileChooser = new org.apache.sling.sitebuilder.Scriptfilechooser(selectedScriptResourcePath); 
+
+												// TODO: Use this page as an editor for the resource type.
+// 												var pathElements = superTypeTreeController.getPathElements("/com/lux-car-rental");
+// 												if (pathElements.length >= 1 && pathElements[0] != "") {
+// 													superTypeTreeController.openElement($(superTypeTreeControllerSettings.treeAndPropsSelector+" .root-element > ul"), pathElements);
+// 												}
+											};
+											
+											var superTypesTreeAdapterSettings = {
+													resourcePath : "${resource.path}",
+													requestURI: "${pageContext.request.requestURI}",
+													contextPath: "<%= request.getContextPath() %>",
+													resolutionPathInfo: "${resource.resourceMetadata['sling.resolutionPathInfo']}"
+											};
+											new org.apache.sling.reseditor.JSTreeAdapter(superTypesTreeAdapterSettings, superTypeTreeController, mainController);
+
+											</script>	
+											<div class="row">
+												<div id="sidebar-col" class="col-sm-12">
+													<h5>Script to copy and overwrite</h5>
+												</div>
+											</div>
+											<div id="page-script-chooser-row" class="row">
+												<div id="sidebar-col" class="col-sm-8">
+													<div id="resource-super-type-tree" class="">
+														<div class="ie9filter-plate-div">
+															<div id="resource-super-type-tree-and-props" class="root tree-and-props" ></div>
+														</div>
+													</div>
+												</div>
+												<div class="col-sm-4">
+													<div class="file-props-container">
+														<table class="table table-hover">
+															<thead>
+																<tr>
+																	<th>Filename:</th>
+																</tr>
+															</thead>
+															<tbody class="files">
+															</tbody>
+														</table>
+													</div>
+												</div>
+											</div>
+											<div id="selected-script-path-row" class="row">
+												<form method="post" action="<%= request.getRequestURL() %>" enctype="multipart/form-data">
+													<div class="col-sm-12">
+														<div class="form-group">
+														    <label for="resourceSuperType">Resource super type:</label>
+														    <input type="text" class="form-control" id="resourceSuperType" name="resourceSuperType" readonly>
+														</div>
+														<div class="form-group">
+														    <label for="resourceType">Resource Type:</label>
+														    <input type="text" class="form-control" id="resourceType" name="resourceType" >
+														</div>
+														<div class="form-group">
+														    <label for="selectedScriptFilePath">Resource super type script to overwrite:</label>
+														    <input type="text" class="form-control" id="selectedScriptFilePath" name="selectedScriptFilePath" readonly>
+														</div>
+														<div>'Create new script' does the following:
+															<ol>
+																<li>Creates the specified resource type</li>
+																<li>Assigns the specified resource super type to the resource type</li>
+																<li>Copies the specified script to the resource type to overwrite it from the resource super type</li>
+															</ol> 
+														</div>
+														<input type="hidden" name=":operation" value="edit-resource-type">
+														<input type="hidden" name="_charset_" value="utf-8">
+														<button type="submit" class="btn btn-default">Create new script</button>
+													</div>
+												</form>
+											</div>
+										</div>
 									    <div role="tabpanel" class="tab-pane ${isWebPage ? 'active' : ''} full-height" id="page-editor">
 									    	<a href="/pageeditor${resource.path}.main.html" target="_blank">
 											  	<span id="open-new-window" class="glyphicon glyphicon-share-alt" aria-hidden="true"></span>
@@ -39,7 +163,7 @@
 									    	</a>
 									    	<iframe id="iframe" src="${resource.path}.html" allowtransparency="true" frameborder="0" height="100%" width="100%" style="height: 500px;background:none transparent;-webkit-border-radius:7px;-moz-border-radius: 7px;border-radius: 7px; border: 3px solid black"></iframe>
 										</div>
-									    <div role="tabpanel" class="tab-pane ${!isWebPage ? 'active' : ''}" id="properties">
+									    <div role="tabpanel" class="tab-pane ${!isWebPage && !showPageChooser ? 'active' : ''}" id="properties">
 											<div style="display: none;" class="info-content-container" >
 												<div class="well well-sm info-content">
 													<button type="button" class="close"><span aria-hidden="true">&times;</span><span class="sr-only">Close</span></button>

Modified: sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor/rootnodes.json.jsp
URL: http://svn.apache.org/viewvc/sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor/rootnodes.json.jsp?rev=1768284&r1=1768283&r2=1768284&view=diff
==============================================================================
--- sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor/rootnodes.json.jsp (original)
+++ sling/trunk/contrib/explorers/resourceeditor/src/main/resources/SLING-INF/libs/sling/resource-editor/rootnodes.json.jsp Sat Nov  5 23:32:32 2016
@@ -34,7 +34,7 @@
 	"id" : "root",
 	"state" : {"opened":true, "disabled": false, "selected": false},
 	"text"	: "<i class=\"jstree-icon node-icon open-icon\"></i><i class=\"jstree-icon node-icon add-icon\"></i> /",
-	"li_attr" :{ "nodename" : "${currentNode.name}", "nodetype" :"${currentNode.primaryNodeType.name}" },
+	"li_attr" :{ "nodename" : "${currentNode.name}", "nodetype" :"${currentNode.primaryNodeType.name}", "class": "root-element"},
 	"a_attr" :{ "href" : "<%= request.getContextPath() %>/reseditor/.html" },
 	"children" :
 		<%@ include file="nodes.json.incl.jsp" %>