skos_browser/commit

ADD more flexible formatting of columnbrowser as a whole and of individual concepts

authorMichiel Hildebrand
Wed Nov 28 14:17:52 2012 +0100
committerMichiel Hildebrand
Wed Nov 28 14:17:52 2012 +0100
commit3461dab23ca7cffcfada163cae63378ea8001cf6
treec46a28c2147c19653a225e396337512743ff2427
parente1a07904241535d1eb2fea58c320cdd9837fd4f8
Diff style: patch stat
diff --git a/api/skos_concepts.pl b/api/skos_concepts.pl
index f241bde..7205fc7 100644
--- a/api/skos_concepts.pl
+++ b/api/skos_concepts.pl
@@ -6,7 +6,6 @@
 :- use_module(library(http/html_write)).
 :- use_module(library(http/http_json)).
 :- use_module(library(http/json)).
-:- use_module(library(http/json_convert)).
 :- use_module(library(semweb/rdf_db)).
 :- use_module(library(semweb/rdf_label)).
 
@@ -14,6 +13,10 @@
 :- http_handler(skosapi(conceptschemes), http_conceptschemes, []).
 :- http_handler(skosapi(concepts), http_concepts, []).
 
+:- multifile
+	conceptscheme_property/3,
+	concept_property/3.
+
 %%	http_concept_schemes(+Request)
 %
 %       API handler to fetch concept schemes
@@ -30,20 +33,17 @@ http_conceptschemes(Request) :-
 				[optional(true),
 				 description('keyword query to filter the results by')])
 			]),
-	ConceptScheme = concept(Concept, Label, true),
-	findall(ConceptScheme, concept_scheme(Query, Concept, Label), Cs),
-	length(Cs, Total),
-	list_offset(Cs, Offset, OffsetResults),
+	findall(Label-Concept, concept_scheme(Query, Concept, Label), Concepts),
+	sort(Concepts, Sorted),
+	length(Sorted, Total),
+	list_offset(Sorted, Offset, OffsetResults),
 	list_limit(OffsetResults, Limit, LimitResults, _),
-	prolog_to_json(LimitResults, JSONResults),
+	maplist(conceptscheme_result, LimitResults, JSONResults),
 	reply_json(json([offset=Offset,
 			 limit=Limit,
 			 totalNumberOfResults=Total,
 			 results=JSONResults])).
 
-:- json_object
-	concept(id:atom, label:atom, hasNext:boolean).
-
 concept_scheme(Query, C, Label) :-
 	var(Query),
 	!,
@@ -77,41 +77,39 @@ http_concepts(Request) :-
 				[optional(true),
 				 description('keyword query to filter the results by')])
 			]),
-	C = concept(Concept, Label, HasNarrower),
-	findall(C, concept(Type, Parent, Query, Concept, Label, HasNarrower), Cs0),
-	sort(Cs0, Cs),
-	term_sort_by_arg(Cs, 2, Sorted),
+
+	findall(Label-Concept, concept_of(Type, Parent, Query, Concept, Label), Concepts),
+	sort(Concepts, Sorted),
 	length(Sorted, Total),
 	list_offset(Sorted, Offset, OffsetResults),
 	list_limit(OffsetResults, Limit, LimitResults, _),
-	prolog_to_json(LimitResults, JSONResults),
+	maplist(concept_result, LimitResults, JSONResults),
 	reply_json(json([parent=Parent,
 			 offset=Offset,
 			 limit=Limit,
 			 totalNumberOfResults=Total,
 			 results=JSONResults])).
 
-concept(Type, Parent, Query, Concept, Label, HasNarrower) :-
+concept_of(Type, Parent, Query, Concept, Label) :-
 	var(Query),
 	!,
-	concept_(Type, Parent, Concept),
-	has_narrower(Concept, HasNarrower),
+	concept(Type, Parent, Concept),
 	rdf_display_label(Concept, Label).
-concept(Type, Parent, Query, Concept, Label, HasNarrower) :-
-	concept_(Type, Parent, Concept),
+
+concept_of(Type, Parent, Query, Concept, Label) :-
+	concept(Type, Parent, Concept),
 	once(label_prefix(Query, Concept, Lit)),
-	literal_text(Lit, Label),
-	has_narrower(Concept, HasNarrower).
+	literal_text(Lit, Label).
 
-concept_(inscheme, ConceptScheme, Concept) :- !,
+concept(inscheme, ConceptScheme, Concept) :- !,
 	inscheme(ConceptScheme, Concept).
-concept_(topconcept, ConceptScheme, Concept) :- !,
+concept(topconcept, ConceptScheme, Concept) :- !,
 	top_concept(ConceptScheme, Concept).
-concept_(child, Parent, Concept) :-
+concept(child, Parent, Concept) :-
 	narrower_concept(Parent, Concept).
-concept_(descendant, Parent, Concept) :-
+concept(descendant, Parent, Concept) :-
 	descendant(Parent, Concept).
-concept_(related, Parent, Concept) :-
+concept(related, Parent, Concept) :-
 	related_concept(Parent, Concept).
 
 %%	inscheme(+ConceptScheme, -Concept)
@@ -164,19 +162,46 @@ related_concept(Concept, Related) :-
 	rdf_has(Related, skos:related, Concept),
 	\+ rdf_has(Concept, skos:related, Related).
 
+
+
+
+		 /*******************************
+		 *	  Concept JSON		*
+		 *******************************/
+
+%%	conceptscheme_result(+Pair:label-uri, -JSON_Object)
+
+conceptscheme_result(Label-URI, json(JSON)) :-
+	JSON = [id=URI, label=Label, hasNext=true|More],
+	findall(Key= Value, conceptscheme_result_property(Key, URI, Value), More).
+
+conceptscheme_result_property(Key, URI, Value) :-
+	catch(cliopatria:conceptscheme_property(Key, URI, Value), _, fail).
+
+%%	concept_result(+Pair:label-uri, -JSON_Object)
+
+concept_result(Label-URI, json(JSON)) :-
+	JSON = [id=URI, label=Label|More],
+	findall(Key= Value, concept_result_property(Key, URI, Value), More).
+
+concept_result_property(hasNext, URI, Boolean) :-
+	has_narrower(URI, Boolean).
+
+concept_result_property(Key, URI, Value) :-
+	catch(cliopatria:concept_property(Key, URI, Value), _, fail).
+
+
 %%	has_narrower(+Concept, -Boolean)
 %
 %	Boolean is true when concept has a skos:narrower concept.
 
-has_narrower(Concept, true) :-
-	rdf_has(Concept, skos:narrower, _),
-	!.
-has_narrower(Concept, true) :-
+has_narrower(Concept, @true) :-
 	rdf_has(_, skos:broader, Concept),
 	!.
-has_narrower(_, false).
-
-
+has_narrower(Concept, @true) :-
+	rdf_has(Concept, skos:narrower, _),
+	!.
+has_narrower(_, @false).
 
 
 		 /*******************************
diff --git a/applications/skos_browser.pl b/applications/skos_browser.pl
index f3e57c0..94ec4f9 100644
--- a/applications/skos_browser.pl
+++ b/applications/skos_browser.pl
@@ -63,7 +63,7 @@ skos_api_datasource(DS) -->
 	yui3_plug(DS,
 		  'Y.Plugin.DataSourceJSONSchema',
 		  {schema: {resultListLocator: results,
-			    resultFields: [id, label, hasNext, matches, scheme],
+			    resultFields: [id, label, hasNext, count, class, matches, scheme],
 			    metaFields: {totalNumberOfResults:totalNumberOfResults}
 			   }
 		  }),
diff --git a/web/css/columnbrowser.css b/web/css/columnbrowser.css
index 24eba36..9b24fd1 100644
--- a/web/css/columnbrowser.css
+++ b/web/css/columnbrowser.css
@@ -2,7 +2,7 @@
 	border-width: 1px;
 	border-style: solid;
 	border-color: #CCC;
-	
+	height: 300px;
 	font-size: 12px;
 }
 .yui3-columnbrowser .hidden {
@@ -12,10 +12,12 @@
 	padding-top: 20px;
 	background: url(loading.gif) no-repeat center center
 }
+.yui3-columnbrowser-content {
+	height: 100%;
+}
 .yui3-columnbrowser .columns-box {
-	height: 300px;
+	height: 100%;
 	overflow-x: auto;
-	overflow-y: hidden;
 }
 .yui3-columnbrowser .columns-box.noscroll {
 	overflow-x: hidden;
@@ -30,6 +32,9 @@
 	overflow-x: auto;
 	overflow-y: scroll;
 }
+.yui3-columnbrowser .yui3-resourcelist-hidden {
+	display: none;
+}
 .yui3-columnbrowser .yui3-resourcelist-content ul {
 	padding: 2px 0;
 	margin: 0;
@@ -42,11 +47,22 @@
 .yui3-columnbrowser .resourcelist-item .more {
 	float: right;
 }
+.yui3-columnbrowser .resourcelist-item .count {
+	float: right;
+	background-color: #98A9C6;
+	color: white;
+	padding: 2px;
+	border-radius: 4px;
+}
 .yui3-columnbrowser .resourcelist-item.selected {
-	background-color: #DDD;
+	background-color: #EEE;
+}
+.yui3-columnbrowser .resourcelist-item.selected .count {
+	background-color: #FFF;
+	color: #98A9C6;
 }
 .yui3-columnbrowser .yui3-resourcelist.selected .resourcelist-item.selected {
-	background-color: #3875D7;
+	background-color: #98A9C6;
 	color: #FFF;
 }
 .yui3-columnbrowser .pagination {
diff --git a/web/js/columnbrowser.js b/web/js/columnbrowser.js
index ea5efbf..3ee06b5 100644
--- a/web/js/columnbrowser.js
+++ b/web/js/columnbrowser.js
@@ -36,6 +36,10 @@ YUI.add('columnbrowser', function(Y) {
 			value: 200,
 			validator: Lang.isNumber
 		},
+		searchEnabled: {
+			value: true,
+			validator: Lang.isBoolean
+		},
 		maxNumberItems: {
 			value: 100,
 			validator: Lang.isNumber
@@ -103,9 +107,9 @@ YUI.add('columnbrowser', function(Y) {
 							list.get("boundingBox").removeClass("selected");
 						}
 						if(i<=activeIndex) {
-							list.set("visible", true);
+							list.show();
 						} else {
-							list.set("visible", false);
+							list.hide();
 						}
 					}
 				}
@@ -199,6 +203,7 @@ YUI.add('columnbrowser', function(Y) {
 	
 			var cfg = {
 				width: this.get("columnWidth"),
+				searchEnabled: this.get("searchEnabled"),
 				maxNumberItems: this.get("maxNumberItems"),
 				minQueryLength: this.get("minQueryLength"),
 				queryDelay: this.get("queryDelay"),
@@ -238,17 +243,6 @@ YUI.add('columnbrowser', function(Y) {
 			
 			content.setStyle("width", width+"px");
 			content.get("parentNode").removeClass("noscroll");
-			this._updateColumnsSize();
-		},
-		
-		_updateColumnsSize : function() {
-			var columns = this.get("columns"),
-				height = this.columnsNode.get("offsetHeight");
-			for (var i=0; i < columns.length; i++) {
-				if(columns[i].list) {
-					columns[i].list.set("height", height+"px");
-				}
-			}
 		}
 				
 	}); 
diff --git a/web/js/resourcelist.js b/web/js/resourcelist.js
index ba6c217..d5d4ad0 100644
--- a/web/js/resourcelist.js
+++ b/web/js/resourcelist.js
@@ -37,6 +37,10 @@ YUI.add('resourcelist', function(Y) {
 			value: 0.3,
 			validator: Lang.isNumber
 		},
+		searchEnabled: {
+			value: true,
+			validator: Lang.isBoolean
+		},
 		page: {
 			value: 0,
 			validator: Lang.isNumber
@@ -176,10 +180,12 @@ YUI.add('resourcelist', function(Y) {
 		},
 		
 		_renderSearch : function() {
-			var search = this.get("contentBox")
-				.appendChild(Node.create('<div class="search"></div>'))
-				.appendChild(Node.create('<input type="text" />'));
-			search.on("valuechange", this._valueChangeHandler, this);	
+			if(this.get("searchEnabled")) {
+				var search = this.get("contentBox")
+					.appendChild(Node.create('<div class="search"></div>'))
+					.appendChild(Node.create('<input type="text" />'));
+				search.on("valuechange", this._valueChangeHandler, this);	
+			}
 		},
 		
 		/**
@@ -247,11 +253,13 @@ YUI.add('resourcelist', function(Y) {
 			var i = 0;	
 			for (i; i < numberItems; i++) {
 				var oResource = resources[i],
+					cssClass = oResource["class"]||'',
 					HTML = this.formatItem(oResource),
 					oItem = listItems[i],
-					elItem = oItem.el;
+					elItem = oItem.el
 
 				oItem.resource = oResource;
+				elItem.addClass(cssClass);
 				elItem.set("innerHTML", HTML);
 				elItem.setStyle("display", "block");
 			}
@@ -260,6 +268,7 @@ YUI.add('resourcelist', function(Y) {
 			for (i; i < listItems.length; i++) {
 				var oItem = listItems[i],
 					elItem = oItem.el;
+				elItem.set('className',ResourceList.ITEM_CLASS); // reset all CSS classes
 				if(elItem.getStyle("display")=="none") {
 					return;
 				} else {
@@ -422,11 +431,18 @@ YUI.add('resourcelist', function(Y) {
 		},
 		
 		formatItem : function(oResource) {
-		        var label = oResource["label"],
-		            uri   = oResource["id"],
-		            value = (label&&!Y.Lang.isObject(label)) ? label : uri;
+		        var label = oResource.label,
+		            uri   = oResource.id,
+		            value = (label&&!Y.Lang.isObject(label)) ? label : uri,
+					hasNext = oResource.hasNext,
+					count = oResource.count;
+					 
 			var HTML = "";
-			if(oResource.hasNext) { HTML += "<div class='more'>&gt;</div>"; }
+			if(count) {
+				HTML += "<div class='more count'>"+count+"</div>";
+			} else if(hasNext) {	
+				HTML += "<div class='more'>&gt;</div>";
+			}
 			HTML += "<div class='resourcelist-item-value' title='"+uri+"'>"+value+"</div>";
 			return HTML;
 		}