ab_admin 0.1.2 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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'}