compass-jquery-plugin 0.3.0.0 → 0.3.1.beta.2
Sign up to get free protection for your applications and to get access to all the features.
- data/README.textile +69 -13
- data/Rakefile +1 -1
- data/VERSION.yml +2 -2
- data/gem_tasks/jqgrid.rake +119 -0
- data/gem_tasks/jrails.rake +78 -77
- data/gem_tasks/mobile.rake +156 -0
- data/gem_tasks/rubygems.rake +5 -1
- data/gem_tasks/secret_sauce.rake +64 -0
- data/lib/jquery/gridify.rb +42 -0
- data/lib/jquery/gridify/assertions.rb +37 -0
- data/lib/jquery/gridify/grid.rb +210 -0
- data/lib/jquery/gridify/grid_column.rb +134 -0
- data/lib/jquery/gridify/grid_finder.rb +223 -0
- data/lib/jquery/gridify/grid_options.rb +279 -0
- data/lib/jquery/gridify/grid_view.rb +435 -0
- data/lib/jquery/jqgrid.rb +5 -0
- data/lib/jquery/jqgrid/jqgrid.rb +438 -0
- data/lib/jquery/mobile.rb +3 -0
- data/lib/jquery/secret_sauce.rb +9 -0
- data/lib/jquery/secret_sauce/controller/ui_dialog_controls.rb +14 -0
- data/lib/jquery/secret_sauce/controller/ui_grid_controls.rb +18 -0
- data/lib/jquery/secret_sauce/helpers/ui_dialog_helper.rb +6 -0
- data/lib/jquery/secret_sauce/helpers/ui_form_helper.rb +118 -0
- data/lib/jquery/secret_sauce/helpers/ui_grid_helper.rb +226 -0
- data/lib/jquery/secret_sauce/model/find_for_grid.rb +42 -0
- data/templates/dynatree/jquery.dynatree.js +258 -147
- data/templates/dynatree/jquery.dynatree.min.js +81 -79
- data/templates/dynatree/jquery/dynatree/aero.scss +35 -18
- data/templates/dynatree/jquery/dynatree/aero/drop_sibling_here.png +0 -0
- data/templates/dynatree/jquery/dynatree/aqua.scss +36 -19
- data/templates/dynatree/jquery/dynatree/aqua/drop_sibling_here.png +0 -0
- data/templates/dynatree/jquery/dynatree/crystal.scss +38 -21
- data/templates/dynatree/jquery/dynatree/crystal/drop_sibling_here.png +0 -0
- data/templates/dynatree/jquery/dynatree/xp.scss +59 -42
- data/templates/dynatree/jquery/dynatree/xp/drop_sibling_here.png +0 -0
- data/templates/dynatree/manifest.rb +4 -0
- data/templates/jqgrid/config/initializers/jqgrid.rb +4 -0
- data/templates/jqgrid/config/locales/jquery/jqgrid/de.yml +7 -0
- data/templates/jqgrid/config/locales/jquery/jqgrid/en.yml +7 -0
- data/templates/jqgrid/i18n/jqgrid/locale-bg.js +132 -0
- data/templates/jqgrid/i18n/jqgrid/locale-bg.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-bg1251.js +132 -0
- data/templates/jqgrid/i18n/jqgrid/locale-bg1251.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-cat.js +128 -0
- data/templates/jqgrid/i18n/jqgrid/locale-cat.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-cn.js +132 -0
- data/templates/jqgrid/i18n/jqgrid/locale-cn.min.js +5 -0
- data/templates/jqgrid/i18n/jqgrid/locale-cs.js +128 -0
- data/templates/jqgrid/i18n/jqgrid/locale-cs.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-da.js +128 -0
- data/templates/jqgrid/i18n/jqgrid/locale-da.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-de.js +133 -0
- data/templates/jqgrid/i18n/jqgrid/locale-de.min.js +7 -0
- data/templates/jqgrid/i18n/jqgrid/locale-el.js +126 -0
- data/templates/jqgrid/i18n/jqgrid/locale-el.min.js +7 -0
- data/templates/jqgrid/i18n/jqgrid/locale-en.js +128 -0
- data/templates/jqgrid/i18n/jqgrid/locale-en.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-es.js +128 -0
- data/templates/jqgrid/i18n/jqgrid/locale-es.min.js +7 -0
- data/templates/jqgrid/i18n/jqgrid/locale-fa.js +125 -0
- data/templates/jqgrid/i18n/jqgrid/locale-fa.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-fi.js +130 -0
- data/templates/jqgrid/i18n/jqgrid/locale-fi.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-fr.js +126 -0
- data/templates/jqgrid/i18n/jqgrid/locale-fr.min.js +7 -0
- data/templates/jqgrid/i18n/jqgrid/locale-gl.js +126 -0
- data/templates/jqgrid/i18n/jqgrid/locale-gl.min.js +7 -0
- data/templates/jqgrid/i18n/jqgrid/locale-he.js +127 -0
- data/templates/jqgrid/i18n/jqgrid/locale-he.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-hu.js +129 -0
- data/templates/jqgrid/i18n/jqgrid/locale-hu.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-is.js +126 -0
- data/templates/jqgrid/i18n/jqgrid/locale-is.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-it.js +1 -0
- data/templates/jqgrid/i18n/jqgrid/locale-it.min.js +7 -0
- data/templates/jqgrid/i18n/jqgrid/locale-ja.js +155 -0
- data/templates/jqgrid/i18n/jqgrid/locale-ja.min.js +5 -0
- data/templates/jqgrid/i18n/jqgrid/locale-nl.js +149 -0
- data/templates/jqgrid/i18n/jqgrid/locale-nl.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-no.js +1 -0
- data/templates/jqgrid/i18n/jqgrid/locale-no.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-pl.js +127 -0
- data/templates/jqgrid/i18n/jqgrid/locale-pl.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-pt-br.js +127 -0
- data/templates/jqgrid/i18n/jqgrid/locale-pt-br.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-pt.js +125 -0
- data/templates/jqgrid/i18n/jqgrid/locale-pt.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-ro.js +139 -0
- data/templates/jqgrid/i18n/jqgrid/locale-ro.min.js +7 -0
- data/templates/jqgrid/i18n/jqgrid/locale-ru.js +127 -0
- data/templates/jqgrid/i18n/jqgrid/locale-ru.min.js +7 -0
- data/templates/jqgrid/i18n/jqgrid/locale-sk.js +127 -0
- data/templates/jqgrid/i18n/jqgrid/locale-sk.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-sr.js +128 -0
- data/templates/jqgrid/i18n/jqgrid/locale-sr.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-sv.js +127 -0
- data/templates/jqgrid/i18n/jqgrid/locale-sv.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-tr.js +126 -0
- data/templates/jqgrid/i18n/jqgrid/locale-tr.min.js +6 -0
- data/templates/jqgrid/i18n/jqgrid/locale-ua.js +127 -0
- data/templates/jqgrid/i18n/jqgrid/locale-ua.min.js +7 -0
- data/templates/jqgrid/jquery.jqGrid.js +11604 -0
- data/templates/jqgrid/jquery.jqGrid.min.js +472 -0
- data/templates/jqgrid/jquery/jqGrid.scss +692 -0
- data/templates/jqgrid/manifest.rb +72 -0
- data/templates/jqgrid/public/stylesheets/ellipsis-xbl.xml +13 -0
- data/templates/jqtouch/jquery/touch/apple.scss +5 -5
- data/templates/jqtouch/jquery/touch/default.scss +5 -5
- data/templates/jqtouch/jquery/touch/jqt.scss +5 -5
- data/templates/jrails/config/initializers/jrails.rb +3 -0
- data/templates/jrails/jquery-ui.js +45 -62
- data/templates/jrails/jquery-ui.min.js +22 -22
- data/templates/jrails/jquery.js +340 -206
- data/templates/jrails/jquery.min.js +152 -151
- data/templates/jrails/jquery.tmpl.js +489 -0
- data/templates/jrails/jquery.tmpl.min.js +12 -0
- data/templates/jrails/jquery.tmplPlus.js +98 -0
- data/templates/jrails/jquery.tmplPlus.min.js +3 -0
- data/templates/jrails/jquery/ui/_theme.scss +3 -1
- data/templates/jrails/manifest.rb +4 -0
- data/templates/jstree/jquery.jstree.js +4479 -4468
- data/templates/jstree/jquery.jstree.min.js +4 -3
- data/templates/mobile/config/initializers/mobile.rb +6 -0
- data/templates/mobile/glyphish/Read me first - license.txt +14 -0
- data/templates/mobile/glyphish/icons-black/01-refresh.png +0 -0
- data/templates/mobile/glyphish/icons-black/02-redo.png +0 -0
- data/templates/mobile/glyphish/icons-black/03-loopback.png +0 -0
- data/templates/mobile/glyphish/icons-black/04-squiggle.png +0 -0
- data/templates/mobile/glyphish/icons-black/05-shuffle.png +0 -0
- data/templates/mobile/glyphish/icons-black/06-magnifying-glass.png +0 -0
- data/templates/mobile/glyphish/icons-black/07-map-marker.png +0 -0
- data/templates/mobile/glyphish/icons-black/08-chat.png +0 -0
- data/templates/mobile/glyphish/icons-black/09-chat2.png +0 -0
- data/templates/mobile/glyphish/icons-black/10-medical.png +0 -0
- data/templates/mobile/glyphish/icons-black/100-coffee.png +0 -0
- data/templates/mobile/glyphish/icons-black/101-gameplan.png +0 -0
- data/templates/mobile/glyphish/icons-black/102-walk.png +0 -0
- data/templates/mobile/glyphish/icons-black/103-map.png +0 -0
- data/templates/mobile/glyphish/icons-black/104-index-cards.png +0 -0
- data/templates/mobile/glyphish/icons-black/105-piano.png +0 -0
- data/templates/mobile/glyphish/icons-black/106-sliders.png +0 -0
- data/templates/mobile/glyphish/icons-black/107-widescreen.png +0 -0
- data/templates/mobile/glyphish/icons-black/108-badge.png +0 -0
- data/templates/mobile/glyphish/icons-black/109-chicken.png +0 -0
- data/templates/mobile/glyphish/icons-black/11-clock.png +0 -0
- data/templates/mobile/glyphish/icons-black/110-bug.png +0 -0
- data/templates/mobile/glyphish/icons-black/111-user.png +0 -0
- data/templates/mobile/glyphish/icons-black/112-group.png +0 -0
- data/templates/mobile/glyphish/icons-black/113-navigation.png +0 -0
- data/templates/mobile/glyphish/icons-black/114-balloon.png +0 -0
- data/templates/mobile/glyphish/icons-black/115-bow-and-arrow.png +0 -0
- data/templates/mobile/glyphish/icons-black/116-controller.png +0 -0
- data/templates/mobile/glyphish/icons-black/117-todo.png +0 -0
- data/templates/mobile/glyphish/icons-black/118-coathanger.png +0 -0
- data/templates/mobile/glyphish/icons-black/119-piggybank.png +0 -0
- data/templates/mobile/glyphish/icons-black/12-eye.png +0 -0
- data/templates/mobile/glyphish/icons-black/120-headphones.png +0 -0
- data/templates/mobile/glyphish/icons-black/121-lanscape.png +0 -0
- data/templates/mobile/glyphish/icons-black/122-stats.png +0 -0
- data/templates/mobile/glyphish/icons-black/123-id-card.png +0 -0
- data/templates/mobile/glyphish/icons-black/124-bullhorn.png +0 -0
- data/templates/mobile/glyphish/icons-black/125-food.png +0 -0
- data/templates/mobile/glyphish/icons-black/126-moon.png +0 -0
- data/templates/mobile/glyphish/icons-black/127-sock.png +0 -0
- data/templates/mobile/glyphish/icons-black/128-bone.png +0 -0
- data/templates/mobile/glyphish/icons-black/129-golf.png +0 -0
- data/templates/mobile/glyphish/icons-black/13-target.png +0 -0
- data/templates/mobile/glyphish/icons-black/130-dice.png +0 -0
- data/templates/mobile/glyphish/icons-black/14-tag.png +0 -0
- data/templates/mobile/glyphish/icons-black/15-tags.png +0 -0
- data/templates/mobile/glyphish/icons-black/16-line-chart.png +0 -0
- data/templates/mobile/glyphish/icons-black/17-bar-chart.png +0 -0
- data/templates/mobile/glyphish/icons-black/18-envelope.png +0 -0
- data/templates/mobile/glyphish/icons-black/19-gear.png +0 -0
- data/templates/mobile/glyphish/icons-black/20-gear2.png +0 -0
- data/templates/mobile/glyphish/icons-black/21-skull.png +0 -0
- data/templates/mobile/glyphish/icons-black/22-skull-n-crossbones.png +0 -0
- data/templates/mobile/glyphish/icons-black/23-bird.png +0 -0
- data/templates/mobile/glyphish/icons-black/24-gift.png +0 -0
- data/templates/mobile/glyphish/icons-black/25-weather.png +0 -0
- data/templates/mobile/glyphish/icons-black/26-bandaid.png +0 -0
- data/templates/mobile/glyphish/icons-black/27-planet.png +0 -0
- data/templates/mobile/glyphish/icons-black/28-star.png +0 -0
- data/templates/mobile/glyphish/icons-black/29-heart.png +0 -0
- data/templates/mobile/glyphish/icons-black/30-key.png +0 -0
- data/templates/mobile/glyphish/icons-black/31-ipod.png +0 -0
- data/templates/mobile/glyphish/icons-black/32-iphone.png +0 -0
- data/templates/mobile/glyphish/icons-black/33-cabinet.png +0 -0
- data/templates/mobile/glyphish/icons-black/34-coffee.png +0 -0
- data/templates/mobile/glyphish/icons-black/35-shopping-bag.png +0 -0
- data/templates/mobile/glyphish/icons-black/36-toolbox.png +0 -0
- data/templates/mobile/glyphish/icons-black/37-suitcase.png +0 -0
- data/templates/mobile/glyphish/icons-black/38-airplane.png +0 -0
- data/templates/mobile/glyphish/icons-black/39-spraycan.png +0 -0
- data/templates/mobile/glyphish/icons-black/40-inbox.png +0 -0
- data/templates/mobile/glyphish/icons-black/41-picture-frame.png +0 -0
- data/templates/mobile/glyphish/icons-black/42-photos.png +0 -0
- data/templates/mobile/glyphish/icons-black/43-film-roll.png +0 -0
- data/templates/mobile/glyphish/icons-black/44-shoebox.png +0 -0
- data/templates/mobile/glyphish/icons-black/45-movie1.png +0 -0
- data/templates/mobile/glyphish/icons-black/46-movie2.png +0 -0
- data/templates/mobile/glyphish/icons-black/47-fuel.png +0 -0
- data/templates/mobile/glyphish/icons-black/48-fork-and-knife.png +0 -0
- data/templates/mobile/glyphish/icons-black/49-battery.png +0 -0
- data/templates/mobile/glyphish/icons-black/50-beaker.png +0 -0
- data/templates/mobile/glyphish/icons-black/51-outlet.png +0 -0
- data/templates/mobile/glyphish/icons-black/52-pinetree.png +0 -0
- data/templates/mobile/glyphish/icons-black/53-house.png +0 -0
- data/templates/mobile/glyphish/icons-black/54-lock.png +0 -0
- data/templates/mobile/glyphish/icons-black/55-network.png +0 -0
- data/templates/mobile/glyphish/icons-black/56-cloud.png +0 -0
- data/templates/mobile/glyphish/icons-black/57-download.png +0 -0
- data/templates/mobile/glyphish/icons-black/58-bookmark.png +0 -0
- data/templates/mobile/glyphish/icons-black/59-flag.png +0 -0
- data/templates/mobile/glyphish/icons-black/60-signpost.png +0 -0
- data/templates/mobile/glyphish/icons-black/61-brightness.png +0 -0
- data/templates/mobile/glyphish/icons-black/62-contrast.png +0 -0
- data/templates/mobile/glyphish/icons-black/63-runner.png +0 -0
- data/templates/mobile/glyphish/icons-black/64-zap.png +0 -0
- data/templates/mobile/glyphish/icons-black/65-note.png +0 -0
- data/templates/mobile/glyphish/icons-black/66-microphone.png +0 -0
- data/templates/mobile/glyphish/icons-black/67-tshirt.png +0 -0
- data/templates/mobile/glyphish/icons-black/68-paperclip.png +0 -0
- data/templates/mobile/glyphish/icons-black/69-display.png +0 -0
- data/templates/mobile/glyphish/icons-black/70-tv.png +0 -0
- data/templates/mobile/glyphish/icons-black/71-compass.png +0 -0
- data/templates/mobile/glyphish/icons-black/72-pin.png +0 -0
- data/templates/mobile/glyphish/icons-black/73-radar.png +0 -0
- data/templates/mobile/glyphish/icons-black/74-location.png +0 -0
- data/templates/mobile/glyphish/icons-black/75-phone.png +0 -0
- data/templates/mobile/glyphish/icons-black/76-baby.png +0 -0
- data/templates/mobile/glyphish/icons-black/77-ekg.png +0 -0
- data/templates/mobile/glyphish/icons-black/78-stopwatch.png +0 -0
- data/templates/mobile/glyphish/icons-black/79-medical-bag.png +0 -0
- data/templates/mobile/glyphish/icons-black/80-shopping-cart.png +0 -0
- data/templates/mobile/glyphish/icons-black/81-dashboard.png +0 -0
- data/templates/mobile/glyphish/icons-black/82-dogpaw.png +0 -0
- data/templates/mobile/glyphish/icons-black/83-calendar.png +0 -0
- data/templates/mobile/glyphish/icons-black/84-lightbulb.png +0 -0
- data/templates/mobile/glyphish/icons-black/85-trophy.png +0 -0
- data/templates/mobile/glyphish/icons-black/86-camera.png +0 -0
- data/templates/mobile/glyphish/icons-black/87-wineglass.png +0 -0
- data/templates/mobile/glyphish/icons-black/88-beermug.png +0 -0
- data/templates/mobile/glyphish/icons-black/89-dumbbell.png +0 -0
- data/templates/mobile/glyphish/icons-black/90-lifebuoy.png +0 -0
- data/templates/mobile/glyphish/icons-black/91-beaker2.png +0 -0
- data/templates/mobile/glyphish/icons-black/92-testtube.png +0 -0
- data/templates/mobile/glyphish/icons-black/93-thermometer.png +0 -0
- data/templates/mobile/glyphish/icons-black/94-pill.png +0 -0
- data/templates/mobile/glyphish/icons-black/95-equalizer.png +0 -0
- data/templates/mobile/glyphish/icons-black/96-book.png +0 -0
- data/templates/mobile/glyphish/icons-black/97-puzzle.png +0 -0
- data/templates/mobile/glyphish/icons-black/98-palette.png +0 -0
- data/templates/mobile/glyphish/icons-black/99-umbrella.png +0 -0
- data/templates/mobile/glyphish/icons-white/09-chat2.png +0 -0
- data/templates/mobile/glyphish/icons-white/100-coffee.png +0 -0
- data/templates/mobile/glyphish/icons-white/18-envelope.png +0 -0
- data/templates/mobile/glyphish/icons-white/19-gear.png +0 -0
- data/templates/mobile/glyphish/icons-white/21-skull.png +0 -0
- data/templates/mobile/glyphish/icons-white/30-key.png +0 -0
- data/templates/mobile/glyphish/icons-white/34-coffee.png +0 -0
- data/templates/mobile/glyphish/icons-white/88-beermug.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/band-aid.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/chat.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/clock.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/eye.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/flag.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/fork-and-knife.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/gear.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/heart.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/lightning-bolt.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/magnifying-glass.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/map-marker.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/map-pin.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/microphone.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/music-note.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/paw.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/plus.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/puzzle.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/star.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/tag.png +0 -0
- data/templates/mobile/glyphish/mini-icons-black/tshirt.png +0 -0
- data/templates/mobile/jquery.mobile.js +3995 -0
- data/templates/mobile/jquery.mobile.min.js +28 -0
- data/templates/mobile/jquery/mobile/_base.scss +1344 -0
- data/templates/mobile/jquery/mobile/default.scss +745 -0
- data/templates/mobile/jquery/mobile/default/ajax-loader.png +0 -0
- data/templates/mobile/jquery/mobile/default/form-check-off.png +0 -0
- data/templates/mobile/jquery/mobile/default/form-check-on.png +0 -0
- data/templates/mobile/jquery/mobile/default/form-radio-off.png +0 -0
- data/templates/mobile/jquery/mobile/default/form-radio-on.png +0 -0
- data/templates/mobile/jquery/mobile/default/icon-search-black.png +0 -0
- data/templates/mobile/jquery/mobile/default/icons-18-black.png +0 -0
- data/templates/mobile/jquery/mobile/default/icons-18-white.png +0 -0
- data/templates/mobile/jquery/mobile/default/icons-36-black.png +0 -0
- data/templates/mobile/jquery/mobile/default/icons-36-white.png +0 -0
- data/templates/mobile/jquery/mobile/valencia.scss +807 -0
- data/templates/mobile/jquery/mobile/valencia/ajax-loader.png +0 -0
- data/templates/mobile/jquery/mobile/valencia/form-check-off.png +0 -0
- data/templates/mobile/jquery/mobile/valencia/form-check-on.png +0 -0
- data/templates/mobile/jquery/mobile/valencia/form-radio-off.png +0 -0
- data/templates/mobile/jquery/mobile/valencia/form-radio-on.png +0 -0
- data/templates/mobile/jquery/mobile/valencia/icon-search-black.png +0 -0
- data/templates/mobile/jquery/mobile/valencia/icons-18-black.png +0 -0
- data/templates/mobile/jquery/mobile/valencia/icons-18-white.png +0 -0
- data/templates/mobile/jquery/mobile/valencia/icons-36-black.png +0 -0
- data/templates/mobile/jquery/mobile/valencia/icons-36-white.png +0 -0
- data/templates/mobile/jquery/mobile/valencia/texture_05.png +0 -0
- data/templates/mobile/jquery/mobile/valencia/texture_075.png +0 -0
- data/templates/mobile/lib/tasks/jquery.mobile.rake +106 -0
- data/templates/mobile/manifest.rb +191 -0
- data/templates/secret_sauce/app/views/shared/_ui_form_error_messages.html.haml +6 -0
- data/templates/secret_sauce/app/views/shared/_ui_grid_for_without_block.js.haml +144 -0
- data/templates/secret_sauce/app/views/shared/_ui_static_dialog.html.haml +6 -0
- data/templates/secret_sauce/config/initializers/secret_sauce.rb +8 -0
- data/templates/secret_sauce/jquery/secret_sauce.scss +33 -0
- data/templates/secret_sauce/manifest.rb +10 -0
- data/templates/secret_sauce/secret_sauce.js +12 -0
- data/templates/secret_sauce/secret_sauce.min.js +1 -0
- metadata +313 -17
- data/.gitignore +0 -22
- data/compass-jquery-plugin.gemspec +0 -1064
@@ -0,0 +1,435 @@
|
|
1
|
+
# reference: http://github.com/ahe/2dc_jqgrid
|
2
|
+
|
3
|
+
module Gridify
|
4
|
+
class Grid
|
5
|
+
|
6
|
+
# ----------------------
|
7
|
+
# generate the grid javascript for a view
|
8
|
+
# options:
|
9
|
+
# :script => true generates <script> tag (true)
|
10
|
+
# :ready => true generates jquery ready function (true)
|
11
|
+
def to_javascript( options={} )
|
12
|
+
options = { :script => true, :ready => true }.merge(options)
|
13
|
+
|
14
|
+
s = ''
|
15
|
+
if options[:script]
|
16
|
+
s << %Q^
|
17
|
+
<script type="text/javascript">
|
18
|
+
var lastsel_#{dom_id};
|
19
|
+
^
|
20
|
+
end
|
21
|
+
|
22
|
+
s << js_helpers
|
23
|
+
|
24
|
+
if options[:ready]
|
25
|
+
s << %Q^
|
26
|
+
jQuery(document).ready(function(){
|
27
|
+
^
|
28
|
+
end
|
29
|
+
|
30
|
+
s << jqgrid_javascript(options)
|
31
|
+
|
32
|
+
if options[:ready]
|
33
|
+
s << %Q^
|
34
|
+
});
|
35
|
+
^
|
36
|
+
end
|
37
|
+
if options[:script]
|
38
|
+
s << %Q^
|
39
|
+
</script>
|
40
|
+
^
|
41
|
+
end
|
42
|
+
s
|
43
|
+
end
|
44
|
+
|
45
|
+
def to_json
|
46
|
+
jqgrid_properties.to_json_with_js
|
47
|
+
end
|
48
|
+
|
49
|
+
# alias :to_s, :to_javascript
|
50
|
+
def to_s( options={} )
|
51
|
+
to_javascript( options )
|
52
|
+
end
|
53
|
+
|
54
|
+
# ------------------
|
55
|
+
protected
|
56
|
+
# ------------------
|
57
|
+
|
58
|
+
# //{ url: '/notes/{id}', mtype: 'PUT', reloadAfterSubmit: false, closeAfterEdit: true }, // edit settings
|
59
|
+
# //{ url: '/notes', mtype: 'POST', reloadAfterSubmit: false, closeAfterEdit: true }, // add settings
|
60
|
+
# //{ url: '/notes/{id}', mtype: 'DELETE', reloadAfterSubmit: false }, // delete settings
|
61
|
+
|
62
|
+
# get the button options
|
63
|
+
def edit_button_options
|
64
|
+
# 'url' => '/notes/{id}', 'mtype' => 'PUT'
|
65
|
+
# {afterSubmit:function(r,data){return #{options[:error_handler_return_value]}(r,data,'edit');}},
|
66
|
+
|
67
|
+
# note, closeAfterEdit will not close if response returns a non-empty string (even if "success" message)
|
68
|
+
merge_options_defaults( edit_button || inline_edit,
|
69
|
+
'reloadAfterSubmit' => true,
|
70
|
+
'closeAfterEdit' => true,
|
71
|
+
'afterSubmit' => "javascript: function(r,data){return #{error_handler_return_value}(r,data,'edit');}"
|
72
|
+
)
|
73
|
+
end
|
74
|
+
|
75
|
+
def add_button_options
|
76
|
+
# 'url' => '/notes', 'mtype' => 'POST'
|
77
|
+
merge_options_defaults( add_button,
|
78
|
+
'reloadAfterSubmit' => true,
|
79
|
+
'closeAfterAdd' => true,
|
80
|
+
'afterSubmit' => "javascript: function(r,data){return #{error_handler_return_value}(r,data,'add');}"
|
81
|
+
)
|
82
|
+
end
|
83
|
+
|
84
|
+
def delete_button_options
|
85
|
+
# 'url' => '/notes/{id}', 'mtype' => 'DELETE'
|
86
|
+
merge_options_defaults( delete_button,
|
87
|
+
'reloadAfterSubmit' => true,
|
88
|
+
'afterSubmit' => "javascript: function(r,data){return #{error_handler_return_value}(r,data,'delete');}"
|
89
|
+
)
|
90
|
+
end
|
91
|
+
|
92
|
+
def search_button_options
|
93
|
+
if search_advanced
|
94
|
+
merge_options_defaults( search_advanced, 'multipleSearch' => true)
|
95
|
+
else
|
96
|
+
merge_options_defaults( search_button)
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
def view_button_options
|
101
|
+
merge_options_defaults( view_button)
|
102
|
+
end
|
103
|
+
|
104
|
+
# generate the jqGrid initial values in json
|
105
|
+
# maps our attributes to jqGrid options; omit values when same as jqGrid defaults
|
106
|
+
def jqgrid_properties
|
107
|
+
vals = {}
|
108
|
+
vals[:ajaxGridOptions] = ajax_grid_options if ajax_grid_options
|
109
|
+
|
110
|
+
# data and request options
|
111
|
+
vals[:url] = url if url
|
112
|
+
vals[:editurl] = url if editable
|
113
|
+
vals[:restful] = true if restful
|
114
|
+
vals[:inline_edit] = inline_edit if inline_edit.present?
|
115
|
+
vals[:postData] = { :grid => name, :datatype => data_type } #identify which grid making the request
|
116
|
+
vals[:colNames] = colNames if colNames.present?
|
117
|
+
vals[:colModel] = column_model if colModel.present?
|
118
|
+
vals[:datatype] = data_type if data_type
|
119
|
+
if data_format.present?
|
120
|
+
case data_type
|
121
|
+
when :xml
|
122
|
+
vals[:xmlReader] = data_format
|
123
|
+
when :json
|
124
|
+
vals[:jsonReader] = data_format
|
125
|
+
end
|
126
|
+
end
|
127
|
+
|
128
|
+
vals[:loadonce] = load_once if load_once
|
129
|
+
|
130
|
+
vals[:sortname] = sort_by if sort_by
|
131
|
+
vals[:sortorder] = sort_order if sort_order && sort_by
|
132
|
+
vals[:rowNum] = rows_per_page if rows_per_page
|
133
|
+
vals[:rowTotal] = total_rows if total_rows
|
134
|
+
vals[:page] = current_page if current_page
|
135
|
+
|
136
|
+
# grid options
|
137
|
+
vals[:height] = height if height
|
138
|
+
vals[:gridview] = grid_view # faster views, NOTE theres cases when this needs to be disabled
|
139
|
+
|
140
|
+
case width_fit
|
141
|
+
when :fitted
|
142
|
+
#vals[:autowidth] = false #default
|
143
|
+
#vals[:shrinkToFit] = true #default
|
144
|
+
vals[:forceFit] = true
|
145
|
+
vals[:width] = width if width
|
146
|
+
|
147
|
+
when :scroll
|
148
|
+
#vals[:autowidth] = false #default
|
149
|
+
vals[:shrinkToFit] = false
|
150
|
+
#vals[:forceFit] = #ignored by jqGrid
|
151
|
+
vals[:width] = width if width
|
152
|
+
|
153
|
+
else #when :fluid
|
154
|
+
vals[:autowidth] = true
|
155
|
+
#vals[:shrinkToFit] = true #default
|
156
|
+
vals[:forceFit] = true
|
157
|
+
#vals[:width] = is ignored
|
158
|
+
vals[:resizeStop] = 'javascript: gridify_fluid_recalc_width'
|
159
|
+
end
|
160
|
+
|
161
|
+
vals[:sortable] = true if arranger_type.include?(:sortable)
|
162
|
+
|
163
|
+
# header layer
|
164
|
+
vals[:caption] = title if title
|
165
|
+
vals[:hidegrid] = false unless collapsible
|
166
|
+
vals[:hiddengrid] = true if collapsed
|
167
|
+
|
168
|
+
# row formatting
|
169
|
+
vals[:altrows] = true if alt_rows
|
170
|
+
vals[:altclass] = alt_rows if alt_rows.is_a?(String)
|
171
|
+
|
172
|
+
vals[:rownumbers] = true if row_numbers
|
173
|
+
vals[:rownumWidth] = row_numbers if row_numbers.is_a?(Numeric)
|
174
|
+
|
175
|
+
if inline_edit
|
176
|
+
vals[:scrollrows] = true
|
177
|
+
vals[:multiselect] = true if multi_select
|
178
|
+
vals[:onSelectRow] = "javascript: function(id, status) { if(id && id!==lastsel_#{dom_id}) { jQuery('##{dom_id}').jqGrid('restoreRow', lastsel_#{dom_id}); jQuery('##{dom_id}').jqGrid('editRow', id, true, #{inline_edit_handler}, #{error_handler}); lastsel_#{dom_id}=id}}"
|
179
|
+
elsif select_rows #.present?
|
180
|
+
vals[:scrollrows] = true
|
181
|
+
vals[:onSelectRow] = select_rows
|
182
|
+
vals[:multiselect] = true if multi_select
|
183
|
+
else
|
184
|
+
vals[:hoverrows] = false
|
185
|
+
vals[:beforeSelectRow] = "javascript: function(){ false; }"
|
186
|
+
end
|
187
|
+
|
188
|
+
# pager layer
|
189
|
+
if pager
|
190
|
+
vals[:pager] = "##{pager}"
|
191
|
+
vals[:viewrecords] = true # display total records in the query (eg "1 - 10 of 25")
|
192
|
+
vals[:rowList] = paging_choices
|
193
|
+
if paging_controls.is_a?(Hash)
|
194
|
+
# allow override of jqGrid pager options
|
195
|
+
vals.merge!(paging_controls)
|
196
|
+
elsif !paging_controls
|
197
|
+
vals[:rowList] = []
|
198
|
+
vals[:pgbuttons] = false
|
199
|
+
vals[:pginput] = false
|
200
|
+
vals[:recordtext] = "{2} records"
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
#subgrid
|
205
|
+
if sub_grid
|
206
|
+
vals[:subGrid] = sub_grid
|
207
|
+
vals[:subGridUrl] = sub_grid_url
|
208
|
+
vals[:subGridModel] = sub_grid_model
|
209
|
+
vals[:gridview] = false
|
210
|
+
end
|
211
|
+
|
212
|
+
#events
|
213
|
+
#vals[:serializeGridData] = serialize_grid_data if serialize_grid_data
|
214
|
+
|
215
|
+
vals[:loadonce] = load_once if load_once
|
216
|
+
|
217
|
+
# allow override of native jqGrid options
|
218
|
+
vals.merge(jqgrid_options)
|
219
|
+
|
220
|
+
|
221
|
+
end
|
222
|
+
|
223
|
+
# -----------------
|
224
|
+
def jqgrid_javascript( options={} )
|
225
|
+
s = ''
|
226
|
+
|
227
|
+
if table_to_grid
|
228
|
+
s << %Q^
|
229
|
+
tableToGrid("##{dom_id}", #{to_json});
|
230
|
+
^
|
231
|
+
s << %Q^
|
232
|
+
grid_#{dom_id} = jQuery("##{dom_id}")
|
233
|
+
^
|
234
|
+
else
|
235
|
+
s << %Q^
|
236
|
+
grid_#{dom_id} = jQuery("##{dom_id}").jqGrid(#{to_json})
|
237
|
+
^
|
238
|
+
end
|
239
|
+
|
240
|
+
s << ';'
|
241
|
+
|
242
|
+
# tag the grid as fluid so we can find it on resize events
|
243
|
+
if width_fit == :fluid
|
244
|
+
s << %Q^
|
245
|
+
jQuery("##{dom_id}").addClass("fluid");
|
246
|
+
^
|
247
|
+
end
|
248
|
+
|
249
|
+
# override tableToGrid colmodel options as needed (sortable)
|
250
|
+
#s << %Q^ .jqGrid('setColProp','Title',{sortable: false})^
|
251
|
+
|
252
|
+
# resize method
|
253
|
+
if resizable
|
254
|
+
s << %Q^
|
255
|
+
jQuery("##{dom_id}").jqGrid('gridResize', #{resizable.to_json});
|
256
|
+
^
|
257
|
+
end
|
258
|
+
|
259
|
+
# pager buttons (navGrid)
|
260
|
+
if pager
|
261
|
+
nav_params = {
|
262
|
+
'edit' => edit_button.present?,
|
263
|
+
'add' => add_button.present?,
|
264
|
+
'del' => delete_button.present?,
|
265
|
+
'search' => search_button.present? || search_advanced.present?,
|
266
|
+
'view' => view_button.present?,
|
267
|
+
'refresh' => refresh_button.present?
|
268
|
+
}.merge(jqgrid_nav_options||{})
|
269
|
+
|
270
|
+
s << %Q^
|
271
|
+
jQuery("##{dom_id}").jqGrid('navGrid', '##{pager}',
|
272
|
+
#{nav_params.to_json},
|
273
|
+
#{edit_button_options.to_json_with_js},
|
274
|
+
#{add_button_options.to_json_with_js},
|
275
|
+
#{delete_button_options.to_json_with_js},
|
276
|
+
#{search_button_options.to_json_with_js},
|
277
|
+
#{view_button_options.to_json_with_js}
|
278
|
+
);
|
279
|
+
^
|
280
|
+
end
|
281
|
+
|
282
|
+
if arranger_type.include?(:hide_show)
|
283
|
+
s << %Q^
|
284
|
+
jQuery("##{dom_id}").jqGrid('navButtonAdd','##{pager}',{
|
285
|
+
caption: "Columns",
|
286
|
+
title: "Hide/Show Columns",
|
287
|
+
onClickButton : function (){ jQuery("##{dom_id}").jqGrid('setColumns',
|
288
|
+
#{arranger_options(:hide_show).to_json_with_js} );
|
289
|
+
}
|
290
|
+
});
|
291
|
+
^
|
292
|
+
end
|
293
|
+
if arranger_type.include?(:chooser)
|
294
|
+
# hackey way to build the string but gets it done
|
295
|
+
chooser_code = %Q^ function (){ jQuery('##{dom_id}').jqGrid('columnChooser', {
|
296
|
+
done : function (perm) {
|
297
|
+
if (perm) {
|
298
|
+
this.jqGrid('remapColumns', perm, true);
|
299
|
+
var gwdth = this.jqGrid('getGridParam','width');
|
300
|
+
this.jqGrid('setGridWidth',gwdth);
|
301
|
+
}
|
302
|
+
} })}^
|
303
|
+
chooser_opts = {
|
304
|
+
'caption' => 'Columns',
|
305
|
+
'title' => 'Arrange Columns',
|
306
|
+
'onClickButton' => 'chooser_code'
|
307
|
+
}.merge(arranger_options(:chooser))
|
308
|
+
s << %Q^
|
309
|
+
jQuery("##{dom_id}").jqGrid('navButtonAdd','##{pager}', #{chooser_opts.to_json.gsub('"chooser_code"', chooser_code)} );
|
310
|
+
^
|
311
|
+
end
|
312
|
+
|
313
|
+
if search_toolbar
|
314
|
+
# I wish we could put this in the header rather than the pager
|
315
|
+
s << %Q^
|
316
|
+
jQuery("##{dom_id}").jqGrid('navButtonAdd',"##{pager}", { caption:"Toggle", title:"Toggle Search Toolbar", buttonicon: 'ui-icon-pin-s', onClickButton: function(){ grid_#{dom_id}[0].toggleToolbar() } });
|
317
|
+
jQuery("##{dom_id}").jqGrid('navButtonAdd',"##{pager}", { caption:"Clear", title:"Clear Search", buttonicon: 'ui-icon-refresh', onClickButton: function(){ grid_#{dom_id}[0].clearToolbar() } });
|
318
|
+
jQuery("##{dom_id}").jqGrid('filterToolbar');
|
319
|
+
^
|
320
|
+
end
|
321
|
+
|
322
|
+
if sortable_rows
|
323
|
+
# I wish we could put this in the header rather than the pager
|
324
|
+
s << %Q^
|
325
|
+
jQuery("##{dom_id}").jqGrid('sortableRows');
|
326
|
+
^
|
327
|
+
end
|
328
|
+
|
329
|
+
# TODO: built in event handlers, eg
|
330
|
+
# loadError
|
331
|
+
# onSelectRow, onDblClickRow, onRightClickRow etc
|
332
|
+
|
333
|
+
#unless search_toolbar == :visible
|
334
|
+
# s << %Q^
|
335
|
+
# grid_#{dom_id}[0].toggleToolbar();
|
336
|
+
# ^
|
337
|
+
#end
|
338
|
+
|
339
|
+
# # keep page controls centered (jqgrid bug) [eg appears when :width_fit => :scroll]
|
340
|
+
# s << %Q^ $("##{pager}_left").css("width", "auto"); ^
|
341
|
+
|
342
|
+
s
|
343
|
+
end
|
344
|
+
|
345
|
+
# ------------------
|
346
|
+
def js_helpers
|
347
|
+
# just move this into appliaction.js?
|
348
|
+
|
349
|
+
# gridify_fluid_recalc_width: allow grid resize on window resize events
|
350
|
+
# recalculate width of grid based on parent container; handles multiple grids
|
351
|
+
# ref: http://www.trirand.com/blog/?page_id=393/feature-request/Resizable%20grid/
|
352
|
+
|
353
|
+
# afterSubmit: display error message in response
|
354
|
+
|
355
|
+
%Q^
|
356
|
+
function gridify_fluid_recalc_width(){
|
357
|
+
if (grids = jQuery('.fluid.ui-jqgrid-btable:visible')) {
|
358
|
+
grids.each(function(index) {
|
359
|
+
gridId = jQuery(this).attr('id');
|
360
|
+
gridParentWidth = jQuery('#gbox_' + gridId).parent().width();
|
361
|
+
jQuery('#' + gridId).jqGrid('setGridWidth', gridParentWidth);
|
362
|
+
});
|
363
|
+
}
|
364
|
+
};
|
365
|
+
|
366
|
+
jQuery(window).live('resize', gridify_fluid_recalc_width);
|
367
|
+
function gridify_action_error_handler(r, data, action){
|
368
|
+
if (r.responseText != '') {
|
369
|
+
return [false, r.responseText];
|
370
|
+
} else {
|
371
|
+
return true;
|
372
|
+
}
|
373
|
+
}
|
374
|
+
^
|
375
|
+
end
|
376
|
+
|
377
|
+
|
378
|
+
# if(r.responseText != "") {
|
379
|
+
# $('#{error_container}').html(r.responseText);
|
380
|
+
# $('#{error_container}').slideDown();
|
381
|
+
# //window.setTimeout(function() { // Hide error div after 6 seconds
|
382
|
+
# // $('#{error_container}').slideUp();
|
383
|
+
# //}, 6000);
|
384
|
+
# return false;
|
385
|
+
# }
|
386
|
+
# return true;
|
387
|
+
|
388
|
+
# lets options be true or a hash, merges into defaults and returns a hash
|
389
|
+
def merge_options_defaults( options, defaults={} )
|
390
|
+
if options
|
391
|
+
defaults.merge( options==true ? {} : options)
|
392
|
+
else
|
393
|
+
{}
|
394
|
+
end
|
395
|
+
end
|
396
|
+
|
397
|
+
end
|
398
|
+
end
|
399
|
+
|
400
|
+
class Hash
|
401
|
+
# replace embedded '"javascript: foo"' with 'foo'
|
402
|
+
def to_json_with_js
|
403
|
+
self.to_json.gsub(/\"javascript: ([^"]*)\"/) {|string| string[1..-2].gsub('javascript:','') }
|
404
|
+
end
|
405
|
+
end
|
406
|
+
|
407
|
+
module JqgridJson
|
408
|
+
include ActionView::Helpers::JavaScriptHelper
|
409
|
+
include HandleAttributes
|
410
|
+
|
411
|
+
def to_subgrid_json(attributes)
|
412
|
+
json = %Q({)
|
413
|
+
if self.empty?
|
414
|
+
json << "}"
|
415
|
+
else
|
416
|
+
json <<= %Q("rows":[)
|
417
|
+
each do |elem|
|
418
|
+
elem.id ||= index(elem)
|
419
|
+
json << %Q({"id":"#{elem.id}","cell":[)
|
420
|
+
couples = elem.attributes.symbolize_keys
|
421
|
+
attributes.each do |atr|
|
422
|
+
value = get_atr_value(elem, atr, couples)
|
423
|
+
value = escape_javascript(value) if value and value.is_a? String
|
424
|
+
json << %Q("#{value}",)
|
425
|
+
end
|
426
|
+
json.chop! << "]},"
|
427
|
+
end
|
428
|
+
json.chop! << "]}"
|
429
|
+
end
|
430
|
+
end
|
431
|
+
end
|
432
|
+
|
433
|
+
class Array
|
434
|
+
include JqgridJson
|
435
|
+
end
|
@@ -0,0 +1,438 @@
|
|
1
|
+
module ActionView
|
2
|
+
module Helpers
|
3
|
+
|
4
|
+
def jqgrid_javascripts(locale)
|
5
|
+
js = capture { javascript_include_tag "i18n/jqgrid/locale-#{locale}.min" }
|
6
|
+
js << capture {javascript_tag "jQuery.jgrid.no_legacy_api = true;" }
|
7
|
+
js << capture { javascript_include_tag 'jquery.jqGrid.min' }
|
8
|
+
end
|
9
|
+
|
10
|
+
def jqgrid(title, id, action, columns = {},
|
11
|
+
options = {}, edit_options = "", add_options = "", del_options = "", search_options = "",
|
12
|
+
custom1_button = nil, custom2_button = nil, custom3_button = nil, custom4_button = nil, custom5_button = nil )
|
13
|
+
|
14
|
+
# Default options
|
15
|
+
options =
|
16
|
+
{
|
17
|
+
:rows_per_page => '10',
|
18
|
+
:sort_column => '',
|
19
|
+
:sort_order => '',
|
20
|
+
:height => '150',
|
21
|
+
:gridview => 'false',
|
22
|
+
:error_handler => 'null',
|
23
|
+
:inline_edit_handler => 'null',
|
24
|
+
:add => 'false',
|
25
|
+
:delete => 'false',
|
26
|
+
:search => 'true',
|
27
|
+
:edit => 'false',
|
28
|
+
:inline_edit => 'false',
|
29
|
+
:autowidth => 'false',
|
30
|
+
:hidegrid => 'false',
|
31
|
+
:rownumbers => 'false'
|
32
|
+
}.merge(options)
|
33
|
+
|
34
|
+
# Stringify options values
|
35
|
+
options.inject({}) do |options, (key, value)|
|
36
|
+
options[key] = (key != :subgrid) ? value.to_s : value
|
37
|
+
options
|
38
|
+
end
|
39
|
+
|
40
|
+
options[:error_handler_return_value] = (options[:error_handler] == 'null') ? 'true;' : options[:error_handler]
|
41
|
+
edit_button = (options[:edit] == 'true' && options[:inline_edit] == 'false').to_s
|
42
|
+
|
43
|
+
# Generate columns data
|
44
|
+
col_names, col_model = gen_columns(columns)
|
45
|
+
|
46
|
+
# Enable multi-selection (checkboxes)
|
47
|
+
multiselect = "multiselect: false,"
|
48
|
+
if options[:multi_selection]
|
49
|
+
multiselect = "multiselect: true,"
|
50
|
+
multihandler = %Q/
|
51
|
+
jQuery("##{id}_select_button").click( function() {
|
52
|
+
var s; s = jQuery("##{id}").jqGrid('getGridParam', 'selarrrow');
|
53
|
+
#{options[:selection_handler]}(s);
|
54
|
+
return false;
|
55
|
+
});/
|
56
|
+
end
|
57
|
+
|
58
|
+
# Enable master-details
|
59
|
+
masterdetails = ""
|
60
|
+
if options[:master_details]
|
61
|
+
masterdetails = %Q/
|
62
|
+
onSelectRow: function(ids) {
|
63
|
+
if(ids == null) {
|
64
|
+
ids=0;
|
65
|
+
if(jQuery("##{id}_details").jqGrid('getGridParam', 'records') >0 )
|
66
|
+
{
|
67
|
+
jQuery("##{id}_details").jqGrid('setGridParam', {url:"#{options[:details_url]}?q=1&id="+ids,page:1})
|
68
|
+
jQuery("##{id}_details").jqGrid('setCaption', "#{options[:details_caption]}: "+ids)
|
69
|
+
jQuery("##{id}_details").trigger('reloadGrid');
|
70
|
+
}
|
71
|
+
}
|
72
|
+
else
|
73
|
+
{
|
74
|
+
jQuery("##{id}_details").jqGrid('setGridParam', {url:"#{options[:details_url]}?q=1&id="+ids,page:1})
|
75
|
+
jQuery("##{id}_details").jqGrid('setCaption', "#{options[:details_caption]} : "+ids)
|
76
|
+
jQuery("##{id}_details").trigger('reloadGrid');
|
77
|
+
}
|
78
|
+
},/
|
79
|
+
end
|
80
|
+
|
81
|
+
# Enable selection link, button
|
82
|
+
# The javascript function created by the user (options[:selection_handler]) will be called with the selected row id as a parameter
|
83
|
+
selection_link = ""
|
84
|
+
if options[:direct_selection].blank? && options[:selection_handler].present? && options[:multi_selection].blank?
|
85
|
+
selection_link = %Q/
|
86
|
+
jQuery("##{id}_select_button").click( function(){
|
87
|
+
var id = jQuery("##{id}").jqGrid('getGridParam', 'selrow');
|
88
|
+
if (id) {
|
89
|
+
#{options[:selection_handler]}(id);
|
90
|
+
} else {
|
91
|
+
alert("Please select a row");
|
92
|
+
}
|
93
|
+
return false;
|
94
|
+
});/
|
95
|
+
end
|
96
|
+
|
97
|
+
# Enable direct selection (when a row in the table is clicked)
|
98
|
+
# The javascript function created by the user (options[:selection_handler]) will be called with the selected row id as a parameter
|
99
|
+
direct_link = ""
|
100
|
+
if options[:direct_selection] && options[:selection_handler].present? && options[:multi_selection].blank?
|
101
|
+
direct_link = %Q/
|
102
|
+
onSelectRow: function(id){
|
103
|
+
if(id){
|
104
|
+
#{options[:selection_handler]}(id);
|
105
|
+
}
|
106
|
+
},/
|
107
|
+
end
|
108
|
+
|
109
|
+
# Enable grid_loaded callback
|
110
|
+
# When data are loaded into the grid, call the Javascript function options[:grid_loaded] (defined by the user)
|
111
|
+
grid_loaded = ""
|
112
|
+
if options[:grid_loaded].present?
|
113
|
+
grid_loaded = %Q/
|
114
|
+
loadComplete: function(){
|
115
|
+
#{options[:grid_loaded]}();
|
116
|
+
},
|
117
|
+
/
|
118
|
+
end
|
119
|
+
|
120
|
+
# Enable inline editing
|
121
|
+
# When a row is selected, all fields are transformed to input types
|
122
|
+
editable = ""
|
123
|
+
if options[:edit] && options[:inline_edit] == 'true'
|
124
|
+
editable = %Q/
|
125
|
+
onSelectRow: function(id){
|
126
|
+
if(id && id!==lastsel){
|
127
|
+
jQuery('##{id}').jqGrid('restoreRow', lastsel);
|
128
|
+
jQuery('##{id}').jqGrid('editRow', id, true, #{options[:inline_edit_handler]}, #{options[:error_handler]});
|
129
|
+
lastsel=id;
|
130
|
+
}
|
131
|
+
},/
|
132
|
+
end
|
133
|
+
|
134
|
+
# Enable subgrids
|
135
|
+
subgrid = ""
|
136
|
+
subgrid_enabled = "subGrid:false,"
|
137
|
+
|
138
|
+
if options[:subgrid].present?
|
139
|
+
|
140
|
+
subgrid_enabled = "subGrid:true,"
|
141
|
+
|
142
|
+
options[:subgrid] =
|
143
|
+
{
|
144
|
+
:rows_per_page => '10',
|
145
|
+
:sort_column => 'id',
|
146
|
+
:sort_order => 'asc',
|
147
|
+
:add => 'false',
|
148
|
+
:edit => 'false',
|
149
|
+
:delete => 'false',
|
150
|
+
:search => 'false'
|
151
|
+
}.merge(options[:subgrid])
|
152
|
+
|
153
|
+
# Stringify options values
|
154
|
+
options[:subgrid].inject({}) do |suboptions, (key, value)|
|
155
|
+
suboptions[key] = value.to_s
|
156
|
+
suboptions
|
157
|
+
end
|
158
|
+
|
159
|
+
subgrid_inline_edit = ""
|
160
|
+
if options[:subgrid][:inline_edit] == true
|
161
|
+
options[:subgrid][:edit] = 'false'
|
162
|
+
subgrid_inline_edit = %Q/
|
163
|
+
onSelectRow: function(id){
|
164
|
+
if(id && id!==lastsel){
|
165
|
+
jQuery('#'+subgrid_table_id).jqGrid('restoreRow', lastsel);
|
166
|
+
jQuery('#'+subgrid_table_id).jqGrid('editRow', id,true);
|
167
|
+
lastsel=id;
|
168
|
+
}
|
169
|
+
},
|
170
|
+
/
|
171
|
+
end
|
172
|
+
|
173
|
+
if options[:subgrid][:direct_selection] && options[:subgrid][:selection_handler].present?
|
174
|
+
subgrid_direct_link = %Q/
|
175
|
+
onSelectRow: function(id){
|
176
|
+
if(id){
|
177
|
+
#{options[:subgrid][:selection_handler]}(id);
|
178
|
+
}
|
179
|
+
},
|
180
|
+
/
|
181
|
+
end
|
182
|
+
|
183
|
+
sub_col_names, sub_col_model = gen_columns(options[:subgrid][:columns])
|
184
|
+
|
185
|
+
subgrid = %Q(
|
186
|
+
subGridRowExpanded: function(subgrid_id, row_id) {
|
187
|
+
var subgrid_table_id, pager_id;
|
188
|
+
subgrid_table_id = subgrid_id+"_t";
|
189
|
+
pager_id = "p_"+subgrid_table_id;
|
190
|
+
$("#"+subgrid_id).html("<table id='"+subgrid_table_id+"' class='scroll'></table><div id='"+pager_id+"' class='scroll'></div>");
|
191
|
+
jQuery("#"+subgrid_table_id).jqGrid({
|
192
|
+
url:"#{options[:subgrid][:url]}?q=2&id="+row_id,
|
193
|
+
editurl:'#{options[:subgrid][:edit_url]}?parent_id='+row_id,
|
194
|
+
datatype: "json",
|
195
|
+
colNames: #{sub_col_names},
|
196
|
+
colModel: #{sub_col_model},
|
197
|
+
rowNum:#{options[:subgrid][:rows_per_page]},
|
198
|
+
pager: pager_id,
|
199
|
+
sortname: '#{options[:subgrid][:sort_column]}',
|
200
|
+
sortorder: '#{options[:subgrid][:sort_order]}',
|
201
|
+
viewrecords: true,
|
202
|
+
//toolbar : [true,"top"],
|
203
|
+
#{subgrid_inline_edit}
|
204
|
+
#{subgrid_direct_link}
|
205
|
+
height: '100%'
|
206
|
+
});
|
207
|
+
jQuery("#"+subgrid_table_id).jqGrid('navGrid', "#"+pager_id,{edit:#{options[:subgrid][:edit]},add:#{options[:subgrid][:add]},del:#{options[:subgrid][:delete]},search:false})
|
208
|
+
jQuery("#"+subgrid_table_id).jqGrid('navButtonAdd', "#"+pager_id,{caption:"Search",title:"Toggle Search",buttonimg:'/images/jqgrid/search.png',
|
209
|
+
onClickButton:function(){
|
210
|
+
if(jQuery("#t_"+subgrid_table_id).css("display")=="none") {
|
211
|
+
jQuery("#t_"+subgrid_table_id).css("display","");
|
212
|
+
} else {
|
213
|
+
jQuery("#t_"+subgrid_table_id).css("display","none");
|
214
|
+
}
|
215
|
+
}
|
216
|
+
});
|
217
|
+
jQuery("#t_"+subgrid_table_id).height(25).hide().jqGrid('filterGrid', ""+subgrid_table_id,{gridModel:true,gridToolbar:true});
|
218
|
+
},
|
219
|
+
subGridRowColapsed: function(subgrid_id, row_id) {
|
220
|
+
},
|
221
|
+
)
|
222
|
+
end
|
223
|
+
|
224
|
+
# Generate required Javascript & html to create the jqgrid
|
225
|
+
%Q(
|
226
|
+
<script type="text/javascript">
|
227
|
+
var lastsel;
|
228
|
+
jQuery(document).ready(function(){
|
229
|
+
jQuery("##{id}").jqGrid({
|
230
|
+
url:'#{action}?q=1',
|
231
|
+
height: "#{options[:height]}",
|
232
|
+
// page: 1,
|
233
|
+
rowNum:#{options[:rows_per_page]},
|
234
|
+
// records: 0,
|
235
|
+
pager: '##{id}_pager',
|
236
|
+
// pgbuttons: true,
|
237
|
+
// pginput: true,
|
238
|
+
colModel:#{col_model},
|
239
|
+
rowList:[10,25,50,100],
|
240
|
+
colNames:#{col_names},
|
241
|
+
sortorder: '#{options[:sort_order]}',
|
242
|
+
sortname: '#{options[:sort_column]}',
|
243
|
+
datatype: "json",
|
244
|
+
// mtype: "GET",
|
245
|
+
// altRows: false,
|
246
|
+
// selarrrow: [],
|
247
|
+
// savedRow: [],
|
248
|
+
// shrinkToFit: true,
|
249
|
+
// xmlReader: {},
|
250
|
+
// jsonReader: {},
|
251
|
+
// subGrid: false,
|
252
|
+
// subGridModel :[],
|
253
|
+
// reccount: 0,
|
254
|
+
// lastpage: 0,
|
255
|
+
// lastsort: 0,
|
256
|
+
// selrow: null,
|
257
|
+
// beforeSelectRow: null,
|
258
|
+
// onSelectRow: null,
|
259
|
+
// onSortCol: null,
|
260
|
+
// ondblClickRow: null,
|
261
|
+
// onRightClickRow: null,
|
262
|
+
// onPaging: null,
|
263
|
+
// onSelectAll: null,
|
264
|
+
// loadComplete: null,
|
265
|
+
// gridComplete: null,
|
266
|
+
// loadError: null,
|
267
|
+
// loadBeforeSend: null,
|
268
|
+
// afterInsertRow: null,
|
269
|
+
// beforeRequest: null,
|
270
|
+
// onHeaderClick: null,
|
271
|
+
viewrecords: true,
|
272
|
+
// loadonce: false,
|
273
|
+
// multikey: false,
|
274
|
+
editurl:'#{options[:edit_url]}',
|
275
|
+
// search: false,
|
276
|
+
caption: "#{title}",
|
277
|
+
hidegrid: #{options[:hidegrid]},
|
278
|
+
// hiddengrid: false,
|
279
|
+
// postData: {},
|
280
|
+
// userData: {},
|
281
|
+
// treeGrid : false,
|
282
|
+
// treeGridModel : 'nested',
|
283
|
+
// treeReader : {},
|
284
|
+
// treeANode : -1,
|
285
|
+
// ExpandColumn: null,
|
286
|
+
// tree_root_level : 0,
|
287
|
+
// prmNames: {page:"page",rows:"rows", sort: "sidx",order: "sord", search:"_search", nd:"nd", id:"id",oper:"oper",editoper:"edit",addoper:"add",deloper:"del"},
|
288
|
+
// forceFit : false,
|
289
|
+
// gridstate : "visible",
|
290
|
+
// cellEdit: false,
|
291
|
+
// cellsubmit: "remote",
|
292
|
+
// nv:0,
|
293
|
+
// loadui: "enable",
|
294
|
+
// toolbar: [false,""],
|
295
|
+
// scroll: false,
|
296
|
+
// multiboxonly : false,
|
297
|
+
// deselectAfterSort : true,
|
298
|
+
scrollrows: true,
|
299
|
+
autowidth: #{options[:autowidth]},
|
300
|
+
// scrollOffset :18,
|
301
|
+
// cellLayout: 5,
|
302
|
+
// subGridWidth: 20,
|
303
|
+
// multiselectWidth: 20,
|
304
|
+
gridview: #{options[:gridview]},
|
305
|
+
// rownumWidth: 25,
|
306
|
+
rownumbers: #{options[:rownumbers]},
|
307
|
+
// pagerpos: 'center',
|
308
|
+
// recordpos: 'right',
|
309
|
+
// footerrow : false,
|
310
|
+
// userDataOnFooter : false,
|
311
|
+
// hoverrows : true,
|
312
|
+
// altclass : 'ui-priority-secondary',
|
313
|
+
// viewsortcols : [false,'vertical',true],
|
314
|
+
// resizeclass : '',
|
315
|
+
// autoencode : false,
|
316
|
+
// remapColumns : [],
|
317
|
+
// ajaxGridOptions :{},
|
318
|
+
// direction : "ltr",
|
319
|
+
#{multiselect}
|
320
|
+
#{masterdetails}
|
321
|
+
#{grid_loaded}
|
322
|
+
#{direct_link}
|
323
|
+
#{editable}
|
324
|
+
#{subgrid_enabled}
|
325
|
+
#{subgrid}
|
326
|
+
// toppager: false,
|
327
|
+
// headertitles: false
|
328
|
+
});
|
329
|
+
jQuery("##{id}").jqGrid('navGrid', '##{id}_pager',
|
330
|
+
{edit:#{edit_button},add:#{options[:add]},del:#{options[:delete]},search:#{options[:search]},refresh:true},
|
331
|
+
{afterSubmit:function(r,data){return #{options[:error_handler_return_value]}(r,data,'edit');}},
|
332
|
+
{afterSubmit:function(r,data){return #{options[:error_handler_return_value]}(r,data,'add');}},
|
333
|
+
{afterSubmit:function(r,data){return #{options[:error_handler_return_value]}(r,data,'delete');}},
|
334
|
+
{#{search_options}}
|
335
|
+
);
|
336
|
+
#{multihandler}
|
337
|
+
#{selection_link}
|
338
|
+
});
|
339
|
+
</script>
|
340
|
+
)
|
341
|
+
end
|
342
|
+
|
343
|
+
private
|
344
|
+
|
345
|
+
def gen_columns(columns)
|
346
|
+
# Generate columns data
|
347
|
+
col_names = "[" # Labels
|
348
|
+
col_model = "[" # Options
|
349
|
+
columns.each do |c|
|
350
|
+
col_names << "'#{c[:label]}',"
|
351
|
+
col_model << "{name:'#{c[:field]}', index:'#{c[:field]}'#{get_attributes(c)}},"
|
352
|
+
end
|
353
|
+
col_names.chop! << "]"
|
354
|
+
col_model.chop! << "]"
|
355
|
+
[col_names, col_model]
|
356
|
+
end
|
357
|
+
|
358
|
+
# Generate a list of attributes for related column (align:'right', sortable:true, resizable:false, ...)
|
359
|
+
def get_attributes(column)
|
360
|
+
options = ","
|
361
|
+
column.except(:field, :label).each do |couple|
|
362
|
+
if couple[0] == :editoptions
|
363
|
+
options << "editoptions:#{get_sub_options(couple[1])},"
|
364
|
+
elsif couple[0] == :formoptions
|
365
|
+
options << "formoptions:#{get_sub_options(couple[1])},"
|
366
|
+
elsif couple[0] == :searchoptions
|
367
|
+
options << "searchoptions:#{get_sub_options(couple[1])},"
|
368
|
+
elsif couple[0] == :editrules
|
369
|
+
options << "editrules:#{get_sub_options(couple[1])},"
|
370
|
+
else
|
371
|
+
if couple[1].class == String
|
372
|
+
options << "#{couple[0]}:'#{couple[1]}',"
|
373
|
+
else
|
374
|
+
options << "#{couple[0]}:#{couple[1]},"
|
375
|
+
end
|
376
|
+
end
|
377
|
+
end
|
378
|
+
options.chop!
|
379
|
+
end
|
380
|
+
|
381
|
+
# Generate options for editable fields (value, data, width, maxvalue, cols, rows, ...)
|
382
|
+
def get_sub_options(editoptions)
|
383
|
+
options = "{"
|
384
|
+
editoptions.each do |couple|
|
385
|
+
if couple[0] == :value # :value => [[1, "Rails"], [2, "Ruby"], [3, "jQuery"]]
|
386
|
+
options << %Q/value:"/
|
387
|
+
couple[1].each do |v|
|
388
|
+
options << "#{v[0]}:#{v[1]};"
|
389
|
+
end
|
390
|
+
options.chop! << %Q/",/
|
391
|
+
elsif couple[0] == :data # :data => [Category.all, :id, :title])
|
392
|
+
options << %Q/value:"/
|
393
|
+
couple[1].first.each do |obj|
|
394
|
+
options << "%s:%s;" % [obj.send(couple[1].second), obj.send(couple[1].third)]
|
395
|
+
end
|
396
|
+
options.chop! << %Q/",/
|
397
|
+
else # :size => 30, :rows => 5, :maxlength => 20, ...
|
398
|
+
if couple[1].instance_of?(Fixnum) || couple[1] == 'true' || couple[1] == 'false' || couple[1] == true || couple[1] == false
|
399
|
+
options << %Q/#{couple[0]}:#{couple[1]},/
|
400
|
+
else
|
401
|
+
options << %Q/#{couple[0]}:"#{couple[1]}",/
|
402
|
+
end
|
403
|
+
end
|
404
|
+
end
|
405
|
+
options.chop! << "}"
|
406
|
+
end
|
407
|
+
end
|
408
|
+
end
|
409
|
+
|
410
|
+
module JqgridJson
|
411
|
+
include ActionView::Helpers::JavaScriptHelper
|
412
|
+
include HandleAttributes
|
413
|
+
|
414
|
+
def to_jqgrid_json(attributes, current_page, per_page, total)
|
415
|
+
json = %Q({"page":"#{current_page}","total":#{total/per_page.to_i+1},"records":"#{total}")
|
416
|
+
if total > 0
|
417
|
+
json << %Q(,"rows":[)
|
418
|
+
each do |elem|
|
419
|
+
elem.id ||= index(elem)
|
420
|
+
json << %Q({"id":"#{elem.id}","cell":[)
|
421
|
+
couples = elem.attributes.symbolize_keys
|
422
|
+
attributes.each do |atr|
|
423
|
+
value = get_atr_value(elem, atr, couples)
|
424
|
+
value = escape_javascript(value) if value and value.is_a? String
|
425
|
+
json << %Q("#{value}",)
|
426
|
+
end
|
427
|
+
json.chop! << "]},"
|
428
|
+
end
|
429
|
+
json.chop! << "]}"
|
430
|
+
else
|
431
|
+
json << "}"
|
432
|
+
end
|
433
|
+
end
|
434
|
+
end
|
435
|
+
|
436
|
+
class Array
|
437
|
+
include JqgridJson
|
438
|
+
end
|