From f82fc6f9065b74b8b366609cd6dbf45ce3a18405 Mon Sep 17 00:00:00 2001 From: Anusha Ranganathan Date: Thu, 17 Mar 2016 14:41:39 +0000 Subject: [PATCH] Homepage --- Gemfile | 5 +- Gemfile.lock | 5 + Rakefile | 1 + app/assets/images/footer.png | Bin 0 -> 2422 bytes app/assets/images/iiif-logo.png | Bin 0 -> 10494 bytes app/assets/images/other.png | Bin 0 -> 7237 bytes app/assets/images/parker.png | Bin 0 -> 8804 bytes app/assets/images/play-arrow-16-1.png | Bin 0 -> 375 bytes app/assets/images/play-arrow-20-1.png | Bin 0 -> 342 bytes app/assets/images/play-arrow-32-1.png | Bin 0 -> 619 bytes app/assets/images/stanford.png | Bin 0 -> 10393 bytes app/assets/images/walter.png | Bin 0 -> 4622 bytes app/assets/javascripts/application.js | 6 +- app/assets/javascripts/browse_century.js | 200 +++ app/assets/javascripts/colligo.js | 7 + app/assets/stylesheets/application.css | 7 +- app/assets/stylesheets/colligo.css.scss | 81 + .../stylesheets/colligo_slider.css.scss | 47 + app/controllers/application_controller.rb | 10 + app/controllers/catalog_controller.rb | 266 +-- app/helpers/blacklight_helper.rb | 7 + app/models/search_builder.rb | 16 + app/models/solr_document.rb | 17 - .../_homepage/_annotations_author.html.erb | 6 + .../_homepage/_annotations_recent.html.erb | 6 + app/views/catalog/_homepage/_century.html.erb | 23 + app/views/catalog/_homepage/_home.html.erb | 41 + .../_homepage/_home_search_form.html.erb | 24 + .../catalog/_homepage/_home_text.html.erb | 1 + .../catalog/_homepage/_language.html.erb | 9 + .../_homepage/_language_facet_limit.html.erb | 17 + .../_homepage/_language_layout.html.erb | 1 + .../catalog/_homepage/_repository.html.erb | 23 + app/views/catalog/homepage.html.erb | 5 + app/views/layouts/homepage.html.erb | 50 + .../shared/_homepage_header_navbar.html.erb | 18 + config/application.rb | 2 +- config/locales/blacklight.en.yml | 4 +- config/solr_configs/solrconfig.xml | 811 ++++++--- spec/controllers/catalog_controller_spec.rb | 132 ++ spec/features/homepage_century_facet_spec.rb | 28 + spec/features/homepage_search_tab_spec.rb | 23 + .../manuscript_solr_resp_001.json | 823 +++++++++ .../manuscript_solr_resp_001_b.json | 1 + .../solr_documents/solr_document_fixtures.rb | 7 + spec/helpers/blacklight_helper_spec.rb | 7 + spec/models/mods_data_spec.rb | 116 -- spec/models/search_builder_spec.rb | 44 + spec/models/solr_document_spec.rb | 15 + spec/spec_helper.rb | 7 +- spec/support/capybara.rb | 16 + spec/tasks/data_indexer_spec.rb | 2 - .../_annotations_author.html.erb_spec.rb | 13 + .../_annotations_recent.html.erb_spec.rb | 13 + .../_homepage/_century.html.erb_spec.rb | 47 + .../catalog/_homepage/_home.html.erb_spec.rb | 40 + .../_home_search_form.html.erb_spec.rb | 46 + .../_homepage/_language.html.erb_spec.rb | 33 + .../_homepage/_repository.html.erb_spec.rb | 25 + spec/views/catalog/homepage.html.erb_spec.rb | 12 + vendor/assets/javascripts/bootstrap-slider.js | 1577 +++++++++++++++++ 61 files changed, 4260 insertions(+), 483 deletions(-) create mode 100644 app/assets/images/footer.png create mode 100644 app/assets/images/iiif-logo.png create mode 100644 app/assets/images/other.png create mode 100644 app/assets/images/parker.png create mode 100644 app/assets/images/play-arrow-16-1.png create mode 100644 app/assets/images/play-arrow-20-1.png create mode 100644 app/assets/images/play-arrow-32-1.png create mode 100644 app/assets/images/stanford.png create mode 100644 app/assets/images/walter.png create mode 100644 app/assets/javascripts/browse_century.js create mode 100644 app/assets/javascripts/colligo.js create mode 100644 app/assets/stylesheets/colligo.css.scss create mode 100644 app/assets/stylesheets/colligo_slider.css.scss create mode 100644 app/helpers/blacklight_helper.rb create mode 100644 app/views/catalog/_homepage/_annotations_author.html.erb create mode 100644 app/views/catalog/_homepage/_annotations_recent.html.erb create mode 100644 app/views/catalog/_homepage/_century.html.erb create mode 100644 app/views/catalog/_homepage/_home.html.erb create mode 100644 app/views/catalog/_homepage/_home_search_form.html.erb create mode 100644 app/views/catalog/_homepage/_home_text.html.erb create mode 100644 app/views/catalog/_homepage/_language.html.erb create mode 100644 app/views/catalog/_homepage/_language_facet_limit.html.erb create mode 100644 app/views/catalog/_homepage/_language_layout.html.erb create mode 100644 app/views/catalog/_homepage/_repository.html.erb create mode 100644 app/views/catalog/homepage.html.erb create mode 100644 app/views/layouts/homepage.html.erb create mode 100644 app/views/shared/_homepage_header_navbar.html.erb create mode 100644 spec/controllers/catalog_controller_spec.rb create mode 100644 spec/features/homepage_century_facet_spec.rb create mode 100644 spec/features/homepage_search_tab_spec.rb create mode 100644 spec/fixtures/solr_documents/manuscript_solr_resp_001.json create mode 100644 spec/fixtures/solr_documents/manuscript_solr_resp_001_b.json create mode 100644 spec/fixtures/solr_documents/solr_document_fixtures.rb create mode 100644 spec/helpers/blacklight_helper_spec.rb delete mode 100644 spec/models/mods_data_spec.rb create mode 100644 spec/models/search_builder_spec.rb create mode 100644 spec/models/solr_document_spec.rb create mode 100644 spec/support/capybara.rb create mode 100644 spec/views/catalog/_homepage/_annotations_author.html.erb_spec.rb create mode 100644 spec/views/catalog/_homepage/_annotations_recent.html.erb_spec.rb create mode 100644 spec/views/catalog/_homepage/_century.html.erb_spec.rb create mode 100644 spec/views/catalog/_homepage/_home.html.erb_spec.rb create mode 100644 spec/views/catalog/_homepage/_home_search_form.html.erb_spec.rb create mode 100644 spec/views/catalog/_homepage/_language.html.erb_spec.rb create mode 100644 spec/views/catalog/_homepage/_repository.html.erb_spec.rb create mode 100644 spec/views/catalog/homepage.html.erb_spec.rb create mode 100644 vendor/assets/javascripts/bootstrap-slider.js diff --git a/Gemfile b/Gemfile index e3e19bb..eb97ae8 100644 --- a/Gemfile +++ b/Gemfile @@ -48,9 +48,7 @@ group :development do gem 'spring' end -group :test do - gem 'webmock' -end +gem 'webmock', group: :test gem 'blacklight', '>= 5.3.0' gem 'jettywrapper', '>= 2.0' @@ -62,6 +60,7 @@ gem 'blacklight-marc', '~> 5.0' gem 'config', '~> 1.0.0.beta3' gem 'mods_display', '0.3.4' gem 'coderay' +gem 'blacklight_range_limit' group :deployment do gem 'capistrano', '~> 3.0' diff --git a/Gemfile.lock b/Gemfile.lock index d38298e..e5d880f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -55,6 +55,10 @@ GEM blacklight (~> 5.10) marc (>= 0.4.3, < 1.1) rails + blacklight_range_limit (5.2.0) + blacklight (~> 5.15) + jquery-rails + rails (>= 3.0, < 5.0) bootstrap-sass (3.3.5.1) autoprefixer-rails (>= 5.0.0.1) sass (>= 3.3.0) @@ -325,6 +329,7 @@ PLATFORMS DEPENDENCIES blacklight (>= 5.3.0) blacklight-marc (~> 5.0) + blacklight_range_limit byebug capistrano (~> 3.0) capistrano-bundler diff --git a/Rakefile b/Rakefile index 1917855..a76f57a 100644 --- a/Rakefile +++ b/Rakefile @@ -14,6 +14,7 @@ task ci: [:environment] do Rake::Task['db:migrate'].invoke Rake::Task['jetty:download'].invoke Rake::Task['jetty:unzip'].invoke + Rake::Task['colligo:copy_solr_configs'].invoke Jettywrapper.wrap(Jettywrapper.load_config) do Rake::Task['spec'].invoke end diff --git a/app/assets/images/footer.png b/app/assets/images/footer.png new file mode 100644 index 0000000000000000000000000000000000000000..10f7dc323d8a6e4137dd09f9b6109c955cf2b649 GIT binary patch literal 2422 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 onkVDcovB|$jb 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 ZyN@XU>^V@G;B$=#D(^KEs^!eX{~rpeEf)X) literal 0 HcmV?d00001 diff --git a/app/assets/images/other.png b/app/assets/images/other.png new file mode 100644 index 0000000000000000000000000000000000000000..a51b7775d2f7002263775bf876bc16a4d0d54e68 GIT binary patch literal 7237 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 Tf9fhW00000NkvXXu0mjfCL+Q` literal 0 HcmV?d00001 diff --git a/app/assets/images/parker.png b/app/assets/images/parker.png new file mode 100644 index 0000000000000000000000000000000000000000..7b50e80bf18e345177c870f189947ecdbc3b5109 GIT binary patch literal 8804 zcmaKSbyOVB)-3@-26wl?eHh#c?#={v7~C10;1B`?2~Lop!QDMbaCZnEG!WeFk^9}> z{oWt%zFys3RcD>O&pB1QdsVO1AJtT3(NRcH;NalU<>jO_URv?L7Xazy9&*3m$Rw49TWyMgId`*iclZ7c2WavEJUcad6dD*&XQ1T8#y0WsHTq!#N5Zu zT)=|*tte2~OYnuj0SYq(dO6rTx(RxTQ2&cp@TLFP%uWsbmkZ2Jg!+Gy(ot3eN;oCVq0Jv}`^o?IX&S1Wc70Re%(9GskNFCJ`e-i|O+FE&RvntvFipl;@_ zHqI~`Cr994MpH8JlA63gMrBiT8^^x}rhg%nl?CM;-C(AU=1_Sl5$YEXkd2LnpbUpJhqxp!zW|?r zBnO8yj|2}Vr-U@GBp*MYBrmTN_#dp4lexPC)DiX%*5ZG$0{<2JR}2o$FOj97t~MS} z3mI1@2jIVo7PR^Ax$yp1zJFsa{(CNb{}s#rk_`LbrTxE_`XAGae*Sji?Da2$6lT=iaB{HafsK_j4yIx#;p6!^>MwEp<#QezHK>xmWo!bb}3NjJ$MJr zh64jxVcFfG~vXf<1Z`MBScqy1xeAPP4EiTe(JSesW z%}*93%AiJCN-49Xxo6z9X|qvYlSbwdV~<}Q+03I4sYy7}<8Bd#wLSc@9$;6g%t99Y zGuJ(6ctX}Tdo*?J2k1OfCVYOk!>}HDs9Hen(lq8W!%QEY{z-}-F-2UBoUr-=C3SIo z;wHm3{Od{f_7Y(IoIxxk(xM_WyYlpr&I_F|Xxy&u`n*|iYbNm97quQ;L?eXRMRmk& zT`470m7Z`1gm4Pr{#<+|9$3`p5V{v{$lSID4wFXdzO^#OA^H?@@7E*LGXm>!e^1+k z;+LceB?vV~PW=dC^da(}2-HuC!c^AmA{qoD`c;;kT4e{FqcbL>7*?Y8ZGqgcMJl1TateqntyOb zZ~XD<03fYtkcl$fB}F}nqCF{KN*=lMy`CHqWj-@u2RDQED>Jh;;R(F7(L^<=Uu>kB zoK;~&^!js!j*SeHwSRSqE|`W2DKbrGSdxzhEe_SmpF*J=AhMDb<&pWO(#XpgYi@Wu~6sG#QphdM<{Dc<&XFl7UW9*IC6I6iPkd({=b zy~)`ncp{Zj)!joHOWs1gl#9-Rki<<$N6t{%$|owD96en}UcJjt1*&{g<~xTrt-CAX zI*T8BV@b8{E8MDr#&P?KGU$fhGB$@JpBZ7W4C{OSM{+@~5gGz7C5D7lT;%#3UJ+=t za(i$UaRy1*(E96Foe6aGc5#i$QAx-#<$Dy`qwXXbsZ7&aT&#umfON-?5-G*ZLtM@g zZz>S7W2v#yf5;=5NwMNLQq3jc{u(-Wt1y?efou;`RMP>wYzOkRKHw;!ZH zK_339e$tdvEHry>uiJ_eIIHZIA5#ScKR&saI^WFp04j;aO3qpNEiGL_us-gyrEg=S zHfWtm^o|no4n@Qy1(`#@tL}1Iq=-k ze_m|%z;FKN>ejOP`^*_@L7YWe;tyR>f@GX>=X3S^;*2q|sYm4*v|&+(-<*pV9;O)Y z*joXml^rNa`?^Y$S>#6%QWX>}DkC59318_H8HBbqx*F1Tj>X?UXt1ZISXk15hy^Mz8Fd zgYOgC4abu#C9@%X72XnbH1ejdf{dJGG5L7Z&Hd@~JZJSP6I>9PFJE_sQ`F_QAo7yEHIc{AsavFFz28W!Lf3jf+<@FL}aFjl2Y0hqWoo|?P?f9_rwl|Wc z;+tia%UpPQ>Ng0l0lt2v5Nh)!p^2qEk?-~4_mbJtYCmsG!Pcb-A7I#@`^K$x2GO99 zwI}2<(btb$PqLSJvM~_#M;~D}f&u+R;J{DjdFJj5^=c@VwQg>J)X=Iz*uG;#1gXXq zis`ROZtoei7+FDcu`(E0`!PS}B~pIG>6a-$H#&gilJ#|FsWz2D^W$bMyXgpek79NZ zQ$4v)A>qCks#b+?Li+daf)t0ool(LeI|n^a47oz*%Fb6l0R*Y26O%b6Yin!1^JDkV z(09zUL5ch9M)Y-cmLjS%U~O$&zcI5yt#}_X*NzCFVQHz|?4uuU(Ddu@) zVQ>LI=P&$%f?#@!6v^Q}a<*wfERh8)#)2!L0bd+>Gze_&lEcUxvTYFOoNHHuf~7 zDqwy$#eVxIFZ+%=xl)K!oq5o%vNc@%clTDTLx0N?g?;(IgC;Y<*t0v1vh5;PN61}% zP-5WyK`J6RIi-M#Vshq_BG`^&=E(c7cM>K7 ziHqIvMcsBx-QcNDI7&$nGRmeSNq)~qAK2wZ)f4GLl?|>Qmq0Otpx`n`O14GABAP!E zP2Pvou~E`n-Pq09?mq~vr}4knBtL!bea}bM_bXPJbR;HQt}6Ju`h(8 zV`CC)`h7rc+@YDDYw?&2UcdcRrR-gX{WU``t=?L0_>iscJG|vbht`@*`Yw&cVEHhH zA@R7-JsLqj!z5xcJwxjb0y`Am%xaAJ$5kuu72Kwc_k6(lW}E<*-EY;VTLcgDL7v@~ zzs#x`Z4>uo7~l9_(EYr4(vP>*4}ma7>nw8`+;6z&&kzU)>@v7S^h9tpQE5Pn`IC(5 zfHMd9^``m&SstQD5Gko8Bdw4U0m0qt5r8^|gvOf^EJgP@K77ls-1r5#Ahj(C0kGYs z{Oig;?_c|No_X8rHX@0L7%p5*cLs0T_F}&t7ri8kK~n}!f0h)MftG}Vd3Zu~a#1Tg zc%#Q+KqEWk8K_e+H1n*_Q2G<8omUloX0K7dKeU!>)`3I1BB+ z@ohgb>bYg^{T|-j3u-UA9N}P;mZGlPQVC2k^1{G28~JsJSSTY~m8`M!doM3eA@5Ku zMiy707d2WMRl<&QgW0SL5*V{q=AMR*7Qq(0&SzB+!Fo!H!wyRh1`B1eX|0Cg*fzBK zA&Db%e!*Knca3_n<#qXJ8rW9J& zXd&lm%BnxBdUOH+HN)W8kBOxk3UKi)dnV2MtNdmcQz=9uW?7bP#=7}AIm3>|+u+>i zL9nTElntXC#Bq-+bWm1Qon5g^8m^)mNfeC07mZtydfVN#QF2|=i;sXTUlnsB^6bRD zm@I6CKtX+hI0qN;tB;Z$m#KK{M6|lq1^e$H%}OjCJH}*G9D~*r*fb67`&Ud=dOh7| z`f!;Tv+*p#iG;{*>am4{gjAMfwaknz-83*tT|ubr49Tl#ox4S8RCtkK-O^dCPf_wD zuvofc)NTUpFB*$+?kc<|2#cy%@8N?&;EDP~Lr+M$eIJJSoa^_lx0uKghPR3)m?~P< zId#H=r8vduv3zmf&9JXXASs*p*@w?FnwZba7`SfST9A-_l1XwE4D~694tlCzsPPf` z({W8vRJhlFXYq+K+0gw`GOF=bqh$6oLAt)Fl2hiZ37a>s*R;b>r=(KS=szY998p)3 z7Sxc@!l57fo}xxwe**W_#Kv|1uy zkn=}uv*=F(x9aLEzYk1cE2)es$m%*m)_ZGp{GHiH1Z%PU05kFgLtRPKzQP}KZ{ zGwZggG!MuwQnkN3dl`)Mhb)rK9FYrKB!Dsj`StP7me-0cttU&XBG#kyI=lkC63U>F z0#^P-G?ky{j5r#}Z)z^?D%!4CE>E|*BGIGriA265QZXq@r!On@i%q8sDZqb{l$j=b z<65hvXN`?kh{V+sXf5MqYKSC;oW8%#56T_H8tdHgWb$mCoNR=@^&{WSYFBVPB(PL5 zS*$T)HGWU<+2wT}O~OLUB?+xu$g=;PVVQ16WFoO_VJYU=M^nFmLU_I*4y7A_)81O~ zRrcw6@1#pvr&l#zUT#ytCRuc%b$$dJ|H~ev(j}Al3X3@RyI6AtSj_^vQrr(X5RdXs zI-)r4Q0g_Rhg5u;SXs{bPa*D*v>r|Vi=}ooU0Xr}*H<2gKSK!S)_(OO({hoQ6$<`{ zi8a|?a&z9t*EU~n=y%>4H3Q!9 z{;>~P;IsySpi!3l0iwYmEVlp{Q?`gpm zl1u(6&Z$E$A#9yX5C;0Xjenq?;28yQ92~)}xq}EvUl7Q{btf1FY_VA@ORIh3TR2~G z?4=fc8m`ygTsWb{Hy69NH|^LPL{GP14PJU61GPQir0OA)k01VE33%eOK&7M`%6)h2 zJ5RZC(Z}xpB}A&c<|&b0H^ZSxr;wM|4{ox7R)V9VZHrrI_~pYmt{3nL$dKBVC&RCM zEuo8Ii+7-*ZZvOzi^T9s2@S*4)(=OugEO3_)mXy6A$nNbLyXk_b?b`C;hHyE$i49f zBWwO=j^0{bspZ!Aq25Uz?ubm|wl`+et7AGeR{jTDl&cSuvBF-?EhBJ346SfFUySmB zN~&YA$YBY*JjFzPJ0&1qGnle#!vI_kjFyOmMy}GC*S-T zuObYT4)3O-V%4GN*?jeeGG-`*B;B;b)FnS{GpvNmdjxY-J}5yyfS`qa0WFpY2>CWa z#cVT|$AYdD32KF_X3$IL4?Vbm6Xe*yCV(?k7k@{q@T)A>|R~`b^1TA8> zN{n4?NAiv17mdmwGaL-G<57KicYs8~qzVp`X=K8H^%bmP;dz&Q!Qti!VOJ@MP>j3+ zzjCh_KpQ6f_<(I)NVn~wM);*8MwkFnJg!k;7g5ZlwcR9gvp0{;3-65wo@>E7-P)B~ zqsIR^xcsh>?XxElc~&J1U_~GELx-E)opJLg_O$9oNx!E2%n|dO<6(08Nq+SQA_frB z-e;MEXP=wN^V@p`i{nIyErwcIlJIqJD~+IrMY;|(6)6jrkgkF0q*rwq z!aH59?#L5Q7ssKBQMa@5>GlOQ^-wd^R78#U2^gh@d5sUVTwcnpO^Rj-|LSOXiWdA)fSQ@Gs?Jt{)Sh zqRsJ3G*f)Pf{w!(Kk6)@f4d`Ee^|yvY^T$Yv_;R~VoEIDB6TFMwvOZ``WBC~i~6p~ z9ivU$`1=f@zTzfrnvP*Sac)*f3)}WE>51Smi!MCliggB zrkiM$OeZ`UGUl#YgRyUs4bN3Q(FlB^r|Z+ws&$tS06jyn!Gv!oy+I*je;#ep8SrV3 zXjwO?-%qjt)IjgBW5U$fXVtPtdjM?qJvI!4sy11!*oF*~z4#x*bWsYKdXqtJ>bbM@?W*oob4S#UDGLS^FQdTAFv+8062 z0DXBQ@Mq1MntsXNqR@Xv<&**`>Rn%64Q-1F>e&{OCqfUoypL^27Vc0#Ui06A@ zyhyvWtl-@x@q8Yw2&f*ZN_~YkiraybsM8NKEqVanunoT+6Bze&ZZ!kHfj9a6fMnY! zy)f3WJLZ>SH_X=uis9H%C2foK3foP#>9iCD1|B8T8z;mO41z~>3tL!f#U&CkMOnnY zv!!ElDE=&;%GkBAdc|2ar%Ctc{`70qqsIzdlGvA`W7tN7;mXxrQN86r*SGmP^VKL~ zci_lqVsdDuZ_{ZUa@W;jx+d#-@@u6ODAmF zx9a}mhqyzd!EvE8{y66LqCFF2xMEGwl;CYu1 zyX-1PD|%$^v~kUgXl=EFvS;{CBfg1Z-Tm8O@9n3n)x-)Mi{rLSPw>qzga}w!a*i5FX`feaqYMByEh$<&;QIE@QLD1Rh`6%1d)TE*sb3%m7Gj=f0j^XR9lUo>1~D__ci%y^r#fjY@fTfApH3KEoo7F5UAypxh~%o zPsY$1EcRTfAoX0IuqzTTulA7d{BS}HYKB(=*Rp`fb+YHKU-A&uNVQ8ftymjp;NC#33Ul6@vU7ks7Y6OPgCwjYOoJ`t}Nj{^WXEPODyv?~N2WUlL z<3|5mMIF&9;@0OoP-t$vW>@ObpF|DFSQaIzmfGK zPP5r8G6)Z%bZW7lzUTFR9%wjHGndbB>tVA_L@g4z38@GeM!PiY(y%ShzW#n~?r(;- z_^EWleegDwQs7l>!8Ti0?QK8V$GO90)M%e`zbAdShAH9FnG?T!P2@WK10tPC43Qd* zfSdU2dL`di-IWL&E-_u|Z5VDQaCR-6tRJa&Wc%s(Ba^?htu9v$J#PRXTE2X5sr%iq zhZj0s&Su-TaUT!!c^W9KG`ou#mo#j3X@7qadc%ddpt;)3OK}<)>(Lyyd=+%vah*xo zbbC75xMrkfFH4B4I$@TcyeJG;!rV|;!gJ)1-y6`_VRjkdwDKkU%2^<9yWb<*F-zl2 pG5N{({Rzu`?9-g_Q|D_UI18h9DPhXpTz~)jke61Gs*o@V{y*gnM(6+l literal 0 HcmV?d00001 diff --git a/app/assets/images/play-arrow-16-1.png b/app/assets/images/play-arrow-16-1.png new file mode 100644 index 0000000000000000000000000000000000000000..e6e3eff9f25272fa276d8cdcbf099b6f2fd6b9d2 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Y)RhkE)4%caKYZ?lYt_f1s;*b z3=DQ5Ak0|Ga;X6*$X?><>&kwgN03ER{>-|^$qWpPES@foAr`0SPS*818X(ZR-z=7e z?TGgU3m&G%29|bbrK(#c>>C)$94?;|T_9*7B*4MK?J!y4z=Ogs{FnD#U{~2|dve9j z&u7ofo#SxHYy^T}7M%OPi?#3U8)M(#TicGFnRfC+ z|GCvxEbCO)in=z9ayNW);0lS1rW{hWeJmVOCo!>WQi-f{H zh6dROYMzry?~B%Dt$w}B-BY@l@m_eu)nWmb-D%&<*gvqyOilf1m)^ww;K-Rc#`nhe zn2k11UwGq8hnm>^uXF7;=`3EgYN`ApyBS%_cCB;o>-n|!+_D=xGiSw@{bLiVN^d^* Sd^;#u89ZJ6T-G@yGywog(2}yal`lO9^Ehe?0hoZ4h;*VGv=u$+-jL}f&bUti<2jx+&j6tT;(m} z@tkYzZ)d9HS2rjsm^R zAg`YjOQIDHEM0Q^>)P#%OmjS{V%Pgd%X(G$Ysy}UvbR2xvH#jHrZ;YkhtqakvRQhC zSxnHlW^=8`)DJJM*XR~x{We*3qkJ2?Wx7(=--O>zLQAJyi=KDGj=9cu%YR0`+<4QO iyABu^$bMzo$Ka+IeC0?D*JGe}89ZJ6T-G@yGywo*?14)F literal 0 HcmV?d00001 diff --git a/app/assets/images/play-arrow-32-1.png b/app/assets/images/play-arrow-32-1.png new file mode 100644 index 0000000000000000000000000000000000000000..2719f26fdc4fe028504ea22c8dc9be59c6c567e9 GIT binary patch literal 619 zcmV-x0+juUP)q`X}L zw#{q>AcQa%M2*GRRbb1^ZbXQYwvquv2$|Wb;5@LC=lMzqf!HTf0sx%Ovh0JI-I~-VssxDlzc#bA*e8xhqG|wuI`G2G*2hI6 z1pq(;*f6sPolYn7-v5P21rUY#wBPSPYPDLmn2wYH0B3<`gTdgTnPrla14K=10Btin z^*;dqp-F8=KpWVURHTl;PoUjsG@eT;Qj72ac+zY(H@n^L&^d>sWGNT`k0osZIOp)* zC)2thnX94&%S}01b=id9nNp(KW{s7gz&yqiIP00WN002ovPDHLk FV1mSk4A=kw literal 0 HcmV?d00001 diff --git a/app/assets/images/stanford.png b/app/assets/images/stanford.png new file mode 100644 index 0000000000000000000000000000000000000000..bae37c2dc8f20ed6e1f6b4e341632443a396bb6c GIT binary patch literal 10393 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ȘCuX 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

j3O^?+&wjOtG{b?fF)3Hb5 z9Z9YoGIkG{;CDPbuM}AUa~65UPt-pAOn!f&ocn4{6C0++0=>=gRKs%LU6=-^Mgq>O z>8&d;n|-Z}gFkDr>7XcEOf8=tpIBs+Fnmk9(q!5GBik;q`{TmM?&%Flmfrj5X!mCE zmry46K70?WvHlxhyZH>cSyVT2p9?1?7+?SDEAja-u;5tC)0hpJ)z=o~+Ml)2wZ4*FH!$f>D0R+Z%NTqo?)P}dR!^fd)Et4 z6BL0Ag)g`MJYL5CN zE3AP9u?ue8@;y*u(r`Urf?tr(CO7VO$fhSMYi?GPL5E?0Uu`=t-luQq^PmWPDRg|t z+Y*Q$T|lSBdE{zA_agO1?nj90`*#gTKO|SA&U5iF3K#zHswuN5^`!%&aF5@# z6vm(kGB*C#2khAUS3AraCt@9whPTnKgs8w;y=FZE-a!wU?v0sAbfm@$QPaX$ z^Nr(O8?s7Xg=fhw$hnJ^;9*b~UF5>#_LV$2j8p1P~M>5&6no zhPwli{9Q&qFqVd74|{+9fy$#LNbu4vx`XyB7 zh~Lv?LCyVQHBUcVp05u((VlObClHN;dMmYeX5!7~NNVOLD}zxN+aRoGL>-xAKcPGHZTnQhuOFv0_6X-^)Fcmg z3D0`JaAqr>FBrX}$W^*fr`DYQR!3NBpHzLoLYQ#r&a#_$RFZ=ny3TRx!7NyyDC^1I zXAb;!jqF*CA;LEJ5rd=%%&wNzKtn&icg;9V_v1RNFHY+>j zyiMUIAtRL3SMu`Op!?R6$z_&GMH~~_>U!L=0F(CkUa^o*yIFr>cKnPQv2}*YLC>0k zHh3pdv$dwY(&ol6!Y=MOp?+??xtCi}^0Iv`Cn{-kD3o`x)HQ-V>n6KLIvLCRpsD9a z<-BtaG(PuSR!zTuIFF0I?IB>}8VLxj$#2!|s(N_ghL^Yy0+tWutAvs~e zaj8A7yP?@atjrDlkLGQ;BH`~0})21~wq zsPx$6K^tb&JO-M*67d_{iuQxeql4|a)T-oF$C-6w(I4ab>Q_#>wAOlb;TWE9k2@+B z_@#D^9bmrwT0i^O2~VAu0z5kML3UQJGq3_;{zFzljmFC!{h=|$n4-&2j*').appendTo(century_slider); + if (placeholder_input.slider !== undefined) { + placeholder_input.slider({ + min: min, + max: max, + value: [min, max], + tooltip_position: "left", + orientation: 'vertical', + reversed: true, + //step: 100, + //ticks: slider_ticks, + handle: 'custom' + }); + } + // Match slider height to plot + var slider_body = $(".slider.slider-vertical"); + slider_body.height( plot.height()-35 ); + slider_body.css('margin-top',"25px"); + // set values of form elements to min and max + begin_el.val(min); + end_el.val(max); + // on plot click + browse_century.bind("plotclick", function (event, pos, item) { + if ( plot.getSelection() == null) { + var segment = find_segment_for(pos.y); + plot.setSelection( normalized_selection(segment.from, segment.to)); + begin_el.val(segment.from); + end_el.val(segment.to); + var slider_placeholder = century_slider.find("[data-slider-placeholder]"); + if (slider_placeholder) { + slider_placeholder.slider("setValue", [segment.from, segment.to]); + } + } + }); + // on plot select + browse_century.bind("plotselected plotselecting", function(event, ranges) { + if (ranges != null ) { + var from = Math.floor(ranges.yaxis.from); + var to = Math.floor(ranges.yaxis.to); + begin_el.val(from); + end_el.val(to); + var slider_placeholder = century_slider.find("[data-slider-placeholder]"); + if (slider_placeholder) { + slider_placeholder.slider("setValue", [from, to+1]); + } + } + }); + // on form input fields value change + form.find("input.range_begin, input.range_end").change(function () { + plot.setSelection( form_selection(form, min, max) , true ); + }); + begin_el.change( function() { + var val = BlacklightRangeLimit.parseNum($(this).val()); + if ( isNaN(val) || val < min) { + //for weird data, set slider at min + val = min; + } + var values = placeholder_input.data("slider").getValue(); + values[0] = val; + placeholder_input.slider("setValue", values); + }); + end_el.change( function() { + var val = BlacklightRangeLimit.parseNum($(this).val()); + if ( isNaN(val) || val > max ) { + //weird entry, set slider to max + val = max; + } + var values = placeholder_input.data("slider").getValue(); + values[1] = val; + placeholder_input.slider("setValue", values); + }); + // on slider value change + var slider_placeholder = century_slider.find("[data-slider-placeholder]"); + slider_placeholder.on("change", function(event) { + var values = $(event.target).data("slider").getValue(); + begin_el.val(values[0]); + end_el.val(values[1]); + plot.setSelection( normalized_selection(values[0], Math.max(values[0], values[1]-1)), true); + }); + }); + + function showTooltip(x, y, color, contents) { + $('

' + contents + '
').css({ + position: 'absolute', + display: 'none', + top: y - 10, + left: x + 10, + border: '2px solid ' + color, + padding: '3px', + 'font-size': '12px', + 'border-radius': '5px', + 'background-color': '#fff', + 'font-family': 'Verdana, Arial, Helvetica, Tahoma, sans-serif', + opacity: 0.9 + }).appendTo("body").fadeIn(200); + } + + function function_for_find_segment(pointer_lookup_arr) { + return function(y_coord) { + for (var i = pointer_lookup_arr.length-1 ; i >= 0 ; i--) { + var hash = pointer_lookup_arr[i]; + if (y_coord >= hash.from) { + return hash; + } + } + return pointer_lookup_arr[0]; + }; + } + + function normalized_selection(min, max) { + max += 0.99999; + return {xaxis: { 'from':min, 'to':max}} + } + + /* + function isInt(n) { + return n % 1 === 0; + } + */ +}; diff --git a/app/assets/javascripts/colligo.js b/app/assets/javascripts/colligo.js new file mode 100644 index 0000000..82e27c0 --- /dev/null +++ b/app/assets/javascripts/colligo.js @@ -0,0 +1,7 @@ +// Tabs on homepage +$(document).on('click', '.nav-tabs li', function() { + $(".nav-tabs li").removeClass("active"); + $(this).addClass("active"); + $("#main_search_field").val($(this).data("field")); + $("#q" ).focus(); +}); diff --git a/app/assets/stylesheets/application.css b/app/assets/stylesheets/application.css index f9cd5b3..5998963 100644 --- a/app/assets/stylesheets/application.css +++ b/app/assets/stylesheets/application.css @@ -10,6 +10,11 @@ * defined in the other CSS/SCSS files in this directory. It is generally better to create a new * file per style scope. * + * Used by blacklight_range_limit + *= require 'blacklight_range_limit' + * *= require_tree . *= require_self - */ + * + * +*/ diff --git a/app/assets/stylesheets/colligo.css.scss b/app/assets/stylesheets/colligo.css.scss new file mode 100644 index 0000000..57bac8f --- /dev/null +++ b/app/assets/stylesheets/colligo.css.scss @@ -0,0 +1,81 @@ +#header-navbar .navbar-brand { + width: 300px; + height: 50px; + background: transparent none no-repeat scroll left top; + display: inline-block; + white-space: nowrap; + overflow: hidden; + padding-right: 0px; + margin-right: 20px; + padding-left: 5px; + text-indent: 50px; + font-size: 2.5em; +} + +/* Home page search */ +.navbar-form .nav-tabs { + border-bottom: 0px; +} + +.navbar-form .nav-tabs > li { + border-bottom: 1px solid #cccccc; +} + +.navbar-form .nav-tabs > li:active { + border-bottom: 0px; +} + +.navbar-form .input-group { + width: 100%; + border-top: 0px; + height: 35px; + border-top: 0px; +} + +.navbar-form .input-group > input { + border-top: 0px; +} + +h2, h3 { + color: #999; + font-weight: bold; +} + +.panel-body .btn-secondary { + margin: 3px; + padding: 3px; + border: 1px solid #cccccc; + width: 100%; + text-align: left; +} + +.panel-body .btn > img { + padding-right: 5px; +} + +.panel-body .btn-primary-outline { + color: #0275D8; + background-color: transparent; + background-image: none; + border-color: #0275D8; +} + +.panel-body .btn-primary { + margin: 0 5px 5px 0; +} + +#century_panel { + height: 400px; + text-align: center; + float:left; + position: relative; + padding-left: 0px; +} + +#century_slider { + height: auto; + width: 50px; + float: left; + position: relative; + padding-right: 0px; +} diff --git a/app/assets/stylesheets/colligo_slider.css.scss b/app/assets/stylesheets/colligo_slider.css.scss new file mode 100644 index 0000000..d125c61 --- /dev/null +++ b/app/assets/stylesheets/colligo_slider.css.scss @@ -0,0 +1,47 @@ +.slider-tick { + width: 2px; + height: 2px; +} + +.slider-handle.custom { + background: transparent asset_url('play-arrow-16-1.png') no-repeat scroll 0% 50%; +} +/* +.slider-track-low::before { + line-height: 20px; + font-size: 20px; + content: ; + color: #ccc; +} +*/ + +.slider-handle.custom::before { + content: none; + color: #ccc; +} + +.slider-tick.custom::before { + content: "-"; + color: #726204; +} + +.slider-selection.tick-slider-selection { + background-image: linear-gradient(to bottom, #aab 0%, #aaa 100%); + background-repeat: repeat-x; +} + +.slider-selection { + background-image: linear-gradient(to bottom, #aab 0%, #aaa 100%); + background-repeat: repeat-x; +} + +.slider-track { + background-image: linear-gradient(to bottom, #e5e5e5 0%, #e9e9e9 100%); + background-repeat: repeat-x; + box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.1) inset; + border-radius: 4px; +} + +.slider.slider-vertical .slider-track { + width: 2px; +} diff --git a/app/controllers/application_controller.rb b/app/controllers/application_controller.rb index 8b79ffe..76c3bd0 100644 --- a/app/controllers/application_controller.rb +++ b/app/controllers/application_controller.rb @@ -6,4 +6,14 @@ class ApplicationController < ActionController::Base # Prevent CSRF attacks by raising an exception. # For APIs, you may want to use :null_session instead. protect_from_forgery with: :exception + + helper_method :on_home_page, :request_path + + def on_home_page + request_path[:controller] == 'catalog' && request_path[:action] == 'index' && params[:f].blank? && params[:q].blank? && params[:range].blank? + end + + def request_path + Rails.application.routes.recognize_path(request.path) + end end diff --git a/app/controllers/catalog_controller.rb b/app/controllers/catalog_controller.rb index 1e5dd7b..3318940 100644 --- a/app/controllers/catalog_controller.rb +++ b/app/controllers/catalog_controller.rb @@ -1,8 +1,7 @@ # -*- encoding : utf-8 -*- class CatalogController < ApplicationController - include Blacklight::Marc::Catalog - include Blacklight::Catalog + layout :resolve_layout configure_blacklight do |config| ## Default parameters to send to solr for all search-like requests. See also SearchBuilder#processed_parameters @@ -11,64 +10,45 @@ class CatalogController < ApplicationController rows: 10 } - # solr path which will be added to solr base url before the other solr params. - # config.solr_path = 'select' - - # items to show per page, each number in the array represent another option to choose from. - # config.per_page = [10,20,50,100] - - ## Default parameters to send on single-document requests to Solr. These settings are the Blackligt defaults (see SearchHelper#solr_doc_params) or - ## parameters included in the Blacklight-jetty document requestHandler. - # - # config.default_document_solr_params = { - # :qt => 'document', - # ## These are hard-coded in the blacklight 'document' requestHandler - # # :fl => '*', - # # :rows => 1 - # # :q => '{!raw f=id v=$id}' - # } - # solr field configuration for search results/index views config.index.title_field = 'title_display' config.index.display_type_field = 'format' - # solr field configuration for document/show views - # config.show.title_field = 'title_display' - # config.show.display_type_field = 'format' - - # solr fields that will be treated as facets by the blacklight application - # The ordering of the field names is the order of the display - # - # Setting a limit will trigger Blacklight's 'more' facet values link. - # * If left unset, then all facet values returned by solr will be displayed. - # * If set to an integer, then "f.somefield.facet.limit" will be added to - # solr request, with actual solr request being +1 your configured limit -- - # you configure the number of items you actually want _displayed_ in a page. - # * If set to 'true', then no additional parameters will be sent to solr, - # but any 'sniffed' request limit parameters will be used for paging, with - # paging at requested limit -1. Can sniff from facet.limit or - # f.specific_field.facet.limit solr request params. This 'true' config - # can be used if you set limits in :default_solr_params, or as defaults - # on the solr side in the request handler itself. Request handler defaults - # sniffing requires solr requests to be made with "echoParams=all", for - # app code to actually have it echo'd back to see it. - # - # :show may be set to false if you don't want the facet to be drawn in the - # facet bar config.add_facet_field 'format', label: 'Format' - config.add_facet_field 'pub_date', label: 'Publication Year', single: true - config.add_facet_field 'subject_topic_facet', label: 'Topic', limit: 20 - config.add_facet_field 'language_facet', label: 'Language', limit: true - config.add_facet_field 'lc_1letter_facet', label: 'Call Number' - config.add_facet_field 'subject_geo_facet', label: 'Region' - config.add_facet_field 'subject_era_facet', label: 'Era' - - config.add_facet_field 'example_pivot_field', label: 'Pivot Field', pivot: %w(format language_facet) - - config.add_facet_field 'example_query_facet_field', label: 'Publish Date', query: { - years_5: { label: 'within 5 Years', fq: "pub_date:[#{Time.now.year - 5} TO *]" }, - years_10: { label: 'within 10 Years', fq: "pub_date:[#{Time.now.year - 10} TO *]" }, - years_25: { label: 'within 25 Years', fq: "pub_date:[#{Time.now.year - 25} TO *]" } + config.add_facet_field 'type_of_resource_facet', label: 'Type of resource' + config.add_facet_field 'authors_all_facet', label: 'Authors' + config.add_facet_field 'topic_facet', label: 'Topic', limit: 20 + config.add_facet_field 'geographic_facet', label: 'Region' + config.add_facet_field 'era_facet', label: 'Era' + config.add_facet_field 'manuscript_facet', label: 'Manuscript' + config.add_facet_field 'language', label: 'Language', limit: 5 + config.add_facet_field 'place_search', label: 'Place of origin' + config.add_facet_field 'model', label: 'Type' + config.add_facet_field 'folio', label: 'Folio' + config.add_facet_field 'collection', label: 'Repository' + # config.add_facet_field 'example_pivot_field', label: 'Pivot Field', pivot: %w(format language) + config.add_facet_field 'date_range', label: 'Century', query: { + years_21: { label: '21st', fq: 'pub_date_t:[2000 TO *]' }, + years_20: { label: '20th', fq: 'pub_date_t:[1900 TO 1999]' }, + years_19: { label: '19th', fq: 'pub_date_t:[1800 TO 1899]' }, + years_18: { label: '18th', fq: 'pub_date_t:[1700 TO 1799]' }, + years_17: { label: '17th', fq: 'pub_date_t:[1600 TO 1699]' }, + years_16: { label: '16th', fq: 'pub_date_t:[1500 TO 1599]' }, + years_15: { label: '15th', fq: 'pub_date_t:[1400 TO 1499]' }, + years_14: { label: '14th', fq: 'pub_date_t:[1300 TO 1399]' }, + years_13: { label: '13th', fq: 'pub_date_t:[1200 TO 1299]' }, + years_12: { label: '12th', fq: 'pub_date_t:[1100 TO 1199]' }, + years_11: { label: '11th', fq: 'pub_date_t:[1000 TO 1099]' }, + years_10: { label: '10th', fq: 'pub_date_t:[900 TO 999]' }, + years_9: { label: '9th', fq: 'pub_date_t:[800 TO 899]' }, + years_8: { label: '8th', fq: 'pub_date_t:[700 TO 799]' }, + years_7: { label: '7th', fq: 'pub_date_t:[600 TO 699]' }, + years_6: { label: '6th', fq: 'pub_date_t:[500 TO 599]' }, + years_5: { label: '5th', fq: 'pub_date_t:[400 TO 499]' }, + years_4: { label: '4th', fq: 'pub_date_t:[300 TO 399]' }, + years_3: { label: '3rd', fq: 'pub_date_t:[200 TO 299]' }, + years_2: { label: '2nd', fq: 'pub_date_t:[100 TO 199]' }, + years_1: { label: '1st', fq: 'pub_date_t:[0 TO 99]' } } # Have BL send all facet field names to Solr, which has been the default @@ -79,101 +59,135 @@ class CatalogController < ApplicationController # solr fields to be displayed in the index (search results) view # The ordering of the field names is the order of the display config.add_index_field 'title_display', label: 'Title' - config.add_index_field 'title_vern_display', label: 'Title' - config.add_index_field 'author_display', label: 'Author' - config.add_index_field 'author_vern_display', label: 'Author' + config.add_index_field 'authors_all_display', label: 'Author' config.add_index_field 'format', label: 'Format' - config.add_index_field 'language_facet', label: 'Language' - config.add_index_field 'published_display', label: 'Published' - config.add_index_field 'published_vern_display', label: 'Published' - config.add_index_field 'lc_callnum_display', label: 'Call number' - + config.add_index_field 'language', label: 'Language' + config.add_index_field 'abstract_display', label: 'Abstract' + config.add_index_field 'topic_display', label: 'Topic' + config.add_index_field 'geographic_display', label: 'Region' + config.add_index_field 'era_display', label: 'Era' + config.add_index_field 'pub_date_display', label: 'Date' + config.add_index_field 'collection', label: 'Repository' # solr fields to be displayed in the show (single result) view # The ordering of the field names is the order of the display config.add_show_field 'title_display', label: 'Title' - config.add_show_field 'title_vern_display', label: 'Title' config.add_show_field 'subtitle_display', label: 'Subtitle' - config.add_show_field 'subtitle_vern_display', label: 'Subtitle' - config.add_show_field 'author_display', label: 'Author' - config.add_show_field 'author_vern_display', label: 'Author' + config.add_show_field 'title_alternate_display', label: 'Alternate titles' + config.add_show_field 'title_other_display', label: 'Other titles' + config.add_show_field 'authors_all_display', label: 'Author' config.add_show_field 'format', label: 'Format' - config.add_show_field 'url_fulltext_display', label: 'URL' - config.add_show_field 'url_suppl_display', label: 'More Information' - config.add_show_field 'language_facet', label: 'Language' - config.add_show_field 'published_display', label: 'Published' - config.add_show_field 'published_vern_display', label: 'Published' - config.add_show_field 'lc_callnum_display', label: 'Call number' - config.add_show_field 'isbn_t', label: 'ISBN' + config.add_show_field 'language', label: 'Language' + config.add_show_field 'pub_date_display', label: 'Date' + config.add_show_field 'collection', label: 'Repository' # "fielded" search configuration. Used by pulldown among other places. # For supported keys in hash, see rdoc for Blacklight::SearchFields - # - # Search fields will inherit the :qt solr request handler from - # config[:default_solr_parameters], OR can specify a different one - # with a :qt key/value. Below examples inherit, except for subject - # that specifies the same :qt as default for our own internal - # testing purposes. - # - # The :key is what will be used to identify this BL search field internally, - # as well as in URLs -- so changing it after deployment may break bookmarked - # urls. A display label will be automatically calculated from the :key, - # or can be specified manually to be different. - - # This one uses all the defaults set by the solr request handler. Which - # solr request handler? The one set in config[:default_solr_parameters][:qt], - # since we aren't specifying it otherwise. - config.add_search_field 'all_fields', label: 'All Fields' - # Now we see how to over-ride Solr request handler defaults, in this - # case for a BL "search field", which is really a dismax aggregate - # of Solr search fields. - - config.add_search_field('title') do |field| - # solr_parameters hash are sent to Solr as ordinary url query params. - field.solr_parameters = { 'spellcheck.dictionary': 'title' } - - # :solr_local_parameters will be sent using Solr LocalParams - # syntax, as eg {! qf=$title_qf }. This is neccesary to use - # Solr parameter de-referencing like $title_qf. - # See: http://wiki.apache.org/solr/LocalParams - field.solr_local_parameters = { - qf: '$title_qf', - pf: '$title_pf' - } + config.add_search_field('descriptions') do |field| + field.qt = 'descriptions' end - config.add_search_field('author') do |field| - field.solr_parameters = { 'spellcheck.dictionary': 'author' } - field.solr_local_parameters = { - qf: '$author_qf', - pf: '$author_pf' - } + config.add_search_field('transcriptions') do |field| + field.qt = 'transcriptions' end - # Specifying a :qt only to show it's possible, and so our internal automated - # tests can test it. In this case it's the same as - # config[:default_solr_parameters][:qt], so isn't actually neccesary. - config.add_search_field('subject') do |field| - field.solr_parameters = { 'spellcheck.dictionary': 'subject' } - field.qt = 'search' - field.solr_local_parameters = { - qf: '$subject_qf', - pf: '$subject_pf' - } + config.add_search_field('annotations') do |field| + field.qt = 'annotations' end # "sort results by" select (pulldown) # label in pulldown is followed by the name of the SOLR field to sort by and # whether the sort is ascending or descending (it must be asc or desc # except in the relevancy case). - config.add_sort_field 'score desc, pub_date_sort desc, title_sort asc', label: 'relevance' - config.add_sort_field 'pub_date_sort desc, title_sort asc', label: 'year' - config.add_sort_field 'author_sort asc, title_sort asc', label: 'author' - config.add_sort_field 'title_sort asc, pub_date_sort desc', label: 'title' + config.add_sort_field 'score desc, title_sort asc', label: 'relevance' + config.add_sort_field 'authors_all_facet asc, title_sort asc', label: 'author' + config.add_sort_field 'pub_date_sort asc, title_sort asc', label: 'date' # If there are more than this many search results, no spelling ("did you # mean") suggestion is offered. config.spell_max = 5 end + + def index + if on_home_page + blacklight_config.add_facet_field 'pub_date_t', label: 'Publication Year', range: { + num_segments: 21, + assumed_boundaries: [0, 2999], + segments: true + } + manuscripts + annotations + plot_data + render 'homepage' + else + super + end + end + + private + + def resolve_layout + if on_home_page + 'homepage' + else + 'blacklight' + end + end + + def manuscripts + self.search_params_logic += [:add_manuscript_filter] + self.search_params_logic -= [:all_search_filter, :add_annotation_filter, :add_transcription_filter] + (@response_m, @document_list_m) = get_search_results + end + + def annotations + self.search_params_logic += [:add_annotation_filter] + self.search_params_logic -= [:all_search_filter, :add_manuscript_filter, :add_transcription_filter] + (@response_a, @document_list_a) = get_search_results + end + + def transcriptions + self.search_params_logic += [:add_transcription_filter] + self.search_params_logic -= [:all_search_filter, :add_manuscript_filter, :add_annotation_filter] + (@response_t, @document_list_t) = get_search_results + end + + def plot_data + data = solr_range_queries_to_a('pub_date_t') + @data_array = [] + @data_ticks = [] + @pointer_lookup = [] + @slider_ticks = [] + # @slider_labels = [] + data.each do |val| + @data_array << [val[:count], val[:from]] + if val[:from] == 0 + label = '1st' + elsif val[:from] == 100 + label = '2nd' + elsif val[:from] == 200 + label = '3rd' + else + label = "#{((val[:from] / 100) + 1)}th" + end + @data_ticks << [val[:from], label] + @slider_ticks << val[:from] + # @slider_labels << label + @pointer_lookup << { 'from': val[:from], 'to': val[:to], 'count': val[:count], 'label': "#{val[:from]} to #{val[:to]}" } + end + @boundaries = [@data_array.first.last, @data_array.last.last] + end + + def solr_range_queries_to_a(solr_field) + return [] unless @response_m['facet_counts'] && @response_m['facet_counts']['facet_queries'] + array = [] + @response_m['facet_counts']['facet_queries'].each_pair do |query, count| + if query =~ /#{solr_field}: *\[ *(\d+) *TO *(\d+) *\]/ + array << { from: Regexp.last_match(1).to_i, to: Regexp.last_match(2).to_i, count: count.to_i } + end + end + array = array.sort_by { |hash| hash[:from].to_i } + array + end end diff --git a/app/helpers/blacklight_helper.rb b/app/helpers/blacklight_helper.rb new file mode 100644 index 0000000..3830259 --- /dev/null +++ b/app/helpers/blacklight_helper.rb @@ -0,0 +1,7 @@ +module BlacklightHelper + include Blacklight::BlacklightHelperBehavior + + def application_name + 'Colligo' + end +end diff --git a/app/models/search_builder.rb b/app/models/search_builder.rb index efcef22..26a62e9 100644 --- a/app/models/search_builder.rb +++ b/app/models/search_builder.rb @@ -1,3 +1,19 @@ class SearchBuilder < Blacklight::SearchBuilder include Blacklight::Solr::SearchBuilderBehavior + + def add_manuscript_filter(solr_parameters) + solr_parameters[:qt] = 'descriptions' + end + + def add_annotation_filter(solr_parameters) + solr_parameters[:qt] = 'annotations' + end + + def add_transcription_filter(solr_parameters) + solr_parameters[:qt] = 'transcriptions' + end + + def all_search_filter(solr_parameters) + solr_parameters[:qt] = 'search' + end end diff --git a/app/models/solr_document.rb b/app/models/solr_document.rb index 88e3163..debcd07 100644 --- a/app/models/solr_document.rb +++ b/app/models/solr_document.rb @@ -10,13 +10,6 @@ def initialize(*args) super end - # The following shows how to setup this blacklight document to display marc documents - extension_parameters[:marc_source_field] = :marc_display - extension_parameters[:marc_format_type] = :marcxml - use_extension(Blacklight::Solr::Document::Marc) do |document| - document.key?(:marc_display) - end - field_semantics.merge!( title: 'title_display', author: 'author_display', @@ -37,14 +30,4 @@ def initialize(*args) # and Blacklight::Document::SemanticFields#to_semantic_values # Recommendation: Use field names from Dublin Core use_extension(Blacklight::Document::DublinCore) - - # This abstraction method may become useful while - # we're between using the new and old format facet - def format_key - :format_main_ssim - end - - def file_ids - self[:img_info] || self[:file_id] - end end diff --git a/app/views/catalog/_homepage/_annotations_author.html.erb b/app/views/catalog/_homepage/_annotations_author.html.erb new file mode 100644 index 0000000..0df38b5 --- /dev/null +++ b/app/views/catalog/_homepage/_annotations_author.html.erb @@ -0,0 +1,6 @@ +
+
+

by author

+
+
+ diff --git a/app/views/catalog/_homepage/_annotations_recent.html.erb b/app/views/catalog/_homepage/_annotations_recent.html.erb new file mode 100644 index 0000000..b4c1c1c --- /dev/null +++ b/app/views/catalog/_homepage/_annotations_recent.html.erb @@ -0,0 +1,6 @@ +
+
+

by most recent

+
+
+ diff --git a/app/views/catalog/_homepage/_century.html.erb b/app/views/catalog/_homepage/_century.html.erb new file mode 100644 index 0000000..708e6bb --- /dev/null +++ b/app/views/catalog/_homepage/_century.html.erb @@ -0,0 +1,23 @@ +<%- # requires solr_config local passed in + label = facet_field_label('pub_date_t') + input_label_range_begin = t('blacklight.range_limit.range_begin', field_label: label) + input_label_range_end = t('blacklight.range_limit.range_end', field_label: label) +-%> + +
+

by century

+ <%= content_tag :div, class: 'col col-md-3', id: 'century_slider', data: {boundaries: @boundaries, ticks: @slider_ticks} do %> + <% end %> + + <%= content_tag :div, class: 'col col-md-9', id: 'century_panel', data: {rawdata: @data_array, ticks: @data_ticks, pointerlookup: @pointer_lookup} do %> +
+
+ <% end %> + + <%= form_tag catalog_index_path, :method => :get, :class=> 'range_limit subsection range_pub_date_t form-inline' do %> + <%= hidden_field_tag('search_field', 'descriptions', id: 'search_descriptions_century') %> + <%= render_range_input( 'pub_date_t', :begin, input_label_range_begin) %> โ€“ <%= render_range_input('pub_date_t', :end, input_label_range_end) %> + <%= submit_tag t('blacklight.range_limit.submit_limit'), :class=>'submit btn btn-default' %> + <% end %> + +
\ No newline at end of file diff --git a/app/views/catalog/_homepage/_home.html.erb b/app/views/catalog/_homepage/_home.html.erb new file mode 100644 index 0000000..8a698e3 --- /dev/null +++ b/app/views/catalog/_homepage/_home.html.erb @@ -0,0 +1,41 @@ +<% @response = @response_m %> +<% @document_list = @document_list_m %> + +
+
+ <%= render :partial=>'/catalog/_homepage/home_text' %> +
+
+
+
+ +
+
+

Browse manuscripts

+
+
+ <%= render :partial=>'/catalog/_homepage/repository' %> + <%= render :partial=>'/catalog/_homepage/language' %> +
+
+ <%= render :partial=>'/catalog/_homepage/century' %> +
+
+
+
+

& annotations

+
+ <%= render :partial=>'/catalog/_homepage/annotations_recent' %> +
+
+ <%= render :partial=>'/catalog/_homepage/annotations_author' %> +
+
+
diff --git a/app/views/catalog/_homepage/_home_search_form.html.erb b/app/views/catalog/_homepage/_home_search_form.html.erb new file mode 100644 index 0000000..2f2f397 --- /dev/null +++ b/app/views/catalog/_homepage/_home_search_form.html.erb @@ -0,0 +1,24 @@ +<%= form_tag search_action_url, method: :get, class: 'navbar-form', role: 'search' do %> + <%#= render_hash_as_hidden_fields(search_state.params_for_search.except(:q, :search_field, :qt, :page, :utf8)) %> + <%= hidden_field_tag :search_field, search_fields.first.last, id: 'main_search_field' %> + <% if search_fields.length > 1 %> +
+ <% end %> +
+ <%= text_field_tag :q, params[:q], placeholder: t('blacklight.search.form.search.placeholder'), + class: 'form-control', id: 'q', autofocus: should_autofocus_on_search_box?, style: 'width:100%' %> + <%#, data: { autocomplete_enabled: autocomplete_enabled?, autocomplete_path: blacklight.suggest_index_path } %> + +
+ +
+
+<% end %> diff --git a/app/views/catalog/_homepage/_home_text.html.erb b/app/views/catalog/_homepage/_home_text.html.erb new file mode 100644 index 0000000..515643e --- /dev/null +++ b/app/views/catalog/_homepage/_home_text.html.erb @@ -0,0 +1 @@ +

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras vestibulum dui ut nibh venenatis faucibus. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nam cursus varius tortor, vitae sodales elit lacinia sit amet. In posuere lacus eros, a viverra ex tristique ac. Mauris et lectus est. Aliquam nec cursus nibh, consequat blandit massa. Vestibulum molestie, nunc ac semper consectetur, mauris ex sodales orci, in accumsan ante justo sed augue. Nunc auctor porttitor libero, vitae lobortis diam tempus eu. Praesent suscipit faucibus nibh, eu fermentum mauris dignissim rhoncus.

diff --git a/app/views/catalog/_homepage/_language.html.erb b/app/views/catalog/_homepage/_language.html.erb new file mode 100644 index 0000000..695b50d --- /dev/null +++ b/app/views/catalog/_homepage/_language.html.erb @@ -0,0 +1,9 @@ +
+
+

by language

+ <%= safe_join(facets_from_request(['language']).map do |display_facet| %> + <%= render_facet_limit(display_facet, {:layout => 'catalog/_homepage/language_layout', :partial => 'catalog/_homepage/language_facet_limit'}) %> + <% end.compact, "\n") %> +
+
+ diff --git a/app/views/catalog/_homepage/_language_facet_limit.html.erb b/app/views/catalog/_homepage/_language_facet_limit.html.erb new file mode 100644 index 0000000..80e2f8c --- /dev/null +++ b/app/views/catalog/_homepage/_language_facet_limit.html.erb @@ -0,0 +1,17 @@ +
    + <% paginator = facet_paginator(facet_field, display_facet) %> + <%#= render_facet_limit_list paginator, field_name %> + + <% @response['facet_counts']['facet_fields']['language'].each_with_index do |r, i| %> + <% if i.even? && i < 9 %> + " class="btn btn-primary"> + <%= r %> + + <% end %> + <% end %> + + <% unless paginator.last_page? || params[:action] == 'facet' %> + <%= link_to t("more_#{field_name}_html", scope: 'blacklight.search.facets', default: :more_html, field_name: facet_field.label), + search_facet_url(id: field_name), class: 'btn btn-primary-outline more_facets_link' %> + <% end %> +
diff --git a/app/views/catalog/_homepage/_language_layout.html.erb b/app/views/catalog/_homepage/_language_layout.html.erb new file mode 100644 index 0000000..37f0bdd --- /dev/null +++ b/app/views/catalog/_homepage/_language_layout.html.erb @@ -0,0 +1 @@ +<%= yield %> diff --git a/app/views/catalog/_homepage/_repository.html.erb b/app/views/catalog/_homepage/_repository.html.erb new file mode 100644 index 0000000..17ed5ea --- /dev/null +++ b/app/views/catalog/_homepage/_repository.html.erb @@ -0,0 +1,23 @@ +
+
+

by repository

+ <% @response['facet_counts']['facet_fields']['collection'].each_with_index do |r, i| %> + <% if i.even? %> + <% case %> + <% when r.include?('Stanford') %> + <% fname = 'stanford.png' %> + <% when r.include?('Parker') %> + <% fname = 'parker.png' %> + <% when r.include?('Walter') %> + <% fname = 'walter.png' %> + <% else %> + <% fname = 'other.png' %> + <% end %> + " class="btn btn-secondary"> + <%= image_tag(fname) %> + <%= r %> + + <% end %> + <% end %> +
+
\ No newline at end of file diff --git a/app/views/catalog/homepage.html.erb b/app/views/catalog/homepage.html.erb new file mode 100644 index 0000000..bf91770 --- /dev/null +++ b/app/views/catalog/homepage.html.erb @@ -0,0 +1,5 @@ +
+ <%# if there are no input/search related params, display the "home" partial -%> + <%= render 'catalog/_homepage/home' %> + <%= render 'shared/sitelinks_search_box' %> +
diff --git a/app/views/layouts/homepage.html.erb b/app/views/layouts/homepage.html.erb new file mode 100644 index 0000000..b7ddfda --- /dev/null +++ b/app/views/layouts/homepage.html.erb @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + <%= render_page_title %> + <%= opensearch_description_tag application_name, opensearch_catalog_url(:format => 'xml') %> + <%= favicon_link_tag 'favicon.ico' %> + <%= stylesheet_link_tag "application", media: "all" %> + <%= javascript_include_tag "application" %> + <%= csrf_meta_tags %> + <%= content_for(:head) %> + + + + + + + <%= render :partial => 'shared/homepage_header_navbar' %> + + <%= render partial: 'shared/ajax_modal' %> + +
+ <%= content_tag :h1, application_name, class: 'sr-only application-heading' %> + + <%= render :partial=>'/flash_msg', layout: 'shared/flash_messages' %> + +
+ <%= yield %> +
+
+ + <%= render :partial => 'shared/footer' %> + + diff --git a/app/views/shared/_homepage_header_navbar.html.erb b/app/views/shared/_homepage_header_navbar.html.erb new file mode 100644 index 0000000..2117e60 --- /dev/null +++ b/app/views/shared/_homepage_header_navbar.html.erb @@ -0,0 +1,18 @@ + + diff --git a/config/application.rb b/config/application.rb index 4e9b788..c7a2722 100644 --- a/config/application.rb +++ b/config/application.rb @@ -23,6 +23,6 @@ class Application < Rails::Application # Do not swallow errors in after_commit/after_rollback callbacks. config.active_record.raise_in_transactional_callbacks = true - WebMock.disable! if Rails.env.test? + WebMock.disable! if Rails.env.test? end end diff --git a/config/locales/blacklight.en.yml b/config/locales/blacklight.en.yml index ff834b2..31566f9 100644 --- a/config/locales/blacklight.en.yml +++ b/config/locales/blacklight.en.yml @@ -1,3 +1,5 @@ en: blacklight: - application_name: 'Blacklight' \ No newline at end of file + application_name: 'Colligo' + range_limit: + submit_limit: 'Apply range' diff --git a/config/solr_configs/solrconfig.xml b/config/solr_configs/solrconfig.xml index 141cd94..85ee0b3 100644 --- a/config/solr_configs/solrconfig.xml +++ b/config/solr_configs/solrconfig.xml @@ -204,121 +204,6 @@ collection_search^2 all_search^2 - - - title_exact_search^350 body_chars_exact_search^350 - title_unstem_search^100 body_chars_unstem_search^100 - title_search^75 body_chars_search^75 - subtitle_unstem_search^75 - subtitle_search^50 - title_alternate_unstem_search^50 - title_alternate_search^20 - title_other_unstem_search^20 - title_other_search^10 - - - title_exact_search^1750 body_chars_exact_search^1750 - title_unstem_search^500 body_chars_unstem_search^500 - title_search^375 body_chars_search^375 - subtitle_unstem_search^375 - subtitle_search^250 - title_alternate_unstem_search^250 - title_alternate_search^100 - title_other_unstem_search^100 - title_other_search^50 - - - title_search^300 body_chars_search^300 - subtitle_search^225 - title_alternate_search^150 - title_other_search^60 - - - title_search^200 body_chars_search^200 - subtitle_search^150 - title_alternate_search^100 - title_other_search^40 - - - - personal_authors_unstem_search^20 - personal_authors_search^5 - corporate_authors_unstem_search^10 - corporate_authors_search^2 - authors_all_unstem_search^2 - authors_all_search - - - personal_authors_search^100 - corporate_authors_search^50 - authors_all_search^10 - - - personal_authors_search^60 - corporate_authors_search^30 - authors_all_search^5 - - - personal_authors_search^40 - corporate_authors_search^20 - authors_all_search^2 - - - - topic_unstem_search^50 - topic_search^30 - geographic_unstem_search^30 - geographic_search^20 - era_unstem_search^20 - era_search^10 - subject_other_unstem_search^10 - subject_other_search^5 - subject_all_unstem_search^2 - subject_all_search - - - topic_unstem_search^250 - topic_search^150 - geographic_unstem_search^150 - geographic_search^100 - era_unstem_search^100 - era_search^50 - subject_other_unstem_search^25 - subject_other_search^25 - subject_all_unstem_search^10 - subject_all_search^5 - - - topic_search^150 - subject_all_search^75 - - - topic_search^100 - subject_all_search^50 - - - - - id - druid - - - - - abstract_unstem_search^10 - abstract_search - - - abstract_unstem_search^20 - abstract_search^5 - - - abstract_search^3 - - - abstract_search^2 - - true 1 21 @@ -415,78 +300,181 @@ 1 - - - + + - lucene + edismax explicit - score desc, title_sort asc - text + + score desc, pub_date_sort desc, title_sort asc + 20 + *:* + 6<-1 6<90% + 1 + 0 + 0.01 + false + + all_search AND - 1 - - 1 - 3 - 0.01 + + title_exact_search^1000 body_chars_exact_search^1000 + title_unstem_search^500 body_chars_unstem_search^500 + title_search^75 body_chars_search^75 + subtitle_unstem_search^75 + subtitle_search^75 + title_alternate_unstem_search^50 + title_alternate_search^20 + title_other_search^20 + title_other_unstem_search^20 + + personal_authors_unstem_search^25 + personal_authors_search^20 + corporate_authors_unstem_search^20 + corporate_authors_search^10 + authors_all_unstem_search^10 + authors_all_search^5 + + topic_unstem_search^50 + topic_search^20 + geographic_unstem_search^20 + geographic_search^15 + era_unstem_search^15 + era_search^10 + subject_other_unstem_search^10 + subject_other_search^5 + subject_all_unstem_search^5 + subject_all_search^2 + + manuscript_unstem_search^5 + manuscript_search^2 + abstract_unstem_search^5 + abstract_search^2 + + pub_date^2 + id + collection_search + all_unstem_search^5 + all_search + + + title_exact_search^5000 body_chars_exact_search^5000 + title_unstem_search^2500 body_chars_unstem_search^2500 + title_search^375 body_chars_search^375 + subtitle_unstem_search^375 + subtitle_search^250 + title_alternate_unstem_search^250 + title_alternate_search^100 + title_other_unstem_search^100 + title_other_search^75 - - - personal_authors_unstem_search^200 + personal_authors_unstem_search^125 + personal_authors_search^100 corporate_authors_unstem_search^100 + corporate_authors_search^50 authors_all_unstem_search^50 - authors_all_search^20 - - - personal_authors_unstem_search^2000 - corporate_authors_unstem_search^500 - authors_all_unstem_search^300 - authors_all_search^200 - + authors_all_search^25 - - - title_unstem_search^50000 body_chars_unstem_search^50000 - subtitle_unstem_search^25000 - title_alternate_unstem_search^10000 - title_other_unstem_search^5000 - title_search^2500 - - - title_unstem_search^500000 body_chars_unstem_search^50000 - subtitle_unstem_search^250000 - title_alternate_unstem_search^100000 - title_other_unstem_search^50000 - title_search^25000 - + topic_unstem_search^250 + topic_search^150 + geographic_unstem_search^150 + geographic_search^100 + era_unstem_search^100 + era_search^50 + subject_other_unstem_search^50 + subject_other_search^25 + subject_all_unstem_search^25 + subject_all_search^10 + + manuscript_unstem_search^25 + manuscript_search^10 + abstract_unstem_search^25 + abstract_search^10 - - - topic_unstem_search^200 - geographic_unstem_search^125 - era_unstem_search^125 - subject_all_unstem_search^100 - topic_facet^100 + pub_date^10 + collection_search^5 + all_unstem_search^25 + all_search^5 - - topic_unstem_search^2000 - geographic_unstem_search^1250 - era_unstem_search^1000 - subject_all_unstem_search^750 - topic_facet^500 - subject_all_facet^100 + + title_search^1500 body_chars_search^1500 + subtitle_search^225 + title_alternate_search^150 + title_other_search^60 + + personal_authors_search^75 + corporate_authors_search^60 + authors_all_search^30 + + topic_search^150 + geographic_search^60 + era_search^50 + subject_other_search^30 + subject_all_search^15 + + manuscript_search^7.5 + abstract_search^7.5 + collection_search^3 + all_search^3 + + title_search^1000 body_chars_search^1000 + subtitle_search^150 + title_alternate_search^100 + title_other_search^40 + + personal_authors_search^50 + corporate_authors_search^40 + authors_all_search^20 - - droid + topic_search^100 + geographic_search^40 + era_search^30 + subject_other_search^20 + subject_all_search^10 - - text - text^10 + manuscript_search^5 + abstract_search^5 + collection_search^2 + all_search^2 + + true + 1 + 21 + genre_facet + enum + type_of_resource_facet + personal_authors_facet + corporate_authors_facet + authors_all_facet + physical_description_form_facet + physical_description_media_type_facet + physical_location_display + language + enum + folio + enum + topic_facet + geographic_facet + era_facet + subject_all_facet + format + model + collection + enum + format + 20 + enum + pub_date_t + enum + druid + enum + manuscript_facet + enum - + score, id, abstract_display, access_condition_display, @@ -525,49 +513,446 @@ manuscript_display, folio + + + model:Manuscript + + - true - 1 - 10 - type_of_resource_facet - personal_authors_facet - corporate_authors_facet - authors_all_facet - physical_description_form_facet - physical_description_media_type_facet - physical_location_display - language - enum - folio - enum - topic_facet - geographic_facet - era_facet - subject_all_facet - format - model - collection - enum - format - 20 - enum - pub_date_t - enum - druid - enum - manuscript_facet - enum - - true - subject - true - true - false - 5 + + + edismax + explicit + + score desc, pub_date_sort desc, title_sort asc + 20 + *:* + 6<-1 6<90% + 1 + 0 + 0.01 + false + + all_search + AND + + + title_exact_search^1000 body_chars_exact_search^1000 + title_unstem_search^500 body_chars_unstem_search^500 + title_search^75 body_chars_search^75 + subtitle_unstem_search^75 + subtitle_search^75 + title_alternate_unstem_search^50 + title_alternate_search^20 + title_other_search^20 + title_other_unstem_search^20 + + personal_authors_unstem_search^25 + personal_authors_search^20 + corporate_authors_unstem_search^20 + corporate_authors_search^10 + authors_all_unstem_search^10 + authors_all_search^5 + + topic_unstem_search^50 + topic_search^20 + geographic_unstem_search^20 + geographic_search^15 + era_unstem_search^15 + era_search^10 + subject_other_unstem_search^10 + subject_other_search^5 + subject_all_unstem_search^5 + subject_all_search^2 + + manuscript_unstem_search^5 + manuscript_search^2 + abstract_unstem_search^5 + abstract_search^2 + + pub_date^2 + id + collection_search + all_unstem_search^5 + all_search + + + title_exact_search^5000 body_chars_exact_search^5000 + title_unstem_search^2500 body_chars_unstem_search^2500 + title_search^375 body_chars_search^375 + subtitle_unstem_search^375 + subtitle_search^250 + title_alternate_unstem_search^250 + title_alternate_search^100 + title_other_unstem_search^100 + title_other_search^75 + + personal_authors_unstem_search^125 + personal_authors_search^100 + corporate_authors_unstem_search^100 + corporate_authors_search^50 + authors_all_unstem_search^50 + authors_all_search^25 + + topic_unstem_search^250 + topic_search^150 + geographic_unstem_search^150 + geographic_search^100 + era_unstem_search^100 + era_search^50 + subject_other_unstem_search^50 + subject_other_search^25 + subject_all_unstem_search^25 + subject_all_search^10 + + manuscript_unstem_search^25 + manuscript_search^10 + abstract_unstem_search^25 + abstract_search^10 + + pub_date^10 + collection_search^5 + all_unstem_search^25 + all_search^5 + + + title_search^1500 body_chars_search^1500 + subtitle_search^225 + title_alternate_search^150 + title_other_search^60 + + personal_authors_search^75 + corporate_authors_search^60 + authors_all_search^30 + + topic_search^150 + geographic_search^60 + era_search^50 + subject_other_search^30 + subject_all_search^15 + + manuscript_search^7.5 + abstract_search^7.5 + collection_search^3 + all_search^3 + + + title_search^1000 body_chars_search^1000 + subtitle_search^150 + title_alternate_search^100 + title_other_search^40 + + personal_authors_search^50 + corporate_authors_search^40 + authors_all_search^20 + + topic_search^100 + geographic_search^40 + era_search^30 + subject_other_search^20 + subject_all_search^10 + + manuscript_search^5 + abstract_search^5 + collection_search^2 + all_search^2 + + true + 1 + 21 + genre_facet + enum + type_of_resource_facet + personal_authors_facet + corporate_authors_facet + authors_all_facet + physical_description_form_facet + physical_description_media_type_facet + physical_location_display + language + enum + folio + enum + topic_facet + geographic_facet + era_facet + subject_all_facet + format + model + collection + enum + format + 20 + enum + pub_date_t + enum + druid + enum + manuscript_facet + enum + + + score, + id, + abstract_display, + access_condition_display, + type_of_resource_display, + personal_authors_display, + corporate_authors_display, + authors_all_display, + title_display, + subtitle_display, + title_alternate_display, + title_other_display, + language, + physical_description_extent_display, + physical_description_form_display, + physical_description_media_type_display, + physical_location_display, + relateditem_title_display, + pub_date_display, + topic_display, + geographic_display, + era_display, + subject_other_display, + subject_all_display, + format, + model, + url_sfx, + manifest_urls, + collection, + druid, + img_info, + target_url, + target_type, + body_url, + body_type, + body_chars_display, + manuscript_display, + folio + + + + model:Annotation + + + + + + edismax + explicit + + score desc, pub_date_sort desc, title_sort asc + 20 + *:* + 6<-1 6<90% + 1 + 0 + 0.01 + false + + all_search + AND + + + title_exact_search^1000 body_chars_exact_search^1000 + title_unstem_search^500 body_chars_unstem_search^500 + title_search^75 body_chars_search^75 + subtitle_unstem_search^75 + subtitle_search^75 + title_alternate_unstem_search^50 + title_alternate_search^20 + title_other_search^20 + title_other_unstem_search^20 + + personal_authors_unstem_search^25 + personal_authors_search^20 + corporate_authors_unstem_search^20 + corporate_authors_search^10 + authors_all_unstem_search^10 + authors_all_search^5 + + topic_unstem_search^50 + topic_search^20 + geographic_unstem_search^20 + geographic_search^15 + era_unstem_search^15 + era_search^10 + subject_other_unstem_search^10 + subject_other_search^5 + subject_all_unstem_search^5 + subject_all_search^2 + + manuscript_unstem_search^5 + manuscript_search^2 + abstract_unstem_search^5 + abstract_search^2 + + pub_date^2 + id + collection_search + all_unstem_search^5 + all_search + + + title_exact_search^5000 body_chars_exact_search^5000 + title_unstem_search^2500 body_chars_unstem_search^2500 + title_search^375 body_chars_search^375 + subtitle_unstem_search^375 + subtitle_search^250 + title_alternate_unstem_search^250 + title_alternate_search^100 + title_other_unstem_search^100 + title_other_search^75 + + personal_authors_unstem_search^125 + personal_authors_search^100 + corporate_authors_unstem_search^100 + corporate_authors_search^50 + authors_all_unstem_search^50 + authors_all_search^25 + + topic_unstem_search^250 + topic_search^150 + geographic_unstem_search^150 + geographic_search^100 + era_unstem_search^100 + era_search^50 + subject_other_unstem_search^50 + subject_other_search^25 + subject_all_unstem_search^25 + subject_all_search^10 + + manuscript_unstem_search^25 + manuscript_search^10 + abstract_unstem_search^25 + abstract_search^10 + + pub_date^10 + collection_search^5 + all_unstem_search^25 + all_search^5 + + + title_search^1500 body_chars_search^1500 + subtitle_search^225 + title_alternate_search^150 + title_other_search^60 + + personal_authors_search^75 + corporate_authors_search^60 + authors_all_search^30 + + topic_search^150 + geographic_search^60 + era_search^50 + subject_other_search^30 + subject_all_search^15 + + manuscript_search^7.5 + abstract_search^7.5 + collection_search^3 + all_search^3 + + + title_search^1000 body_chars_search^1000 + subtitle_search^150 + title_alternate_search^100 + title_other_search^40 + + personal_authors_search^50 + corporate_authors_search^40 + authors_all_search^20 + + topic_search^100 + geographic_search^40 + era_search^30 + subject_other_search^20 + subject_all_search^10 + + manuscript_search^5 + abstract_search^5 + collection_search^2 + all_search^2 + + true + 1 + 21 + genre_facet + enum + type_of_resource_facet + personal_authors_facet + corporate_authors_facet + authors_all_facet + physical_description_form_facet + physical_description_media_type_facet + physical_location_display + language + enum + folio + enum + topic_facet + geographic_facet + era_facet + subject_all_facet + format + model + collection + enum + format + 20 + enum + pub_date_t + enum + druid + enum + manuscript_facet + enum + + + score, + id, + abstract_display, + access_condition_display, + type_of_resource_display, + personal_authors_display, + corporate_authors_display, + authors_all_display, + title_display, + subtitle_display, + title_alternate_display, + title_other_display, + language, + physical_description_extent_display, + physical_description_form_display, + physical_description_media_type_display, + physical_location_display, + relateditem_title_display, + pub_date_display, + topic_display, + geographic_display, + era_display, + subject_other_display, + subject_all_display, + format, + model, + url_sfx, + manifest_urls, + collection, + druid, + img_info, + target_url, + target_type, + body_url, + body_type, + body_chars_display, + manuscript_display, + folio + + + + model:Transcription - - spellcheck -