iqvoc 4.13.0 → 4.13.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (272) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +11 -1
  3. data/Gemfile +9 -10
  4. data/Gemfile.lock +206 -167
  5. data/README.md +7 -6
  6. data/app/assets/javascripts/framework.js +3 -3
  7. data/app/assets/javascripts/iqvoc/hover_menues.js +14 -0
  8. data/app/assets/javascripts/iqvoc/iqvoc.js +46 -41
  9. data/app/assets/javascripts/iqvoc/manifest.js +2 -1
  10. data/app/assets/javascripts/iqvoc/treeview.js +2 -1
  11. data/app/assets/stylesheets/iqvoc/components/_entity_select.scss +5 -8
  12. data/app/assets/stylesheets/iqvoc/components/_simplete.scss +2 -1
  13. data/app/assets/stylesheets/iqvoc/components/_treeview.scss +1 -0
  14. data/app/assets/stylesheets/iqvoc/hacks/_hacks.scss +1 -1
  15. data/app/controllers/collections/versions_controller.rb +1 -1
  16. data/app/controllers/collections_controller.rb +1 -1
  17. data/app/controllers/concepts/alphabetical_controller.rb +1 -1
  18. data/app/controllers/concepts/scheme_controller.rb +2 -1
  19. data/app/controllers/concepts/versions_controller.rb +1 -1
  20. data/app/controllers/concepts_controller.rb +9 -3
  21. data/app/controllers/hierarchy_controller.rb +1 -1
  22. data/app/controllers/search_results_controller.rb +3 -0
  23. data/app/controllers/triplestore_sync_controller.rb +2 -2
  24. data/app/controllers/users_controller.rb +1 -1
  25. data/app/helpers/application_helper.rb +6 -3
  26. data/app/helpers/concepts_helper.rb +3 -3
  27. data/app/helpers/link_helper.rb +7 -7
  28. data/app/helpers/navigation_helper.rb +24 -13
  29. data/app/models/abstract_user.rb +1 -1
  30. data/app/models/concept/base.rb +10 -1
  31. data/app/models/concept/skos/base.rb +0 -10
  32. data/app/models/concept/validations.rb +6 -4
  33. data/app/models/concerns/versioning.rb +1 -1
  34. data/app/models/dataset/adaptors/iqvoc/http_adaptor.rb +1 -1
  35. data/app/models/dataset/adaptors/iqvoc/label_adaptor.rb +1 -1
  36. data/app/models/dataset/adaptors/iqvoc/search_adaptor.rb +1 -1
  37. data/app/models/labeling/skos/base.rb +14 -10
  38. data/app/models/user_session.rb +0 -3
  39. data/app/services/rdf_sync_service.rb +3 -3
  40. data/app/views/concepts/alphabetical/_search_result.html.erb +3 -1
  41. data/app/views/concepts/hierarchical/_treeview.html.erb +4 -1
  42. data/app/views/concepts/scheme/show.html.erb +1 -3
  43. data/app/views/errors/server_error.html.erb +1 -2
  44. data/app/views/partials/collection/_member.html.erb +1 -1
  45. data/app/views/partials/concept/relation/_base.html.erb +4 -4
  46. data/app/views/partials/concept/relation/skos/_narrower.html.erb +1 -1
  47. data/app/views/partials/concept/relation/skos/broader/_mono.html.erb +2 -2
  48. data/app/views/partials/concept/relation/skos/broader/_poly.html.erb +2 -2
  49. data/app/views/partials/labeling/skos/_base.html.erb +1 -1
  50. data/app/views/partials/labeling/skos/_edit_base.html.erb +2 -1
  51. data/app/views/partials/labeling/skos/_search_result.html.erb +3 -0
  52. data/app/views/partials/match/_panel.html.erb +2 -2
  53. data/app/views/partials/notation/_base.html.erb +1 -1
  54. data/app/views/search_results/sections/_options.html.erb +10 -0
  55. data/app/views/search_results/sections/_terms.html.erb +1 -1
  56. data/app/views/search_results/sections/_type.html.erb +1 -1
  57. data/bin/bundle +3 -0
  58. data/bin/delayed_job +5 -0
  59. data/bin/rails +4 -0
  60. data/bin/rake +4 -0
  61. data/bin/setup +36 -0
  62. data/bin/update +31 -0
  63. data/bin/yarn +17 -0
  64. data/config/application.rb +15 -10
  65. data/config/boot.rb +2 -2
  66. data/config/cable.yml +1 -1
  67. data/config/database.yml +14 -19
  68. data/config/engine.rb +0 -1
  69. data/config/environment.rb +1 -1
  70. data/config/initializers/backtrace_silencers.rb +4 -3
  71. data/config/initializers/content_security_policy.rb +5 -0
  72. data/config/initializers/filter_parameter_logging.rb +3 -1
  73. data/config/initializers/permissions_policy.rb +11 -0
  74. data/config/initializers/wrap_parameters.rb +3 -3
  75. data/config/initializers/zeitwerk.rb +6 -0
  76. data/config/locales/activerecord.de.yml +2 -2
  77. data/config/locales/de.yml +7 -3
  78. data/config/locales/en.yml +5 -1
  79. data/config/puma.rb +10 -4
  80. data/db/migrate/20220107114201_add_fk_constraint_to_active_storage_attachments_for_blob_id.active_storage.rb +10 -0
  81. data/db/schema.rb +6 -6
  82. data/iqvoc.gemspec +10 -11
  83. data/lib/iqvoc/configuration/core.rb +9 -2
  84. data/lib/iqvoc/configuration/instance_configuration.rb +1 -1
  85. data/lib/iqvoc/environments/development.rb +18 -7
  86. data/lib/iqvoc/environments/production.rb +35 -12
  87. data/lib/iqvoc/environments/test.rb +14 -7
  88. data/lib/iqvoc/version.rb +1 -1
  89. data/lib/tasks/sync.rake +1 -1
  90. data/test/authentication.rb +1 -1
  91. data/test/controllers/hierarchy_test.rb +4 -4
  92. data/test/integration/client_edit_concept_test.rb +1 -1
  93. data/test/integration/concept_collection_assignment_test.rb +6 -6
  94. data/test/integration/search_test.rb +3 -3
  95. data/test/integration_test_helper.rb +2 -2
  96. data/test/models/rdf_sync_test.rb +3 -3
  97. data/test/models/zeitwerk_compliance_test.rb +7 -0
  98. metadata +83 -250
  99. data/config/initializers/new_framework_defaults_5_1.rb +0 -14
  100. data/config/initializers/sqlite3_booleans.rb +0 -1
  101. data/public/422.html +0 -58
  102. data/public/assets/fonts/FiraMono-Regular-0b6138c5b386dc9125473fd851926f29.ttf +0 -0
  103. data/public/assets/fonts/FiraMono-Regular-690950e8d89c92cba41eeeb13f1de93e.woff +0 -0
  104. data/public/assets/fonts/FiraMono-Regular-98f97ed2dbf9d94d4fa5df048434b88d.eot +0 -0
  105. data/public/assets/fonts/FiraMono-Regular.eot +0 -0
  106. data/public/assets/fonts/FiraMono-Regular.ttf +0 -0
  107. data/public/assets/fonts/FiraMono-Regular.woff +0 -0
  108. data/public/assets/fonts/FiraSans-Bold-0de5f536bd0dc370449c0c67a49a6fe7.eot +0 -0
  109. data/public/assets/fonts/FiraSans-Bold-25037ef8d155e38b5df0c242a4c6cf2d.ttf +0 -0
  110. data/public/assets/fonts/FiraSans-Bold-494219a9639084eb9528ff47f79fcda1.woff +0 -0
  111. data/public/assets/fonts/FiraSans-Bold.eot +0 -0
  112. data/public/assets/fonts/FiraSans-Bold.ttf +0 -0
  113. data/public/assets/fonts/FiraSans-Bold.woff +0 -0
  114. data/public/assets/fonts/FiraSans-BoldItalic-5b3b812df9e1cb2b1f34baad65a2bdfb.ttf +0 -0
  115. data/public/assets/fonts/FiraSans-BoldItalic-90b8087c48feff2e828f658c49de5399.eot +0 -0
  116. data/public/assets/fonts/FiraSans-BoldItalic-b10e46158d50bf9b78968112acf87310.woff +0 -0
  117. data/public/assets/fonts/FiraSans-BoldItalic.eot +0 -0
  118. data/public/assets/fonts/FiraSans-BoldItalic.ttf +0 -0
  119. data/public/assets/fonts/FiraSans-BoldItalic.woff +0 -0
  120. data/public/assets/fonts/FiraSans-Book-659d252627051e785260ba445da8930f.woff +0 -0
  121. data/public/assets/fonts/FiraSans-Book-abc65ceb7bfaed729bff7a9d1367b7d4.eot +0 -0
  122. data/public/assets/fonts/FiraSans-Book-f0410501d5ecc5fe66bcdbc02b482c81.ttf +0 -0
  123. data/public/assets/fonts/FiraSans-Book.eot +0 -0
  124. data/public/assets/fonts/FiraSans-Book.ttf +0 -0
  125. data/public/assets/fonts/FiraSans-Book.woff +0 -0
  126. data/public/assets/fonts/FiraSans-ExtraLight-140f15ee97cb2099ff01c2b57dcd1a24.woff +0 -0
  127. data/public/assets/fonts/FiraSans-ExtraLight-28e5c2679df66406ebd117fbdded6753.eot +0 -0
  128. data/public/assets/fonts/FiraSans-ExtraLight-c15de70ebceffce178cbd2e82aa2c373.ttf +0 -0
  129. data/public/assets/fonts/FiraSans-ExtraLight.eot +0 -0
  130. data/public/assets/fonts/FiraSans-ExtraLight.ttf +0 -0
  131. data/public/assets/fonts/FiraSans-ExtraLight.woff +0 -0
  132. data/public/assets/fonts/FiraSans-Italic-ac4cb18fe14a7c90f29cdd2ce499ba59.woff +0 -0
  133. data/public/assets/fonts/FiraSans-Italic-bdea00fee0da5ca9176061e00c26a0da.eot +0 -0
  134. data/public/assets/fonts/FiraSans-Italic-e7e76a0ee170fd29b5d8100753eff569.ttf +0 -0
  135. data/public/assets/fonts/FiraSans-Italic.eot +0 -0
  136. data/public/assets/fonts/FiraSans-Italic.ttf +0 -0
  137. data/public/assets/fonts/FiraSans-Italic.woff +0 -0
  138. data/public/assets/fonts/FiraSans-Light-20adaf630b690c3e3184daaeae585f22.woff +0 -0
  139. data/public/assets/fonts/FiraSans-Light-3689e18b38d335ec0c43823adb6a2984.eot +0 -0
  140. data/public/assets/fonts/FiraSans-Light-55b04531e7a9ecdf58090d70b94b68e2.ttf +0 -0
  141. data/public/assets/fonts/FiraSans-Light-SC-098407a72b7ad46f7c2480d7ac11baf2.eot +0 -0
  142. data/public/assets/fonts/FiraSans-Light-SC-82763fe2ce9e6b897556c6f3c2aceb29.woff2 +0 -0
  143. data/public/assets/fonts/FiraSans-Light-SC-c73985985f0501c1845a5185b180fe6b.woff +0 -0
  144. data/public/assets/fonts/FiraSans-Light-SC-c9563f48d9cccd91f07e46801c27130f.ttf +0 -0
  145. data/public/assets/fonts/FiraSans-Light-SC.eot +0 -0
  146. data/public/assets/fonts/FiraSans-Light-SC.ttf +0 -0
  147. data/public/assets/fonts/FiraSans-Light-SC.woff +0 -0
  148. data/public/assets/fonts/FiraSans-Light-SC.woff2 +0 -0
  149. data/public/assets/fonts/FiraSans-Light.eot +0 -0
  150. data/public/assets/fonts/FiraSans-Light.ttf +0 -0
  151. data/public/assets/fonts/FiraSans-Light.woff +0 -0
  152. data/public/assets/fonts/FiraSans-Medium-082fab59048189168006bf2e914ba8b7.woff +0 -0
  153. data/public/assets/fonts/FiraSans-Medium-11706edfe8651c355b413bd24b4b5e10.eot +0 -0
  154. data/public/assets/fonts/FiraSans-Medium-3a0dacdeaba1b4c054f2d6cb5061965d.ttf +0 -0
  155. data/public/assets/fonts/FiraSans-Medium.eot +0 -0
  156. data/public/assets/fonts/FiraSans-Medium.ttf +0 -0
  157. data/public/assets/fonts/FiraSans-Medium.woff +0 -0
  158. data/public/assets/fonts/FiraSans-MediumItalic-6c8a2646d72641226527d574a8485b66.woff +0 -0
  159. data/public/assets/fonts/FiraSans-MediumItalic-b81e92794a6878b6c578d97b3ad5e6d7.ttf +0 -0
  160. data/public/assets/fonts/FiraSans-MediumItalic-eae7f4a3c4db9fe83025909ebfae5ad9.eot +0 -0
  161. data/public/assets/fonts/FiraSans-MediumItalic.eot +0 -0
  162. data/public/assets/fonts/FiraSans-MediumItalic.ttf +0 -0
  163. data/public/assets/fonts/FiraSans-MediumItalic.woff +0 -0
  164. data/public/assets/fonts/FiraSans-Regular-537188a19aeebdd74a92e114af7a02cb.ttf +0 -0
  165. data/public/assets/fonts/FiraSans-Regular-5d6a923de9be80ff5c2995cc03d93127.woff +0 -0
  166. data/public/assets/fonts/FiraSans-Regular-db689e5fea21ed4b7890811151968dc6.eot +0 -0
  167. data/public/assets/fonts/FiraSans-Regular.eot +0 -0
  168. data/public/assets/fonts/FiraSans-Regular.ttf +0 -0
  169. data/public/assets/fonts/FiraSans-Regular.woff +0 -0
  170. data/public/assets/fonts/FiraSans-UltraLight-3baefce4c224a0f0b26cdafe37dfa55d.eot +0 -0
  171. data/public/assets/fonts/FiraSans-UltraLight-e3909a352b87f853bb464836adfd602a.ttf +0 -0
  172. data/public/assets/fonts/FiraSans-UltraLight-f7289beeaa2353caf487553ee8b8ef03.woff +0 -0
  173. data/public/assets/fonts/FiraSans-UltraLight.eot +0 -0
  174. data/public/assets/fonts/FiraSans-UltraLight.ttf +0 -0
  175. data/public/assets/fonts/FiraSans-UltraLight.woff +0 -0
  176. data/public/assets/fonts/FontAwesome.otf +0 -0
  177. data/public/assets/fonts/fontawesome-webfont.eot +0 -0
  178. data/public/assets/fonts/fontawesome-webfont.svg +0 -2671
  179. data/public/assets/fonts/fontawesome-webfont.ttf +0 -0
  180. data/public/assets/fonts/fontawesome-webfont.woff +0 -0
  181. data/public/assets/fonts/fontawesome-webfont.woff2 +0 -0
  182. data/public/assets/images/ajax-loader-30d8e72bfdae694b1938658e1b087df0.gif +0 -0
  183. data/public/assets/images/ajax-loader.gif +0 -0
  184. data/public/assets/images/iqvoc_logo-165f17a46cf0a1bf9464db9d136fb843.svg +0 -41
  185. data/public/assets/images/iqvoc_logo.svg +0 -41
  186. data/public/assets/images/treeview-default-line-5e3c0e0c48f48c23c45aef7b72c739c0.gif +0 -0
  187. data/public/assets/images/treeview-default-line.gif +0 -0
  188. data/public/assets/javascripts/bootstrap.bundle.min-68b3c2f1c1f636f947fff1229d3ffbf5.js +0 -7
  189. data/public/assets/javascripts/bootstrap.bundle.min.js +0 -42
  190. data/public/assets/javascripts/jquery-17e41799d7fba03a313ca6b67d8a0954.js +0 -26
  191. data/public/assets/javascripts/jquery-d52dc3a9171f1fc89dd0f8e35e42c9d2.js +0 -26
  192. data/public/assets/javascripts/jquery.js +0 -10875
  193. data/public/assets/javascripts/manifest-7708201f7c24d5186cd075c3317f9b70.js +0 -7311
  194. data/public/assets/javascripts/manifest-89894d9f630fa57378a0c28e2a3d9ea9.js +0 -7325
  195. data/public/assets/javascripts/manifest.js +0 -5660
  196. data/public/assets/manifest.json +0 -1
  197. data/public/assets/stylesheets/manifest-893c7de3dee9ed1295bc1b5b4c1f0c34.css +0 -13
  198. data/public/assets/stylesheets/manifest-94b7be92a9b1cfeafea4ea71af910324.css +0 -13
  199. data/public/assets/stylesheets/manifest-e576edf92efaaad86b15b565fa473d0b.css +0 -7
  200. data/public/assets/stylesheets/manifest.css +0 -14314
  201. data/public/export/12750.nt +0 -28
  202. data/public/export/17385303752427181100115432751692126521.nt +0 -28
  203. data/public/export/181196830007276319343907883650755121680.nt +0 -28
  204. data/public/export/194669028845730209313058462140064732442.nt +0 -28
  205. data/public/export/21988.nt +0 -28
  206. data/public/export/230655012044692637365356891394989635995.nt +0 -28
  207. data/public/export/233590502327750705645106563554497694497.nt +0 -28
  208. data/public/export/245884359537367641918690456207690070316.nt +0 -28
  209. data/public/export/250386066048669747259363837063223215204.nt +0 -28
  210. data/public/export/256041066575224861739818511470898486442.nt +0 -28
  211. data/public/export/287138383024694264939471429022965897163.nt +0 -28
  212. data/public/export/31892.nt +0 -28
  213. data/public/export/333774437366008328346740356666975078086.nt +0 -28
  214. data/public/export/34639390376251419382098415225771775708.nt +0 -28
  215. data/public/export/4098.nt +0 -28
  216. data/public/export/47070.nt +0 -28
  217. data/public/export/49947.nt +0 -28
  218. data/public/export/5793.nt +0 -28
  219. data/public/export/64089124325772410079516909502763866955.nt +0 -28
  220. data/public/export/64718.nt +0 -28
  221. data/public/export/71200590939430584664474292378126383577.nt +0 -28
  222. data/public/export/81965533953024918329855744567916239964.nt +0 -28
  223. data/public/favicon.ico +0 -0
  224. data/public/robots.txt +0 -5
  225. data/public/uploads/import/213b73161661ebbad4e5ee3f543ae617.nt +0 -259
  226. data/public/uploads/import/22ad4d7419b7914c7319c46a66839f77.nt +0 -259
  227. data/public/uploads/import/22b78e01b9b5876851578cf9a8373c07.nt +0 -259
  228. data/public/uploads/import/2ab75781f8141010699dd272f681b245.nt +0 -259
  229. data/public/uploads/import/4c7fe47a2c21a681fd8f0eb3af0ebf19.nt +0 -259
  230. data/public/uploads/import/5265d7cb194f017c592a68914ecf8d9f.nt +0 -259
  231. data/public/uploads/import/5cb5414a66e4ae5dbe05eb763c367bd1.nt +0 -259
  232. data/public/uploads/import/6b042e00c2e2abf9241d2ece3e67ed27.nt +0 -259
  233. data/public/uploads/import/749edd3918db157202b00f89418b87d1.nt +0 -259
  234. data/public/uploads/import/7aeb9d76b78ba67674caa53a96e1caa0.nt +0 -259
  235. data/public/uploads/import/7b7fc425b8926e586ca10d0f1385aa4e.nt +0 -259
  236. data/public/uploads/import/8319d34702375718b20e72a6af71c503.nt +0 -259
  237. data/public/uploads/import/9ec48f5aaece8d2a8770439e34199b19.nt +0 -259
  238. data/public/uploads/import/a22750632c35587057285920142c2db8.nt +0 -259
  239. data/public/uploads/import/a6d9eeb5e76ce0032614c8142a33c90b.nt +0 -259
  240. data/public/uploads/import/a7ec826e32e80d1fc61f5e89f7442199.nt +0 -259
  241. data/public/uploads/import/af2ac8cb84a194da9871ea701f915a25.nt +0 -259
  242. data/public/uploads/import/b50c67ef8cb51fa12812ac2601faaa75.nt +0 -259
  243. data/public/uploads/import/b66560ac9cc4aecd50f82d4fcec8bde4.nt +0 -259
  244. data/public/uploads/import/c1a12245a41d9105585fb48a0b5244ab.nt +0 -259
  245. data/public/uploads/import/c4b23750b9f72a7f93bcd979a9afded3.nt +0 -259
  246. data/public/uploads/import/d1edac76626a35a6e72a592c98e97b1a.nt +0 -259
  247. data/public/uploads/import/eca92dbeff4aec30e3072103bb5f565f.nt +0 -259
  248. data/public/uploads/import/f7996f8826062cd8dcfc8fac70e830b9.nt +0 -259
  249. data/public/uploads/tmp/1609926599-187261935008931-0002-5418/hobbies.nt +0 -259
  250. data/public/uploads/tmp/1610450700-516890595554445-0002-2685/hobbies.nt +0 -259
  251. data/public/uploads/tmp/1610450844-597126333235543-0001-0714/hobbies.nt +0 -259
  252. data/public/uploads/tmp/1611054155-443031323634581-0001-9192/hobbies.nt +0 -259
  253. data/public/uploads/tmp/1611225485-767301590714814-0002-6904/hobbies.nt +0 -259
  254. data/public/uploads/tmp/1611225661-919900076415463-0002-0657/hobbies.nt +0 -259
  255. data/public/uploads/tmp/1611227389-36557097935032-0002-4613/hobbies.nt +0 -259
  256. data/public/uploads/tmp/1611585376-822293462114758-0001-9752/hobbies.nt +0 -259
  257. data/public/uploads/tmp/1611585431-703460698560673-0002-7522/hobbies.nt +0 -259
  258. data/public/uploads/tmp/1611586554-483369300394995-0002-0872/hobbies.nt +0 -259
  259. data/public/uploads/tmp/1619777137-609890333749067-0002-0264/hobbies.nt +0 -259
  260. data/public/uploads/tmp/1627291050-163284787457980-0001-2701/hobbies.nt +0 -259
  261. data/public/uploads/tmp/1627291589-952446089963663-0002-3171/hobbies.nt +0 -259
  262. data/public/uploads/tmp/1627291819-788250283200541-0002-2503/hobbies.nt +0 -259
  263. data/public/uploads/tmp/1627292534-103362378955855-0001-7089/hobbies.nt +0 -259
  264. data/public/uploads/tmp/1627293799-506613299368066-0002-1247/hobbies.nt +0 -259
  265. data/public/uploads/tmp/1627293863-868842521367397-0001-4656/hobbies.nt +0 -259
  266. data/public/uploads/tmp/1636993960-338364327912413-0002-8049/hobbies.nt +0 -259
  267. data/public/uploads/tmp/1641550181-434480636271400-0002-7928/hobbies.nt +0 -259
  268. data/public/uploads/tmp/1641550416-6444469569098-0002-2156/hobbies.nt +0 -259
  269. data/public/uploads/tmp/1641550691-848542458162760-0002-6815/hobbies.nt +0 -259
  270. data/public/uploads/tmp/1641550716-647719127292471-0002-9954/hobbies.nt +0 -259
  271. data/public/uploads/tmp/1641551058-78248622355227-0002-3663/hobbies.nt +0 -259
  272. data/public/uploads/tmp/1641551220-744894908610606-0001-3879/hobbies.nt +0 -259
@@ -9,52 +9,57 @@ jQuery(document).ready(function($) {
9
9
  var locale = document.documentElement.getAttribute("lang");
10
10
 
11
11
  var langWidget = $("ul.lang-widget")[0];
12
- // primary language (converting links to radio buttons)
13
- $("a", langWidget).each(function(i, node) {
14
- var link = $(node);
15
- var el = link.closest("li");
16
- var btn = $('<input type="radio" name="primary_language">');
17
- if(link.hasClass("active")) {
18
- btn[0].checked = true;
19
- }
20
- var label = $("<label />").append(btn).append(link);
21
- el.append(label);
22
- return label[0];
23
- });
24
- $("input:radio", langWidget).on("change", function(ev) {
25
- window.location = $(this).closest("label").find("a").attr("href");
26
- });
27
- // secondary language
28
- var toggleSections = function(langSelected) {
29
- $(".translation[lang]").each(function(i, node) {
30
- var el = $(node),
31
- lang = el.attr("lang");
32
- if(lang && lang !== locale && $.inArray(lang, langSelected) === -1) {
33
- el.addClass("hidden");
34
- } else {
35
- el.removeClass("hidden");
12
+
13
+ if (langWidget) {
14
+ // primary language (converting links to radio buttons)
15
+ $("a", langWidget).each(function(i, node) {
16
+ var link = $(node);
17
+ var el = link.closest("li");
18
+ var btn = $('<input type="radio" name="primary_language">');
19
+ if(link.hasClass("active")) {
20
+ btn[0].checked = true;
36
21
  }
22
+ var label = $("<label />").append(btn).append(link);
23
+ el.append(label);
24
+ return label[0];
37
25
  });
38
- };
39
- var updateNoteLangs = function(langSelected) {
40
- $(".inline_note.new select[id*=language]").each(function(i, sel) { // NB: new notes only!
41
- $(sel).find("option").each(function(i, opt) {
42
- var el = $(opt),
43
- lang = el.val();
44
- if(lang !== locale && $.inArray(lang, langSelected) === -1) {
45
- el.remove();
26
+
27
+ $("input:radio", langWidget).on("change", function(ev) {
28
+ window.location = $(this).closest("label").find("a").attr("href");
29
+ });
30
+
31
+ // secondary language
32
+ var toggleSections = function(langSelected) {
33
+ $(".translation[lang]").each(function(i, node) {
34
+ var el = $(node),
35
+ lang = el.attr("lang");
36
+ if(lang && lang !== locale && $.inArray(lang, langSelected) === -1) {
37
+ el.addClass("hidden");
38
+ } else {
39
+ el.removeClass("hidden");
46
40
  }
47
41
  });
42
+ };
43
+ var updateNoteLangs = function(langSelected) {
44
+ $(".inline_note.new select[id*=language]").each(function(i, sel) { // NB: new notes only!
45
+ $(sel).find("option").each(function(i, opt) {
46
+ var el = $(opt),
47
+ lang = el.val();
48
+ if(lang !== locale && $.inArray(lang, langSelected) === -1) {
49
+ el.remove();
50
+ }
51
+ });
52
+ });
53
+ };
54
+ $(document).on("lang_selected", function(ev, data) {
55
+ toggleSections(data.langs);
56
+ updateNoteLangs(data.langs);
48
57
  });
49
- };
50
- $(document).on("lang_selected", function(ev, data) {
51
- toggleSections(data.langs);
52
- updateNoteLangs(data.langs);
53
- });
54
- var langSelector = new IQVOC.LanguageSelector(langWidget, "lang_selected");
55
- if($("#new_concept, #edit_concept").length) { // edit mode
56
- // disable secondary language selection to avoid excessive state complexity
57
- $(":checkbox", langSelector.container).prop("disabled", true);
58
+ var langSelector = new IQVOC.LanguageSelector(langWidget, "lang_selected");
59
+ if($("#new_concept, #edit_concept").length) { // edit mode
60
+ // disable secondary language selection to avoid excessive state complexity
61
+ $(":checkbox", langSelector.container).prop("disabled", true);
62
+ }
58
63
  }
59
64
 
60
65
  // hide broader relations for top+ terms (mutually exclusive in mono hierarchies)
@@ -8,4 +8,5 @@ import './federated_concept_mapper'
8
8
  import './concept_mapping_manager'
9
9
  import './label_resolver'
10
10
  import './treeview'
11
- import './autocomplete'
11
+ import './autocomplete'
12
+ import './hover_menues'
@@ -15,6 +15,7 @@ import 'jqtree/tree.jquery.js';
15
15
 
16
16
  var dragabbleSupport = $(container).data('dragabble');
17
17
  var polyhierarchySupport = $(container).data('polyhierarchy-support');
18
+ var conceptModalPreviewEnabled = $(container).data('concept-modal-preview-enabled');
18
19
  var saveLabel = $(container).data('save-label');
19
20
  var copyLabel = $(container).data('copy-label');
20
21
  var undoLabel = $(container).data('undo-label');
@@ -65,7 +66,7 @@ import 'jqtree/tree.jquery.js';
65
66
  link.addClass('published');
66
67
  }
67
68
 
68
- if (link[0]) {
69
+ if (link[0] && conceptModalPreviewEnabled) {
69
70
  var teaserLink = buildTeaserLink(node, link[0]);
70
71
  $li.find('.jqtree-element').append(teaserLink);
71
72
  }
@@ -30,8 +30,9 @@
30
30
  list-style-type: none;
31
31
  margin-top: 5px;
32
32
  padding-left: 0;
33
+
33
34
  li {
34
- float: left;
35
+ display: inline-block;
35
36
  }
36
37
  }
37
38
 
@@ -40,11 +41,7 @@
40
41
  padding: 0;
41
42
  }
42
43
 
43
- .sections .entity_list li:after,
44
- .relation-body .entity_list li:after {
45
- content: ",\00a0"; // => ', '
46
- }
47
- .sections .entity_list li:last-child:after,
48
- .relation-body .entity_list li:last-child:after {
49
- content: "";
44
+ .relation-body .entity_list li:not(:last-child):after {
45
+ content: ",";
46
+ margin-left: -0.2rem;
50
47
  }
@@ -12,6 +12,7 @@ simplete-suggestions {
12
12
  position: absolute;
13
13
  width: 100%;
14
14
  display: block;
15
+ z-index: 100;
15
16
 
16
17
  .search-results {
17
18
  overflow-y: auto;
@@ -34,4 +35,4 @@ simplete-suggestions {
34
35
  li.search-result:hover {
35
36
  background-color: $gray-200;
36
37
  }
37
- }
38
+ }
@@ -1,5 +1,6 @@
1
1
  ul.hybrid-treeview {
2
2
  padding: 0;
3
+ margin-bottom: 0;
3
4
  }
4
5
 
5
6
  ul.jqtree-tree {
@@ -2,7 +2,7 @@ legend {
2
2
  margin-bottom: 0;
3
3
  }
4
4
 
5
- fieldset > div:first-of-type, ol:first-of-type, p {
5
+ fieldset > div:first-of-type, ol:first-of-type {
6
6
  -webkit-margin-top-collapse: separate;
7
7
  margin-top: 27px;
8
8
  }
@@ -15,7 +15,7 @@
15
15
  # limitations under the License.
16
16
 
17
17
  class Collections::VersionsController < ApplicationController
18
- include RDFSyncService::Helper
18
+ include RdfSyncService::Helper
19
19
 
20
20
  def merge
21
21
  scope = Iqvoc::Collection.base_class.by_origin(params[:origin])
@@ -125,7 +125,7 @@ class CollectionsController < ApplicationController
125
125
  # set to_review to false if someone edits a concepts
126
126
  concept_params["to_review"] = "false"
127
127
 
128
- if @collection.update_attributes(concept_params)
128
+ if @collection.update(concept_params)
129
129
  flash[:success] = I18n.t('txt.controllers.collections.save.success')
130
130
  redirect_to collection_path(@collection, published: 0)
131
131
  else
@@ -61,7 +61,7 @@ class Concepts::AlphabeticalController < ConceptsController
61
61
 
62
62
  def find_labelings
63
63
  letter = (@letters.include?('A')) ? 'a' : @letters.first
64
- query = (params[:prefix] || letter).mb_chars.downcase.to_s
64
+ query = (params[:prefix] || letter)&.mb_chars&.downcase.to_s
65
65
 
66
66
  Iqvoc::Concept.pref_labeling_class
67
67
  .concept_published
@@ -42,6 +42,7 @@ class Concepts::SchemeController < ApplicationController
42
42
  @top_concepts = Iqvoc::Concept.base_class
43
43
  .preload(:pref_labels)
44
44
  .tops
45
+ .not_expired
45
46
  .published.sort_by {|c| c.pref_label }
46
47
 
47
48
  respond_to do |format|
@@ -59,7 +60,7 @@ class Concepts::SchemeController < ApplicationController
59
60
  @scheme = Iqvoc::Concept.root_class.instance
60
61
  authorize! :update, @scheme
61
62
 
62
- if @scheme.update_attributes(concept_params)
63
+ if @scheme.update(concept_params)
63
64
  flash[:success] = t('txt.controllers.concept_scheme.save.success')
64
65
  redirect_to scheme_path
65
66
  else
@@ -15,7 +15,7 @@
15
15
  # limitations under the License.
16
16
 
17
17
  class Concepts::VersionsController < ApplicationController
18
- include RDFSyncService::Helper
18
+ include RdfSyncService::Helper
19
19
 
20
20
  def merge
21
21
  concept_scope = Iqvoc::Concept.base_class.by_origin(params[:origin])
@@ -147,7 +147,7 @@ class ConceptsController < ApplicationController
147
147
  authorize! :create, Iqvoc::Concept.base_class
148
148
 
149
149
  @concept = Iqvoc::Concept.base_class.new
150
- @concept.reverse_match_service = Services::ReverseMatchService.new(request.host, request.protocol)
150
+ @concept.reverse_match_service = Services::ReverseMatchService.new(request.host, request.protocol) if match_sync_enabled?
151
151
  @concept.assign_attributes(concept_params)
152
152
  @datasets = datasets_as_json
153
153
 
@@ -185,14 +185,14 @@ class ConceptsController < ApplicationController
185
185
  def update
186
186
  @concept = Iqvoc::Concept.base_class.by_origin(params[:id]).unpublished.last!
187
187
  authorize! :update, @concept
188
- @concept.reverse_match_service = Services::ReverseMatchService.new(request.host, request.protocol)
188
+ @concept.reverse_match_service = Services::ReverseMatchService.new(request.host, request.protocol) if match_sync_enabled?
189
189
 
190
190
  @datasets = datasets_as_json
191
191
 
192
192
  # set to_review to false if someone edits a concepts
193
193
  concept_params["to_review"] = "false"
194
194
 
195
- if @concept.update_attributes(concept_params)
195
+ if @concept.update(concept_params)
196
196
  flash[:success] = I18n.t('txt.controllers.versioned_concept.update_success')
197
197
  redirect_to concept_path(published: 0, id: @concept)
198
198
  else
@@ -247,4 +247,10 @@ class ConceptsController < ApplicationController
247
247
  # TODO: relations (XL only)
248
248
  }
249
249
  end
250
+
251
+ private
252
+
253
+ def match_sync_enabled?
254
+ Iqvoc.config['sources.create_reverse_matches']
255
+ end
250
256
  end
@@ -164,7 +164,7 @@ class HierarchyController < ApplicationController
164
164
  @relation_class = @relation_class.narrower_class unless direction == 'up'
165
165
 
166
166
  respond_to do |format|
167
- format.any(:html, :rdf, :ttl) { render 'hierarchy/show' }
167
+ format.any(:html, :rdf, :ttl, :nt) { render 'hierarchy/show' }
168
168
  end
169
169
  end
170
170
 
@@ -44,6 +44,8 @@ class SearchResultsController < ApplicationController
44
44
  param 'ds[]', String ,
45
45
  desc: 'Specifies one or more external data sets (connected thesauri)'\
46
46
  'to include in search.'
47
+ param :include_expired, String,
48
+ desc: 'Specifies if expired concepts should be included (defaults to false).'
47
49
  example <<-DOC
48
50
  GET /search.ttl
49
51
  200
@@ -176,5 +178,6 @@ class SearchResultsController < ApplicationController
176
178
  controller.params['qt'] = 'contains' if controller.params['qt'].nil?
177
179
  controller.params['for'] = 'all' if controller.params['for'].nil?
178
180
  controller.params['l'] = langs.keys if controller.params['l'].nil?
181
+ controller.params['include_expired'] = (controller.params['include_expired'] == "true")
179
182
  end
180
183
  end
@@ -15,7 +15,7 @@
15
15
  # limitations under the License.
16
16
 
17
17
  class TriplestoreSyncController < ApplicationController
18
- include RDFSyncService::Helper
18
+ include RdfSyncService::Helper
19
19
 
20
20
  def index
21
21
  authorize! :sync, :triplestore
@@ -40,7 +40,7 @@ class TriplestoreSyncController < ApplicationController
40
40
  end
41
41
 
42
42
  # per-class pagination
43
- @candidates = RDFSyncService.candidates.map do |records|
43
+ @candidates = RdfSyncService.candidates.map do |records|
44
44
  records.page(params[:page])
45
45
  end
46
46
  end
@@ -50,7 +50,7 @@ class UsersController < ApplicationController
50
50
  # could not change his own role and permissions
51
51
  params = can?(:manage, User) ? user_params : user_params.except(:active, :role, :comment)
52
52
 
53
- if @user.update_attributes(params)
53
+ if @user.update(params)
54
54
  flash[:success] = I18n.t('txt.controllers.users.successfully_updated')
55
55
  redirect_to can?(:manage, User) ? users_path : dashboard_path
56
56
  else
@@ -54,16 +54,19 @@ module ApplicationHelper
54
54
  end
55
55
  end
56
56
 
57
- def page_header(args = {})
57
+ def page_header(args = {}, &block)
58
58
  if title = args[:title]
59
59
  content_for(:title, strip_tags(title))
60
60
  end
61
61
 
62
62
  content_for :page_header do
63
63
  content_tag :div, class: 'page-header' do
64
- content_tag :h1 do
65
- ("#{title} #{content_tag(:small, args[:desc])}").html_safe
64
+ res = content_tag :h1 do
65
+ ("#{title} #{content_tag(:small, args[:desc]) if args[:desc]}").html_safe
66
66
  end
67
+ res << capture(&block) if block_given?
68
+
69
+ res
67
70
  end
68
71
  end
69
72
  end
@@ -82,7 +82,7 @@ module ConceptsHelper
82
82
  concept.never_published? ? t("txt.views.versioning.delete") : t("txt.views.versioning.delete_copy")
83
83
  end
84
84
 
85
- def concept_header(concept)
85
+ def concept_header(concept, &block)
86
86
  desc = concept.class.model_name.human
87
87
 
88
88
  if concept.expired_at
@@ -91,7 +91,7 @@ module ConceptsHelper
91
91
 
92
92
  title = concept.pref_label || concept.origin
93
93
 
94
- page_header title: title.to_s, desc: desc.html_safe
94
+ page_header(title: title.to_s, desc: desc.html_safe, &block)
95
95
  end
96
96
 
97
97
  private
@@ -120,7 +120,7 @@ module ConceptsHelper
120
120
  render(association_class.partial_name(concept), further_options.merge(concept: concept, klass: association_class))
121
121
  end
122
122
  end
123
- html = render partial: '/partials/match/panel', locals: { body: matches_html }
123
+ html = render partial: '/partials/match/panel', locals: { body: matches_html, klass: Match::SKOS::Base }
124
124
  if String.new(html).squish.present?
125
125
  ((hash[association_classes.first.view_section(concept)] ||= {})[association_classes.first.view_section_sort_key(concept)] ||= '') << html.html_safe
126
126
  end
@@ -1,13 +1,13 @@
1
1
  module LinkHelper
2
2
  def link_to_object(object, name, html_options = nil, &block)
3
3
  path = case object
4
- when Iqvoc::Concept.base_class
5
- concept_path(id: object)
6
- when Iqvoc::Collection.base_class
7
- collection_path(id: object)
8
- when Label::Base
9
- label_path(id: object)
10
- end
4
+ when Iqvoc::Concept.base_class
5
+ concept_url(id: object)
6
+ when Iqvoc::Collection.base_class
7
+ collection_url(id: object)
8
+ when Label::Base
9
+ label_url(id: object)
10
+ end
11
11
 
12
12
  link_to name, path, html_options, &block
13
13
  end
@@ -26,18 +26,13 @@ module NavigationHelper
26
26
  # :items - a list of hashes to be used as second-level navigation items
27
27
  def nav_items(items)
28
28
  items.map do |item|
29
- if !item.has_key?(:authorized?) || instance_eval(&item[:authorized?])
29
+ if nav_item_authorized?(item)
30
30
  if item[:items]
31
31
  content_tag :li, class: 'nav-item dropdown' do
32
- raw(link_to(element_value(item[:text]).html_safe +
33
- content_tag(:i), '#',
34
- class: 'nav-link dropdown-toggle',
35
- role: 'button',
36
- 'aria-haspopup': true,
37
- 'aria-expanded': false,
38
- data: { toggle: 'dropdown' }) +
32
+ raw(nav_link(item, has_children: true) +
39
33
  content_tag(:div,
40
- item[:items].map { |i| dropdown_nav_item(i) }.join.html_safe,
34
+ item[:items].select { |i| nav_item_authorized?(i) }
35
+ .map { |i| nav_link(i, class: 'dropdown-item') }.join.html_safe,
41
36
  class: 'dropdown-menu'))
42
37
  end
43
38
  else
@@ -90,14 +85,30 @@ module NavigationHelper
90
85
  active = item[:active?] ? instance_eval(&item[:active?]) : (item[:controller] ? params[:controller] == item[:controller] : false)
91
86
  css = 'nav-item'
92
87
  css << ' active' if active
93
- content_tag :li, link_to(element_value(item[:text]), element_value(item[:href]), class: 'nav-link'), class: css
88
+ content_tag :li, class: css do
89
+ nav_link(item)
90
+ end
94
91
  end
95
92
 
96
- def dropdown_nav_item(item)
93
+ def nav_link(item, opts = {})
97
94
  active = item[:active?] ? instance_eval(&item[:active?]) : (item[:controller] ? params[:controller] == item[:controller] : false)
98
- css = 'dropdown-item'
95
+
96
+ css = opts[:class] || 'nav-link'
99
97
  css << ' active' if active
100
- link_to(element_value(item[:text]), element_value(item[:href]), class: css)
98
+ css << ' dropdown-toggle' if opts[:has_children]
99
+
100
+ link_opts = {
101
+ class: css
102
+ }
103
+
104
+ dropdown_opts = {
105
+ role: 'button',
106
+ 'aria-haspopup': true,
107
+ 'aria-expanded': false
108
+ }
109
+ link_opts.merge!(dropdown_opts) if opts[:has_children]
110
+
111
+ link_to(element_value(item[:text]), element_value(item[:href] || '#'), link_opts)
101
112
  end
102
113
 
103
114
  def nav_item_authorized?(item)
@@ -41,7 +41,7 @@ class AbstractUser < ApplicationRecord
41
41
  config.crypto_provider = Authlogic::CryptoProviders::SCrypt
42
42
  end
43
43
 
44
- def self.default_role
44
+ def self.default_user_role
45
45
  'reader'
46
46
  end
47
47
 
@@ -358,6 +358,15 @@ class Concept::Base < ApplicationRecord
358
358
 
359
359
  # ********** Scopes
360
360
 
361
+ def self.expired(time = Time.now)
362
+ where(arel_table[:expired_at].lt(time))
363
+ end
364
+
365
+ def self.not_expired(time = Time.now)
366
+ col = arel_table[:expired_at]
367
+ where((col.eq(nil)).or(col.gteq(time)))
368
+ end
369
+
361
370
  def self.tops
362
371
  where(top_term: true)
363
372
  end
@@ -506,7 +515,7 @@ class Concept::Base < ApplicationRecord
506
515
  @labels ||= labelings.each_with_object({}) do |labeling, hash|
507
516
  ((hash[labeling.class.name.to_s] ||= {})[labeling.target.language] ||= []) << labeling.target if labeling.target
508
517
  end
509
- ((@labels && @labels[labeling_class] && @labels[labeling_class][lang]) || []).select{ |l| l.published? || !only_published }.sort_by(&:value)
518
+ ((@labels && @labels[labeling_class] && @labels[labeling_class][lang]) || []).select{ |l| l.published? || !only_published }
510
519
  end
511
520
 
512
521
  def related_concepts_for_relation_class(relation_class, only_published = true)
@@ -31,16 +31,6 @@ class Concept::SKOS::Base < Concept::Base
31
31
  return subject
32
32
  end
33
33
 
34
- # ********** Scopes
35
- def self.expired(time = Time.now)
36
- where(arel_table[:expired_at].lt(time))
37
- end
38
-
39
- def self.not_expired(time = Time.now)
40
- col = arel_table[:expired_at]
41
- where((col.eq(nil)).or(col.gteq(time)))
42
- end
43
-
44
34
  def self.recent(limit = 5)
45
35
  self
46
36
  .published
@@ -91,10 +91,12 @@ module Concept
91
91
  if validatable_for_publishing?
92
92
  alt_labels = alt_labelings.collect { |l| l.target }
93
93
 
94
- if alt_labels.include? pref_label
95
- errors.add :base,
96
- I18n.t('txt.models.concept.pref_label_defined_in_alt_labels',
97
- label: pref_label.value)
94
+ pref_labels.each do |pref_label|
95
+ if alt_labels.include? pref_label
96
+ errors.add :base,
97
+ I18n.t('txt.models.concept.pref_label_defined_in_alt_labels',
98
+ label: pref_label.value)
99
+ end
98
100
  end
99
101
  end
100
102
  end
@@ -37,7 +37,7 @@ module Versioning
37
37
 
38
38
  module ClassMethods
39
39
  def by_origin(origin)
40
- where(origin: origin)
40
+ default_scoped.where(origin: origin)
41
41
  end
42
42
 
43
43
  def published
@@ -1,6 +1,6 @@
1
1
  require 'faraday'
2
2
 
3
- class Dataset::Adaptors::Iqvoc::HTTPAdaptor
3
+ class Dataset::Adaptors::Iqvoc::HttpAdaptor
4
4
  DEFAULT_TIMEOUT = 5.freeze
5
5
  attr_reader :url
6
6
 
@@ -1,4 +1,4 @@
1
- class Dataset::Adaptors::Iqvoc::LabelAdaptor < Dataset::Adaptors::Iqvoc::HTTPAdaptor
1
+ class Dataset::Adaptors::Iqvoc::LabelAdaptor < Dataset::Adaptors::Iqvoc::HttpAdaptor
2
2
  def find(concept_url)
3
3
  path = URI.parse(concept_url).path
4
4
  if response = http_get(path)
@@ -1,4 +1,4 @@
1
- class Dataset::Adaptors::Iqvoc::SearchAdaptor < Dataset::Adaptors::Iqvoc::HTTPAdaptor
1
+ class Dataset::Adaptors::Iqvoc::SearchAdaptor < Dataset::Adaptors::Iqvoc::HttpAdaptor
2
2
  def search(raw_params = {})
3
3
  languages = raw_params.fetch(:languages, I18n.locale)
4
4
  languages = Array.wrap(languages).flatten.join(',')
@@ -69,16 +69,20 @@ class Labeling::SKOS::Base < Labeling::Base
69
69
  scope = scope.includes(:owner)
70
70
 
71
71
  scope = case params[:for]
72
- when 'concept'
73
- scope.where('concepts.type' => Iqvoc::Concept.base_class_name).
74
- references(:concepts)
75
- when 'collection'
76
- scope.where('concepts.type' => Iqvoc::Collection.base_class_name).
77
- references(:concepts)
78
- else
79
- # no additional conditions
80
- scope
81
- end
72
+ when 'concept'
73
+ scope.merge(Iqvoc::Concept.base_class.published)
74
+ when 'collection'
75
+ scope.merge(Iqvoc::Collection.base_class.published)
76
+ else
77
+ # no additional conditions
78
+ scope
79
+ end
80
+
81
+ scope = if params[:include_expired]
82
+ scope.merge(Concept::Base.not_expired).or(scope.merge(Concept::Base.expired))
83
+ else
84
+ scope.merge(Concept::Base.not_expired)
85
+ end
82
86
 
83
87
  if params[:change_note_date_from].present? || params[:change_note_date_to].present?
84
88
  change_note_relation = Iqvoc.change_note_class_name.to_relation_name
@@ -15,7 +15,4 @@
15
15
  # limitations under the License.
16
16
 
17
17
  class UserSession < Authlogic::Session::Base
18
- def to_key
19
- new_record? ? nil : [ self.send(self.class.primary_key) ]
20
- end
21
18
  end
@@ -1,6 +1,6 @@
1
1
  # encoding: UTF-8
2
2
 
3
- class RDFSyncService
3
+ class RdfSyncService
4
4
  delegate :url_helpers, to: 'Rails.application.routes'
5
5
 
6
6
  ADAPTORS = { # XXX: inappropriate?
@@ -105,11 +105,11 @@ class RDFSyncService
105
105
  end
106
106
  end
107
107
 
108
- module RDFSyncService::Helper # TODO: rename -- XXX: does not belong here!?
108
+ module RdfSyncService::Helper # TODO: rename -- XXX: does not belong here!?
109
109
  def triplestore_syncer
110
110
  base_url = root_url(lang: nil) # XXX: brittle in the face of future changes?
111
111
 
112
- return RDFSyncService.new(base_url, Iqvoc.config['triplestore.url'],
112
+ return RdfSyncService.new(base_url, Iqvoc.config['triplestore.url'],
113
113
  username: Iqvoc.config['triplestore.username'].presence,
114
114
  password: Iqvoc.config['triplestore.password'].presence,
115
115
  view_context: view_context) # fugly, but necessary; cf. RDFSync#serialize
@@ -2,7 +2,9 @@
2
2
  <p>
3
3
  <%= link_to result.label.to_s, rdf_path(result.concept, lang: nil, format: nil),
4
4
  alt: result.concept.origin, data: { 'resource-path': result.path, 'resource-url': rdf_url(result.concept, lang: nil, format: nil) }, class: 'concept-item-link' %>
5
- <a href="<%= glance_concept_url(result.concept, format: :html) %>" class="dashboard-glance-link"><i class="fa fa-search-plus"></i></a>
5
+ <% if Iqvoc.concept_modal_preview_enabled? %>
6
+ <a href="<%= glance_concept_url(result.concept, format: :html) %>" class="dashboard-glance-link"><i class="fa fa-search-plus"></i></a>
7
+ <% end %>
6
8
 
7
9
  <% if result.concept.additional_info.present? %>
8
10
  <span class="additional_info">(<%= result.concept.additional_info %>)</span>