skos_browser/commit
ADD more flexible formatting of columnbrowser as a whole and of individual concepts
author | Michiel Hildebrand |
---|---|
Wed Nov 28 14:17:52 2012 +0100 | |
committer | Michiel Hildebrand |
Wed Nov 28 14:17:52 2012 +0100 | |
commit | 3461dab23ca7cffcfada163cae63378ea8001cf6 |
tree | c46a28c2147c19653a225e396337512743ff2427 |
parent | e1a07904241535d1eb2fea58c320cdd9837fd4f8 |
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'>></div>"; } + if(count) { + HTML += "<div class='more count'>"+count+"</div>"; + } else if(hasNext) { + HTML += "<div class='more'>></div>"; + } HTML += "<div class='resourcelist-item-value' title='"+uri+"'>"+value+"</div>"; return HTML; }