iqvoc 4.0.2 → 4.0.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (75) hide show
  1. data/CHANGELOG.md +6 -0
  2. data/Gemfile.lock +43 -47
  3. data/app/assets/javascripts/framework.js +1 -1
  4. data/app/assets/javascripts/iqvoc/extract_concepts.js +19 -0
  5. data/app/assets/javascripts/iqvoc/iqvoc.js +8 -12
  6. data/app/assets/javascripts/iqvoc/manifest.js +3 -0
  7. data/app/assets/javascripts/iqvoc/onebox.js +44 -0
  8. data/app/assets/javascripts/iqvoc/quicksearch.js +41 -0
  9. data/app/assets/stylesheets/framework.css +1 -1
  10. data/app/assets/stylesheets/iqvoc/bootstrap_extensions.css.scss +0 -7
  11. data/app/assets/stylesheets/iqvoc/components.css.scss +27 -1
  12. data/app/assets/stylesheets/iqvoc/manifest.css +0 -1
  13. data/app/controllers/application_controller.rb +1 -1
  14. data/app/controllers/concepts/alphabetical_controller.rb +5 -1
  15. data/app/controllers/concepts/untranslated_controller.rb +1 -1
  16. data/app/controllers/concepts_controller.rb +2 -0
  17. data/app/controllers/frontpage_controller.rb +23 -0
  18. data/app/controllers/instance_configuration_controller.rb +10 -2
  19. data/app/controllers/pages_controller.rb +21 -0
  20. data/app/controllers/rdf_controller.rb +0 -21
  21. data/app/helpers/concepts_helper.rb +1 -1
  22. data/app/helpers/navigation_helper.rb +0 -10
  23. data/app/helpers/rdf_helper.rb +1 -1
  24. data/app/models/concept/base.rb +2 -2
  25. data/app/models/concept/skos/base.rb +1 -1
  26. data/app/models/label/base.rb +5 -2
  27. data/app/models/labeling/base.rb +2 -2
  28. data/app/models/labeling/skos/base.rb +1 -1
  29. data/app/models/note/base.rb +0 -6
  30. data/app/models/note/skos/base.rb +20 -8
  31. data/app/views/concepts/alphabetical/index.html.erb +2 -2
  32. data/app/views/{rdf/show_concept.iqrdf → concepts/show.iqrdf} +1 -1
  33. data/app/views/concepts/show_published.html.erb +0 -1
  34. data/app/views/concepts/show_unpublished.html.erb +0 -1
  35. data/app/views/concepts/sidebars/_plural.html.erb +3 -3
  36. data/app/views/concepts/sidebars/_singular.html.erb +4 -5
  37. data/app/views/concepts/untranslated/index.html.erb +1 -1
  38. data/app/views/frontpage/index.html.erb +8 -0
  39. data/app/views/instance_configuration/index.html.erb +8 -5
  40. data/app/views/layouts/_navigation.html.erb +10 -8
  41. data/app/views/layouts/application.html.erb +3 -1
  42. data/app/views/pages/help.html.erb +75 -0
  43. data/app/views/partials/labeling/skos/_base.html.erb +2 -1
  44. data/config/initializers/language.rb +1 -1
  45. data/config/locales/de.yml +8 -0
  46. data/config/locales/en.yml +8 -0
  47. data/config/routes.rb +8 -6
  48. data/lib/generators/app/template.rb +1 -1
  49. data/lib/iqvoc/ability.rb +3 -0
  50. data/lib/iqvoc/configuration/collection.rb +2 -2
  51. data/lib/iqvoc/configuration/concept.rb +1 -1
  52. data/lib/iqvoc/configuration/core.rb +6 -4
  53. data/lib/iqvoc/configuration/label.rb +2 -2
  54. data/lib/iqvoc/controller_extensions.rb +1 -1
  55. data/lib/iqvoc/environments/development.rb +6 -0
  56. data/lib/iqvoc/environments/production.rb +6 -0
  57. data/lib/iqvoc/environments/test.rb +6 -0
  58. data/lib/iqvoc/instance_configuration.rb +3 -2
  59. data/lib/iqvoc/skos_importer.rb +23 -0
  60. data/lib/iqvoc/version.rb +1 -1
  61. data/lib/tasks/importer.rake +2 -2
  62. data/test/integration/alphabetical_test.rb +2 -2
  63. data/test/integration/browse_concepts_and_labels_test.rb +4 -4
  64. data/test/integration/untranslated_test.rb +3 -3
  65. data/test/unit/hygiene_test.rb +4 -0
  66. data/test/unit/instance_configuration_test.rb +17 -1
  67. data/test/unit/skos_import_test.rb +19 -0
  68. data/vendor/assets/images/jquery-ui/ui-icons_469bdd_256x240.png +0 -0
  69. data/vendor/assets/javascripts/{jquery-ui-1.8.20.custom.js → jquery-ui-1.8.23.custom.js} +124 -69
  70. data/vendor/assets/stylesheets/{jquery-ui-1.8.20.custom.css → jquery-ui-1.8.23.custom.css} +5 -7
  71. metadata +34 -31
  72. data/app/assets/javascripts/iqvoc/visualization.js +0 -321
  73. data/app/views/concepts/_visualization.html.erb +0 -11
  74. data/vendor/assets/javascripts/excanvas.js +0 -35
  75. data/vendor/assets/javascripts/jit_rgraph.js +0 -153
data/CHANGELOG.md CHANGED
@@ -1,3 +1,9 @@
1
+ ## 4.0.3
2
+
3
+ * New frontpage with quick search
4
+ * SKOS importer now supports blank nodes
5
+ * Bugfixes
6
+
1
7
  ## 4.0.2
2
8
 
3
9
  * Support for collections in SKOS importer (@fgimenez)
data/Gemfile.lock CHANGED
@@ -36,18 +36,16 @@ GEM
36
36
  activesupport (3.2.6)
37
37
  i18n (~> 0.6)
38
38
  multi_json (~> 1.0)
39
- addressable (2.2.8)
40
- ansi (1.4.2)
39
+ addressable (2.3.2)
40
+ ansi (1.4.3)
41
41
  arel (3.0.2)
42
- authlogic (3.1.2)
42
+ authlogic (3.1.3)
43
43
  activerecord (>= 3.0.0)
44
- activerecord (>= 3.0.7)
45
44
  activesupport (>= 3.0.0)
46
- activesupport (>= 3.0.7)
47
- awesome_print (1.0.2)
45
+ awesome_print (1.1.0)
48
46
  bouncy-castle-java (1.5.0146.1)
49
- builder (3.0.0)
50
- cancan (1.6.7)
47
+ builder (3.0.3)
48
+ cancan (1.6.8)
51
49
  capybara (1.1.2)
52
50
  mime-types (>= 1.16)
53
51
  nokogiri (>= 1.3.3)
@@ -55,36 +53,36 @@ GEM
55
53
  rack-test (>= 0.5.4)
56
54
  selenium-webdriver (~> 2.0)
57
55
  xpath (~> 0.1.4)
58
- capybara-screenshot (0.1.10)
56
+ capybara-screenshot (0.2.2)
59
57
  capybara (>= 1.0)
60
58
  capybara-webkit (0.12.1)
61
59
  capybara (>= 1.0.0, < 1.2)
62
60
  json
63
- childprocess (0.3.2)
64
- ffi (~> 1.0.6)
61
+ childprocess (0.3.5)
62
+ ffi (~> 1.0, >= 1.0.6)
65
63
  database_cleaner (0.8.0)
66
64
  erubis (2.7.0)
67
- excon (0.14.0)
65
+ excon (0.16.2)
68
66
  execjs (1.4.0)
69
67
  multi_json (~> 1.0)
70
- factory_girl (3.3.0)
68
+ factory_girl (4.1.0)
71
69
  activesupport (>= 3.0.0)
72
- factory_girl_rails (3.3.0)
73
- factory_girl (~> 3.3.0)
70
+ factory_girl_rails (4.1.0)
71
+ factory_girl (~> 4.1.0)
74
72
  railties (>= 3.0.0)
75
73
  fastercsv (1.5.5)
76
- ffi (1.0.11)
77
- ffi (1.0.11-java)
78
- heroku (2.26.6)
79
- heroku-api (~> 0.2.4)
74
+ ffi (1.1.5)
75
+ ffi (1.1.5-java)
76
+ heroku (2.31.2)
77
+ heroku-api (~> 0.3.4)
80
78
  launchy (>= 0.3.2)
81
- netrc (~> 0.7.2)
79
+ netrc (~> 0.7.7)
82
80
  rest-client (~> 1.6.1)
83
81
  rubyzip
84
- heroku-api (0.2.4)
85
- excon (~> 0.14.0)
82
+ heroku-api (0.3.5)
83
+ excon (~> 0.16.1)
86
84
  hike (1.2.1)
87
- i18n (0.6.0)
85
+ i18n (0.6.1)
88
86
  iq_rdf (0.1.5)
89
87
  builder
90
88
  bundler
@@ -93,33 +91,32 @@ GEM
93
91
  journey (1.0.4)
94
92
  jruby-openssl (0.7.7)
95
93
  bouncy-castle-java (>= 1.5.0146.1)
96
- json (1.7.3)
97
- json (1.7.3-java)
94
+ json (1.7.5)
95
+ json (1.7.5-java)
98
96
  kaminari (0.13.0)
99
97
  actionpack (>= 3.0.0)
100
98
  activesupport (>= 3.0.0)
101
- railties (>= 3.0.0)
102
- launchy (2.1.0)
103
- addressable (~> 2.2.6)
104
- launchy (2.1.0-java)
105
- addressable (~> 2.2.6)
106
- ffi (~> 1.0.9)
99
+ launchy (2.1.2)
100
+ addressable (~> 2.3)
101
+ launchy (2.1.2-java)
102
+ addressable (~> 2.3)
103
+ ffi (~> 1.1.1)
107
104
  spoon (~> 0.0.1)
108
105
  libv8 (3.3.10.4)
109
- libwebsocket (0.1.3)
106
+ libwebsocket (0.1.5)
110
107
  addressable
111
108
  mail (2.4.4)
112
109
  i18n (>= 0.4.0)
113
110
  mime-types (~> 1.16)
114
111
  treetop (~> 1.4.8)
115
- mime-types (1.18)
116
- minitest (3.0.1)
112
+ mime-types (1.19)
113
+ minitest (3.4.0)
117
114
  multi_json (1.3.6)
118
115
  mysql2 (0.3.11)
119
- netrc (0.7.4)
120
- nokogiri (1.5.3)
121
- nokogiri (1.5.3-java)
122
- pg (0.13.2)
116
+ netrc (0.7.7)
117
+ nokogiri (1.5.5)
118
+ nokogiri (1.5.5-java)
119
+ pg (0.14.1)
123
120
  polyglot (0.3.3)
124
121
  rack (1.4.1)
125
122
  rack-cache (1.2)
@@ -150,15 +147,14 @@ GEM
150
147
  json (~> 1.4)
151
148
  rest-client (1.6.7)
152
149
  mime-types (>= 1.16)
153
- rubyzip (0.9.8)
154
- sass (3.1.19)
150
+ rubyzip (0.9.9)
151
+ sass (3.2.1)
155
152
  sass-rails (3.2.5)
156
153
  railties (~> 3.2.0)
157
154
  sass (>= 3.1.10)
158
155
  tilt (~> 1.3)
159
- selenium-webdriver (2.22.1)
156
+ selenium-webdriver (2.25.0)
160
157
  childprocess (>= 0.2.5)
161
- ffi (~> 1.0)
162
158
  libwebsocket (~> 0.1.3)
163
159
  multi_json (~> 1.0)
164
160
  rubyzip
@@ -174,19 +170,19 @@ GEM
174
170
  rack (~> 1.0)
175
171
  tilt (~> 1.1, != 1.3.0)
176
172
  sqlite3 (1.3.6)
177
- therubyracer (0.10.1)
173
+ therubyracer (0.10.2)
178
174
  libv8 (~> 3.3.10)
179
- thor (0.15.3)
175
+ thor (0.16.0)
180
176
  tilt (1.3.3)
181
177
  treetop (1.4.10)
182
178
  polyglot
183
179
  polyglot (>= 0.3.1)
184
- turn (0.9.5)
180
+ turn (0.9.6)
185
181
  ansi
186
182
  tzinfo (0.3.33)
187
- uglifier (1.2.4)
183
+ uglifier (1.3.0)
188
184
  execjs (>= 0.3.0)
189
- multi_json (>= 1.0.2)
185
+ multi_json (~> 1.0, >= 1.0.2)
190
186
  view_marker (1.0.0)
191
187
  rails
192
188
  xpath (0.1.4)
@@ -1,6 +1,6 @@
1
1
  //= require jquery-1.7.1
2
2
  //= require rails
3
- //= require jquery-ui-1.8.20.custom
3
+ //= require jquery-ui-1.8.23.custom
4
4
  //= require jquery-ui.datepicker-de
5
5
  //= require jquery.treeview
6
6
  //= require jquery.treeview.async
@@ -0,0 +1,19 @@
1
+ /*jslint vars: true, white: true */
2
+ /*global jQuery, IQVOC */
3
+
4
+ IQVOC.extractConcepts = function(html) {
5
+ "use strict";
6
+ var $ = jQuery;
7
+
8
+ // disable scripts (adapted from jQuery's `load`)
9
+ var rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi;
10
+ html = html.replace(rscript, "");
11
+
12
+ var concepts = $("<div />").append(html).find("ul.concepts li");
13
+ concepts = concepts.map(function(i, node) {
14
+ var el = $("a", node);
15
+ return { value: el.attr("href"), label: $.trim(el.text()) };
16
+ });
17
+
18
+ return concepts.length ? Array.prototype.slice.call(concepts, 0) : [];
19
+ };
@@ -26,18 +26,18 @@ var createNote = function(ev) {
26
26
 
27
27
  clone.find("label").each(function(index, element) {
28
28
  var el = $(element);
29
- if (el.attr("for")) {
29
+ if(el.attr("for")) {
30
30
  el.attr("for", el.attr("for").replace(/_\d+_/, newIdCount));
31
31
  }
32
- })
32
+ });
33
33
 
34
34
  clone.find(inputSelector).each(function(index, element) {
35
35
  var el = $(element);
36
36
  el.val("");
37
- if (el.attr("id")) {
37
+ if(el.attr("id")) {
38
38
  el.attr("id", el.attr("id").replace(/_\d+_/, newIdCount));
39
39
  }
40
- if (el.attr("name")) {
40
+ if(el.attr("name")) {
41
41
  el.attr("name", el.attr("name").replace(/\[\d+\]/, newNameCount));
42
42
  }
43
43
  });
@@ -67,15 +67,9 @@ return {
67
67
  jQuery(document).ready(function($) {
68
68
  "use strict";
69
69
 
70
- var locale = document.documentElement.getAttribute("lang");
70
+ IQVOC.quicksearch(".quicksearch");
71
71
 
72
- if(IQVOC.visualization) {
73
- IQVOC.visualization.init("infovis", function(container) {
74
- if(IQVOC.Storage.getItem("visualization") === "enlarged") {
75
- container.data("widget").toggleSize(true);
76
- }
77
- });
78
- }
72
+ var locale = document.documentElement.getAttribute("lang");
79
73
 
80
74
  // language selection
81
75
  $("#language_selection .dropdown-toggle").click(function(ev) { // use Bootstrap's Dropwdown, but without the side-effects
@@ -202,4 +196,6 @@ jQuery(document).ready(function($) {
202
196
  }
203
197
  });
204
198
  });
199
+
200
+ IQVOC.onebox(".onebox");
205
201
  });
@@ -1,4 +1,7 @@
1
1
  //= require iqvoc/iqvoc
2
+ //= require iqvoc/extract_concepts
3
+ //= require iqvoc/quicksearch
4
+ //= require iqvoc/onebox
2
5
  //= require iqvoc/langselect
3
6
  //= require iqvoc/entityselect
4
7
  //= require iqvoc/entityselect_qualified
@@ -0,0 +1,44 @@
1
+ /*jslint vars: true, browser: true, white: true */
2
+ /*global jQuery, IQVOC */
3
+
4
+ IQVOC.onebox = (function($) {
5
+
6
+ "use strict";
7
+
8
+ var renderResults = function(concepts, container) {
9
+ container.empty();
10
+ $.each(concepts, function(i, concept) {
11
+ var link = $("<a />").attr("href", concept.value).text(concept.label);
12
+ $("<li />").append(link).appendTo(container);
13
+ });
14
+ };
15
+
16
+ var getConcepts = function(input, container) {
17
+ var form = input.closest("form");
18
+ $.ajax({
19
+ type: form.attr("method"),
20
+ url: form.attr("action"),
21
+ data: form.serialize(),
22
+ success: function(data, status, xhr) {
23
+ renderResults(IQVOC.extractConcepts(data), container);
24
+ }
25
+ });
26
+ };
27
+
28
+ return function(selector, options) {
29
+ var container = $(selector);
30
+ var input = container.find("input[type=search]");
31
+ var initialValue = input.val();
32
+ var resultList = $("<ul />").addClass("results").appendTo(container);
33
+
34
+ input.keyup(function() {
35
+ if (input.val().length == 0) {
36
+ resultList.empty();
37
+ }
38
+ else if (input.val().length > 0 && input.val() != initialValue) {
39
+ setTimeout(function() { getConcepts(input, resultList) }, 200);
40
+ }
41
+ });
42
+ };
43
+
44
+ }(jQuery));
@@ -0,0 +1,41 @@
1
+ /*jslint vars: true, browser: true, white: true */
2
+ /*global jQuery, IQVOC */
3
+
4
+ IQVOC.quicksearch = (function($) {
5
+
6
+ "use strict";
7
+
8
+ var defaults = {
9
+ minLength: 3,
10
+ autoFocus: true,
11
+ source: getConcepts,
12
+ focus: function(ev, ui) { ev.preventDefault(); },
13
+ select: onSelect
14
+ };
15
+
16
+ function onSelect(ev, ui) {
17
+ if(ui.item.value) {
18
+ $(ev.target).val(ui.item.label);
19
+ document.location = ui.item.value;
20
+ }
21
+ ev.preventDefault();
22
+ }
23
+
24
+ function getConcepts(req, callback) {
25
+ var form = $(this.element).closest("form");
26
+ $.ajax({
27
+ type: form.attr("method"),
28
+ url: form.attr("action"),
29
+ data: form.serialize(),
30
+ success: function(data, status, xhr) {
31
+ callback(IQVOC.extractConcepts(data));
32
+ }
33
+ });
34
+ }
35
+
36
+ return function(selector, options) {
37
+ options = options ? $.extend(defaults, options) : defaults;
38
+ $(selector).autocomplete(options);
39
+ };
40
+
41
+ }(jQuery));
@@ -2,5 +2,5 @@
2
2
  *= require bootstrap/bootstrap
3
3
  *= require bootstrap/bootstrap-responsive
4
4
  *= require jquery.treeview
5
- *= require jquery-ui-1.8.20.custom
5
+ *= require jquery-ui-1.8.23.custom
6
6
  */
@@ -51,13 +51,6 @@
51
51
  }
52
52
  }
53
53
 
54
- // Hide search form
55
- @media (max-width: 1200px) {
56
- .navbar-search {
57
- display: none;
58
- }
59
- }
60
-
61
54
  // Unify topbar margin on all viewports
62
55
  @media (min-width: 980px) {
63
56
  .navbar-fixed-top {
@@ -1,3 +1,30 @@
1
+ .navbar {
2
+ .quicksearch {
3
+ }
4
+ }
5
+
6
+ .onebox {
7
+ padding-top: 80px;
8
+ margin-top: 2em;
9
+ text-align: center;
10
+
11
+ background: asset-data-url("iqvoc_logo.png") top center no-repeat;
12
+
13
+ .logo {
14
+ margin: 2em 0 1em 0;
15
+ }
16
+
17
+ input {
18
+ min-width: 60%;
19
+ }
20
+
21
+ ul {
22
+ margin-left: 0;
23
+ list-style: none;
24
+ text-align: left;
25
+ }
26
+ }
27
+
1
28
  tr.highlightable {
2
29
  cursor: pointer;
3
30
  }
@@ -79,4 +106,3 @@ dt {
79
106
  }
80
107
  }
81
108
  }
82
-
@@ -9,5 +9,4 @@
9
9
  *= require iqvoc/note
10
10
  *= require iqvoc/entity_select
11
11
  *= require iqvoc/hacks
12
- *= require iqvoc/visualization
13
12
  */
@@ -14,7 +14,7 @@
14
14
  # See the License for the specific language governing permissions and
15
15
  # limitations under the License.
16
16
 
17
- require "iqvoc/controller_extensions"
17
+ require 'iqvoc/controller_extensions'
18
18
 
19
19
  class ApplicationController < ActionController::Base
20
20
  include Iqvoc::ControllerExtensions
@@ -19,9 +19,13 @@ class Concepts::AlphabeticalController < ConceptsController
19
19
  def index
20
20
  authorize! :read, Concept::Base
21
21
 
22
+ params[:prefix] = params[:letter] if params[:prefix].nil? # legacy compatibility -- XXX: unnecessary!?
23
+
24
+ redirect_to(url_for :prefix => "a") unless params[:prefix]
25
+
22
26
  @pref_labelings = Iqvoc::Concept.pref_labeling_class.
23
27
  concept_published.
24
- label_begins_with(params[:letter]).
28
+ label_begins_with(params[:prefix]).
25
29
  by_label_language(I18n.locale).
26
30
  includes(:target).
27
31
  order("LOWER(#{Label::Base.table_name}.value)").
@@ -24,7 +24,7 @@ class Concepts::UntranslatedController < ConceptsController
24
24
  authorize! :read, Concept::Base
25
25
 
26
26
  scope = Iqvoc::Concept.pref_labeling_class.label_class.
27
- begins_with(params[:letter]).
27
+ begins_with(params[:prefix]).
28
28
  missing_translation(I18n.locale, Iqvoc::Concept.pref_labeling_languages.first)
29
29
 
30
30
  if I18n.locale.to_s == Iqvoc::Concept.pref_labeling_languages.first # TODO: Should be 404!
@@ -85,6 +85,8 @@ class ConceptsController < ApplicationController
85
85
  }
86
86
  render :json => concept_data
87
87
  end
88
+ format.ttl
89
+ format.rdf
88
90
  end
89
91
  end
90
92
 
@@ -0,0 +1,23 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2011 innoQ Deutschland GmbH
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ class FrontpageController < ApplicationController
18
+
19
+ def index
20
+ @suppress_quicksearch = true
21
+ end
22
+
23
+ end
@@ -67,7 +67,7 @@ class InstanceConfigurationController < ApplicationController
67
67
  Iqvoc::InstanceConfiguration.validate_value(value)
68
68
  if default_value.is_a?(Array)
69
69
  return value.to_csv.strip
70
- else # String, Fixnum / Float
70
+ else # boolean, String, Fixnum / Float
71
71
  return value.to_s
72
72
  end
73
73
  end
@@ -89,7 +89,15 @@ class InstanceConfigurationController < ApplicationController
89
89
  # converts string to given (non-complex) type
90
90
  # raises TypeError on failure
91
91
  def convert_value(str, type)
92
- if type == String
92
+ if [TrueClass, FalseClass].include?(type)
93
+ if str == "true"
94
+ return true
95
+ elsif str == "false"
96
+ return false
97
+ else
98
+ raise TypeError, "expected boolean"
99
+ end
100
+ elsif type == String
93
101
  return str
94
102
  elsif type == Fixnum
95
103
  raise TypeError, "expected integer" unless str =~ /^[-+]?[0-9]+$/
@@ -0,0 +1,21 @@
1
+ # encoding: UTF-8
2
+
3
+ # Copyright 2011 innoQ Deutschland GmbH
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ class PagesController < ApplicationController
18
+ def help
19
+ authorize! :read, :help
20
+ end
21
+ end
@@ -27,25 +27,4 @@ class RdfController < ApplicationController
27
27
  end
28
28
  end
29
29
 
30
- def show
31
- scope = if params[:published] == "0"
32
- Iqvoc::Concept.base_class.unpublished
33
- else
34
- Iqvoc::Concept.base_class.published
35
- end
36
- if @concept = scope.by_origin(params[:id]).with_associations.last
37
- respond_to do |format|
38
- format.html do
39
- redirect_to concept_url(:id => @concept.origin, :published => params[:published])
40
- end
41
- format.any do
42
- authorize! :read, @concept
43
- render :show_concept
44
- end
45
- end
46
- else
47
- raise ActiveRecord::RecordNotFound.new("Concept '#{params[:id]}' not found.")
48
- end
49
- end
50
-
51
30
  end
@@ -30,7 +30,7 @@ module ConceptsHelper
30
30
  content_tag :ul, :class => 'letter-selector unstyled' do
31
31
  letters.map do |letter|
32
32
  content_tag :li, link_to(letter, yield(letter)),
33
- :class => ('active' if params[:letter] == letter.to_s.downcase)
33
+ :class => ('active' if params[:prefix] == letter.to_s.downcase)
34
34
  end.join("").html_safe
35
35
  end
36
36
  end
@@ -55,14 +55,4 @@ module NavigationHelper
55
55
  content_tag :li, content, :class => css_class
56
56
  end
57
57
 
58
- def quick_search_class
59
- klass = if Labeling.const_defined?(:SKOSXL)
60
- Labeling::SKOSXL::Base
61
- else
62
- Labeling::SKOS::Base
63
- end
64
-
65
- klass.name.parameterize
66
- end
67
-
68
58
  end
@@ -25,7 +25,7 @@ module RdfHelper
25
25
  hash[c.id] = c.origin
26
26
  end
27
27
 
28
- document << concept.build_rdf_subject(document, controller) do |c|
28
+ document << concept.build_rdf_subject(document, nil) do |c|
29
29
 
30
30
  concept.collection_members.each do |collection_member|
31
31
  if @rdf_helper_cached_collections[collection_member.collection_id]
@@ -449,7 +449,7 @@ class Concept::Base < ActiveRecord::Base
449
449
  def ensure_rooted_top_terms
450
450
  if @full_validation
451
451
  if narrower_relations.includes(:target). # XXX: inefficient?
452
- select { |rel| rel.target.top_term? }.any?
452
+ select { |rel| rel.target && rel.target.top_term? }.any?
453
453
  errors.add :base, I18n.t("txt.models.concept.top_term_rooted_error")
454
454
  end
455
455
  end
@@ -472,7 +472,7 @@ class Concept::Base < ActiveRecord::Base
472
472
  send(Iqvoc::Concept.pref_labeling_class_name.to_relation_name).map(&:target) +
473
473
  labelings.select{|l| l.is_a?(Iqvoc::Concept.pref_labeling_class)}.map(&:target)
474
474
  languages = {}
475
- pls.each do |pref_label|
475
+ pls.compact.each do |pref_label|
476
476
  lang = pref_label.language.to_s
477
477
  origin = (pref_label.origin || pref_label.id || pref_label.value).to_s
478
478
  if (languages.keys.include?(lang) && languages[lang] != origin)
@@ -21,7 +21,7 @@ class Concept::SKOS::Base < Concept::Base
21
21
 
22
22
  def build_rdf_subject(document, controller, &block)
23
23
  ns = IqRdf::Namespace.find_namespace_class(self.rdf_namespace)
24
- raise "Namespace '#{base_namespace}' is not defined in IqRdf document." unless ns
24
+ raise "Namespace '#{self.rdf_namespace}' is not defined in IqRdf document." unless ns
25
25
  subject = IqRdf.build_uri(self.origin, ns.build_uri(self.rdf_class), &block)
26
26
 
27
27
  # ensure skos:Concept type is present
@@ -42,8 +42,11 @@ class Label::Base < ActiveRecord::Base
42
42
  end
43
43
  end
44
44
 
45
- def self.begins_with(letter)
46
- where("LOWER(SUBSTR(#{Label::Base.table_name}.value, 1, 1)) = :letter", :letter => letter.to_s.downcase)
45
+ def self.begins_with(prefix)
46
+ prefix = prefix.to_s
47
+ table = Label::Base.table_name
48
+ where("LOWER(SUBSTR(#{table}.value, 1, :length)) = :prefix",
49
+ :length => prefix.length, :prefix => prefix.downcase)
47
50
  end
48
51
 
49
52
  def self.missing_translation(lang, main_lang)
@@ -45,8 +45,8 @@ class Labeling::Base < ActiveRecord::Base
45
45
  includes(:target).merge(Label::Base.published)
46
46
  end
47
47
 
48
- def self.label_begins_with(letter)
49
- includes(:target).merge(Label::Base.begins_with(letter))
48
+ def self.label_begins_with(prefix)
49
+ includes(:target).merge(Label::Base.begins_with(prefix))
50
50
  end
51
51
 
52
52
  def self.by_label_language(lang)
@@ -83,7 +83,7 @@ class Labeling::SKOS::Base < Labeling::Base
83
83
 
84
84
  def self.build_from_rdf(subject, predicate, object)
85
85
  raise "Labeling::SKOS::Base#build_from_rdf: Subject (#{subject}) must be a Concept." unless subject.is_a?(Concept::Base)
86
- raise "Labeling::SKOS::Base#build_from_rdf: Object (#{object}) must be a string literal" unless object =~ /^"(.+)"(@(.+))$/
86
+ raise "Labeling::SKOS::Base#build_from_rdf: Object (#{object}) must be a string literal" unless object =~ /^"(.+)"(@(.+))?$/
87
87
 
88
88
  lang = $3
89
89
  value = JSON.parse(%Q{["#{$1}"]})[0].gsub("\\n", "\n") # Trick to decode \uHHHHH chars