ab_admin 0.1.2 → 0.2.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (95) hide show
  1. data/Gemfile +1 -0
  2. data/Guardfile +1 -1
  3. data/app/assets/images/admin/flags/b_uk.png +0 -0
  4. data/app/assets/images/admin/preloader.gif +0 -0
  5. data/app/assets/javascripts/ab_admin/application.js +1 -28
  6. data/app/assets/javascripts/ab_admin/components/admin_assets.js.coffee +29 -6
  7. data/app/assets/javascripts/ab_admin/components/gmaps.js.coffee +120 -91
  8. data/app/assets/javascripts/ab_admin/components/google_translate.js.coffee +3 -2
  9. data/app/assets/javascripts/ab_admin/core/batch_actions.js.coffee +4 -7
  10. data/app/assets/javascripts/ab_admin/core/init.js.coffee +8 -10
  11. data/app/assets/javascripts/ab_admin/core/ui_utils.js.coffee +53 -24
  12. data/app/assets/javascripts/ab_admin/core/utils.js.coffee +7 -0
  13. data/app/assets/javascripts/ab_admin/inputs/datetime_input.js.coffee +1 -2
  14. data/app/assets/javascripts/ab_admin/main.js +28 -0
  15. data/app/assets/stylesheets/ab_admin/application.css.scss +1 -10
  16. data/app/assets/stylesheets/ab_admin/bootstrap_and_overrides.css.scss +4 -0
  17. data/app/assets/stylesheets/ab_admin/components/_base.css.scss +4 -1
  18. data/app/assets/stylesheets/ab_admin/components/_form.css.scss +10 -13
  19. data/app/assets/stylesheets/ab_admin/components/_geo_input.css.scss +5 -9
  20. data/app/assets/stylesheets/ab_admin/fileupload.css.scss +68 -102
  21. data/app/assets/stylesheets/ab_admin/main.css.scss +8 -0
  22. data/app/controllers/admin/base_controller.rb +18 -14
  23. data/app/controllers/admin/manager_controller.rb +51 -6
  24. data/app/controllers/admin/users_controller.rb +23 -0
  25. data/app/views/admin/fileupload/_asset.html.slim +8 -0
  26. data/app/views/admin/fileupload/_container.html.slim +10 -0
  27. data/app/views/admin/fileupload/_file.html.slim +5 -0
  28. data/app/views/admin/fileupload/_ftmpl.html.slim +6 -0
  29. data/app/views/admin/fileupload/_tmpl.html.slim +9 -0
  30. data/app/views/admin/users/_form.html.slim +1 -0
  31. data/config/locales/en.yml +5 -60
  32. data/config/locales/ru.yml +14 -63
  33. data/config/routes.rb +7 -4
  34. data/features/dsl/custom_actions.feature +62 -0
  35. data/features/dsl/parent_resource.feature +18 -0
  36. data/features/step_definitions/configuration_steps.rb +6 -0
  37. data/features/step_definitions/dsl/parent_resource_steps.rb +8 -0
  38. data/features/step_definitions/settings_steps.rb +1 -1
  39. data/features/step_definitions/web_steps/transforms_steps.rb +3 -0
  40. data/features/support/paths.rb +3 -0
  41. data/lib/ab_admin.rb +5 -0
  42. data/lib/ab_admin/abstract_resource.rb +28 -4
  43. data/lib/ab_admin/carrierwave/base_uploader.rb +22 -22
  44. data/lib/ab_admin/concerns/admin_addition.rb +2 -2
  45. data/lib/ab_admin/concerns/utilities.rb +4 -4
  46. data/lib/ab_admin/config/base.rb +18 -0
  47. data/lib/ab_admin/controllers/head_options.rb +1 -1
  48. data/lib/ab_admin/core_ext/array.rb +4 -0
  49. data/lib/ab_admin/core_ext/string.rb +9 -10
  50. data/lib/ab_admin/hooks/quiet_scope_page.rb +16 -16
  51. data/lib/ab_admin/hooks/simple_form_hooks.rb +13 -13
  52. data/lib/ab_admin/i18n_tools/model_translator.rb +67 -0
  53. data/lib/ab_admin/models/asset.rb +32 -1
  54. data/lib/ab_admin/models/attachment_file.rb +1 -1
  55. data/lib/ab_admin/models/locator.rb +7 -0
  56. data/lib/ab_admin/models/settings.rb +7 -0
  57. data/lib/ab_admin/models/structure.rb +4 -0
  58. data/lib/ab_admin/utils.rb +2 -2
  59. data/lib/ab_admin/version.rb +1 -1
  60. data/lib/ab_admin/views/admin_helpers.rb +3 -3
  61. data/lib/ab_admin/views/admin_navigation_helpers.rb +1 -1
  62. data/lib/ab_admin/views/form_builder.rb +42 -39
  63. data/lib/ab_admin/views/helpers.rb +5 -0
  64. data/lib/ab_admin/views/manager_helpers.rb +10 -0
  65. data/lib/ab_admin/views/search_form_builder.rb +12 -5
  66. data/lib/generators/ab_admin/install/install_generator.rb +1 -1
  67. data/lib/generators/ab_admin/install/templates/config/admin_menu.rb +2 -2
  68. data/lib/generators/ab_admin/install/templates/helpers/admin/structures_helper.rb +1 -1
  69. data/lib/generators/ab_admin/install/templates/models/attachment_file.rb +2 -0
  70. data/lib/generators/ab_admin/install/templates/models/locator.rb +0 -1
  71. data/lib/generators/ab_admin/install/templates/models/settings.rb +0 -1
  72. data/lib/generators/ab_admin/install/templates/models/static_page.rb +1 -0
  73. data/lib/generators/ab_admin/install/templates/{scripts → script}/unicorn.sh +0 -0
  74. data/lib/generators/ab_admin/install/templates/uploaders/avatar_uploader.rb +4 -0
  75. data/lib/generators/ab_admin/resource/templates/_search_form.haml.erb +1 -1
  76. data/lib/generators/ab_admin/resource/templates/_search_form.slim.erb +1 -1
  77. data/lib/generators/ab_admin/resource/templates/_table.haml.erb +1 -2
  78. data/lib/generators/ab_admin/resource/templates/_table.slim.erb +1 -2
  79. data/lib/generators/template.rb +1 -0
  80. data/lib/tasks/i18n.rake +7 -0
  81. data/spec/dummy/app/models/ab_admin/ab_admin_collection.rb +35 -0
  82. data/spec/dummy/app/models/ab_admin/ab_admin_product.rb +2 -0
  83. data/spec/dummy/app/models/admin_menu.rb +4 -2
  84. data/spec/dummy/app/models/collection.rb +3 -1
  85. data/spec/generators/install_generator_spec.rb +1 -1
  86. data/spec/generators/resource_generator_spec.rb +1 -1
  87. data/spec/models/avatar_spec.rb +29 -2
  88. metadata +25 -12
  89. data/app/views/admin/fileupload/_asset.html.erb +0 -5
  90. data/app/views/admin/fileupload/_container.html.erb +0 -28
  91. data/app/views/admin/fileupload/_fcontainer.html.erb +0 -25
  92. data/app/views/admin/fileupload/_file.html.erb +0 -5
  93. data/app/views/admin/fileupload/_ftmpl.html.erb +0 -7
  94. data/app/views/admin/fileupload/_tmpl.html.erb +0 -9
  95. data/lib/ab_admin/utils/csv_builder.rb +0 -52
data/Gemfile CHANGED
@@ -29,6 +29,7 @@ gem 'will_paginate-bootstrap', '0.2.1'
29
29
  gem 'bootstrap-sass', '2.0.4'
30
30
  gem 'bootstrap-wysihtml5-rails'
31
31
  gem 'bootstrap-x-editable-rails'
32
+ gem 'fancybox2-rails'
32
33
  gem 'select2-rails'
33
34
  gem 'nested_form', '0.2.2'
34
35
  gem 'simple_form'
data/Guardfile CHANGED
@@ -2,7 +2,7 @@ notification :growl
2
2
  ignore /vendor/, /public/, /etc/
3
3
 
4
4
  group :rspec do
5
- guard 'rspec', :all_on_start => false, :all_after_pass => false do
5
+ guard 'rspec', :all_on_start => false, :all_after_pass => false, :cli => '--tag @focus' do
6
6
  watch(%r{^spec/.+_spec\.rb$})
7
7
  watch(%r{^lib/(.+)\.rb$}) { |m| "spec/lib/#{m[1]}_spec.rb" }
8
8
  watch('spec/spec_helper.rb') { "spec" }
@@ -1,28 +1 @@
1
- //= require i18n
2
- //= require i18n/translations
3
- //= require jquery_ujs
4
- //= require jquery.cookie
5
- //= require jquery.pjax
6
- //= require jquery.ui.nestedSortable
7
- //= require jquery_nested_form
8
- //= require jquery.hotkeys
9
- //= require bootstrap
10
- //= require ab_admin/bootstrap-tab-multi
11
- //= require ab_admin/bootstrap-datepicker/core
12
- //= require ab_admin/bootstrap-datepicker/locales/bootstrap-datepicker.ru.js
13
- //= require ab_admin/bootstrap-timepicker
14
- //= require bootstrap-wysihtml5
15
- //= require bootstrap-wysihtml5/locales/ru
16
- //= require bootstrap-editable-inline
17
- //= require select2
18
- //= require jquery.ui.nestedSortable
19
- //= require ab_admin/components/sortable_tree
20
- //= require ab_admin/components/google_translate
21
- //= require ab_admin/components/locator
22
- //= require ab_admin/components/admin_assets
23
- //= require ab_admin/components/gmaps
24
- //= require ab_admin/components/in_place_edit
25
-
26
- //= require ab_admin/core/init
27
- //= require ab_admin/inputs/datetime_input
28
-
1
+ //= require ab_admin/main
@@ -8,7 +8,7 @@ class window.AdminAssets
8
8
 
9
9
  initHandlers: ->
10
10
  self = this
11
- query = "#" + @element_id + " div.galery"
11
+ query = "##{@element_id} .fileupload-list"
12
12
  if @sortable
13
13
  $(".do_sort " + query).sortable
14
14
  revert: true
@@ -26,6 +26,34 @@ class window.AdminAssets
26
26
  if $.fn.fancybox
27
27
  @initFancybox(query)
28
28
 
29
+ unless window.admin_assets_first
30
+ window.admin_assets_first = true
31
+ @initMainImage()
32
+ @initRemove()
33
+ @initRotate()
34
+
35
+ initRemove: ->
36
+ $(document).on "ajax:complete", ".fileupload .del_asset", ->
37
+ $(this).closest("div.asset").remove()
38
+
39
+ initMainImage: ->
40
+ $(document).on 'click', '.fileupload.many_assets .main_image', ->
41
+ $asset = $(this).closest('.asset')
42
+ $curr_cont = $asset.closest('.fileupload')
43
+ $curr_list = $curr_cont.find('.fileupload-list')
44
+ asset_klass = $curr_cont.data('asset')
45
+ $main_list = $(".fileupload.one_asset[data-asset='#{asset_klass}'] .fileupload-list")
46
+
47
+ $.post "/admin/assets/#{$asset.data('id')}/main", ->
48
+ $main_list.find('.asset').appendTo($curr_list)
49
+ $asset.appendTo($main_list)
50
+
51
+ initRotate: ->
52
+ $(document).on 'click', '.fileupload .rotate_image', ->
53
+ $asset = $(this).closest('.asset')
54
+ $.post "/admin/assets/#{$asset.data('id')}/rotate", (data) ->
55
+ $asset.replaceWith $('#fileupload_tmpl').tmpl(data.asset)
56
+
29
57
  initFancybox: (query) ->
30
58
  $(query + " a.fancybox").fancybox
31
59
  titleShow: false
@@ -38,11 +66,6 @@ class window.AdminAssets
38
66
  obj.removeClass "drag_sort"
39
67
  false
40
68
 
41
- $ ->
42
- $(".fileupload .asset a.del").live "ajax:complete", ->
43
- $(this).closest("div.asset").remove()
44
-
45
-
46
69
  #class window.AssetDescription
47
70
  # constructor: (@assoc, @assetable_type, @assetable_id, @guid) ->
48
71
  # @cont = $("[id^='#{@assoc}_']")
@@ -1,120 +1,116 @@
1
1
  class window.GeoInput
2
- constructor: (@dom_lat, @dom_lon, @dom_zoom, @options={}) ->
2
+ @default_lat = 55.7427928
3
+ @default_lon = 55.7427928
4
+
5
+ constructor: (@cont, @options={}) ->
6
+ @prefix = @cont.attr('id').replace(/_geo_input$/, '')
3
7
  defaults =
4
- lat: 55.7427928
5
- lon: 37.61540089999994
6
- zoom: 12
7
- doom_map: 'admin_map'
8
- types: ['geocode']
9
- map_options: {}
8
+ lat: GeoInput.default_lat
9
+ lon: GeoInput.default_lon
10
+ autocomplete: true
11
+
10
12
  _.defaults(@options, defaults)
11
- @callback = window[@options.callback] if _.isFunction(window[@options.callback])
12
- @marker_callback = window[@options.marker_callback] if _.isFunction(window[@options.marker_callback])
13
- @lat_el = $('#' + @dom_lat)
14
- @lon_el = $('#' + @dom_lon);
15
- @zoom_el = $('#' + @dom_zoom);
16
13
 
17
- @lat = parseFloat(@lat_el.val()) or @options.lat
18
- @lon = parseFloat(@lon_el.val()) or @options.lon
19
- @zoom = parseInt(@zoom_el.val(), 10) or @options.zoom
20
- @lat_lon = new google.maps.LatLng(@lat, @lon)
21
- @initGMap()
14
+ @initElements()
15
+ @initPoint()
16
+ @initMap()
22
17
  @initMarker()
18
+ @initHandlers()
19
+ @initAutocomplete() if @options.autocomplete
23
20
 
24
- initGMap: ->
25
- map_options =
26
- zoom: @zoom,
27
- center: @lat_lon,
28
- mapTypeId: google.maps.MapTypeId.ROADMAP
29
- # scrollwheel: false
30
- _.defaults(@options.map_options, map_options)
31
- @map = new google.maps.Map(document.getElementById(@options.doom_map), @options.map_options)
32
-
33
- google.maps.event.addListener @map, 'zoom_changed', =>
34
- @zoom_el.val(@map.getZoom())
35
-
36
- setInputs: (pos) ->
37
- @lat_el.val(pos.lat())
38
- @lon_el.val(pos.lng())
39
- @zoom_el.val(@map.getZoom())
21
+ initElements: ->
22
+ for el in ['lat', 'lon', 'map', 'zoom', 'geo_ac']
23
+ @options["#{el}_id"] ||= "#{@prefix}_#{el}"
24
+ this["#{el}_el"] = $("##{@options["#{el}_id"]}")
40
25
 
41
- initMarker: ->
42
- marker_options =
43
- position: @lat_lon,
44
- map: @map,
45
- draggable: true
26
+ initPoint: ->
27
+ @lat = parseFloat(@lat_el.val()) or @options.lat
28
+ @lon = parseFloat(@lon_el.val()) or @options.lon
29
+ @zoom = parseInt(@zoom_el.val(), 10) or 12
30
+ @point = new google.maps.LatLng(@lat, @lon)
46
31
 
47
- @marker = new google.maps.Marker(marker_options)
48
- @infowindow = new google.maps.InfoWindow()
32
+ initHandlers: ->
33
+ @cont.bind 'geo_input:zoom_changed', (e) =>
34
+ @zoom_el.val(e.zoom)
49
35
 
50
- google.maps.event.addListener @marker, 'dragend', (event) =>
51
- @marker_callback.call(this, event.latLng) if @marker_callback
52
- @map.setCenter(event.latLng)
53
- pos = @marker.getPosition()
54
- @setInputs(pos)
36
+ @cont.bind 'geo_input:dragend', (e) =>
37
+ @map.setCenter(e.point)
38
+ @setInputs(e.point)
55
39
 
56
- initAutocomplete: (dom_input='geo_autocomplete') ->
57
- input = document.getElementById(dom_input)
58
- opts =
59
- types: @options.types
60
- language: I18n.locale
61
- # componentRestrictions: {country: 'ru'}
62
- opts.types = @typesByPrefix() if @options.prefix
63
- # log opts
64
- autocomplete = new google.maps.places.Autocomplete(input, opts)
65
- autocomplete.bindTo('bounds', @map)
66
- google.maps.event.addListener autocomplete, 'place_changed', =>
67
- place = autocomplete.getPlace()
68
- @callback.call(this, place) if @callback
69
- @setPlace(place)
40
+ @cont.bind 'geo_input:place_changed', (e) =>
41
+ @setPlace(e.place)
70
42
 
71
- $('#'+ dom_input).live "keypress", (e) ->
43
+ @geo_ac_el.keypress (e) ->
72
44
  e.preventDefault() if e.keyCode == 13
73
45
 
74
46
  setPlace: (place) =>
75
47
  return unless place.geometry
76
- pos = place.geometry.location
48
+ point = place.geometry.location
77
49
  if place.geometry.viewport
78
50
  @map.fitBounds(place.geometry.viewport)
79
51
  else
80
- @map.setCenter(pos)
52
+ @map.setCenter(point)
81
53
  @map.setZoom(17)
82
54
 
83
- @marker.setPosition(pos)
84
- @setInputs(pos)
55
+ @marker.setPosition(point)
56
+ @setInputs(point)
57
+
58
+ setInputs: (point) ->
59
+ @lat_el.val(point.lat())
60
+ @lon_el.val(point.lng())
61
+ @zoom_el.val(@map.getZoom())
62
+
63
+ initMap: ->
64
+ map_defaults =
65
+ zoom: @zoom,
66
+ center: @point,
67
+ mapTypeId: google.maps.MapTypeId.ROADMAP
68
+ scrollwheel: false
85
69
 
70
+ @options.map_options ||= {}
71
+ _.defaults(@options.map_options, map_defaults)
72
+ @map = new google.maps.Map(@map_el[0], @options.map_options)
86
73
 
87
- typesByPrefix: ->
88
- if _.include(['region', 'district', 'sub_district'], @options.prefix)
89
- ['(regions)']
90
- else if _.include(['location'], @options.prefix)
91
- ['(cities)']
92
- else
93
- ['geocode']
74
+ google.maps.event.addListener @map, 'zoom_changed', =>
75
+ @cont.trigger
76
+ type: 'geo_input:zoom_changed'
77
+ zoom: @map.getZoom()
78
+
79
+ initMarker: ->
80
+ marker_defaults =
81
+ position: @point,
82
+ map: @map,
83
+ draggable: true
84
+
85
+ @options.marker_options ||= {}
86
+ _.defaults(@options.marker_options, marker_defaults)
94
87
 
95
- initAutocompleteCustom: (dom_input='geo_autocomplete') ->
96
- input = document.getElementById(dom_input)
97
- opts =
88
+ @marker = new google.maps.Marker(@options.marker_options)
89
+ @infowindow = new google.maps.InfoWindow()
90
+
91
+ google.maps.event.addListener @marker, 'dragend', (e) =>
92
+ @cont.trigger
93
+ type: 'geo_input:dragend'
94
+ point: e.latLng
95
+
96
+ initAutocomplete: ->
97
+ geo_ac_defaults =
98
+ language: I18n.locale
98
99
  types: ['geocode']
99
- # componentRestrictions: {country: 'ru'}
100
- autocomplete = new google.maps.places.Autocomplete(input, opts)
100
+
101
+ @options.geo_ac_options ||= {}
102
+ _.defaults(@options.geo_ac_options, geo_ac_defaults)
103
+ autocomplete = new google.maps.places.Autocomplete(@geo_ac_el[0], @options.geo_ac_options)
101
104
  autocomplete.bindTo('bounds', @map)
102
105
  google.maps.event.addListener autocomplete, 'place_changed', =>
103
- place = autocomplete.getPlace()
104
- @callback.call(this, place) if @callback
105
- return unless place.geometry
106
- pos = place.geometry.location
107
- if place.geometry.viewport
108
- @map.fitBounds(place.geometry.viewport)
109
- else
110
- @map.setCenter(pos)
111
- @map.setZoom(17)
112
-
113
- @marker.setPosition(pos)
114
- @setInputs(pos)
115
-
116
- $('#'+ dom_input).live "keypress", (e) ->
117
- e.preventDefault() if e.keyCode == 13
106
+ @cont.trigger
107
+ type: 'geo_input:place_changed'
108
+ place: autocomplete.getPlace()
109
+
110
+ $.fn.geoInput = (options) ->
111
+ $el = $(this)
112
+ $el.data('geoInput') or $el.data('geoInput', new GeoInput($el, options))
113
+
118
114
 
119
115
  window.codeLatLng = (lat, lng, callback = null) ->
120
116
  window.geocoder ||= new google.maps.Geocoder()
@@ -145,3 +141,36 @@ window.getPlaceComponent = (place, component) ->
145
141
  res[0]
146
142
 
147
143
 
144
+
145
+ # typesByPrefix: ->
146
+ # if _.include(['region', 'district', 'sub_district'], @options.prefix)
147
+ # ['(regions)']
148
+ # else if _.include(['location'], @options.prefix)
149
+ # ['(cities)']
150
+ # else
151
+ # ['geocode']
152
+
153
+ # initAutocompleteCustom: (dom_input='geo_autocomplete') ->
154
+ # input = document.getElementById(dom_input)
155
+ # opts =
156
+ # types: ['geocode']
157
+ ## componentRestrictions: {country: 'ru'}
158
+ # autocomplete = new google.maps.places.Autocomplete(input, opts)
159
+ # autocomplete.bindTo('bounds', @map)
160
+ # google.maps.event.addListener autocomplete, 'place_changed', =>
161
+ # place = autocomplete.getPlace()
162
+ # @callback.call(this, place) if @callback
163
+ # return unless place.geometry
164
+ # pos = place.geometry.location
165
+ # if place.geometry.viewport
166
+ # @map.fitBounds(place.geometry.viewport)
167
+ # else
168
+ # @map.setCenter(pos)
169
+ # @map.setZoom(17)
170
+ #
171
+ # @marker.setPosition(pos)
172
+ # @setInputs(pos)
173
+ #
174
+ # $('#'+ dom_input).live "keypress", (e) ->
175
+ # e.preventDefault() if e.keyCode == 13
176
+
@@ -39,9 +39,10 @@ $.fn.ck_val = (v = null) ->
39
39
  else
40
40
  $el.val()
41
41
 
42
- class GoogleLocaleTabs
42
+ class window.GoogleLocaleTabs
43
+ @locales = ['ru', 'en', 'it']
43
44
  constructor: ->
44
- @locales = ['ru', 'en', 'it']
45
+ @locales = GoogleLocaleTabs.locales
45
46
  @limit = 1000
46
47
  html = '<div class="t_locales">'
47
48
  for l in @locales
@@ -18,7 +18,7 @@ $ ->
18
18
  $form.append("<input type='checkbox' name='ids[]' checked='1' value='#{id}'/>") for id in ids
19
19
  $form.submit()
20
20
 
21
- $('#list tbody tr').live 'click', (e) ->
21
+ $(document).on 'click', '#list tbody tr', (e) ->
22
22
  return true unless _.include(['TR', 'TD'], e.target.tagName)
23
23
  e.preventDefault()
24
24
  e.stopPropagation()
@@ -26,9 +26,6 @@ $ ->
26
26
  $el.closest('tr').toggleClass('active_row')
27
27
  $el.find('td:first input').attr 'checked', (i, v) -> !v
28
28
 
29
- $('.batch_action_link').live
30
- click: (e) ->
31
- e.preventDefault()
32
- submitBatch(this)
33
- 'confirm:success': ->
34
- submitBatch(this)
29
+ $(document).on 'click confirm:success', '.batch_action_link', (e) ->
30
+ e.preventDefault()
31
+ submitBatch(this)
@@ -26,27 +26,25 @@ $ ->
26
26
  e.preventDefault()
27
27
  $(this).closest('tr').remove()
28
28
 
29
-
30
- $(document).on 'admin:init', (e) ->
31
- return unless window.viewType == 'form'
32
- window.resource_id = $('form.simple_form').data('id')
33
- $(document).trigger('admin:form_init')
34
-
35
-
36
29
  $(document).on 'admin:form_init', 'form', (e) ->
37
30
  focusInput($(this))
38
31
  initEditor()
39
32
  initFancySelect()
40
33
  inputSetToggle()
41
34
 
35
+ $(document).on 'admin:init', (e) ->
36
+ return unless window.viewType == 'form'
37
+ $form = $('form.simple_form')
38
+ window.resource_id = $form.data('id')
39
+ $form.trigger('admin:form_init')
40
+
42
41
  $(document).on 'pjax:end', ->
43
42
  $(document).trigger({type: 'admin:init', pjax: true})
44
43
  $(document).trigger({type: 'admin:init'})
45
44
 
46
45
  $(document).on 'dblclick', '#list tbody tr', (e) ->
47
46
  e.preventDefault()
48
- $el = $(this)
49
- $el.find('td a.resource_id_link').click()
47
+ $(this).find('td a.resource_id_link').toHref()
50
48
 
51
49
 
52
50
  initFancySelect()
@@ -55,7 +53,7 @@ $ ->
55
53
  $('body').css('background-color', "##{window.gon.bg_color.replace(/^#/, '')}")
56
54
 
57
55
  if window.gon?.hotkeys
58
- $(document).bind 'keydown.alt_n', -> $('a.new_resource:first').click()
56
+ $(document).bind 'keydown.alt_n', -> $('a.new_resource:first').toHref()
59
57
  $(document).bind 'keydown.alt_left', -> $('a[rel^="prev"]:first').click()
60
58
  $(document).bind 'keydown.alt_right', -> $('a[rel="next"]:first').click()
61
59
  $(document).bind 'keydown.alt_s', -> $('#search_form').submit()
@@ -1,13 +1,3 @@
1
- window.initGeoInput = (prefix, autocomplete = true) ->
2
- opts =
3
- prefix: prefix
4
- doom_map: "#{prefix}_map"
5
- callback: "#{prefix}_geo_callback"
6
- map_options:
7
- {scrollwheel: false}
8
- gmaps = new GeoInput("#{prefix}_lat", "#{prefix}_lon", "#{prefix}_zoom", opts)
9
- gmaps.initAutocomplete("#{prefix}_geo_autocomplete") if autocomplete
10
-
11
1
  window.clonePagination = ->
12
2
  $('.pagination:first').clone().appendTo($('.batch_actions'))
13
3
 
@@ -15,20 +5,6 @@ window.initPopover = ->
15
5
  $('.popover').hide()
16
6
  $('a[rel=popover]').popover({trigger: 'hover'})
17
7
 
18
- window.initFancySelect = ->
19
- return if gon.test
20
- options =
21
- formatNoMatches: -> I18n.t('admin_js.no_results')
22
- placeholder: ' '
23
- width: 'resolve'
24
- $('form .fancy_select, .without_form.fancy_select, form .fancy_select_multi').select2(options)
25
- # chosen_options =
26
- # allow_single_deselect: true
27
- # no_results_text: I18n.t('admin_js.no_results')
28
- # placeholder_text_single: ' '
29
- # placeholder_text_multiple: ' '
30
- # $('form .do_chosen, .without_form.do_chosen, form .do_chosen_multi').chosen(chosen_options)
31
-
32
8
  window.initAcFileds = ->
33
9
  for el in $('.ac_field')
34
10
  $el = $(el)
@@ -68,3 +44,56 @@ window.flash = (type, message) ->
68
44
 
69
45
  window.focusInput = (scope=null) ->
70
46
  $('input[type="text"],input[type="string"],select:visible,textarea:visible', scope || $('form.simple_form:first')).get(0)?.focus()
47
+
48
+ window.initFancySelect = ->
49
+ return if gon.test
50
+ defaults =
51
+ formatNoMatches: ->
52
+ I18n.t('admin_js.no_results')
53
+ placeholder: ' '
54
+ allowClear: true
55
+
56
+ $('form .fancy_select, form input.token, .without_form.fancy_select').each ->
57
+ $el = $(this)
58
+ return if $el.data('select2')
59
+ options = _.defaults({multiple: $el.data('multi')}, defaults)
60
+ options.width = $el[0].style.width || 'resolve'
61
+ if $el.data('class')
62
+ options.initSelection = (el, callback) ->
63
+ data = $el.data('pre')
64
+ if $el.data('multi')
65
+ data = $el.data('pre')
66
+ else
67
+ data = $el.data('pre')[0]
68
+ callback(data)
69
+ options.ajax =
70
+ url: "/admin/autocomplete",
71
+ data: (term, page) ->
72
+ cond = {}
73
+ if $el.data('c')
74
+ for kind in ['with', 'without']
75
+ if $el.data('c')[kind]
76
+ cond[kind] ||= {}
77
+ for attr, id of $el.data('c')[kind]
78
+ cond[kind][attr] = $('#' + id).val()
79
+
80
+ for kind in ['with_term', 'without_term']
81
+ if $el.data('c')[kind]
82
+ cond[kind] ||= {}
83
+ for attr, value of $el.data('c')[kind]
84
+ cond[kind][attr] = value
85
+
86
+ data = {q: term, class: $el.data('class'), token: true}
87
+ _.extend(data, cond)
88
+
89
+ results: (data, page) ->
90
+ results: data
91
+
92
+ $el.select2(options)
93
+
94
+ # $('#district_location_id').select2("data", {id: 123, text: '123'})
95
+ # $el.change (data) ->
96
+ # log data.val
97
+ # createSearchChoice: (term) ->
98
+ # log term
99
+ # {id: 3, text: '123'}