From cc0d5c38bcc4051f57e01cd2f19f908b5379d049 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Tue, 14 Mar 2017 15:48:05 -0700 Subject: [PATCH 1/5] Allow specs to pass using select2 3.5.4 Select2 3.5.2 changed the way the hidden select element is hidden. Instead of just being offscreen it is now actually hidden (display: none). This affects how capybara treats the original select element. --- .../features/admin/configuration/store_spec.rb | 6 +++--- .../features/admin/orders/customer_details_spec.rb | 14 +++++++++----- backend/spec/features/admin/stock_transfer_spec.rb | 4 ++-- 3 files changed, 14 insertions(+), 10 deletions(-) diff --git a/backend/spec/features/admin/configuration/store_spec.rb b/backend/spec/features/admin/configuration/store_spec.rb index 179f8dfa52c..3e88f76403f 100644 --- a/backend/spec/features/admin/configuration/store_spec.rb +++ b/backend/spec/features/admin/configuration/store_spec.rb @@ -38,13 +38,13 @@ end it "should be able to update the default cart tax country" do - expect(page).to have_select("Tax Country for Empty Carts", selected: "No taxes on carts without address") + expect(page).to have_select('Tax Country for Empty Carts', selected: 'No taxes on carts without address', visible: false) - select "Germany", from: "Tax Country for Empty Carts" + select "Germany", from: "Tax Country for Empty Carts", visible: false click_button "Update" expect(page).to have_content("has been successfully updated") - expect(page).to have_select("Tax Country for Empty Carts", selected: "Germany") + expect(page).to have_select("Tax Country for Empty Carts", selected: "Germany", visible: false) end end diff --git a/backend/spec/features/admin/orders/customer_details_spec.rb b/backend/spec/features/admin/orders/customer_details_spec.rb index ee650cb9784..ec6e28455c5 100644 --- a/backend/spec/features/admin/orders/customer_details_spec.rb +++ b/backend/spec/features/admin/orders/customer_details_spec.rb @@ -42,8 +42,8 @@ expect(page).to have_field("Street Address (cont'd)", with: user.bill_address.address2) expect(page).to have_field('City', with: user.bill_address.city) expect(page).to have_field('Zip Code', with: user.bill_address.zipcode) - expect(page).to have_field('Country', with: user.bill_address.country_id) - expect(page).to have_field('State', with: user.bill_address.state_id) + expect(page).to have_select('Country', selected: "United States of America", visible: false) + expect(page).to have_select('State', selected: user.bill_address.state.name, visible: false) expect(page).to have_field('Phone', with: user.bill_address.phone) click_button "Update" expect(Spree::Order.last.user).not_to be_nil @@ -137,7 +137,7 @@ it "sets default country when displaying form" do click_link "Customer" - expect(page).to have_field("order_bill_address_attributes_country_id", with: brazil.id) + expect(page).to have_field("order_bill_address_attributes_country_id", with: brazil.id, visible: false) end end @@ -158,13 +158,17 @@ fill_in "order_ship_address_attributes_city", with: "Bethesda" fill_in "order_ship_address_attributes_zipcode", with: "20170" - page.select('Alabama', from: 'order_ship_address_attributes_state_id') + select_state('Alabama', 'ship') fill_in "order_ship_address_attributes_phone", with: "123-456-7890" click_button "Update" end end end + def select_state(state_name, kind = "bill") + targetted_select2 state_name, from: "#s2id_order_#{kind}_address_attributes_state_id" + end + def fill_in_address(kind = "bill") fill_in "First Name", with: "John 99" fill_in "Last Name", with: "Doe" @@ -173,7 +177,7 @@ def fill_in_address(kind = "bill") fill_in "Street Address (cont'd)", with: "#101" fill_in "City", with: "Bethesda" fill_in "Zip Code", with: "20170" - targetted_select2 "Alabama", from: "#s2id_order_#{kind}_address_attributes_state_id" + select_state("Alabama", kind) fill_in "Phone", with: "123-456-7890" end end diff --git a/backend/spec/features/admin/stock_transfer_spec.rb b/backend/spec/features/admin/stock_transfer_spec.rb index 57f9f9eaaf4..4c7db723534 100644 --- a/backend/spec/features/admin/stock_transfer_spec.rb +++ b/backend/spec/features/admin/stock_transfer_spec.rb @@ -16,13 +16,13 @@ create(:stock_location, name: 'SF') visit spree.new_admin_stock_transfer_path - select "SF", from: 'stock_transfer[source_location_id]' + select "SF", from: 'stock_transfer[source_location_id]', visible: false fill_in 'stock_transfer_description', with: description click_button 'Continue' expect(page).to have_field('stock_transfer_description', with: description) - select "NY", from: 'stock_transfer[destination_location_id]' + select "NY", from: 'stock_transfer[destination_location_id]', visible: false within "form.edit_stock_transfer" do page.find('button').trigger('click') end From 28c6036857b397fae00af6afc21c08ad1aa871b4 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Tue, 14 Mar 2017 13:44:08 -0700 Subject: [PATCH 2/5] Add vendored select2 3.5.4 --- .../images/solidus_admin/select2-spinner.gif | Bin 0 -> 1849 bytes .../assets/images/solidus_admin/select2.png | Bin 0 -> 613 bytes .../assets/images/solidus_admin/select2x2.png | Bin 0 -> 845 bytes .../javascripts/solidus_admin/select2.js | 3729 +++++++++++++++++ .../select2_locales/select2_locale_ar.js | 19 + .../select2_locales/select2_locale_az.js | 20 + .../select2_locales/select2_locale_bg.js | 20 + .../select2_locales/select2_locale_ca.js | 19 + .../select2_locales/select2_locale_cs.js | 51 + .../select2_locales/select2_locale_da.js | 19 + .../select2_locales/select2_locale_de.js | 18 + .../select2_locales/select2_locale_el.js | 19 + .../select2_locales/select2_locale_es.js | 19 + .../select2_locales/select2_locale_et.js | 19 + .../select2_locales/select2_locale_eu.js | 45 + .../select2_locales/select2_locale_fa.js | 21 + .../select2_locales/select2_locale_fi.js | 30 + .../select2_locales/select2_locale_fr.js | 18 + .../select2_locales/select2_locale_gl.js | 45 + .../select2_locales/select2_locale_he.js | 19 + .../select2_locales/select2_locale_hr.js | 24 + .../select2_locales/select2_locale_hu.js | 17 + .../select2_locales/select2_locale_id.js | 21 + .../select2_locales/select2_locale_is.js | 17 + .../select2_locales/select2_locale_it.js | 17 + .../select2_locales/select2_locale_ja.js | 17 + .../select2_locales/select2_locale_ka.js | 19 + .../select2_locales/select2_locale_ko.js | 19 + .../select2_locales/select2_locale_lt.js | 26 + .../select2_locales/select2_locale_lv.js | 19 + .../select2_locales/select2_locale_mk.js | 19 + .../select2_locales/select2_locale_ms.js | 21 + .../select2_locales/select2_locale_nb.js | 22 + .../select2_locales/select2_locale_nl.js | 17 + .../select2_locales/select2_locale_pl.js | 54 + .../select2_locales/select2_locale_pt-BR.js | 18 + .../select2_locales/select2_locale_pt-PT.js | 17 + .../select2_locales/select2_locale_ro.js | 17 + .../select2_locales/select2_locale_rs.js | 19 + .../select2_locales/select2_locale_ru.js | 23 + .../select2_locales/select2_locale_sk.js | 50 + .../select2_locales/select2_locale_sv.js | 19 + .../select2_locales/select2_locale_th.js | 19 + .../select2_locales/select2_locale_tr.js | 20 + .../select2_locales/select2_locale_ug-CN.js | 16 + .../select2_locales/select2_locale_uk.js | 25 + .../select2_locales/select2_locale_vi.js | 20 + .../select2_locales/select2_locale_zh-CN.js | 16 + .../select2_locales/select2_locale_zh-TW.js | 16 + .../stylesheets/solidus_admin/select2.css | 692 +++ 50 files changed, 5446 insertions(+) create mode 100644 backend/vendor/assets/images/solidus_admin/select2-spinner.gif create mode 100644 backend/vendor/assets/images/solidus_admin/select2.png create mode 100644 backend/vendor/assets/images/solidus_admin/select2x2.png create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ar.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_az.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_bg.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ca.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_cs.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_da.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_de.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_el.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_es.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_et.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_eu.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_fa.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_fi.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_fr.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_gl.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_he.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_hr.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_hu.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_id.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_is.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_it.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ja.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ka.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ko.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_lt.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_lv.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_mk.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ms.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_nb.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_nl.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_pl.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_pt-BR.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_pt-PT.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ro.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_rs.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ru.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_sk.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_sv.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_th.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_tr.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ug-CN.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_uk.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_vi.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_zh-CN.js create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_zh-TW.js create mode 100644 backend/vendor/assets/stylesheets/solidus_admin/select2.css diff --git a/backend/vendor/assets/images/solidus_admin/select2-spinner.gif b/backend/vendor/assets/images/solidus_admin/select2-spinner.gif new file mode 100644 index 0000000000000000000000000000000000000000..5b33f7e54f4e55b6b8774d86d96895db9af044b4 GIT binary patch literal 1849 zcma*odr(tX9tZI2z31lM+(&YVk%mZ}5P~KlG2s=WSbGzm0!x7^P##Mnh7t-jP!X0Q zk_SQ}Po-L1tlDK;6l?(>v)e5ZBQx4|Y-Q?nr@Px3?9h(3ZWr3^tj=`TP57gKr87N$ zp2wWee1GRRCwo_xahnw)5cxNPJbCg2L6DV|6`#+yw6v6!mDS$f9-JvFD^n;GQ&UrZ zzh5jCkByB101O60U0q#p_1BM>Cv-vP?&s4@g_((4_1L=L$(a91)0=J91Gas#R{McE znYG^9*0A5YZ>#;~+Wkn(W5B0^yELIYLP!K}mB~<)AM@1&nqekynuaEGqPrzoH|KodRXJy)%+w_fu3nE5>@Bd_b zqC$EQ;{c`T&?EsNO|igL9gC7Ygxv?aQUEXMq?~>wg{EyW;VcJ37CUF#HjrT=KQO_* zS>M9yydXk18D(+QDJ1>r);Lav_uYKp$T?4vr{Q$lTo&pKv^?(>L-)G2*lwH!Ah7k? z7oH<8h-(KTKt5V6$8gF)C7Io&P5=SjTh)=zV=E2EUhQZP##L8S{d%UK>>+y82>+FV+#^BzW7u3F)Bb>=lYQ%%j`F>ASe zo*cw@V#u6T`A2He;70mR(V&iV&-7{qP~=SRf&jm9-T{*ZeZ}$rd0#6c&fLG^xJcf5 z+p<`wJYgW+_s*V{uI$nMB;%8`S_3>PfGOj3Rq}@Cx^+j?rk92fANSFDBYnOqQ>Vdj z)(|$AhP4t&Lb=Gvo2#3Gl%9<=Gv`Mz?Po@P4iLF!x}GUWJICDlFk-hS^Whyh7x~VH z@0vD1>HYD4&e+~yzS*-sFR{9`{QEEZO1zg7>R&7cHts-6j!xHVdA8eI+ZlVzd%`es zJT@$#GX(gvCJ1oJN%yLBK}{V=V;seo;!w|Yte!W1%5qLNFWqvZW>h&IiH+oPT=b@E zPhGzv5=(Un*X>v`>%8h_nj^NdYcE6NHS_ifkCV$*D)Tqrbu`s;<=t<4 zAHNqNV?6(g<1PY-w@#I-WYFViz?9TrkMr)u0g`O`u|>T;k|2sV*YF^punvT;$SuTy{j3Gv)yqD!R_CF>yR)MzmmYS5v+~R zXAdD%ng9?df;wd8GxR#%3O+gz};Vo;)sK%Bj-q>Oq%R7JU-KD?vYu>#2UjaDo z&8$>5xW~?KPD_#XFToU1hIb*VOMidUr6iYiO0N|i-7s`T8!cFT`rN!^1Pt78J93i6 z5HI1wIM$94m{3SLDvISDe6$ZG1;eq_D9RTaaC>=cO{@Bs>$IlPCPJJ$h$)-3vzNUQ6OsN#_zWxey!_9%hxwH2_dEJi=yY|1c7nDm2_Lm!Cof8-R_+9UkS zcBE(o47yE)oMR(Q=dp1a2wTX5KvvGyLqlWTa7V&!A*|w|)ax~1_~aJ0=_Lilg*0iQk7#ZD EAHN$8j{pDw literal 0 HcmV?d00001 diff --git a/backend/vendor/assets/images/solidus_admin/select2.png b/backend/vendor/assets/images/solidus_admin/select2.png new file mode 100644 index 0000000000000000000000000000000000000000..1d804ffb99699b9e030f1010314de0970b5a000d GIT binary patch literal 613 zcmV-r0-F7aP)#WY!I$JQV$)A5aAS1BM||2XVJl=+L1^1S1H% zM-&lx?NZpUrHhn>fk<>POqf2sh40}xxGZfc+t+#Eb(qHy9_3*1(U%t9t)QDnI#YAL(|ACV(>)>6WD-t!8tutHkdb^#3`HzoJG3A2@T`% zA|K@o*b!`R#(7)PWrMFn2))Ca3MR4(zaT`Zr61*kZK5NPnZwQszxh$fyv3?&4c>$q z2m=+yc0dRXRAsPDxF6sD;@rK4JGdR_``1S~o6Xi@2&aR6hcSrEp9HVRzEqVDqBn<1%hR=D4e1f^ra^A|34Cjc=Gny{F(o#MrvPYgZuTJOz(n)-F<| zj()qR;C={)N<0RRvDZ^@6ND+W*}gh-Lip(MDt!(zMSO)!j2j+*hxgzC-e3$@(O2p* zu;+gddm(cZwXTCLx*Ky4THOa*^b^F`woveIeCK^0aR|TJ00000NkvXXu0mjfA#WC6 literal 0 HcmV?d00001 diff --git a/backend/vendor/assets/images/solidus_admin/select2x2.png b/backend/vendor/assets/images/solidus_admin/select2x2.png new file mode 100644 index 0000000000000000000000000000000000000000..4bdd5c961d452c49dfa0789c2c7ffb82c238fc24 GIT binary patch literal 845 zcmV-T1G4;yP)upQ6WKflyv?C|ADVW!U!t`EpA+x zB)5#EjWk-_X77YJZtQo`E0SF)^1bZr%)B7Cd`*OK*r z5WG-7e-R9G9^69ksDt29&oyHqxPSt|-S>xi3%PTd+GjY+BGF|nWC(7D-sd(kxqd9~ zS@2YF5vB+>dP8+$l^{oO3-lEWiGA*QIU)Wds#9M6RZ9N zcQ4y4)xqQOxD=vwu%7cz1nY#$lT&y8HCmkWgpwQP#3dhnYj9|2aS_R}IUF_^6s#$= zTm%~>A#oM?KIg$kh=<`gJkeoHa2LrulVy$Yx+N_0R3$4I!R*0677f(FKqm`2_o4~W z0h}fQZ`lC^1A+m;fM7uI(R1`S0KtG@KrkQ}5DW+&@cTnDVIow56KciMk7a899t0bC zC1KI{TsMe5NAR%GD_5`B-@ad4k~K3SO%H z_M31|`HV?E6)u$E3c&*<*n20+V@mRCop>R5;DWuZCmjSo7p@R&OYl^@G= 112 && k <= 123; + } + }, + MEASURE_SCROLLBAR_TEMPLATE = "
", + + 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"}; + + $document = $(document); + + nextUid=(function() { var counter=1; return function() { return counter++; }; }()); + + + function reinsertElement(element) { + var placeholder = $(document.createTextNode('')); + + element.before(placeholder); + placeholder.before(element); + placeholder.remove(); + } + + function stripDiacritics(str) { + // Used 'uni range + named function' from http://jsperf.com/diacritics/18 + function match(a) { + return DIACRITICS[a] || a; + } + + return str.replace(/[^\u0000-\u007E]/g, match); + } + + function indexOf(value, array) { + var i = 0, l = array.length; + for (; i < l; i = i + 1) { + if (equal(value, array[i])) return i; + } + return -1; + } + + function measureScrollbar () { + var $template = $( MEASURE_SCROLLBAR_TEMPLATE ); + $template.appendTo(document.body); + + var dim = { + width: $template.width() - $template[0].clientWidth, + height: $template.height() - $template[0].clientHeight + }; + $template.remove(); + + return dim; + } + + /** + * Compares equality of a and b + * @param a + * @param b + */ + function equal(a, b) { + if (a === b) return true; + if (a === undefined || b === undefined) return false; + if (a === null || b === null) return false; + // Check whether 'a' or 'b' is a string (primitive or object). + // The concatenation of an empty string (+'') converts its argument to a string's primitive. + if (a.constructor === String) return a+'' === b+''; // a+'' - in case 'a' is a String object + if (b.constructor === String) return b+'' === a+''; // b+'' - in case 'b' is a String object + return false; + } + + /** + * Splits the string into an array of values, transforming each value. An empty array is returned for nulls or empty + * strings + * @param string + * @param separator + */ + function splitVal(string, separator, transform) { + var val, i, l; + if (string === null || string.length < 1) return []; + val = string.split(separator); + for (i = 0, l = val.length; i < l; i = i + 1) val[i] = transform(val[i]); + return val; + } + + function getSideBorderPadding(element) { + return element.outerWidth(false) - element.width(); + } + + function installKeyUpChangeEvent(element) { + var key="keyup-change-value"; + element.on("keydown", function () { + if ($.data(element, key) === undefined) { + $.data(element, key, element.val()); + } + }); + element.on("keyup", function () { + var val= $.data(element, key); + if (val !== undefined && element.val() !== val) { + $.removeData(element, key); + element.trigger("keyup-change"); + } + }); + } + + + /** + * filters mouse events so an event is fired only if the mouse moved. + * + * filters out mouse events that occur when mouse is stationary but + * the elements under the pointer are scrolled. + */ + function installFilteredMouseMove(element) { + element.on("mousemove", function (e) { + var lastpos = lastMousePosition; + if (lastpos === undefined || lastpos.x !== e.pageX || lastpos.y !== e.pageY) { + $(e.target).trigger("mousemove-filtered", e); + } + }); + } + + /** + * Debounces a function. Returns a function that calls the original fn function only if no invocations have been made + * within the last quietMillis milliseconds. + * + * @param quietMillis number of milliseconds to wait before invoking fn + * @param fn function to be debounced + * @param ctx object to be used as this reference within fn + * @return debounced version of fn + */ + function debounce(quietMillis, fn, ctx) { + ctx = ctx || undefined; + var timeout; + return function () { + var args = arguments; + window.clearTimeout(timeout); + timeout = window.setTimeout(function() { + fn.apply(ctx, args); + }, quietMillis); + }; + } + + function installDebouncedScroll(threshold, element) { + var notify = debounce(threshold, function (e) { element.trigger("scroll-debounced", e);}); + element.on("scroll", function (e) { + if (indexOf(e.target, element.get()) >= 0) notify(e); + }); + } + + function focus($el) { + if ($el[0] === document.activeElement) return; + + /* set the focus in a 0 timeout - that way the focus is set after the processing + of the current event has finished - which seems like the only reliable way + to set focus */ + window.setTimeout(function() { + var el=$el[0], pos=$el.val().length, range; + + $el.focus(); + + /* make sure el received focus so we do not error out when trying to manipulate the caret. + sometimes modals or others listeners may steal it after its set */ + var isVisible = (el.offsetWidth > 0 || el.offsetHeight > 0); + if (isVisible && el === document.activeElement) { + + /* after the focus is set move the caret to the end, necessary when we val() + just before setting focus */ + if(el.setSelectionRange) + { + el.setSelectionRange(pos, pos); + } + else if (el.createTextRange) { + range = el.createTextRange(); + range.collapse(false); + range.select(); + } + } + }, 0); + } + + function getCursorInfo(el) { + el = $(el)[0]; + var offset = 0; + var length = 0; + if ('selectionStart' in el) { + offset = el.selectionStart; + length = el.selectionEnd - offset; + } else if ('selection' in document) { + el.focus(); + var sel = document.selection.createRange(); + length = document.selection.createRange().text.length; + sel.moveStart('character', -el.value.length); + offset = sel.text.length - length; + } + return { offset: offset, length: length }; + } + + function killEvent(event) { + event.preventDefault(); + event.stopPropagation(); + } + function killEventImmediately(event) { + event.preventDefault(); + event.stopImmediatePropagation(); + } + + function measureTextWidth(e) { + if (!sizer){ + var style = e[0].currentStyle || window.getComputedStyle(e[0], null); + sizer = $(document.createElement("div")).css({ + position: "absolute", + left: "-10000px", + top: "-10000px", + display: "none", + fontSize: style.fontSize, + fontFamily: style.fontFamily, + fontStyle: style.fontStyle, + fontWeight: style.fontWeight, + letterSpacing: style.letterSpacing, + textTransform: style.textTransform, + whiteSpace: "nowrap" + }); + sizer.attr("class","select2-sizer"); + $(document.body).append(sizer); + } + sizer.text(e.val()); + return sizer.width(); + } + + 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+/)).each2(function() { + 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+/)).each2(function() { + if (this.indexOf("select2-") !== 0) { + adapted = adapter(this); + + if (adapted) { + replacements.push(adapted); + } + } + }); + } + + dest.attr("class", replacements.join(" ")); + } + + + function markMatch(text, term, markup, escapeMarkup) { + var match=stripDiacritics(text.toUpperCase()).indexOf(stripDiacritics(term.toUpperCase())), + tl=term.length; + + if (match<0) { + markup.push(escapeMarkup(text)); + return; + } + + markup.push(escapeMarkup(text.substring(0, match))); + markup.push(""); + markup.push(escapeMarkup(text.substring(match, match + tl))); + markup.push(""); + markup.push(escapeMarkup(text.substring(match + tl, text.length))); + } + + function defaultEscapeMarkup(markup) { + var replace_map = { + '\\': '\', + '&': '&', + '<': '<', + '>': '>', + '"': '"', + "'": ''', + "/": '/' + }; + + return String(markup).replace(/[&<>"'\/\\]/g, function (match) { + return replace_map[match]; + }); + } + + /** + * Produces an ajax-based query function + * + * @param options object containing configuration parameters + * @param options.params parameter map for the transport ajax call, can contain such options as cache, jsonpCallback, etc. see $.ajax + * @param options.transport function that will be used to execute the ajax request. must be compatible with parameters supported by $.ajax + * @param options.url url for the data + * @param options.data a function(searchTerm, pageNumber, context) that should return an object containing query string parameters for the above url. + * @param options.dataType request data type: ajax, jsonp, other datatypes supported by jQuery's $.ajax function or the transport function if specified + * @param options.quietMillis (optional) milliseconds to wait before making the ajaxRequest, helps debounce the ajax function if invoked too often + * @param options.results a function(remoteData, pageNumber, query) that converts data returned form the remote request to the format expected by Select2. + * The expected format is an object containing the following keys: + * results array of objects that will be used as choices + * more (optional) boolean indicating whether there are more results available + * Example: {results:[{id:1, text:'Red'},{id:2, text:'Blue'}], more:true} + */ + function ajax(options) { + var timeout, // current scheduled but not yet executed request + handler = null, + quietMillis = options.quietMillis || 100, + ajaxUrl = options.url, + self = this; + + return function (query) { + window.clearTimeout(timeout); + timeout = window.setTimeout(function () { + var data = options.data, // ajax data function + url = ajaxUrl, // ajax url string or function + transport = options.transport || $.fn.select2.ajaxDefaults.transport, + // deprecated - to be removed in 4.0 - use params instead + deprecated = { + type: options.type || 'GET', // set type of request (GET or POST) + cache: options.cache || false, + jsonpCallback: options.jsonpCallback||undefined, + dataType: options.dataType||"json" + }, + params = $.extend({}, $.fn.select2.ajaxDefaults.params, deprecated); + + data = data ? data.call(self, query.term, query.page, query.context) : null; + url = (typeof url === 'function') ? url.call(self, query.term, query.page, query.context) : url; + + if (handler && typeof handler.abort === "function") { handler.abort(); } + + if (options.params) { + if ($.isFunction(options.params)) { + $.extend(params, options.params.call(self)); + } else { + $.extend(params, options.params); + } + } + + $.extend(params, { + url: url, + dataType: options.dataType, + data: data, + success: function (data) { + // TODO - replace query.page with query so users have access to term, page, etc. + // added query as third paramter to keep backwards compatibility + var results = options.results(data, query.page, query); + query.callback(results); + }, + error: function(jqXHR, textStatus, errorThrown){ + var results = { + hasError: true, + jqXHR: jqXHR, + textStatus: textStatus, + errorThrown: errorThrown + }; + + query.callback(results); + } + }); + handler = transport.call(self, params); + }, quietMillis); + }; + } + + /** + * Produces a query function that works with a local array + * + * @param options object containing configuration parameters. The options parameter can either be an array or an + * object. + * + * If the array form is used it is assumed that it contains objects with 'id' and 'text' keys. + * + * If the object form is used it is assumed that it contains 'data' and 'text' keys. The 'data' key should contain + * an array of objects that will be used as choices. These objects must contain at least an 'id' key. The 'text' + * key can either be a String in which case it is expected that each element in the 'data' array has a key with the + * value of 'text' which will be used to match choices. Alternatively, text can be a function(item) that can extract + * the text. + */ + function local(options) { + var data = options, // data elements + dataText, + tmp, + text = function (item) { return ""+item.text; }; // function used to retrieve the text portion of a data item that is matched against the search + + if ($.isArray(data)) { + tmp = data; + data = { results: tmp }; + } + + if ($.isFunction(data) === false) { + tmp = data; + data = function() { return tmp; }; + } + + var dataItem = data(); + if (dataItem.text) { + text = dataItem.text; + // if text is not a function we assume it to be a key name + if (!$.isFunction(text)) { + dataText = dataItem.text; // we need to store this in a separate variable because in the next step data gets reset and data.text is no longer available + text = function (item) { return item[dataText]; }; + } + } + + return function (query) { + var t = query.term, filtered = { results: [] }, process; + if (t === "") { + query.callback(data()); + return; + } + + process = function(datum, collection) { + var group, attr; + datum = datum[0]; + if (datum.children) { + group = {}; + for (attr in datum) { + if (datum.hasOwnProperty(attr)) group[attr]=datum[attr]; + } + group.children=[]; + $(datum.children).each2(function(i, childDatum) { process(childDatum, group.children); }); + if (group.children.length || query.matcher(t, text(group), datum)) { + collection.push(group); + } + } else { + if (query.matcher(t, text(datum), datum)) { + collection.push(datum); + } + } + }; + + $(data().results).each2(function(i, datum) { process(datum, filtered.results); }); + query.callback(filtered); + }; + } + + // TODO javadoc + function tags(data) { + var isFunc = $.isFunction(data); + return function (query) { + var t = query.term, filtered = {results: []}; + var result = isFunc ? data(query) : data; + if ($.isArray(result)) { + $(result).each(function () { + var isObject = this.text !== undefined, + text = isObject ? this.text : this; + if (t === "" || query.matcher(t, text)) { + filtered.results.push(isObject ? this : {id: this, text: this}); + } + }); + query.callback(filtered); + } + }; + } + + /** + * Checks if the formatter function should be used. + * + * Throws an error if it is not a function. Returns true if it should be used, + * false if no formatting should be performed. + * + * @param formatter + */ + function checkFormatter(formatter, formatterName) { + if ($.isFunction(formatter)) return true; + if (!formatter) return false; + if (typeof(formatter) === 'string') return true; + throw new Error(formatterName +" must be a string, function, or falsy value"); + } + + /** + * Returns a given value + * If given a function, returns its output + * + * @param val string|function + * @param context value of "this" to be passed to function + * @returns {*} + */ + function evaluate(val, context) { + if ($.isFunction(val)) { + var args = Array.prototype.slice.call(arguments, 2); + return val.apply(context, args); + } + return val; + } + + function countResults(results) { + var count = 0; + $.each(results, function(i, item) { + if (item.children) { + count += countResults(item.children); + } else { + count++; + } + }); + return count; + } + + /** + * Default tokenizer. This function uses breaks the input on substring match of any string from the + * opts.tokenSeparators array and uses opts.createSearchChoice to create the choice object. Both of those + * two options have to be defined in order for the tokenizer to work. + * + * @param input text user has typed so far or pasted into the search field + * @param selection currently selected choices + * @param selectCallback function(choice) callback tho add the choice to selection + * @param opts select2's opts + * @return undefined/null to leave the current input unchanged, or a string to change the input to the returned value + */ + function defaultTokenizer(input, selection, selectCallback, opts) { + var original = input, // store the original so we can compare and know if we need to tell the search to update its text + dupe = false, // check for whether a token we extracted represents a duplicate selected choice + token, // token + index, // position at which the separator was found + i, l, // looping variables + separator; // the matched separator + + if (!opts.createSearchChoice || !opts.tokenSeparators || opts.tokenSeparators.length < 1) return undefined; + + while (true) { + index = -1; + + for (i = 0, l = opts.tokenSeparators.length; i < l; i++) { + separator = opts.tokenSeparators[i]; + index = input.indexOf(separator); + if (index >= 0) break; + } + + if (index < 0) break; // did not find any token separator in the input string, bail + + token = input.substring(0, index); + input = input.substring(index + separator.length); + + if (token.length > 0) { + token = opts.createSearchChoice.call(this, token, selection); + if (token !== undefined && token !== null && opts.id(token) !== undefined && opts.id(token) !== null) { + dupe = false; + for (i = 0, l = selection.length; i < l; i++) { + if (equal(opts.id(token), opts.id(selection[i]))) { + dupe = true; break; + } + } + + if (!dupe) selectCallback(token); + } + } + } + + if (original!==input) return input; + } + + function cleanupJQueryElements() { + var self = this; + + $.each(arguments, function (i, element) { + self[element].remove(); + self[element] = null; + }); + } + + /** + * Creates a new class + * + * @param superClass + * @param methods + */ + function clazz(SuperClass, methods) { + var constructor = function () {}; + constructor.prototype = new SuperClass; + constructor.prototype.constructor = constructor; + constructor.prototype.parent = SuperClass.prototype; + constructor.prototype = $.extend(constructor.prototype, methods); + return constructor; + } + + AbstractSelect2 = clazz(Object, { + + // abstract + bind: function (func) { + var self = this; + return function () { + func.apply(self, arguments); + }; + }, + + // abstract + init: function (opts) { + var results, search, resultsSelector = ".select2-results"; + + // prepare options + this.opts = opts = this.prepareOpts(opts); + + this.id=opts.id; + + // destroy if called on an existing component + if (opts.element.data("select2") !== undefined && + opts.element.data("select2") !== null) { + opts.element.data("select2").destroy(); + } + + this.container = this.createContainer(); + + this.liveRegion = $('.select2-hidden-accessible'); + if (this.liveRegion.length == 0) { + this.liveRegion = $("", { + role: "status", + "aria-live": "polite" + }) + .addClass("select2-hidden-accessible") + .appendTo(document.body); + } + + this.containerId="s2id_"+(opts.element.attr("id") || "autogen"+nextUid()); + this.containerEventName= this.containerId + .replace(/([.])/g, '_') + .replace(/([;&,\-\.\+\*\~':"\!\^#$%@\[\]\(\)=>\|])/g, '\\$1'); + this.container.attr("id", this.containerId); + + this.container.attr("title", opts.element.attr("title")); + + this.body = $(document.body); + + syncCssClasses(this.container, this.opts.element, this.opts.adaptContainerCssClass); + + this.container.attr("style", opts.element.attr("style")); + this.container.css(evaluate(opts.containerCss, this.opts.element)); + this.container.addClass(evaluate(opts.containerCssClass, this.opts.element)); + + this.elementTabIndex = this.opts.element.attr("tabindex"); + + // swap container for the element + this.opts.element + .data("select2", this) + .attr("tabindex", "-1") + .before(this.container) + .on("click.select2", killEvent); // do not leak click events + + this.container.data("select2", this); + + this.dropdown = this.container.find(".select2-drop"); + + syncCssClasses(this.dropdown, this.opts.element, this.opts.adaptDropdownCssClass); + + this.dropdown.addClass(evaluate(opts.dropdownCssClass, this.opts.element)); + this.dropdown.data("select2", this); + this.dropdown.on("click", killEvent); + + this.results = results = this.container.find(resultsSelector); + this.search = search = this.container.find("input.select2-input"); + + this.queryCount = 0; + this.resultsPage = 0; + this.context = null; + + // initialize the container + this.initContainer(); + + this.container.on("click", killEvent); + + installFilteredMouseMove(this.results); + + this.dropdown.on("mousemove-filtered", resultsSelector, this.bind(this.highlightUnderEvent)); + this.dropdown.on("touchstart touchmove touchend", resultsSelector, this.bind(function (event) { + this._touchEvent = true; + this.highlightUnderEvent(event); + })); + this.dropdown.on("touchmove", resultsSelector, this.bind(this.touchMoved)); + this.dropdown.on("touchstart touchend", resultsSelector, this.bind(this.clearTouchMoved)); + + // Waiting for a click event on touch devices to select option and hide dropdown + // otherwise click will be triggered on an underlying element + this.dropdown.on('click', this.bind(function (event) { + if (this._touchEvent) { + this._touchEvent = false; + this.selectHighlighted(); + } + })); + + installDebouncedScroll(80, this.results); + this.dropdown.on("scroll-debounced", resultsSelector, this.bind(this.loadMoreIfNeeded)); + + // do not propagate change event from the search field out of the component + $(this.container).on("change", ".select2-input", function(e) {e.stopPropagation();}); + $(this.dropdown).on("change", ".select2-input", function(e) {e.stopPropagation();}); + + // if jquery.mousewheel plugin is installed we can prevent out-of-bounds scrolling of results via mousewheel + if ($.fn.mousewheel) { + results.mousewheel(function (e, delta, deltaX, deltaY) { + var top = results.scrollTop(); + if (deltaY > 0 && top - deltaY <= 0) { + results.scrollTop(0); + killEvent(e); + } else if (deltaY < 0 && results.get(0).scrollHeight - results.scrollTop() + deltaY <= results.height()) { + results.scrollTop(results.get(0).scrollHeight - results.height()); + killEvent(e); + } + }); + } + + installKeyUpChangeEvent(search); + search.on("keyup-change input paste", this.bind(this.updateResults)); + search.on("focus", function () { search.addClass("select2-focused"); }); + search.on("blur", function () { search.removeClass("select2-focused");}); + + this.dropdown.on("mouseup", resultsSelector, this.bind(function (e) { + if ($(e.target).closest(".select2-result-selectable").length > 0) { + this.highlightUnderEvent(e); + this.selectHighlighted(e); + } + })); + + // trap all mouse events from leaving the dropdown. sometimes there may be a modal that is listening + // for mouse events outside of itself so it can close itself. since the dropdown is now outside the select2's + // dom it will trigger the popup close, which is not what we want + // focusin can cause focus wars between modals and select2 since the dropdown is outside the modal. + this.dropdown.on("click mouseup mousedown touchstart touchend focusin", function (e) { e.stopPropagation(); }); + + this.lastSearchTerm = undefined; + + if ($.isFunction(this.opts.initSelection)) { + // initialize selection based on the current value of the source element + this.initSelection(); + + // if the user has provided a function that can set selection based on the value of the source element + // we monitor the change event on the element and trigger it, allowing for two way synchronization + this.monitorSource(); + } + + if (opts.maximumInputLength !== null) { + this.search.attr("maxlength", opts.maximumInputLength); + } + + var disabled = opts.element.prop("disabled"); + if (disabled === undefined) disabled = false; + this.enable(!disabled); + + var readonly = opts.element.prop("readonly"); + if (readonly === undefined) readonly = false; + this.readonly(readonly); + + // Calculate size of scrollbar + scrollBarDimensions = scrollBarDimensions || measureScrollbar(); + + this.autofocus = opts.element.prop("autofocus"); + opts.element.prop("autofocus", false); + if (this.autofocus) this.focus(); + + this.search.attr("placeholder", opts.searchInputPlaceholder); + }, + + // abstract + destroy: function () { + var element=this.opts.element, select2 = element.data("select2"), self = this; + + this.close(); + + if (element.length && element[0].detachEvent && self._sync) { + element.each(function () { + if (self._sync) { + this.detachEvent("onpropertychange", self._sync); + } + }); + } + if (this.propertyObserver) { + this.propertyObserver.disconnect(); + this.propertyObserver = null; + } + this._sync = null; + + if (select2 !== undefined) { + select2.container.remove(); + select2.liveRegion.remove(); + select2.dropdown.remove(); + element.removeData("select2") + .off(".select2"); + if (!element.is("input[type='hidden']")) { + element + .show() + .prop("autofocus", this.autofocus || false); + if (this.elementTabIndex) { + element.attr({tabindex: this.elementTabIndex}); + } else { + element.removeAttr("tabindex"); + } + element.show(); + } else { + element.css("display", ""); + } + } + + cleanupJQueryElements.call(this, + "container", + "liveRegion", + "dropdown", + "results", + "search" + ); + }, + + // abstract + optionToData: function(element) { + if (element.is("option")) { + return { + id:element.prop("value"), + text:element.text(), + element: element.get(), + css: element.attr("class"), + disabled: element.prop("disabled"), + locked: equal(element.attr("locked"), "locked") || equal(element.data("locked"), true) + }; + } else if (element.is("optgroup")) { + return { + text:element.attr("label"), + children:[], + element: element.get(), + css: element.attr("class") + }; + } + }, + + // abstract + prepareOpts: function (opts) { + var element, select, idKey, ajaxUrl, self = this; + + element = opts.element; + + if (element.get(0).tagName.toLowerCase() === "select") { + this.select = select = opts.element; + } + + if (select) { + // these options are not allowed when attached to a select because they are picked up off the element itself + $.each(["id", "multiple", "ajax", "query", "createSearchChoice", "initSelection", "data", "tags"], function () { + if (this in opts) { + throw new Error("Option '" + this + "' is not allowed for Select2 when attached to a ", + "
", + " ", + "
    ", + "
", + "
"].join("")); + return container; + }, + + // single + enableInterface: function() { + if (this.parent.enableInterface.apply(this, arguments)) { + this.focusser.prop("disabled", !this.isInterfaceEnabled()); + } + }, + + // single + opening: function () { + var el, range, len; + + if (this.opts.minimumResultsForSearch >= 0) { + this.showSearch(true); + } + + this.parent.opening.apply(this, arguments); + + if (this.showSearchInput !== false) { + // IE appends focusser.val() at the end of field :/ so we manually insert it at the beginning using a range + // all other browsers handle this just fine + + this.search.val(this.focusser.val()); + } + if (this.opts.shouldFocusInput(this)) { + this.search.focus(); + // move the cursor to the end after focussing, otherwise it will be at the beginning and + // new text will appear *before* focusser.val() + el = this.search.get(0); + if (el.createTextRange) { + range = el.createTextRange(); + range.collapse(false); + range.select(); + } else if (el.setSelectionRange) { + len = this.search.val().length; + el.setSelectionRange(len, len); + } + } + + this.prefillNextSearchTerm(); + + this.focusser.prop("disabled", true).val(""); + this.updateResults(true); + this.opts.element.trigger($.Event("select2-open")); + }, + + // single + close: function () { + if (!this.opened()) return; + this.parent.close.apply(this, arguments); + + this.focusser.prop("disabled", false); + + if (this.opts.shouldFocusInput(this)) { + this.focusser.focus(); + } + }, + + // single + focus: function () { + if (this.opened()) { + this.close(); + } else { + this.focusser.prop("disabled", false); + if (this.opts.shouldFocusInput(this)) { + this.focusser.focus(); + } + } + }, + + // single + isFocused: function () { + return this.container.hasClass("select2-container-active"); + }, + + // single + cancel: function () { + this.parent.cancel.apply(this, arguments); + this.focusser.prop("disabled", false); + + if (this.opts.shouldFocusInput(this)) { + this.focusser.focus(); + } + }, + + // single + destroy: function() { + $("label[for='" + this.focusser.attr('id') + "']") + .attr('for', this.opts.element.attr("id")); + this.parent.destroy.apply(this, arguments); + + cleanupJQueryElements.call(this, + "selection", + "focusser" + ); + }, + + // single + initContainer: function () { + + var selection, + container = this.container, + dropdown = this.dropdown, + idSuffix = nextUid(), + elementLabel; + + if (this.opts.minimumResultsForSearch < 0) { + this.showSearch(false); + } else { + this.showSearch(true); + } + + this.selection = selection = container.find(".select2-choice"); + + this.focusser = container.find(".select2-focusser"); + + // add aria associations + selection.find(".select2-chosen").attr("id", "select2-chosen-"+idSuffix); + this.focusser.attr("aria-labelledby", "select2-chosen-"+idSuffix); + this.results.attr("id", "select2-results-"+idSuffix); + this.search.attr("aria-owns", "select2-results-"+idSuffix); + + // rewrite labels from original element to focusser + this.focusser.attr("id", "s2id_autogen"+idSuffix); + + elementLabel = $("label[for='" + this.opts.element.attr("id") + "']"); + this.opts.element.on('focus.select2', this.bind(function () { this.focus(); })); + + this.focusser.prev() + .text(elementLabel.text()) + .attr('for', this.focusser.attr('id')); + + // Ensure the original element retains an accessible name + var originalTitle = this.opts.element.attr("title"); + this.opts.element.attr("title", (originalTitle || elementLabel.text())); + + this.focusser.attr("tabindex", this.elementTabIndex); + + // write label for search field using the label from the focusser element + this.search.attr("id", this.focusser.attr('id') + '_search'); + + this.search.prev() + .text($("label[for='" + this.focusser.attr('id') + "']").text()) + .attr('for', this.search.attr('id')); + + this.search.on("keydown", this.bind(function (e) { + if (!this.isInterfaceEnabled()) return; + + // filter 229 keyCodes (input method editor is processing key input) + if (229 == e.keyCode) return; + + if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) { + // prevent the page from scrolling + killEvent(e); + return; + } + + switch (e.which) { + case KEY.UP: + case KEY.DOWN: + this.moveHighlight((e.which === KEY.UP) ? -1 : 1); + killEvent(e); + return; + case KEY.ENTER: + this.selectHighlighted(); + killEvent(e); + return; + case KEY.TAB: + this.selectHighlighted({noFocus: true}); + return; + case KEY.ESC: + this.cancel(e); + killEvent(e); + return; + } + })); + + this.search.on("blur", this.bind(function(e) { + // a workaround for chrome to keep the search field focussed when the scroll bar is used to scroll the dropdown. + // without this the search field loses focus which is annoying + if (document.activeElement === this.body.get(0)) { + window.setTimeout(this.bind(function() { + if (this.opened() && this.results && this.results.length > 1) { + this.search.focus(); + } + }), 0); + } + })); + + this.focusser.on("keydown", this.bind(function (e) { + if (!this.isInterfaceEnabled()) return; + + if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) || e.which === KEY.ESC) { + return; + } + + if (this.opts.openOnEnter === false && e.which === KEY.ENTER) { + killEvent(e); + return; + } + + if (e.which == KEY.DOWN || e.which == KEY.UP + || (e.which == KEY.ENTER && this.opts.openOnEnter)) { + + if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) return; + + this.open(); + killEvent(e); + return; + } + + if (e.which == KEY.DELETE || e.which == KEY.BACKSPACE) { + if (this.opts.allowClear) { + this.clear(); + } + killEvent(e); + return; + } + })); + + + installKeyUpChangeEvent(this.focusser); + this.focusser.on("keyup-change input", this.bind(function(e) { + if (this.opts.minimumResultsForSearch >= 0) { + e.stopPropagation(); + if (this.opened()) return; + this.open(); + } + })); + + selection.on("mousedown touchstart", "abbr", this.bind(function (e) { + if (!this.isInterfaceEnabled()) { + return; + } + + this.clear(); + killEventImmediately(e); + this.close(); + + if (this.selection) { + this.selection.focus(); + } + })); + + selection.on("mousedown touchstart", this.bind(function (e) { + // Prevent IE from generating a click event on the body + reinsertElement(selection); + + if (!this.container.hasClass("select2-container-active")) { + this.opts.element.trigger($.Event("select2-focus")); + } + + if (this.opened()) { + this.close(); + } else if (this.isInterfaceEnabled()) { + this.open(); + } + + killEvent(e); + })); + + dropdown.on("mousedown touchstart", this.bind(function() { + if (this.opts.shouldFocusInput(this)) { + this.search.focus(); + } + })); + + selection.on("focus", this.bind(function(e) { + killEvent(e); + })); + + this.focusser.on("focus", this.bind(function(){ + if (!this.container.hasClass("select2-container-active")) { + this.opts.element.trigger($.Event("select2-focus")); + } + this.container.addClass("select2-container-active"); + })).on("blur", this.bind(function() { + if (!this.opened()) { + this.container.removeClass("select2-container-active"); + this.opts.element.trigger($.Event("select2-blur")); + } + })); + this.search.on("focus", this.bind(function(){ + if (!this.container.hasClass("select2-container-active")) { + this.opts.element.trigger($.Event("select2-focus")); + } + this.container.addClass("select2-container-active"); + })); + + this.initContainerWidth(); + this.opts.element.hide(); + this.setPlaceholder(); + + }, + + // single + clear: function(triggerChange) { + var data=this.selection.data("select2-data"); + if (data) { // guard against queued quick consecutive clicks + var evt = $.Event("select2-clearing"); + this.opts.element.trigger(evt); + if (evt.isDefaultPrevented()) { + return; + } + var placeholderOption = this.getPlaceholderOption(); + this.opts.element.val(placeholderOption ? placeholderOption.val() : ""); + this.selection.find(".select2-chosen").empty(); + this.selection.removeData("select2-data"); + this.setPlaceholder(); + + if (triggerChange !== false){ + this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data }); + this.triggerChange({removed:data}); + } + } + }, + + /** + * Sets selection based on source element's value + */ + // single + initSelection: function () { + var selected; + if (this.isPlaceholderOptionSelected()) { + this.updateSelection(null); + this.close(); + this.setPlaceholder(); + } else { + var self = this; + this.opts.initSelection.call(null, this.opts.element, function(selected){ + if (selected !== undefined && selected !== null) { + self.updateSelection(selected); + self.close(); + self.setPlaceholder(); + self.lastSearchTerm = self.search.val(); + } + }); + } + }, + + isPlaceholderOptionSelected: function() { + var placeholderOption; + if (this.getPlaceholder() === undefined) return false; // no placeholder specified so no option should be considered + return ((placeholderOption = this.getPlaceholderOption()) !== undefined && placeholderOption.prop("selected")) + || (this.opts.element.val() === "") + || (this.opts.element.val() === undefined) + || (this.opts.element.val() === null); + }, + + // single + prepareOpts: function () { + var opts = this.parent.prepareOpts.apply(this, arguments), + self=this; + + if (opts.element.get(0).tagName.toLowerCase() === "select") { + // install the selection initializer + opts.initSelection = function (element, callback) { + var selected = element.find("option").filter(function() { return this.selected && !this.disabled }); + // a single select box always has a value, no need to null check 'selected' + callback(self.optionToData(selected)); + }; + } else if ("data" in opts) { + // install default initSelection when applied to hidden input and data is local + opts.initSelection = opts.initSelection || function (element, callback) { + var id = element.val(); + //search in data by id, storing the actual matching item + var match = null; + opts.query({ + matcher: function(term, text, el){ + var is_match = equal(id, opts.id(el)); + if (is_match) { + match = el; + } + return is_match; + }, + callback: !$.isFunction(callback) ? $.noop : function() { + callback(match); + } + }); + }; + } + + return opts; + }, + + // single + getPlaceholder: function() { + // if a placeholder is specified on a single select without a valid placeholder option ignore it + if (this.select) { + if (this.getPlaceholderOption() === undefined) { + return undefined; + } + } + + return this.parent.getPlaceholder.apply(this, arguments); + }, + + // single + setPlaceholder: function () { + var placeholder = this.getPlaceholder(); + + if (this.isPlaceholderOptionSelected() && placeholder !== undefined) { + + // check for a placeholder option if attached to a select + if (this.select && this.getPlaceholderOption() === undefined) return; + + this.selection.find(".select2-chosen").html(this.opts.escapeMarkup(placeholder)); + + this.selection.addClass("select2-default"); + + this.container.removeClass("select2-allowclear"); + } + }, + + // single + postprocessResults: function (data, initial, noHighlightUpdate) { + var selected = 0, self = this, showSearchInput = true; + + // find the selected element in the result list + + this.findHighlightableChoices().each2(function (i, elm) { + if (equal(self.id(elm.data("select2-data")), self.opts.element.val())) { + selected = i; + return false; + } + }); + + // and highlight it + if (noHighlightUpdate !== false) { + if (initial === true && selected >= 0) { + this.highlight(selected); + } else { + this.highlight(0); + } + } + + // hide the search box if this is the first we got the results and there are enough of them for search + + if (initial === true) { + var min = this.opts.minimumResultsForSearch; + if (min >= 0) { + this.showSearch(countResults(data.results) >= min); + } + } + }, + + // single + showSearch: function(showSearchInput) { + if (this.showSearchInput === showSearchInput) return; + + this.showSearchInput = showSearchInput; + + this.dropdown.find(".select2-search").toggleClass("select2-search-hidden", !showSearchInput); + this.dropdown.find(".select2-search").toggleClass("select2-offscreen", !showSearchInput); + //add "select2-with-searchbox" to the container if search box is shown + $(this.dropdown, this.container).toggleClass("select2-with-searchbox", showSearchInput); + }, + + // single + onSelect: function (data, options) { + + if (!this.triggerSelect(data)) { return; } + + var old = this.opts.element.val(), + oldData = this.data(); + + this.opts.element.val(this.id(data)); + this.updateSelection(data); + + this.opts.element.trigger({ type: "select2-selected", val: this.id(data), choice: data }); + + this.lastSearchTerm = this.search.val(); + this.close(); + + if ((!options || !options.noFocus) && this.opts.shouldFocusInput(this)) { + this.focusser.focus(); + } + + if (!equal(old, this.id(data))) { + this.triggerChange({ added: data, removed: oldData }); + } + }, + + // single + updateSelection: function (data) { + + var container=this.selection.find(".select2-chosen"), formatted, cssClass; + + this.selection.data("select2-data", data); + + container.empty(); + if (data !== null) { + formatted=this.opts.formatSelection(data, container, this.opts.escapeMarkup); + } + if (formatted !== undefined) { + container.append(formatted); + } + cssClass=this.opts.formatSelectionCssClass(data, container); + if (cssClass !== undefined) { + container.addClass(cssClass); + } + + this.selection.removeClass("select2-default"); + + if (this.opts.allowClear && this.getPlaceholder() !== undefined) { + this.container.addClass("select2-allowclear"); + } + }, + + // single + val: function () { + var val, + triggerChange = false, + data = null, + self = this, + oldData = this.data(); + + if (arguments.length === 0) { + return this.opts.element.val(); + } + + val = arguments[0]; + + if (arguments.length > 1) { + triggerChange = arguments[1]; + + if (this.opts.debug && console && console.warn) { + console.warn( + 'Select2: The second option to `select2("val")` is not supported in Select2 4.0.0. ' + + 'The `change` event will always be triggered in 4.0.0.' + ); + } + } + + if (this.select) { + if (this.opts.debug && console && console.warn) { + console.warn( + 'Select2: Setting the value on a ", + " ", + "", + "
", + "
    ", + "
", + "
"].join("")); + return container; + }, + + // multi + prepareOpts: function () { + var opts = this.parent.prepareOpts.apply(this, arguments), + self=this; + + // TODO validate placeholder is a string if specified + if (opts.element.get(0).tagName.toLowerCase() === "select") { + // install the selection initializer + opts.initSelection = function (element, callback) { + + var data = []; + + element.find("option").filter(function() { return this.selected && !this.disabled }).each2(function (i, elm) { + data.push(self.optionToData(elm)); + }); + callback(data); + }; + } else if ("data" in opts) { + // install default initSelection when applied to hidden input and data is local + opts.initSelection = opts.initSelection || function (element, callback) { + var ids = splitVal(element.val(), opts.separator, opts.transformVal); + //search in data by array of ids, storing matching items in a list + var matches = []; + opts.query({ + matcher: function(term, text, el){ + var is_match = $.grep(ids, function(id) { + return equal(id, opts.id(el)); + }).length; + if (is_match) { + matches.push(el); + } + return is_match; + }, + callback: !$.isFunction(callback) ? $.noop : function() { + // reorder matches based on the order they appear in the ids array because right now + // they are in the order in which they appear in data array + var ordered = []; + for (var i = 0; i < ids.length; i++) { + var id = ids[i]; + for (var j = 0; j < matches.length; j++) { + var match = matches[j]; + if (equal(id, opts.id(match))) { + ordered.push(match); + matches.splice(j, 1); + break; + } + } + } + callback(ordered); + } + }); + }; + } + + return opts; + }, + + // multi + selectChoice: function (choice) { + + var selected = this.container.find(".select2-search-choice-focus"); + if (selected.length && choice && choice[0] == selected[0]) { + + } else { + if (selected.length) { + this.opts.element.trigger("choice-deselected", selected); + } + selected.removeClass("select2-search-choice-focus"); + if (choice && choice.length) { + this.close(); + choice.addClass("select2-search-choice-focus"); + this.opts.element.trigger("choice-selected", choice); + } + } + }, + + // multi + destroy: function() { + $("label[for='" + this.search.attr('id') + "']") + .attr('for', this.opts.element.attr("id")); + this.parent.destroy.apply(this, arguments); + + cleanupJQueryElements.call(this, + "searchContainer", + "selection" + ); + }, + + // multi + initContainer: function () { + + var selector = ".select2-choices", selection; + + this.searchContainer = this.container.find(".select2-search-field"); + this.selection = selection = this.container.find(selector); + + var _this = this; + this.selection.on("click", ".select2-container:not(.select2-container-disabled) .select2-search-choice:not(.select2-locked)", function (e) { + _this.search[0].focus(); + _this.selectChoice($(this)); + }); + + // rewrite labels from original element to focusser + this.search.attr("id", "s2id_autogen"+nextUid()); + + this.search.prev() + .text($("label[for='" + this.opts.element.attr("id") + "']").text()) + .attr('for', this.search.attr('id')); + this.opts.element.on('focus.select2', this.bind(function () { this.focus(); })); + + this.search.on("input paste", this.bind(function() { + if (this.search.attr('placeholder') && this.search.val().length == 0) return; + if (!this.isInterfaceEnabled()) return; + if (!this.opened()) { + this.open(); + } + })); + + this.search.attr("tabindex", this.elementTabIndex); + + this.keydowns = 0; + this.search.on("keydown", this.bind(function (e) { + if (!this.isInterfaceEnabled()) return; + + ++this.keydowns; + var selected = selection.find(".select2-search-choice-focus"); + var prev = selected.prev(".select2-search-choice:not(.select2-locked)"); + var next = selected.next(".select2-search-choice:not(.select2-locked)"); + var pos = getCursorInfo(this.search); + + if (selected.length && + (e.which == KEY.LEFT || e.which == KEY.RIGHT || e.which == KEY.BACKSPACE || e.which == KEY.DELETE || e.which == KEY.ENTER)) { + var selectedChoice = selected; + if (e.which == KEY.LEFT && prev.length) { + selectedChoice = prev; + } + else if (e.which == KEY.RIGHT) { + selectedChoice = next.length ? next : null; + } + else if (e.which === KEY.BACKSPACE) { + if (this.unselect(selected.first())) { + this.search.width(10); + selectedChoice = prev.length ? prev : next; + } + } else if (e.which == KEY.DELETE) { + if (this.unselect(selected.first())) { + this.search.width(10); + selectedChoice = next.length ? next : null; + } + } else if (e.which == KEY.ENTER) { + selectedChoice = null; + } + + this.selectChoice(selectedChoice); + killEvent(e); + if (!selectedChoice || !selectedChoice.length) { + this.open(); + } + return; + } else if (((e.which === KEY.BACKSPACE && this.keydowns == 1) + || e.which == KEY.LEFT) && (pos.offset == 0 && !pos.length)) { + + this.selectChoice(selection.find(".select2-search-choice:not(.select2-locked)").last()); + killEvent(e); + return; + } else { + this.selectChoice(null); + } + + if (this.opened()) { + switch (e.which) { + case KEY.UP: + case KEY.DOWN: + this.moveHighlight((e.which === KEY.UP) ? -1 : 1); + killEvent(e); + return; + case KEY.ENTER: + this.selectHighlighted(); + killEvent(e); + return; + case KEY.TAB: + this.selectHighlighted({noFocus:true}); + this.close(); + return; + case KEY.ESC: + this.cancel(e); + killEvent(e); + return; + } + } + + if (e.which === KEY.TAB || KEY.isControl(e) || KEY.isFunctionKey(e) + || e.which === KEY.BACKSPACE || e.which === KEY.ESC) { + return; + } + + if (e.which === KEY.ENTER) { + if (this.opts.openOnEnter === false) { + return; + } else if (e.altKey || e.ctrlKey || e.shiftKey || e.metaKey) { + return; + } + } + + this.open(); + + if (e.which === KEY.PAGE_UP || e.which === KEY.PAGE_DOWN) { + // prevent the page from scrolling + killEvent(e); + } + + if (e.which === KEY.ENTER) { + // prevent form from being submitted + killEvent(e); + } + + })); + + this.search.on("keyup", this.bind(function (e) { + this.keydowns = 0; + this.resizeSearch(); + }) + ); + + this.search.on("blur", this.bind(function(e) { + this.container.removeClass("select2-container-active"); + this.search.removeClass("select2-focused"); + this.selectChoice(null); + if (!this.opened()) this.clearSearch(); + e.stopImmediatePropagation(); + this.opts.element.trigger($.Event("select2-blur")); + })); + + this.container.on("click", selector, this.bind(function (e) { + if (!this.isInterfaceEnabled()) return; + if ($(e.target).closest(".select2-search-choice").length > 0) { + // clicked inside a select2 search choice, do not open + return; + } + this.selectChoice(null); + this.clearPlaceholder(); + if (!this.container.hasClass("select2-container-active")) { + this.opts.element.trigger($.Event("select2-focus")); + } + this.open(); + this.focusSearch(); + e.preventDefault(); + })); + + this.container.on("focus", selector, this.bind(function () { + if (!this.isInterfaceEnabled()) return; + if (!this.container.hasClass("select2-container-active")) { + this.opts.element.trigger($.Event("select2-focus")); + } + this.container.addClass("select2-container-active"); + this.dropdown.addClass("select2-drop-active"); + this.clearPlaceholder(); + })); + + this.initContainerWidth(); + this.opts.element.hide(); + + // set the placeholder if necessary + this.clearSearch(); + }, + + // multi + enableInterface: function() { + if (this.parent.enableInterface.apply(this, arguments)) { + this.search.prop("disabled", !this.isInterfaceEnabled()); + } + }, + + // multi + initSelection: function () { + var data; + if (this.opts.element.val() === "" && this.opts.element.text() === "") { + this.updateSelection([]); + this.close(); + // set the placeholder if necessary + this.clearSearch(); + } + if (this.select || this.opts.element.val() !== "") { + var self = this; + this.opts.initSelection.call(null, this.opts.element, function(data){ + if (data !== undefined && data !== null) { + self.updateSelection(data); + self.close(); + // set the placeholder if necessary + self.clearSearch(); + } + }); + } + }, + + // multi + clearSearch: function () { + var placeholder = this.getPlaceholder(), + maxWidth = this.getMaxSearchWidth(); + + if (placeholder !== undefined && this.getVal().length === 0 && this.search.hasClass("select2-focused") === false) { + this.search.val(placeholder).addClass("select2-default"); + // stretch the search box to full width of the container so as much of the placeholder is visible as possible + // we could call this.resizeSearch(), but we do not because that requires a sizer and we do not want to create one so early because of a firefox bug, see #944 + this.search.width(maxWidth > 0 ? maxWidth : this.container.css("width")); + } else { + this.search.val("").width(10); + } + }, + + // multi + clearPlaceholder: function () { + if (this.search.hasClass("select2-default")) { + this.search.val("").removeClass("select2-default"); + } + }, + + // multi + opening: function () { + this.clearPlaceholder(); // should be done before super so placeholder is not used to search + this.resizeSearch(); + + this.parent.opening.apply(this, arguments); + + this.focusSearch(); + + this.prefillNextSearchTerm(); + this.updateResults(true); + + if (this.opts.shouldFocusInput(this)) { + this.search.focus(); + } + this.opts.element.trigger($.Event("select2-open")); + }, + + // multi + close: function () { + if (!this.opened()) return; + this.parent.close.apply(this, arguments); + }, + + // multi + focus: function () { + this.close(); + this.search.focus(); + }, + + // multi + isFocused: function () { + return this.search.hasClass("select2-focused"); + }, + + // multi + updateSelection: function (data) { + var ids = {}, filtered = [], self = this; + + // filter out duplicates + $(data).each(function () { + if (!(self.id(this) in ids)) { + ids[self.id(this)] = 0; + filtered.push(this); + } + }); + + this.selection.find(".select2-search-choice").remove(); + this.addSelectedChoice(filtered); + self.postprocessResults(); + }, + + // multi + tokenize: function() { + var input = this.search.val(); + input = this.opts.tokenizer.call(this, input, this.data(), this.bind(this.onSelect), this.opts); + if (input != null && input != undefined) { + this.search.val(input); + if (input.length > 0) { + this.open(); + } + } + + }, + + // multi + onSelect: function (data, options) { + + if (!this.triggerSelect(data) || data.text === "") { return; } + + this.addSelectedChoice(data); + + this.opts.element.trigger({ type: "selected", val: this.id(data), choice: data }); + + // keep track of the search's value before it gets cleared + this.lastSearchTerm = this.search.val(); + + this.clearSearch(); + this.updateResults(); + + if (this.select || !this.opts.closeOnSelect) this.postprocessResults(data, false, this.opts.closeOnSelect===true); + + if (this.opts.closeOnSelect) { + this.close(); + this.search.width(10); + } else { + if (this.countSelectableResults()>0) { + this.search.width(10); + this.resizeSearch(); + if (this.getMaximumSelectionSize() > 0 && this.val().length >= this.getMaximumSelectionSize()) { + // if we reached max selection size repaint the results so choices + // are replaced with the max selection reached message + this.updateResults(true); + } else { + // initializes search's value with nextSearchTerm and update search result + if (this.prefillNextSearchTerm()) { + this.updateResults(); + } + } + this.positionDropdown(); + } else { + // if nothing left to select close + this.close(); + this.search.width(10); + } + } + + // since its not possible to select an element that has already been + // added we do not need to check if this is a new element before firing change + this.triggerChange({ added: data }); + + if (!options || !options.noFocus) + this.focusSearch(); + }, + + // multi + cancel: function () { + this.close(); + this.focusSearch(); + }, + + addSelectedChoice: function (data) { + var val = this.getVal(), self = this; + $(data).each(function () { + val.push(self.createChoice(this)); + }); + this.setVal(val); + }, + + createChoice: function (data) { + var enableChoice = !data.locked, + enabledItem = $( + "
  • " + + "
    " + + " " + + "
  • "), + disabledItem = $( + "
  • " + + "
    " + + "
  • "); + var choice = enableChoice ? enabledItem : disabledItem, + id = this.id(data), + formatted, + cssClass; + + formatted=this.opts.formatSelection(data, choice.find("div"), this.opts.escapeMarkup); + if (formatted != undefined) { + choice.find("div").replaceWith($("
    ").html(formatted)); + } + cssClass=this.opts.formatSelectionCssClass(data, choice.find("div")); + if (cssClass != undefined) { + choice.addClass(cssClass); + } + + if(enableChoice){ + choice.find(".select2-search-choice-close") + .on("mousedown", killEvent) + .on("click dblclick", this.bind(function (e) { + if (!this.isInterfaceEnabled()) return; + + this.unselect($(e.target)); + this.selection.find(".select2-search-choice-focus").removeClass("select2-search-choice-focus"); + killEvent(e); + this.close(); + this.focusSearch(); + })).on("focus", this.bind(function () { + if (!this.isInterfaceEnabled()) return; + this.container.addClass("select2-container-active"); + this.dropdown.addClass("select2-drop-active"); + })); + } + + choice.data("select2-data", data); + choice.insertBefore(this.searchContainer); + + return id; + }, + + // multi + unselect: function (selected) { + var val = this.getVal(), + data, + index; + selected = selected.closest(".select2-search-choice"); + + if (selected.length === 0) { + throw "Invalid argument: " + selected + ". Must be .select2-search-choice"; + } + + data = selected.data("select2-data"); + + if (!data) { + // prevent a race condition when the 'x' is clicked really fast repeatedly the event can be queued + // and invoked on an element already removed + return; + } + + var evt = $.Event("select2-removing"); + evt.val = this.id(data); + evt.choice = data; + this.opts.element.trigger(evt); + + if (evt.isDefaultPrevented()) { + return false; + } + + while((index = indexOf(this.id(data), val)) >= 0) { + val.splice(index, 1); + this.setVal(val); + if (this.select) this.postprocessResults(); + } + + selected.remove(); + + this.opts.element.trigger({ type: "select2-removed", val: this.id(data), choice: data }); + this.triggerChange({ removed: data }); + + return true; + }, + + // multi + postprocessResults: function (data, initial, noHighlightUpdate) { + var val = this.getVal(), + choices = this.results.find(".select2-result"), + compound = this.results.find(".select2-result-with-children"), + self = this; + + choices.each2(function (i, choice) { + var id = self.id(choice.data("select2-data")); + if (indexOf(id, val) >= 0) { + choice.addClass("select2-selected"); + // mark all children of the selected parent as selected + choice.find(".select2-result-selectable").addClass("select2-selected"); + } + }); + + compound.each2(function(i, choice) { + // hide an optgroup if it doesn't have any selectable children + if (!choice.is('.select2-result-selectable') + && choice.find(".select2-result-selectable:not(.select2-selected)").length === 0) { + choice.addClass("select2-selected"); + } + }); + + if (this.highlight() == -1 && noHighlightUpdate !== false && this.opts.closeOnSelect === true){ + self.highlight(0); + } + + //If all results are chosen render formatNoMatches + if(!this.opts.createSearchChoice && !choices.filter('.select2-result:not(.select2-selected)').length > 0){ + if(!data || data && !data.more && this.results.find(".select2-no-results").length === 0) { + if (checkFormatter(self.opts.formatNoMatches, "formatNoMatches")) { + this.results.append("
  • " + evaluate(self.opts.formatNoMatches, self.opts.element, self.search.val()) + "
  • "); + } + } + } + + }, + + // multi + getMaxSearchWidth: function() { + return this.selection.width() - getSideBorderPadding(this.search); + }, + + // multi + resizeSearch: function () { + var minimumWidth, left, maxWidth, containerLeft, searchWidth, + sideBorderPadding = getSideBorderPadding(this.search); + + minimumWidth = measureTextWidth(this.search) + 10; + + left = this.search.offset().left; + + maxWidth = this.selection.width(); + containerLeft = this.selection.offset().left; + + searchWidth = maxWidth - (left - containerLeft) - sideBorderPadding; + + if (searchWidth < minimumWidth) { + searchWidth = maxWidth - sideBorderPadding; + } + + if (searchWidth < 40) { + searchWidth = maxWidth - sideBorderPadding; + } + + if (searchWidth <= 0) { + searchWidth = minimumWidth; + } + + this.search.width(Math.floor(searchWidth)); + }, + + // multi + getVal: function () { + var val; + if (this.select) { + val = this.select.val(); + return val === null ? [] : val; + } else { + val = this.opts.element.val(); + return splitVal(val, this.opts.separator, this.opts.transformVal); + } + }, + + // multi + setVal: function (val) { + if (this.select) { + this.select.val(val); + } else { + var unique = [], valMap = {}; + // filter out duplicates + $(val).each(function () { + if (!(this in valMap)) { + unique.push(this); + valMap[this] = 0; + } + }); + this.opts.element.val(unique.length === 0 ? "" : unique.join(this.opts.separator)); + } + }, + + // multi + buildChangeDetails: function (old, current) { + var current = current.slice(0), + old = old.slice(0); + + // remove intersection from each array + for (var i = 0; i < current.length; i++) { + for (var j = 0; j < old.length; j++) { + if (equal(this.opts.id(current[i]), this.opts.id(old[j]))) { + current.splice(i, 1); + i--; + old.splice(j, 1); + break; + } + } + } + + return {added: current, removed: old}; + }, + + + // multi + val: function (val, triggerChange) { + var oldData, self=this; + + if (arguments.length === 0) { + return this.getVal(); + } + + oldData=this.data(); + if (!oldData.length) oldData=[]; + + // val is an id. !val is true for [undefined,null,'',0] - 0 is legal + if (!val && val !== 0) { + this.opts.element.val(""); + this.updateSelection([]); + this.clearSearch(); + if (triggerChange) { + this.triggerChange({added: this.data(), removed: oldData}); + } + return; + } + + // val is a list of ids + this.setVal(val); + + if (this.select) { + this.opts.initSelection(this.select, this.bind(this.updateSelection)); + if (triggerChange) { + this.triggerChange(this.buildChangeDetails(oldData, this.data())); + } + } else { + if (this.opts.initSelection === undefined) { + throw new Error("val() cannot be called if initSelection() is not defined"); + } + + this.opts.initSelection(this.opts.element, function(data){ + var ids=$.map(data, self.id); + self.setVal(ids); + self.updateSelection(data); + self.clearSearch(); + if (triggerChange) { + self.triggerChange(self.buildChangeDetails(oldData, self.data())); + } + }); + } + this.clearSearch(); + }, + + // multi + onSortStart: function() { + if (this.select) { + throw new Error("Sorting of elements is not supported when attached to instead."); + } + + // collapse search field into 0 width so its container can be collapsed as well + this.search.width(0); + // hide the container + this.searchContainer.hide(); + }, + + // multi + onSortEnd:function() { + + var val=[], self=this; + + // show search and move it to the end of the list + this.searchContainer.show(); + // make sure the search container is the last item in the list + this.searchContainer.appendTo(this.searchContainer.parent()); + // since we collapsed the width in dragStarted, we resize it here + this.resizeSearch(); + + // update selection + this.selection.find(".select2-search-choice").each(function() { + val.push(self.opts.id($(this).data("select2-data"))); + }); + this.setVal(val); + this.triggerChange(); + }, + + // multi + data: function(values, triggerChange) { + var self=this, ids, old; + if (arguments.length === 0) { + return this.selection + .children(".select2-search-choice") + .map(function() { return $(this).data("select2-data"); }) + .get(); + } else { + old = this.data(); + if (!values) { values = []; } + ids = $.map(values, function(e) { return self.opts.id(e); }); + this.setVal(ids); + this.updateSelection(values); + this.clearSearch(); + if (triggerChange) { + this.triggerChange(this.buildChangeDetails(old, this.data())); + } + } + } + }); + + $.fn.select2 = function () { + + var args = Array.prototype.slice.call(arguments, 0), + opts, + select2, + method, value, multiple, + allowedMethods = ["val", "destroy", "opened", "open", "close", "focus", "isFocused", "container", "dropdown", "onSortStart", "onSortEnd", "enable", "disable", "readonly", "positionDropdown", "data", "search"], + valueMethods = ["opened", "isFocused", "container", "dropdown"], + propertyMethods = ["val", "data"], + methodsMap = { search: "externalSearch" }; + + this.each(function () { + if (args.length === 0 || typeof(args[0]) === "object") { + opts = args.length === 0 ? {} : $.extend({}, args[0]); + opts.element = $(this); + + if (opts.element.get(0).tagName.toLowerCase() === "select") { + multiple = opts.element.prop("multiple"); + } else { + multiple = opts.multiple || false; + if ("tags" in opts) {opts.multiple = multiple = true;} + } + + select2 = multiple ? new window.Select2["class"].multi() : new window.Select2["class"].single(); + select2.init(opts); + } else if (typeof(args[0]) === "string") { + + if (indexOf(args[0], allowedMethods) < 0) { + throw "Unknown method: " + args[0]; + } + + value = undefined; + select2 = $(this).data("select2"); + if (select2 === undefined) return; + + method=args[0]; + + if (method === "container") { + value = select2.container; + } else if (method === "dropdown") { + value = select2.dropdown; + } else { + if (methodsMap[method]) method = methodsMap[method]; + + value = select2[method].apply(select2, args.slice(1)); + } + if (indexOf(args[0], valueMethods) >= 0 + || (indexOf(args[0], propertyMethods) >= 0 && args.length == 1)) { + return false; // abort the iteration, ready to return first matched value + } + } else { + throw "Invalid arguments to select2 plugin: " + args; + } + }); + return (value === undefined) ? this : value; + }; + + // plugin defaults, accessible to users + $.fn.select2.defaults = { + debug: false, + width: "copy", + loadMorePadding: 0, + closeOnSelect: true, + openOnEnter: true, + containerCss: {}, + dropdownCss: {}, + containerCssClass: "", + dropdownCssClass: "", + formatResult: function(result, container, query, escapeMarkup) { + var markup=[]; + markMatch(this.text(result), query.term, markup, escapeMarkup); + return markup.join(""); + }, + transformVal: function(val) { + return $.trim(val); + }, + formatSelection: function (data, container, escapeMarkup) { + return data ? escapeMarkup(this.text(data)) : undefined; + }, + sortResults: function (results, container, query) { + return results; + }, + formatResultCssClass: function(data) {return data.css;}, + formatSelectionCssClass: function(data, container) {return undefined;}, + minimumResultsForSearch: 0, + minimumInputLength: 0, + maximumInputLength: null, + maximumSelectionSize: 0, + id: function (e) { return e == undefined ? null : e.id; }, + text: function (e) { + if (e && this.data && this.data.text) { + if ($.isFunction(this.data.text)) { + return this.data.text(e); + } else { + return e[this.data.text]; + } + } else { + return e.text; + } + }, + matcher: function(term, text) { + return stripDiacritics(''+text).toUpperCase().indexOf(stripDiacritics(''+term).toUpperCase()) >= 0; + }, + separator: ",", + tokenSeparators: [], + tokenizer: defaultTokenizer, + escapeMarkup: defaultEscapeMarkup, + blurOnChange: false, + selectOnBlur: false, + adaptContainerCssClass: function(c) { return c; }, + adaptDropdownCssClass: function(c) { return null; }, + nextSearchTerm: function(selectedObject, currentSearchTerm) { return undefined; }, + searchInputPlaceholder: '', + createSearchChoicePosition: 'top', + shouldFocusInput: function (instance) { + // Attempt to detect touch devices + var supportsTouchEvents = (('ontouchstart' in window) || + (navigator.msMaxTouchPoints > 0)); + + // Only devices which support touch events should be special cased + if (!supportsTouchEvents) { + return true; + } + + // Never focus the input if search is disabled + if (instance.opts.minimumResultsForSearch < 0) { + return false; + } + + return true; + } + }; + + $.fn.select2.locales = []; + + $.fn.select2.locales['en'] = { + formatMatches: function (matches) { if (matches === 1) { return "One result is available, press enter to select it."; } return matches + " results are available, use up and down arrow keys to navigate."; }, + formatNoMatches: function () { return "No matches found"; }, + formatAjaxError: function (jqXHR, textStatus, errorThrown) { return "Loading failed"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Please enter " + n + " or more character" + (n == 1 ? "" : "s"); }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Please delete " + n + " character" + (n == 1 ? "" : "s"); }, + formatSelectionTooBig: function (limit) { return "You can only select " + limit + " item" + (limit == 1 ? "" : "s"); }, + formatLoadMore: function (pageNumber) { return "Loading more results…"; }, + formatSearching: function () { return "Searching…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['en']); + + $.fn.select2.ajaxDefaults = { + transport: $.ajax, + params: { + type: "GET", + cache: false, + dataType: "json" + } + }; + + // exports + window.Select2 = { + query: { + ajax: ajax, + local: local, + tags: tags + }, util: { + debounce: debounce, + markMatch: markMatch, + escapeMarkup: defaultEscapeMarkup, + stripDiacritics: stripDiacritics + }, "class": { + "abstract": AbstractSelect2, + "single": SingleSelect2, + "multi": MultiSelect2 + } + }; + +}(jQuery)); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ar.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ar.js new file mode 100644 index 00000000000..e991b726cff --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ar.js @@ -0,0 +1,19 @@ +/** + * Select2 Arabic translation. + * + * Author: Adel KEDJOUR + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['ar'] = { + formatNoMatches: function () { return "لم يتم العثور على مطابقات"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; if (n == 1){ return "الرجاء إدخال حرف واحد على الأكثر"; } return n == 2 ? "الرجاء إدخال حرفين على الأكثر" : "الرجاء إدخال " + n + " على الأكثر"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; if (n == 1){ return "الرجاء إدخال حرف واحد على الأقل"; } return n == 2 ? "الرجاء إدخال حرفين على الأقل" : "الرجاء إدخال " + n + " على الأقل "; }, + formatSelectionTooBig: function (limit) { if (limit == 1){ return "يمكنك أن تختار إختيار واحد فقط"; } return limit == 2 ? "يمكنك أن تختار إختيارين فقط" : "يمكنك أن تختار " + limit + " إختيارات فقط"; }, + formatLoadMore: function (pageNumber) { return "تحميل المزيد من النتائج…"; }, + formatSearching: function () { return "البحث…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ar']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_az.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_az.js new file mode 100644 index 00000000000..19fd95b7a5f --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_az.js @@ -0,0 +1,20 @@ +/** + * Select2 Azerbaijani translation. + * + * Author: Farhad Safarov + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['az'] = { + formatMatches: function (matches) { return matches + " nəticə mövcuddur, hərəkət etdirmək üçün yuxarı və aşağı düymələrindən istifadə edin."; }, + formatNoMatches: function () { return "Nəticə tapılmadı"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return n + " simvol daxil edin"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return n + " simvol silin"; }, + formatSelectionTooBig: function (limit) { return "Sadəcə " + limit + " element seçə bilərsiniz"; }, + formatLoadMore: function (pageNumber) { return "Daha çox nəticə yüklənir…"; }, + formatSearching: function () { return "Axtarılır…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['az']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_bg.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_bg.js new file mode 100644 index 00000000000..3283d0ae5d2 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_bg.js @@ -0,0 +1,20 @@ +/** + * Select2 Bulgarian translation. + * + * @author Lubomir Vikev + * @author Uriy Efremochkin + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['bg'] = { + formatNoMatches: function () { return "Няма намерени съвпадения"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Моля въведете още " + n + " символ" + (n > 1 ? "а" : ""); }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Моля въведете с " + n + " по-малко символ" + (n > 1 ? "а" : ""); }, + formatSelectionTooBig: function (limit) { return "Можете да направите до " + limit + (limit > 1 ? " избора" : " избор"); }, + formatLoadMore: function (pageNumber) { return "Зареждат се още…"; }, + formatSearching: function () { return "Търсене…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['bg']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ca.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ca.js new file mode 100644 index 00000000000..dbea39e930b --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ca.js @@ -0,0 +1,19 @@ +/** + * Select2 Catalan translation. + * + * Author: David Planella + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['ca'] = { + formatNoMatches: function () { return "No s'ha trobat cap coincidència"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduïu " + n + " caràcter" + (n == 1 ? "" : "s") + " més"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Introduïu " + n + " caràcter" + (n == 1? "" : "s") + "menys"; }, + formatSelectionTooBig: function (limit) { return "Només podeu seleccionar " + limit + " element" + (limit == 1 ? "" : "s"); }, + formatLoadMore: function (pageNumber) { return "S'estan carregant més resultats…"; }, + formatSearching: function () { return "S'està cercant…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ca']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_cs.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_cs.js new file mode 100644 index 00000000000..ef121856485 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_cs.js @@ -0,0 +1,51 @@ +/** + * Select2 Czech translation. + * + * Author: Michal Marek + * Author - sklonovani: David Vallner + */ +(function ($) { + "use strict"; + // use text for the numbers 2 through 4 + var smallNumbers = { + 2: function(masc) { return (masc ? "dva" : "dvě"); }, + 3: function() { return "tři"; }, + 4: function() { return "čtyři"; } + } + $.fn.select2.locales['cs'] = { + formatNoMatches: function () { return "Nenalezeny žádné položky"; }, + formatInputTooShort: function (input, min) { + var n = min - input.length; + if (n == 1) { + return "Prosím zadejte ještě jeden znak"; + } else if (n <= 4) { + return "Prosím zadejte ještě další "+smallNumbers[n](true)+" znaky"; + } else { + return "Prosím zadejte ještě dalších "+n+" znaků"; + } + }, + formatInputTooLong: function (input, max) { + var n = input.length - max; + if (n == 1) { + return "Prosím zadejte o jeden znak méně"; + } else if (n <= 4) { + return "Prosím zadejte o "+smallNumbers[n](true)+" znaky méně"; + } else { + return "Prosím zadejte o "+n+" znaků méně"; + } + }, + formatSelectionTooBig: function (limit) { + if (limit == 1) { + return "Můžete zvolit jen jednu položku"; + } else if (limit <= 4) { + return "Můžete zvolit maximálně "+smallNumbers[limit](false)+" položky"; + } else { + return "Můžete zvolit maximálně "+limit+" položek"; + } + }, + formatLoadMore: function (pageNumber) { return "Načítají se další výsledky…"; }, + formatSearching: function () { return "Vyhledávání…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['cs']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_da.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_da.js new file mode 100644 index 00000000000..702238b9a09 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_da.js @@ -0,0 +1,19 @@ +/** + * Select2 Danish translation. + * + * Author: Anders Jenbo + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['da'] = { + formatNoMatches: function () { return "Ingen resultater fundet"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Angiv venligst " + n + " tegn mere"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Angiv venligst " + n + " tegn mindre"; }, + formatSelectionTooBig: function (limit) { return "Du kan kun vælge " + limit + " emne" + (limit === 1 ? "" : "r"); }, + formatLoadMore: function (pageNumber) { return "Indlæser flere resultater…"; }, + formatSearching: function () { return "Søger…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['da']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_de.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_de.js new file mode 100644 index 00000000000..e27541720c2 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_de.js @@ -0,0 +1,18 @@ +/** + * Select2 German translation + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['de'] = { + formatNoMatches: function () { return "Keine Übereinstimmungen gefunden"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Bitte " + n + " Zeichen mehr eingeben"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Bitte " + n + " Zeichen weniger eingeben"; }, + formatSelectionTooBig: function (limit) { return "Sie können nur " + limit + " Eintr" + (limit === 1 ? "ag" : "äge") + " auswählen"; }, + formatLoadMore: function (pageNumber) { return "Lade mehr Ergebnisse…"; }, + formatSearching: function () { return "Suche…"; }, + formatMatches: function (matches) { return matches + " Ergebnis " + (matches > 1 ? "se" : "") + " verfügbar, zum Navigieren die Hoch-/Runter-Pfeiltasten verwenden."; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['de']); +})(jQuery); \ No newline at end of file diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_el.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_el.js new file mode 100644 index 00000000000..d17459e1df3 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_el.js @@ -0,0 +1,19 @@ +/** + * Select2 Greek translation. + * + * @author Uriy Efremochkin + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['el'] = { + formatNoMatches: function () { return "Δεν βρέθηκαν αποτελέσματα"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Παρακαλούμε εισάγετε " + n + " περισσότερο" + (n > 1 ? "υς" : "") + " χαρακτήρ" + (n > 1 ? "ες" : "α"); }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Παρακαλούμε διαγράψτε " + n + " χαρακτήρ" + (n > 1 ? "ες" : "α"); }, + formatSelectionTooBig: function (limit) { return "Μπορείτε να επιλέξετε μόνο " + limit + " αντικείμεν" + (limit > 1 ? "α" : "ο"); }, + formatLoadMore: function (pageNumber) { return "Φόρτωση περισσότερων…"; }, + formatSearching: function () { return "Αναζήτηση…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['el']); +})(jQuery); \ No newline at end of file diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_es.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_es.js new file mode 100644 index 00000000000..92a19861e40 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_es.js @@ -0,0 +1,19 @@ +/** + * Select2 Spanish translation + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['es'] = { + formatMatches: function (matches) { if (matches === 1) { return "Un resultado disponible, presione enter para seleccionarlo."; } return matches + " resultados disponibles, use las teclas de dirección para navegar."; }, + formatNoMatches: function () { return "No se encontraron resultados"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Por favor, introduzca " + n + " car" + (n == 1? "ácter" : "acteres"); }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Por favor, elimine " + n + " car" + (n == 1? "ácter" : "acteres"); }, + formatSelectionTooBig: function (limit) { return "Sólo puede seleccionar " + limit + " elemento" + (limit == 1 ? "" : "s"); }, + formatLoadMore: function (pageNumber) { return "Cargando más resultados…"; }, + formatSearching: function () { return "Buscando…"; }, + formatAjaxError: function() { return "La carga falló"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['es']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_et.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_et.js new file mode 100644 index 00000000000..4d69f55e3fb --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_et.js @@ -0,0 +1,19 @@ +/** + * Select2 Estonian translation. + * + * Author: Kuldar Kalvik + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['et'] = { + formatNoMatches: function () { return "Tulemused puuduvad"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Sisesta " + n + " täht" + (n == 1 ? "" : "e") + " rohkem"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Sisesta " + n + " täht" + (n == 1? "" : "e") + " vähem"; }, + formatSelectionTooBig: function (limit) { return "Saad vaid " + limit + " tulemus" + (limit == 1 ? "e" : "t") + " valida"; }, + formatLoadMore: function (pageNumber) { return "Laen tulemusi.."; }, + formatSearching: function () { return "Otsin.."; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['et']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_eu.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_eu.js new file mode 100644 index 00000000000..67ae8d05ae5 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_eu.js @@ -0,0 +1,45 @@ +/** + * Select2 Basque translation. + * + * Author: Julen Ruiz Aizpuru + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['eu'] = { + formatNoMatches: function () { + return "Ez da bat datorrenik aurkitu"; + }, + formatInputTooShort: function (input, min) { + var n = min - input.length; + if (n === 1) { + return "Idatzi karaktere bat gehiago"; + } else { + return "Idatzi " + n + " karaktere gehiago"; + } + }, + formatInputTooLong: function (input, max) { + var n = input.length - max; + if (n === 1) { + return "Idatzi karaktere bat gutxiago"; + } else { + return "Idatzi " + n + " karaktere gutxiago"; + } + }, + formatSelectionTooBig: function (limit) { + if (limit === 1 ) { + return "Elementu bakarra hauta dezakezu"; + } else { + return limit + " elementu hauta ditzakezu soilik"; + } + }, + formatLoadMore: function (pageNumber) { + return "Emaitza gehiago kargatzen…"; + }, + formatSearching: function () { + return "Bilatzen…"; + } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['eu']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_fa.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_fa.js new file mode 100644 index 00000000000..b3ffd8b7da6 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_fa.js @@ -0,0 +1,21 @@ +/** + * Select2 Persian translation. + * + * Author: Ali Choopan + * Author: Ebrahim Byagowi + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['fa'] = { + formatMatches: function (matches) { return matches + " نتیجه موجود است، کلیدهای جهت بالا و پایین را برای گشتن استفاده کنید."; }, + formatNoMatches: function () { return "نتیجه‌ای یافت نشد."; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "لطفاً " + n + " نویسه بیشتر وارد نمایید"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "لطفاً " + n + " نویسه را حذف کنید."; }, + formatSelectionTooBig: function (limit) { return "شما فقط می‌توانید " + limit + " مورد را انتخاب کنید"; }, + formatLoadMore: function (pageNumber) { return "در حال بارگیری موارد بیشتر…"; }, + formatSearching: function () { return "در حال جستجو…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['fa']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_fi.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_fi.js new file mode 100644 index 00000000000..6487fbdad35 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_fi.js @@ -0,0 +1,30 @@ +/** + * Select2 Finnish translation + */ +(function ($) { + "use strict"; + $.fn.select2.locales['fi'] = { + formatNoMatches: function () { + return "Ei tuloksia"; + }, + formatInputTooShort: function (input, min) { + var n = min - input.length; + return "Ole hyvä ja anna " + n + " merkkiä lisää"; + }, + formatInputTooLong: function (input, max) { + var n = input.length - max; + return "Ole hyvä ja anna " + n + " merkkiä vähemmän"; + }, + formatSelectionTooBig: function (limit) { + return "Voit valita ainoastaan " + limit + " kpl"; + }, + formatLoadMore: function (pageNumber) { + return "Ladataan lisää tuloksia…"; + }, + formatSearching: function () { + return "Etsitään…"; + } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['fi']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_fr.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_fr.js new file mode 100644 index 00000000000..d5485d6be76 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_fr.js @@ -0,0 +1,18 @@ +/** + * Select2 French translation + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['fr'] = { + formatMatches: function (matches) { return matches + " résultats sont disponibles, utilisez les flèches haut et bas pour naviguer."; }, + formatNoMatches: function () { return "Aucun résultat trouvé"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Saisissez " + n + " caractère" + (n == 1? "" : "s") + " supplémentaire" + (n == 1? "" : "s") ; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Supprimez " + n + " caractère" + (n == 1? "" : "s"); }, + formatSelectionTooBig: function (limit) { return "Vous pouvez seulement sélectionner " + limit + " élément" + (limit == 1 ? "" : "s"); }, + formatLoadMore: function (pageNumber) { return "Chargement de résultats supplémentaires…"; }, + formatSearching: function () { return "Recherche en cours…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['fr']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_gl.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_gl.js new file mode 100644 index 00000000000..9335167da96 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_gl.js @@ -0,0 +1,45 @@ +/** + * Select2 Galician translation + * + * Author: Leandro Regueiro + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['gl'] = { + formatNoMatches: function () { + return "Non se atoparon resultados"; + }, + formatInputTooShort: function (input, min) { + var n = min - input.length; + if (n === 1) { + return "Engada un carácter"; + } else { + return "Engada " + n + " caracteres"; + } + }, + formatInputTooLong: function (input, max) { + var n = input.length - max; + if (n === 1) { + return "Elimine un carácter"; + } else { + return "Elimine " + n + " caracteres"; + } + }, + formatSelectionTooBig: function (limit) { + if (limit === 1 ) { + return "Só pode seleccionar un elemento"; + } else { + return "Só pode seleccionar " + limit + " elementos"; + } + }, + formatLoadMore: function (pageNumber) { + return "Cargando máis resultados…"; + }, + formatSearching: function () { + return "Buscando…"; + } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['gl']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_he.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_he.js new file mode 100644 index 00000000000..789dcdcaaf2 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_he.js @@ -0,0 +1,19 @@ +/** +* Select2 Hebrew translation. +* +* Author: Yakir Sitbon +*/ +(function ($) { + "use strict"; + + $.fn.select2.locales['he'] = { + formatNoMatches: function () { return "לא נמצאו התאמות"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "נא להזין עוד " + n + " תווים נוספים"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "נא להזין פחות " + n + " תווים"; }, + formatSelectionTooBig: function (limit) { return "ניתן לבחור " + limit + " פריטים"; }, + formatLoadMore: function (pageNumber) { return "טוען תוצאות נוספות…"; }, + formatSearching: function () { return "מחפש…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['he']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_hr.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_hr.js new file mode 100644 index 00000000000..ce8051c788e --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_hr.js @@ -0,0 +1,24 @@ +/** + * Select2 Croatian translation. + * + * @author Edi Modrić + * @author Uriy Efremochkin + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['hr'] = { + formatNoMatches: function () { return "Nema rezultata"; }, + formatInputTooShort: function (input, min) { return "Unesite još" + character(min - input.length); }, + formatInputTooLong: function (input, max) { return "Unesite" + character(input.length - max) + " manje"; }, + formatSelectionTooBig: function (limit) { return "Maksimalan broj odabranih stavki je " + limit; }, + formatLoadMore: function (pageNumber) { return "Učitavanje rezultata…"; }, + formatSearching: function () { return "Pretraga…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['hr']); + + function character (n) { + return " " + n + " znak" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 19) ? n%10 > 1 ? "a" : "" : "ova"); + } +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_hu.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_hu.js new file mode 100644 index 00000000000..f431f246360 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_hu.js @@ -0,0 +1,17 @@ +/** + * Select2 Hungarian translation + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['hu'] = { + formatNoMatches: function () { return "Nincs találat."; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Túl rövid. Még " + n + " karakter hiányzik."; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Túl hosszú. " + n + " karakterrel több, mint kellene."; }, + formatSelectionTooBig: function (limit) { return "Csak " + limit + " elemet lehet kiválasztani."; }, + formatLoadMore: function (pageNumber) { return "Töltés…"; }, + formatSearching: function () { return "Keresés…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['hu']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_id.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_id.js new file mode 100644 index 00000000000..e7ea0ac6277 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_id.js @@ -0,0 +1,21 @@ +/** + * Select2 Indonesian translation. + * + * Author: Ibrahim Yusuf + * Author: Salahuddin Hairai + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['id'] = { + formatMatches: function (matches) { if (matches === 1) { return "Satu keputusan ditemui, tekan enter untuk memilih."; } return matches + " keputusan ditemui, gunakan kekunci anak panah ke atas dan ke bawah untuk menavigasi."; }, + formatNoMatches: function () { return "Tidak ada data yang sesuai"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Masukkan " + n + " huruf lagi"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Hapuskan " + n + " huruf" ; }, + formatSelectionTooBig: function (limit) { return "Anda hanya dapat memilih " + limit + " pilihan"; }, + formatLoadMore: function (pageNumber) { return "Mengambil data…"; }, + formatSearching: function () { return "Mencari…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['id']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_is.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_is.js new file mode 100644 index 00000000000..273f33de8c0 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_is.js @@ -0,0 +1,17 @@ +/** + * Select2 Icelandic translation. + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['is'] = { + formatNoMatches: function () { return "Ekkert fannst"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Vinsamlegast skrifið " + n + " staf" + (n > 1 ? "i" : "") + " í viðbót"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Vinsamlegast styttið texta um " + n + " staf" + (n > 1 ? "i" : ""); }, + formatSelectionTooBig: function (limit) { return "Þú getur aðeins valið " + limit + " atriði"; }, + formatLoadMore: function (pageNumber) { return "Sæki fleiri niðurstöður…"; }, + formatSearching: function () { return "Leita…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['is']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_it.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_it.js new file mode 100644 index 00000000000..6e2b8e23709 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_it.js @@ -0,0 +1,17 @@ +/** + * Select2 Italian translation + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['it'] = { + formatNoMatches: function () { return "Nessuna corrispondenza trovata"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Inserisci ancora " + n + " caratter" + (n == 1? "e" : "i"); }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Inserisci " + n + " caratter" + (n == 1? "e" : "i") + " in meno"; }, + formatSelectionTooBig: function (limit) { return "Puoi selezionare solo " + limit + " element" + (limit == 1 ? "o" : "i"); }, + formatLoadMore: function (pageNumber) { return "Caricamento in corso…"; }, + formatSearching: function () { return "Ricerca…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['it']); +})(jQuery); \ No newline at end of file diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ja.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ja.js new file mode 100644 index 00000000000..7dbd8d7ee86 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ja.js @@ -0,0 +1,17 @@ +/** + * Select2 Japanese translation. + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['ja'] = { + formatNoMatches: function () { return "該当なし"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "後" + n + "文字入れてください"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "検索文字列が" + n + "文字長すぎます"; }, + formatSelectionTooBig: function (limit) { return "最多で" + limit + "項目までしか選択できません"; }, + formatLoadMore: function (pageNumber) { return "読込中・・・"; }, + formatSearching: function () { return "検索中・・・"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ja']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ka.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ka.js new file mode 100644 index 00000000000..6cbe1d8f31e --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ka.js @@ -0,0 +1,19 @@ +/** + * Select2 Georgian (Kartuli) translation. + * + * Author: Dimitri Kurashvili dimakura@gmail.com + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['ka'] = { + formatNoMatches: function () { return "ვერ მოიძებნა"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "გთხოვთ შეიყვანოთ კიდევ " + n + " სიმბოლო"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "გთხოვთ წაშალოთ " + n + " სიმბოლო"; }, + formatSelectionTooBig: function (limit) { return "თქვენ შეგიძლიათ მხოლოდ " + limit + " ჩანაწერის მონიშვნა"; }, + formatLoadMore: function (pageNumber) { return "შედეგის ჩატვირთვა…"; }, + formatSearching: function () { return "ძებნა…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ka']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ko.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ko.js new file mode 100644 index 00000000000..bf036e09e6e --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ko.js @@ -0,0 +1,19 @@ +/** + * Select2 Korean translation. + * + * @author Swen Mun + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['ko'] = { + formatNoMatches: function () { return "결과 없음"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "너무 짧습니다. "+n+"글자 더 입력해주세요."; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "너무 깁니다. "+n+"글자 지워주세요."; }, + formatSelectionTooBig: function (limit) { return "최대 "+limit+"개까지만 선택하실 수 있습니다."; }, + formatLoadMore: function (pageNumber) { return "불러오는 중…"; }, + formatSearching: function () { return "검색 중…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ko']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_lt.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_lt.js new file mode 100644 index 00000000000..7d7040f72f1 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_lt.js @@ -0,0 +1,26 @@ +/** + * Select2 Lithuanian translation. + * + * @author CRONUS Karmalakas + * @author Uriy Efremochkin + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['lt'] = { + formatNoMatches: function () { return "Atitikmenų nerasta"; }, + formatInputTooShort: function (input, min) { return "Įrašykite dar" + character(min - input.length); }, + formatInputTooLong: function (input, max) { return "Pašalinkite" + character(input.length - max); }, + formatSelectionTooBig: function (limit) { + return "Jūs galite pasirinkti tik " + limit + " element" + ((limit%100 > 9 && limit%100 < 21) || limit%10 == 0 ? "ų" : limit%10 > 1 ? "us" : "ą"); + }, + formatLoadMore: function (pageNumber) { return "Kraunama daugiau rezultatų…"; }, + formatSearching: function () { return "Ieškoma…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['lt']); + + function character (n) { + return " " + n + " simbol" + ((n%100 > 9 && n%100 < 21) || n%10 == 0 ? "ių" : n%10 > 1 ? "ius" : "į"); + } +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_lv.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_lv.js new file mode 100644 index 00000000000..4afc5b41c80 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_lv.js @@ -0,0 +1,19 @@ +/** + * Select2 Latvian translation. + * + * @author Uriy Efremochkin + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['lv'] = { + formatNoMatches: function () { return "Sakritību nav"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Lūdzu ievadiet vēl " + n + " simbol" + (n == 11 ? "us" : n%10 == 1 ? "u" : "us"); }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Lūdzu ievadiet par " + n + " simbol" + (n == 11 ? "iem" : n%10 == 1 ? "u" : "iem") + " mazāk"; }, + formatSelectionTooBig: function (limit) { return "Jūs varat izvēlēties ne vairāk kā " + limit + " element" + (limit == 11 ? "us" : limit%10 == 1 ? "u" : "us"); }, + formatLoadMore: function (pageNumber) { return "Datu ielāde…"; }, + formatSearching: function () { return "Meklēšana…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['lv']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_mk.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_mk.js new file mode 100644 index 00000000000..8a51a9e0b3c --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_mk.js @@ -0,0 +1,19 @@ +/** + * Select2 Macedonian translation. + * + * Author: Marko Aleksic + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['mk'] = { + formatNoMatches: function () { return "Нема пронајдено совпаѓања"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Ве молиме внесете уште " + n + " карактер" + (n == 1 ? "" : "и"); }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Ве молиме внесете " + n + " помалку карактер" + (n == 1? "" : "и"); }, + formatSelectionTooBig: function (limit) { return "Можете да изберете само " + limit + " ставк" + (limit == 1 ? "а" : "и"); }, + formatLoadMore: function (pageNumber) { return "Вчитување резултати…"; }, + formatSearching: function () { return "Пребарување…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['mk']); +})(jQuery); \ No newline at end of file diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ms.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ms.js new file mode 100644 index 00000000000..6447c089932 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ms.js @@ -0,0 +1,21 @@ +/** + * Select2 Malay translation. + * + * Author: Kepoweran + * Author: Salahuddin Hairai + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['ms'] = { + formatMatches: function (matches) { if (matches === 1) { return "Satu keputusan ditemui, tekan enter untuk memilih."; } return matches + " keputusan ditemui, gunakan kekunci anak panah ke atas dan ke bawah untuk menavigasi."; }, + formatNoMatches: function () { return "Tiada padanan yang ditemui"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Sila masukkan " + n + " aksara lagi"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Sila hapuskan " + n + " aksara"; }, + formatSelectionTooBig: function (limit) { return "Anda hanya boleh memilih " + limit + " pilihan"; }, + formatLoadMore: function (pageNumber) { return "Sedang memuatkan keputusan…"; }, + formatSearching: function () { return "Mencari…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ms']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_nb.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_nb.js new file mode 100644 index 00000000000..cb5dfaeef22 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_nb.js @@ -0,0 +1,22 @@ +/** + * Select2 Norwegian Bokmål translation. + * + * Author: Torgeir Veimo + * Author: Bjørn Johansen + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['nb'] = { + formatMatches: function (matches) { if (matches === 1) { return "Ett resultat er tilgjengelig, trykk enter for å velge det."; } return matches + " resultater er tilgjengelig. Bruk piltastene opp og ned for å navigere."; }, + formatNoMatches: function () { return "Ingen treff"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Vennligst skriv inn " + n + (n>1 ? " flere tegn" : " tegn til"); }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Vennligst fjern " + n + " tegn"; }, + formatSelectionTooBig: function (limit) { return "Du kan velge maks " + limit + " elementer"; }, + formatLoadMore: function (pageNumber) { return "Laster flere resultater …"; }, + formatSearching: function () { return "Søker …"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['no']); +})(jQuery); + diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_nl.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_nl.js new file mode 100644 index 00000000000..985741ec20f --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_nl.js @@ -0,0 +1,17 @@ +/** + * Select2 Dutch translation + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['nl'] = { + formatNoMatches: function () { return "Geen resultaten gevonden"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Vul nog " + n + " karakter" + (n == 1? "" : "s") + " in"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Haal " + n + " karakter" + (n == 1? "" : "s") + " weg"; }, + formatSelectionTooBig: function (limit) { return "Maximaal " + limit + " item" + (limit == 1 ? "" : "s") + " toegestaan"; }, + formatLoadMore: function (pageNumber) { return "Meer resultaten laden…"; }, + formatSearching: function () { return "Zoeken…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['nl']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_pl.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_pl.js new file mode 100644 index 00000000000..87c26194131 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_pl.js @@ -0,0 +1,54 @@ +/** + * Select2 Polish translation. + * + * @author Jan Kondratowicz + * @author Uriy Efremochkin + * @author Michał Połtyn + * @author Damian Zajkowski + */ +(function($) { + "use strict"; + + $.fn.select2.locales['pl'] = { + formatNoMatches: function() { + return "Brak wyników"; + }, + formatInputTooShort: function(input, min) { + return "Wpisz co najmniej" + character(min - input.length, "znak", "i"); + }, + formatInputTooLong: function(input, max) { + return "Wpisana fraza jest za długa o" + character(input.length - max, "znak", "i"); + }, + formatSelectionTooBig: function(limit) { + return "Możesz zaznaczyć najwyżej" + character(limit, "element", "y"); + }, + formatLoadMore: function(pageNumber) { + return "Ładowanie wyników…"; + }, + formatSearching: function() { + return "Szukanie…"; + } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['pl']); + + function character(n, word, pluralSuffix) { + //Liczba pojedyncza - brak suffiksu + //jeden znak + //jeden element + var suffix = ''; + if (n > 1 && n < 5) { + //Liczaba mnoga ilość od 2 do 4 - własny suffiks + //Dwa znaki, trzy znaki, cztery znaki. + //Dwa elementy, trzy elementy, cztery elementy + suffix = pluralSuffix; + } else if (n == 0 || n >= 5) { + //Ilość 0 suffiks ów + //Liczaba mnoga w ilości 5 i więcej - suffiks ów (nie poprawny dla wszystkich wyrazów, np. 100 wiadomości) + //Zero znaków, Pięć znaków, sześć znaków, siedem znaków, osiem znaków. + //Zero elementów Pięć elementów, sześć elementów, siedem elementów, osiem elementów. + suffix = 'ów'; + } + return " " + n + " " + word + suffix; + } +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_pt-BR.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_pt-BR.js new file mode 100644 index 00000000000..51b037de580 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_pt-BR.js @@ -0,0 +1,18 @@ +/** + * Select2 Brazilian Portuguese translation + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['pt-BR'] = { + formatNoMatches: function () { return "Nenhum resultado encontrado"; }, + formatAjaxError: function () { return "Erro na busca"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Digite " + (min == 1 ? "" : "mais") + " " + n + " caracter" + (n == 1? "" : "es"); }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " caracter" + (n == 1? "" : "es"); }, + formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); }, + formatLoadMore: function (pageNumber) { return "Carregando mais resultados…"; }, + formatSearching: function () { return "Buscando…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['pt-BR']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_pt-PT.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_pt-PT.js new file mode 100644 index 00000000000..ae55a4fc4ef --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_pt-PT.js @@ -0,0 +1,17 @@ +/** + * Select2 Portuguese (Portugal) translation + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['pt-PT'] = { + formatNoMatches: function () { return "Nenhum resultado encontrado"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Introduza " + n + " car" + (n == 1 ? "ácter" : "acteres"); }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Apague " + n + " car" + (n == 1 ? "ácter" : "acteres"); }, + formatSelectionTooBig: function (limit) { return "Só é possível selecionar " + limit + " elemento" + (limit == 1 ? "" : "s"); }, + formatLoadMore: function (pageNumber) { return "A carregar mais resultados…"; }, + formatSearching: function () { return "A pesquisar…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['pt-PT']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ro.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ro.js new file mode 100644 index 00000000000..21b0cf18186 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ro.js @@ -0,0 +1,17 @@ +/** + * Select2 Romanian translation. + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['ro'] = { + formatNoMatches: function () { return "Nu a fost găsit nimic"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Vă rugăm să introduceți incă " + n + " caracter" + (n == 1 ? "" : "e"); }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Vă rugăm să introduceți mai puțin de " + n + " caracter" + (n == 1? "" : "e"); }, + formatSelectionTooBig: function (limit) { return "Aveți voie să selectați cel mult " + limit + " element" + (limit == 1 ? "" : "e"); }, + formatLoadMore: function (pageNumber) { return "Se încarcă…"; }, + formatSearching: function () { return "Căutare…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ro']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_rs.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_rs.js new file mode 100644 index 00000000000..72c16389c9e --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_rs.js @@ -0,0 +1,19 @@ +/** + * Select2 Serbian translation. + * + * @author Limon Monte + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['rs'] = { + formatNoMatches: function () { return "Ništa nije pronađeno"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Ukucajte bar još " + n + " simbol" + (n % 10 == 1 && n % 100 != 11 ? "" : "a"); }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Obrišite " + n + " simbol" + (n % 10 == 1 && n % 100 != 11 ? "" : "a"); }, + formatSelectionTooBig: function (limit) { return "Možete izabrati samo " + limit + " stavk" + (limit % 10 == 1 && limit % 100 != 11 ? "u" : (limit % 10 >= 2 && limit % 10 <= 4 && (limit % 100 < 12 || limit % 100 > 14)? "e" : "i")); }, + formatLoadMore: function (pageNumber) { return "Preuzimanje još rezultata…"; }, + formatSearching: function () { return "Pretraga…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['rs']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ru.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ru.js new file mode 100644 index 00000000000..2a6c7702c42 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ru.js @@ -0,0 +1,23 @@ +/** + * Select2 Russian translation. + * + * @author Uriy Efremochkin + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['ru'] = { + formatNoMatches: function () { return "Совпадений не найдено"; }, + formatInputTooShort: function (input, min) { return "Пожалуйста, введите еще хотя бы" + character(min - input.length); }, + formatInputTooLong: function (input, max) { return "Пожалуйста, введите на" + character(input.length - max) + " меньше"; }, + formatSelectionTooBig: function (limit) { return "Вы можете выбрать не более " + limit + " элемент" + (limit%10 == 1 && limit%100 != 11 ? "а" : "ов"); }, + formatLoadMore: function (pageNumber) { return "Загрузка данных…"; }, + formatSearching: function () { return "Поиск…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ru']); + + function character (n) { + return " " + n + " символ" + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 20) ? n%10 > 1 ? "a" : "" : "ов"); + } +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_sk.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_sk.js new file mode 100644 index 00000000000..027530c9388 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_sk.js @@ -0,0 +1,50 @@ +/** + * Select2 Slovak translation. + * + * Author: David Vallner + */ +(function ($) { + "use strict"; + // use text for the numbers 2 through 4 + var smallNumbers = { + 2: function(masc) { return (masc ? "dva" : "dve"); }, + 3: function() { return "tri"; }, + 4: function() { return "štyri"; } + }; + $.fn.select2.locales['sk'] = { + formatNoMatches: function () { return "Nenašli sa žiadne položky"; }, + formatInputTooShort: function (input, min) { + var n = min - input.length; + if (n == 1) { + return "Prosím, zadajte ešte jeden znak"; + } else if (n <= 4) { + return "Prosím, zadajte ešte ďalšie "+smallNumbers[n](true)+" znaky"; + } else { + return "Prosím, zadajte ešte ďalších "+n+" znakov"; + } + }, + formatInputTooLong: function (input, max) { + var n = input.length - max; + if (n == 1) { + return "Prosím, zadajte o jeden znak menej"; + } else if (n >= 2 && n <= 4) { + return "Prosím, zadajte o "+smallNumbers[n](true)+" znaky menej"; + } else { + return "Prosím, zadajte o "+n+" znakov menej"; + } + }, + formatSelectionTooBig: function (limit) { + if (limit == 1) { + return "Môžete zvoliť len jednu položku"; + } else if (limit >= 2 && limit <= 4) { + return "Môžete zvoliť najviac "+smallNumbers[limit](false)+" položky"; + } else { + return "Môžete zvoliť najviac "+limit+" položiek"; + } + }, + formatLoadMore: function (pageNumber) { return "Načítavajú sa ďalšie výsledky…"; }, + formatSearching: function () { return "Vyhľadávanie…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['sk']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_sv.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_sv.js new file mode 100644 index 00000000000..96f8c0a881d --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_sv.js @@ -0,0 +1,19 @@ +/** + * Select2 Swedish translation. + * + * Author: Jens Rantil + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['sv'] = { + formatNoMatches: function () { return "Inga träffar"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Var god skriv in " + n + (n>1 ? " till tecken" : " tecken till"); }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Var god sudda ut " + n + " tecken"; }, + formatSelectionTooBig: function (limit) { return "Du kan max välja " + limit + " element"; }, + formatLoadMore: function (pageNumber) { return "Laddar fler resultat…"; }, + formatSearching: function () { return "Söker…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['sv']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_th.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_th.js new file mode 100644 index 00000000000..7f3e6ef8c39 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_th.js @@ -0,0 +1,19 @@ +/** + * Select2 Thai translation. + * + * Author: Atsawin Chaowanakritsanakul + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['th'] = { + formatNoMatches: function () { return "ไม่พบข้อมูล"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "โปรดพิมพ์เพิ่มอีก " + n + " ตัวอักษร"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "โปรดลบออก " + n + " ตัวอักษร"; }, + formatSelectionTooBig: function (limit) { return "คุณสามารถเลือกได้ไม่เกิน " + limit + " รายการ"; }, + formatLoadMore: function (pageNumber) { return "กำลังค้นข้อมูลเพิ่ม…"; }, + formatSearching: function () { return "กำลังค้นข้อมูล…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['th']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_tr.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_tr.js new file mode 100644 index 00000000000..2330bc205ba --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_tr.js @@ -0,0 +1,20 @@ +/** + * Select2 Turkish translation. + * + * Author: Salim KAYABAŞI + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['tr'] = { + formatMatches: function (matches) { if (matches === 1) { return "Sadece bir sonuç bulundu, seçmek için enter tuşuna basabilirsiniz."; } return matches + " sonuç bulundu, yukarı ve aşağı tuşları ile seçebilirsiniz."; }, + formatNoMatches: function () { return "Sonuç bulunamadı"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "En az " + n + " karakter daha girmelisiniz"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return n + " karakter azaltmalısınız"; }, + formatSelectionTooBig: function (limit) { return "Sadece " + limit + " seçim yapabilirsiniz"; }, + formatLoadMore: function (pageNumber) { return "Daha fazla…"; }, + formatSearching: function () { return "Aranıyor…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['tr']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ug-CN.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ug-CN.js new file mode 100644 index 00000000000..579588a7ac0 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_ug-CN.js @@ -0,0 +1,16 @@ +/** + * Select2 Uyghur translation + */ +(function ($) { + "use strict"; + $.fn.select2.locales['ug-CN'] = { + formatNoMatches: function () { return "ماس كېلىدىغان ئۇچۇر تېپىلمىدى"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "يەنە " + n + " ھەرپ كىرگۈزۈڭ";}, + formatInputTooLong: function (input, max) { var n = input.length - max; return "" + n + "ھەرپ ئۆچۈرۈڭ";}, + formatSelectionTooBig: function (limit) { return "ئەڭ كۆپ بولغاندا" + limit + " تال ئۇچۇر تاللىيالايسىز"; }, + formatLoadMore: function (pageNumber) { return "ئۇچۇرلار ئوقۇلىۋاتىدۇ…"; }, + formatSearching: function () { return "ئىزدەۋاتىدۇ…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['ug-CN']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_uk.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_uk.js new file mode 100644 index 00000000000..b5bd0e02d2c --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_uk.js @@ -0,0 +1,25 @@ +/** + * Select2 Ukrainian translation. + * + * @author bigmihail + * @author Uriy Efremochkin + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['uk'] = { + formatMatches: function (matches) { return character(matches, "результат") + " знайдено, використовуйте клавіші зі стрілками вверх та вниз для навігації."; }, + formatNoMatches: function () { return "Нічого не знайдено"; }, + formatInputTooShort: function (input, min) { return "Введіть буль ласка ще " + character(min - input.length, "символ"); }, + formatInputTooLong: function (input, max) { return "Введіть буль ласка на " + character(input.length - max, "символ") + " менше"; }, + formatSelectionTooBig: function (limit) { return "Ви можете вибрати лише " + character(limit, "елемент"); }, + formatLoadMore: function (pageNumber) { return "Завантаження даних…"; }, + formatSearching: function () { return "Пошук…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['uk']); + + function character (n, word) { + return n + " " + word + (n%10 < 5 && n%10 > 0 && (n%100 < 5 || n%100 > 19) ? n%10 > 1 ? "и" : "" : "ів"); + } +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_vi.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_vi.js new file mode 100644 index 00000000000..9517cb6bd8e --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_vi.js @@ -0,0 +1,20 @@ +/** + * Select2 Vietnamese translation. + * + * Author: Long Nguyen , Nguyen Chien Cong + */ +(function ($) { + "use strict"; + + $.fn.select2.locales['vi'] = { + formatNoMatches: function () { return "Không tìm thấy kết quả"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "Vui lòng nhập nhiều hơn " + n + " ký tự"; }, + formatInputTooLong: function (input, max) { var n = input.length - max; return "Vui lòng nhập ít hơn " + n + " ký tự"; }, + formatSelectionTooBig: function (limit) { return "Chỉ có thể chọn được " + limit + " lựa chọn"; }, + formatLoadMore: function (pageNumber) { return "Đang lấy thêm kết quả…"; }, + formatSearching: function () { return "Đang tìm…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['vi']); +})(jQuery); + diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_zh-CN.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_zh-CN.js new file mode 100644 index 00000000000..e988dac1a4c --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_zh-CN.js @@ -0,0 +1,16 @@ +/** + * Select2 Chinese translation + */ +(function ($) { + "use strict"; + $.fn.select2.locales['zh-CN'] = { + formatNoMatches: function () { return "没有找到匹配项"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "请再输入" + n + "个字符";}, + formatInputTooLong: function (input, max) { var n = input.length - max; return "请删掉" + n + "个字符";}, + formatSelectionTooBig: function (limit) { return "你只能选择最多" + limit + "项"; }, + formatLoadMore: function (pageNumber) { return "加载结果中…"; }, + formatSearching: function () { return "搜索中…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['zh-CN']); +})(jQuery); diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_zh-TW.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_zh-TW.js new file mode 100644 index 00000000000..85dbd5afc23 --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/select2_locale_zh-TW.js @@ -0,0 +1,16 @@ +/** + * Select2 Traditional Chinese translation + */ +(function ($) { + "use strict"; + $.fn.select2.locales['zh-TW'] = { + formatNoMatches: function () { return "沒有找到相符的項目"; }, + formatInputTooShort: function (input, min) { var n = min - input.length; return "請再輸入" + n + "個字元";}, + formatInputTooLong: function (input, max) { var n = input.length - max; return "請刪掉" + n + "個字元";}, + formatSelectionTooBig: function (limit) { return "你只能選擇最多" + limit + "項"; }, + formatLoadMore: function (pageNumber) { return "載入中…"; }, + formatSearching: function () { return "搜尋中…"; } + }; + + $.extend($.fn.select2.defaults, $.fn.select2.locales['zh-TW']); +})(jQuery); diff --git a/backend/vendor/assets/stylesheets/solidus_admin/select2.css b/backend/vendor/assets/stylesheets/solidus_admin/select2.css new file mode 100644 index 00000000000..915347037e0 --- /dev/null +++ b/backend/vendor/assets/stylesheets/solidus_admin/select2.css @@ -0,0 +1,692 @@ +/* +Version: 3.5.4 Timestamp: Sun Aug 30 13:30:32 EDT 2015 +*/ +.select2-container { + margin: 0; + position: relative; + display: inline-block; + vertical-align: middle; +} + +.select2-container, +.select2-drop, +.select2-search, +.select2-search input { + /* + Force border-box so that % widths fit the parent + container without overlap because of margin/padding. + More Info : http://www.quirksmode.org/css/box.html + */ + -webkit-box-sizing: border-box; /* webkit */ + -moz-box-sizing: border-box; /* firefox */ + box-sizing: border-box; /* css3 */ +} + +.select2-container .select2-choice { + display: block; + height: 26px; + padding: 0 0 0 8px; + overflow: hidden; + position: relative; + + border: 1px solid #aaa; + white-space: nowrap; + line-height: 26px; + color: #444; + text-decoration: none; + + border-radius: 4px; + + background-clip: padding-box; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + background-color: #fff; + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.5, #fff)); + background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 50%); + background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 50%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#ffffff', endColorstr = '#eeeeee', GradientType = 0); + background-image: linear-gradient(to top, #eee 0%, #fff 50%); +} + +html[dir="rtl"] .select2-container .select2-choice { + padding: 0 8px 0 0; +} + +.select2-container.select2-drop-above .select2-choice { + border-bottom-color: #aaa; + + border-radius: 0 0 4px 4px; + + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #eee), color-stop(0.9, #fff)); + background-image: -webkit-linear-gradient(center bottom, #eee 0%, #fff 90%); + background-image: -moz-linear-gradient(center bottom, #eee 0%, #fff 90%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#eeeeee', GradientType=0); + background-image: linear-gradient(to bottom, #eee 0%, #fff 90%); +} + +.select2-container.select2-allowclear .select2-choice .select2-chosen { + margin-right: 42px; +} + +.select2-container .select2-choice > .select2-chosen { + margin-right: 26px; + display: block; + overflow: hidden; + + white-space: nowrap; + + text-overflow: ellipsis; + float: none; + width: auto; +} + +html[dir="rtl"] .select2-container .select2-choice > .select2-chosen { + margin-left: 26px; + margin-right: 0; +} + +.select2-container .select2-choice abbr { + display: none; + width: 12px; + height: 12px; + position: absolute; + right: 24px; + top: 8px; + + font-size: 1px; + text-decoration: none; + + border: 0; + background: url('select2.png') right top no-repeat; + cursor: pointer; + outline: 0; +} + +.select2-container.select2-allowclear .select2-choice abbr { + display: inline-block; +} + +.select2-container .select2-choice abbr:hover { + background-position: right -11px; + cursor: pointer; +} + +.select2-drop-mask { + border: 0; + margin: 0; + padding: 0; + position: fixed; + left: 0; + top: 0; + min-height: 100%; + min-width: 100%; + height: auto; + width: auto; + opacity: 0; + z-index: 9998; + /* styles required for IE to work */ + background-color: #fff; + filter: alpha(opacity=0); +} + +.select2-drop { + width: 100%; + margin-top: -1px; + position: absolute; + z-index: 9999; + top: 100%; + + background: #fff; + color: #000; + border: 1px solid #aaa; + border-top: 0; + + border-radius: 0 0 4px 4px; + + -webkit-box-shadow: 0 4px 5px rgba(0, 0, 0, .15); + box-shadow: 0 4px 5px rgba(0, 0, 0, .15); +} + +.select2-drop.select2-drop-above { + margin-top: 1px; + border-top: 1px solid #aaa; + border-bottom: 0; + + border-radius: 4px 4px 0 0; + + -webkit-box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); + box-shadow: 0 -4px 5px rgba(0, 0, 0, .15); +} + +.select2-drop-active { + border: 1px solid #5897fb; + border-top: none; +} + +.select2-drop.select2-drop-above.select2-drop-active { + border-top: 1px solid #5897fb; +} + +.select2-drop-auto-width { + border-top: 1px solid #aaa; + width: auto; +} + +.select2-container .select2-choice .select2-arrow { + display: inline-block; + width: 18px; + height: 100%; + position: absolute; + right: 0; + top: 0; + + border-left: 1px solid #aaa; + border-radius: 0 4px 4px 0; + + background-clip: padding-box; + + background: #ccc; + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #ccc), color-stop(0.6, #eee)); + background-image: -webkit-linear-gradient(center bottom, #ccc 0%, #eee 60%); + background-image: -moz-linear-gradient(center bottom, #ccc 0%, #eee 60%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr = '#eeeeee', endColorstr = '#cccccc', GradientType = 0); + background-image: linear-gradient(to top, #ccc 0%, #eee 60%); +} + +html[dir="rtl"] .select2-container .select2-choice .select2-arrow { + left: 0; + right: auto; + + border-left: none; + border-right: 1px solid #aaa; + border-radius: 4px 0 0 4px; +} + +.select2-container .select2-choice .select2-arrow b { + display: block; + width: 100%; + height: 100%; + background: url('select2.png') no-repeat 0 1px; +} + +html[dir="rtl"] .select2-container .select2-choice .select2-arrow b { + background-position: 2px 1px; +} + +.select2-search { + display: inline-block; + width: 100%; + min-height: 26px; + margin: 0; + padding: 4px 4px 0 4px; + + position: relative; + z-index: 10000; + + white-space: nowrap; +} + +.select2-search input { + width: 100%; + height: auto !important; + min-height: 26px; + padding: 4px 20px 4px 5px; + margin: 0; + + outline: 0; + font-family: sans-serif; + font-size: 1em; + + border: 1px solid #aaa; + border-radius: 0; + + -webkit-box-shadow: none; + box-shadow: none; + + background: #fff url('select2.png') no-repeat 100% -22px; + background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); + background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0; +} + +html[dir="rtl"] .select2-search input { + padding: 4px 5px 4px 20px; + + background: #fff url('select2.png') no-repeat -37px -22px; + background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); + background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0; +} + +.select2-search input.select2-active { + background: #fff url('select2-spinner.gif') no-repeat 100%; + background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); + background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0; +} + +.select2-container-active .select2-choice, +.select2-container-active .select2-choices { + border: 1px solid #5897fb; + outline: none; + + -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3); + box-shadow: 0 0 5px rgba(0, 0, 0, .3); +} + +.select2-dropdown-open .select2-choice { + border-bottom-color: transparent; + -webkit-box-shadow: 0 1px 0 #fff inset; + box-shadow: 0 1px 0 #fff inset; + + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + + background-color: #eee; + background-image: -webkit-gradient(linear, left bottom, left top, color-stop(0, #fff), color-stop(0.5, #eee)); + background-image: -webkit-linear-gradient(center bottom, #fff 0%, #eee 50%); + background-image: -moz-linear-gradient(center bottom, #fff 0%, #eee 50%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0); + background-image: linear-gradient(to top, #fff 0%, #eee 50%); +} + +.select2-dropdown-open.select2-drop-above .select2-choice, +.select2-dropdown-open.select2-drop-above .select2-choices { + border: 1px solid #5897fb; + border-top-color: transparent; + + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fff), color-stop(0.5, #eee)); + background-image: -webkit-linear-gradient(center top, #fff 0%, #eee 50%); + background-image: -moz-linear-gradient(center top, #fff 0%, #eee 50%); + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#ffffff', GradientType=0); + background-image: linear-gradient(to bottom, #fff 0%, #eee 50%); +} + +.select2-dropdown-open .select2-choice .select2-arrow { + background: transparent; + border-left: none; + filter: none; +} +html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow { + border-right: none; +} + +.select2-dropdown-open .select2-choice .select2-arrow b { + background-position: -18px 1px; +} + +html[dir="rtl"] .select2-dropdown-open .select2-choice .select2-arrow b { + background-position: -16px 1px; +} + +.select2-hidden-accessible { + border: 0; + clip: rect(0 0 0 0); + height: 1px; + margin: -1px; + overflow: hidden; + padding: 0; + position: absolute; + width: 1px; +} + +/* results */ +.select2-results { + max-height: 200px; + padding: 0 0 0 4px; + margin: 4px 4px 4px 0; + position: relative; + overflow-x: hidden; + overflow-y: auto; + -webkit-tap-highlight-color: rgba(0, 0, 0, 0); +} + +html[dir="rtl"] .select2-results { + padding: 0 4px 0 0; + margin: 4px 0 4px 4px; +} + +.select2-results ul.select2-result-sub { + margin: 0; + padding-left: 0; +} + +.select2-results li { + list-style: none; + display: list-item; + background-image: none; +} + +.select2-results li.select2-result-with-children > .select2-result-label { + font-weight: bold; +} + +.select2-results .select2-result-label { + padding: 3px 7px 4px; + margin: 0; + cursor: pointer; + + min-height: 1em; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +.select2-results-dept-1 .select2-result-label { padding-left: 20px } +.select2-results-dept-2 .select2-result-label { padding-left: 40px } +.select2-results-dept-3 .select2-result-label { padding-left: 60px } +.select2-results-dept-4 .select2-result-label { padding-left: 80px } +.select2-results-dept-5 .select2-result-label { padding-left: 100px } +.select2-results-dept-6 .select2-result-label { padding-left: 110px } +.select2-results-dept-7 .select2-result-label { padding-left: 120px } + +.select2-results .select2-highlighted { + background: #3875d7; + color: #fff; +} + +.select2-results li em { + background: #feffde; + font-style: normal; +} + +.select2-results .select2-highlighted em { + background: transparent; +} + +.select2-results .select2-highlighted ul { + background: #fff; + color: #000; +} + +.select2-results .select2-no-results, +.select2-results .select2-searching, +.select2-results .select2-ajax-error, +.select2-results .select2-selection-limit { + background: #f4f4f4; + display: list-item; + padding-left: 5px; +} + +/* +disabled look for disabled choices in the results dropdown +*/ +.select2-results .select2-disabled.select2-highlighted { + color: #666; + background: #f4f4f4; + display: list-item; + cursor: default; +} +.select2-results .select2-disabled { + background: #f4f4f4; + display: list-item; + cursor: default; +} + +.select2-results .select2-selected { + display: none; +} + +.select2-more-results.select2-active { + background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%; +} + +.select2-results .select2-ajax-error { + background: rgba(255, 50, 50, .2); +} + +.select2-more-results { + background: #f4f4f4; + display: list-item; +} + +/* disabled styles */ + +.select2-container.select2-container-disabled .select2-choice { + background-color: #f4f4f4; + background-image: none; + border: 1px solid #ddd; + cursor: default; +} + +.select2-container.select2-container-disabled .select2-choice .select2-arrow { + background-color: #f4f4f4; + background-image: none; + border-left: 0; +} + +.select2-container.select2-container-disabled .select2-choice abbr { + display: none; +} + + +/* multiselect */ + +.select2-container-multi .select2-choices { + height: auto !important; + height: 1%; + margin: 0; + padding: 0 5px 0 0; + position: relative; + + border: 1px solid #aaa; + cursor: text; + overflow: hidden; + + background-color: #fff; + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(1%, #eee), color-stop(15%, #fff)); + background-image: -webkit-linear-gradient(top, #eee 1%, #fff 15%); + background-image: -moz-linear-gradient(top, #eee 1%, #fff 15%); + background-image: linear-gradient(to bottom, #eee 1%, #fff 15%); +} + +html[dir="rtl"] .select2-container-multi .select2-choices { + padding: 0 0 0 5px; +} + +.select2-locked { + padding: 3px 5px 3px 5px !important; +} + +.select2-container-multi .select2-choices { + min-height: 26px; +} + +.select2-container-multi.select2-container-active .select2-choices { + border: 1px solid #5897fb; + outline: none; + + -webkit-box-shadow: 0 0 5px rgba(0, 0, 0, .3); + box-shadow: 0 0 5px rgba(0, 0, 0, .3); +} +.select2-container-multi .select2-choices li { + float: left; + list-style: none; +} +html[dir="rtl"] .select2-container-multi .select2-choices li +{ + float: right; +} +.select2-container-multi .select2-choices .select2-search-field { + margin: 0; + padding: 0; + white-space: nowrap; +} + +.select2-container-multi .select2-choices .select2-search-field input { + padding: 5px; + margin: 1px 0; + + font-family: sans-serif; + font-size: 100%; + color: #666; + outline: 0; + border: 0; + -webkit-box-shadow: none; + box-shadow: none; + background: transparent !important; +} + +.select2-container-multi .select2-choices .select2-search-field input.select2-active { + background: #fff url('select2-spinner.gif') no-repeat 100% !important; +} + +.select2-default { + color: #999 !important; +} + +.select2-container-multi .select2-choices .select2-search-choice { + padding: 3px 5px 3px 18px; + margin: 3px 0 3px 5px; + position: relative; + + line-height: 13px; + color: #333; + cursor: default; + border: 1px solid #aaaaaa; + + border-radius: 3px; + + -webkit-box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05); + box-shadow: 0 0 2px #fff inset, 0 1px 0 rgba(0, 0, 0, 0.05); + + background-clip: padding-box; + + -webkit-touch-callout: none; + -webkit-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; + + background-color: #e4e4e4; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#eeeeee', endColorstr='#f4f4f4', GradientType=0); + background-image: -webkit-gradient(linear, 0% 0%, 0% 100%, color-stop(20%, #f4f4f4), color-stop(50%, #f0f0f0), color-stop(52%, #e8e8e8), color-stop(100%, #eee)); + background-image: -webkit-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); + background-image: -moz-linear-gradient(top, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); + background-image: linear-gradient(to bottom, #f4f4f4 20%, #f0f0f0 50%, #e8e8e8 52%, #eee 100%); +} +html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice +{ + margin: 3px 5px 3px 0; + padding: 3px 18px 3px 5px; +} +.select2-container-multi .select2-choices .select2-search-choice .select2-chosen { + cursor: default; +} +.select2-container-multi .select2-choices .select2-search-choice-focus { + background: #d4d4d4; +} + +.select2-search-choice-close { + display: block; + width: 12px; + height: 13px; + position: absolute; + right: 3px; + top: 4px; + + font-size: 1px; + outline: none; + background: url('select2.png') right top no-repeat; +} +html[dir="rtl"] .select2-search-choice-close { + right: auto; + left: 3px; +} + +.select2-container-multi .select2-search-choice-close { + left: 3px; +} + +html[dir="rtl"] .select2-container-multi .select2-search-choice-close { + left: auto; + right: 2px; +} + +.select2-container-multi .select2-choices .select2-search-choice .select2-search-choice-close:hover { + background-position: right -11px; +} +.select2-container-multi .select2-choices .select2-search-choice-focus .select2-search-choice-close { + background-position: right -11px; +} + +/* disabled styles */ +.select2-container-multi.select2-container-disabled .select2-choices { + background-color: #f4f4f4; + background-image: none; + border: 1px solid #ddd; + cursor: default; +} + +.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice { + padding: 3px 5px 3px 5px; + border: 1px solid #ddd; + background-image: none; + background-color: #f4f4f4; +} + +.select2-container-multi.select2-container-disabled .select2-choices .select2-search-choice .select2-search-choice-close { display: none; + background: none; +} +/* end multiselect */ + + +.select2-result-selectable .select2-match, +.select2-result-unselectable .select2-match { + text-decoration: underline; +} + +.select2-offscreen, .select2-offscreen:focus { + clip: rect(0 0 0 0) !important; + width: 1px !important; + height: 1px !important; + border: 0 !important; + margin: 0 !important; + padding: 0 !important; + overflow: hidden !important; + position: absolute !important; + outline: 0 !important; + left: 0px !important; + top: 0px !important; +} + +.select2-display-none { + display: none; +} + +.select2-measure-scrollbar { + position: absolute; + top: -10000px; + left: -10000px; + width: 100px; + height: 100px; + overflow: scroll; +} + +/* Retina-ize icons */ + +@media only screen and (-webkit-min-device-pixel-ratio: 1.5), only screen and (min-resolution: 2dppx) { + .select2-search input, + .select2-search-choice-close, + .select2-container .select2-choice abbr, + .select2-container .select2-choice .select2-arrow b { + background-image: url('select2x2.png') !important; + background-repeat: no-repeat !important; + background-size: 60px 40px !important; + } + + .select2-search input { + background-position: 100% -21px !important; + } +} From 30b1c5116f58de3e80d5ce84a917ad6b2045332f Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Tue, 14 Mar 2017 13:48:10 -0700 Subject: [PATCH 3/5] Sprockets-ify select2 css In order to use select2 within sprockets we need to use image-url in the CSS in order to reference the fingerprinted asset URLs. sed -i "s/url('\\([^']*\\)')/image-url('solidus_admin\\/\\1')/g" select2.css Also adds a select2_locales/index.js to make it easy to precompile all locales. --- .../solidus_admin/select2_locales/index.js | 1 + .../{select2.css => select2.scss} | 42 +++++++++---------- 2 files changed, 22 insertions(+), 21 deletions(-) create mode 100644 backend/vendor/assets/javascripts/solidus_admin/select2_locales/index.js rename backend/vendor/assets/stylesheets/solidus_admin/{select2.css => select2.scss} (87%) diff --git a/backend/vendor/assets/javascripts/solidus_admin/select2_locales/index.js b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/index.js new file mode 100644 index 00000000000..654d73efbba --- /dev/null +++ b/backend/vendor/assets/javascripts/solidus_admin/select2_locales/index.js @@ -0,0 +1 @@ +//= link_tree . .js diff --git a/backend/vendor/assets/stylesheets/solidus_admin/select2.css b/backend/vendor/assets/stylesheets/solidus_admin/select2.scss similarity index 87% rename from backend/vendor/assets/stylesheets/solidus_admin/select2.css rename to backend/vendor/assets/stylesheets/solidus_admin/select2.scss index 915347037e0..79a56bc74a3 100644 --- a/backend/vendor/assets/stylesheets/solidus_admin/select2.css +++ b/backend/vendor/assets/stylesheets/solidus_admin/select2.scss @@ -102,7 +102,7 @@ html[dir="rtl"] .select2-container .select2-choice > .select2-chosen { text-decoration: none; border: 0; - background: url('select2.png') right top no-repeat; + background: image-url('solidus_admin/select2.png') right top no-repeat; cursor: pointer; outline: 0; } @@ -211,7 +211,7 @@ html[dir="rtl"] .select2-container .select2-choice .select2-arrow { display: block; width: 100%; height: 100%; - background: url('select2.png') no-repeat 0 1px; + background: image-url('solidus_admin/select2.png') no-repeat 0 1px; } html[dir="rtl"] .select2-container .select2-choice .select2-arrow b { @@ -248,29 +248,29 @@ html[dir="rtl"] .select2-container .select2-choice .select2-arrow b { -webkit-box-shadow: none; box-shadow: none; - background: #fff url('select2.png') no-repeat 100% -22px; - background: url('select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); - background: url('select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); - background: url('select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); - background: url('select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0; + background: #fff image-url('solidus_admin/select2.png') no-repeat 100% -22px; + background: image-url('solidus_admin/select2.png') no-repeat 100% -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); + background: image-url('solidus_admin/select2.png') no-repeat 100% -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: image-url('solidus_admin/select2.png') no-repeat 100% -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: image-url('solidus_admin/select2.png') no-repeat 100% -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0; } html[dir="rtl"] .select2-search input { padding: 4px 5px 4px 20px; - background: #fff url('select2.png') no-repeat -37px -22px; - background: url('select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); - background: url('select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); - background: url('select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); - background: url('select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0; + background: #fff image-url('solidus_admin/select2.png') no-repeat -37px -22px; + background: image-url('solidus_admin/select2.png') no-repeat -37px -22px, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); + background: image-url('solidus_admin/select2.png') no-repeat -37px -22px, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: image-url('solidus_admin/select2.png') no-repeat -37px -22px, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: image-url('solidus_admin/select2.png') no-repeat -37px -22px, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0; } .select2-search input.select2-active { - background: #fff url('select2-spinner.gif') no-repeat 100%; - background: url('select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); - background: url('select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); - background: url('select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); - background: url('select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0; + background: #fff image-url('solidus_admin/select2-spinner.gif') no-repeat 100%; + background: image-url('solidus_admin/select2-spinner.gif') no-repeat 100%, -webkit-gradient(linear, left bottom, left top, color-stop(0.85, #fff), color-stop(0.99, #eee)); + background: image-url('solidus_admin/select2-spinner.gif') no-repeat 100%, -webkit-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: image-url('solidus_admin/select2-spinner.gif') no-repeat 100%, -moz-linear-gradient(center bottom, #fff 85%, #eee 99%); + background: image-url('solidus_admin/select2-spinner.gif') no-repeat 100%, linear-gradient(to bottom, #fff 85%, #eee 99%) 0 0; } .select2-container-active .select2-choice, @@ -439,7 +439,7 @@ disabled look for disabled choices in the results dropdown } .select2-more-results.select2-active { - background: #f4f4f4 url('select2-spinner.gif') no-repeat 100%; + background: #f4f4f4 image-url('solidus_admin/select2-spinner.gif') no-repeat 100%; } .select2-results .select2-ajax-error { @@ -539,7 +539,7 @@ html[dir="rtl"] .select2-container-multi .select2-choices li } .select2-container-multi .select2-choices .select2-search-field input.select2-active { - background: #fff url('select2-spinner.gif') no-repeat 100% !important; + background: #fff image-url('solidus_admin/select2-spinner.gif') no-repeat 100% !important; } .select2-default { @@ -598,7 +598,7 @@ html[dir="rtl"] .select2-container-multi .select2-choices .select2-search-choice font-size: 1px; outline: none; - background: url('select2.png') right top no-repeat; + background: image-url('solidus_admin/select2.png') right top no-repeat; } html[dir="rtl"] .select2-search-choice-close { right: auto; @@ -681,7 +681,7 @@ html[dir="rtl"] .select2-container-multi .select2-search-choice-close { .select2-search-choice-close, .select2-container .select2-choice abbr, .select2-container .select2-choice .select2-arrow b { - background-image: url('select2x2.png') !important; + background-image: image-url('solidus_admin/select2x2.png') !important; background-repeat: no-repeat !important; background-size: 60px 40px !important; } From a32cae26541755fa05e5bd076e161b32b8d8d8b6 Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Tue, 14 Mar 2017 13:47:25 -0700 Subject: [PATCH 4/5] Switch to using vendored select2 assets Removes the select2-rails gem in favour of using the vendored version. --- .../assets/config/solidus_backend_manifest.js | 46 +------------------ .../app/assets/javascripts/spree/backend.js | 2 +- .../spree/backend/spree-select2.js | 2 +- .../app/assets/stylesheets/spree/backend.css | 2 +- .../admin/shared/_js_locale_data.html.erb | 2 +- 5 files changed, 5 insertions(+), 49 deletions(-) diff --git a/backend/app/assets/config/solidus_backend_manifest.js b/backend/app/assets/config/solidus_backend_manifest.js index f4663b24d3c..dd445969c4c 100644 --- a/backend/app/assets/config/solidus_backend_manifest.js +++ b/backend/app/assets/config/solidus_backend_manifest.js @@ -3,48 +3,4 @@ //= link spree/backend/all.js //= link spree/backend/all.css -//= link select2_locale_ar.js -//= link select2_locale_az.js -//= link select2_locale_bg.js -//= link select2_locale_ca.js -//= link select2_locale_cs.js -//= link select2_locale_da.js -//= link select2_locale_de.js -//= link select2_locale_el.js -//= link select2_locale_es.js -//= link select2_locale_et.js -//= link select2_locale_eu.js -//= link select2_locale_fa.js -//= link select2_locale_fi.js -//= link select2_locale_fr.js -//= link select2_locale_gl.js -//= link select2_locale_he.js -//= link select2_locale_hr.js -//= link select2_locale_hu.js -//= link select2_locale_id.js -//= link select2_locale_is.js -//= link select2_locale_it.js -//= link select2_locale_ja.js -//= link select2_locale_ka.js -//= link select2_locale_ko.js -//= link select2_locale_lt.js -//= link select2_locale_lv.js -//= link select2_locale_mk.js -//= link select2_locale_ms.js -//= link select2_locale_nl.js -//= link select2_locale_no.js -//= link select2_locale_pl.js -//= link select2_locale_pt-BR.js -//= link select2_locale_pt-PT.js -//= link select2_locale_ro.js -//= link select2_locale_rs.js -//= link select2_locale_ru.js -//= link select2_locale_sk.js -//= link select2_locale_sv.js -//= link select2_locale_th.js -//= link select2_locale_tr.js -//= link select2_locale_ug-CN.js -//= link select2_locale_uk.js -//= link select2_locale_vi.js -//= link select2_locale_zh-CN.js -//= link select2_locale_zh-TW.js +//= link solidus_admin/select2_locales diff --git a/backend/app/assets/javascripts/spree/backend.js b/backend/app/assets/javascripts/spree/backend.js index 0433a3fbe20..a2ccd13341b 100644 --- a/backend/app/assets/javascripts/spree/backend.js +++ b/backend/app/assets/javascripts/spree/backend.js @@ -6,6 +6,7 @@ //= require jquery-ui/sortable //= require jquery-ui/autocomplete //= require jquery.sticky-kit.min +//= require solidus_admin/select2 //= require solidus_admin/underscore //= require solidus_admin/backbone //= require solidus_admin/backbone-nested-models @@ -16,7 +17,6 @@ //= require spree/backend/namespaces //= require spree/backend/translation //= require spree/backend/backbone-overrides -//= require spree/backend/spree-select2 //= require spree/backend/format_money // //= require spree/backend/templates diff --git a/backend/app/assets/javascripts/spree/backend/spree-select2.js b/backend/app/assets/javascripts/spree/backend/spree-select2.js index 268064d5c05..6fb98759754 100644 --- a/backend/app/assets/javascripts/spree/backend/spree-select2.js +++ b/backend/app/assets/javascripts/spree/backend/spree-select2.js @@ -1,4 +1,4 @@ -//= require select2 +//= require solidus_admin/select2 jQuery(function($) { // Make select beautiful $('select.select2').select2({ diff --git a/backend/app/assets/stylesheets/spree/backend.css b/backend/app/assets/stylesheets/spree/backend.css index 89faeeb858a..381d323dc6a 100644 --- a/backend/app/assets/stylesheets/spree/backend.css +++ b/backend/app/assets/stylesheets/spree/backend.css @@ -5,7 +5,7 @@ *= require jquery-ui/datepicker *= require jquery-ui/autocomplete - *= require select2 + *= require solidus_admin/select2 *= require prism *= require spree/backend/spree_admin diff --git a/backend/app/views/spree/admin/shared/_js_locale_data.html.erb b/backend/app/views/spree/admin/shared/_js_locale_data.html.erb index e973981723c..5daf0fb5dbf 100644 --- a/backend/app/views/spree/admin/shared/_js_locale_data.html.erb +++ b/backend/app/views/spree/admin/shared/_js_locale_data.html.erb @@ -43,5 +43,5 @@ <% if I18n.locale != :en %> - <%= javascript_include_tag "select2_locale_#{I18n.locale}" %> + <%= javascript_include_tag "solidus_admin/select2_locales/select2_locale_#{I18n.locale}" %> <% end %> From 9ac52797567af64d5bf501780a2dc7247c1273ab Mon Sep 17 00:00:00 2001 From: John Hawthorn Date: Tue, 14 Mar 2017 13:30:09 -0700 Subject: [PATCH 5/5] Remove select2-rails --- backend/lib/spree/backend.rb | 1 - backend/solidus_backend.gemspec | 1 - 2 files changed, 2 deletions(-) diff --git a/backend/lib/spree/backend.rb b/backend/lib/spree/backend.rb index 6aa02cbac92..f3a7bb7d27d 100644 --- a/backend/lib/spree/backend.rb +++ b/backend/lib/spree/backend.rb @@ -4,7 +4,6 @@ require 'coffee-rails' require 'sass-rails' require 'bourbon' -require 'select2-rails' require 'handlebars_assets' require 'font-awesome-rails' diff --git a/backend/solidus_backend.gemspec b/backend/solidus_backend.gemspec index 55712782f81..30ffb3263f2 100644 --- a/backend/solidus_backend.gemspec +++ b/backend/solidus_backend.gemspec @@ -29,7 +29,6 @@ Gem::Specification.new do |s| s.add_dependency 'bourbon', '>= 4', '< 6' s.add_dependency 'jquery-rails' s.add_dependency 'jquery-ui-rails', '~> 5.0.0' - s.add_dependency 'select2-rails', '3.5.9.1' # 3.5.9.2 breaks forms s.add_dependency 'font-awesome-rails', '~> 4.0' s.add_dependency 'handlebars_assets', '~> 0.23'