diff --git a/.gitignore b/.gitignore index 1829baee1994f5fae01a0aa8b2ef48750150967a..553281cad4c6e899d7a643d1f49f4ae9943be0ce 100644 --- a/.gitignore +++ b/.gitignore @@ -15,7 +15,10 @@ Gemfile.lock /.idea /vendor /log +/config/env_vars.sh /db/schema.rb /db/development.sqlite3 /db/test.sqlite3 /public/assets +/config/orientdb.yml +/config/dspace.yml diff --git a/Gemfile b/Gemfile index 1039b92c5f9861d60d2bc52222bf0b9db8c93f34..7a7f64807ef4bf2ae8c2b80efd1726a3e3d43aa2 100644 --- a/Gemfile +++ b/Gemfile @@ -35,30 +35,15 @@ gem 'orientdb4r' # web server gem 'puma' -gem 'rufus-scheduler' - -group :development, :test do - gem 'better_errors' - # Call 'byebug' anywhere in the code to stop execution and get a debugger console - gem 'byebug' - - # Access an IRB console on exception pages or by using <%= console %> in views - gem 'web-console', '~> 2.0' - - # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring - gem 'spring' - - gem 'sqlite3' -end - -group :test do - gem 'shoulda' - gem 'shoulda-callback-matchers', '~> 1.1.1' -end +# scheduler +gem 'whenever', :require => false # authentication gem 'devise' +# files +gem 'paperclip' + # enable login via rest gem 'devise_token_auth' gem 'rack-cors', require: 'rack/cors' @@ -66,6 +51,9 @@ gem 'rack-cors', require: 'rack/cors' #bootstrap gem 'bootstrap-sass' +# select box used in search +gem 'select2-rails' + #Gruff (graphs and charts) gem 'rmagick' gem 'gruff' @@ -82,17 +70,44 @@ gem 'chart-js-rails' #depoyment gem 'mina' +# management visual framework gem 'locastyle' + +# paginate results gem 'will_paginate', '~> 3.0.5' -# profilers +# evaluate source code gem 'rubycritic', require: false -gem 'rack-mini-profiler' -gem 'bullet' # docs gem 'rdoc' -#JavaScript runtime -gem 'execjs' -gem 'therubyracer' \ No newline at end of file +group :development, :test do + # profiler + gem 'rack-mini-profiler' + gem 'flamegraph' + # reduce queries - https://github.com/flyerhzm/bullet + gem 'bullet' + + gem 'better_errors' + # Call 'byebug' anywhere in the code to stop execution and get a debugger console + gem 'byebug' + + # Access an IRB console on exception pages or by using <%= console %> in views + gem 'web-console', '~> 2.0' + + # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring + gem 'spring' + + gem 'sqlite3' + + #JavaScript runtime + gem 'execjs' + gem 'therubyracer' + +end + +group :test do + gem 'shoulda' + gem 'shoulda-callback-matchers', '~> 1.1.1' +end diff --git a/Gemfile.lock b/Gemfile.lock index 3dbd0d2954efd3227c785199a2a06bfd44613b73..5581e23b9f1dd5365b99fcc3dfda6bf81f5982e1 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -66,6 +66,11 @@ GEM byebug (6.0.2) chart-js-rails (0.0.9) railties (> 3.1) + chronic (0.10.2) + climate_control (0.0.3) + activesupport (>= 3.0) + cocaine (0.5.7) + climate_control (>= 0.0.3, < 1.0) coderay (1.1.0) coercible (1.0.0) descendants_tracker (~> 0.0.1) @@ -102,6 +107,11 @@ GEM equalizer (0.0.11) erubis (2.7.0) execjs (2.6.0) + fast_stack (0.1.0) + rake + rake-compiler + flamegraph (0.1.0) + fast_stack flay (2.4.0) ruby_parser (~> 3.0) sexp_processor (~> 4.0) @@ -136,6 +146,7 @@ GEM memoizable (0.4.2) thread_safe (~> 0.3, >= 0.3.1) mime-types (2.6.2) + mimemagic (0.3.0) mina (0.3.7) open4 (~> 1.3.4) rake @@ -149,6 +160,12 @@ GEM orientdb4r (0.5.1) rest-client (~> 1.7) orm_adapter (0.5.0) + paperclip (4.3.1) + activemodel (>= 3.2.0) + activesupport (>= 3.2.0) + cocaine (~> 0.5.5) + mime-types + mimemagic (= 0.3.0) parser (2.2.2.6) ast (>= 1.1, < 3.0) pg (0.18.3) @@ -186,6 +203,8 @@ GEM thor (>= 0.18.1, < 2.0) rainbow (2.0.0) rake (10.4.2) + rake-compiler (0.9.5) + rake rdoc (4.2.0) reek (1.6.5) parser (~> 2.2.0.pre.7) @@ -209,7 +228,6 @@ GEM parser (>= 2.2.0, < 3.0) reek (= 1.6.5) virtus (~> 1.0) - rufus-scheduler (3.1.4) sass (3.4.18) sass-rails (5.0.4) railties (>= 4.0.0, < 5.0) @@ -220,6 +238,8 @@ GEM sdoc (0.4.1) json (~> 1.7, >= 1.7.7) rdoc (~> 4.0) + select2-rails (4.0.0) + thor (~> 0.14) sexp_processor (4.6.0) shoulda (3.5.0) shoulda-context (~> 1.0, >= 1.0.1) @@ -274,6 +294,8 @@ GEM binding_of_caller (>= 0.7.2) railties (>= 4.0) sprockets-rails (>= 2.0, < 4.0) + whenever (0.9.4) + chronic (>= 0.6.3) will_paginate (3.0.7) PLATFORMS @@ -291,6 +313,7 @@ DEPENDENCIES devise_token_auth dspace_rest_client (~> 1.1.0) execjs + flamegraph gruff jbuilder (~> 2.0) jquery-rails @@ -298,6 +321,7 @@ DEPENDENCIES locastyle mina orientdb4r + paperclip pg puma rack-cors @@ -307,9 +331,9 @@ DEPENDENCIES rmagick rsolr (~> 1.0.12) rubycritic - rufus-scheduler sass-rails (~> 5.0) sdoc (~> 0.4.0) + select2-rails shoulda shoulda-callback-matchers (~> 1.1.1) spring @@ -318,6 +342,7 @@ DEPENDENCIES turbolinks uglifier (>= 1.3.0) web-console (~> 2.0) + whenever will_paginate (~> 3.0.5) BUNDLED WITH diff --git a/app/assets/images/missing.svg b/app/assets/images/missing.svg new file mode 100644 index 0000000000000000000000000000000000000000..39e55e773a922b5f1a24e0ad5acf76ad0f722223 --- /dev/null +++ b/app/assets/images/missing.svg @@ -0,0 +1,227 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<!-- Created with Inkscape (http://www.inkscape.org/) --> +<svg + xmlns:dc="http://purl.org/dc/elements/1.1/" + xmlns:cc="http://web.resource.org/cc/" + xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" + xmlns:svg="http://www.w3.org/2000/svg" + xmlns="http://www.w3.org/2000/svg" + xmlns:xlink="http://www.w3.org/1999/xlink" + xmlns:sodipodi="http://inkscape.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + inkscape:export-ydpi="90.000000" + inkscape:export-xdpi="90.000000" + inkscape:export-filename="/home/jimmac/Desktop/wi-fi.png" + width="48px" + height="48px" + id="svg11300" + sodipodi:version="0.32" + inkscape:version="0.43+devel" + sodipodi:docbase="/home/tigert/cvs/freedesktop.org/tango-icon-theme/scalable/status" + sodipodi:docname="image-missing.svg" + inkscape:output_extension="org.inkscape.output.svg.inkscape"> + <defs + id="defs3"> + <linearGradient + id="linearGradient3563"> + <stop + style="stop-color:#ffffff;stop-opacity:1;" + offset="0" + id="stop3565" /> + <stop + style="stop-color:#939393;stop-opacity:1;" + offset="1" + id="stop3567" /> + </linearGradient> + <linearGradient + id="linearGradient3555"> + <stop + style="stop-color:#f2f2f2;stop-opacity:1;" + offset="0" + id="stop3557" /> + <stop + style="stop-color:#d0d0d0;stop-opacity:1;" + offset="1" + id="stop3559" /> + </linearGradient> + <linearGradient + style="stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667" + y2="36.0328" + x2="31.0813" + y1="3.7319" + x1="12.4873" + gradientUnits="userSpaceOnUse" + id="aigrd1"> + <stop + id="stop16177" + style="stop-color:#D2D2D2;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667" + offset="0" /> + <stop + id="stop16179" + style="stop-color:#EDEDED;stroke-dasharray:none;stroke-miterlimit:4.0000000;stroke-width:1.2166667" + offset="1" /> + </linearGradient> + <linearGradient + inkscape:collect="always" + xlink:href="#aigrd1" + id="linearGradient16280" + gradientUnits="userSpaceOnUse" + x1="12.4873" + y1="3.7319" + x2="31.0813" + y2="36.0328" + gradientTransform="matrix(1.211383,0.000000,0.000000,1.211383,-2.021433,0.189894)" /> + <linearGradient + inkscape:collect="always" + id="linearGradient12129"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop12131" /> + <stop + style="stop-color:#000000;stop-opacity:0;" + offset="1" + id="stop12133" /> + </linearGradient> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient12129" + id="radialGradient12135" + cx="24.218407" + cy="41.636040" + fx="24.218407" + fy="41.636040" + r="22.097088" + gradientTransform="matrix(1.000000,0.000000,0.000000,0.184000,0.000000,33.97501)" + gradientUnits="userSpaceOnUse" /> + <radialGradient + inkscape:collect="always" + xlink:href="#linearGradient3555" + id="radialGradient3561" + cx="26.728037" + cy="38.34853" + fx="26.728037" + fy="38.34853" + r="17.926361" + gradientTransform="matrix(1.848501,-1.547102e-23,1.227926e-24,1.289078,-21.29931,-13.68176)" + gradientUnits="userSpaceOnUse" /> + <linearGradient + inkscape:collect="always" + xlink:href="#linearGradient3563" + id="linearGradient3569" + x1="28.107494" + y1="34.868584" + x2="22.169001" + y2="9.8661737" + gradientUnits="userSpaceOnUse" + gradientTransform="translate(0.000000,0.883885)" /> + </defs> + <sodipodi:namedview + stroke="#cc0000" + fill="#cc0000" + id="base" + pagecolor="#ffffff" + bordercolor="#666666" + borderopacity="0.25490196" + inkscape:pageopacity="0.0" + inkscape:pageshadow="2" + inkscape:zoom="5.6568542" + inkscape:cx="21.313886" + inkscape:cy="27.870334" + inkscape:current-layer="layer1" + showgrid="false" + inkscape:grid-bbox="true" + inkscape:document-units="px" + inkscape:showpageshadow="false" + inkscape:window-width="770" + inkscape:window-height="630" + inkscape:window-x="180" + inkscape:window-y="85" /> + <metadata + id="metadata4"> + <rdf:RDF> + <cc:Work + rdf:about=""> + <dc:format>image/svg+xml</dc:format> + <dc:type + rdf:resource="http://purl.org/dc/dcmitype/StillImage" /> + <dc:creator> + <cc:Agent> + <dc:title>Jakub Steiner</dc:title> + </cc:Agent> + </dc:creator> + <dc:source>http://jimmac.musichall.cz</dc:source> + <cc:license + rdf:resource="http://creativecommons.org/licenses/by-sa/2.0/" /> + <dc:title>Broken Image</dc:title> + <dc:subject> + <rdf:Bag> + <rdf:li>image</rdf:li> + <rdf:li>picture</rdf:li> + <rdf:li>photo</rdf:li> + <rdf:li>missing</rdf:li> + <rdf:li>broken</rdf:li> + <rdf:li>404</rdf:li> + </rdf:Bag> + </dc:subject> + </cc:Work> + <cc:License + rdf:about="http://creativecommons.org/licenses/by-sa/2.0/"> + <cc:permits + rdf:resource="http://web.resource.org/cc/Reproduction" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/Distribution" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/Notice" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/Attribution" /> + <cc:permits + rdf:resource="http://web.resource.org/cc/DerivativeWorks" /> + <cc:requires + rdf:resource="http://web.resource.org/cc/ShareAlike" /> + </cc:License> + </rdf:RDF> + </metadata> + <g + id="layer1" + inkscape:label="Layer 1" + inkscape:groupmode="layer"> + <path + sodipodi:type="arc" + style="opacity:0.52763821;color:#000000;fill:url(#radialGradient12135);fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1;stroke-linecap:butt;stroke-linejoin:miter;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:0.61658032;visibility:visible;display:block" + id="path12127" + sodipodi:cx="24.218407" + sodipodi:cy="41.63604" + sodipodi:rx="22.097088" + sodipodi:ry="4.0658641" + d="M 46.315495 41.63604 A 22.097088 4.0658641 0 1 1 2.1213188,41.63604 A 22.097088 4.0658641 0 1 1 46.315495 41.63604 z" + transform="translate(0.176777,0.900834)" /> + <path + id="path16181" + d="M 45.343675,39.903974 C 45.343675,41.842189 43.768877,43.416987 41.830663,43.416987 L 6.3371177,43.416987 C 4.3989037,43.416987 2.8241047,41.842189 2.8241047,39.903974 L 2.8241047,7.0947821 C 2.8241047,5.1565681 4.3989037,3.581769 6.3371177,3.581769 L 41.830663,3.581769 C 43.768877,3.581769 45.343675,5.1565681 45.343675,7.0947821 L 45.343675,39.903974 L 45.343675,39.903974 z " + style="fill:url(#linearGradient16280);fill-rule:nonzero;stroke:#646464;stroke-width:1;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" + sodipodi:nodetypes="cccccccccc" /> + <path + style="fill:url(#radialGradient3561);fill-opacity:1;fill-rule:nonzero;stroke:url(#linearGradient3569);stroke-width:0.99999923;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.61658032" + d="M 41.467991,35.25247 L 6.6152692,35.25247 L 6.6152692,11.250058 L 41.467991,11.250058 L 41.467991,35.25247 L 41.467991,35.25247 z " + id="path12125" + sodipodi:nodetypes="cccccc" /> + <path + style="fill:none;fill-rule:nonzero;stroke:#ffffff;stroke-width:1.00000012;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:0.86010359" + d="M 44.480104,39.32848 C 44.480104,41.187964 43.499604,42.345241 41.640121,42.345241 L 6.6160507,42.345241 C 4.7565677,42.345241 3.6876787,41.276353 3.6876787,39.416869 L 3.6876787,7.5970548 C 3.6876787,5.737571 5.1985087,4.403517 7.0579927,4.403517 L 41.198179,4.403517 C 43.057662,4.403517 44.480104,5.737571 44.480104,7.5970548 L 44.480104,38.974927 L 44.480104,39.32848 z " + id="path11975" + sodipodi:nodetypes="cccccccccc" /> + <g + id="g3551" + transform="matrix(0.772431,0.000000,0.000000,0.772431,10.05699,9.902145)"> + <path + d="M 11.318692,9.2240568 C 16.641997,14.693047 22.769247,19.123651 29.210664,22.931105 L 27.441568,24.159843 C 21.101863,20.04489 15.052508,15.498993 9.1840818,10.652117 L 11.318692,9.2240568 z " + id="path2565" + style="opacity:1;color:#000000;fill:#cc0000;fill-opacity:1;fill-rule:nonzero;stroke:#cc0000;stroke-width:2.58922911;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + <path + d="M 26.73892,8.9210568 C 21.867631,15.95255 15.247359,21.081199 7.9065151,25.28163 L 10.087564,23.520856 C 8.7241111,24.379297 25.574485,11.804168 23.852075,10.207903 L 26.73892,8.9210568 z " + id="path2575" + style="opacity:1;color:#000000;fill:#cc0000;fill-opacity:1;fill-rule:nonzero;stroke:#cc0000;stroke-width:2.58922839;stroke-linecap:round;stroke-linejoin:round;marker:none;marker-start:none;marker-mid:none;marker-end:none;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;visibility:visible;display:inline;overflow:visible" /> + </g> + </g> +</svg> diff --git a/app/assets/javascripts/application.js b/app/assets/javascripts/application.js index 8a653cb364e172b3ed9420d3255de776c3cd4a7f..c1e8f708f3e00a670b82b076568ffd37d1350b43 100644 --- a/app/assets/javascripts/application.js +++ b/app/assets/javascripts/application.js @@ -15,15 +15,33 @@ //= require turbolinks //= require jquery.turbolinks //= require bootstrap-sprockets +//= require select2 //= require_tree ./application -//= require_tree ./search + +/* +$('h2').each(function(index,value) { + $(this).css('fontSize', (parseFloat($(this).css('fontSize')) + (size_c - 15)) + 'px'); +}); +$('h3').each(function(index,value) { + $(this).css('fontSize', (parseFloat($(this).css('fontSize')) + (size_c - 15)) + 'px'); +}); +$('h4').each(function(index,value) { + $(this).css('fontSize', (parseFloat($(this).css('fontSize')) + (size_c - 15)) + 'px'); +}); +$('h5').each(function(index,value) { + $(this).css('fontSize', (parseFloat($(this).css('fontSize')) + (size_c - 15)) + 'px'); +}); +$('h6').each(function(index,value) { + $(this).css('fontSize', (parseFloat($(this).css('fontSize')) + (size_c - 15)) + 'px'); +}); +*/ $(document).ready(function(){ size_c = readCookie('fontSize'); if (size_c != null) { document.body.style.fontSize = size_c + 'px'; $('.dropdown-menu').css('fontSize', document.body.style.fontSize); - $('h1').each(function(index,value) { + $('h1,h2,h3,h4,h5,h6').each(function(index,value) { $(this).css('fontSize', (parseFloat($(this).css('fontSize')) + (size_c - 15)) + 'px'); }); } @@ -62,22 +80,7 @@ function resizeText(increment) { if (size < 25) { document.body.style.fontSize = parseFloat(document.body.style.fontSize) + increment + "px"; $('.dropdown-menu').css('fontSize', document.body.style.fontSize); - $('h1').each(function(index,value) { - $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px'); - }); - $('h2').each(function(index,value) { - $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px'); - }); - $('h3').each(function(index,value) { - $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px'); - }); - $('h4').each(function(index,value) { - $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px'); - }); - $('h5').each(function(index,value) { - $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px'); - }); - $('h6').each(function(index,value) { + $('h1 ,h2 ,h3, h4, h5 ,h6').each(function(index,value) { $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px'); }); } @@ -85,22 +88,7 @@ function resizeText(increment) { if (size > 10) { document.body.style.fontSize = parseFloat(document.body.style.fontSize) + increment + "px"; $('.dropdown-menu').css('fontSize', document.body.style.fontSize); - $('h1').each(function(index,value) { - $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px'); - }); - $('h2').each(function(index,value) { - $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px'); - }); - $('h3').each(function(index,value) { - $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px'); - }); - $('h4').each(function(index,value) { - $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px'); - }); - $('h5').each(function(index,value) { - $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px'); - }); - $('h6').each(function(index,value) { + $('h1 ,h2 ,h3, h4, h5 ,h6').each(function(index,value) { $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px'); }); } @@ -109,73 +97,42 @@ function resizeText(increment) { size = parseFloat(document.body.style.fontSize); document.body.style.fontSize = '15px'; $('.dropdown-menu').css('fontSize', document.body.style.fontSize); - $('h1').each(function(index,value) { - $(this).css('fontSize',Math.abs(parseFloat($(this).css('fontSize'))-(size-15)) + 'px'); - }); - $('h2').each(function(index,value) { - $(this).css('fontSize',Math.abs(parseFloat($(this).css('fontSize'))-(size-15)) + 'px'); - }); - $('h3').each(function(index,value) { - $(this).css('fontSize',Math.abs(parseFloat($(this).css('fontSize'))-(size-15)) + 'px'); - }); - $('h4').each(function(index,value) { - $(this).css('fontSize',Math.abs(parseFloat($(this).css('fontSize'))-(size-15)) + 'px'); - }); - $('h5').each(function(index,value) { - $(this).css('fontSize',Math.abs(parseFloat($(this).css('fontSize'))-(size-15)) + 'px'); - }); - $('h6').each(function(index,value) { - $(this).css('fontSize',Math.abs(parseFloat($(this).css('fontSize'))-(size-15)) + 'px'); + $('h1 ,h2 ,h3, h4, h5 ,h6').each(function(index,value) { + $(this).css('fontSize', parseFloat($(this).css('fontSize')) + increment + 'px'); }); } createCookie('fontSize', parseFloat(document.body.style.fontSize), 365); } function changeContrast() { - if (readCookie('contrast') == null || readCookie('contrast') == "true") { - createCookie('contrast',"false",0); - } else { + if (readCookie('contrast') == null || readCookie('contrast') == "false") { createCookie('contrast',"true",0); + } else { + createCookie('contrast',"false",0); } Contrast(); } function Contrast() { contrast_c = readCookie('contrast'); - if (contrast_c == null || contrast_c != "false"){ - $('body').removeClass("contraste"); - $('body').removeClass("alto-contraste"); - $('.searchbar').removeClass("searchbar-contraste"); - $('header a').removeClass("link-contraste"); - $('#footer').removeClass("footer-contraste"); - $('#footer div').removeClass("footer-contraste"); - $('.dropdown-menu').removeClass("dropdown-menu-contrast"); - $('.general_highlights').removeClass("general_highlights-contrast"); - $(".nav > li > a").css('background-color','none'); - $(".nav > li > a").hover( - function(){ - $(this).css('background-color','#eee') - },function(){ - $(this).css('background-color','transparent') - } - ); + if (contrast_c == null || contrast_c != "true"){ + $('body').addClass('contraste'); + $('.barra-brasil').addClass('contraste'); + $('.search-bar').addClass('contraste'); + $('.search-bar').css('border-top','2px solid white'); + $('#menu-bar').addClass('menu-bar-contrast'); + $('.object-vertical .panel').addClass('contraste'); + $('.navbar').addClass('contraste'); + $('.well').addClass('contraste'); }else { - $('body').addClass("contraste"); - $('body').addClass("alto-contraste"); - $('.searchbar').addClass("searchbar-contraste"); - $('header a').addClass("link-contraste"); - $('#footer').addClass("footer-contraste"); - $('#footer div').addClass("footer-contraste"); - $('.dropdown-menu').addClass("dropdown-menu-contrast"); - $('.general_highlights').addClass("general_highlights-contrast"); - $(".nav > li > a").css('background-color','#transparent'); - $(".nav > li > a").hover( - function(){ - $(this).css('background-color','#000'); - }, function() { - $(this).css('background-color','#transparent') - } - ); + $('body').removeClass('contraste'); + $('.barra-brasil').removeClass('contraste'); + $('.search-bar').removeClass('contraste'); + $('.search-bar').css('border-top','none'); + $('#menu-bar').removeClass('menu-bar-contrast'); + $('.object-vertical .panel').removeClass('contraste'); + $('.navbar').removeClass('contraste'); + $('.well').removeClass('contraste'); } } diff --git a/app/assets/javascripts/search/select2.full.js b/app/assets/javascripts/search/select2.full.js deleted file mode 100644 index dd0e8bc74d679445338dc62a19ee756bb3bc2974..0000000000000000000000000000000000000000 --- a/app/assets/javascripts/search/select2.full.js +++ /dev/null @@ -1,6114 +0,0 @@ -/*! - * Select2 4.0.0 - * https://select2.github.io - * - * Released under the MIT license - * https://github.com/select2/select2/blob/master/LICENSE.md - */ -(function (factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['jquery'], factory); - } else if (typeof exports === 'object') { - // Node/CommonJS - factory(require('jquery')); - } else { - // Browser globals - factory(jQuery); - } -}(function (jQuery) { - // This is needed so we can catch the AMD loader configuration and use it - // The inner file should be wrapped (by `banner.start.js`) in a function that - // returns the AMD loader references. - var S2 = -(function () { - // Restore the Select2 AMD loader so it can be used - // Needed mostly in the language files, where the loader is not inserted - if (jQuery && jQuery.fn && jQuery.fn.select2 && jQuery.fn.select2.amd) { - var S2 = jQuery.fn.select2.amd; - } -var S2;(function () { if (!S2 || !S2.requirejs) { -if (!S2) { S2 = {}; } else { require = S2; } -/** - * @license almond 0.2.9 Copyright (c) 2011-2014, The Dojo Foundation All Rights Reserved. - * Available via the MIT or new BSD license. - * see: http://github.com/jrburke/almond for details - */ -//Going sloppy to avoid 'use strict' string cost, but strict practices should -//be followed. -/*jslint sloppy: true */ -/*global setTimeout: false */ - -var requirejs, require, define; -(function (undef) { - var main, req, makeMap, handlers, - defined = {}, - waiting = {}, - config = {}, - defining = {}, - hasOwn = Object.prototype.hasOwnProperty, - aps = [].slice, - jsSuffixRegExp = /\.js$/; - - function hasProp(obj, prop) { - return hasOwn.call(obj, prop); - } - - /** - * Given a relative module name, like ./something, normalize it to - * a real name that can be mapped to a path. - * @param {String} name the relative name - * @param {String} baseName a real name that the name arg is relative - * to. - * @returns {String} normalized name - */ - function normalize(name, baseName) { - var nameParts, nameSegment, mapValue, foundMap, lastIndex, - foundI, foundStarMap, starI, i, j, part, - baseParts = baseName && baseName.split("/"), - map = config.map, - starMap = (map && map['*']) || {}; - - //Adjust any relative paths. - if (name && name.charAt(0) === ".") { - //If have a base name, try to normalize against it, - //otherwise, assume it is a top-level require that will - //be relative to baseUrl in the end. - if (baseName) { - //Convert baseName to array, and lop off the last part, - //so that . matches that "directory" and not name of the baseName's - //module. For instance, baseName of "one/two/three", maps to - //"one/two/three.js", but we want the directory, "one/two" for - //this normalization. - baseParts = baseParts.slice(0, baseParts.length - 1); - name = name.split('/'); - lastIndex = name.length - 1; - - // Node .js allowance: - if (config.nodeIdCompat && jsSuffixRegExp.test(name[lastIndex])) { - name[lastIndex] = name[lastIndex].replace(jsSuffixRegExp, ''); - } - - name = baseParts.concat(name); - - //start trimDots - for (i = 0; i < name.length; i += 1) { - part = name[i]; - if (part === ".") { - name.splice(i, 1); - i -= 1; - } else if (part === "..") { - if (i === 1 && (name[2] === '..' || name[0] === '..')) { - //End of the line. Keep at least one non-dot - //path segment at the front so it can be mapped - //correctly to disk. Otherwise, there is likely - //no path mapping for a path starting with '..'. - //This can still fail, but catches the most reasonable - //uses of .. - break; - } else if (i > 0) { - name.splice(i - 1, 2); - i -= 2; - } - } - } - //end trimDots - - name = name.join("/"); - } else if (name.indexOf('./') === 0) { - // No baseName, so this is ID is resolved relative - // to baseUrl, pull off the leading dot. - name = name.substring(2); - } - } - - //Apply map config if available. - if ((baseParts || starMap) && map) { - nameParts = name.split('/'); - - for (i = nameParts.length; i > 0; i -= 1) { - nameSegment = nameParts.slice(0, i).join("/"); - - if (baseParts) { - //Find the longest baseName segment match in the config. - //So, do joins on the biggest to smallest lengths of baseParts. - for (j = baseParts.length; j > 0; j -= 1) { - mapValue = map[baseParts.slice(0, j).join('/')]; - - //baseName segment has config, find if it has one for - //this name. - if (mapValue) { - mapValue = mapValue[nameSegment]; - if (mapValue) { - //Match, update name to the new value. - foundMap = mapValue; - foundI = i; - break; - } - } - } - } - - if (foundMap) { - break; - } - - //Check for a star map match, but just hold on to it, - //if there is a shorter segment match later in a matching - //config, then favor over this star map. - if (!foundStarMap && starMap && starMap[nameSegment]) { - foundStarMap = starMap[nameSegment]; - starI = i; - } - } - - if (!foundMap && foundStarMap) { - foundMap = foundStarMap; - foundI = starI; - } - - if (foundMap) { - nameParts.splice(0, foundI, foundMap); - name = nameParts.join('/'); - } - } - - return name; - } - - function makeRequire(relName, forceSync) { - return function () { - //A version of a require function that passes a moduleName - //value for items that may need to - //look up paths relative to the moduleName - return req.apply(undef, aps.call(arguments, 0).concat([relName, forceSync])); - }; - } - - function makeNormalize(relName) { - return function (name) { - return normalize(name, relName); - }; - } - - function makeLoad(depName) { - return function (value) { - defined[depName] = value; - }; - } - - function callDep(name) { - if (hasProp(waiting, name)) { - var args = waiting[name]; - delete waiting[name]; - defining[name] = true; - main.apply(undef, args); - } - - if (!hasProp(defined, name) && !hasProp(defining, name)) { - throw new Error('No ' + name); - } - return defined[name]; - } - - //Turns a plugin!resource to [plugin, resource] - //with the plugin being undefined if the name - //did not have a plugin prefix. - function splitPrefix(name) { - var prefix, - index = name ? name.indexOf('!') : -1; - if (index > -1) { - prefix = name.substring(0, index); - name = name.substring(index + 1, name.length); - } - return [prefix, name]; - } - - /** - * Makes a name map, normalizing the name, and using a plugin - * for normalization if necessary. Grabs a ref to plugin - * too, as an optimization. - */ - makeMap = function (name, relName) { - var plugin, - parts = splitPrefix(name), - prefix = parts[0]; - - name = parts[1]; - - if (prefix) { - prefix = normalize(prefix, relName); - plugin = callDep(prefix); - } - - //Normalize according - if (prefix) { - if (plugin && plugin.normalize) { - name = plugin.normalize(name, makeNormalize(relName)); - } else { - name = normalize(name, relName); - } - } else { - name = normalize(name, relName); - parts = splitPrefix(name); - prefix = parts[0]; - name = parts[1]; - if (prefix) { - plugin = callDep(prefix); - } - } - - //Using ridiculous property names for space reasons - return { - f: prefix ? prefix + '!' + name : name, //fullName - n: name, - pr: prefix, - p: plugin - }; - }; - - function makeConfig(name) { - return function () { - return (config && config.config && config.config[name]) || {}; - }; - } - - handlers = { - require: function (name) { - return makeRequire(name); - }, - exports: function (name) { - var e = defined[name]; - if (typeof e !== 'undefined') { - return e; - } else { - return (defined[name] = {}); - } - }, - module: function (name) { - return { - id: name, - uri: '', - exports: defined[name], - config: makeConfig(name) - }; - } - }; - - main = function (name, deps, callback, relName) { - var cjsModule, depName, ret, map, i, - args = [], - callbackType = typeof callback, - usingExports; - - //Use name if no relName - relName = relName || name; - - //Call the callback to define the module, if necessary. - if (callbackType === 'undefined' || callbackType === 'function') { - //Pull out the defined dependencies and pass the ordered - //values to the callback. - //Default to [require, exports, module] if no deps - deps = !deps.length && callback.length ? ['require', 'exports', 'module'] : deps; - for (i = 0; i < deps.length; i += 1) { - map = makeMap(deps[i], relName); - depName = map.f; - - //Fast path CommonJS standard dependencies. - if (depName === "require") { - args[i] = handlers.require(name); - } else if (depName === "exports") { - //CommonJS module spec 1.1 - args[i] = handlers.exports(name); - usingExports = true; - } else if (depName === "module") { - //CommonJS module spec 1.1 - cjsModule = args[i] = handlers.module(name); - } else if (hasProp(defined, depName) || - hasProp(waiting, depName) || - hasProp(defining, depName)) { - args[i] = callDep(depName); - } else if (map.p) { - map.p.load(map.n, makeRequire(relName, true), makeLoad(depName), {}); - args[i] = defined[depName]; - } else { - throw new Error(name + ' missing ' + depName); - } - } - - ret = callback ? callback.apply(defined[name], args) : undefined; - - if (name) { - //If setting exports via "module" is in play, - //favor that over return value and exports. After that, - //favor a non-undefined return value over exports use. - if (cjsModule && cjsModule.exports !== undef && - cjsModule.exports !== defined[name]) { - defined[name] = cjsModule.exports; - } else if (ret !== undef || !usingExports) { - //Use the return value from the function. - defined[name] = ret; - } - } - } else if (name) { - //May just be an object definition for the module. Only - //worry about defining if have a module name. - defined[name] = callback; - } - }; - - requirejs = require = req = function (deps, callback, relName, forceSync, alt) { - if (typeof deps === "string") { - if (handlers[deps]) { - //callback in this case is really relName - return handlers[deps](callback); - } - //Just return the module wanted. In this scenario, the - //deps arg is the module name, and second arg (if passed) - //is just the relName. - //Normalize module name, if it contains . or .. - return callDep(makeMap(deps, callback).f); - } else if (!deps.splice) { - //deps is a config object, not an array. - config = deps; - if (config.deps) { - req(config.deps, config.callback); - } - if (!callback) { - return; - } - - if (callback.splice) { - //callback is an array, which means it is a dependency list. - //Adjust args if there are dependencies - deps = callback; - callback = relName; - relName = null; - } else { - deps = undef; - } - } - - //Support require(['a']) - callback = callback || function () {}; - - //If relName is a function, it is an errback handler, - //so remove it. - if (typeof relName === 'function') { - relName = forceSync; - forceSync = alt; - } - - //Simulate async callback; - if (forceSync) { - main(undef, deps, callback, relName); - } else { - //Using a non-zero value because of concern for what old browsers - //do, and latest browsers "upgrade" to 4 if lower value is used: - //http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#dom-windowtimers-settimeout: - //If want a value immediately, use require('id') instead -- something - //that works in almond on the global level, but not guaranteed and - //unlikely to work in other AMD implementations. - setTimeout(function () { - main(undef, deps, callback, relName); - }, 4); - } - - return req; - }; - - /** - * Just drops the config on the floor, but returns req in case - * the config return value is used. - */ - req.config = function (cfg) { - return req(cfg); - }; - - /** - * Expose module registry for debugging and tooling - */ - requirejs._defined = defined; - - define = function (name, deps, callback) { - - //This module may not have dependencies - if (!deps.splice) { - //deps is not an array, so probably means - //an object literal or factory function for - //the value. Adjust args. - callback = deps; - deps = []; - } - - if (!hasProp(defined, name) && !hasProp(waiting, name)) { - waiting[name] = [name, deps, callback]; - } - }; - - define.amd = { - jQuery: true - }; -}()); - -S2.requirejs = requirejs;S2.require = require;S2.define = define; -} -}()); -S2.define("almond", function(){}); - -/* global jQuery:false, $:false */ -S2.define('jquery',[],function () { - var _$ = jQuery || $; - - if (_$ == null && console && console.error) { - console.error( - 'Select2: An instance of jQuery or a jQuery-compatible library was not ' + - 'found. Make sure that you are including jQuery before Select2 on your ' + - 'web page.' - ); - } - - return _$; -}); - -S2.define('select2/utils',[ - 'jquery' -], function ($) { - var Utils = {}; - - Utils.Extend = function (ChildClass, SuperClass) { - var __hasProp = {}.hasOwnProperty; - - function BaseConstructor () { - this.constructor = ChildClass; - } - - for (var key in SuperClass) { - if (__hasProp.call(SuperClass, key)) { - ChildClass[key] = SuperClass[key]; - } - } - - BaseConstructor.prototype = SuperClass.prototype; - ChildClass.prototype = new BaseConstructor(); - ChildClass.__super__ = SuperClass.prototype; - - return ChildClass; - }; - - function getMethods (theClass) { - var proto = theClass.prototype; - - var methods = []; - - for (var methodName in proto) { - var m = proto[methodName]; - - if (typeof m !== 'function') { - continue; - } - - if (methodName === 'constructor') { - continue; - } - - methods.push(methodName); - } - - return methods; - } - - Utils.Decorate = function (SuperClass, DecoratorClass) { - var decoratedMethods = getMethods(DecoratorClass); - var superMethods = getMethods(SuperClass); - - function DecoratedClass () { - var unshift = Array.prototype.unshift; - - var argCount = DecoratorClass.prototype.constructor.length; - - var calledConstructor = SuperClass.prototype.constructor; - - if (argCount > 0) { - unshift.call(arguments, SuperClass.prototype.constructor); - - calledConstructor = DecoratorClass.prototype.constructor; - } - - calledConstructor.apply(this, arguments); - } - - DecoratorClass.displayName = SuperClass.displayName; - - function ctr () { - this.constructor = DecoratedClass; - } - - DecoratedClass.prototype = new ctr(); - - for (var m = 0; m < superMethods.length; m++) { - var superMethod = superMethods[m]; - - DecoratedClass.prototype[superMethod] = - SuperClass.prototype[superMethod]; - } - - var calledMethod = function (methodName) { - // Stub out the original method if it's not decorating an actual method - var originalMethod = function () {}; - - if (methodName in DecoratedClass.prototype) { - originalMethod = DecoratedClass.prototype[methodName]; - } - - var decoratedMethod = DecoratorClass.prototype[methodName]; - - return function () { - var unshift = Array.prototype.unshift; - - unshift.call(arguments, originalMethod); - - return decoratedMethod.apply(this, arguments); - }; - }; - - for (var d = 0; d < decoratedMethods.length; d++) { - var decoratedMethod = decoratedMethods[d]; - - DecoratedClass.prototype[decoratedMethod] = calledMethod(decoratedMethod); - } - - return DecoratedClass; - }; - - var Observable = function () { - this.listeners = {}; - }; - - Observable.prototype.on = function (event, callback) { - this.listeners = this.listeners || {}; - - if (event in this.listeners) { - this.listeners[event].push(callback); - } else { - this.listeners[event] = [callback]; - } - }; - - Observable.prototype.trigger = function (event) { - var slice = Array.prototype.slice; - - this.listeners = this.listeners || {}; - - if (event in this.listeners) { - this.invoke(this.listeners[event], slice.call(arguments, 1)); - } - - if ('*' in this.listeners) { - this.invoke(this.listeners['*'], arguments); - } - }; - - Observable.prototype.invoke = function (listeners, params) { - for (var i = 0, len = listeners.length; i < len; i++) { - listeners[i].apply(this, params); - } - }; - - Utils.Observable = Observable; - - Utils.generateChars = function (length) { - var chars = ''; - - for (var i = 0; i < length; i++) { - var randomChar = Math.floor(Math.random() * 36); - chars += randomChar.toString(36); - } - - return chars; - }; - - Utils.bind = function (func, context) { - return function () { - func.apply(context, arguments); - }; - }; - - Utils._convertData = function (data) { - for (var originalKey in data) { - var keys = originalKey.split('-'); - - var dataLevel = data; - - if (keys.length === 1) { - continue; - } - - for (var k = 0; k < keys.length; k++) { - var key = keys[k]; - - // Lowercase the first letter - // By default, dash-separated becomes camelCase - key = key.substring(0, 1).toLowerCase() + key.substring(1); - - if (!(key in dataLevel)) { - dataLevel[key] = {}; - } - - if (k == keys.length - 1) { - dataLevel[key] = data[originalKey]; - } - - dataLevel = dataLevel[key]; - } - - delete data[originalKey]; - } - - return data; - }; - - Utils.hasScroll = function (index, el) { - // Adapted from the function created by @ShadowScripter - // and adapted by @BillBarry on the Stack Exchange Code Review website. - // The original code can be found at - // http://codereview.stackexchange.com/q/13338 - // and was designed to be used with the Sizzle selector engine. - - var $el = $(el); - var overflowX = el.style.overflowX; - var overflowY = el.style.overflowY; - - //Check both x and y declarations - if (overflowX === overflowY && - (overflowY === 'hidden' || overflowY === 'visible')) { - return false; - } - - if (overflowX === 'scroll' || overflowY === 'scroll') { - return true; - } - - return ($el.innerHeight() < el.scrollHeight || - $el.innerWidth() < el.scrollWidth); - }; - - Utils.escapeMarkup = function (markup) { - var replaceMap = { - '\\': '\', - '&': '&', - '<': '<', - '>': '>', - '"': '"', - '\'': ''', - '/': '/' - }; - - // Do not try to escape the markup if it's not a string - if (typeof markup !== 'string') { - return markup; - } - - return String(markup).replace(/[&<>"'\/\\]/g, function (match) { - return replaceMap[match]; - }); - }; - - // Append an array of jQuery nodes to a given element. - Utils.appendMany = function ($element, $nodes) { - // jQuery 1.7.x does not support $.fn.append() with an array - // Fall back to a jQuery object collection using $.fn.add() - if ($.fn.jquery.substr(0, 3) === '1.7') { - var $jqNodes = $(); - - $.map($nodes, function (node) { - $jqNodes = $jqNodes.add(node); - }); - - $nodes = $jqNodes; - } - - $element.append($nodes); - }; - - return Utils; -}); - -S2.define('select2/results',[ - 'jquery', - './utils' -], function ($, Utils) { - function Results ($element, options, dataAdapter) { - this.$element = $element; - this.data = dataAdapter; - this.options = options; - - Results.__super__.constructor.call(this); - } - - Utils.Extend(Results, Utils.Observable); - - Results.prototype.render = function () { - var $results = $( - '<ul class="select2-results__options" role="tree"></ul>' - ); - - if (this.options.get('multiple')) { - $results.attr('aria-multiselectable', 'true'); - } - - this.$results = $results; - - return $results; - }; - - Results.prototype.clear = function () { - this.$results.empty(); - }; - - Results.prototype.displayMessage = function (params) { - var escapeMarkup = this.options.get('escapeMarkup'); - - this.clear(); - this.hideLoading(); - - var $message = $( - '<li role="treeitem" class="select2-results__option"></li>' - ); - - var message = this.options.get('translations').get(params.message); - - $message.append( - escapeMarkup( - message(params.args) - ) - ); - - this.$results.append($message); - }; - - Results.prototype.append = function (data) { - this.hideLoading(); - - var $options = []; - - if (data.results == null || data.results.length === 0) { - if (this.$results.children().length === 0) { - this.trigger('results:message', { - message: 'noResults' - }); - } - - return; - } - - data.results = this.sort(data.results); - - for (var d = 0; d < data.results.length; d++) { - var item = data.results[d]; - - var $option = this.option(item); - - $options.push($option); - } - - this.$results.append($options); - }; - - Results.prototype.position = function ($results, $dropdown) { - var $resultsContainer = $dropdown.find('.select2-results'); - $resultsContainer.append($results); - }; - - Results.prototype.sort = function (data) { - var sorter = this.options.get('sorter'); - - return sorter(data); - }; - - Results.prototype.setClasses = function () { - var self = this; - - this.data.current(function (selected) { - var selectedIds = $.map(selected, function (s) { - return s.id.toString(); - }); - - var $options = self.$results - .find('.select2-results__option[aria-selected]'); - - $options.each(function () { - var $option = $(this); - - var item = $.data(this, 'data'); - - // id needs to be converted to a string when comparing - var id = '' + item.id; - - if ((item.element != null && item.element.selected) || - (item.element == null && $.inArray(id, selectedIds) > -1)) { - $option.attr('aria-selected', 'true'); - } else { - $option.attr('aria-selected', 'false'); - } - }); - - var $selected = $options.filter('[aria-selected=true]'); - - // Check if there are any selected options - if ($selected.length > 0) { - // If there are selected options, highlight the first - $selected.first().trigger('mouseenter'); - } else { - // If there are no selected options, highlight the first option - // in the dropdown - $options.first().trigger('mouseenter'); - } - }); - }; - - Results.prototype.showLoading = function (params) { - this.hideLoading(); - - var loadingMore = this.options.get('translations').get('searching'); - - var loading = { - disabled: true, - loading: true, - text: loadingMore(params) - }; - var $loading = this.option(loading); - $loading.className += ' loading-results'; - - this.$results.prepend($loading); - }; - - Results.prototype.hideLoading = function () { - this.$results.find('.loading-results').remove(); - }; - - Results.prototype.option = function (data) { - var option = document.createElement('li'); - option.className = 'select2-results__option'; - - var attrs = { - 'role': 'treeitem', - 'aria-selected': 'false' - }; - - if (data.disabled) { - delete attrs['aria-selected']; - attrs['aria-disabled'] = 'true'; - } - - if (data.id == null) { - delete attrs['aria-selected']; - } - - if (data._resultId != null) { - option.id = data._resultId; - } - - if (data.title) { - option.title = data.title; - } - - if (data.children) { - attrs.role = 'group'; - attrs['aria-label'] = data.text; - delete attrs['aria-selected']; - } - - for (var attr in attrs) { - var val = attrs[attr]; - - option.setAttribute(attr, val); - } - - if (data.children) { - var $option = $(option); - - var label = document.createElement('strong'); - label.className = 'select2-results__group'; - - var $label = $(label); - this.template(data, label); - - var $children = []; - - for (var c = 0; c < data.children.length; c++) { - var child = data.children[c]; - - var $child = this.option(child); - - $children.push($child); - } - - var $childrenContainer = $('<ul></ul>', { - 'class': 'select2-results__options select2-results__options--nested' - }); - - $childrenContainer.append($children); - - $option.append(label); - $option.append($childrenContainer); - } else { - this.template(data, option); - } - - $.data(option, 'data', data); - - return option; - }; - - Results.prototype.bind = function (container, $container) { - var self = this; - - var id = container.id + '-results'; - - this.$results.attr('id', id); - - container.on('results:all', function (params) { - self.clear(); - self.append(params.data); - - if (container.isOpen()) { - self.setClasses(); - } - }); - - container.on('results:append', function (params) { - self.append(params.data); - - if (container.isOpen()) { - self.setClasses(); - } - }); - - container.on('query', function (params) { - self.showLoading(params); - }); - - container.on('select', function () { - if (!container.isOpen()) { - return; - } - - self.setClasses(); - }); - - container.on('unselect', function () { - if (!container.isOpen()) { - return; - } - - self.setClasses(); - }); - - container.on('open', function () { - // When the dropdown is open, aria-expended="true" - self.$results.attr('aria-expanded', 'true'); - self.$results.attr('aria-hidden', 'false'); - - self.setClasses(); - self.ensureHighlightVisible(); - }); - - container.on('close', function () { - // When the dropdown is closed, aria-expended="false" - self.$results.attr('aria-expanded', 'false'); - self.$results.attr('aria-hidden', 'true'); - self.$results.removeAttr('aria-activedescendant'); - }); - - container.on('results:toggle', function () { - var $highlighted = self.getHighlightedResults(); - - if ($highlighted.length === 0) { - return; - } - - $highlighted.trigger('mouseup'); - }); - - container.on('results:select', function () { - var $highlighted = self.getHighlightedResults(); - - if ($highlighted.length === 0) { - return; - } - - var data = $highlighted.data('data'); - - if ($highlighted.attr('aria-selected') == 'true') { - self.trigger('close'); - } else { - self.trigger('select', { - data: data - }); - } - }); - - container.on('results:previous', function () { - var $highlighted = self.getHighlightedResults(); - - var $options = self.$results.find('[aria-selected]'); - - var currentIndex = $options.index($highlighted); - - // If we are already at te top, don't move further - if (currentIndex === 0) { - return; - } - - var nextIndex = currentIndex - 1; - - // If none are highlighted, highlight the first - if ($highlighted.length === 0) { - nextIndex = 0; - } - - var $next = $options.eq(nextIndex); - - $next.trigger('mouseenter'); - - var currentOffset = self.$results.offset().top; - var nextTop = $next.offset().top; - var nextOffset = self.$results.scrollTop() + (nextTop - currentOffset); - - if (nextIndex === 0) { - self.$results.scrollTop(0); - } else if (nextTop - currentOffset < 0) { - self.$results.scrollTop(nextOffset); - } - }); - - container.on('results:next', function () { - var $highlighted = self.getHighlightedResults(); - - var $options = self.$results.find('[aria-selected]'); - - var currentIndex = $options.index($highlighted); - - var nextIndex = currentIndex + 1; - - // If we are at the last option, stay there - if (nextIndex >= $options.length) { - return; - } - - var $next = $options.eq(nextIndex); - - $next.trigger('mouseenter'); - - var currentOffset = self.$results.offset().top + - self.$results.outerHeight(false); - var nextBottom = $next.offset().top + $next.outerHeight(false); - var nextOffset = self.$results.scrollTop() + nextBottom - currentOffset; - - if (nextIndex === 0) { - self.$results.scrollTop(0); - } else if (nextBottom > currentOffset) { - self.$results.scrollTop(nextOffset); - } - }); - - container.on('results:focus', function (params) { - params.element.addClass('select2-results__option--highlighted'); - }); - - container.on('results:message', function (params) { - self.displayMessage(params); - }); - - if ($.fn.mousewheel) { - this.$results.on('mousewheel', function (e) { - var top = self.$results.scrollTop(); - - var bottom = ( - self.$results.get(0).scrollHeight - - self.$results.scrollTop() + - e.deltaY - ); - - var isAtTop = e.deltaY > 0 && top - e.deltaY <= 0; - var isAtBottom = e.deltaY < 0 && bottom <= self.$results.height(); - - if (isAtTop) { - self.$results.scrollTop(0); - - e.preventDefault(); - e.stopPropagation(); - } else if (isAtBottom) { - self.$results.scrollTop( - self.$results.get(0).scrollHeight - self.$results.height() - ); - - e.preventDefault(); - e.stopPropagation(); - } - }); - } - - this.$results.on('mouseup', '.select2-results__option[aria-selected]', - function (evt) { - var $this = $(this); - - var data = $this.data('data'); - - if ($this.attr('aria-selected') === 'true') { - if (self.options.get('multiple')) { - self.trigger('unselect', { - originalEvent: evt, - data: data - }); - } else { - self.trigger('close'); - } - - return; - } - - self.trigger('select', { - originalEvent: evt, - data: data - }); - }); - - this.$results.on('mouseenter', '.select2-results__option[aria-selected]', - function (evt) { - var data = $(this).data('data'); - - self.getHighlightedResults() - .removeClass('select2-results__option--highlighted'); - - self.trigger('results:focus', { - data: data, - element: $(this) - }); - }); - }; - - Results.prototype.getHighlightedResults = function () { - var $highlighted = this.$results - .find('.select2-results__option--highlighted'); - - return $highlighted; - }; - - Results.prototype.destroy = function () { - this.$results.remove(); - }; - - Results.prototype.ensureHighlightVisible = function () { - var $highlighted = this.getHighlightedResults(); - - if ($highlighted.length === 0) { - return; - } - - var $options = this.$results.find('[aria-selected]'); - - var currentIndex = $options.index($highlighted); - - var currentOffset = this.$results.offset().top; - var nextTop = $highlighted.offset().top; - var nextOffset = this.$results.scrollTop() + (nextTop - currentOffset); - - var offsetDelta = nextTop - currentOffset; - nextOffset -= $highlighted.outerHeight(false) * 2; - - if (currentIndex <= 2) { - this.$results.scrollTop(0); - } else if (offsetDelta > this.$results.outerHeight() || offsetDelta < 0) { - this.$results.scrollTop(nextOffset); - } - }; - - Results.prototype.template = function (result, container) { - var template = this.options.get('templateResult'); - var escapeMarkup = this.options.get('escapeMarkup'); - - var content = template(result); - - if (content == null) { - container.style.display = 'none'; - } else if (typeof content === 'string') { - container.innerHTML = escapeMarkup(content); - } else { - $(container).append(content); - } - }; - - return Results; -}); - -S2.define('select2/keys',[ - -], function () { - var KEYS = { - BACKSPACE: 8, - TAB: 9, - ENTER: 13, - SHIFT: 16, - CTRL: 17, - ALT: 18, - ESC: 27, - SPACE: 32, - PAGE_UP: 33, - PAGE_DOWN: 34, - END: 35, - HOME: 36, - LEFT: 37, - UP: 38, - RIGHT: 39, - DOWN: 40, - DELETE: 46 - }; - - return KEYS; -}); - -S2.define('select2/selection/base',[ - 'jquery', - '../utils', - '../keys' -], function ($, Utils, KEYS) { - function BaseSelection ($element, options) { - this.$element = $element; - this.options = options; - - BaseSelection.__super__.constructor.call(this); - } - - Utils.Extend(BaseSelection, Utils.Observable); - - BaseSelection.prototype.render = function () { - var $selection = $( - '<span class="select2-selection" role="combobox" ' + - 'aria-autocomplete="list" aria-haspopup="true" aria-expanded="false">' + - '</span>' - ); - - this._tabindex = 0; - - if (this.$element.data('old-tabindex') != null) { - this._tabindex = this.$element.data('old-tabindex'); - } else if (this.$element.attr('tabindex') != null) { - this._tabindex = this.$element.attr('tabindex'); - } - - $selection.attr('title', this.$element.attr('title')); - $selection.attr('tabindex', this._tabindex); - - this.$selection = $selection; - - return $selection; - }; - - BaseSelection.prototype.bind = function (container, $container) { - var self = this; - - var id = container.id + '-container'; - var resultsId = container.id + '-results'; - - this.container = container; - - this.$selection.on('focus', function (evt) { - self.trigger('focus', evt); - }); - - this.$selection.on('blur', function (evt) { - self.trigger('blur', evt); - }); - - this.$selection.on('keydown', function (evt) { - self.trigger('keypress', evt); - - if (evt.which === KEYS.SPACE) { - evt.preventDefault(); - } - }); - - container.on('results:focus', function (params) { - self.$selection.attr('aria-activedescendant', params.data._resultId); - }); - - container.on('selection:update', function (params) { - self.update(params.data); - }); - - container.on('open', function () { - // When the dropdown is open, aria-expanded="true" - self.$selection.attr('aria-expanded', 'true'); - self.$selection.attr('aria-owns', resultsId); - - self._attachCloseHandler(container); - }); - - container.on('close', function () { - // When the dropdown is closed, aria-expanded="false" - self.$selection.attr('aria-expanded', 'false'); - self.$selection.removeAttr('aria-activedescendant'); - self.$selection.removeAttr('aria-owns'); - - self.$selection.focus(); - - self._detachCloseHandler(container); - }); - - container.on('enable', function () { - self.$selection.attr('tabindex', self._tabindex); - }); - - container.on('disable', function () { - self.$selection.attr('tabindex', '-1'); - }); - }; - - BaseSelection.prototype._attachCloseHandler = function (container) { - var self = this; - - $(document.body).on('mousedown.select2.' + container.id, function (e) { - var $target = $(e.target); - - var $select = $target.closest('.select2'); - - var $all = $('.select2.select2-container--open'); - - $all.each(function () { - var $this = $(this); - - if (this == $select[0]) { - return; - } - - var $element = $this.data('element'); - - $element.select2('close'); - }); - }); - }; - - BaseSelection.prototype._detachCloseHandler = function (container) { - $(document.body).off('mousedown.select2.' + container.id); - }; - - BaseSelection.prototype.position = function ($selection, $container) { - var $selectionContainer = $container.find('.selection'); - $selectionContainer.append($selection); - }; - - BaseSelection.prototype.destroy = function () { - this._detachCloseHandler(this.container); - }; - - BaseSelection.prototype.update = function (data) { - throw new Error('The `update` method must be defined in child classes.'); - }; - - return BaseSelection; -}); - -S2.define('select2/selection/single',[ - 'jquery', - './base', - '../utils', - '../keys' -], function ($, BaseSelection, Utils, KEYS) { - function SingleSelection () { - SingleSelection.__super__.constructor.apply(this, arguments); - } - - Utils.Extend(SingleSelection, BaseSelection); - - SingleSelection.prototype.render = function () { - var $selection = SingleSelection.__super__.render.call(this); - - $selection.addClass('select2-selection--single'); - - $selection.html( - '<span class="select2-selection__rendered"></span>' + - '<span class="select2-selection__arrow" role="presentation">' + - '<b role="presentation"></b>' + - '</span>' - ); - - return $selection; - }; - - SingleSelection.prototype.bind = function (container, $container) { - var self = this; - - SingleSelection.__super__.bind.apply(this, arguments); - - var id = container.id + '-container'; - - this.$selection.find('.select2-selection__rendered').attr('id', id); - this.$selection.attr('aria-labelledby', id); - - this.$selection.on('mousedown', function (evt) { - // Only respond to left clicks - if (evt.which !== 1) { - return; - } - - self.trigger('toggle', { - originalEvent: evt - }); - }); - - this.$selection.on('focus', function (evt) { - // User focuses on the container - }); - - this.$selection.on('blur', function (evt) { - // User exits the container - }); - - container.on('selection:update', function (params) { - self.update(params.data); - }); - }; - - SingleSelection.prototype.clear = function () { - this.$selection.find('.select2-selection__rendered').empty(); - }; - - SingleSelection.prototype.display = function (data) { - var template = this.options.get('templateSelection'); - var escapeMarkup = this.options.get('escapeMarkup'); - - return escapeMarkup(template(data)); - }; - - SingleSelection.prototype.selectionContainer = function () { - return $('<span></span>'); - }; - - SingleSelection.prototype.update = function (data) { - if (data.length === 0) { - this.clear(); - return; - } - - var selection = data[0]; - - var formatted = this.display(selection); - - var $rendered = this.$selection.find('.select2-selection__rendered'); - $rendered.empty().append(formatted); - $rendered.prop('title', selection.title || selection.text); - }; - - return SingleSelection; -}); - -S2.define('select2/selection/multiple',[ - 'jquery', - './base', - '../utils' -], function ($, BaseSelection, Utils) { - function MultipleSelection ($element, options) { - MultipleSelection.__super__.constructor.apply(this, arguments); - } - - Utils.Extend(MultipleSelection, BaseSelection); - - MultipleSelection.prototype.render = function () { - var $selection = MultipleSelection.__super__.render.call(this); - - $selection.addClass('select2-selection--multiple'); - - $selection.html( - '<ul class="select2-selection__rendered"></ul>' - ); - - return $selection; - }; - - MultipleSelection.prototype.bind = function (container, $container) { - var self = this; - - MultipleSelection.__super__.bind.apply(this, arguments); - - this.$selection.on('click', function (evt) { - self.trigger('toggle', { - originalEvent: evt - }); - }); - - this.$selection.on('click', '.select2-selection__choice__remove', - function (evt) { - var $remove = $(this); - var $selection = $remove.parent(); - - var data = $selection.data('data'); - - self.trigger('unselect', { - originalEvent: evt, - data: data - }); - }); - }; - - MultipleSelection.prototype.clear = function () { - this.$selection.find('.select2-selection__rendered').empty(); - }; - - MultipleSelection.prototype.display = function (data) { - var template = this.options.get('templateSelection'); - var escapeMarkup = this.options.get('escapeMarkup'); - - return escapeMarkup(template(data)); - }; - - MultipleSelection.prototype.selectionContainer = function () { - var $container = $( - '<li class="select2-selection__choice">' + - '<span class="select2-selection__choice__remove" role="presentation">' + - '×' + - '</span>' + - '</li>' - ); - - return $container; - }; - - MultipleSelection.prototype.update = function (data) { - this.clear(); - - if (data.length === 0) { - return; - } - - var $selections = []; - - for (var d = 0; d < data.length; d++) { - var selection = data[d]; - - var formatted = this.display(selection); - var $selection = this.selectionContainer(); - - $selection.append(formatted); - $selection.prop('title', selection.title || selection.text); - - $selection.data('data', selection); - - $selections.push($selection); - } - - var $rendered = this.$selection.find('.select2-selection__rendered'); - - Utils.appendMany($rendered, $selections); - }; - - return MultipleSelection; -}); - -S2.define('select2/selection/placeholder',[ - '../utils' -], function (Utils) { - function Placeholder (decorated, $element, options) { - this.placeholder = this.normalizePlaceholder(options.get('placeholder')); - - decorated.call(this, $element, options); - } - - Placeholder.prototype.normalizePlaceholder = function (_, placeholder) { - if (typeof placeholder === 'string') { - placeholder = { - id: '', - text: placeholder - }; - } - - return placeholder; - }; - - Placeholder.prototype.createPlaceholder = function (decorated, placeholder) { - var $placeholder = this.selectionContainer(); - - $placeholder.html(this.display(placeholder)); - $placeholder.addClass('select2-selection__placeholder') - .removeClass('select2-selection__choice'); - - return $placeholder; - }; - - Placeholder.prototype.update = function (decorated, data) { - var singlePlaceholder = ( - data.length == 1 && data[0].id != this.placeholder.id - ); - var multipleSelections = data.length > 1; - - if (multipleSelections || singlePlaceholder) { - return decorated.call(this, data); - } - - this.clear(); - - var $placeholder = this.createPlaceholder(this.placeholder); - - this.$selection.find('.select2-selection__rendered').append($placeholder); - }; - - return Placeholder; -}); - -S2.define('select2/selection/allowClear',[ - 'jquery', - '../keys' -], function ($, KEYS) { - function AllowClear () { } - - AllowClear.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - if (this.placeholder == null) { - if (this.options.get('debug') && window.console && console.error) { - console.error( - 'Select2: The `allowClear` option should be used in combination ' + - 'with the `placeholder` option.' - ); - } - } - - this.$selection.on('mousedown', '.select2-selection__clear', - function (evt) { - self._handleClear(evt); - }); - - container.on('keypress', function (evt) { - self._handleKeyboardClear(evt, container); - }); - }; - - AllowClear.prototype._handleClear = function (_, evt) { - // Ignore the event if it is disabled - if (this.options.get('disabled')) { - return; - } - - var $clear = this.$selection.find('.select2-selection__clear'); - - // Ignore the event if nothing has been selected - if ($clear.length === 0) { - return; - } - - evt.stopPropagation(); - - var data = $clear.data('data'); - - for (var d = 0; d < data.length; d++) { - var unselectData = { - data: data[d] - }; - - // Trigger the `unselect` event, so people can prevent it from being - // cleared. - this.trigger('unselect', unselectData); - - // If the event was prevented, don't clear it out. - if (unselectData.prevented) { - return; - } - } - - this.$element.val(this.placeholder.id).trigger('change'); - - this.trigger('toggle'); - }; - - AllowClear.prototype._handleKeyboardClear = function (_, evt, container) { - if (container.isOpen()) { - return; - } - - if (evt.which == KEYS.DELETE || evt.which == KEYS.BACKSPACE) { - this._handleClear(evt); - } - }; - - AllowClear.prototype.update = function (decorated, data) { - decorated.call(this, data); - - if (this.$selection.find('.select2-selection__placeholder').length > 0 || - data.length === 0) { - return; - } - - var $remove = $( - '<span class="select2-selection__clear">' + - '×' + - '</span>' - ); - $remove.data('data', data); - - this.$selection.find('.select2-selection__rendered').prepend($remove); - }; - - return AllowClear; -}); - -S2.define('select2/selection/search',[ - 'jquery', - '../utils', - '../keys' -], function ($, Utils, KEYS) { - function Search (decorated, $element, options) { - decorated.call(this, $element, options); - } - - Search.prototype.render = function (decorated) { - var $search = $( - '<li class="select2-search select2-search--inline">' + - '<input class="select2-search__field" type="search" tabindex="-1"' + - ' autocomplete="off" autocorrect="off" autocapitalize="off"' + - ' spellcheck="false" role="textbox" />' + - '</li>' - ); - - this.$searchContainer = $search; - this.$search = $search.find('input'); - - var $rendered = decorated.call(this); - - return $rendered; - }; - - Search.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('open', function () { - self.$search.attr('tabindex', 0); - - self.$search.focus(); - }); - - container.on('close', function () { - self.$search.attr('tabindex', -1); - - self.$search.val(''); - self.$search.focus(); - }); - - container.on('enable', function () { - self.$search.prop('disabled', false); - }); - - container.on('disable', function () { - self.$search.prop('disabled', true); - }); - - this.$selection.on('focusin', '.select2-search--inline', function (evt) { - self.trigger('focus', evt); - }); - - this.$selection.on('focusout', '.select2-search--inline', function (evt) { - self.trigger('blur', evt); - }); - - this.$selection.on('keydown', '.select2-search--inline', function (evt) { - evt.stopPropagation(); - - self.trigger('keypress', evt); - - self._keyUpPrevented = evt.isDefaultPrevented(); - - var key = evt.which; - - if (key === KEYS.BACKSPACE && self.$search.val() === '') { - var $previousChoice = self.$searchContainer - .prev('.select2-selection__choice'); - - if ($previousChoice.length > 0) { - var item = $previousChoice.data('data'); - - self.searchRemoveChoice(item); - - evt.preventDefault(); - } - } - }); - - // Workaround for browsers which do not support the `input` event - // This will prevent double-triggering of events for browsers which support - // both the `keyup` and `input` events. - this.$selection.on('input', '.select2-search--inline', function (evt) { - // Unbind the duplicated `keyup` event - self.$selection.off('keyup.search'); - }); - - this.$selection.on('keyup.search input', '.select2-search--inline', - function (evt) { - self.handleSearch(evt); - }); - }; - - Search.prototype.createPlaceholder = function (decorated, placeholder) { - this.$search.attr('placeholder', placeholder.text); - }; - - Search.prototype.update = function (decorated, data) { - this.$search.attr('placeholder', ''); - - decorated.call(this, data); - - this.$selection.find('.select2-selection__rendered') - .append(this.$searchContainer); - - this.resizeSearch(); - }; - - Search.prototype.handleSearch = function () { - this.resizeSearch(); - - if (!this._keyUpPrevented) { - var input = this.$search.val(); - - this.trigger('query', { - term: input - }); - } - - this._keyUpPrevented = false; - }; - - Search.prototype.searchRemoveChoice = function (decorated, item) { - this.trigger('unselect', { - data: item - }); - - this.trigger('open'); - - this.$search.val(item.text + ' '); - }; - - Search.prototype.resizeSearch = function () { - this.$search.css('width', '25px'); - - var width = ''; - - if (this.$search.attr('placeholder') !== '') { - width = this.$selection.find('.select2-selection__rendered').innerWidth(); - } else { - var minimumWidth = this.$search.val().length + 1; - - width = (minimumWidth * 0.75) + 'em'; - } - - this.$search.css('width', width); - }; - - return Search; -}); - -S2.define('select2/selection/eventRelay',[ - 'jquery' -], function ($) { - function EventRelay () { } - - EventRelay.prototype.bind = function (decorated, container, $container) { - var self = this; - var relayEvents = [ - 'open', 'opening', - 'close', 'closing', - 'select', 'selecting', - 'unselect', 'unselecting' - ]; - - var preventableEvents = ['opening', 'closing', 'selecting', 'unselecting']; - - decorated.call(this, container, $container); - - container.on('*', function (name, params) { - // Ignore events that should not be relayed - if ($.inArray(name, relayEvents) === -1) { - return; - } - - // The parameters should always be an object - params = params || {}; - - // Generate the jQuery event for the Select2 event - var evt = $.Event('select2:' + name, { - params: params - }); - - self.$element.trigger(evt); - - // Only handle preventable events if it was one - if ($.inArray(name, preventableEvents) === -1) { - return; - } - - params.prevented = evt.isDefaultPrevented(); - }); - }; - - return EventRelay; -}); - -S2.define('select2/translation',[ - 'jquery', - 'require' -], function ($, require) { - function Translation (dict) { - this.dict = dict || {}; - } - - Translation.prototype.all = function () { - return this.dict; - }; - - Translation.prototype.get = function (key) { - return this.dict[key]; - }; - - Translation.prototype.extend = function (translation) { - this.dict = $.extend({}, translation.all(), this.dict); - }; - - // Static functions - - Translation._cache = {}; - - Translation.loadPath = function (path) { - if (!(path in Translation._cache)) { - var translations = require(path); - - Translation._cache[path] = translations; - } - - return new Translation(Translation._cache[path]); - }; - - return Translation; -}); - -S2.define('select2/diacritics',[ - -], function () { - var diacritics = { - '\u24B6': 'A', - '\uFF21': 'A', - '\u00C0': 'A', - '\u00C1': 'A', - '\u00C2': 'A', - '\u1EA6': 'A', - '\u1EA4': 'A', - '\u1EAA': 'A', - '\u1EA8': 'A', - '\u00C3': 'A', - '\u0100': 'A', - '\u0102': 'A', - '\u1EB0': 'A', - '\u1EAE': 'A', - '\u1EB4': 'A', - '\u1EB2': 'A', - '\u0226': 'A', - '\u01E0': 'A', - '\u00C4': 'A', - '\u01DE': 'A', - '\u1EA2': 'A', - '\u00C5': 'A', - '\u01FA': 'A', - '\u01CD': 'A', - '\u0200': 'A', - '\u0202': 'A', - '\u1EA0': 'A', - '\u1EAC': 'A', - '\u1EB6': 'A', - '\u1E00': 'A', - '\u0104': 'A', - '\u023A': 'A', - '\u2C6F': 'A', - '\uA732': 'AA', - '\u00C6': 'AE', - '\u01FC': 'AE', - '\u01E2': 'AE', - '\uA734': 'AO', - '\uA736': 'AU', - '\uA738': 'AV', - '\uA73A': 'AV', - '\uA73C': 'AY', - '\u24B7': 'B', - '\uFF22': 'B', - '\u1E02': 'B', - '\u1E04': 'B', - '\u1E06': 'B', - '\u0243': 'B', - '\u0182': 'B', - '\u0181': 'B', - '\u24B8': 'C', - '\uFF23': 'C', - '\u0106': 'C', - '\u0108': 'C', - '\u010A': 'C', - '\u010C': 'C', - '\u00C7': 'C', - '\u1E08': 'C', - '\u0187': 'C', - '\u023B': 'C', - '\uA73E': 'C', - '\u24B9': 'D', - '\uFF24': 'D', - '\u1E0A': 'D', - '\u010E': 'D', - '\u1E0C': 'D', - '\u1E10': 'D', - '\u1E12': 'D', - '\u1E0E': 'D', - '\u0110': 'D', - '\u018B': 'D', - '\u018A': 'D', - '\u0189': 'D', - '\uA779': 'D', - '\u01F1': 'DZ', - '\u01C4': 'DZ', - '\u01F2': 'Dz', - '\u01C5': 'Dz', - '\u24BA': 'E', - '\uFF25': 'E', - '\u00C8': 'E', - '\u00C9': 'E', - '\u00CA': 'E', - '\u1EC0': 'E', - '\u1EBE': 'E', - '\u1EC4': 'E', - '\u1EC2': 'E', - '\u1EBC': 'E', - '\u0112': 'E', - '\u1E14': 'E', - '\u1E16': 'E', - '\u0114': 'E', - '\u0116': 'E', - '\u00CB': 'E', - '\u1EBA': 'E', - '\u011A': 'E', - '\u0204': 'E', - '\u0206': 'E', - '\u1EB8': 'E', - '\u1EC6': 'E', - '\u0228': 'E', - '\u1E1C': 'E', - '\u0118': 'E', - '\u1E18': 'E', - '\u1E1A': 'E', - '\u0190': 'E', - '\u018E': 'E', - '\u24BB': 'F', - '\uFF26': 'F', - '\u1E1E': 'F', - '\u0191': 'F', - '\uA77B': 'F', - '\u24BC': 'G', - '\uFF27': 'G', - '\u01F4': 'G', - '\u011C': 'G', - '\u1E20': 'G', - '\u011E': 'G', - '\u0120': 'G', - '\u01E6': 'G', - '\u0122': 'G', - '\u01E4': 'G', - '\u0193': 'G', - '\uA7A0': 'G', - '\uA77D': 'G', - '\uA77E': 'G', - '\u24BD': 'H', - '\uFF28': 'H', - '\u0124': 'H', - '\u1E22': 'H', - '\u1E26': 'H', - '\u021E': 'H', - '\u1E24': 'H', - '\u1E28': 'H', - '\u1E2A': 'H', - '\u0126': 'H', - '\u2C67': 'H', - '\u2C75': 'H', - '\uA78D': 'H', - '\u24BE': 'I', - '\uFF29': 'I', - '\u00CC': 'I', - '\u00CD': 'I', - '\u00CE': 'I', - '\u0128': 'I', - '\u012A': 'I', - '\u012C': 'I', - '\u0130': 'I', - '\u00CF': 'I', - '\u1E2E': 'I', - '\u1EC8': 'I', - '\u01CF': 'I', - '\u0208': 'I', - '\u020A': 'I', - '\u1ECA': 'I', - '\u012E': 'I', - '\u1E2C': 'I', - '\u0197': 'I', - '\u24BF': 'J', - '\uFF2A': 'J', - '\u0134': 'J', - '\u0248': 'J', - '\u24C0': 'K', - '\uFF2B': 'K', - '\u1E30': 'K', - '\u01E8': 'K', - '\u1E32': 'K', - '\u0136': 'K', - '\u1E34': 'K', - '\u0198': 'K', - '\u2C69': 'K', - '\uA740': 'K', - '\uA742': 'K', - '\uA744': 'K', - '\uA7A2': 'K', - '\u24C1': 'L', - '\uFF2C': 'L', - '\u013F': 'L', - '\u0139': 'L', - '\u013D': 'L', - '\u1E36': 'L', - '\u1E38': 'L', - '\u013B': 'L', - '\u1E3C': 'L', - '\u1E3A': 'L', - '\u0141': 'L', - '\u023D': 'L', - '\u2C62': 'L', - '\u2C60': 'L', - '\uA748': 'L', - '\uA746': 'L', - '\uA780': 'L', - '\u01C7': 'LJ', - '\u01C8': 'Lj', - '\u24C2': 'M', - '\uFF2D': 'M', - '\u1E3E': 'M', - '\u1E40': 'M', - '\u1E42': 'M', - '\u2C6E': 'M', - '\u019C': 'M', - '\u24C3': 'N', - '\uFF2E': 'N', - '\u01F8': 'N', - '\u0143': 'N', - '\u00D1': 'N', - '\u1E44': 'N', - '\u0147': 'N', - '\u1E46': 'N', - '\u0145': 'N', - '\u1E4A': 'N', - '\u1E48': 'N', - '\u0220': 'N', - '\u019D': 'N', - '\uA790': 'N', - '\uA7A4': 'N', - '\u01CA': 'NJ', - '\u01CB': 'Nj', - '\u24C4': 'O', - '\uFF2F': 'O', - '\u00D2': 'O', - '\u00D3': 'O', - '\u00D4': 'O', - '\u1ED2': 'O', - '\u1ED0': 'O', - '\u1ED6': 'O', - '\u1ED4': 'O', - '\u00D5': 'O', - '\u1E4C': 'O', - '\u022C': 'O', - '\u1E4E': 'O', - '\u014C': 'O', - '\u1E50': 'O', - '\u1E52': 'O', - '\u014E': 'O', - '\u022E': 'O', - '\u0230': 'O', - '\u00D6': 'O', - '\u022A': 'O', - '\u1ECE': 'O', - '\u0150': 'O', - '\u01D1': 'O', - '\u020C': 'O', - '\u020E': 'O', - '\u01A0': 'O', - '\u1EDC': 'O', - '\u1EDA': 'O', - '\u1EE0': 'O', - '\u1EDE': 'O', - '\u1EE2': 'O', - '\u1ECC': 'O', - '\u1ED8': 'O', - '\u01EA': 'O', - '\u01EC': 'O', - '\u00D8': 'O', - '\u01FE': 'O', - '\u0186': 'O', - '\u019F': 'O', - '\uA74A': 'O', - '\uA74C': 'O', - '\u01A2': 'OI', - '\uA74E': 'OO', - '\u0222': 'OU', - '\u24C5': 'P', - '\uFF30': 'P', - '\u1E54': 'P', - '\u1E56': 'P', - '\u01A4': 'P', - '\u2C63': 'P', - '\uA750': 'P', - '\uA752': 'P', - '\uA754': 'P', - '\u24C6': 'Q', - '\uFF31': 'Q', - '\uA756': 'Q', - '\uA758': 'Q', - '\u024A': 'Q', - '\u24C7': 'R', - '\uFF32': 'R', - '\u0154': 'R', - '\u1E58': 'R', - '\u0158': 'R', - '\u0210': 'R', - '\u0212': 'R', - '\u1E5A': 'R', - '\u1E5C': 'R', - '\u0156': 'R', - '\u1E5E': 'R', - '\u024C': 'R', - '\u2C64': 'R', - '\uA75A': 'R', - '\uA7A6': 'R', - '\uA782': 'R', - '\u24C8': 'S', - '\uFF33': 'S', - '\u1E9E': 'S', - '\u015A': 'S', - '\u1E64': 'S', - '\u015C': 'S', - '\u1E60': 'S', - '\u0160': 'S', - '\u1E66': 'S', - '\u1E62': 'S', - '\u1E68': 'S', - '\u0218': 'S', - '\u015E': 'S', - '\u2C7E': 'S', - '\uA7A8': 'S', - '\uA784': 'S', - '\u24C9': 'T', - '\uFF34': 'T', - '\u1E6A': 'T', - '\u0164': 'T', - '\u1E6C': 'T', - '\u021A': 'T', - '\u0162': 'T', - '\u1E70': 'T', - '\u1E6E': 'T', - '\u0166': 'T', - '\u01AC': 'T', - '\u01AE': 'T', - '\u023E': 'T', - '\uA786': 'T', - '\uA728': 'TZ', - '\u24CA': 'U', - '\uFF35': 'U', - '\u00D9': 'U', - '\u00DA': 'U', - '\u00DB': 'U', - '\u0168': 'U', - '\u1E78': 'U', - '\u016A': 'U', - '\u1E7A': 'U', - '\u016C': 'U', - '\u00DC': 'U', - '\u01DB': 'U', - '\u01D7': 'U', - '\u01D5': 'U', - '\u01D9': 'U', - '\u1EE6': 'U', - '\u016E': 'U', - '\u0170': 'U', - '\u01D3': 'U', - '\u0214': 'U', - '\u0216': 'U', - '\u01AF': 'U', - '\u1EEA': 'U', - '\u1EE8': 'U', - '\u1EEE': 'U', - '\u1EEC': 'U', - '\u1EF0': 'U', - '\u1EE4': 'U', - '\u1E72': 'U', - '\u0172': 'U', - '\u1E76': 'U', - '\u1E74': 'U', - '\u0244': 'U', - '\u24CB': 'V', - '\uFF36': 'V', - '\u1E7C': 'V', - '\u1E7E': 'V', - '\u01B2': 'V', - '\uA75E': 'V', - '\u0245': 'V', - '\uA760': 'VY', - '\u24CC': 'W', - '\uFF37': 'W', - '\u1E80': 'W', - '\u1E82': 'W', - '\u0174': 'W', - '\u1E86': 'W', - '\u1E84': 'W', - '\u1E88': 'W', - '\u2C72': 'W', - '\u24CD': 'X', - '\uFF38': 'X', - '\u1E8A': 'X', - '\u1E8C': 'X', - '\u24CE': 'Y', - '\uFF39': 'Y', - '\u1EF2': 'Y', - '\u00DD': 'Y', - '\u0176': 'Y', - '\u1EF8': 'Y', - '\u0232': 'Y', - '\u1E8E': 'Y', - '\u0178': 'Y', - '\u1EF6': 'Y', - '\u1EF4': 'Y', - '\u01B3': 'Y', - '\u024E': 'Y', - '\u1EFE': 'Y', - '\u24CF': 'Z', - '\uFF3A': 'Z', - '\u0179': 'Z', - '\u1E90': 'Z', - '\u017B': 'Z', - '\u017D': 'Z', - '\u1E92': 'Z', - '\u1E94': 'Z', - '\u01B5': 'Z', - '\u0224': 'Z', - '\u2C7F': 'Z', - '\u2C6B': 'Z', - '\uA762': 'Z', - '\u24D0': 'a', - '\uFF41': 'a', - '\u1E9A': 'a', - '\u00E0': 'a', - '\u00E1': 'a', - '\u00E2': 'a', - '\u1EA7': 'a', - '\u1EA5': 'a', - '\u1EAB': 'a', - '\u1EA9': 'a', - '\u00E3': 'a', - '\u0101': 'a', - '\u0103': 'a', - '\u1EB1': 'a', - '\u1EAF': 'a', - '\u1EB5': 'a', - '\u1EB3': 'a', - '\u0227': 'a', - '\u01E1': 'a', - '\u00E4': 'a', - '\u01DF': 'a', - '\u1EA3': 'a', - '\u00E5': 'a', - '\u01FB': 'a', - '\u01CE': 'a', - '\u0201': 'a', - '\u0203': 'a', - '\u1EA1': 'a', - '\u1EAD': 'a', - '\u1EB7': 'a', - '\u1E01': 'a', - '\u0105': 'a', - '\u2C65': 'a', - '\u0250': 'a', - '\uA733': 'aa', - '\u00E6': 'ae', - '\u01FD': 'ae', - '\u01E3': 'ae', - '\uA735': 'ao', - '\uA737': 'au', - '\uA739': 'av', - '\uA73B': 'av', - '\uA73D': 'ay', - '\u24D1': 'b', - '\uFF42': 'b', - '\u1E03': 'b', - '\u1E05': 'b', - '\u1E07': 'b', - '\u0180': 'b', - '\u0183': 'b', - '\u0253': 'b', - '\u24D2': 'c', - '\uFF43': 'c', - '\u0107': 'c', - '\u0109': 'c', - '\u010B': 'c', - '\u010D': 'c', - '\u00E7': 'c', - '\u1E09': 'c', - '\u0188': 'c', - '\u023C': 'c', - '\uA73F': 'c', - '\u2184': 'c', - '\u24D3': 'd', - '\uFF44': 'd', - '\u1E0B': 'd', - '\u010F': 'd', - '\u1E0D': 'd', - '\u1E11': 'd', - '\u1E13': 'd', - '\u1E0F': 'd', - '\u0111': 'd', - '\u018C': 'd', - '\u0256': 'd', - '\u0257': 'd', - '\uA77A': 'd', - '\u01F3': 'dz', - '\u01C6': 'dz', - '\u24D4': 'e', - '\uFF45': 'e', - '\u00E8': 'e', - '\u00E9': 'e', - '\u00EA': 'e', - '\u1EC1': 'e', - '\u1EBF': 'e', - '\u1EC5': 'e', - '\u1EC3': 'e', - '\u1EBD': 'e', - '\u0113': 'e', - '\u1E15': 'e', - '\u1E17': 'e', - '\u0115': 'e', - '\u0117': 'e', - '\u00EB': 'e', - '\u1EBB': 'e', - '\u011B': 'e', - '\u0205': 'e', - '\u0207': 'e', - '\u1EB9': 'e', - '\u1EC7': 'e', - '\u0229': 'e', - '\u1E1D': 'e', - '\u0119': 'e', - '\u1E19': 'e', - '\u1E1B': 'e', - '\u0247': 'e', - '\u025B': 'e', - '\u01DD': 'e', - '\u24D5': 'f', - '\uFF46': 'f', - '\u1E1F': 'f', - '\u0192': 'f', - '\uA77C': 'f', - '\u24D6': 'g', - '\uFF47': 'g', - '\u01F5': 'g', - '\u011D': 'g', - '\u1E21': 'g', - '\u011F': 'g', - '\u0121': 'g', - '\u01E7': 'g', - '\u0123': 'g', - '\u01E5': 'g', - '\u0260': 'g', - '\uA7A1': 'g', - '\u1D79': 'g', - '\uA77F': 'g', - '\u24D7': 'h', - '\uFF48': 'h', - '\u0125': 'h', - '\u1E23': 'h', - '\u1E27': 'h', - '\u021F': 'h', - '\u1E25': 'h', - '\u1E29': 'h', - '\u1E2B': 'h', - '\u1E96': 'h', - '\u0127': 'h', - '\u2C68': 'h', - '\u2C76': 'h', - '\u0265': 'h', - '\u0195': 'hv', - '\u24D8': 'i', - '\uFF49': 'i', - '\u00EC': 'i', - '\u00ED': 'i', - '\u00EE': 'i', - '\u0129': 'i', - '\u012B': 'i', - '\u012D': 'i', - '\u00EF': 'i', - '\u1E2F': 'i', - '\u1EC9': 'i', - '\u01D0': 'i', - '\u0209': 'i', - '\u020B': 'i', - '\u1ECB': 'i', - '\u012F': 'i', - '\u1E2D': 'i', - '\u0268': 'i', - '\u0131': 'i', - '\u24D9': 'j', - '\uFF4A': 'j', - '\u0135': 'j', - '\u01F0': 'j', - '\u0249': 'j', - '\u24DA': 'k', - '\uFF4B': 'k', - '\u1E31': 'k', - '\u01E9': 'k', - '\u1E33': 'k', - '\u0137': 'k', - '\u1E35': 'k', - '\u0199': 'k', - '\u2C6A': 'k', - '\uA741': 'k', - '\uA743': 'k', - '\uA745': 'k', - '\uA7A3': 'k', - '\u24DB': 'l', - '\uFF4C': 'l', - '\u0140': 'l', - '\u013A': 'l', - '\u013E': 'l', - '\u1E37': 'l', - '\u1E39': 'l', - '\u013C': 'l', - '\u1E3D': 'l', - '\u1E3B': 'l', - '\u017F': 'l', - '\u0142': 'l', - '\u019A': 'l', - '\u026B': 'l', - '\u2C61': 'l', - '\uA749': 'l', - '\uA781': 'l', - '\uA747': 'l', - '\u01C9': 'lj', - '\u24DC': 'm', - '\uFF4D': 'm', - '\u1E3F': 'm', - '\u1E41': 'm', - '\u1E43': 'm', - '\u0271': 'm', - '\u026F': 'm', - '\u24DD': 'n', - '\uFF4E': 'n', - '\u01F9': 'n', - '\u0144': 'n', - '\u00F1': 'n', - '\u1E45': 'n', - '\u0148': 'n', - '\u1E47': 'n', - '\u0146': 'n', - '\u1E4B': 'n', - '\u1E49': 'n', - '\u019E': 'n', - '\u0272': 'n', - '\u0149': 'n', - '\uA791': 'n', - '\uA7A5': 'n', - '\u01CC': 'nj', - '\u24DE': 'o', - '\uFF4F': 'o', - '\u00F2': 'o', - '\u00F3': 'o', - '\u00F4': 'o', - '\u1ED3': 'o', - '\u1ED1': 'o', - '\u1ED7': 'o', - '\u1ED5': 'o', - '\u00F5': 'o', - '\u1E4D': 'o', - '\u022D': 'o', - '\u1E4F': 'o', - '\u014D': 'o', - '\u1E51': 'o', - '\u1E53': 'o', - '\u014F': 'o', - '\u022F': 'o', - '\u0231': 'o', - '\u00F6': 'o', - '\u022B': 'o', - '\u1ECF': 'o', - '\u0151': 'o', - '\u01D2': 'o', - '\u020D': 'o', - '\u020F': 'o', - '\u01A1': 'o', - '\u1EDD': 'o', - '\u1EDB': 'o', - '\u1EE1': 'o', - '\u1EDF': 'o', - '\u1EE3': 'o', - '\u1ECD': 'o', - '\u1ED9': 'o', - '\u01EB': 'o', - '\u01ED': 'o', - '\u00F8': 'o', - '\u01FF': 'o', - '\u0254': 'o', - '\uA74B': 'o', - '\uA74D': 'o', - '\u0275': 'o', - '\u01A3': 'oi', - '\u0223': 'ou', - '\uA74F': 'oo', - '\u24DF': 'p', - '\uFF50': 'p', - '\u1E55': 'p', - '\u1E57': 'p', - '\u01A5': 'p', - '\u1D7D': 'p', - '\uA751': 'p', - '\uA753': 'p', - '\uA755': 'p', - '\u24E0': 'q', - '\uFF51': 'q', - '\u024B': 'q', - '\uA757': 'q', - '\uA759': 'q', - '\u24E1': 'r', - '\uFF52': 'r', - '\u0155': 'r', - '\u1E59': 'r', - '\u0159': 'r', - '\u0211': 'r', - '\u0213': 'r', - '\u1E5B': 'r', - '\u1E5D': 'r', - '\u0157': 'r', - '\u1E5F': 'r', - '\u024D': 'r', - '\u027D': 'r', - '\uA75B': 'r', - '\uA7A7': 'r', - '\uA783': 'r', - '\u24E2': 's', - '\uFF53': 's', - '\u00DF': 's', - '\u015B': 's', - '\u1E65': 's', - '\u015D': 's', - '\u1E61': 's', - '\u0161': 's', - '\u1E67': 's', - '\u1E63': 's', - '\u1E69': 's', - '\u0219': 's', - '\u015F': 's', - '\u023F': 's', - '\uA7A9': 's', - '\uA785': 's', - '\u1E9B': 's', - '\u24E3': 't', - '\uFF54': 't', - '\u1E6B': 't', - '\u1E97': 't', - '\u0165': 't', - '\u1E6D': 't', - '\u021B': 't', - '\u0163': 't', - '\u1E71': 't', - '\u1E6F': 't', - '\u0167': 't', - '\u01AD': 't', - '\u0288': 't', - '\u2C66': 't', - '\uA787': 't', - '\uA729': 'tz', - '\u24E4': 'u', - '\uFF55': 'u', - '\u00F9': 'u', - '\u00FA': 'u', - '\u00FB': 'u', - '\u0169': 'u', - '\u1E79': 'u', - '\u016B': 'u', - '\u1E7B': 'u', - '\u016D': 'u', - '\u00FC': 'u', - '\u01DC': 'u', - '\u01D8': 'u', - '\u01D6': 'u', - '\u01DA': 'u', - '\u1EE7': 'u', - '\u016F': 'u', - '\u0171': 'u', - '\u01D4': 'u', - '\u0215': 'u', - '\u0217': 'u', - '\u01B0': 'u', - '\u1EEB': 'u', - '\u1EE9': 'u', - '\u1EEF': 'u', - '\u1EED': 'u', - '\u1EF1': 'u', - '\u1EE5': 'u', - '\u1E73': 'u', - '\u0173': 'u', - '\u1E77': 'u', - '\u1E75': 'u', - '\u0289': 'u', - '\u24E5': 'v', - '\uFF56': 'v', - '\u1E7D': 'v', - '\u1E7F': 'v', - '\u028B': 'v', - '\uA75F': 'v', - '\u028C': 'v', - '\uA761': 'vy', - '\u24E6': 'w', - '\uFF57': 'w', - '\u1E81': 'w', - '\u1E83': 'w', - '\u0175': 'w', - '\u1E87': 'w', - '\u1E85': 'w', - '\u1E98': 'w', - '\u1E89': 'w', - '\u2C73': 'w', - '\u24E7': 'x', - '\uFF58': 'x', - '\u1E8B': 'x', - '\u1E8D': 'x', - '\u24E8': 'y', - '\uFF59': 'y', - '\u1EF3': 'y', - '\u00FD': 'y', - '\u0177': 'y', - '\u1EF9': 'y', - '\u0233': 'y', - '\u1E8F': 'y', - '\u00FF': 'y', - '\u1EF7': 'y', - '\u1E99': 'y', - '\u1EF5': 'y', - '\u01B4': 'y', - '\u024F': 'y', - '\u1EFF': 'y', - '\u24E9': 'z', - '\uFF5A': 'z', - '\u017A': 'z', - '\u1E91': 'z', - '\u017C': 'z', - '\u017E': 'z', - '\u1E93': 'z', - '\u1E95': 'z', - '\u01B6': 'z', - '\u0225': 'z', - '\u0240': 'z', - '\u2C6C': 'z', - '\uA763': 'z', - '\u0386': '\u0391', - '\u0388': '\u0395', - '\u0389': '\u0397', - '\u038A': '\u0399', - '\u03AA': '\u0399', - '\u038C': '\u039F', - '\u038E': '\u03A5', - '\u03AB': '\u03A5', - '\u038F': '\u03A9', - '\u03AC': '\u03B1', - '\u03AD': '\u03B5', - '\u03AE': '\u03B7', - '\u03AF': '\u03B9', - '\u03CA': '\u03B9', - '\u0390': '\u03B9', - '\u03CC': '\u03BF', - '\u03CD': '\u03C5', - '\u03CB': '\u03C5', - '\u03B0': '\u03C5', - '\u03C9': '\u03C9', - '\u03C2': '\u03C3' - }; - - return diacritics; -}); - -S2.define('select2/data/base',[ - '../utils' -], function (Utils) { - function BaseAdapter ($element, options) { - BaseAdapter.__super__.constructor.call(this); - } - - Utils.Extend(BaseAdapter, Utils.Observable); - - BaseAdapter.prototype.current = function (callback) { - throw new Error('The `current` method must be defined in child classes.'); - }; - - BaseAdapter.prototype.query = function (params, callback) { - throw new Error('The `query` method must be defined in child classes.'); - }; - - BaseAdapter.prototype.bind = function (container, $container) { - // Can be implemented in subclasses - }; - - BaseAdapter.prototype.destroy = function () { - // Can be implemented in subclasses - }; - - BaseAdapter.prototype.generateResultId = function (container, data) { - var id = container.id + '-result-'; - - id += Utils.generateChars(4); - - if (data.id != null) { - id += '-' + data.id.toString(); - } else { - id += '-' + Utils.generateChars(4); - } - return id; - }; - - return BaseAdapter; -}); - -S2.define('select2/data/select',[ - './base', - '../utils', - 'jquery' -], function (BaseAdapter, Utils, $) { - function SelectAdapter ($element, options) { - this.$element = $element; - this.options = options; - - SelectAdapter.__super__.constructor.call(this); - } - - Utils.Extend(SelectAdapter, BaseAdapter); - - SelectAdapter.prototype.current = function (callback) { - var data = []; - var self = this; - - this.$element.find(':selected').each(function () { - var $option = $(this); - - var option = self.item($option); - - data.push(option); - }); - - callback(data); - }; - - SelectAdapter.prototype.select = function (data) { - var self = this; - - data.selected = true; - - // If data.element is a DOM node, use it instead - if ($(data.element).is('option')) { - data.element.selected = true; - - this.$element.trigger('change'); - - return; - } - - if (this.$element.prop('multiple')) { - this.current(function (currentData) { - var val = []; - - data = [data]; - data.push.apply(data, currentData); - - for (var d = 0; d < data.length; d++) { - var id = data[d].id; - - if ($.inArray(id, val) === -1) { - val.push(id); - } - } - - self.$element.val(val); - self.$element.trigger('change'); - }); - } else { - var val = data.id; - - this.$element.val(val); - this.$element.trigger('change'); - } - }; - - SelectAdapter.prototype.unselect = function (data) { - var self = this; - - if (!this.$element.prop('multiple')) { - return; - } - - data.selected = false; - - if ($(data.element).is('option')) { - data.element.selected = false; - - this.$element.trigger('change'); - - return; - } - - this.current(function (currentData) { - var val = []; - - for (var d = 0; d < currentData.length; d++) { - var id = currentData[d].id; - - if (id !== data.id && $.inArray(id, val) === -1) { - val.push(id); - } - } - - self.$element.val(val); - - self.$element.trigger('change'); - }); - }; - - SelectAdapter.prototype.bind = function (container, $container) { - var self = this; - - this.container = container; - - container.on('select', function (params) { - self.select(params.data); - }); - - container.on('unselect', function (params) { - self.unselect(params.data); - }); - }; - - SelectAdapter.prototype.destroy = function () { - // Remove anything added to child elements - this.$element.find('*').each(function () { - // Remove any custom data set by Select2 - $.removeData(this, 'data'); - }); - }; - - SelectAdapter.prototype.query = function (params, callback) { - var data = []; - var self = this; - - var $options = this.$element.children(); - - $options.each(function () { - var $option = $(this); - - if (!$option.is('option') && !$option.is('optgroup')) { - return; - } - - var option = self.item($option); - - var matches = self.matches(params, option); - - if (matches !== null) { - data.push(matches); - } - }); - - callback({ - results: data - }); - }; - - SelectAdapter.prototype.addOptions = function ($options) { - Utils.appendMany(this.$element, $options); - }; - - SelectAdapter.prototype.option = function (data) { - var option; - - if (data.children) { - option = document.createElement('optgroup'); - option.label = data.text; - } else { - option = document.createElement('option'); - - if (option.textContent !== undefined) { - option.textContent = data.text; - } else { - option.innerText = data.text; - } - } - - if (data.id) { - option.value = data.id; - } - - if (data.disabled) { - option.disabled = true; - } - - if (data.selected) { - option.selected = true; - } - - if (data.title) { - option.title = data.title; - } - - var $option = $(option); - - var normalizedData = this._normalizeItem(data); - normalizedData.element = option; - - // Override the option's data with the combined data - $.data(option, 'data', normalizedData); - - return $option; - }; - - SelectAdapter.prototype.item = function ($option) { - var data = {}; - - data = $.data($option[0], 'data'); - - if (data != null) { - return data; - } - - if ($option.is('option')) { - data = { - id: $option.val(), - text: $option.text(), - disabled: $option.prop('disabled'), - selected: $option.prop('selected'), - title: $option.prop('title') - }; - } else if ($option.is('optgroup')) { - data = { - text: $option.prop('label'), - children: [], - title: $option.prop('title') - }; - - var $children = $option.children('option'); - var children = []; - - for (var c = 0; c < $children.length; c++) { - var $child = $($children[c]); - - var child = this.item($child); - - children.push(child); - } - - data.children = children; - } - - data = this._normalizeItem(data); - data.element = $option[0]; - - $.data($option[0], 'data', data); - - return data; - }; - - SelectAdapter.prototype._normalizeItem = function (item) { - if (!$.isPlainObject(item)) { - item = { - id: item, - text: item - }; - } - - item = $.extend({}, { - text: '' - }, item); - - var defaults = { - selected: false, - disabled: false - }; - - if (item.id != null) { - item.id = item.id.toString(); - } - - if (item.text != null) { - item.text = item.text.toString(); - } - - if (item._resultId == null && item.id && this.container != null) { - item._resultId = this.generateResultId(this.container, item); - } - - return $.extend({}, defaults, item); - }; - - SelectAdapter.prototype.matches = function (params, data) { - var matcher = this.options.get('matcher'); - - return matcher(params, data); - }; - - return SelectAdapter; -}); - -S2.define('select2/data/array',[ - './select', - '../utils', - 'jquery' -], function (SelectAdapter, Utils, $) { - function ArrayAdapter ($element, options) { - var data = options.get('data') || []; - - ArrayAdapter.__super__.constructor.call(this, $element, options); - - this.addOptions(this.convertToOptions(data)); - } - - Utils.Extend(ArrayAdapter, SelectAdapter); - - ArrayAdapter.prototype.select = function (data) { - var $option = this.$element.find('option').filter(function (i, elm) { - return elm.value == data.id.toString(); - }); - - if ($option.length === 0) { - $option = this.option(data); - - this.addOptions($option); - } - - ArrayAdapter.__super__.select.call(this, data); - }; - - ArrayAdapter.prototype.convertToOptions = function (data) { - var self = this; - - var $existing = this.$element.find('option'); - var existingIds = $existing.map(function () { - return self.item($(this)).id; - }).get(); - - var $options = []; - - // Filter out all items except for the one passed in the argument - function onlyItem (item) { - return function () { - return $(this).val() == item.id; - }; - } - - for (var d = 0; d < data.length; d++) { - var item = this._normalizeItem(data[d]); - - // Skip items which were pre-loaded, only merge the data - if ($.inArray(item.id, existingIds) >= 0) { - var $existingOption = $existing.filter(onlyItem(item)); - - var existingData = this.item($existingOption); - var newData = $.extend(true, {}, existingData, item); - - var $newOption = this.option(existingData); - - $existingOption.replaceWith($newOption); - - continue; - } - - var $option = this.option(item); - - if (item.children) { - var $children = this.convertToOptions(item.children); - - Utils.appendMany($option, $children); - } - - $options.push($option); - } - - return $options; - }; - - return ArrayAdapter; -}); - -S2.define('select2/data/ajax',[ - './array', - '../utils', - 'jquery' -], function (ArrayAdapter, Utils, $) { - function AjaxAdapter ($element, options) { - this.ajaxOptions = this._applyDefaults(options.get('ajax')); - - if (this.ajaxOptions.processResults != null) { - this.processResults = this.ajaxOptions.processResults; - } - - ArrayAdapter.__super__.constructor.call(this, $element, options); - } - - Utils.Extend(AjaxAdapter, ArrayAdapter); - - AjaxAdapter.prototype._applyDefaults = function (options) { - var defaults = { - data: function (params) { - return { - q: params.term - }; - }, - transport: function (params, success, failure) { - var $request = $.ajax(params); - - $request.then(success); - $request.fail(failure); - - return $request; - } - }; - - return $.extend({}, defaults, options, true); - }; - - AjaxAdapter.prototype.processResults = function (results) { - return results; - }; - - AjaxAdapter.prototype.query = function (params, callback) { - var matches = []; - var self = this; - - if (this._request != null) { - // JSONP requests cannot always be aborted - if ($.isFunction(this._request.abort)) { - this._request.abort(); - } - - this._request = null; - } - - var options = $.extend({ - type: 'GET' - }, this.ajaxOptions); - - if (typeof options.url === 'function') { - options.url = options.url(params); - } - - if (typeof options.data === 'function') { - options.data = options.data(params); - } - - function request () { - var $request = options.transport(options, function (data) { - var results = self.processResults(data, params); - - if (self.options.get('debug') && window.console && console.error) { - // Check to make sure that the response included a `results` key. - if (!results || !results.results || !$.isArray(results.results)) { - console.error( - 'Select2: The AJAX results did not return an array in the ' + - '`results` key of the response.' - ); - } - } - - callback(results); - }, function () { - // TODO: Handle AJAX errors - }); - - self._request = $request; - } - - if (this.ajaxOptions.delay && params.term !== '') { - if (this._queryTimeout) { - window.clearTimeout(this._queryTimeout); - } - - this._queryTimeout = window.setTimeout(request, this.ajaxOptions.delay); - } else { - request(); - } - }; - - return AjaxAdapter; -}); - -S2.define('select2/data/tags',[ - 'jquery' -], function ($) { - function Tags (decorated, $element, options) { - var tags = options.get('tags'); - - var createTag = options.get('createTag'); - - if (createTag !== undefined) { - this.createTag = createTag; - } - - decorated.call(this, $element, options); - - if ($.isArray(tags)) { - for (var t = 0; t < tags.length; t++) { - var tag = tags[t]; - var item = this._normalizeItem(tag); - - var $option = this.option(item); - - this.$element.append($option); - } - } - } - - Tags.prototype.query = function (decorated, params, callback) { - var self = this; - - this._removeOldTags(); - - if (params.term == null || params.page != null) { - decorated.call(this, params, callback); - return; - } - - function wrapper (obj, child) { - var data = obj.results; - - for (var i = 0; i < data.length; i++) { - var option = data[i]; - - var checkChildren = ( - option.children != null && - !wrapper({ - results: option.children - }, true) - ); - - var checkText = option.text === params.term; - - if (checkText || checkChildren) { - if (child) { - return false; - } - - obj.data = data; - callback(obj); - - return; - } - } - - if (child) { - return true; - } - - var tag = self.createTag(params); - - if (tag != null) { - var $option = self.option(tag); - $option.attr('data-select2-tag', true); - - self.addOptions([$option]); - - self.insertTag(data, tag); - } - - obj.results = data; - - callback(obj); - } - - decorated.call(this, params, wrapper); - }; - - Tags.prototype.createTag = function (decorated, params) { - var term = $.trim(params.term); - - if (term === '') { - return null; - } - - return { - id: term, - text: term - }; - }; - - Tags.prototype.insertTag = function (_, data, tag) { - data.unshift(tag); - }; - - Tags.prototype._removeOldTags = function (_) { - var tag = this._lastTag; - - var $options = this.$element.find('option[data-select2-tag]'); - - $options.each(function () { - if (this.selected) { - return; - } - - $(this).remove(); - }); - }; - - return Tags; -}); - -S2.define('select2/data/tokenizer',[ - 'jquery' -], function ($) { - function Tokenizer (decorated, $element, options) { - var tokenizer = options.get('tokenizer'); - - if (tokenizer !== undefined) { - this.tokenizer = tokenizer; - } - - decorated.call(this, $element, options); - } - - Tokenizer.prototype.bind = function (decorated, container, $container) { - decorated.call(this, container, $container); - - this.$search = container.dropdown.$search || container.selection.$search || - $container.find('.select2-search__field'); - }; - - Tokenizer.prototype.query = function (decorated, params, callback) { - var self = this; - - function select (data) { - self.select(data); - } - - params.term = params.term || ''; - - var tokenData = this.tokenizer(params, this.options, select); - - if (tokenData.term !== params.term) { - // Replace the search term if we have the search box - if (this.$search.length) { - this.$search.val(tokenData.term); - this.$search.focus(); - } - - params.term = tokenData.term; - } - - decorated.call(this, params, callback); - }; - - Tokenizer.prototype.tokenizer = function (_, params, options, callback) { - var separators = options.get('tokenSeparators') || []; - var term = params.term; - var i = 0; - - var createTag = this.createTag || function (params) { - return { - id: params.term, - text: params.term - }; - }; - - while (i < term.length) { - var termChar = term[i]; - - if ($.inArray(termChar, separators) === -1) { - i++; - - continue; - } - - var part = term.substr(0, i); - var partParams = $.extend({}, params, { - term: part - }); - - var data = createTag(partParams); - - callback(data); - - // Reset the term to not include the tokenized portion - term = term.substr(i + 1) || ''; - i = 0; - } - - return { - term: term - }; - }; - - return Tokenizer; -}); - -S2.define('select2/data/minimumInputLength',[ - -], function () { - function MinimumInputLength (decorated, $e, options) { - this.minimumInputLength = options.get('minimumInputLength'); - - decorated.call(this, $e, options); - } - - MinimumInputLength.prototype.query = function (decorated, params, callback) { - params.term = params.term || ''; - - if (params.term.length < this.minimumInputLength) { - this.trigger('results:message', { - message: 'inputTooShort', - args: { - minimum: this.minimumInputLength, - input: params.term, - params: params - } - }); - - return; - } - - decorated.call(this, params, callback); - }; - - return MinimumInputLength; -}); - -S2.define('select2/data/maximumInputLength',[ - -], function () { - function MaximumInputLength (decorated, $e, options) { - this.maximumInputLength = options.get('maximumInputLength'); - - decorated.call(this, $e, options); - } - - MaximumInputLength.prototype.query = function (decorated, params, callback) { - params.term = params.term || ''; - - if (this.maximumInputLength > 0 && - params.term.length > this.maximumInputLength) { - this.trigger('results:message', { - message: 'inputTooLong', - args: { - maximum: this.maximumInputLength, - input: params.term, - params: params - } - }); - - return; - } - - decorated.call(this, params, callback); - }; - - return MaximumInputLength; -}); - -S2.define('select2/data/maximumSelectionLength',[ - -], function (){ - function MaximumSelectionLength (decorated, $e, options) { - this.maximumSelectionLength = options.get('maximumSelectionLength'); - - decorated.call(this, $e, options); - } - - MaximumSelectionLength.prototype.query = - function (decorated, params, callback) { - var self = this; - - this.current(function (currentData) { - var count = currentData != null ? currentData.length : 0; - if (self.maximumSelectionLength > 0 && - count >= self.maximumSelectionLength) { - self.trigger('results:message', { - message: 'maximumSelected', - args: { - maximum: self.maximumSelectionLength - } - }); - return; - } - decorated.call(self, params, callback); - }); - }; - - return MaximumSelectionLength; -}); - -S2.define('select2/dropdown',[ - 'jquery', - './utils' -], function ($, Utils) { - function Dropdown ($element, options) { - this.$element = $element; - this.options = options; - - Dropdown.__super__.constructor.call(this); - } - - Utils.Extend(Dropdown, Utils.Observable); - - Dropdown.prototype.render = function () { - var $dropdown = $( - '<span class="select2-dropdown">' + - '<span class="select2-results"></span>' + - '</span>' - ); - - $dropdown.attr('dir', this.options.get('dir')); - - this.$dropdown = $dropdown; - - return $dropdown; - }; - - Dropdown.prototype.position = function ($dropdown, $container) { - // Should be implmented in subclasses - }; - - Dropdown.prototype.destroy = function () { - // Remove the dropdown from the DOM - this.$dropdown.remove(); - }; - - return Dropdown; -}); - -S2.define('select2/dropdown/search',[ - 'jquery', - '../utils' -], function ($, Utils) { - function Search () { } - - Search.prototype.render = function (decorated) { - var $rendered = decorated.call(this); - - var $search = $( - '<span class="select2-search select2-search--dropdown">' + - '<input class="select2-search__field" type="search" tabindex="-1"' + - ' autocomplete="off" autocorrect="off" autocapitalize="off"' + - ' spellcheck="false" role="textbox" />' + - '</span>' - ); - - this.$searchContainer = $search; - this.$search = $search.find('input'); - - $rendered.prepend($search); - - return $rendered; - }; - - Search.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - this.$search.on('keydown', function (evt) { - self.trigger('keypress', evt); - - self._keyUpPrevented = evt.isDefaultPrevented(); - }); - - // Workaround for browsers which do not support the `input` event - // This will prevent double-triggering of events for browsers which support - // both the `keyup` and `input` events. - this.$search.on('input', function (evt) { - // Unbind the duplicated `keyup` event - $(this).off('keyup'); - }); - - this.$search.on('keyup input', function (evt) { - self.handleSearch(evt); - }); - - container.on('open', function () { - self.$search.attr('tabindex', 0); - - self.$search.focus(); - - window.setTimeout(function () { - self.$search.focus(); - }, 0); - }); - - container.on('close', function () { - self.$search.attr('tabindex', -1); - - self.$search.val(''); - }); - - container.on('results:all', function (params) { - if (params.query.term == null || params.query.term === '') { - var showSearch = self.showSearch(params); - - if (showSearch) { - self.$searchContainer.removeClass('select2-search--hide'); - } else { - self.$searchContainer.addClass('select2-search--hide'); - } - } - }); - }; - - Search.prototype.handleSearch = function (evt) { - if (!this._keyUpPrevented) { - var input = this.$search.val(); - - this.trigger('query', { - term: input - }); - } - - this._keyUpPrevented = false; - }; - - Search.prototype.showSearch = function (_, params) { - return true; - }; - - return Search; -}); - -S2.define('select2/dropdown/hidePlaceholder',[ - -], function () { - function HidePlaceholder (decorated, $element, options, dataAdapter) { - this.placeholder = this.normalizePlaceholder(options.get('placeholder')); - - decorated.call(this, $element, options, dataAdapter); - } - - HidePlaceholder.prototype.append = function (decorated, data) { - data.results = this.removePlaceholder(data.results); - - decorated.call(this, data); - }; - - HidePlaceholder.prototype.normalizePlaceholder = function (_, placeholder) { - if (typeof placeholder === 'string') { - placeholder = { - id: '', - text: placeholder - }; - } - - return placeholder; - }; - - HidePlaceholder.prototype.removePlaceholder = function (_, data) { - var modifiedData = data.slice(0); - - for (var d = data.length - 1; d >= 0; d--) { - var item = data[d]; - - if (this.placeholder.id === item.id) { - modifiedData.splice(d, 1); - } - } - - return modifiedData; - }; - - return HidePlaceholder; -}); - -S2.define('select2/dropdown/infiniteScroll',[ - 'jquery' -], function ($) { - function InfiniteScroll (decorated, $element, options, dataAdapter) { - this.lastParams = {}; - - decorated.call(this, $element, options, dataAdapter); - - this.$loadingMore = this.createLoadingMore(); - this.loading = false; - } - - InfiniteScroll.prototype.append = function (decorated, data) { - this.$loadingMore.remove(); - this.loading = false; - - decorated.call(this, data); - - if (this.showLoadingMore(data)) { - this.$results.append(this.$loadingMore); - } - }; - - InfiniteScroll.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('query', function (params) { - self.lastParams = params; - self.loading = true; - }); - - container.on('query:append', function (params) { - self.lastParams = params; - self.loading = true; - }); - - this.$results.on('scroll', function () { - var isLoadMoreVisible = $.contains( - document.documentElement, - self.$loadingMore[0] - ); - - if (self.loading || !isLoadMoreVisible) { - return; - } - - var currentOffset = self.$results.offset().top + - self.$results.outerHeight(false); - var loadingMoreOffset = self.$loadingMore.offset().top + - self.$loadingMore.outerHeight(false); - - if (currentOffset + 50 >= loadingMoreOffset) { - self.loadMore(); - } - }); - }; - - InfiniteScroll.prototype.loadMore = function () { - this.loading = true; - - var params = $.extend({}, {page: 1}, this.lastParams); - - params.page++; - - this.trigger('query:append', params); - }; - - InfiniteScroll.prototype.showLoadingMore = function (_, data) { - return data.pagination && data.pagination.more; - }; - - InfiniteScroll.prototype.createLoadingMore = function () { - var $option = $( - '<li class="option load-more" role="treeitem"></li>' - ); - - var message = this.options.get('translations').get('loadingMore'); - - $option.html(message(this.lastParams)); - - return $option; - }; - - return InfiniteScroll; -}); - -S2.define('select2/dropdown/attachBody',[ - 'jquery', - '../utils' -], function ($, Utils) { - function AttachBody (decorated, $element, options) { - this.$dropdownParent = options.get('dropdownParent') || document.body; - - decorated.call(this, $element, options); - } - - AttachBody.prototype.bind = function (decorated, container, $container) { - var self = this; - - var setupResultsEvents = false; - - decorated.call(this, container, $container); - - container.on('open', function () { - self._showDropdown(); - self._attachPositioningHandler(container); - - if (!setupResultsEvents) { - setupResultsEvents = true; - - container.on('results:all', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - - container.on('results:append', function () { - self._positionDropdown(); - self._resizeDropdown(); - }); - } - }); - - container.on('close', function () { - self._hideDropdown(); - self._detachPositioningHandler(container); - }); - - this.$dropdownContainer.on('mousedown', function (evt) { - evt.stopPropagation(); - }); - }; - - AttachBody.prototype.position = function (decorated, $dropdown, $container) { - // Clone all of the container classes - $dropdown.attr('class', $container.attr('class')); - - $dropdown.removeClass('select2'); - $dropdown.addClass('select2-container--open'); - - $dropdown.css({ - position: 'absolute', - top: -999999 - }); - - this.$container = $container; - }; - - AttachBody.prototype.render = function (decorated) { - var $container = $('<span></span>'); - - var $dropdown = decorated.call(this); - $container.append($dropdown); - - this.$dropdownContainer = $container; - - return $container; - }; - - AttachBody.prototype._hideDropdown = function (decorated) { - this.$dropdownContainer.detach(); - }; - - AttachBody.prototype._attachPositioningHandler = function (container) { - var self = this; - - var scrollEvent = 'scroll.select2.' + container.id; - var resizeEvent = 'resize.select2.' + container.id; - var orientationEvent = 'orientationchange.select2.' + container.id; - - var $watchers = this.$container.parents().filter(Utils.hasScroll); - $watchers.each(function () { - $(this).data('select2-scroll-position', { - x: $(this).scrollLeft(), - y: $(this).scrollTop() - }); - }); - - $watchers.on(scrollEvent, function (ev) { - var position = $(this).data('select2-scroll-position'); - $(this).scrollTop(position.y); - }); - - $(window).on(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent, - function (e) { - self._positionDropdown(); - self._resizeDropdown(); - }); - }; - - AttachBody.prototype._detachPositioningHandler = function (container) { - var scrollEvent = 'scroll.select2.' + container.id; - var resizeEvent = 'resize.select2.' + container.id; - var orientationEvent = 'orientationchange.select2.' + container.id; - - var $watchers = this.$container.parents().filter(Utils.hasScroll); - $watchers.off(scrollEvent); - - $(window).off(scrollEvent + ' ' + resizeEvent + ' ' + orientationEvent); - }; - - AttachBody.prototype._positionDropdown = function () { - var $window = $(window); - - var isCurrentlyAbove = this.$dropdown.hasClass('select2-dropdown--above'); - var isCurrentlyBelow = this.$dropdown.hasClass('select2-dropdown--below'); - - var newDirection = null; - - var position = this.$container.position(); - var offset = this.$container.offset(); - - offset.bottom = offset.top + this.$container.outerHeight(false); - - var container = { - height: this.$container.outerHeight(false) - }; - - container.top = offset.top; - container.bottom = offset.top + container.height; - - var dropdown = { - height: this.$dropdown.outerHeight(false) - }; - - var viewport = { - top: $window.scrollTop(), - bottom: $window.scrollTop() + $window.height() - }; - - var enoughRoomAbove = viewport.top < (offset.top - dropdown.height); - var enoughRoomBelow = viewport.bottom > (offset.bottom + dropdown.height); - - var css = { - left: offset.left, - top: container.bottom - }; - - if (!isCurrentlyAbove && !isCurrentlyBelow) { - newDirection = 'below'; - } - - if (!enoughRoomBelow && enoughRoomAbove && !isCurrentlyAbove) { - newDirection = 'above'; - } else if (!enoughRoomAbove && enoughRoomBelow && isCurrentlyAbove) { - newDirection = 'below'; - } - - if (newDirection == 'above' || - (isCurrentlyAbove && newDirection !== 'below')) { - css.top = container.top - dropdown.height; - } - - if (newDirection != null) { - this.$dropdown - .removeClass('select2-dropdown--below select2-dropdown--above') - .addClass('select2-dropdown--' + newDirection); - this.$container - .removeClass('select2-container--below select2-container--above') - .addClass('select2-container--' + newDirection); - } - - this.$dropdownContainer.css(css); - }; - - AttachBody.prototype._resizeDropdown = function () { - this.$dropdownContainer.width(); - - var css = { - width: this.$container.outerWidth(false) + 'px' - }; - - if (this.options.get('dropdownAutoWidth')) { - css.minWidth = css.width; - css.width = 'auto'; - } - - this.$dropdown.css(css); - }; - - AttachBody.prototype._showDropdown = function (decorated) { - this.$dropdownContainer.appendTo(this.$dropdownParent); - - this._positionDropdown(); - this._resizeDropdown(); - }; - - return AttachBody; -}); - -S2.define('select2/dropdown/minimumResultsForSearch',[ - -], function () { - function countResults (data) { - var count = 0; - - for (var d = 0; d < data.length; d++) { - var item = data[d]; - - if (item.children) { - count += countResults(item.children); - } else { - count++; - } - } - - return count; - } - - function MinimumResultsForSearch (decorated, $element, options, dataAdapter) { - this.minimumResultsForSearch = options.get('minimumResultsForSearch'); - - if (this.minimumResultsForSearch < 0) { - this.minimumResultsForSearch = Infinity; - } - - decorated.call(this, $element, options, dataAdapter); - } - - MinimumResultsForSearch.prototype.showSearch = function (decorated, params) { - if (countResults(params.data.results) < this.minimumResultsForSearch) { - return false; - } - - return decorated.call(this, params); - }; - - return MinimumResultsForSearch; -}); - -S2.define('select2/dropdown/selectOnClose',[ - -], function () { - function SelectOnClose () { } - - SelectOnClose.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('close', function () { - self._handleSelectOnClose(); - }); - }; - - SelectOnClose.prototype._handleSelectOnClose = function () { - var $highlightedResults = this.getHighlightedResults(); - - if ($highlightedResults.length < 1) { - return; - } - - this.trigger('select', { - data: $highlightedResults.data('data') - }); - }; - - return SelectOnClose; -}); - -S2.define('select2/dropdown/closeOnSelect',[ - -], function () { - function CloseOnSelect () { } - - CloseOnSelect.prototype.bind = function (decorated, container, $container) { - var self = this; - - decorated.call(this, container, $container); - - container.on('select', function (evt) { - self._selectTriggered(evt); - }); - - container.on('unselect', function (evt) { - self._selectTriggered(evt); - }); - }; - - CloseOnSelect.prototype._selectTriggered = function (_, evt) { - var originalEvent = evt.originalEvent; - - // Don't close if the control key is being held - if (originalEvent && originalEvent.ctrlKey) { - return; - } - - this.trigger('close'); - }; - - return CloseOnSelect; -}); - -S2.define('select2/i18n/en',[],function () { - // English - return { - errorLoading: function () { - return 'The results could not be loaded.'; - }, - inputTooLong: function (args) { - var overChars = args.input.length - args.maximum; - - var message = 'Please delete ' + overChars + ' character'; - - if (overChars != 1) { - message += 's'; - } - - return message; - }, - inputTooShort: function (args) { - var remainingChars = args.minimum - args.input.length; - - var message = 'Please enter ' + remainingChars + ' or more characters'; - - return message; - }, - loadingMore: function () { - return 'Loading more results…'; - }, - maximumSelected: function (args) { - var message = 'You can only select ' + args.maximum + ' item'; - - if (args.maximum != 1) { - message += 's'; - } - - return message; - }, - noResults: function () { - return 'No results found'; - }, - searching: function () { - return 'Searching…'; - } - }; -}); - -S2.define('select2/defaults',[ - 'jquery', - 'require', - - './results', - - './selection/single', - './selection/multiple', - './selection/placeholder', - './selection/allowClear', - './selection/search', - './selection/eventRelay', - - './utils', - './translation', - './diacritics', - - './data/select', - './data/array', - './data/ajax', - './data/tags', - './data/tokenizer', - './data/minimumInputLength', - './data/maximumInputLength', - './data/maximumSelectionLength', - - './dropdown', - './dropdown/search', - './dropdown/hidePlaceholder', - './dropdown/infiniteScroll', - './dropdown/attachBody', - './dropdown/minimumResultsForSearch', - './dropdown/selectOnClose', - './dropdown/closeOnSelect', - - './i18n/en' -], function ($, require, - - ResultsList, - - SingleSelection, MultipleSelection, Placeholder, AllowClear, - SelectionSearch, EventRelay, - - Utils, Translation, DIACRITICS, - - SelectData, ArrayData, AjaxData, Tags, Tokenizer, - MinimumInputLength, MaximumInputLength, MaximumSelectionLength, - - Dropdown, DropdownSearch, HidePlaceholder, InfiniteScroll, - AttachBody, MinimumResultsForSearch, SelectOnClose, CloseOnSelect, - - EnglishTranslation) { - function Defaults () { - this.reset(); - } - - Defaults.prototype.apply = function (options) { - options = $.extend({}, this.defaults, options); - - if (options.dataAdapter == null) { - if (options.ajax != null) { - options.dataAdapter = AjaxData; - } else if (options.data != null) { - options.dataAdapter = ArrayData; - } else { - options.dataAdapter = SelectData; - } - - if (options.minimumInputLength > 0) { - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - MinimumInputLength - ); - } - - if (options.maximumInputLength > 0) { - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - MaximumInputLength - ); - } - - if (options.maximumSelectionLength > 0) { - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - MaximumSelectionLength - ); - } - - if (options.tags) { - options.dataAdapter = Utils.Decorate(options.dataAdapter, Tags); - } - - if (options.tokenSeparators != null || options.tokenizer != null) { - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - Tokenizer - ); - } - - if (options.query != null) { - var Query = require(options.amdBase + 'compat/query'); - - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - Query - ); - } - - if (options.initSelection != null) { - var InitSelection = require(options.amdBase + 'compat/initSelection'); - - options.dataAdapter = Utils.Decorate( - options.dataAdapter, - InitSelection - ); - } - } - - if (options.resultsAdapter == null) { - options.resultsAdapter = ResultsList; - - if (options.ajax != null) { - options.resultsAdapter = Utils.Decorate( - options.resultsAdapter, - InfiniteScroll - ); - } - - if (options.placeholder != null) { - options.resultsAdapter = Utils.Decorate( - options.resultsAdapter, - HidePlaceholder - ); - } - - if (options.selectOnClose) { - options.resultsAdapter = Utils.Decorate( - options.resultsAdapter, - SelectOnClose - ); - } - } - - if (options.dropdownAdapter == null) { - if (options.multiple) { - options.dropdownAdapter = Dropdown; - } else { - var SearchableDropdown = Utils.Decorate(Dropdown, DropdownSearch); - - options.dropdownAdapter = SearchableDropdown; - } - - if (options.minimumResultsForSearch !== 0) { - options.dropdownAdapter = Utils.Decorate( - options.dropdownAdapter, - MinimumResultsForSearch - ); - } - - if (options.closeOnSelect) { - options.dropdownAdapter = Utils.Decorate( - options.dropdownAdapter, - CloseOnSelect - ); - } - - if ( - options.dropdownCssClass != null || - options.dropdownCss != null || - options.adaptDropdownCssClass != null - ) { - var DropdownCSS = require(options.amdBase + 'compat/dropdownCss'); - - options.dropdownAdapter = Utils.Decorate( - options.dropdownAdapter, - DropdownCSS - ); - } - - options.dropdownAdapter = Utils.Decorate( - options.dropdownAdapter, - AttachBody - ); - } - - if (options.selectionAdapter == null) { - if (options.multiple) { - options.selectionAdapter = MultipleSelection; - } else { - options.selectionAdapter = SingleSelection; - } - - // Add the placeholder mixin if a placeholder was specified - if (options.placeholder != null) { - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - Placeholder - ); - } - - if (options.allowClear) { - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - AllowClear - ); - } - - if (options.multiple) { - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - SelectionSearch - ); - } - - if ( - options.containerCssClass != null || - options.containerCss != null || - options.adaptContainerCssClass != null - ) { - var ContainerCSS = require(options.amdBase + 'compat/containerCss'); - - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - ContainerCSS - ); - } - - options.selectionAdapter = Utils.Decorate( - options.selectionAdapter, - EventRelay - ); - } - - if (typeof options.language === 'string') { - // Check if the language is specified with a region - if (options.language.indexOf('-') > 0) { - // Extract the region information if it is included - var languageParts = options.language.split('-'); - var baseLanguage = languageParts[0]; - - options.language = [options.language, baseLanguage]; - } else { - options.language = [options.language]; - } - } - - if ($.isArray(options.language)) { - var languages = new Translation(); - options.language.push('en'); - - var languageNames = options.language; - - for (var l = 0; l < languageNames.length; l++) { - var name = languageNames[l]; - var language = {}; - - try { - // Try to load it with the original name - language = Translation.loadPath(name); - } catch (e) { - try { - // If we couldn't load it, check if it wasn't the full path - name = this.defaults.amdLanguageBase + name; - language = Translation.loadPath(name); - } catch (ex) { - // The translation could not be loaded at all. Sometimes this is - // because of a configuration problem, other times this can be - // because of how Select2 helps load all possible translation files. - if (options.debug && window.console && console.warn) { - console.warn( - 'Select2: The language file for "' + name + '" could not be ' + - 'automatically loaded. A fallback will be used instead.' - ); - } - - continue; - } - } - - languages.extend(language); - } - - options.translations = languages; - } else { - var baseTranslation = Translation.loadPath( - this.defaults.amdLanguageBase + 'en' - ); - var customTranslation = new Translation(options.language); - - customTranslation.extend(baseTranslation); - - options.translations = customTranslation; - } - - return options; - }; - - Defaults.prototype.reset = function () { - function stripDiacritics (text) { - // Used 'uni range + named function' from http://jsperf.com/diacritics/18 - function match(a) { - return DIACRITICS[a] || a; - } - - return text.replace(/[^\u0000-\u007E]/g, match); - } - - function matcher (params, data) { - // Always return the object if there is nothing to compare - if ($.trim(params.term) === '') { - return data; - } - - // Do a recursive check for options with children - if (data.children && data.children.length > 0) { - // Clone the data object if there are children - // This is required as we modify the object to remove any non-matches - var match = $.extend(true, {}, data); - - // Check each child of the option - for (var c = data.children.length - 1; c >= 0; c--) { - var child = data.children[c]; - - var matches = matcher(params, child); - - // If there wasn't a match, remove the object in the array - if (matches == null) { - match.children.splice(c, 1); - } - } - - // If any children matched, return the new object - if (match.children.length > 0) { - return match; - } - - // If there were no matching children, check just the plain object - return matcher(params, match); - } - - var original = stripDiacritics(data.text).toUpperCase(); - var term = stripDiacritics(params.term).toUpperCase(); - - // Check if the text contains the term - if (original.indexOf(term) > -1) { - return data; - } - - // If it doesn't contain the term, don't return anything - return null; - } - - this.defaults = { - amdBase: './', - amdLanguageBase: './i18n/', - closeOnSelect: true, - debug: false, - dropdownAutoWidth: false, - escapeMarkup: Utils.escapeMarkup, - language: EnglishTranslation, - matcher: matcher, - minimumInputLength: 0, - maximumInputLength: 0, - maximumSelectionLength: 0, - minimumResultsForSearch: 0, - selectOnClose: false, - sorter: function (data) { - return data; - }, - templateResult: function (result) { - return result.text; - }, - templateSelection: function (selection) { - return selection.text; - }, - theme: 'default', - width: 'resolve' - }; - }; - - Defaults.prototype.set = function (key, value) { - var camelKey = $.camelCase(key); - - var data = {}; - data[camelKey] = value; - - var convertedData = Utils._convertData(data); - - $.extend(this.defaults, convertedData); - }; - - var defaults = new Defaults(); - - return defaults; -}); - -S2.define('select2/options',[ - 'require', - 'jquery', - './defaults', - './utils' -], function (require, $, Defaults, Utils) { - function Options (options, $element) { - this.options = options; - - if ($element != null) { - this.fromElement($element); - } - - this.options = Defaults.apply(this.options); - - if ($element && $element.is('input')) { - var InputCompat = require(this.get('amdBase') + 'compat/inputData'); - - this.options.dataAdapter = Utils.Decorate( - this.options.dataAdapter, - InputCompat - ); - } - } - - Options.prototype.fromElement = function ($e) { - var excludedData = ['select2']; - - if (this.options.multiple == null) { - this.options.multiple = $e.prop('multiple'); - } - - if (this.options.disabled == null) { - this.options.disabled = $e.prop('disabled'); - } - - if (this.options.language == null) { - if ($e.prop('lang')) { - this.options.language = $e.prop('lang').toLowerCase(); - } else if ($e.closest('[lang]').prop('lang')) { - this.options.language = $e.closest('[lang]').prop('lang'); - } - } - - if (this.options.dir == null) { - if ($e.prop('dir')) { - this.options.dir = $e.prop('dir'); - } else if ($e.closest('[dir]').prop('dir')) { - this.options.dir = $e.closest('[dir]').prop('dir'); - } else { - this.options.dir = 'ltr'; - } - } - - $e.prop('disabled', this.options.disabled); - $e.prop('multiple', this.options.multiple); - - if ($e.data('select2Tags')) { - if (this.options.debug && window.console && console.warn) { - console.warn( - 'Select2: The `data-select2-tags` attribute has been changed to ' + - 'use the `data-data` and `data-tags="true"` attributes and will be ' + - 'removed in future versions of Select2.' - ); - } - - $e.data('data', $e.data('select2Tags')); - $e.data('tags', true); - } - - if ($e.data('ajaxUrl')) { - if (this.options.debug && window.console && console.warn) { - console.warn( - 'Select2: The `data-ajax-url` attribute has been changed to ' + - '`data-ajax--url` and support for the old attribute will be removed' + - ' in future versions of Select2.' - ); - } - - $e.attr('ajax--url', $e.data('ajaxUrl')); - $e.data('ajax--url', $e.data('ajaxUrl')); - } - - var dataset = {}; - - // Prefer the element's `dataset` attribute if it exists - // jQuery 1.x does not correctly handle data attributes with multiple dashes - if ($.fn.jquery && $.fn.jquery.substr(0, 2) == '1.' && $e[0].dataset) { - dataset = $.extend(true, {}, $e[0].dataset, $e.data()); - } else { - dataset = $e.data(); - } - - var data = $.extend(true, {}, dataset); - - data = Utils._convertData(data); - - for (var key in data) { - if ($.inArray(key, excludedData) > -1) { - continue; - } - - if ($.isPlainObject(this.options[key])) { - $.extend(this.options[key], data[key]); - } else { - this.options[key] = data[key]; - } - } - - return this; - }; - - Options.prototype.get = function (key) { - return this.options[key]; - }; - - Options.prototype.set = function (key, val) { - this.options[key] = val; - }; - - return Options; -}); - -S2.define('select2/core',[ - 'jquery', - './options', - './utils', - './keys' -], function ($, Options, Utils, KEYS) { - var Select2 = function ($element, options) { - if ($element.data('select2') != null) { - $element.data('select2').destroy(); - } - - this.$element = $element; - - this.id = this._generateId($element); - - options = options || {}; - - this.options = new Options(options, $element); - - Select2.__super__.constructor.call(this); - - // Set up the tabindex - - var tabindex = $element.attr('tabindex') || 0; - $element.data('old-tabindex', tabindex); - $element.attr('tabindex', '-1'); - - // Set up containers and adapters - - var DataAdapter = this.options.get('dataAdapter'); - this.dataAdapter = new DataAdapter($element, this.options); - - var $container = this.render(); - - this._placeContainer($container); - - var SelectionAdapter = this.options.get('selectionAdapter'); - this.selection = new SelectionAdapter($element, this.options); - this.$selection = this.selection.render(); - - this.selection.position(this.$selection, $container); - - var DropdownAdapter = this.options.get('dropdownAdapter'); - this.dropdown = new DropdownAdapter($element, this.options); - this.$dropdown = this.dropdown.render(); - - this.dropdown.position(this.$dropdown, $container); - - var ResultsAdapter = this.options.get('resultsAdapter'); - this.results = new ResultsAdapter($element, this.options, this.dataAdapter); - this.$results = this.results.render(); - - this.results.position(this.$results, this.$dropdown); - - // Bind events - - var self = this; - - // Bind the container to all of the adapters - this._bindAdapters(); - - // Register any DOM event handlers - this._registerDomEvents(); - - // Register any internal event handlers - this._registerDataEvents(); - this._registerSelectionEvents(); - this._registerDropdownEvents(); - this._registerResultsEvents(); - this._registerEvents(); - - // Set the initial state - this.dataAdapter.current(function (initialData) { - self.trigger('selection:update', { - data: initialData - }); - }); - - // Hide the original select - $element.addClass('select2-hidden-accessible'); - $element.attr('aria-hidden', 'true'); - - // Synchronize any monitored attributes - this._syncAttributes(); - - $element.data('select2', this); - }; - - Utils.Extend(Select2, Utils.Observable); - - Select2.prototype._generateId = function ($element) { - var id = ''; - - if ($element.attr('id') != null) { - id = $element.attr('id'); - } else if ($element.attr('name') != null) { - id = $element.attr('name') + '-' + Utils.generateChars(2); - } else { - id = Utils.generateChars(4); - } - - id = 'select2-' + id; - - return id; - }; - - Select2.prototype._placeContainer = function ($container) { - $container.insertAfter(this.$element); - - var width = this._resolveWidth(this.$element, this.options.get('width')); - - if (width != null) { - $container.css('width', width); - } - }; - - Select2.prototype._resolveWidth = function ($element, method) { - var WIDTH = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i; - - if (method == 'resolve') { - var styleWidth = this._resolveWidth($element, 'style'); - - if (styleWidth != null) { - return styleWidth; - } - - return this._resolveWidth($element, 'element'); - } - - if (method == 'element') { - var elementWidth = $element.outerWidth(false); - - if (elementWidth <= 0) { - return 'auto'; - } - - return elementWidth + 'px'; - } - - if (method == 'style') { - var style = $element.attr('style'); - - if (typeof(style) !== 'string') { - return null; - } - - var attrs = style.split(';'); - - for (var i = 0, l = attrs.length; i < l; i = i + 1) { - var attr = attrs[i].replace(/\s/g, ''); - var matches = attr.match(WIDTH); - - if (matches !== null && matches.length >= 1) { - return matches[1]; - } - } - - return null; - } - - return method; - }; - - Select2.prototype._bindAdapters = function () { - this.dataAdapter.bind(this, this.$container); - this.selection.bind(this, this.$container); - - this.dropdown.bind(this, this.$container); - this.results.bind(this, this.$container); - }; - - Select2.prototype._registerDomEvents = function () { - var self = this; - - this.$element.on('change.select2', function () { - self.dataAdapter.current(function (data) { - self.trigger('selection:update', { - data: data - }); - }); - }); - - this._sync = Utils.bind(this._syncAttributes, this); - - if (this.$element[0].attachEvent) { - this.$element[0].attachEvent('onpropertychange', this._sync); - } - - var observer = window.MutationObserver || - window.WebKitMutationObserver || - window.MozMutationObserver - ; - - if (observer != null) { - this._observer = new observer(function (mutations) { - $.each(mutations, self._sync); - }); - this._observer.observe(this.$element[0], { - attributes: true, - subtree: false - }); - } else if (this.$element[0].addEventListener) { - this.$element[0].addEventListener('DOMAttrModified', self._sync, false); - } - }; - - Select2.prototype._registerDataEvents = function () { - var self = this; - - this.dataAdapter.on('*', function (name, params) { - self.trigger(name, params); - }); - }; - - Select2.prototype._registerSelectionEvents = function () { - var self = this; - var nonRelayEvents = ['toggle']; - - this.selection.on('toggle', function () { - self.toggleDropdown(); - }); - - this.selection.on('*', function (name, params) { - if ($.inArray(name, nonRelayEvents) !== -1) { - return; - } - - self.trigger(name, params); - }); - }; - - Select2.prototype._registerDropdownEvents = function () { - var self = this; - - this.dropdown.on('*', function (name, params) { - self.trigger(name, params); - }); - }; - - Select2.prototype._registerResultsEvents = function () { - var self = this; - - this.results.on('*', function (name, params) { - self.trigger(name, params); - }); - }; - - Select2.prototype._registerEvents = function () { - var self = this; - - this.on('open', function () { - self.$container.addClass('select2-container--open'); - }); - - this.on('close', function () { - self.$container.removeClass('select2-container--open'); - }); - - this.on('enable', function () { - self.$container.removeClass('select2-container--disabled'); - }); - - this.on('disable', function () { - self.$container.addClass('select2-container--disabled'); - }); - - this.on('focus', function () { - self.$container.addClass('select2-container--focus'); - }); - - this.on('blur', function () { - self.$container.removeClass('select2-container--focus'); - }); - - this.on('query', function (params) { - if (!self.isOpen()) { - self.trigger('open'); - } - - this.dataAdapter.query(params, function (data) { - self.trigger('results:all', { - data: data, - query: params - }); - }); - }); - - this.on('query:append', function (params) { - this.dataAdapter.query(params, function (data) { - self.trigger('results:append', { - data: data, - query: params - }); - }); - }); - - this.on('keypress', function (evt) { - var key = evt.which; - - if (self.isOpen()) { - if (key === KEYS.ENTER) { - self.trigger('results:select'); - - evt.preventDefault(); - } else if ((key === KEYS.SPACE && evt.ctrlKey)) { - self.trigger('results:toggle'); - - evt.preventDefault(); - } else if (key === KEYS.UP) { - self.trigger('results:previous'); - - evt.preventDefault(); - } else if (key === KEYS.DOWN) { - self.trigger('results:next'); - - evt.preventDefault(); - } else if (key === KEYS.ESC || key === KEYS.TAB) { - self.close(); - - evt.preventDefault(); - } - } else { - if (key === KEYS.ENTER || key === KEYS.SPACE || - ((key === KEYS.DOWN || key === KEYS.UP) && evt.altKey)) { - self.open(); - - evt.preventDefault(); - } - } - }); - }; - - Select2.prototype._syncAttributes = function () { - this.options.set('disabled', this.$element.prop('disabled')); - - if (this.options.get('disabled')) { - if (this.isOpen()) { - this.close(); - } - - this.trigger('disable'); - } else { - this.trigger('enable'); - } - }; - - /** - * Override the trigger method to automatically trigger pre-events when - * there are events that can be prevented. - */ - Select2.prototype.trigger = function (name, args) { - var actualTrigger = Select2.__super__.trigger; - var preTriggerMap = { - 'open': 'opening', - 'close': 'closing', - 'select': 'selecting', - 'unselect': 'unselecting' - }; - - if (name in preTriggerMap) { - var preTriggerName = preTriggerMap[name]; - var preTriggerArgs = { - prevented: false, - name: name, - args: args - }; - - actualTrigger.call(this, preTriggerName, preTriggerArgs); - - if (preTriggerArgs.prevented) { - args.prevented = true; - - return; - } - } - - actualTrigger.call(this, name, args); - }; - - Select2.prototype.toggleDropdown = function () { - if (this.options.get('disabled')) { - return; - } - - if (this.isOpen()) { - this.close(); - } else { - this.open(); - } - }; - - Select2.prototype.open = function () { - if (this.isOpen()) { - return; - } - - this.trigger('query', {}); - - this.trigger('open'); - }; - - Select2.prototype.close = function () { - if (!this.isOpen()) { - return; - } - - this.trigger('close'); - }; - - Select2.prototype.isOpen = function () { - return this.$container.hasClass('select2-container--open'); - }; - - Select2.prototype.enable = function (args) { - if (this.options.get('debug') && window.console && console.warn) { - console.warn( - 'Select2: The `select2("enable")` method has been deprecated and will' + - ' be removed in later Select2 versions. Use $element.prop("disabled")' + - ' instead.' - ); - } - - if (args == null || args.length === 0) { - args = [true]; - } - - var disabled = !args[0]; - - this.$element.prop('disabled', disabled); - }; - - Select2.prototype.data = function () { - if (this.options.get('debug') && - arguments.length > 0 && window.console && console.warn) { - console.warn( - 'Select2: Data can no longer be set using `select2("data")`. You ' + - 'should consider setting the value instead using `$element.val()`.' - ); - } - - var data = []; - - this.dataAdapter.current(function (currentData) { - data = currentData; - }); - - return data; - }; - - Select2.prototype.val = function (args) { - if (this.options.get('debug') && window.console && console.warn) { - console.warn( - 'Select2: The `select2("val")` method has been deprecated and will be' + - ' removed in later Select2 versions. Use $element.val() instead.' - ); - } - - if (args == null || args.length === 0) { - return this.$element.val(); - } - - var newVal = args[0]; - - if ($.isArray(newVal)) { - newVal = $.map(newVal, function (obj) { - return obj.toString(); - }); - } - - this.$element.val(newVal).trigger('change'); - }; - - Select2.prototype.destroy = function () { - this.$container.remove(); - - if (this.$element[0].detachEvent) { - this.$element[0].detachEvent('onpropertychange', this._sync); - } - - if (this._observer != null) { - this._observer.disconnect(); - this._observer = null; - } else if (this.$element[0].removeEventListener) { - this.$element[0] - .removeEventListener('DOMAttrModified', this._sync, false); - } - - this._sync = null; - - this.$element.off('.select2'); - this.$element.attr('tabindex', this.$element.data('old-tabindex')); - - this.$element.removeClass('select2-hidden-accessible'); - this.$element.attr('aria-hidden', 'false'); - this.$element.removeData('select2'); - - this.dataAdapter.destroy(); - this.selection.destroy(); - this.dropdown.destroy(); - this.results.destroy(); - - this.dataAdapter = null; - this.selection = null; - this.dropdown = null; - this.results = null; - }; - - Select2.prototype.render = function () { - var $container = $( - '<span class="select2 select2-container">' + - '<span class="selection"></span>' + - '<span class="dropdown-wrapper" aria-hidden="true"></span>' + - '</span>' - ); - - $container.attr('dir', this.options.get('dir')); - - this.$container = $container; - - this.$container.addClass('select2-container--' + this.options.get('theme')); - - $container.data('element', this.$element); - - return $container; - }; - - return Select2; -}); - -S2.define('select2/compat/utils',[ - 'jquery' -], function ($) { - function syncCssClasses ($dest, $src, adapter) { - var classes, replacements = [], adapted; - - classes = $.trim($dest.attr('class')); - - if (classes) { - classes = '' + classes; // for IE which returns object - - $(classes.split(/\s+/)).each(function () { - // Save all Select2 classes - if (this.indexOf('select2-') === 0) { - replacements.push(this); - } - }); - } - - classes = $.trim($src.attr('class')); - - if (classes) { - classes = '' + classes; // for IE which returns object - - $(classes.split(/\s+/)).each(function () { - // Only adapt non-Select2 classes - if (this.indexOf('select2-') !== 0) { - adapted = adapter(this); - - if (adapted != null) { - replacements.push(adapted); - } - } - }); - } - - $dest.attr('class', replacements.join(' ')); - } - - return { - syncCssClasses: syncCssClasses - }; -}); - -S2.define('select2/compat/containerCss',[ - 'jquery', - './utils' -], function ($, CompatUtils) { - // No-op CSS adapter that discards all classes by default - function _containerAdapter (clazz) { - return null; - } - - function ContainerCSS () { } - - ContainerCSS.prototype.render = function (decorated) { - var $container = decorated.call(this); - - var containerCssClass = this.options.get('containerCssClass') || ''; - - if ($.isFunction(containerCssClass)) { - containerCssClass = containerCssClass(this.$element); - } - - var containerCssAdapter = this.options.get('adaptContainerCssClass'); - containerCssAdapter = containerCssAdapter || _containerAdapter; - - if (containerCssClass.indexOf(':all:') !== -1) { - containerCssClass = containerCssClass.replace(':all', ''); - - var _cssAdapter = containerCssAdapter; - - containerCssAdapter = function (clazz) { - var adapted = _cssAdapter(clazz); - - if (adapted != null) { - // Append the old one along with the adapted one - return adapted + ' ' + clazz; - } - - return clazz; - }; - } - - var containerCss = this.options.get('containerCss') || {}; - - if ($.isFunction(containerCss)) { - containerCss = containerCss(this.$element); - } - - CompatUtils.syncCssClasses($container, this.$element, containerCssAdapter); - - $container.css(containerCss); - $container.addClass(containerCssClass); - - return $container; - }; - - return ContainerCSS; -}); - -S2.define('select2/compat/dropdownCss',[ - 'jquery', - './utils' -], function ($, CompatUtils) { - // No-op CSS adapter that discards all classes by default - function _dropdownAdapter (clazz) { - return null; - } - - function DropdownCSS () { } - - DropdownCSS.prototype.render = function (decorated) { - var $dropdown = decorated.call(this); - - var dropdownCssClass = this.options.get('dropdownCssClass') || ''; - - if ($.isFunction(dropdownCssClass)) { - dropdownCssClass = dropdownCssClass(this.$element); - } - - var dropdownCssAdapter = this.options.get('adaptDropdownCssClass'); - dropdownCssAdapter = dropdownCssAdapter || _dropdownAdapter; - - if (dropdownCssClass.indexOf(':all:') !== -1) { - dropdownCssClass = dropdownCssClass.replace(':all', ''); - - var _cssAdapter = dropdownCssAdapter; - - dropdownCssAdapter = function (clazz) { - var adapted = _cssAdapter(clazz); - - if (adapted != null) { - // Append the old one along with the adapted one - return adapted + ' ' + clazz; - } - - return clazz; - }; - } - - var dropdownCss = this.options.get('dropdownCss') || {}; - - if ($.isFunction(dropdownCss)) { - dropdownCss = dropdownCss(this.$element); - } - - CompatUtils.syncCssClasses($dropdown, this.$element, dropdownCssAdapter); - - $dropdown.css(dropdownCss); - $dropdown.addClass(dropdownCssClass); - - return $dropdown; - }; - - return DropdownCSS; -}); - -S2.define('select2/compat/initSelection',[ - 'jquery' -], function ($) { - function InitSelection (decorated, $element, options) { - if (options.get('debug') && window.console && console.warn) { - console.warn( - 'Select2: The `initSelection` option has been deprecated in favor' + - ' of a custom data adapter that overrides the `current` method. ' + - 'This method is now called multiple times instead of a single ' + - 'time when the instance is initialized. Support will be removed ' + - 'for the `initSelection` option in future versions of Select2' - ); - } - - this.initSelection = options.get('initSelection'); - this._isInitialized = false; - - decorated.call(this, $element, options); - } - - InitSelection.prototype.current = function (decorated, callback) { - var self = this; - - if (this._isInitialized) { - decorated.call(this, callback); - - return; - } - - this.initSelection.call(null, this.$element, function (data) { - self._isInitialized = true; - - if (!$.isArray(data)) { - data = [data]; - } - - callback(data); - }); - }; - - return InitSelection; -}); - -S2.define('select2/compat/inputData',[ - 'jquery' -], function ($) { - function InputData (decorated, $element, options) { - this._currentData = []; - this._valueSeparator = options.get('valueSeparator') || ','; - - if ($element.prop('type') === 'hidden') { - if (options.get('debug') && console && console.warn) { - console.warn( - 'Select2: Using a hidden input with Select2 is no longer ' + - 'supported and may stop working in the future. It is recommended ' + - 'to use a `<select>` element instead.' - ); - } - } - - decorated.call(this, $element, options); - } - - InputData.prototype.current = function (_, callback) { - function getSelected (data, selectedIds) { - var selected = []; - - if (data.selected || $.inArray(data.id, selectedIds) !== -1) { - data.selected = true; - selected.push(data); - } else { - data.selected = false; - } - - if (data.children) { - selected.push.apply(selected, getSelected(data.children, selectedIds)); - } - - return selected; - } - - var selected = []; - - for (var d = 0; d < this._currentData.length; d++) { - var data = this._currentData[d]; - - selected.push.apply( - selected, - getSelected( - data, - this.$element.val().split( - this._valueSeparator - ) - ) - ); - } - - callback(selected); - }; - - InputData.prototype.select = function (_, data) { - if (!this.options.get('multiple')) { - this.current(function (allData) { - $.map(allData, function (data) { - data.selected = false; - }); - }); - - this.$element.val(data.id); - this.$element.trigger('change'); - } else { - var value = this.$element.val(); - value += this._valueSeparator + data.id; - - this.$element.val(value); - this.$element.trigger('change'); - } - }; - - InputData.prototype.unselect = function (_, data) { - var self = this; - - data.selected = false; - - this.current(function (allData) { - var values = []; - - for (var d = 0; d < allData.length; d++) { - var item = allData[d]; - - if (data.id == item.id) { - continue; - } - - values.push(item.id); - } - - self.$element.val(values.join(self._valueSeparator)); - self.$element.trigger('change'); - }); - }; - - InputData.prototype.query = function (_, params, callback) { - var results = []; - - for (var d = 0; d < this._currentData.length; d++) { - var data = this._currentData[d]; - - var matches = this.matches(params, data); - - if (matches !== null) { - results.push(matches); - } - } - - callback({ - results: results - }); - }; - - InputData.prototype.addOptions = function (_, $options) { - var options = $.map($options, function ($option) { - return $.data($option[0], 'data'); - }); - - this._currentData.push.apply(this._currentData, options); - }; - - return InputData; -}); - -S2.define('select2/compat/matcher',[ - 'jquery' -], function ($) { - function oldMatcher (matcher) { - function wrappedMatcher (params, data) { - var match = $.extend(true, {}, data); - - if (params.term == null || $.trim(params.term) === '') { - return match; - } - - if (data.children) { - for (var c = data.children.length - 1; c >= 0; c--) { - var child = data.children[c]; - - // Check if the child object matches - // The old matcher returned a boolean true or false - var doesMatch = matcher(params.term, child.text, child); - - // If the child didn't match, pop it off - if (!doesMatch) { - match.children.splice(c, 1); - } - } - - if (match.children.length > 0) { - return match; - } - } - - if (matcher(params.term, data.text, data)) { - return match; - } - - return null; - } - - return wrappedMatcher; - } - - return oldMatcher; -}); - -S2.define('select2/compat/query',[ - -], function () { - function Query (decorated, $element, options) { - if (options.get('debug') && window.console && console.warn) { - console.warn( - 'Select2: The `query` option has been deprecated in favor of a ' + - 'custom data adapter that overrides the `query` method. Support ' + - 'will be removed for the `query` option in future versions of ' + - 'Select2.' - ); - } - - decorated.call(this, $element, options); - } - - Query.prototype.query = function (_, params, callback) { - params.callback = callback; - - var query = this.options.get('query'); - - query.call(null, params); - }; - - return Query; -}); - -S2.define('select2/dropdown/attachContainer',[ - -], function () { - function AttachContainer (decorated, $element, options) { - decorated.call(this, $element, options); - } - - AttachContainer.prototype.position = - function (decorated, $dropdown, $container) { - var $dropdownContainer = $container.find('.dropdown-wrapper'); - $dropdownContainer.append($dropdown); - - $dropdown.addClass('select2-dropdown--below'); - $container.addClass('select2-container--below'); - }; - - return AttachContainer; -}); - -S2.define('select2/dropdown/stopPropagation',[ - -], function () { - function StopPropagation () { } - - StopPropagation.prototype.bind = function (decorated, container, $container) { - decorated.call(this, container, $container); - - var stoppedEvents = [ - 'blur', - 'change', - 'click', - 'dblclick', - 'focus', - 'focusin', - 'focusout', - 'input', - 'keydown', - 'keyup', - 'keypress', - 'mousedown', - 'mouseenter', - 'mouseleave', - 'mousemove', - 'mouseover', - 'mouseup', - 'search', - 'touchend', - 'touchstart' - ]; - - this.$dropdown.on(stoppedEvents.join(' '), function (evt) { - evt.stopPropagation(); - }); - }; - - return StopPropagation; -}); - -S2.define('select2/selection/stopPropagation',[ - -], function () { - function StopPropagation () { } - - StopPropagation.prototype.bind = function (decorated, container, $container) { - decorated.call(this, container, $container); - - var stoppedEvents = [ - 'blur', - 'change', - 'click', - 'dblclick', - 'focus', - 'focusin', - 'focusout', - 'input', - 'keydown', - 'keyup', - 'keypress', - 'mousedown', - 'mouseenter', - 'mouseleave', - 'mousemove', - 'mouseover', - 'mouseup', - 'search', - 'touchend', - 'touchstart' - ]; - - this.$selection.on(stoppedEvents.join(' '), function (evt) { - evt.stopPropagation(); - }); - }; - - return StopPropagation; -}); - -S2.define('jquery.select2',[ - 'jquery', - 'require', - - './select2/core', - './select2/defaults' -], function ($, require, Select2, Defaults) { - // Force jQuery.mousewheel to be loaded if it hasn't already - require('jquery.mousewheel'); - - if ($.fn.select2 == null) { - // All methods that should return the element - var thisMethods = ['open', 'close', 'destroy']; - - $.fn.select2 = function (options) { - options = options || {}; - - if (typeof options === 'object') { - this.each(function () { - var instanceOptions = $.extend({}, options, true); - - var instance = new Select2($(this), instanceOptions); - }); - - return this; - } else if (typeof options === 'string') { - var instance = this.data('select2'); - - if (instance == null && window.console && console.error) { - console.error( - 'The select2(\'' + options + '\') method was called on an ' + - 'element that is not using Select2.' - ); - } - - var args = Array.prototype.slice.call(arguments, 1); - - var ret = instance[options](args); - - // Check if we should be returning `this` - if ($.inArray(options, thisMethods) > -1) { - return this; - } - - return ret; - } else { - throw new Error('Invalid arguments for Select2: ' + options); - } - }; - } - - if ($.fn.select2.defaults == null) { - $.fn.select2.defaults = Defaults; - } - - return Select2; -}); - -/*! - * jQuery Mousewheel 3.1.12 - * - * Copyright 2014 jQuery Foundation and other contributors - * Released under the MIT license. - * http://jquery.org/license - */ - -(function (factory) { - if ( typeof S2.define === 'function' && S2.define.amd ) { - // AMD. Register as an anonymous module. - S2.define('jquery.mousewheel',['jquery'], factory); - } else if (typeof exports === 'object') { - // Node/CommonJS style for Browserify - module.exports = factory; - } else { - // Browser globals - factory(jQuery); - } -}(function ($) { - - var toFix = ['wheel', 'mousewheel', 'DOMMouseScroll', 'MozMousePixelScroll'], - toBind = ( 'onwheel' in document || document.documentMode >= 9 ) ? - ['wheel'] : ['mousewheel', 'DomMouseScroll', 'MozMousePixelScroll'], - slice = Array.prototype.slice, - nullLowestDeltaTimeout, lowestDelta; - - if ( $.event.fixHooks ) { - for ( var i = toFix.length; i; ) { - $.event.fixHooks[ toFix[--i] ] = $.event.mouseHooks; - } - } - - var special = $.event.special.mousewheel = { - version: '3.1.12', - - setup: function() { - if ( this.addEventListener ) { - for ( var i = toBind.length; i; ) { - this.addEventListener( toBind[--i], handler, false ); - } - } else { - this.onmousewheel = handler; - } - // Store the line height and page height for this particular element - $.data(this, 'mousewheel-line-height', special.getLineHeight(this)); - $.data(this, 'mousewheel-page-height', special.getPageHeight(this)); - }, - - teardown: function() { - if ( this.removeEventListener ) { - for ( var i = toBind.length; i; ) { - this.removeEventListener( toBind[--i], handler, false ); - } - } else { - this.onmousewheel = null; - } - // Clean up the data we added to the element - $.removeData(this, 'mousewheel-line-height'); - $.removeData(this, 'mousewheel-page-height'); - }, - - getLineHeight: function(elem) { - var $elem = $(elem), - $parent = $elem['offsetParent' in $.fn ? 'offsetParent' : 'parent'](); - if (!$parent.length) { - $parent = $('body'); - } - return parseInt($parent.css('fontSize'), 10) || parseInt($elem.css('fontSize'), 10) || 16; - }, - - getPageHeight: function(elem) { - return $(elem).height(); - }, - - settings: { - adjustOldDeltas: true, // see shouldAdjustOldDeltas() below - normalizeOffset: true // calls getBoundingClientRect for each event - } - }; - - $.fn.extend({ - mousewheel: function(fn) { - return fn ? this.bind('mousewheel', fn) : this.trigger('mousewheel'); - }, - - unmousewheel: function(fn) { - return this.unbind('mousewheel', fn); - } - }); - - - function handler(event) { - var orgEvent = event || window.event, - args = slice.call(arguments, 1), - delta = 0, - deltaX = 0, - deltaY = 0, - absDelta = 0, - offsetX = 0, - offsetY = 0; - event = $.event.fix(orgEvent); - event.type = 'mousewheel'; - - // Old school scrollwheel delta - if ( 'detail' in orgEvent ) { deltaY = orgEvent.detail * -1; } - if ( 'wheelDelta' in orgEvent ) { deltaY = orgEvent.wheelDelta; } - if ( 'wheelDeltaY' in orgEvent ) { deltaY = orgEvent.wheelDeltaY; } - if ( 'wheelDeltaX' in orgEvent ) { deltaX = orgEvent.wheelDeltaX * -1; } - - // Firefox < 17 horizontal scrolling related to DOMMouseScroll event - if ( 'axis' in orgEvent && orgEvent.axis === orgEvent.HORIZONTAL_AXIS ) { - deltaX = deltaY * -1; - deltaY = 0; - } - - // Set delta to be deltaY or deltaX if deltaY is 0 for backwards compatabilitiy - delta = deltaY === 0 ? deltaX : deltaY; - - // New school wheel delta (wheel event) - if ( 'deltaY' in orgEvent ) { - deltaY = orgEvent.deltaY * -1; - delta = deltaY; - } - if ( 'deltaX' in orgEvent ) { - deltaX = orgEvent.deltaX; - if ( deltaY === 0 ) { delta = deltaX * -1; } - } - - // No change actually happened, no reason to go any further - if ( deltaY === 0 && deltaX === 0 ) { return; } - - // Need to convert lines and pages to pixels if we aren't already in pixels - // There are three delta modes: - // * deltaMode 0 is by pixels, nothing to do - // * deltaMode 1 is by lines - // * deltaMode 2 is by pages - if ( orgEvent.deltaMode === 1 ) { - var lineHeight = $.data(this, 'mousewheel-line-height'); - delta *= lineHeight; - deltaY *= lineHeight; - deltaX *= lineHeight; - } else if ( orgEvent.deltaMode === 2 ) { - var pageHeight = $.data(this, 'mousewheel-page-height'); - delta *= pageHeight; - deltaY *= pageHeight; - deltaX *= pageHeight; - } - - // Store lowest absolute delta to normalize the delta values - absDelta = Math.max( Math.abs(deltaY), Math.abs(deltaX) ); - - if ( !lowestDelta || absDelta < lowestDelta ) { - lowestDelta = absDelta; - - // Adjust older deltas if necessary - if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { - lowestDelta /= 40; - } - } - - // Adjust older deltas if necessary - if ( shouldAdjustOldDeltas(orgEvent, absDelta) ) { - // Divide all the things by 40! - delta /= 40; - deltaX /= 40; - deltaY /= 40; - } - - // Get a whole, normalized value for the deltas - delta = Math[ delta >= 1 ? 'floor' : 'ceil' ](delta / lowestDelta); - deltaX = Math[ deltaX >= 1 ? 'floor' : 'ceil' ](deltaX / lowestDelta); - deltaY = Math[ deltaY >= 1 ? 'floor' : 'ceil' ](deltaY / lowestDelta); - - // Normalise offsetX and offsetY properties - if ( special.settings.normalizeOffset && this.getBoundingClientRect ) { - var boundingRect = this.getBoundingClientRect(); - offsetX = event.clientX - boundingRect.left; - offsetY = event.clientY - boundingRect.top; - } - - // Add information to the event object - event.deltaX = deltaX; - event.deltaY = deltaY; - event.deltaFactor = lowestDelta; - event.offsetX = offsetX; - event.offsetY = offsetY; - // Go ahead and set deltaMode to 0 since we converted to pixels - // Although this is a little odd since we overwrite the deltaX/Y - // properties with normalized deltas. - event.deltaMode = 0; - - // Add event and delta to the front of the arguments - args.unshift(event, delta, deltaX, deltaY); - - // Clearout lowestDelta after sometime to better - // handle multiple device types that give different - // a different lowestDelta - // Ex: trackpad = 3 and mouse wheel = 120 - if (nullLowestDeltaTimeout) { clearTimeout(nullLowestDeltaTimeout); } - nullLowestDeltaTimeout = setTimeout(nullLowestDelta, 200); - - return ($.event.dispatch || $.event.handle).apply(this, args); - } - - function nullLowestDelta() { - lowestDelta = null; - } - - function shouldAdjustOldDeltas(orgEvent, absDelta) { - // If this is an older event and the delta is divisable by 120, - // then we are assuming that the browser is treating this as an - // older mouse wheel event and that we should divide the deltas - // by 40 to try and get a more usable deltaFactor. - // Side note, this actually impacts the reported scroll distance - // in older browsers and can cause scrolling to be slower than native. - // Turn this off by setting $.event.special.mousewheel.settings.adjustOldDeltas to false. - return special.settings.adjustOldDeltas && orgEvent.type === 'mousewheel' && absDelta % 120 === 0; - } - -})); - - // Return the AMD loader configuration so it can be used outside of this file - return { - define: S2.define, - require: S2.require - }; -}()); - - // Autoload the jQuery bindings - // We know that all of the modules exist above this, so we're safe - var select2 = S2.require('jquery.select2'); - - // Hold the AMD module references on the jQuery function that was just loaded - // This allows Select2 to use the internal loader outside of this file, such - // as in the language files. - jQuery.fn.select2.amd = S2; - - // Return the Select2 instance for anyone who is importing it. - return select2; -})); diff --git a/app/assets/stylesheets/application.css.scss b/app/assets/stylesheets/application.css.scss deleted file mode 100644 index 9342e9a7227e8166fe65e3e550b642cc473714df..0000000000000000000000000000000000000000 --- a/app/assets/stylesheets/application.css.scss +++ /dev/null @@ -1,461 +0,0 @@ -/* - * This is a manifest file that'll be compiled into application.css, which will include all the files - * listed below. - * - * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, - * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path. - * - * You're free to add application-wide styles to this file and they'll appear at the bottom of the - * compiled file so the styles you add here take precedence over styles defined in any styles - * defined in the other CSS/SCSS files in this directory. It is generally better to create a new - * file per style scope. - * - *= require_tree ./application - *= require_self - *= require_tree ./search - */ -@import "bootstrap-sprockets"; -@import "bootstrap"; - - -/* Alto Contraste*/ - -.alto-contraste{ - background-color: black; - color: white; -} - -.searchbar-contraste{ - background-color: black; - color: white; - background-image: none !important; -} -.link-contraste{ - color: yellow !important; - text-decoration: underline; -} - -.footer-contraste{ - background-color: black !important; - color: white; -} - -.dropdown-menu-contrast{ - background-color: black !important; - border: 1px solid white; -} -.general_highlights-contrast{ - border: 1px solid white; -} -/*---------------*/ - -.padding-left-0{ - padding-left: 0 !important; -} -.padding-right-0{ - padding-right: 0 !important; -} -.general_highlights{ - padding-bottom: 20px; - padding-left: 0px; -} -.font_roboto_light{ - font-family: 'Roboto', sans-serif; -} -#mec_portais{ - background-color: #2E3192; - width: 100px; - height: 50px; -} -#mec_portais2{ - background-color: #2E3192; - width: 100px; - height: 50px; - margin-left: 5px; -} -.rede_social{ - width: 30px; - height: 30px; - border-radius: 5px; -} -#rede_social1{ - background-color: #2E3192; -} -#rede_social2{ - background-color: #C01A2C; - margin-left: 5px; -} -#rede_social3{ - background-color: #00ADEF; - margin-left: 5px; -} -#rede_social4{ - background-color: #6A5E50; - margin-left: 5px; -} - -#barra-brasil .brasil-flag{ - height: 50px !important; -} -#faq_div{ - margin-left: 175px; -} -#faq_question{ - color: orange; - font-weight: bold; -} - -html, -body { - margin:0; - padding:0; - height:100%; -} -#wrapper { - min-height:100%; - position:relative; - display: flex; - flex-direction: column; -} -#header { - padding:10px; -} -#content { - flex: 1; -} -#footer { - width:100%; - height:100px; - position:relative; - bottom:0; - left:0; - padding-top: 50px; - border-width: 0px; - color: #FFF; - - .main{ - background-color: #313131; - padding: 16px; - min-height: 256px; - } - - .footerbar{ - padding: 16px; - background-color: #080808; - } -} - - - - -$color_low: #000000; - -.navbar{ - margin-bottom: 0px; -} - - -header{ - .searchbar{ - color: #FFF; - background-image: linear-gradient(to bottom, #256e46, #457f3c); - padding: 8px; - padding-bottom: 32px; - margin: 0px; - a{ - margin: 0px; - color: #FFF; - } - h1{ - font-size: 24px; - margin-bottom: 24px; - } - h2{ - font-size: 20px; - text-align: right; - } - form{ - margin: 0px; - } - } - - border: 0; - border-bottom: 1px; - border-style: solid; - border-color: #cececd; - margin-bottom: 16px; -} -.sectiontitle{ - font-size: 32px; - border: 0px; - border-top: 6px; - border-color: #3b7846; - border-style: solid; - background-color: $color_low; - - color: #3b7846; - margin-bottom: 16px; -} - -.itemhorz { - margin-top: 16px; - h1{ - font-size: 24px; - } -} - -.itemvert{ - padding: 0px; - margin: 0px; - h1{ - text-align: center; - font-size: 24px; - margin: 0px; - } - margin-bottom: 16px; -} - -.item-img{ - background-color: $color_low; -} - - -$carousel_size: 400px; - -.carousel { - height: $carousel_size; - margin-bottom: 60px; - h1{ - background-color: rgba(37, 68, 32, 0.75); - } - #carrousel-new-description{ - background-color: rgba(2, 8, 3, 0.75); - } -} - - -.carousel-caption { - z-index: 10; -} - -.carousel .item { - height: $carousel_size; - background-color: #777; -} -.carousel-inner > .item > img { - position: absolute; - top: 0; - left: 0; - min-width: 100%; - height: $carousel_size; -} - -a { - color: #529652; - text-decoration: none; -} -a:hover, -a:focus { - color: #3A6C3A; - text-decoration: underline; -} - -.btn-primary { - color: #fff; - background-color: #63A063; - border-color: #3A6C3A; -} -.btn-primary:hover, -.btn-primary:focus, -.btn-primary.focus, -.btn-primary:active, -.btn-primary.active, -.open > .dropdown-toggle.btn-primary { - color: #fff; - background-color: #3A6C3A; - border-color: #003300; -} - -.navbar { - position: relative; - min-height: 15px; - margin-bottom: 0px; - border: 1px solid transparent; -} - -.navbar-brand { - float: left; - height: 15px; - padding: 15px 15px; - font-size: 18px; - line-height: 3px; -} -.navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - line-height: 10px; -} -@media (min-width: 768px) { - .navbar-nav { - float: left; - margin: 0; - } - .navbar-nav > li { - float: left; - } - .navbar-nav > li > a { - padding-top: 10px; - padding-bottom: 10px; - } -} -.pagination > li > a, -.pagination > li > span { - position: relative; - float: left; - padding: 6px 12px; - margin-left: -1px; - line-height: 1.42857143; - color: #529652; - text-decoration: none; - background-color: #fff; - border: 1px solid #ddd; -} -.pagination > li > a:hover, -.pagination > li > span:hover, -.pagination > li > a:focus, -.pagination > li > span:focus { - color: #3A6C3A; - background-color: #eee; - border-color: #ddd; -} -a.thumbnail:hover, -a.thumbnail:focus, -a.thumbnail.active { - border-color: #3A6C3A; -} -.carousel-indicators li { - display: inline-block; - width: 10px; - height: 10px; - margin: 1px; - text-indent: -999px; - cursor: pointer; - background-color: #000 \9; - background-color: rgba(0, 0, 0, 0.5); - border: 1px solid #555; - border-radius: 10px; -} - - -#nestedAccordion{ - width:100%; -} -#nestedAccordion h2, #nestedAccordion h3, -#nestedAccordion div, #nestedAccordion ol, -#nestedAccordion li{ - /* reset styles for accordion */ - margin:0; - padding:0; - font-size:1em; - font-weight:normal; - list-style:none; -} -#nestedAccordion div{ - color:#555;/*#555 #003300*/ - overflow:hidden; - display:none; -} - -#nestedAccordion h2{ - cursor:pointer; - color:#fff; - font-size:1.1em; - moz-border-radius: 5px 5px 0 0; - -webkit-border-radius: 5px 5px 0 0; - border-radius: 5px 5px 0 0; - padding:3px; - margin-top:5px; - background-color: #529652; - background-image: -webkit-gradient(linear, left top, left bottom, from(#4B8CFF), to(#447FE8)); - background-image: -webkit-linear-gradient(top, #4B8CFF, #447FE8);/*#4B8CFF, #447FE8*/ - background-image: -moz-linear-gradient(top, #4B8CFF, #447FE8); - background-image: -ms-linear-gradient(top, #4B8CFF, #447FE8); - background-image: -o-linear-gradient(top, #4B8CFF, #447FE8); - background-image: linear-gradient(to bottom, #4B8CFF, #447FE8); - background-image: url("arrow.ico"); - background-repeat: no-repeat; - background-position: right bottom; -} -#nestedAccordion h3{ - cursor:pointer; - padding:4px; - color: #666; - text-shadow: 0 1px 0 rgba(255, 255, 255, .5); - background-color: #f5f5f5; - background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#ededed)); - background-image: -webkit-linear-gradient(top, #f5f5f5, #ededed); - background-image: -moz-linear-gradient(top, #f5f5f5, #ededed); - background-image: -ms-linear-gradient(top, #f5f5f5, #ededed); - background-image: -o-linear-gradient(top, #f5f5f5, #ededed); - background-image: linear-gradient(to bottom, #f5f5f5, #ededed); - -} -#nestedAccordion h3:hover{ - color:#000; -} -#nestedAccordion h3 + div{ - display:none; - background-color:#F5F5F5; - padding:5px 5px 5px 30px; -} -#nestedAccordion li:hover{ - color:#000; - cursor:pointer; -} -#nestedAccordion h2 +div.aberto{ - display:inherit; -} - - -.starRating:not(old){ - display : inline-block; - width : 7.5em; - height : 1.5em; - overflow : hidden; - vertical-align : bottom; -} - -.starRating:not(old) > input{ - margin-right : -100%; - opacity : 0; -} - -.starRating:not(old) > label{ - display : block; - float : right; - position : relative; - background : url('star-off.svg'); - background-size : contain; -} - -.starRating:not(old) > label:before{ - content : ''; - display : block; - width : 1.5em; - height : 1.5em; - background : url('star-on.svg'); - background-size : contain; - opacity : 0; - transition : opacity 0.2s linear; -} - -.starRating:not(old) > label:hover:before, -.starRating:not(old) > label:hover ~ label:before, -.starRating:not(:hover) > :checked ~ label:before{ - opacity : 1; -} - -td.stars { width: 22%; } -td.visualis { width: 22%; } -table.tipo1 td { width: 52%; height: 33px;} -table.tipo1 p{ font-size: 15px; font-weight: bold; } diff --git a/app/assets/stylesheets/application.scss b/app/assets/stylesheets/application.scss new file mode 100644 index 0000000000000000000000000000000000000000..154175ad3bc6c610531bf93a4c6e62c9a7f020cd --- /dev/null +++ b/app/assets/stylesheets/application.scss @@ -0,0 +1,322 @@ +/* + * This is a manifest file that'll be compiled into application.css, which will include all the files + * listed below. + * + * Any CSS and SCSS file within this directory, lib/assets/stylesheets, vendor/assets/stylesheets, + * or any plugin's vendor/assets/stylesheets directory can be referenced here using a relative path. + * + * You're free to add application-wide styles to this file and they'll appear at the bottom of the + * compiled file so the styles you add here take precedence over styles defined in any styles + * defined in the other CSS/SCSS files in this directory. It is generally better to create a new + * file per style scope. + * + *= require_tree ./application + *= require_self + */ +@import "bootstrap-sprockets"; +@import "bootstrap"; +@import "select2"; +@import "select2-bootstrap"; + +//// HTML/BODY +html, +body { + margin:0; + padding:0; + height:100%; + + font-size: 15px; + font-family: 'Roboto', "Helvetica Neue", Helvetica, Arial, sans-serif; +} + +a, a:focus, a:hover { + color: #000; +} + +.caret { + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-top: 7px solid #000000; +} +.caret-up { + transform: rotate(180deg); +} +.caret-align-right { + position: absolute; + left: 90%; + top: 45%; +} + +//// HEADER +header { + border: 0; + border-bottom: 1px; + border-style: solid; + border-color: #cececd; + margin-bottom: 16px; + + a, a:focus, a:hover { + text-decoration: none; + } + + // barra brasil + + .barra-brasil { + background:#F1F1F1; + height: 32px; + padding:0 0 0 10px; + display:block; + + + #wrapper-barra-brasil { + max-width: 100% !important; + } + } + .brasil-flag{ + height: 100% !important; + } + // bar with logo, search and user info + .search-bar { + color: #FFF; + background-color: #2178F5; + padding: 0px; + padding-top: 8px; + margin: 0px; + + // logo + .logo-text { + margin-top: 10px; + padding: 0px; + font-size: 24px; + font-weight: bold; + a { + color: #FFF; + } + } + // accessibility + .search-accessibility { + margin-top: 25px; + text-align: right; + img { + height: 25px; + } + } + // search + .search-input { + margin-top: 40px; + margin-bottom: 5px; + text-align: right; + + // text input + .form-control { + border-bottom-left-radius: 7px; + border-top-left-radius: 7px; + border-color: #FFF; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + height: 40px; + padding-left: 20px; + font-size: 24px; + font-weight: 300 !important; + } + // button input + .input-group-btn { + border-bottom-right-radius: 7px; + border-top-right-radius: 7px; + + .btn, .btn:focus, .btn:hover { + height: 40px; + font-size: 20px; + color: #FF2602; + background-color: #FFF; + border-color: #FFF; + } + } + + .search-label { + font-weight: 300 !important; + color: #FFF; + } + } + // user info + .status-text { + margin-top: 20px; + font-size: 20px; + text-align: right; + + .circular-image { + width: 60px; + height: 60px; + border-radius: 50%; + } + + .media-heading { + font-size: 32px; + a { + color: #FFF; + } + } + .register-link { + color: #CED1C6; + } + .quit-link { + color: #FF2602; + } + } + } + + // navbar + .navigation { + background: #F1F1F1; + + .nav { + height: 50px; + + .nav-button { + min-width: 140px; + height: 100%; + font-size: 20px; + font-weight: 500 !important; + + a { color: #000; } + } + + .nav-button-first { + a { padding-left: 0px !important; } + } + .divider { + width: 2px; + height: 100%; + background-color: #FFF; + } + } + } + + // contrast + .search-bar-contraste{ + background-color: black; + color: white; + background-image: none !important; + } +} + + +//// FOOTER +footer { + width:100%; + height:100px; + position:relative; + bottom:0; + left:0; + padding-top: 50px; + border-width: 0px; + color: #FFF; + + .main{ + background-color: #313131; + padding: 16px 0px 0px 0px; + min-height: 256px; + } + + .footerbar{ + padding: 16px; + background-color: #080808; + } +} + +//// partial OBJECT +.object-horizontal { + margin-bottom: 20px; +} + +.starRating:not(old){ + display : inline-block; + width : 7.5em; + height : 1.5em; + overflow : hidden; + vertical-align : bottom; +} + +.starRating:not(old) > input{ + margin-right : -100%; + opacity : 0; +} + +.starRating:not(old) > label{ + display : block; + float : right; + position : relative; + background : url('star-off.svg'); + background-size : contain; +} + +.starRating:not(old) > label:before{ + content : ''; + display : block; + width : 1.5em; + height : 1.5em; + background : url('star-on.svg'); + background-size : contain; + opacity : 0; + transition : opacity 0.2s linear; +} + +.starRating:not(old) > label:hover:before, +.starRating:not(old) > label:hover ~ label:before, +.starRating:not(:hover) > :checked ~ label:before{ + opacity : 1; +} + +td.stars { width: 22%; } +td.visualis { width: 22%; } +table.tipo1 td { width: 52%; height: 33px;} +table.tipo1 p{ font-size: 15px; font-weight: bold; } + +//////////////////////////////////////////////////////////////////////////////// + +/* Alto Contraste*/ +.contraste{ + background-color: black !important; + color: white !important; + a{ + color: yellow; + } + .search-bar{ + color: white !important; + } + #myCarousel{ + a{ + color: white !important; + } + } + + #search{ + .form-control{ + background-color: black !important; + color:white; + } + } + #subject-highlight{ + background-color: black !important; + } +} +.menu-bar-contrast{ + background-color: black !important; + border-top: 2px solid white; + border-bottom: 2px solid white; + li{ + a{ + color:white !important; + } + a:hover{ + background-color: #1E1E1E !important; + } + } + .divider{ + background-color: white; + } + .dropdown-menu{ + background-color: black; + } +} diff --git a/app/assets/stylesheets/application/learning_objects.scss b/app/assets/stylesheets/application/learning_objects.scss new file mode 100644 index 0000000000000000000000000000000000000000..a3271c7b29c97008138c4b5a0535a114e4395c57 --- /dev/null +++ b/app/assets/stylesheets/application/learning_objects.scss @@ -0,0 +1,3 @@ +.learning_object-horizontal { + margin-bottom: 10px; +} \ No newline at end of file diff --git a/app/assets/stylesheets/application/search.scss b/app/assets/stylesheets/application/search.scss new file mode 100644 index 0000000000000000000000000000000000000000..1e0bc46ea2011f1067d4676045b61a33b8fb2652 --- /dev/null +++ b/app/assets/stylesheets/application/search.scss @@ -0,0 +1,107 @@ +.search-sidebar { + margin-top: 40px; + + .dropdown-element { + width: 95%; + margin-left: 3%; + } +} + +.select2-container { + width: 100% !important; +} + +// #nestedAccordion{ +// width:100%; +// } +// #nestedAccordion h2, #nestedAccordion h3, +// #nestedAccordion div, #nestedAccordion ol, +// #nestedAccordion li{ +// /* reset styles for accordion */ +// margin:0; +// padding:0; +// font-size:1em; +// font-weight:normal; +// list-style:none; +// } +// #nestedAccordion div{ +// color:#555;/*#555 #003300*/ +// overflow:hidden; +// display:none; +// } +// +// #nestedAccordion h2{ +// cursor:pointer; +// color:#fff; +// font-size:1.1em; +// moz-border-radius: 5px 5px 0 0; +// -webkit-border-radius: 5px 5px 0 0; +// border-radius: 5px 5px 0 0; +// padding:3px; +// margin-top:5px; +// background-color: #3F434F; +// background-image: -webkit-gradient(linear, left top, left bottom, from(#4B8CFF), to(#447FE8)); +// background-image: -webkit-linear-gradient(top, #4B8CFF, #447FE8);/*#4B8CFF, #447FE8*/ +// background-image: -moz-linear-gradient(top, #4B8CFF, #447FE8); +// background-image: -ms-linear-gradient(top, #4B8CFF, #447FE8); +// background-image: -o-linear-gradient(top, #4B8CFF, #447FE8); +// background-image: linear-gradient(to bottom, #4B8CFF, #447FE8); +// background-image: url("arrow.ico"); +// background-repeat: no-repeat; +// background-position: right bottom; +// } +// #nestedAccordion h3{ +// cursor:pointer; +// padding:4px; +// color: #666; +// text-shadow: 0 1px 0 rgba(255, 255, 255, .5); +// background-color: #f5f5f5; +// background-image: -webkit-gradient(linear, left top, left bottom, from(#f5f5f5), to(#ededed)); +// background-image: -webkit-linear-gradient(top, #f5f5f5, #ededed); +// background-image: -moz-linear-gradient(top, #f5f5f5, #ededed); +// background-image: -ms-linear-gradient(top, #f5f5f5, #ededed); +// background-image: -o-linear-gradient(top, #f5f5f5, #ededed); +// background-image: linear-gradient(to bottom, #f5f5f5, #ededed); +// +// } +// #nestedAccordion h3:hover{ +// color:#000; +// } +// #nestedAccordion h3 + div{ +// display:none; +// background-color:#F5F5F5; +// padding:5px 5px 5px 30px; +// } +// #nestedAccordion li:hover{ +// color:#000; +// cursor:pointer; +// } +// #nestedAccordion h2 +div.aberto{ +// display:inherit; +// } +// ///Contrast +// .contraste{ +// .thumbnail{ +// background-color: black !important; +// } +// .navbar{ +// select{ +// color: black; +// } +// } +// #nestedAccordion{ +// div{ +// background-color: black !important; +// color: white !important; +// } +// h3{ +// color: white; +// background-color: black !important; +// background-image: none !important; +// border-bottom: 1px solid white; +// } +// h3:hover{ +// color: white; +// } +// } +// } diff --git a/app/assets/stylesheets/application/welcome.scss b/app/assets/stylesheets/application/welcome.scss index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..293aecd53359ddd05db69e7f4d3dd9978247120a 100644 --- a/app/assets/stylesheets/application/welcome.scss +++ b/app/assets/stylesheets/application/welcome.scss @@ -0,0 +1,110 @@ +.general-highlights { + padding-left: 0px; + padding-right: 0px; + padding-bottom: 20px; +} + +.padding-left-0{ + padding-left: 0 !important; +} +.padding-right-0{ + padding-right: 0 !important; +} + +$carousel_size: 400px; + +.carousel { + height: $carousel_size; + margin-bottom: 60px; + h1{ + background-color: rgba(37, 68, 32, 0.75); + } + #carrousel-new-description{ + background-color: rgba(2, 8, 3, 0.75); + } +} + +.carousel h1 { + background-color: rgba(0, 0, 0, 0.75); +} + +.carousel-caption { + z-index: 10; +} + +.carousel .item { + height: $carousel_size; + background-color: #777; +} +.carousel-inner > .item > img { + position: absolute; + top: 0; + left: 0; + min-width: 100%; + height: $carousel_size; +} + +.carousel-indicators li { + display: inline-block; + width: 12px; + height: 12px; + margin: 12x; + text-indent: -999px; + cursor: pointer; + background-color: #000 \9; + background-color: #AABAB8; + border: 1px solid #555; + border-radius: 10px; +} + +.carousel-indicators .active { + margin: 0; + width: 12px; + height: 12px; + background-color: #FF2333; +} + +//// CONTACT +.font_roboto_light{ + font-family: 'Roboto', sans-serif; +} +#mec_portais{ + background-color: #2E3192; + width: 100px; + height: 50px; +} +#mec_portais2{ + background-color: #2E3192; + width: 100px; + height: 50px; + margin-left: 5px; +} +.rede_social{ + width: 30px; + height: 30px; + border-radius: 5px; +} +#rede_social1{ + background-color: #2E3192; +} +#rede_social2{ + background-color: #C01A2C; + margin-left: 5px; +} +#rede_social3{ + background-color: #00ADEF; + margin-left: 5px; +} +#rede_social4{ + background-color: #6A5E50; + margin-left: 5px; +} + +//// FAQ +#faq_div{ + margin-left: 175px; +} +#faq_question{ + color: orange; + font-weight: bold; +} diff --git a/app/assets/stylesheets/edges.scss b/app/assets/stylesheets/edges.scss deleted file mode 100644 index 248e4c0d098e1ffcb97d204565abaa8013256443..0000000000000000000000000000000000000000 --- a/app/assets/stylesheets/edges.scss +++ /dev/null @@ -1,3 +0,0 @@ -// Place all the styles related to the Edges controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/learning_objects.scss b/app/assets/stylesheets/learning_objects.scss deleted file mode 100644 index b9ba81d3d355ebd38241b2355d66235b122d16c5..0000000000000000000000000000000000000000 --- a/app/assets/stylesheets/learning_objects.scss +++ /dev/null @@ -1,3 +0,0 @@ -// Place all the styles related to the LearningObjects controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/registrations.scss b/app/assets/stylesheets/registrations.scss deleted file mode 100644 index f6e17a22d8ea83e854c44006511714d6fc63a863..0000000000000000000000000000000000000000 --- a/app/assets/stylesheets/registrations.scss +++ /dev/null @@ -1,3 +0,0 @@ -// Place all the styles related to the registrations controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/scaffolds.scss b/app/assets/stylesheets/scaffolds.scss deleted file mode 100644 index ed7a765d9acc0ccc7bb77dc1176083bc98b64eeb..0000000000000000000000000000000000000000 --- a/app/assets/stylesheets/scaffolds.scss +++ /dev/null @@ -1,73 +0,0 @@ -body { - background-color: #fff; - color: #333; - font-family: verdana, arial, helvetica, sans-serif; - font-size: 13px; - line-height: 18px; -} - -p, ol, ul, td { - font-family: verdana, arial, helvetica, sans-serif; - font-size: 13px; - line-height: 18px; -} - -pre { - background-color: #eee; - padding: 10px; - font-size: 11px; -} - -a { - color: #000; - - &:visited { - color: #666; - } - - &:hover { - color: #fff; - background-color: #000; - } -} - -div { - &.field, &.actions { - margin-bottom: 10px; - } -} - -#notice { - color: green; -} - -.field_with_errors { - padding: 2px; - background-color: red; - display: table; -} - -#error_explanation { - width: 450px; - border: 2px solid red; - padding: 7px; - padding-bottom: 0; - margin-bottom: 20px; - background-color: #f0f0f0; - - h2 { - text-align: left; - font-weight: bold; - padding: 5px 5px 5px 15px; - font-size: 12px; - margin: -7px; - margin-bottom: 0px; - background-color: #c00; - color: #fff; - } - - ul li { - font-size: 12px; - list-style: square; - } -} diff --git a/app/assets/stylesheets/search/select2.min.css b/app/assets/stylesheets/search/select2.min.css deleted file mode 100644 index 1c7234426a473d3e017340ecda88f880dc1e3476..0000000000000000000000000000000000000000 --- a/app/assets/stylesheets/search/select2.min.css +++ /dev/null @@ -1 +0,0 @@ -.select2-container{box-sizing:border-box;display:inline-block;margin:0;position:relative;vertical-align:middle;}.select2-container .select2-selection--single{box-sizing:border-box;cursor:pointer;display:block;height:28px;user-select:none;-webkit-user-select:none;}.select2-container .select2-selection--single .select2-selection__rendered{display:block;padding-left:8px;padding-right:20px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}.select2-container[dir="rtl"] .select2-selection--single .select2-selection__rendered{padding-right:8px;padding-left:20px;}.select2-container .select2-selection--multiple{box-sizing:border-box;cursor:pointer;display:block;min-height:32px;user-select:none;-webkit-user-select:none;}.select2-container .select2-selection--multiple .select2-selection__rendered{display:inline-block;overflow:hidden;padding-left:8px;text-overflow:ellipsis;white-space:nowrap;}.select2-container .select2-search--inline{float:left;}.select2-container .select2-search--inline .select2-search__field{box-sizing:border-box;border:none;font-size:100%;margin-top:5px;}.select2-container .select2-search--inline .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none;}.select2-dropdown{background-color:white;border:1px solid #aaa;border-radius:4px;box-sizing:border-box;display:block;position:absolute;left:-100000px;width:100%;z-index:1051;}.select2-results{display:block;}.select2-results__options{list-style:none;margin:0;padding:0;}.select2-results__option{padding:6px;user-select:none;-webkit-user-select:none;}.select2-results__option[aria-selected]{cursor:pointer;}.select2-container--open .select2-dropdown{left:0;}.select2-container--open .select2-dropdown--above{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;}.select2-container--open .select2-dropdown--below{border-top:none;border-top-left-radius:0;border-top-right-radius:0;}.select2-search--dropdown{display:block;padding:4px;}.select2-search--dropdown .select2-search__field{padding:4px;width:100%;box-sizing:border-box;}.select2-search--dropdown .select2-search__field::-webkit-search-cancel-button{-webkit-appearance:none;}.select2-search--dropdown.select2-search--hide{display:none;}.select2-close-mask{border:0;margin:0;padding:0;display:block;position:fixed;left:0;top:0;min-height:100%;min-width:100%;height:auto;width:auto;opacity:0;z-index:99;background-color:#fff;filter:alpha(opacity=0);}.select2-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px;}.select2-container--default .select2-selection--single{background-color:#fff;border:1px solid #aaa;border-radius:4px;}.select2-container--default .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px;}.select2-container--default .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;}.select2-container--default .select2-selection--single .select2-selection__placeholder{color:#999;}.select2-container--default .select2-selection--single .select2-selection__arrow{height:26px;position:absolute;top:1px;right:1px;width:20px;}.select2-container--default .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0;}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left;}.select2-container--default[dir="rtl"] .select2-selection--single .select2-selection__arrow{left:1px;right:auto;}.select2-container--default.select2-container--disabled .select2-selection--single{background-color:#eee;cursor:default;}.select2-container--default.select2-container--disabled .select2-selection--single .select2-selection__clear{display:none;}.select2-container--default.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px;}.select2-container--default .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;}.select2-container--default .select2-selection--multiple .select2-selection__rendered{box-sizing:border-box;list-style:none;margin:0;padding:0 5px;width:100%;}.select2-container--default .select2-selection--multiple .select2-selection__placeholder{color:#999;margin-top:5px;float:left;}.select2-container--default .select2-selection--multiple .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-top:5px;margin-right:10px;}.select2-container--default .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px;}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove{color:#999;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px;}.select2-container--default .select2-selection--multiple .select2-selection__choice__remove:hover{color:#333;}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice,.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__placeholder{float:right;}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto;}.select2-container--default[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto;}.select2-container--default.select2-container--focus .select2-selection--multiple{border:solid black 1px;outline:0;}.select2-container--default.select2-container--disabled .select2-selection--multiple{background-color:#eee;cursor:default;}.select2-container--default.select2-container--disabled .select2-selection__choice__remove{display:none;}.select2-container--default.select2-container--open.select2-container--above .select2-selection--single,.select2-container--default.select2-container--open.select2-container--above .select2-selection--multiple{border-top-left-radius:0;border-top-right-radius:0;}.select2-container--default.select2-container--open.select2-container--below .select2-selection--single,.select2-container--default.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom-left-radius:0;border-bottom-right-radius:0;}.select2-container--default .select2-search--dropdown .select2-search__field{border:1px solid #aaa;}.select2-container--default .select2-search--inline .select2-search__field{background:transparent;border:none;outline:0;}.select2-container--default .select2-results>.select2-results__options{max-height:200px;overflow-y:auto;}.select2-container--default .select2-results__option[role=group]{padding:0;}.select2-container--default .select2-results__option[aria-disabled=true]{color:#999;}.select2-container--default .select2-results__option[aria-selected=true]{background-color:#ddd;}.select2-container--default .select2-results__option .select2-results__option{padding-left:1em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__group{padding-left:0;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option{margin-left:-1em;padding-left:2em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-2em;padding-left:3em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-3em;padding-left:4em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-4em;padding-left:5em;}.select2-container--default .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option .select2-results__option{margin-left:-5em;padding-left:6em;}.select2-container--default .select2-results__option--highlighted[aria-selected]{background-color:#5897fb;color:white;}.select2-container--default .select2-results__group{cursor:default;display:block;padding:6px;}.select2-container--classic .select2-selection--single{background-color:#f6f6f6;border:1px solid #aaa;border-radius:4px;outline:0;background-image:-webkit-linear-gradient(top, #ffffff 50%, #eeeeee 100%);background-image:-o-linear-gradient(top, #ffffff 50%, #eeeeee 100%);background-image:linear-gradient(to bottom, #ffffff 50%, #eeeeee 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);}.select2-container--classic .select2-selection--single:focus{border:1px solid #5897fb;}.select2-container--classic .select2-selection--single .select2-selection__rendered{color:#444;line-height:28px;}.select2-container--classic .select2-selection--single .select2-selection__clear{cursor:pointer;float:right;font-weight:bold;margin-right:10px;}.select2-container--classic .select2-selection--single .select2-selection__placeholder{color:#999;}.select2-container--classic .select2-selection--single .select2-selection__arrow{background-color:#ddd;border:none;border-left:1px solid #aaa;border-top-right-radius:4px;border-bottom-right-radius:4px;height:26px;position:absolute;top:1px;right:1px;width:20px;background-image:-webkit-linear-gradient(top, #eeeeee 50%, #cccccc 100%);background-image:-o-linear-gradient(top, #eeeeee 50%, #cccccc 100%);background-image:linear-gradient(to bottom, #eeeeee 50%, #cccccc 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#cccccc', GradientType=0);}.select2-container--classic .select2-selection--single .select2-selection__arrow b{border-color:#888 transparent transparent transparent;border-style:solid;border-width:5px 4px 0 4px;height:0;left:50%;margin-left:-4px;margin-top:-2px;position:absolute;top:50%;width:0;}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__clear{float:left;}.select2-container--classic[dir="rtl"] .select2-selection--single .select2-selection__arrow{border:none;border-right:1px solid #aaa;border-radius:0;border-top-left-radius:4px;border-bottom-left-radius:4px;left:1px;right:auto;}.select2-container--classic.select2-container--open .select2-selection--single{border:1px solid #5897fb;}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow{background:transparent;border:none;}.select2-container--classic.select2-container--open .select2-selection--single .select2-selection__arrow b{border-color:transparent transparent #888 transparent;border-width:0 4px 5px 4px;}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--single{border-top:none;border-top-left-radius:0;border-top-right-radius:0;background-image:-webkit-linear-gradient(top, #ffffff 0%, #eeeeee 50%);background-image:-o-linear-gradient(top, #ffffff 0%, #eeeeee 50%);background-image:linear-gradient(to bottom, #ffffff 0%, #eeeeee 50%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0);}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--single{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;background-image:-webkit-linear-gradient(top, #eeeeee 50%, #ffffff 100%);background-image:-o-linear-gradient(top, #eeeeee 50%, #ffffff 100%);background-image:linear-gradient(to bottom, #eeeeee 50%, #ffffff 100%);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0);}.select2-container--classic .select2-selection--multiple{background-color:white;border:1px solid #aaa;border-radius:4px;cursor:text;outline:0;}.select2-container--classic .select2-selection--multiple:focus{border:1px solid #5897fb;}.select2-container--classic .select2-selection--multiple .select2-selection__rendered{list-style:none;margin:0;padding:0 5px;}.select2-container--classic .select2-selection--multiple .select2-selection__clear{display:none;}.select2-container--classic .select2-selection--multiple .select2-selection__choice{background-color:#e4e4e4;border:1px solid #aaa;border-radius:4px;cursor:default;float:left;margin-right:5px;margin-top:5px;padding:0 5px;}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove{color:#888;cursor:pointer;display:inline-block;font-weight:bold;margin-right:2px;}.select2-container--classic .select2-selection--multiple .select2-selection__choice__remove:hover{color:#555;}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{float:right;}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice{margin-left:5px;margin-right:auto;}.select2-container--classic[dir="rtl"] .select2-selection--multiple .select2-selection__choice__remove{margin-left:2px;margin-right:auto;}.select2-container--classic.select2-container--open .select2-selection--multiple{border:1px solid #5897fb;}.select2-container--classic.select2-container--open.select2-container--above .select2-selection--multiple{border-top:none;border-top-left-radius:0;border-top-right-radius:0;}.select2-container--classic.select2-container--open.select2-container--below .select2-selection--multiple{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0;}.select2-container--classic .select2-search--dropdown .select2-search__field{border:1px solid #aaa;outline:0;}.select2-container--classic .select2-search--inline .select2-search__field{outline:0;}.select2-container--classic .select2-dropdown{background-color:white;border:1px solid transparent;}.select2-container--classic .select2-dropdown--above{border-bottom:none;}.select2-container--classic .select2-dropdown--below{border-top:none;}.select2-container--classic .select2-results>.select2-results__options{max-height:200px;overflow-y:auto;}.select2-container--classic .select2-results__option[role=group]{padding:0;}.select2-container--classic .select2-results__option[aria-disabled=true]{color:grey;}.select2-container--classic .select2-results__option--highlighted[aria-selected]{background-color:#3875d7;color:white;}.select2-container--classic .select2-results__group{cursor:default;display:block;padding:6px;}.select2-container--classic.select2-container--open .select2-dropdown{border-color:#5897fb;} \ No newline at end of file diff --git a/app/assets/stylesheets/university.scss b/app/assets/stylesheets/university.scss deleted file mode 100644 index b37e7ce20f0e77f10ef56f66461a2226c2646e4e..0000000000000000000000000000000000000000 --- a/app/assets/stylesheets/university.scss +++ /dev/null @@ -1,3 +0,0 @@ -// Place all the styles related to the university controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/assets/stylesheets/users.scss b/app/assets/stylesheets/users.scss deleted file mode 100644 index 1efc835ccd15adaf355c0501d7237d13529771e1..0000000000000000000000000000000000000000 --- a/app/assets/stylesheets/users.scss +++ /dev/null @@ -1,3 +0,0 @@ -// Place all the styles related to the users controller here. -// They will automatically be included in application.css. -// You can use Sass (SCSS) here: http://sass-lang.com/ diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index c2a66dab49848d4295a9fb227caffac4445c89bb..374155aaae133f416c4eb513e34151f23766d8bd 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -11,7 +11,17 @@ class ApplicationController < ActionController::Base protected def configure_permitted_parameters - devise_parameter_sanitizer.for(:sign_up) << :name + registration_params = [:name, :email, :avatar, :password, :password_confirmation] + + if params[:action] == 'update' + devise_parameter_sanitizer.for(:account_update) { + |u| u.permit(registration_params << :current_password) + } + elsif params[:action] == 'create' + devise_parameter_sanitizer.for(:sign_up) { + |u| u.permit(registration_params) + } + end end def dspace_service diff --git a/app/controllers/collections_controller.rb b/app/controllers/collections_controller.rb new file mode 100644 index 0000000000000000000000000000000000000000..0579097790de7c0b49400ad9676537504614a638 --- /dev/null +++ b/app/controllers/collections_controller.rb @@ -0,0 +1,71 @@ +class CollectionsController < ApplicationController + before_action :set_collection, only: [:show, :update, :destroy, :like] + + # GET /collections + # GET /collections.json + def index + @collections = collection_repository.find_all + end + + # GET /collections/1 + # GET /collections/1.json + def show + end + + # POST /collections/1/like + def like + collection_repository.like @collection + end + + # POST /collections + # POST /collections.json + def create + @collection = Collection.new(collection_params) + + respond_to do |format| + if collection_repository.save @collection + format.html { redirect_to @collection, notice: 'Collection was successfully created.' } + else + format.html { render :new } + end + end + end + + # PATCH/PUT /collections/1 + # PATCH/PUT /collections/1.json + def update + respond_to do |format| + if collection_repository.update(collection_params) + format.html { redirect_to @collection, notice: 'Collection was successfully updated.' } + else + format.html { render :edit } + end + end + end + + # DELETE /collections/1 + # DELETE /collections/1.json + def destroy + collection_repository.destroy @collection + + respond_to do |format| + format.html { redirect_to collections_url, notice: 'Learning object was successfully destroyed.' } + end + end + + private + + def set_collection + @collection = collection_repository.find_by_id params[:id] + end + + def collection_repository + repository.for(:collection) + end + + # Never trust parameters from the scary internet, only allow the white list through. + def collection_params + params.require(:collection).permit(:name, :privacy, learning_objects: []) + end + +end diff --git a/app/controllers/institutions_controller.rb b/app/controllers/institutions_controller.rb new file mode 100644 index 0000000000000000000000000000000000000000..0eb2ca291f822c645e854198ba8bfc22330a4d07 --- /dev/null +++ b/app/controllers/institutions_controller.rb @@ -0,0 +1,77 @@ +class InstitutionsController < ApplicationController + before_action :set_institution, only: [:show, :edit, :update, :destroy, :like] + + # GET /institutions + # GET /institutions.json + def index + @institutions = institution_repository.find_all + end + + # GET /institutions/1 + # GET /institutions/1.json + def show + end + + # GET /institutions/new + def new + @institution = Institution.new + end + + # GET /institutions/1/edit + def edit + end + + # POST /institutions + # POST /institutions.json + def create + @institution = Institution.new(institution_params) + + respond_to do |format| + if institution_repository.save @institution + format.html { redirect_to @institution, notice: 'Institution was successfully created.' } + else + format.html { render :new } + end + end + end + + # PATCH/PUT /institutions/1 + # PATCH/PUT /institutions/1.json + def update + respond_to do |format| + if institution_repository.update(institution_params) + format.html { redirect_to @learning_object, notice: 'Institution was successfully updated.' } + else + format.html { render :edit } + end + end + end + + # DELETE /institutions/1 + # DELETE /institutions/1.json + def destroy + institution_repository.destroy @institution + + respond_to do |format| + format.html { redirect_to institutions_url, notice: 'Learning object was successfully destroyed.' } + end + end + + + + private + + def set_institution + @institution = institution_repository.find_by_id("##{params[:id]}") + end + + def institution_repository + repository.for(:institution) + end + + # Never trust parameters from the scary internet, only allow the white list through. + def institution_params + params[:institution_object] + end + +end diff --git a/app/controllers/learning_objects_controller.rb b/app/controllers/learning_objects_controller.rb index 466884d923bc2bdf77f75bdb8c5797ae36865598..c61bdb7186eec207c7a93fa77e28c051bf627df5 100644 --- a/app/controllers/learning_objects_controller.rb +++ b/app/controllers/learning_objects_controller.rb @@ -6,7 +6,7 @@ class LearningObjectsController < ApplicationController # GET /learning_objects # GET /learning_objects.json def index - @learning_objects = learning_object_repository.all + @learning_objects = learning_object_repository.find_all end # GET /learning_objects/1 @@ -61,7 +61,7 @@ class LearningObjectsController < ApplicationController # POST /learning_objects/1/like def like - learning_object_repository.like @learning_object, current_user + learning_object_repository.like current_user, @learning_object redirect_to :back end @@ -73,7 +73,7 @@ class LearningObjectsController < ApplicationController # Use callbacks to share common setup or constraints between actions. def set_learning_object - @learning_object = learning_object_repository.get_by_dspace_id params[:id] + @learning_object = learning_object_repository.find_by_id params[:id] end # Never trust parameters from the scary internet, only allow the white list through. @@ -82,7 +82,9 @@ class LearningObjectsController < ApplicationController end def increment_learning_object_views - learning_object_repository.increment_views @learning_object + if user_signed_in? + learning_object_repository.increment_views current_user, @learning_object + end end end diff --git a/app/controllers/management/users_controller.rb b/app/controllers/management/users_controller.rb index 4c6de9d93bc5e37daaf181fa63076625b43d02ae..59cb720fc36173eda9ba0768332ff15b055cc60d 100644 --- a/app/controllers/management/users_controller.rb +++ b/app/controllers/management/users_controller.rb @@ -3,7 +3,7 @@ class Management::UsersController < ManagementController before_action :set_roles, only: [:new, :edit] def index - @users = user_repository.all + @users = user_repository.find_all end # GET /users/1 @@ -61,7 +61,7 @@ class Management::UsersController < ManagementController # Use callbacks to share common setup or constraints between actions. def set_user - @user = user_repository.find params[:id] + @user = user_repository.find_by_id params[:id] end # Never trust parameters from the scary internet, only allow the white list through. diff --git a/app/controllers/management/welcome_controller.rb b/app/controllers/management/welcome_controller.rb index 7fa9356d45eb2371bbe382b9fed45d940f98ac56..20e2db6276805d5930e04d6f1340ebdd5268dd40 100644 --- a/app/controllers/management/welcome_controller.rb +++ b/app/controllers/management/welcome_controller.rb @@ -1,8 +1,4 @@ class Management::WelcomeController < ManagementController def index - - end - - def destaques end end diff --git a/app/controllers/management_controller.rb b/app/controllers/management_controller.rb index 069b0f6bfa6ad5c5c32103985aee9c26ce482417..6db75c2c7f0cc891b5a3da1010a0ae330923a3de 100644 --- a/app/controllers/management_controller.rb +++ b/app/controllers/management_controller.rb @@ -1,16 +1,3 @@ class ManagementController < ApplicationController layout 'management' - - - def destaques - end - - def denuncias - end - - def estatisticas - end - - def usuarios - end end diff --git a/app/controllers/search/solr_controller.rb b/app/controllers/search/solr_controller.rb deleted file mode 100644 index 6054b17d6d37b4bf0a9f43abcd70cd09801ffe4b..0000000000000000000000000000000000000000 --- a/app/controllers/search/solr_controller.rb +++ /dev/null @@ -1,127 +0,0 @@ -class Search::SolrController < ApplicationController - - def search - queryParams = {:q => '*:*', :fq => params[:qry]} - - results = solr_client.get 'select', - :params => merge_search_parameters(queryParams, solr_search_default_parameters) - - objectsFound1 = select_items_from_results(results) - #@numFound = results["response"]["numFound"] - @numFound =objectsFound1.length - - per_page=10 - @npagnac=10 - if(params[:paginacao]) - per_page=params[:paginacao].to_i - @npagnac=per_page - end - - if(params[:page]) - #params[:page] = 1 - else - params[:page] = 1 - end - - current_page= params[:page].to_i - - if params[:sort] - @ordena=params[:sort] - end - if params[:sort] == "author" - objectsFound1 = sort_author(objectsFound1); - elsif params[:sort] == "publicationasc" - objectsFound1 = objectsFound1.sort_by{|item| [ item['search.resourceid'] ]} - elsif params[:sort] == "publicationdesc" - objectsFound1 = objectsFound1.sort_by{|item| -item['search.resourceid'] } - elsif params[:sort] == "relevance" - items= objectsFound1.collect{ |x| Ranking::Item.new("",1,1,1, x) } #puts each object in an item - - rater = Ranking::Rater.new( - Ranking::Strategies::BasicRater.new( - #define sorting weights - positionWeight = 1000, - useWeight = 1, - likeWeight = 100 - ) - ) - - a = rater.sortByRate(items) # Returns sorted array of items - objectsFound1= a.collect{ |x| x.info } #get only the info fields(objects) - - elsif params[:sort] == "title" - objectsFound1 = sort_title(objectsFound1); - end - # current_page, per_page, total_results - @objectsFound = WillPaginate::Collection.create(current_page, per_page, objectsFound1.length) do |pager| - @start = (current_page-1)*per_page - pager.replace (objectsFound1.to_a[@start,per_page]) - end - - #search.resourceid - #for item in objectsFound - # Busca no orientDb (rid,classe,rate) - #end - end - - private - - #Resource types: - # 2 = Item - # 3 = Collection - # 4 = Community - - def select_items_from_results(results) - resultList = Set.new - results["response"]["docs"].select { |r| - r["search.resourcetype"].to_i.equal? 2 - }.each do |i| - resultList.add i - end - return resultList - end - - def solr_client - return RSolr.connect :url => 'http://portalmecdev.c3sl.ufpr.br:8080/solr/search/' - end - - def merge_search_parameters(p1, p2) - return p1.merge(p2) { |key,oldval,newval| key = [newval,oldval].flatten } - end - - def solr_search_default_parameters - return { - "fl"=>[" - search.resourcetype, search.resourceid, - handle, author, title, dc.description - "], - "type"=>"0", - "start"=>"0", - "rows"=>"1000", - "facet"=>"true", - "facet.offset"=>"0", - "facet.mincount"=>"1", - "f.subject_tax_0_filter.facet.sort"=>"count", - "f.subject_tax_0_filter.facet.limit"=>"11", - "f.author_filter.facet.limit"=>"11", - "f.dateIssued.year.facet.sort"=>"index", - "f.dateIssued.year.facet.limit"=>"10", - "f.author_filter.facet.sort"=>"count", - "facet.field"=>["author_filter","subject_tax_0_filter","dateIssued.year"], - "fq"=>["NOT(withdrawn:true)","NOT(discoverable:false)","read:(g0 OR g0)"] - } - end - - def sort_author(items) - items = items.sort_by{|item| [ item['author'].to_s.downcase ]} - items.each{ |item| item['author'] = sort_author(item['author']) if (item['author'].nil? ? [] : item['author']).size > 0 } - items - end - - - def sort_title(items) - items = items.sort_by{|item| [ item['title'].to_s.downcase ]} - items.each{ |item| item['title'] = sort_title(item['title']) if (item['title'].nil? ? [] : item['title']).size > 0 } - items - end -end \ No newline at end of file diff --git a/app/controllers/search_controller.rb b/app/controllers/search_controller.rb new file mode 100644 index 0000000000000000000000000000000000000000..a59fd8163bae09371322c428f04d4e2cfc6019ab --- /dev/null +++ b/app/controllers/search_controller.rb @@ -0,0 +1,74 @@ +class SearchController < ApplicationController + + include SearchEngine::OrientdbLucene + + def index + + objectsFound = search(params[:qry]) + @numFound = objectsFound.length + + per_page=10 + @npagnac=10 + if(params[:paginacao]) + per_page=params[:paginacao].to_i + @npagnac=per_page + end + + if(params[:page]) + #params[:page] = 1 + else + params[:page] = 1 + end + + current_page = params[:page].to_i + + if params[:sort] + @ordena = params[:sort] + end + if params[:sort] == "author" + objectsFound = sort_author(objectsFound); + elsif params[:sort] == "publicationasc" + objectsFound = objectsFound.sort_by{|item| [ item.id ]} + elsif params[:sort] == "publicationdesc" + objectsFound = objectsFound.sort_by{|item| - item.id } + elsif params[:sort] == "relevance" + items= objectsFound.collect{ |x| Ranking::Item.new(x.name,x.views,0,x.likes,x) } #puts each object in an item + + rater = Ranking::Rater.new( + Ranking::Strategies::BasicRater.new( + #define sorting weights + positionWeight = 1000, + useWeight = 1, + likeWeight = 100 + ) + ) + + a = rater.sortByRate(items) # Returns sorted array of items + objectsFound = a.collect{ |x| x.info } #get only the info fields(objects) + + elsif params[:sort] == "title" + objectsFound = sort_title(objectsFound); + end + # current_page, per_page, total_results + @results = WillPaginate::Collection.create(current_page, per_page, objectsFound.length) do |pager| + @start = (current_page-1)*per_page + pager.replace (objectsFound.to_a[@start,per_page]) + end + + end + + private + + def sort_author(items) + # items = items.sort_by{|item| [ item['author'].to_s.downcase ]} + # items.each{ |item| item['author'] = sort_author(item['author']) if (item['author'].nil? ? [] : item['author']).size > 0 } + items + end + + + def sort_title(items) + # items = items.sort_by{|item| [ item['title'].to_s.downcase ]} + # items.each{ |item| item['title'] = sort_title(item['title']) if (item['title'].nil? ? [] : item['title']).size > 0 } + items + end +end diff --git a/app/controllers/welcome_controller.rb b/app/controllers/welcome_controller.rb index 37b8bd2034c9bb99f3b7830f66553a342ea4e03c..459c4f54a1d0b7fa82b9c72c612d96a69de2af38 100644 --- a/app/controllers/welcome_controller.rb +++ b/app/controllers/welcome_controller.rb @@ -3,15 +3,27 @@ class WelcomeController < ApplicationController def index @Carousel = Array.new @General = Array.new - mainPage = repository.for(:mainPage).find_all + mainPage = repository.for(:mainPage).find_all.first - @Carousel = mainPage[0]["carousel"].collect do |id| + @Carousel = mainPage["carousel"].collect do |id| repository.for(:webLink).find_by_id(id)[0] #orientdb returns a hash inside an array, I want only the hash end - @General = mainPage[0]["highlights"].collect do |id| - repository.for(:object).find_by_id(id)[0] + @General = mainPage["highlights"].collect do |id| + repository.for(:learning_object).find_by_id(id) end + + @Subjects = repository.for(:subject).find_all.take(8) + @Subjects.delete_if do |subject| + if subject.highlights.nil? || subject.highlights.empty? + true + end + end + @Subjects.each do |subject| + object = repository.for(:learning_object).find_by_id(subject.highlights.first) + subject['first_highlight'] = object + end + end def faq diff --git a/app/helpers/learning_objects_helper.rb b/app/helpers/learning_objects_helper.rb index d7e67df64bab71928e5fee3749756cab4ca9661f..4119caef6359bfacbe5d41bebde6c959e431e071 100644 --- a/app/helpers/learning_objects_helper.rb +++ b/app/helpers/learning_objects_helper.rb @@ -1,7 +1,7 @@ module LearningObjectsHelper - def get_object_property (object, property_name) - unless object.nil? - return object.first[property_name] - end + + def show_categories(categories = []) + categories.to_s end + end diff --git a/app/models/collection.rb b/app/models/collection.rb new file mode 100644 index 0000000000000000000000000000000000000000..a680bb6b6cae2df3de5d58455ff1ef71f9ad1ff1 --- /dev/null +++ b/app/models/collection.rb @@ -0,0 +1,24 @@ +class Collection + include ActiveModel::Model + attr_accessor :id, :created_at, :description, :name, :views, :likes, + :owner, :learning_objects + validates_presence_of :name, :created_at, :views, :likes, :owner, :learning_objects + validates_with Validators::CollectionOwnerValidator + + def initialize(params={}) + super(params.merge(defaults)) + end + + private + + def defaults + { + views: 0, + likes: 0, + created_at: DateTime.new, + owner: User.new, + learning_objects: [] + } + end + +end diff --git a/app/models/institution.rb b/app/models/institution.rb index a40438bf5ebcf1557623c6e17023753f03d70be8..64a83bf6c51a54af1677755f120a8b44b6a44150 100644 --- a/app/models/institution.rb +++ b/app/models/institution.rb @@ -1,18 +1,4 @@ class Institution + include ActiveModel::Model attr_accessor :id, :title, :description - - def initialize(args={}) - @id = args[:id] - @title = args[:title] - end - - def subjects - @subjects ||= learning_object_repository.get_subjects(self) - end - - private - - def learning_object_repository - Portalmec::Application.repository.for :learning_object - end end diff --git a/app/models/learning_object.rb b/app/models/learning_object.rb index bb1f9522555f8de51de6e3f6fad44dc6f5f9eecb..a81ad0253324282f7cf6adc5396c8763e399616c 100644 --- a/app/models/learning_object.rb +++ b/app/models/learning_object.rb @@ -1,10 +1,18 @@ class LearningObject include ActiveModel::Model - - attr_accessor :id, - :name, :description, :thumbnail, :date_creation, :last_modified, - :id_dspace, :type, :bitstreams, :metadata - attr_accessor :likes, :views, :subjects, :attributes + attr_accessor :id, :id_dspace, :rid, :name, :description, + :thumbnail, :date_creation, :last_modified, + :type, :bitstreams, :metadata, :likes, :views, + :downloads, :subjects, :attributes + + validates_presence_of :name, :date_creation, :type, :likes, :views, :downloads + validates_numericality_of :likes, greater_than_or_equal_to: 0 + validates_numericality_of :views, greater_than_or_equal_to: 0 + validates_numericality_of :downloads, greater_than_or_equal_to: 0 + + def initialize(params={}) + super(params.merge(defaults)) + end def subjects @subjects ||= learning_object_repository.get_subjects(self) @@ -14,6 +22,10 @@ class LearningObject @attributes ||= learning_object_repository.get_attributes(self) end + def categories + get_metadata_value_of 'dc.subject.category' + end + def get_metadata_value_of key get_metadata_values_of(key).first end @@ -25,9 +37,18 @@ class LearningObject end values end - + private + def defaults + { + likes: 0, + views: 0, + downloads: 0, + date_creation: DateTime.new + } + end + def learning_object_repository Portalmec::Application.repository.for :learning_object end diff --git a/app/models/main_page.rb b/app/models/main_page.rb new file mode 100644 index 0000000000000000000000000000000000000000..fad55d3bbaaa81f8f04a378e60249b0619ecd4de --- /dev/null +++ b/app/models/main_page.rb @@ -0,0 +1,4 @@ +class MainPage + include ActiveModel::Model + attr_accessor :id, :carousel, :highlights +end \ No newline at end of file diff --git a/app/models/role.rb b/app/models/role.rb index 33cd819aca6c2fef5200134c096b45a0249961bb..33808ec85172a0ec383b61eac2f99d4e06852f91 100644 --- a/app/models/role.rb +++ b/app/models/role.rb @@ -1,3 +1,6 @@ class Role < ActiveRecord::Base has_and_belongs_to_many :users + + validates_presence_of :name + validates_uniqueness_of :name end diff --git a/app/models/subject.rb b/app/models/subject.rb index fee7acbe628ce931ae1acfcfee57e87d9ca142fb..a76b5da86bb24b66ca55e7cb654bd8e0a38dacb8 100644 --- a/app/models/subject.rb +++ b/app/models/subject.rb @@ -1,5 +1,15 @@ class Subject include ActiveModel::Model - attr_accessor :id, :date_creation, :description, :highlights, :name, :thumbnail + attr_accessor :id, :date_creation, :description, :highlights, :name, + :learning_objects + + def learning_objects + @learning_objects ||= subject_repository.get_learning_objects(self) + end + + def subject_repository + Portalmec::Application.repository.for :subject + end + end \ No newline at end of file diff --git a/app/models/user.rb b/app/models/user.rb index 165a95fec397b24c4280eab6b758cc63e90bea7f..28100ca583e944ea07f031fab91efee58583551d 100644 --- a/app/models/user.rb +++ b/app/models/user.rb @@ -23,8 +23,9 @@ class User < ActiveRecord::Base devise :database_authenticatable, :registerable, :recoverable, :rememberable, :trackable, :validatable has_and_belongs_to_many :roles - after_create SyncUserRepositoryService.new after_destroy SyncUserRepositoryService.new -end + has_attached_file :avatar, styles: { medium: "300x300>", thumb: "60x60>" }, default_url: ActionController::Base.helpers.asset_path('missing.svg') + validates_attachment_content_type :avatar, content_type: /\Aimage\/.*\Z/ +end diff --git a/app/models/validators/collection_owner_validator.rb b/app/models/validators/collection_owner_validator.rb new file mode 100644 index 0000000000000000000000000000000000000000..d98460e12908c90300f426b6f205d60eb34be780 --- /dev/null +++ b/app/models/validators/collection_owner_validator.rb @@ -0,0 +1,9 @@ +class Validators::CollectionOwnerValidator < ActiveModel::Validator + + def validate(record) + if !record.owner.is_a?(User) + record.errors.add :base, 'The owner must be an User' + end + end + +end \ No newline at end of file diff --git a/app/models/web_link.rb b/app/models/web_link.rb new file mode 100644 index 0000000000000000000000000000000000000000..ee1edc1eb3bb5c4369e1448629534530a3af286b --- /dev/null +++ b/app/models/web_link.rb @@ -0,0 +1,4 @@ +class WebLink + include ActiveModel::Model + attr_accessor :id, :dateCreation, :description, :name, :thumbnail, :url +end \ No newline at end of file diff --git a/app/repositories/active_record/subject_repository.rb b/app/repositories/active_record/subject_repository.rb new file mode 100644 index 0000000000000000000000000000000000000000..dcccbb258a48790ca63d82e9de706190b23480f3 --- /dev/null +++ b/app/repositories/active_record/subject_repository.rb @@ -0,0 +1,14 @@ +module ActiveRecord + class SubjectRepository + + def find_all + end + + def find_by_id + end + + def insert_data(name, url) + end + + end +end diff --git a/app/repositories/orient_db/base.rb b/app/repositories/orient_db/base.rb index 470d3acb43289708d223b75d1569daafd569f615..349ff82fd3f7c1c418682e5bb6b620d7280fc57e 100644 --- a/app/repositories/orient_db/base.rb +++ b/app/repositories/orient_db/base.rb @@ -9,31 +9,26 @@ class OrientDb::Base @connection end - def find(id) + def find_by_id(id) result = get_by_rid(id) build_object result end # Example: - # list = repository.for(:learning_objects).all + # list = repository.for(:learning_objects).find_all # list.each do |learning_object| # learning_object.inspect <LearningObject model> # end - def all(limit=-1) - objects_hash = connection.query "SELECT FROM #{odb_class}", :limit => limit + def find_all + objects_hash = connection.query "SELECT FROM #{odb_class}", :limit => -1 objects = build_objects(objects_hash) || [] end - def all(limit,offset) + def find_all_from_offset_to_limit(offset,limit) objects_hash = connection.query "SELECT FROM #{odb_class} SKIP #{offset}", :limit => limit objects = build_objects(objects_hash) || [] end - def all_after(after_id,limit=-1) - objects_hash = connection.query "SELECT FROM #{odb_class} WHERE @rid > #{after_id}", :limit => limit - objects = build_objects(objects_hash) || [] - end - def create(object) hash = build_hash(object) result = connection.create_document(hash) diff --git a/app/repositories/orient_db/carousel_repository.rb b/app/repositories/orient_db/carousel_repository.rb index a8a2d8c0a0c529dba2d7a43e4d02a0adfe9f5dd5..cf39aa0748c95cf833c983d7cb2b01cc5730e4c7 100644 --- a/app/repositories/orient_db/carousel_repository.rb +++ b/app/repositories/orient_db/carousel_repository.rb @@ -20,5 +20,11 @@ module OrientDb return nil end + private + + def odb_class + "Carousel" + end + end end diff --git a/app/repositories/orient_db/collection_repository.rb b/app/repositories/orient_db/collection_repository.rb new file mode 100644 index 0000000000000000000000000000000000000000..80e6b177add29920a2b038400e8267d5baee9449 --- /dev/null +++ b/app/repositories/orient_db/collection_repository.rb @@ -0,0 +1,26 @@ +module OrientDb + class CollectionRepository < Base + include OrientDb::Methods::EdgeMethods + + # Usage: + # repository.for(:collections).destroy collection + # + def destroy(collection) + connection.command sprintf("DELETE VERTEX %s", collection.id) + end + + def build_object(args={}) + Collection.new( + :id => args["@rid"], + :name => args["name"] + ) + end + + private + + def odb_class + "Collection" + end + + end +end diff --git a/app/repositories/orient_db/institution_repository.rb b/app/repositories/orient_db/institution_repository.rb index 6bc0e470f058a2ff7d0dce33ec002053c7472200..028e13b96f04e1747c3e2825ad6e2638be70bb41 100644 --- a/app/repositories/orient_db/institution_repository.rb +++ b/app/repositories/orient_db/institution_repository.rb @@ -2,24 +2,6 @@ module OrientDb class InstitutionRepository < Base include OrientDb::Methods::EdgeMethods - # Example: - # list = repository.for(:institutions).all - # list.each do |institution| - # institution_object.inspect <LearningObject model> - # end - def all - hash = connection.query "SELECT FROM Institution" - institutions = build_institutions(hash) - end - - # Usage: - # institution = repository.for(:institutions).get_by_dspace_id 123 - # - def find(id) - result = connection.query "SELECT FROM #{id}" - build_institution result.first - end - def create(name, url) connection.command sprintf("INSERT INTO Institution (name) VALUES ('%s')", name) end @@ -31,21 +13,17 @@ module OrientDb connection.command sprintf("DELETE VERTEX %s", institution.id) end - private - - def build_institution(args={}) + def build_object(args={}) return Institution.new( :id => args["@rid"], :title => args["title"], ) end - def build_institutions(hash=[]) - institutions = [] - hash.each do |h| - institutions << build_institution(h) - end - return institutions + private + + def odb_class + "Institution" end end diff --git a/app/repositories/orient_db/learning_object_repository.rb b/app/repositories/orient_db/learning_object_repository.rb index 1c777f511a2095164cf60ff1b0ccc62ba2761c4b..689a95815eeeccde16e5b7c97ae8e90b42252f14 100644 --- a/app/repositories/orient_db/learning_object_repository.rb +++ b/app/repositories/orient_db/learning_object_repository.rb @@ -2,17 +2,16 @@ module OrientDb class LearningObjectRepository < Base include OrientDb::Methods::EdgeMethods - def increment_views(learning_object) - #learning_object.views = learning_object.views + 1 - #save learning_object + def increment_views(user, learning_object) + create_edge "Views", user.rid, learning_object.id end # # Usage: # repository.for(:learning_objects).like @learning_object, current_user # - def like(learning_object, user) - create_edge 'Likes', learning_object.id, user.id + def like(user, learning_object) + create_edge "Likes", user.rid, learning_object.id end # Usage: @@ -46,42 +45,50 @@ module OrientDb connection.command sprintf("DELETE VERTEX #{odb_class} where @rid = '%s'", learning_object.id) end - #def author_of(rid) - # connection.query "SELECT expand(in) FROM (SELECT expand(out_author_of) FROM User WHERE @rid=#{rid})" - #end - - #def has(rid) - # connection.query "SELECT expand(in) FROM (SELECT expand(out_has) FROM User WHERE @rid=#{rid})" - #end - - #def get_likes(id) - # likes = connection.query "select outE('Likes') from #{id}" - # likes[0]["outE"] - #end - - #def get_downloads(id) - # downloads = connection.query "select outE('Downloads') from #{id}" - # downloads[0]["outE"] - #end - - #def get_views(id) - # views = connection.query "select outE('Views') from #{id}" - # views[0]["outE"] - #end + ## + # To create "index:learningobject_search" on OrientDB, use the following command: + # CREATE INDEX learningobject_search + # ON LearningObject (name, description) + # FULLTEXT ENGINE LUCENE + # METADATA {"analyzer":"org.apache.lucene.analysis.br.BrazilianAnalyzer"} + def search(qry) + learning_objects_hash = connection.query " + SELECT EXPAND(rid) + FROM index:learningobject_search + WHERE key LUCENE '#{qry}' + ", limit: -1 + learning_objects = build_learning_objects(learning_objects_hash) || [] + end def build_object(args={}) lo = nil unless args.nil? lo = LearningObject.new(:id => args["@rid"], - :id_dspace => args["id_dspace"], - :name => args["name"], - :metadata => args["metadata"]) + :name => args["name"], + :description => args["description"], + :thumbnail => args["thumbnail"], + :date_creation => args["date_creation"], + :id_dspace => args["id_dspace"], + :type => args["type"], + :bitstreams => args["bitstreams"], + :metadata => args["metadata"], + :last_modified => args["last_modified"]) lo.likes = args.has_key?("in_Likes") ? args["in_Likes"].size : 0 lo.views = args.has_key?("in_Views") ? args["in_Views"].size : 0 end lo end + def build_hash + hash = super + hash.delete("likes") + hash.delete("views") + hash.delete("downloads") + hash.delete("subjects") + hash.delete("attributes") + hash + end + private def create_edges_from_array(edge_class, id, array, unique=false) @@ -107,4 +114,4 @@ module OrientDb end end -end \ No newline at end of file +end diff --git a/app/repositories/orient_db/main_page_repository.rb b/app/repositories/orient_db/main_page_repository.rb index 27b7e8e57eaaca569dd1bb55527780fd8ef8b9d5..3663b56d481e6f1a0af7d6460d4fb228709af896 100644 --- a/app/repositories/orient_db/main_page_repository.rb +++ b/app/repositories/orient_db/main_page_repository.rb @@ -22,7 +22,13 @@ module OrientDb def update(id,operation,atributte,new) puts "update #{id} #{operation} #{atributte} = #{new}" - return @connection.command "update #{id} #{operation} #{atributte} = #{new}" + connection.command "update #{id} #{operation} #{atributte} = #{new}" + end + + private + + def odb_class + "MainPage" end end diff --git a/app/repositories/orient_db/subject_repository.rb b/app/repositories/orient_db/subject_repository.rb index 01a9b1ce2cd68174fc7c84f50a3a365722640b1c..f61ce039052400071af43deae864f31520fbb861 100644 --- a/app/repositories/orient_db/subject_repository.rb +++ b/app/repositories/orient_db/subject_repository.rb @@ -1,11 +1,32 @@ module OrientDb class SubjectRepository < Base + include OrientDb::Methods::EdgeMethods def find_by_name(name) result = select_by_property(odb_class, "name", name) build_object(result.first) end + def destroy_data(id) + connection.command "DELETE VERTEX Subject where @rid = '#{id}'" + end + + def update(id,operation,atributte,new_value) + puts "update #{id} #{operation} #{atributte} = #{new_value}" + connection.command "update #{id} #{operation} #{atributte} = #{new_value}" + end + + def get_learning_objects(subject) + result = get_edges_end("IsAbout","in",subject.id) + Portalmec::Application.repository.for(:learning_object).build_objects(result) + end + + def build_hash + hash = super + hash.delete("learning_objects") + hash + end + def build_object(args={}) subject = nil unless args.nil? @@ -27,4 +48,4 @@ module OrientDb end end -end \ No newline at end of file +end diff --git a/app/repositories/orient_db/user_repository.rb b/app/repositories/orient_db/user_repository.rb index ef73202db25fc2d2aa67df52c9259451e638537f..8068a3f257520146b9ee68607ad1773452c4dca3 100644 --- a/app/repositories/orient_db/user_repository.rb +++ b/app/repositories/orient_db/user_repository.rb @@ -2,11 +2,32 @@ module OrientDb class UserRepository < Base def create_graph_node(user) - connection.command sprintf("INSERT INTO User (p_id) VALUES (%d)", user.id) + if user.persisted? + connection.command sprintf("create vertex User set p_id = %d", user.id) + return true + end + + raise NotPersistedRecordError, 'The user wasn`t persisted yet.' end def destroy_graph_node(user) - connection.command sprintf("DELETE FROM User WHERE p_id = %d", user.id) + connection.command sprintf("destroy vertex User WHERE p_id = %d", user.id) + end + + def get_graph_id(user) + result = connection.query sprintf("SELECT @rid FROM User WHERE p_id = %d", user.id) + result.first["rid"].to_s + end + + def is_vertex?(user) + result = connection.query sprintf("SELECT @rid FROM User WHERE p_id = %d", user.id) + (result.count > 0) + end + + private + + def odb_class + "User" end end diff --git a/app/repositories/user_repository_proxy.rb b/app/repositories/user_repository_proxy.rb index d18a0a88d6e8f122499d7678e2caa39b9f8a4381..94e18c596c39b2349b66304edb9fae371caa0bd8 100644 --- a/app/repositories/user_repository_proxy.rb +++ b/app/repositories/user_repository_proxy.rb @@ -7,7 +7,17 @@ class UserRepositoryProxy end def create_graph_node(user) - orientdb_user_repository.create_graph_node user + if user.persisted? + if orientdb_user_repository.create_graph_node user + update_user_refs user + end + else + raise_not_persisted_error + end + end + + def get_graph_id(user) + orientdb_user_repository.get_graph_id user end def destroy_graph_node(user) @@ -22,8 +32,24 @@ class UserRepositoryProxy User.respond_to?(method_name) || super end + private attr_reader :orientdb_user_repository -end \ No newline at end of file + def update_user_refs(user) + rid = get_graph_id user + user.rid = rid + user.save! + end + + def check_references(user) + rid = get_graph_id user + (rid == user.rid) + end + + def raise_not_persisted_error + raise NotPersistedRecordError, 'The user wasn`t` persisted yet.' + end + +end diff --git a/app/views/collections/index.html.erb b/app/views/collections/index.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..68aebfd77d68d1e74c4b6af2e9ea566d8babac6a --- /dev/null +++ b/app/views/collections/index.html.erb @@ -0,0 +1,229 @@ +<h1>Coleções de Recursos</h1> + +<div class="row recommend-collections"> + <h2>Recomendamos para você</h2> + + <!-- item --> + <div class="col-sm-4"> + <div class="row"> + <h4><b>Compreensão oral</b></h4> + <div class="object-vertical"> + <div class="panel"> + <div> + <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive"> + </div> + <div class="panel-body"> + <h4 class="media-heading">Los derechos del animal (1)</h4> + <span class="glyphicon glyphicon-eye-open">200 </span> + <span class="glyphicon glyphicon-star">4,5 </span> + <span>Por <a>Usuário </a></span> + </div> + </div> + </div> + <p> + <a href="#">Ver Mais</a> + </p> + </div> + </div> + <!-- /item --> + + + <div class="col-sm-4"> + <div class="row"> + <h4><b>Educação Básica</b></h4> + <div class="object-vertical"> + <div class="panel"> + <div> + <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive"> + </div> + <div class="panel-body"> + <h4 class="media-heading">Los derechos del animal (1)</h4> + <span class="glyphicon glyphicon-eye-open">200 </span> + <span class="glyphicon glyphicon-star">4,5 </span> + <span>Por <a>Usuário </a></span> + </div> + </div> + </div> + + <p> + <a href="#">Ver Mais</a> + </p> + </div> + </div> + + + <div class="col-sm-4"> + <div class="row"> + <h4><b>Ensino Médio</b></h4> + <div class="object-vertical"> + <div class="panel"> + <div> + <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive"> + </div> + <div class="panel-body"> + <h4 class="media-heading">Los derechos del animal (1)</h4> + <span class="glyphicon glyphicon-eye-open">200 </span> + <span class="glyphicon glyphicon-star">4,5 </span> + <span>Por <a>Usuário </a></span> + </div> + </div> + </div> + + <p> + <a href="#">Ver Mais</a> + </p> + </div> + </div> +</div> + +<div class="row newest-collections"> + <h2>Últimas coleções</h2> + + <!-- item --> + <div class="col-sm-4"> + <div class="row"> + <h4><b>Compreensão oral</b></h4> + <div class="object-vertical"> + <div class="panel"> + <div> + <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive"> + </div> + <div class="panel-body"> + <h4 class="media-heading">Los derechos del animal (1)</h4> + <span class="glyphicon glyphicon-eye-open">200 </span> + <span class="glyphicon glyphicon-star">4,5 </span> + <span>Por <a>Usuário </a></span> + </div> + </div> + </div> + <p> + <a href="#">Ver Mais</a> + </p> + </div> + </div> + <!-- /item --> + + + <div class="col-sm-4"> + <div class="row"> + <h4><b>Educação Básica</b></h4> + <div class="object-vertical"> + <div class="panel"> + <div> + <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive"> + </div> + <div class="panel-body"> + <h4 class="media-heading">Los derechos del animal (1)</h4> + <span class="glyphicon glyphicon-eye-open">200 </span> + <span class="glyphicon glyphicon-star">4,5 </span> + <span>Por <a>Usuário </a></span> + </div> + </div> + </div> + + <p> + <a href="#">Ver Mais</a> + </p> + </div> + </div> + + + <div class="col-sm-4"> + <div class="row"> + <h4><b>Ensino Médio</b></h4> + <div class="object-vertical"> + <div class="panel"> + <div> + <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive"> + </div> + <div class="panel-body"> + <h4 class="media-heading">Los derechos del animal (1)</h4> + <span class="glyphicon glyphicon-eye-open">200 </span> + <span class="glyphicon glyphicon-star">4,5 </span> + <span>Por <a>Usuário </a></span> + </div> + </div> + </div> + + <p> + <a href="#">Ver Mais</a> + </p> + </div> + </div> +</div> + +<div class="row newest-collections"> + <h2>Últimas coleções</h2> + + <!-- item --> + <div class="col-sm-4"> + <div class="row"> + <h4><b>Compreensão oral</b></h4> + <div class="object-vertical"> + <div class="panel"> + <div> + <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive"> + </div> + <div class="panel-body"> + <h4 class="media-heading">Los derechos del animal (1)</h4> + <span class="glyphicon glyphicon-eye-open">200 </span> + <span class="glyphicon glyphicon-star">4,5 </span> + <span>Por <a>Usuário </a></span> + </div> + </div> + </div> + <p> + <a href="#">Ver Mais</a> + </p> + </div> + </div> + <!-- /item --> + + + <div class="col-sm-4"> + <div class="row"> + <h4><b>Educação Básica</b></h4> + <div class="object-vertical"> + <div class="panel"> + <div> + <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive"> + </div> + <div class="panel-body"> + <h4 class="media-heading">Los derechos del animal (1)</h4> + <span class="glyphicon glyphicon-eye-open">200 </span> + <span class="glyphicon glyphicon-star">4,5 </span> + <span>Por <a>Usuário </a></span> + </div> + </div> + </div> + + <p> + <a href="#">Ver Mais</a> + </p> + </div> + </div> + + + <div class="col-sm-4"> + <div class="row"> + <h4><b>Ensino Médio</b></h4> + <div class="object-vertical"> + <div class="panel"> + <div> + <img src="http://dummyimage.com/250x150/363336/fff" alt="dummy image" class="img-responsive"> + </div> + <div class="panel-body"> + <h4 class="media-heading">Los derechos del animal (1)</h4> + <span class="glyphicon glyphicon-eye-open">200 </span> + <span class="glyphicon glyphicon-star">4,5 </span> + <span>Por <a>Usuário </a></span> + </div> + </div> + </div> + + <p> + <a href="#">Ver Mais</a> + </p> + </div> + </div> +</div> \ No newline at end of file diff --git a/app/views/collections/index.json.jbuilder b/app/views/collections/index.json.jbuilder new file mode 100644 index 0000000000000000000000000000000000000000..ab3f845e60ad913050aecf50f3ac3032e4ce6c7a --- /dev/null +++ b/app/views/collections/index.json.jbuilder @@ -0,0 +1,4 @@ +json.array!(@collections) do |collection| + json.extract! collection, :id, :name + #json.url collection_url(collection, format: :json) +end diff --git a/app/views/collections/show.html.erb b/app/views/collections/show.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..c224d3447d983e5f37cb4f4649b8aeb531ff483a --- /dev/null +++ b/app/views/collections/show.html.erb @@ -0,0 +1 @@ +<h1><%= @collection.name %></h1> diff --git a/app/views/collections/show.json.jbuilder b/app/views/collections/show.json.jbuilder new file mode 100644 index 0000000000000000000000000000000000000000..64c29dac93b6771a3fe28d4cb989186a5f058fc8 --- /dev/null +++ b/app/views/collections/show.json.jbuilder @@ -0,0 +1 @@ +json.extract! @collection, :id, :name diff --git a/app/views/devise/registrations/edit.html.erb b/app/views/devise/registrations/edit.html.erb index 51ee35d468d244240877322f4c038e7af2f87448..9a894469bc0691b04f35cfa7aa4d622dc030f0fa 100644 --- a/app/views/devise/registrations/edit.html.erb +++ b/app/views/devise/registrations/edit.html.erb @@ -1,6 +1,6 @@ <h2>Edit <%= resource_name.to_s.humanize %></h2> -<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: {method: :put}) do |f| %> +<%= form_for(resource, as: resource_name, url: registration_path(resource_name), html: {method: :put, multipart: true}) do |f| %> <%= devise_error_messages! %> <div class="field"> @@ -13,6 +13,11 @@ <%= f.email_field :email, autofocus: true %> </div> + <div class="field"> + <%= f.label :avatar %><br/> + <%= f.file_field :avatar %> + </div> + <% if devise_mapping.confirmable? && resource.pending_reconfirmation? %> <div>Currently waiting confirmation for: <%= resource.unconfirmed_email %></div> <% end %> diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index 91214e8314b348751ea78190b9f95cb2e248eb5c..5974f076c8ed56f498f2588ac3fa2c65fd02e7b7 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -2,34 +2,35 @@ <html> <head> <title>PortalMEC</title> - <%= stylesheet_link_tag 'application', media: 'all' %> - <%= javascript_include_tag 'application' %> - <%= javascript_include_tag "http://www.google.com/jsapi", "chartkick" %> - <%= stylesheet_link_tag 'http://yandex.st/bootstrap/3.1.1/css/bootstrap.min.css' %> - <%= javascript_include_tag 'http://yandex.st/bootstrap/3.1.1/js/bootstrap.min.js' %> - <%= csrf_meta_tags %> - <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track' => true %> - + <link href='https://fonts.googleapis.com/css?family=Roboto:400,300,700,500' rel='stylesheet' type='text/css'> <%= javascript_include_tag 'application', 'data-turbolinks-track' => true %> <%= csrf_meta_tags %> <meta property="creator.productor" content="http://estruturaorganizacional.dados.gov.br/id/unidade-organizacional/1"> </head> -<body style="font-size: 15px"> -<div id="wrapper"> +<body> <%= render 'shared/application/header' %> - <% if notice %> - <%= notice %> - <% end %> + <div class="container"> + <% if notice %> + <div class="alert alert-info" role="alert"> + <button type="button" class="close" data-dismiss="alert" aria-label="Fechar"><span aria-hidden="true">×</span></button> + <%= notice %> + </div> + <% end %> + + <% if alert %> + <div class="alert alert-danger alert-dismissible" role="alert"> + <button type="button" class="close" data-dismiss="alert" aria-label="Fechar"><span aria-hidden="true">×</span></button> + <%= alert %> + </div> + <% end %> - <div id="content"> <%= yield %> </div> - <div id="footer"> - <%= render 'shared/application/footer' %> - </div> -</div> -<script defer="defer" src="//barra.brasil.gov.br/barra.js" type="text/javascript"></script> + + <%= render 'shared/application/footer' %> + + <script defer="defer" src="//barra.brasil.gov.br/barra.js" type="text/javascript"></script> </body> </html> diff --git a/app/views/learning_objects/_learning_object.erb b/app/views/learning_objects/_learning_object.erb new file mode 100644 index 0000000000000000000000000000000000000000..d1ed26f2a6ed15e5564ff8d056e5029913029f75 --- /dev/null +++ b/app/views/learning_objects/_learning_object.erb @@ -0,0 +1,27 @@ +<div class="learning_object-horizontal"> + <div class="media"> + <div class="media-left media-middle"> + <a href="#"> + <img src="http://dummyimage.com/250x150/363336/fff" alt='dummy image'> + </a> + </div> + <div class="media-body"> + <a href="<%= learning_object_path(id: learning_object.id) %>"> + <% if learning_object.name.nil? %> + <h4 class="media-heading">Sem TÃtulo</h4> + <% else %> + <h4 class="media-heading"><%= learning_object.name %></h4> + <% end %> + </a> + <span>Por <a>Usuário </a></span><br/> + <span class="glyphicon glyphicon-eye-open"><%= learning_object.views %> </span> + <span class="glyphicon glyphicon-star"><%= learning_object.likes %> </span><br> + <% unless learning_object.description.nil? %> + <%= learning_object.description %> + <br/> + <% end %> + <br/> + Em<b> <%= show_categories learning_object.categories %></b> + </div> + </div> +</div> \ No newline at end of file diff --git a/app/views/learning_objects/show.html.erb b/app/views/learning_objects/show.html.erb index dad01c260d0c569cedb5efcb9a0c6567f6ce8780..1c485edad72b11ac3778fb4538becfa23f8340c5 100644 --- a/app/views/learning_objects/show.html.erb +++ b/app/views/learning_objects/show.html.erb @@ -1,24 +1,24 @@ -<h1><%= @learning_object.title %></h1> +<h1><%= @learning_object.name %></h1> <ul> - <li><b>Autor: </b><%= @learning_object.metadata["dc_contributor_author"] %></li> - <li><b>Tipo: </b><%= @learning_object.metadata["dc_type"] %></li> - <li><b>Data: </b><%= @learning_object.metadata["dc_date_available"] %></li> - <li><b>Linguagem: </b><%= @learning_object.metadata["dc_language"] %></li> - <li><b>Categorias: </b></li> + <li><b>Autor: </b><%= @learning_object.get_metadata_value_of("dc.contributor.author") %></li> + <li><b>Tipo: </b><%= @learning_object.get_metadata_value_of("dc.type") %></li> + <li><b>Data: </b><%= @learning_object.get_metadata_value_of("dc.date.available") %></li> + <li><b>Linguagem: </b><%= @learning_object.get_metadata_value_of("dc.language") %></li> + <li><b>Metadados: </b></li> <ul> - <% @learning_object.metadata["dc_subject_category"].each do |category| %> - <li><%= category %></li> - <% end %> + <% @learning_object.metadata.each do |m| %> + <li><%= "#{m["key"]}: #{m["value"]}" %></li> + <% end %> </ul> </ul> -<%= button_to( - "Curtir", - { action: "create_like", controller: "edges" }, - method: :post, - params: { from_id: "#14:0", to_id: @learning_object.id } -)%> <br> -<p>Total Curtir: <%= get_object_property(@like_counts,"COUNT") %></p> -<p>Total Visualizações: <%= get_object_property(@view_counts,"COUNT") %></p> +<p>Total Curtir: <%= @learning_object.likes %></p> +<p>Total Visualizações: <%= @learning_object.views %></p> +<br> +<% if user_signed_in? %> + <%= link_to "Curtir", + like_learning_object_path(@learning_object.id_dspace), + method: :post, remote: true %> +<% end %> diff --git a/app/views/search/index.html.erb b/app/views/search/index.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..1fb3a77ae086e54ea955a51505fbc4be4ced1e29 --- /dev/null +++ b/app/views/search/index.html.erb @@ -0,0 +1,373 @@ +<script type="text/javascript"> + $(document).ready(function () { + $(".select-tag-container").select2(); + + var runDropdown = function (element) { + if ($(element).next().is(':hidden')) { + $('> .caret', element).addClass('caret-up'); + $(element).next().slideDown(); + } + else { + $('> .caret', element).removeClass('caret-up'); + $(element).next().slideUp(); + } + }; + + runDropdown($('#nestedAccordion .dropdown')); + + $('#nestedAccordion .dropdown').click(function () { + runDropdown(this); + }); + }); +</script> + +<div class="row"> + <div class="col-sm-4 search-sidebar"> + <!-- <h2>Busca Avançada</h2> --> + <!-- <div class="media"> + <div class="media-left"> + <span class="glyphicon glyphicon-list" style="font-size: 40px" aria-hidden="true" /> + </div> + <div class="media-body"> + <h4 class="media-heading">Filtros</h4> + Nenhum selecionado + </div> + </div> --> + + <div id="nestedAccordion"> + <h3 class="dropdown open">Matérias<span class="caret caret-align-right"/></h3> + + <div class="dropdown-element"> + <h4 class="dropdown">Matemática<span class="caret caret-align-right"/></h4> + + <div> + <select class="select-tag-container" multiple="multiple"> + <option value="">Todos</option> + <optgroup label="Básico"> + <option value="">Conjuntos</option> + <option value="">Soma</option> + </optgroup> + <optgroup label="Avançada"> + <option value="AL">Ãlgebra</option> + <option value="">...</option> + </optgroup> + </select> + </div> + <h4 class="dropdown">Biologia<span class="caret caret-align-right"/></h4> + + <div> + <select class="select-tag-container" multiple="multiple"> + <option value="">Todos</option> + <optgroup label="Básico"> + <option value="">Plantas</option> + <option value="">...</option> + </optgroup> + <optgroup label="Avançada"> + <option value="">...</option> + </optgroup> + </select> + </div> + <h4 class="dropdown">História<span class="caret caret-align-right"/></h4> + + <div> + <select class="select-tag-container" multiple="multiple"> + <option value="">Todos</option> + <optgroup label="Básico"> + <option value="">História do Brasil</option> + <option value="">...</option> + </optgroup> + <optgroup label="Avançada"> + <option value="">...</option> + </optgroup> + </select> + </div> + <h4 class="dropdown">LÃngua Portuguesa<span class="caret caret-align-right"/></h4> + + <div> + <select class="select-tag-container" multiple="multiple"> + <option value="">Todos</option> + <optgroup label="Básico"> + <option value="">...</option> + <option value="">...</option> + </optgroup> + <optgroup label="Avançada"> + <option value="">...</option> + </optgroup> + </select> + </div> + <h4 class="dropdown">Geografia<span class="caret caret-align-right"/></h4> + + <div> + <select class="select-tag-container" multiple="multiple"> + <option value="">Todos</option> + <optgroup label="Básico"> + <option value="">...</option> + <option value="">...</option> + </optgroup> + <optgroup label="Avançada"> + <option value="">...</option> + </optgroup> + </select> + </div> + <h4 class="dropdown">Ciências<span class="caret caret-align-right"/></h4> + + <div> + <select class="select-tag-container" multiple="multiple"> + <option value="">Todos</option> + <optgroup label="Básico"> + <option value="">...</option> + <option value="">...</option> + </optgroup> + <optgroup label="Avançada"> + <option value="">...</option> + </optgroup> + </select> + </div> + <h4 class="dropdown">Educação FÃsica<span class="caret caret-align-right"/></h4> + + <div> + <select class="select-tag-container" multiple="multiple"> + <option value="">Todos</option> + <optgroup label="Básico"> + <option value="">...</option> + <option value="">...</option> + </optgroup> + <optgroup label="Avançada"> + <option value="">...</option> + </optgroup> + </select> + </div> + <h4 class="dropdown">Inglês<span class="caret caret-align-right"/></h4> + + <div> + <select class="select-tag-container" multiple="multiple"> + <option value="">Todos</option> + <optgroup label="Básico"> + <option value="">...</option> + <option value="">...</option> + </optgroup> + <optgroup label="Avançada"> + <option value="">...</option> + </optgroup> + </select> + </div> + </div> + <!--fim materias --> + <h3 class="dropdown open">Conteúdo<span class="caret caret-align-right"/></h3><!--Tipo 1--> + <div class="dropdown-element"> + <table class="tipo1" style="width:100%"> + <tr> + <td><p>MÃdia</p></td> + <td></td> + </tr> + <tr> + <td><input type="checkbox"> Fotos</td> + <td><input type="checkbox"> Imagens</td> + </tr> + <tr> + <td><input type="checkbox"> Ãudio</td> + <td><input type="checkbox"> VÃdeos</td> + </tr> + <tr> + <td><input type="checkbox"> Apresentações MultimÃdia</td> + <td><input type="checkbox"> Apps</td> + </tr> + <tr> + <td></td> + <td></td> + </tr> + <tr> + <td><p>Textos</p></td> + <td></td> + </tr> + <tr> + <td><input type="checkbox"> Anais</td> + <td><input type="checkbox"> Artigos Web</td> + </tr> + <tr> + <td><input type="checkbox"> CapÃtulos de Livros</td> + <td><input type="checkbox"> Dissertações</td> + </tr> + <tr> + <td><input type="checkbox"> Livros</td> + <td><input type="checkbox"> Monografias</td> + </tr> + <tr> + <td><input type="checkbox"> Periódicos</td> + <td><input type="checkbox"> Revistas</td> + </tr> + <tr> + <td><input type="checkbox"> Teses</td> + </tr> + <tr> + <td></td> + <td></td> + </tr> + <tr> + <td><p>Outros</p></td> + <td></td> + </tr> + <tr> + <td><input type="checkbox"> Planos de Aula</td> + </tr> + </table> + </div> + <!-- <h3>Conteúdo - Tipo 2</h3> + <div> + <h4>MÃdia</h4> + <div> + <table> + <tr> + <td><input type="checkbox">Fotos</td> + <td><input type="checkbox">Imagens</td> + </tr> + <tr> + <td><input type="checkbox">VÃdeos</td> + <td><input type="checkbox">Ãudio</td> + </tr> + <tr> + <td><input type="checkbox">Apresentações MultimÃdia</td> + <td><input type="checkbox">Apps</td> + </tr> + </table> + </div> + <h4>Textos</h4> + <div> + <table> + <tr> + <td><input type="checkbox">Anais</td> + <td><input type="checkbox">Artigos Web</td> + </tr> + <tr> + <td><input type="checkbox">CapÃtulos de Livros</td> + <td><input type="checkbox">Dissertações</td> + </tr> + <tr> + <td><input type="checkbox">Livros</td> + <td><input type="checkbox">Monografias</td> + </tr> + <tr> + <td><input type="checkbox">Periódicos</td> + <td><input type="checkbox">Revistas</td> + </tr> + <tr> + <td><input type="checkbox">Teses</td> + <td></td> + </tr> + </table> + </div> + <h4>Outros</h4> + <div> + <input type="checkbox">Planos de Aula + </div> + </div> --> + <h3 class="dropdown">Ano escolar<span class="caret caret-align-right"/></h3> + + <div class="dropdown-element"> + <table style="width:100%"> + <tr> + <td><input type="checkbox">1º</td> + <td><input type="checkbox">5º</td> + </tr> + <tr> + <td><input type="checkbox">2º</td> + <td><input type="checkbox">6º</td> + </tr> + <tr> + <td><input type="checkbox">3º</td> + <td><input type="checkbox">7º</td> + </tr> + <tr> + <td><input type="checkbox">4º</td> + <td><input type="checkbox">8º</td> + </tr> + </table> + </div> + <h3 class="dropdown">Ano de Publicação<span class="caret caret-align-right"/></h3> + + <div class="dropdown-element"> + <input type="radio" name="ano" value="single" checked>Ano:<br/> + <input type="text" name="ano1" size="8"> + <br/> + <input type="radio" name="ano" value="range">Intervalo:<br/> + <input type="text" name="ano2" size="8"> - <input type="text" name="ano2" size="8"> + </div> + </div> + <!-- fim div id="nestedAccordion"--> + + <div id="nestedAccordion"> + <h3 class="dropdown">Pesquisa Avançada<span class="caret caret-align-right"/></h3> + + <form method="get"> + <div class="dropdown-element"> + <table style="width:100%"> + <tr> + <td>Todas estas palavras:</td> + <td><input type="text" name=""></td> + </tr> + <tr> + <td>A frase exata:</td> + <td><input type="text" name=""></td> + </tr> + <tr> + <td>Qualquer uma destas palavras:</td> + <td><input type="text" name=""></td> + </tr> + <tr> + <td>Nenhuma destas palavras:</td> + <td><input type="text" name=""></td> + </tr> + <tr> + <td></td> + <td align="right"><br> + <button type="submit" class="btn btn-default">Pesquisar</button> + </td> + </tr> + </table> + </div> + </form> + </div> + </div> + <!--/span col sm-4--> + + <!-- search results --> + <div class="col-sm-8"> + <% unless @results.empty? %> + <div> + Mostrando resultados <%= @start+1 %>-<%= if (@start+@npagnac) > @numFound then + @numFound + else + (@npagnac+@start) + end %> de <%= @numFound %> + <form method="get"> + <input type="hidden" name="qry" value="<%= params["qry"] %>"> + + <select name="paginacao" onchange='this.form.submit()'> + <option value="<%= @npagnac %>">Resultados por Página</option> + <option value="10">10</option> + <option value="25">25</option> + <option value="50">50</option> + </select> + + <select name="sort" onchange='this.form.submit()'> + <option value=<%= @ordena %>>Ordenar por</option> + <option value="author">Autores</option> + <option value="publicationasc">Mais novos</option> + <option value="publicationdesc">Mais velhos</option> + <option value="relevance">Relevância</option> + <option value="type">Tipo</option> + <option value="title">TÃtulo</option> + </select> + </form> + <br/> + </div> + <br/> + + <div class="container-fluid"> + <%= render @results %> + <%= will_paginate @results %> + </div> + <% end %> + </div> + <!-- col-sm-8 --> +</div><!-- /container --> \ No newline at end of file diff --git a/app/views/search/solr/search.html.erb b/app/views/search/solr/search.html.erb deleted file mode 100644 index a86ff749c43ce3ecb9aad1c2dc7ec55a769a3651..0000000000000000000000000000000000000000 --- a/app/views/search/solr/search.html.erb +++ /dev/null @@ -1,354 +0,0 @@ -<script type="text/javascript"> - $(document).ready(function() { - var parentDivs = $('#nestedAccordion div'), - childDivs = $('#nestedAccordion h3').siblings('div'); - - $('#nestedAccordion h2').click(function(){ - // parentDivs.slideUp(); - if($(this).next().is(':hidden')){ - $(this).next().slideDown(); - }else{ - $(this).next().slideUp(); - } - }); - $('#nestedAccordion h3').click(function(){ - // childDivs.slideUp(); - if($(this).next().is(':hidden')){ - $(this).next().slideDown(); - }else{ - $(this).next().slideUp(); - } - }); - }); -</script> - -<div class="container-fluid"> - <div class="col-sm-4"> - <div class="well sidebar-nav"> - <h2> Busca Avançada</h2> - - <div id="nestedAccordion"> - <h2>Seleção Atual</h2> - <div> - <input type="checkbox"> - </div> - <h2>Matérias</h2> - <div class='aberto'> - <h3>Matemática</h3> - <div> - <select class="js-example-basic-multiple" multiple="multiple"> - <option value="">Todos</option> - <optgroup label="Básico"> - <option value="">Conjuntos</option> - <option value="">Soma</option> - </optgroup> - <optgroup label="Avançada"> - <option value="AL">Ãlgebra</option> - <option value="">...</option> - </optgroup> - </select> - </div> - <h3>Biologia</h3> - <div> - <select class="js-example-basic-multiple" multiple="multiple"> - <option value="">Todos</option> - <optgroup label="Básico"> - <option value="">Plantas</option> - <option value="">...</option> - </optgroup> - <optgroup label="Avançada"> - <option value="">...</option> - </optgroup> - </select> - </div> - <h3>História</h3> - <div> - <select class="js-example-basic-multiple" multiple="multiple"> - <option value="">Todos</option> - <optgroup label="Básico"> - <option value="">História do Brasil</option> - <option value="">...</option> - </optgroup> - <optgroup label="Avançada"> - <option value="">...</option> - </optgroup> - </select> - </div> - <h3>LÃngua Portuguesa</h3> - <div> - <select class="js-example-basic-multiple" multiple="multiple"> - <option value="">Todos</option> - <optgroup label="Básico"> - <option value="">...</option> - <option value="">...</option> - </optgroup> - <optgroup label="Avançada"> - <option value="">...</option> - </optgroup> - </select> - </div> - <h3>Geografia</h3> - <div> - <select class="js-example-basic-multiple" multiple="multiple"> - <option value="">Todos</option> - <optgroup label="Básico"> - <option value="">...</option> - <option value="">...</option> - </optgroup> - <optgroup label="Avançada"> - <option value="">...</option> - </optgroup> - </select> - </div> - <h3>Ciências</h3> - <div> - <select class="js-example-basic-multiple" multiple="multiple"> - <option value="">Todos</option> - <optgroup label="Básico"> - <option value="">...</option> - <option value="">...</option> - </optgroup> - <optgroup label="Avançada"> - <option value="">...</option> - </optgroup> - </select> - </div> - <h3>Educação FÃsica</h3> - <div> - <select class="js-example-basic-multiple" multiple="multiple"> - <option value="">Todos</option> - <optgroup label="Básico"> - <option value="">...</option> - <option value="">...</option> - </optgroup> - <optgroup label="Avançada"> - <option value="">...</option> - </optgroup> - </select> - </div> - <h3>Inglês</h3> - <div> - <select class="js-example-basic-multiple" multiple="multiple"> - <option value="">Todos</option> - <optgroup label="Básico"> - <option value="">...</option> - <option value="">...</option> - </optgroup> - <optgroup label="Avançada"> - <option value="">...</option> - </optgroup> - </select> - </div> - </div><!--fim materias --> - <h2>Conteúdo</h2><!--Tipo 1--> - <div class='aberto'> - <table class="tipo1" style="width:100%"> - <tr> - <td><p>MÃdia</p> </td> - <td></td> - </tr> - <tr> - <td><input type="checkbox"> Fotos</td> - <td><input type="checkbox"> Imagens</td> - </tr> - <tr> - <td><input type="checkbox"> Ãudio</td> - <td><input type="checkbox"> VÃdeos</td> - </tr> - <tr> - <td><input type="checkbox"> Apresentações MultimÃdia</td> - <td><input type="checkbox"> Apps</td> - </tr> - <tr> - <td></td> - <td></td> - </tr> - <tr> - <td><p>Textos</p></td> - <td></td> - </tr> - <tr> - <td><input type="checkbox"> Anais</td> - <td><input type="checkbox"> Artigos Web</td> - </tr> - <tr> - <td><input type="checkbox"> CapÃtulos de Livros</td> - <td><input type="checkbox"> Dissertações</td> - </tr> - <tr> - <td><input type="checkbox"> Livros</td> - <td><input type="checkbox"> Monografias</td> - </tr> - <tr> - <td><input type="checkbox"> Periódicos</td> - <td><input type="checkbox"> Revistas</td> - </tr> - <tr> - <td><input type="checkbox"> Teses</td> - </tr> - <tr> - <td></td> - <td></td> - </tr> - <tr> - <td><p>Outros</p></td> - <td></td> - </tr> - <tr> - <td><input type="checkbox"> Planos de Aula</td> - </tr> - </table> - </div> - <!-- <h2>Conteúdo - Tipo 2</h2> - <div> - <h3>MÃdia</h3> - <div> - <table> - <tr> - <td><input type="checkbox">Fotos</td> - <td><input type="checkbox">Imagens</td> - </tr> - <tr> - <td><input type="checkbox">VÃdeos</td> - <td><input type="checkbox">Ãudio</td> - </tr> - <tr> - <td><input type="checkbox">Apresentações MultimÃdia</td> - <td><input type="checkbox">Apps</td> - </tr> - </table> - </div> - <h3>Textos</h3> - <div> - <table> - <tr> - <td><input type="checkbox">Anais</td> - <td><input type="checkbox">Artigos Web</td> - </tr> - <tr> - <td><input type="checkbox">CapÃtulos de Livros</td> - <td><input type="checkbox">Dissertações</td> - </tr> - <tr> - <td><input type="checkbox">Livros</td> - <td><input type="checkbox">Monografias</td> - </tr> - <tr> - <td><input type="checkbox">Periódicos</td> - <td><input type="checkbox">Revistas</td> - </tr> - <tr> - <td><input type="checkbox">Teses</td> - <td></td> - </tr> - </table> - </div> - <h3>Outros</h3> - <div> - <input type="checkbox">Planos de Aula - </div> - </div> --> - <h2>Ano escolar</h2> - <div> - <table style="width:100%"> - <tr> - <td><input type="checkbox">1º</td> - <td><input type="checkbox">5º</td> - </tr> - <tr> - <td><input type="checkbox">2º</td> - <td><input type="checkbox">6º</td> - </tr> - <tr> - <td><input type="checkbox">3º</td> - <td><input type="checkbox">7º</td> - </tr> - <tr> - <td><input type="checkbox">4º</td> - <td><input type="checkbox">8º</td> - </tr> - </table> - </div> - <h2>Ano de Publicação</h2> - <div> - <input type="radio" name="ano" value="single" checked>Ano:<br/> - <input type="text" name="ano1" size="8"> - <br/> - <input type="radio" name="ano" value="range">Intervalo:<br/> - <input type="text" name="ano2" size="8"> - <input type="text" name="ano2" size="8"> - </div> - </div><!-- fim div id="nestedAccordion"--> - - <div id="nestedAccordion"> - <h2>Pesquisa Avançada</h2> - <form method="get"> - <div> - <table style="width:100%"> - <tr> - <td>Todas estas palavras:</td> - <td><input type="text" name=""></td> - </tr> - <tr> - <td>A frase exata:</td> - <td><input type="text" name=""></td> - </tr> - <tr> - <td>Qualquer uma destas palavras:</td> - <td><input type="text" name=""></td> - </tr> - <tr> - <td>Nenhuma destas palavras:</td> - <td><input type="text" name=""></td> - </tr> - <tr> - <td></td> - <td align="right"><br><button type="submit" class="btn btn-default">Pesquisar</button></td> - </tr> - </table> - </div> - </form> - </div> - - </div><!--/.well --> - </div><!--/span col sm-4--> - <div class="col-sm-8"> - - <% unless @objectsFound.empty? %> - <h3>Objetos encontrados: <%= @numFound %></h3> - <nav class="navbar navbar-default"> - <div class="container-fluid" > - Mostrando resultados <%= @start+1 %>-<%= if (@start+@npagnac) > @numFound then @numFound else (@npagnac+@start) end %> de <%= @numFound %> - <form method="get"> - <input type="hidden" name="qry" value="<%=params["qry"]%>"> - - <select name="paginacao" onchange='this.form.submit()'> - <option value="<%=@npagnac%>">Resultados por Página</option> - <option value="10">10</option> - <option value="25">25</option> - <option value="50">50</option> - </select> - - <select name="sort" onchange='this.form.submit()'> - <option value=<%=@ordena%>>Ordenar por</option> - <option value="author">Autores</option> - <option value="publicationasc">Mais novos</option> - <option value="publicationdesc">Mais velhos</option> - <option value="relevance">Relevância</option> - <option value="type">Tipo</option> - <option value="title">TÃtulo</option> - </select> - </form> - </div> - </nav> - <br /> - <div class="container-fluid"> - <%= will_paginate @objectsFound %><!--%=@objectsFound%--> - <% @objectsFound.each do |o| %> - <%= render partial: "shared/application/object_tag1", locals: {obj: o} %> - <% end %> - <%= will_paginate @objectsFound %> - </div> - <% end %> - - </div><!-- col-sm-8 --> -</div><!-- /container --> \ No newline at end of file diff --git a/app/views/shared/application/_footer.html.erb b/app/views/shared/application/_footer.html.erb index d2d8dca54b82afcc988bfa28cba00b67d0d80d48..501da61e0045b32ecdb55e00b6479a41309452be 100644 --- a/app/views/shared/application/_footer.html.erb +++ b/app/views/shared/application/_footer.html.erb @@ -1,4 +1,4 @@ -<footer id="footer"> +<footer> <div class="main"> <div class="container"> <div class="col-md-3"> @@ -32,40 +32,3 @@ </div> </div> </footer> - -<script> - var substringMatcher = function (strs) { - return function findMatches(q, cb) { - var matches, substringRegex; - matches = []; - substrRegex = new RegExp(q, 'i'); - $.each(strs, function (i, str) { - if (substrRegex.test(str)) { - matches.push(str); - } - }); - cb(matches); - }; - }; - - var states = ['Alabama', 'Alaska', 'Arizona', 'Arkansas', 'California', - 'Colorado', 'Connecticut', 'Delaware', 'Florida', 'Georgia', 'Hawaii', - 'Idaho', 'Illinois', 'Indiana', 'Iowa', 'Kansas', 'Kentucky', 'Louisiana', - 'Maine', 'Maryland', 'Massachusetts', 'Michigan', 'Minnesota', - 'Mississippi', 'Missouri', 'Montana', 'Nebraska', 'Nevada', 'New Hampshire', - 'New Jersey', 'New Mexico', 'New York', 'North Carolina', 'North Dakota', - 'Ohio', 'Oklahoma', 'Oregon', 'Pennsylvania', 'Rhode Island', - 'South Carolina', 'South Dakota', 'Tennessee', 'Texas', 'Utah', 'Vermont', - 'Virginia', 'Washington', 'West Virginia', 'Wisconsin', 'Wyoming' - ]; - - $('#typeahead #input').typeahead({ - hint: true, - highlight: true, - minLength: 1 - }, { - name: 'states', - source: substringMatcher(states), - templates: {} - }); -</script> \ No newline at end of file diff --git a/app/views/shared/application/_header.html.erb b/app/views/shared/application/_header.html.erb index e1389a9f3d4f9619bbc9990efbdc653a18e2ae81..81a44137b95d79115859210d4afa93c880e1f3f3 100644 --- a/app/views/shared/application/_header.html.erb +++ b/app/views/shared/application/_header.html.erb @@ -1,96 +1,112 @@ <header> - <div id="barra-brasil" style="background:#7F7F7F; height: 20px; padding:0 0 0 10px;display:block;"> - <ul id="menu-barra-temp" style="list-style:none;"> - <li style="display:inline; float:left;padding-right:10px; margin-right:10px; border-right:1px solid #EDEDED"> - <a href="http://brasil.gov.br" style="font-family:sans,sans-serif; text-decoration:none; color:white;">Portal do - Governo Brasileiro</a></li> - <li> - <a style="font-family:sans,sans-serif; text-decoration:none; color:white;" href="http://epwg.governoeletronico.gov.br/barra/atualize.html">Atualize - sua Barra de Governo</a></li> - </ul> + <div class="barra-brasil"> + <div class="container"> + <div id="barra-brasil"> + <ul id="menu-barra-temp" style="list-style:none;"> + <li style="display:inline; float:left;padding-right:10px; margin-right:10px; border-right:1px solid #EDEDED"><a href="http://brasil.gov.br" style="font-family:sans,sans-serif; text-decoration:none; color:white;">Portal do Governo Brasileiro</a></li> + <li><a style="font-family:sans,sans-serif; text-decoration:none; color:white;" href="http://epwg.governoeletronico.gov.br/barra/atualize.html">Atualize sua Barra de Governo</a></li> + </ul> + </div> + </div> </div> - <div class="searchbar"> + + <div class="search-bar"> <div class="container"> <div class="row"> - <h1 class="col-xs-3"> + <div class="col-md-3 logo-text"> <%= link_to root_path do %> - Conteúdo<br>Educacional + CONTEÚDO<br>EDUCACIONAL <% end %> - </h1> + </div> - <h2 class="col-xs-4 col-xs-offset-5"> - <%= image_tag 'fonte_mais.png', onclick: 'resizeText(1)', height: '30px' %> - <%= image_tag 'fonte_inicial.png', onclick: 'resizeText(0)', height: '30px' %> - <%= image_tag 'fonte_menos.png', onclick: 'resizeText(-1)', height: '30px' %> - <%= image_tag 'contraste.png', onclick: 'changeContrast()', height: '30px' %> + <div class="col-md-6"> + <div class="search-accessibility"> + <%= image_tag 'fonte_mais.png', onclick: 'resizeText(1)' %> + <%= image_tag 'fonte_inicial.png', onclick: 'resizeText(0)' %> + <%= image_tag 'fonte_menos.png', onclick: 'resizeText(-1)' %> + <%= image_tag 'contraste.png', onclick: 'changeContrast()' %> + </div> + <div class="search-input"> + <form action="/search" method="get"> + <div class="input-group" id="search"> + <input type="text" placeholder="buscar" class="form-control" name="qry"> + <div class="input-group-btn"> + <button class="btn btn-default" type="submit"><i class="glyphicon glyphicon-search"></i></button> + </div> + </div> + </form> + <%= link_to 'busca avançada', search_path, class: 'search-label' %> + </div> + </div> + <div class="col-md-3 status-text"> <% if user_signed_in? %> - <%= link_to current_user.name, edit_user_registration_path %> - | - <%= link_to 'Sair', destroy_user_session_path, :method=>'delete' %> + <div class="media"> + <div class="media-body"> + <h4 class="media-heading"><%= link_to current_user.name.split(" ").first, edit_user_registration_path %></h4> + <%= link_to 'sair', destroy_user_session_path, method: 'delete', class: "quit-link" %> + </div> + <div class="media-right"> + <a href="#"> + <img class="circular-image" src="<%= current_user.avatar.url(:thumb) %>" alt="Foto do usuário"/> + </a> + </div> + </div> <% else %> - <%= link_to 'Entrar', new_user_session_path %> - | - <%= link_to 'Cadastro', new_user_registration_path %> - <% end %> - </h2> - </div> - <div class="row"> - <div class="col-md-8 col-md-offset-2"> - - <form action="/search" method="get"> - <div class="input-group"> - <input type="text" class="form-control" name="qry"> - <div class="input-group-btn"> - <button class="btn btn-default" type="submit"><i class="glyphicon glyphicon-search"></i></button> + <div class="media"> + <div class="media-body"> + <h4 class="media-heading"><%= link_to 'entre', new_user_session_path %></h4> + ou <%= link_to 'cadastre-se', new_user_registration_path, class: "register-link" %> </div> </div> - </form> - <%= link_to 'Busca avançada', '#', class: 'pull-right' %> + <% end %> </div> </div> </div> </div> - -<div class="container"> - <div class="row"> - <ul class="nav navbar-nav"> - <li><%= link_to 'Principal' %></li> - <li><%= link_to 'Assunto' %></li> - <li class="dropdown"> - <a class="dropdown-toggle" data-toggle="dropdown" href="javascript:void(0);">NÃveis<span class="caret"></span></a> - <ul class="dropdown-menu"> - <li> - <div class="row" style="width: 400px;"> - <ul class="list-unstyled col-md-5 col-md-offset-1"> - <li><b>Ensino Básico</b></li> - <li role="separator" class="divider"></li> - <li><a href="">1º Ano</a></li> - <li><a href="">2º Ano</a></li> - <li><a href="">3º Ano</a></li> - <li><a href="">4º Ano</a></li> - <li><a href="">5º Ano</a></li> - <li><a href="">6º Ano</a></li> - <li><a href="">7º Ano</a></li> - <li><a href="">8º Ano</a></li> - <li><a href="">9º Ano</a></li> - </ul> - <ul class="list-unstyled col-md-5"> - <li><b>Ensino Médio</b></li> - <li role="separator" class="divider"></li> - <li><a href="">1º Ano</a></li> - <li><a href="">2º Ano</a></li> - <li><a href="">3º Ano</a></li> - </ul> - </div> + <nav class="navigation" id="menu-bar"> + <div class="container"> + <div class="row"> + <ul class="nav navbar-nav"> + <li class="nav-button nav-button-first"><%= link_to 'Assuntos' %></li> + <li role="separator" class="divider"></li> + <li class="dropdown nav-button"> + <a class="dropdown-toggle" data-toggle="dropdown" href="javascript:void(0);">NÃveis de Ensino <span class="caret" /></a> + <ul class="dropdown-menu"> + <li> + <div class="row" style="width: 400px;"> + <ul class="list-unstyled col-md-6 col-md-offset-1"> + <li><b>Ensino Fundamental</b></li> + <li role="separator" class="divider"></li> + <li><a href="">1º Ano</a></li> + <li><a href="">2º Ano</a></li> + <li><a href="">3º Ano</a></li> + <li><a href="">4º Ano</a></li> + <li><a href="">5º Ano</a></li> + <li><a href="">6º Ano</a></li> + <li><a href="">7º Ano</a></li> + <li><a href="">8º Ano</a></li> + <li><a href="">9º Ano</a></li> + </ul> + <ul class="list-unstyled col-md-5"> + <li><b>Ensino Médio</b></li> + <li role="separator" class="divider"></li> + <li><a href="">1º Ano</a></li> + <li><a href="">2º Ano</a></li> + <li><a href="">3º Ano</a></li> + </ul> + </div> + </li> + </ul> </li> + <li role="separator" class="divider"></li> + <li class="nav-button"><%= link_to 'FAQ', faq_path %></li> + <li role="separator" class="divider"></li> + <li class="nav-button"><%= link_to 'Contato', contact_path %></li> + <li role="separator" class="divider"></li> </ul> - </li> - <li><%= link_to 'Formato' %></li> - <li><%= link_to 'FAQ', faq_path %></li> - <li><%= link_to 'Contato', contact_path %></li> - </ul> - </div> -</div> + </div> + </div> + </nav> </header> diff --git a/app/views/shared/application/_object_tag1.html.erb b/app/views/shared/application/_object_single.html.erb similarity index 92% rename from app/views/shared/application/_object_tag1.html.erb rename to app/views/shared/application/_object_single.html.erb index b4682be790666c94381f7a4b85b49b88330bcc7b..27de179726caf4aa86256bd361cadf7f76e49fc9 100644 --- a/app/views/shared/application/_object_tag1.html.erb +++ b/app/views/shared/application/_object_single.html.erb @@ -18,7 +18,7 @@ <% end %> </div> <div class="col-sm-12"> - <div align="right"><a href="objeto.php" class="btn btn-primary">Ver mais...</a></div> + <div align="right"><%= link_to "Ver mais...", learning_object_path(obj["search.resourceid"]), :class => "btn btn-primary" %></div> <br/> <table class="table "> <tr> diff --git a/app/views/shared/application/_object_tag.html.erb b/app/views/shared/application/_object_tag.html.erb index 21783cf9ad5c5ba839cef297ea25995b660233ee..c117569976df7ec75f87225f39877e2f6252d65c 100644 --- a/app/views/shared/application/_object_tag.html.erb +++ b/app/views/shared/application/_object_tag.html.erb @@ -1,23 +1,44 @@ -<div class="col-md-12"> - <div class="itemhorz"> - <div class="col-md-5"> - <%= link_to image_tag("logo.png", :class => "img-responsive"), :class => "thumbnail" %> +<!--<%=debug obj%>--> + +<div class="row"> + <div class="col-sm-3"> + <a href="app/assets/images/logo.png" class="thumbnail"> + <p><%= obj.name %></p> + <!-- <%= link_to image_tag("logo.png", :class => "img-responsive"), :class => "thumbnail" %><img src="app/assets/images/logo.png" alt="" width="284" height="213">--> + <%= image_tag("logo.png") %> + </a> + </div> + <div class="col-sm-9"> + <div class="col-sm-12"> + <%= obj.description %> + </div> + <div class="col-sm-12"> + <div align="right"><%= link_to "Ver mais...", learning_object_path(obj.id_dspace), :class => "btn btn-primary" %></div> + <br/> + <table class="table "> + <tr> + <td class="stars">Avaliações:</td><td>Postado por:</td><td class="visualis">Visualizações:</td> + </tr> + <tr> + <td> + <span class="starRating"> + <input id="rating5" type="radio" name="rating" value="5" disabled> + <label for="rating5">5</label> + <input id="rating4" type="radio" name="rating" value="4" checked disabled> + <label for="rating4">4</label> + <input id="rating3" type="radio" name="rating" value="3" disabled> + <label for="rating3">3</label> + <input id="rating2" type="radio" name="rating" value="2" disabled> + <label for="rating2">2</label> + <input id="rating1" type="radio" name="rating" value="1" disabled> + <label for="rating1">1</label> + </span> + () + </td> + <td><%= link_to "<<Autor>>" %> Há ... anos</td> + <td><%= obj.views %></td> + </tr> + </table> + </div> + </div> </div> - <div class="col-md-7"> - <h1><%= link_to obj["title"][0], learning_object_path(obj["search.resourceid"]) %></h1> - <%= image_tag object_thumbnail(obj["handle"]), :class => "img-circle", :width => "32" %> por <%= link_to obj["author"][0] %> -<% -=begin -%> - <p class="pull-right"><span class="glyphicon glyphicon-search" aria-hidden="true"></span>4,5 - <span class="glyphicon glyphicon-star" aria-hidden="true"></span>200 - </p> -<% -=end -%> - <% unless obj["dc.description"].nil? %> - <p><%= obj["dc.description"][0] %></p> - <% end %> - </div> - </div> -</div> diff --git a/app/views/shared/application/_object_vertical.html.erb b/app/views/shared/application/_object_vertical.html.erb new file mode 100644 index 0000000000000000000000000000000000000000..8a4b66c025827a3d651e3e28869f32d58b3341b7 --- /dev/null +++ b/app/views/shared/application/_object_vertical.html.erb @@ -0,0 +1,17 @@ +<div class="object-vertical"> + <div class="panel"> + <div> + <img src="http://dummyimage.com/250x150/363336/fff" alt='dummy image' class="img-responsive"> + </div> + <div class="panel-body"> + <% if object.name.nil? %> + <h4 class="media-heading">Sem TÃtulo</h4> + <% else %> + <h4 class="media-heading"><%= object.name %></h4> + <% end %> + <span class="glyphicon glyphicon-eye-open">200 </span> + <span class="glyphicon glyphicon-star">4,5 </span> + <span>Por <a>Usuário </a></span> + </div> + </div> +</div> diff --git a/app/views/welcome/complaint.html.erb b/app/views/welcome/complaint.html.erb deleted file mode 100644 index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0000000000000000000000000000000000000000 diff --git a/app/views/welcome/index.html.erb b/app/views/welcome/index.html.erb index 287dfa9f657ce4ff0541cc4add6ce32fd3fa0bc2..7275f6c893bc8910c135648718c276c2d379aeef 100644 --- a/app/views/welcome/index.html.erb +++ b/app/views/welcome/index.html.erb @@ -1,109 +1,83 @@ -<div class="main container-fluid"> - <div class="row"> - <div class="col-sm-offset-1 col-md-7"> - <div class="row"> - <% if @Carousel.present? %> - <div id="myCarousel" class="carousel slide" data-ride="carousel"> - <!-- Indicators --> - <ol class="carousel-indicators"> - <% i = 0 %> - <% @Carousel.each do |highlight| %> - <% if highlight == @Carousel.first %> - <li data-target="#myCarousel" data-slide-to="<%= i %>" class="active"></li> - <% else %> - <li data-target="#myCarousel" data-slide-to="<%= i %>"></li> - <% end %> - <% i+= 1 %> +<div class="row"> + <div class="col-md-7"> + <div class="row"> + <% if @Carousel.present? %> + <div id="myCarousel" class="carousel slide" data-ride="carousel"> + <!-- Indicators --> + <ol class="carousel-indicators"> + <% i = 0 %> + <% @Carousel.each do |highlight| %> + <% if highlight == @Carousel.first %> + <li data-target="#myCarousel" data-slide-to="<%= i %>" class="active"></li> + <% else %> + <li data-target="#myCarousel" data-slide-to="<%= i %>"></li> <% end %> - </ol> - <div class="carousel-inner" role="listbox"> - <% @Carousel.each do |highlight|%> - <% if highlight == @Carousel.first %> - <% highlight_class="item active" %> - <% else %> - <% highlight_class="item" %> - <% end %> - <div class="<%= highlight_class %>"> - <%= image_tag 'mecshow_logo.jpg'%> - <div class="container"> - <div class="carousel-caption"> - <h1><%= highlight['title'] %></h1> - <p id="carrousel-new-description"><%= highlight['description'] %> </p> - <p><a class="btn btn-lg btn-primary" href=<%= highlight['URL'] %> role="button">Mais informações</a></p> - </div> - </div> - </div> + <% i+= 1 %> + <% end %> + </ol> + <div class="carousel-inner" role="listbox"> + <% @Carousel.each do |highlight|%> + <% if highlight == @Carousel.first %> + <% highlight_class="item active" %> + <% else %> + <% highlight_class="item" %> <% end %> - <a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev"> - <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span> - <span class="sr-only">Previous</span> - </a> - <a class="right carousel-control" href="#myCarousel" role="button" data-slide="next"> - <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span> - <span class="sr-only">Next</span> - </a> - </div> - </div> - <% end %> - </div> - <div class="row"> - <% if @General.present? %> - <ul class="list-unstyled"> - <h2>Destaques</h2> - <% @General.each do |highlight| %> - <li class="col-sm-12 general_highlights"> - <div class="media"> - <div class="media-left media-middle"> - <a href="#"> - <img src="http://dummyimage.com/250x150/363336/fff" alt='dummy image'> - </a> - </div> - <div class="media-body"> - <h4 class="media-heading"><%= highlight['name'] %></h4> - <span>Por <a>Usuário </a></span> - <span class="glyphicon glyphicon-eye-open"><%= highlight['views'] %>  </span> - <span class="glyphicon glyphicon-star"><%= highlight['likes'] %> </span><br> - <b>Descrição:</b> Descrição do objeto em destaque.Descrição do objeto em destaque.Descrição do objeto em destaque.Descrição do objeto em destaque.Descrição do objeto em destaque.<br> - Em<b> Biologia</b>, <b>Biologia Marinha</b> + <div class="<%= highlight_class %>"> + <%= image_tag 'mecshow_logo.jpg'%> + <div class="container"> + <div class="carousel-caption"> + <h1><%= highlight['title'] %></h1> + <p id="carrousel-new-description"><%= highlight['description'] %> </p> + <p><a class="btn btn-lg btn-primary" href=<%= highlight['URL'] %> role="button">Mais informações</a></p> </div> </div> - </li> + </div> <% end %> - <% end %> - </ul> - </div> + <a class="left carousel-control" href="#myCarousel" role="button" data-slide="prev"> + <span class="glyphicon glyphicon-chevron-left" aria-hidden="true"></span> + <span class="sr-only">Previous</span> + </a> + <a class="right carousel-control" href="#myCarousel" role="button" data-slide="next"> + <span class="glyphicon glyphicon-chevron-right" aria-hidden="true"></span> + <span class="sr-only">Next</span> + </a> + </div> + </div> + <% end %> </div> - <div class="col-md-3 hidden-xs hidden-sm"> - <img src="http://dummyimage.com/350x500/363336/fff" alt='dummy image'> + <div class="row"> + <% if @General.present? %> + <ul class="list-unstyled"> + <h2>Destaques</h2> + <% @General.each do |object| %> + <%= render 'shared/application/object_horizontal', object: object %> + <% end %> + <% end %> + </ul> </div> </div> + <div class="col-md-3 col-md-offset-1 hidden-xs hidden-sm"> + <img src="http://dummyimage.com/350x500/363336/fff" style="margin-top: 30px;" alt='dummy image'> + </div> +</div> - <div class="row"> - <div class="col-md-11 col-sm-offset-1 padding-left-0"> - <h2>Em Destaque</h2> - <ul class="list-unstyled"> - <% 8.times do %> - <li class="col-sm-3 padding-left-0"> - <div class="media"> - <h4>Matemática</h4> - <div> - <a href="#"> - <img src="http://dummyimage.com/250x150/363336/fff" alt='dummy image' class="img-responsive"> - </a> - </div> - <div class="media-body"> - <h4 class="media-heading">Nome</h4> - <span>Por <a>Usuário </a></span> - <span class="glyphicon glyphicon-eye-open">200  </span> - <span class="glyphicon glyphicon-star">4,5 </span> - <p align='center'> - <a>Ver Mais</a> - </p> - </div> - </div> - </li> - <% end %> - </ul> - </div> +<div class="row"> + <div class="col-md-12"> + <% unless @Subjects.nil? || @Subjects.empty?%> + <div class="row"> + <h2>Em Destaque</h2> + <% @Subjects.each do |subject|%> + <div class="col-sm-4"> + <div class="row"> + <h4><b><%= subject["name"] %></b></h4> + <%= render 'shared/application/object_vertical', object: subject["first_highlight"] %> + <p> + <a href="#">Ver Mais</a> + </p> + </div> + </div> + <% end %> + </div> + <% end %> </div> </div> diff --git a/config/env_vars.sh b/config/env_vars.sh new file mode 100644 index 0000000000000000000000000000000000000000..c1e77805c3138977de2e866cfca05bb7e6c45294 --- /dev/null +++ b/config/env_vars.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +export SECRET_TOKEN=$(rake secret) +export SECRET_KEY_BASE=$(rake secret) + +### Postgres/Active Record credentials +export PORTALMEC_DB_NAME=portalmec +export PORTALMEC_DB_USERNAME= +export PORTALMEC_DB_PASSWORD= + +### OrientDB credentials +export PORTALMEC_ORIENTDB_HOST=localhost +export PORTALMEC_ORIENTDB_DATABASE=portalmec +export PORTALMEC_ORIENTDB_USERNAME= +export PORTALMEC_ORIENTDB_PASSWD= +export PORTALMEC_ORIENTDB_PORT=2480 + +### Dspace credentials +export PORTALMEC_DSPACE_SOLR= +export PORTALMEC_DSPACE_REST= +export PORTALMEC_DSPACE_PORT= +export PORTALMEC_DSPACE_HOST= + +### Rails environment +export RAILS_SERVE_STATIC_FILES=FALSE +export RAILS_ENV=production diff --git a/config/environments/development.rb b/config/environments/development.rb index 5fafdd184b3f3b5e96ff55a3a0fabc29f87942b3..eb3772c3a0867beabd00a672cf5c425b64731fa7 100644 --- a/config/environments/development.rb +++ b/config/environments/development.rb @@ -1,6 +1,18 @@ Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. + ## Bullet gem config + config.after_initialize do + Bullet.enable = true + Bullet.alert = true + Bullet.bullet_logger = true + Bullet.console = true + Bullet.rails_logger = true + Bullet.add_footer = true + #Bullet.stacktrace_includes = [ 'your_gem', 'your_middleware' ] + #Bullet.slack = { webhook_url: 'http://some.slack.url', foo: 'bar' } + end + # In the development environment your application's code is reloaded on # every request. This slows down response time but is perfect for development # since you don't have to restart the web server when you make code changes. diff --git a/config/initializers/repositories/repositories.rb b/config/initializers/repositories/repositories.rb index 9687a7da02c96402528cdf8e9ab3a75c550d1eda..bc014e7c0215152ef0799b463f60a7531a847f6c 100644 --- a/config/initializers/repositories/repositories.rb +++ b/config/initializers/repositories/repositories.rb @@ -24,28 +24,29 @@ Repository::Environments.create :development do |repository| repository.register :mainPage, OrientDb::MainPageRepository.new(OrientDb::Client.instance) repository.register :webLink, OrientDb::WeblinkRepository.new(OrientDb::Client.instance) repository.register :user, UserRepositoryProxy.new(OrientDb::UserRepository.new(OrientDb::Client.instance)) - repository.register :carousel, OrientDb::CarouselRepository.new(OrientDb::Client.instance) + repository.register :subject, OrientDb::SubjectRepository.new(OrientDb::Client.instance) repository.register :institution, OrientDb::InstitutionRepository.new(OrientDb::Client.instance) repository.register :subject, OrientDb::SubjectRepository.new(OrientDb::Client.instance) repository.register :attribute, OrientDb::AttributeRepository.new(OrientDb::Client.instance) + repository.register :collection, OrientDb::CollectionRepository.new(OrientDb::Client.instance) end Repository::Environments.create :test do |repository| repository.register :learning_object, OrientDb::LearningObjectRepository.new(OrientDb::Client.instance) repository.register :mainPage, OrientDb::MainPageRepository.new(OrientDb::Client.instance) repository.register :webLink, OrientDb::WeblinkRepository.new(OrientDb::Client.instance) - repository.register :carousel, OrientDb::CarouselRepository.new(OrientDb::Client.instance) repository.register :user, UserRepositoryProxy.new(OrientDb::UserRepository.new(OrientDb::Client.instance)) repository.register :subject, OrientDb::SubjectRepository.new(OrientDb::Client.instance) repository.register :attribute, OrientDb::AttributeRepository.new(OrientDb::Client.instance) + repository.register :collection, OrientDb::CollectionRepository.new(OrientDb::Client.instance) end Repository::Environments.create :production do |repository| repository.register :learning_object, OrientDb::LearningObjectRepository.new(OrientDb::Client.instance) repository.register :mainPage, OrientDb::MainPageRepository.new(OrientDb::Client.instance) repository.register :webLink, OrientDb::WeblinkRepository.new(OrientDb::Client.instance) - repository.register :carousel, OrientDb::CarouselRepository.new(OrientDb::Client.instance) repository.register :user, UserRepositoryProxy.new(OrientDb::UserRepository.new(OrientDb::Client.instance)) repository.register :subject, OrientDb::SubjectRepository.new(OrientDb::Client.instance) repository.register :attribute, OrientDb::AttributeRepository.new(OrientDb::Client.instance) + repository.register :collection, OrientDb::CollectionRepository.new(OrientDb::Client.instance) end diff --git a/config/initializers/task_scheduler.rb b/config/initializers/task_scheduler.rb deleted file mode 100644 index 58dab127e0d016d74fb860b6d1c1709a27df9766..0000000000000000000000000000000000000000 --- a/config/initializers/task_scheduler.rb +++ /dev/null @@ -1,4 +0,0 @@ -scheduler = Rufus::Scheduler.new -scheduler.every '10m' do - system('rake mainPage:highlights') - end diff --git a/config/orientdb.yml b/config/orientdb.yml index b87506bb88309668349e5f619dea1863652c67b6..07945002eacbdb755ce3058bf6ff217959fc76e8 100644 --- a/config/orientdb.yml +++ b/config/orientdb.yml @@ -6,8 +6,8 @@ development: &development port: 2480 test: - host: mecdb2.c3sl.ufpr.br - database: dev-mauricio + host: mecdb1.c3sl.ufpr.br + database: PortalMEC username: admin password: admin port: 2480 diff --git a/config/routes.rb b/config/routes.rb index c7805c77c64fd952cf8694e3700238569c9b0de4..a2c3ef04c74df29172b3fd5b7b4f8b879227b3c9 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -22,13 +22,14 @@ Rails.application.routes.draw do root 'welcome#index' resources :learning_objects + post '/learning_objects/:id/like' => 'learning_objects#like', as: 'like_learning_object' resources :institutions - + resources :collections get '/faq' => 'welcome#faq' get '/contact' => 'welcome#contact', as: 'contact' get '/complaint' => 'welcome#complaint', as: 'complaint' - get '/search' => 'search/solr#search', as: 'search' + get '/search' => 'search#index', as: 'search' end diff --git a/config/schedule.rb b/config/schedule.rb new file mode 100644 index 0000000000000000000000000000000000000000..a56f2cde9352830e293753c922ada6b3766b290f --- /dev/null +++ b/config/schedule.rb @@ -0,0 +1,24 @@ +# Use this file to easily define all of your cron jobs. +# +# It's helpful, but not entirely necessary to understand cron before proceeding. +# http://en.wikipedia.org/wiki/Cron + +# Example: +# +# set :output, "/path/to/my/cron_log.log" +# +# every 2.hours do +# command "/usr/bin/some_great_command" +# runner "MyModel.some_method" +# rake "some:great:rake:task" +# end +# +# every 4.days do +# runner "AnotherModel.prune_old_records" +# end + +# Learn more: http://github.com/javan/whenever + +every 5.minutes do + rake 'mainPage:highlights' +end diff --git a/db/migrate/20150918134417_add_rid_column_to_users.rb b/db/migrate/20150918134417_add_rid_column_to_users.rb new file mode 100644 index 0000000000000000000000000000000000000000..b31a51e799c6f0a54fe2aaa7e8680606f670e7d4 --- /dev/null +++ b/db/migrate/20150918134417_add_rid_column_to_users.rb @@ -0,0 +1,5 @@ +class AddRidColumnToUsers < ActiveRecord::Migration + def change + add_column :users, :rid, :string + end +end diff --git a/db/migrate/20150921132848_add_attachment_avatar_to_users.rb b/db/migrate/20150921132848_add_attachment_avatar_to_users.rb new file mode 100644 index 0000000000000000000000000000000000000000..1d87ba81ad4a303b20ad6e6fdc95c910aa43edb7 --- /dev/null +++ b/db/migrate/20150921132848_add_attachment_avatar_to_users.rb @@ -0,0 +1,11 @@ +class AddAttachmentAvatarToUsers < ActiveRecord::Migration + def self.up + change_table :users do |t| + t.attachment :avatar + end + end + + def self.down + remove_attachment :users, :avatar + end +end diff --git a/lib/orient_db/methods/edge_methods.rb b/lib/orient_db/methods/edge_methods.rb index 60c5c416efb45b55957a3e21f5b82a0ce0399222..0e5c8c448fe1059c3b09917ae569dd2c3d340731 100644 --- a/lib/orient_db/methods/edge_methods.rb +++ b/lib/orient_db/methods/edge_methods.rb @@ -2,16 +2,19 @@ module OrientDb module Methods module EdgeMethods + ## + # Count the number of edges existent def get_in_edges_count(edge_class, id) - connection.query sprintf("SELECT COUNT(@rid) FROM %s WHERE in = %d", edge_class, id) + result = connection.query "SELECT in('#{edge_class}').size() AS COUNT FROM #{id}" + result.first["COUNT"].to_i end def create_edge(edge_class, from_id, to_id) - connection.command sprintf("CREATE EDGE %s FROM %s TO %s", edge_class, from_id, to_id) + connection.command "CREATE EDGE #{edge_class} FROM #{from_id} TO #{to_id}" end def get_edges_end(edge_class, type, vertex_id) - connection.query sprintf("SELECT expand(%s('%s')) FROM ", type, edge_class, vertex_id) + connection.query sprintf("SELECT expand(%s('%s')) FROM %s", type, edge_class, vertex_id) end def edge_exists?(edge_class, from_id, to_id) @@ -21,4 +24,4 @@ module OrientDb end end -end \ No newline at end of file +end diff --git a/lib/repository/not_persisted_record_error.rb b/lib/repository/not_persisted_record_error.rb new file mode 100644 index 0000000000000000000000000000000000000000..c06010f8e60869a0922a6240df1aa2f13ec8c213 --- /dev/null +++ b/lib/repository/not_persisted_record_error.rb @@ -0,0 +1,2 @@ +class NotPersistedRecordError < StandardError +end \ No newline at end of file diff --git a/lib/search_engine/dspace_solr.rb b/lib/search_engine/dspace_solr.rb new file mode 100644 index 0000000000000000000000000000000000000000..4ddc03ced7b015e260e28a8c581415017df37bab --- /dev/null +++ b/lib/search_engine/dspace_solr.rb @@ -0,0 +1,64 @@ +module SearchEngine + module DspaceSolr + + def search(qry) + + queryParams = merge_search_parameters( + {:q => '*:*', :fq => qry}, + solr_search_default_parameters + ) + results = solr_client.get 'select', :params => queryParams + objectsFound = select_items_from_results(results) + + return objectsFound + end + + private + + #Resource types: + # 2 = Item + # 3 = Collection + # 4 = Community + def select_items_from_results(results) + resultList = Set.new + results["response"]["docs"].select { |r| + r["search.resourcetype"].to_i.equal? 2 + }.each do |i| + resultList.add i + end + return resultList + end + + def solr_client + return RSolr.connect :url => 'http://portalmecdev.c3sl.ufpr.br:8080/solr/search/' + end + + def merge_search_parameters(p1, p2) + return p1.merge(p2) { |key,oldval,newval| key = [newval,oldval].flatten } + end + + def solr_search_default_parameters + return { + "fl"=>[" + search.resourcetype, search.resourceid, + handle, author, title, dc.description + "], + "type"=>"0", + "start"=>"0", + "rows"=>"1000", + "facet"=>"true", + "facet.offset"=>"0", + "facet.mincount"=>"1", + "f.subject_tax_0_filter.facet.sort"=>"count", + "f.subject_tax_0_filter.facet.limit"=>"11", + "f.author_filter.facet.limit"=>"11", + "f.dateIssued.year.facet.sort"=>"index", + "f.dateIssued.year.facet.limit"=>"10", + "f.author_filter.facet.sort"=>"count", + "facet.field"=>["author_filter","subject_tax_0_filter","dateIssued.year"], + "fq"=>["NOT(withdrawn:true)","NOT(discoverable:false)","read:(g0 OR g0)"] + } + end + + end +end diff --git a/lib/search_engine/orientdb_lucene.rb b/lib/search_engine/orientdb_lucene.rb new file mode 100644 index 0000000000000000000000000000000000000000..565a04963787ea9c8628e0aed87a490dd1256f42 --- /dev/null +++ b/lib/search_engine/orientdb_lucene.rb @@ -0,0 +1,15 @@ +module SearchEngine + module OrientdbLucene + + def search(qry) + learning_object_repository.search(qry) + end + + private + + def learning_object_repository + repository.for(:learning_object) + end + + end +end diff --git a/lib/tasks/mainPage.rake b/lib/tasks/mainPage.rake index c4b7bab948e06fc012bb577d140f5fdf8f59bb50..69f84cb36e8a8dace047d8321cbfec20366bcf3b 100644 --- a/lib/tasks/mainPage.rake +++ b/lib/tasks/mainPage.rake @@ -2,26 +2,35 @@ namespace :mainPage do desc "Generate the MainPage" task :highlights => :environment do repository = Portalmec::Application.repository + puts 'Generate the main page subject highlights' + general_highlights = Array.new + subjects = repository.for(:subject).find_all + subjects.each do |subject| + # select all the learning objects about that subject + objects = subject.learning_objects + # transform the objects to RankingItem + objects = objects.collect do |object| + Ranking::Item.new(object.id,object.views,object.downloads,object.likes) + end + # rank them + rater = Ranking::Rater.new(Ranking::Strategies::BasicRater.new(0,1,100)) + objects = rater.sortByRate(objects) + # select the five first objects to the general highlight + (general_highlights << objects.take(5)).flatten! - puts 'Generating the main page highlights' - objects = repository.for(:learningObjet).find_all - objects = objects.collect do |object| - likes = repository.for(:learningObjet).get_likes(object['@rid']).size() - views = repository.for(:learningObjet).get_views(object['@rid']).size() - downloads = repository.for(:learningObjet).get_downloads(object['@rid']).size() - Ranking::Item.new(object['@rid'],views,downloads,likes) + # add the object to the subject highlight + puts subject.name + repository.for(:subject).update(subject.id,'set','highlights','[]') + objects.each do |object| + repository.for(:subject).update(subject.id,'add','highlights',object.name) + end end - rater = Ranking::Rater.new(Ranking::Strategies::BasicRater.new(1000,1,100)) - objects = rater.sortByRate(objects).take(5) - - mainPage = repository.for(:mainPage).find_all[0] + puts 'Generating the main page highlights' + mainPage = repository.for(:mainPage).find_all.first rid = mainPage['@rid'] repository.for(:mainPage).update(rid,'set','highlights','[]') - objects.each do |object| - repository.for(:mainPage).update(rid,'add','highlights',object.name) + general_highlights.each do |general_highlight| + repository.for(:mainPage).update(rid,'add','highlights',general_highlight.name) end - - puts 'Generate the main page subject highlights' - # TODO: generate end end diff --git a/lib/tasks/orientdb.rake b/lib/tasks/orientdb.rake index bebd52ddaf94d9de577cb6f5aa0d845451130c28..3568b65a4c4833f8a5555ec49943557811480bc1 100644 --- a/lib/tasks/orientdb.rake +++ b/lib/tasks/orientdb.rake @@ -25,7 +25,7 @@ namespace :orientdb do begin # Get LearningObjects from OrientDB (from offset to offset+limit) - learning_objects = lo_repo.all(limit,offset) + learning_objects = lo_repo.find_all_from_offset_to_limit(offset,limit) rescue # Sleeps for a while to wait database's recovery sleep(30.seconds) diff --git a/test/models/learning_object_test.rb b/test/models/learning_object_test.rb index c37c3d8078e4090bc576e56276b62549e38caa4e..10d349407170226579f52f7a5395e55c37b82958 100644 --- a/test/models/learning_object_test.rb +++ b/test/models/learning_object_test.rb @@ -1,7 +1,14 @@ require 'test_helper' class LearningObjectTest < ActiveSupport::TestCase - # test "the truth" do - # assert true - # end + should validate_presence_of(:name) + should validate_presence_of(:date_creation) + should validate_presence_of(:type) + should validate_presence_of(:likes) + should validate_presence_of(:views) + should validate_presence_of(:downloads) + + should validate_numericality_of(:likes).is_greater_than_or_equal_to(0) + should validate_numericality_of(:views).is_greater_than_or_equal_to(0) + should validate_numericality_of(:downloads).is_greater_than_or_equal_to(0) end diff --git a/test/models/role_test.rb b/test/models/role_test.rb index 400bdfd312509486ade76489b3d4cb3b550234b0..3dcc8c74c46dbbd5306673f1d4890613bf13de41 100644 --- a/test/models/role_test.rb +++ b/test/models/role_test.rb @@ -2,4 +2,6 @@ require 'test_helper' class RoleTest < ActiveSupport::TestCase should have_and_belong_to_many(:users) + should validate_uniqueness_of(:name) + should validate_presence_of(:name) end diff --git a/test/models/user_test.rb b/test/models/user_test.rb index 3badf9c73309065222b240f94fcf03f2d6d8f660..9785f4725b0f5d55719efb3f8a309180b72ea17f 100644 --- a/test/models/user_test.rb +++ b/test/models/user_test.rb @@ -2,4 +2,5 @@ require 'test_helper' class UserTest < ActiveSupport::TestCase should have_and_belong_to_many(:roles) + should validate_uniqueness_of(:email) end diff --git a/test/repositories/orient_db/user_repository_test.rb b/test/repositories/orient_db/user_repository_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..407a377680a9274b006746bab9eb2bea9fad7835 --- /dev/null +++ b/test/repositories/orient_db/user_repository_test.rb @@ -0,0 +1,4 @@ +require 'test_helper' + +class OrientDb::UserRepositoryTest < ActiveSupport::TestCase +end \ No newline at end of file diff --git a/test/repositories/user_repository_proxy_test.rb b/test/repositories/user_repository_proxy_test.rb new file mode 100644 index 0000000000000000000000000000000000000000..0e5ff57c50121f583a9754c87d4bfec2596c8510 --- /dev/null +++ b/test/repositories/user_repository_proxy_test.rb @@ -0,0 +1,17 @@ +require 'test_helper' + +class UserRepositoryProxyTest < ActiveSupport::TestCase + + test 'raise an exception when create graph node with not persisted user' do + user = User.new + odb_user_repository = mock + repository = UserRepositoryProxy.new odb_user_repository + + assert_raise ::NotPersistedRecordError do + repository.create_graph_node user + end + + assert odb_user_repository.verify + end + +end \ No newline at end of file diff --git a/test/test_helper.rb b/test/test_helper.rb index d6714a96688d5b3a27a8bfc586d8c3772bd5f42d..5fc65a3cd70441ae3c44dd358d63f31b4f323821 100644 --- a/test/test_helper.rb +++ b/test/test_helper.rb @@ -2,6 +2,8 @@ ENV['RAILS_ENV'] ||= 'test' require File.expand_path('../../config/environment', __FILE__) require 'rails/test_help' require 'shoulda-callback-matchers' +require 'minitest/mock' +require 'repository/not_persisted_record_error' class ActiveSupport::TestCase # Setup all fixtures in test/fixtures/*.yml for all tests in alphabetical order. @@ -13,4 +15,8 @@ class ActiveSupport::TestCase assert_equal expected.to_i, actual.count end + def mock + MiniTest::Mock.new + end + end