cck_forms 3.0.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 (32) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +1 -0
  3. data/README.md +1 -0
  4. data/Rakefile +40 -0
  5. data/lib/cck_forms/date_time.rb +58 -0
  6. data/lib/cck_forms/engine.rb +23 -0
  7. data/lib/cck_forms/form_builder_extensions.rb +18 -0
  8. data/lib/cck_forms/parameter_type_class/album.rb +100 -0
  9. data/lib/cck_forms/parameter_type_class/base.rb +275 -0
  10. data/lib/cck_forms/parameter_type_class/boolean.rb +24 -0
  11. data/lib/cck_forms/parameter_type_class/checkboxes.rb +202 -0
  12. data/lib/cck_forms/parameter_type_class/date.rb +35 -0
  13. data/lib/cck_forms/parameter_type_class/date_range.rb +53 -0
  14. data/lib/cck_forms/parameter_type_class/date_time.rb +76 -0
  15. data/lib/cck_forms/parameter_type_class/enum.rb +53 -0
  16. data/lib/cck_forms/parameter_type_class/file.rb +80 -0
  17. data/lib/cck_forms/parameter_type_class/float.rb +20 -0
  18. data/lib/cck_forms/parameter_type_class/image.rb +20 -0
  19. data/lib/cck_forms/parameter_type_class/integer.rb +77 -0
  20. data/lib/cck_forms/parameter_type_class/integer_range.rb +150 -0
  21. data/lib/cck_forms/parameter_type_class/map.rb +259 -0
  22. data/lib/cck_forms/parameter_type_class/phones.rb +204 -0
  23. data/lib/cck_forms/parameter_type_class/string.rb +13 -0
  24. data/lib/cck_forms/parameter_type_class/string_collection.rb +23 -0
  25. data/lib/cck_forms/parameter_type_class/text.rb +18 -0
  26. data/lib/cck_forms/parameter_type_class/time.rb +30 -0
  27. data/lib/cck_forms/parameter_type_class/work_hours.rb +369 -0
  28. data/lib/cck_forms/version.rb +3 -0
  29. data/lib/cck_forms.rb +4 -0
  30. data/vendor/assets/javascripts/cck_forms/jquery.workhours.js +399 -0
  31. data/vendor/assets/javascripts/cck_forms/map.js.coffee +322 -0
  32. metadata +116 -0
@@ -0,0 +1,322 @@
1
+ class window.CckFormsMap
2
+ @addMap: (map) ->
3
+ @allMapsList ||= []
4
+ @allMapsList.push map
5
+ @allMaps: ->
6
+ @allMapsList || []
7
+ @switchMapTo: (mapType)->
8
+ @map: (type, element, initialPoint, fields, options = {})->
9
+ options['groupId'] = element.data('id')
10
+
11
+ switch type
12
+ when "yandex" then new CckFormsMap.YandexMap(element, initialPoint, fields, options)
13
+ when "google" then new CckFormsMap.GoogleMap(element, initialPoint, fields, options)
14
+ else
15
+ throw "Invalid map type: #{type}"
16
+
17
+ class CckFormsMap.AbstractMap
18
+ type: ->
19
+ constructor: (htmlElement, @initialCoordinate, @fields, options = {})->
20
+ @htmlElement = $(htmlElement)
21
+ @readOnlyMap = options.readOnly
22
+ @groupId = options.groupId
23
+
24
+ CckFormsMap.addMap @
25
+ @._render()
26
+ movePointTo: (somewhere)->
27
+ hide: ->
28
+ @htmlElement.hide()
29
+ show: ->
30
+ @htmlElement.show()
31
+ CckFormsMap.currentMap = @
32
+
33
+ setCenter: (latitudeAndLongitude)->
34
+ setZoom: (zoom)->
35
+ @internalMapAPI.setZoom zoom
36
+ setMarkerToPoint: (latitudeAndLongitude) ->
37
+
38
+ setCenterByGeocode: (geocode) ->
39
+
40
+ options = {
41
+ url: 'https://geocode-maps.yandex.ru/1.x/'
42
+ dataType: 'json'
43
+ data: {format: 'json', geocode: geocode, results: 1}
44
+ }
45
+
46
+ xhr = $.ajax options
47
+ xhr.done (data) =>
48
+ if data.response.GeoObjectCollection.featureMember[0]
49
+ point = data.response.GeoObjectCollection.featureMember[0].GeoObject.Point.pos.split ' '
50
+ latlon = {latitude: point[1], longitude: point[0]}
51
+
52
+ @fields.latitude.val point[1]
53
+ @fields.longitude.val point[0]
54
+
55
+ @.setMarkerToPoint latlon
56
+ @.setCenter latlon
57
+ @.setZoom 17 # подобран экспериментально
58
+
59
+ xhr.fail ->
60
+ alert "Произошла ошибка на сервере"
61
+
62
+
63
+ refresh: ->
64
+
65
+ _render: ->
66
+
67
+ _anotherMaps: ->
68
+ maps = []
69
+ _self = @
70
+ $.each CckFormsMap.allMaps(), ->
71
+ if @ != _self && @.groupId == _self.groupId
72
+ maps.push @
73
+ maps
74
+
75
+ class CckFormsMap.YandexMap extends CckFormsMap.AbstractMap
76
+ type: -> "yandex"
77
+ _render: ->
78
+ ymaps.ready =>
79
+ coords = [@initialCoordinate.longitude, @initialCoordinate.latitude]
80
+ @internalMapAPI = new ymaps.Map(@htmlElement[0],
81
+ center: coords
82
+ zoom: @initialCoordinate.zoom
83
+ type: "yandex#map"
84
+ , {})
85
+ @internalMapAPI.controls.add "zoomControl"
86
+ @yandexMapPlacemark = new ymaps.Placemark(coords,
87
+ iconContent: ""
88
+ ,
89
+ preset: "twirl#blueStretchyIcon"
90
+ )
91
+ @internalMapAPI.geoObjects.add @yandexMapPlacemark
92
+
93
+ @internalMapAPI.events.add "click", (e) =>
94
+ return if @readOnlyMap
95
+ coords = e.get("coordPosition")
96
+ @fields.latitude.val coords[1]
97
+ @fields.longitude.val coords[0]
98
+ @fields.zoom.val @internalMapAPI.getZoom()
99
+ @yandexMapPlacemark.geometry.setCoordinates coords
100
+
101
+ $.each @._anotherMaps(), ->
102
+ @.setMarkerToPoint latitude: coords[1], longitude: coords[0]
103
+
104
+ @internalMapAPI.events.add "boundschange", (e) =>
105
+ newZoom = e.get("newZoom")
106
+ zoomChanged = e.get("oldZoom") != newZoom
107
+
108
+ newCenter = e.get("newCenter")
109
+ centerChanged = e.get("oldCenter") != newCenter
110
+
111
+ zoom = @internalMapAPI.getZoom()
112
+ @fields.zoom.val zoom
113
+
114
+ $.each @._anotherMaps(), ->
115
+ @.setZoom zoom if zoomChanged
116
+ @.setCenter {latitude: newCenter[1], longitude: newCenter[0]} if centerChanged and not @ignoreCenterChange
117
+
118
+ setMarkerToPoint: (latitudeAndLongitude) ->
119
+ @yandexMapPlacemark?.geometry.setCoordinates [latitudeAndLongitude.longitude, latitudeAndLongitude.latitude]
120
+ setCenter: (latitudeAndLongitude)->
121
+ @ignoreCenterChange = true
122
+
123
+ if @internalMapAPI
124
+ @internalMapAPI.setCenter [latitudeAndLongitude.longitude, latitudeAndLongitude.latitude]
125
+ else
126
+ ymaps.ready => @internalMapAPI.setCenter [latitudeAndLongitude.longitude, latitudeAndLongitude.latitude]
127
+
128
+ @ignoreCenterChange = false
129
+
130
+ setZoom: (zoom)->
131
+ if @internalMapAPI
132
+ @internalMapAPI.setZoom zoom
133
+ else
134
+ ymaps.ready => @internalMapAPI.setZoom zoom
135
+
136
+ refresh: ->
137
+ if @internalMapAPI
138
+ @internalMapAPI.container.fitToViewport()
139
+ else
140
+ ymaps.ready => @internalMapAPI.container.fitToViewport()
141
+
142
+
143
+ class CckFormsMap.GoogleMap extends CckFormsMap.AbstractMap
144
+ type: -> "google"
145
+ _render: ->
146
+ latlng = new google.maps.LatLng(@initialCoordinate.latitude, @initialCoordinate.longitude)
147
+ googleMapOptions =
148
+ zoom: @initialCoordinate.zoom
149
+ center: latlng
150
+ mapTypeId: google.maps.MapTypeId.ROADMAP
151
+ scrollwheel: false
152
+ streetViewControl: false
153
+
154
+ @internalMapAPI = new google.maps.Map(@htmlElement[0], googleMapOptions)
155
+
156
+ @googleMapMarker = null
157
+ createOrMoveMarker = (latLng)=>
158
+ @fields.latitude.val latLng.lat()
159
+ @fields.longitude.val latLng.lng()
160
+ if @googleMapMarker
161
+ @googleMapMarker.setPosition latLng
162
+ else
163
+ @._createMarker(latLng)
164
+ googleMapPosition = @googleMapMarker.position
165
+ $.each @._anotherMaps(), ->
166
+ @.setMarkerToPoint latitude: googleMapPosition.lat(), longitude: googleMapPosition.lng()
167
+
168
+ createOrMoveMarker latlng if @fields.latitude.val() or @fields.longitude.val()
169
+ @fields.zoom.val @internalMapAPI.getZoom() if not @fields.zoom.val() or @fields.zoom.val() is 0
170
+ google.maps.event.addListener @internalMapAPI, "click", (event) =>
171
+ return if @readOnlyMap
172
+ createOrMoveMarker event.latLng
173
+
174
+ google.maps.event.addListener @internalMapAPI, "zoom_changed", =>
175
+ zoom = @internalMapAPI.getZoom()
176
+ @fields.zoom.val zoom
177
+ $.each @._anotherMaps(), ->
178
+ @.setZoom zoom
179
+ google.maps.event.addListener @internalMapAPI, "center_changed", =>
180
+ return if @ignoreCenterChange
181
+ center = @internalMapAPI.getCenter()
182
+ $.each @._anotherMaps(), ->
183
+ @.setCenter latitude: center.lat(), longitude: center.lng()
184
+
185
+ _createMarker: (latLng)->
186
+ @googleMapMarker = new google.maps.Marker(
187
+ position: latLng
188
+ map: @internalMapAPI
189
+ )
190
+
191
+ #title: ''
192
+ google.maps.event.addListener @googleMapMarker, "click", =>
193
+ @googleMapMarker.setMap null
194
+ @googleMapMarker = null
195
+ @fields.latitude.val ""
196
+ @fields.longitude.val ""
197
+
198
+ setMarkerToPoint: (latitudeAndLongitude) ->
199
+ @._createMarker(null) unless @googleMapMarker
200
+ @googleMapMarker.setPosition new google.maps.LatLng(latitudeAndLongitude.latitude, latitudeAndLongitude.longitude)
201
+
202
+
203
+ setCenter: (latitudeAndLongitude)->
204
+ @ignoreCenterChange = true
205
+ @internalMapAPI.setCenter(new google.maps.LatLng(latitudeAndLongitude.latitude, latitudeAndLongitude.longitude))
206
+ @ignoreCenterChange = false
207
+ show: ->
208
+ super()
209
+ @.refresh()
210
+
211
+ refresh: ->
212
+ center = @internalMapAPI.getCenter() # для того, чтобы центр карты не занимался ерундой
213
+ google.maps.event.trigger(@internalMapAPI, "resize")
214
+ @internalMapAPI.setCenter(center)
215
+
216
+
217
+ switch_map = ($canvas, mapType) ->
218
+ $.each $canvas.data('maps'), (i, map) ->
219
+ map.show()
220
+ if map.type() == mapType
221
+ map.show()
222
+ $canvas.find('#' + map.groupId + '_type').val mapType
223
+ else
224
+ map.hide()
225
+
226
+
227
+ window.init_map = (canvas) ->
228
+
229
+ $canvas = $(canvas)
230
+ $source = $canvas.find('[data-map-data-source]')
231
+ options = $source.data("options")
232
+ mapId = $source.data("id")
233
+
234
+ $lat = $("#" + mapId + "_latitude")
235
+ $lon = $("#" + mapId + "_longitude")
236
+ $zoom = $("#" + mapId + "_zoom")
237
+
238
+ fields = zoom: $zoom, latitude: $lat, longitude: $lon
239
+
240
+ latLng = new google.maps.LatLng(options.latitude, options.longitude)
241
+ zoom = options.zoom
242
+
243
+
244
+ if $lat.val() and $lon.val()
245
+ latLng = new google.maps.LatLng($lat.val(), $lon.val())
246
+ hasLatLng = true
247
+
248
+ if ($zoom.val()) > 0
249
+ zoom = $zoom.val() * 1
250
+ hasZoom = true
251
+
252
+
253
+ initialPoint = latitude: latLng.lat(), longitude: latLng.lng(), zoom: zoom
254
+ readOnly = !!$(@).data("readOnly")
255
+
256
+ maps = {}
257
+ $.each $source.data("allowedMaps"), (i, mapType) ->
258
+ $map = $('#' + mapId + '_' + mapType)
259
+ maps[mapType] = new CckFormsMap.map(mapType, $map, initialPoint, fields, readOnly: readOnly)
260
+
261
+ $canvas.data('maps', maps)
262
+
263
+
264
+ cityInputSelectorst = [
265
+ '#' + $source.data("cityid"),
266
+ '[data-behavior="map_city_change"]'
267
+ ].join(', ')
268
+ $cityInput = $(cityInputSelectorst)
269
+
270
+ if $cityInput.data('mapCityValue')
271
+ mapCityValue = $cityInput.data('mapCityValue')
272
+ $cityInput = $cityInput.find(mapCityValue)
273
+
274
+ handleCityChange = =>
275
+ cities = $source.data("cities")
276
+ city = cities[$cityInput.val()]
277
+
278
+ if city
279
+ latLng = new google.maps.LatLng(city.lat, city.lon) unless hasLatLng
280
+ zoom = city.zoom unless hasZoom
281
+
282
+ $.each $canvas.data('maps'), (i, map) ->
283
+ map.setCenter latitude: latLng.lat(), longitude: latLng.lng()
284
+ map.setZoom zoom
285
+
286
+ $cityInput.change handleCityChange
287
+ handleCityChange() unless $lat.val() or $lon.val()
288
+
289
+ activeMapType = $canvas
290
+ .find('.cck-map-switchers a.active')
291
+ .data("mapType")
292
+
293
+ switch_map($canvas, activeMapType)
294
+
295
+
296
+ $ ->
297
+ start = ->
298
+ try
299
+
300
+ $(document).on "click", ".cck-map-switchers a", (e) ->
301
+ e.preventDefault()
302
+
303
+ $(@).addClass("active")
304
+ .siblings()
305
+ .removeClass "active"
306
+
307
+ mapType = $(@).data("mapType")
308
+ $canvas = $(@).closest('.map-canvas')
309
+
310
+ switch_map $canvas, mapType
311
+
312
+ $.each $('.map-canvas'), (index, canvas) ->
313
+ init_map canvas
314
+
315
+
316
+ catch error
317
+ window.console?.error error
318
+
319
+ if window.mapsReady
320
+ window.mapsReady.on start
321
+ else
322
+ start()
metadata ADDED
@@ -0,0 +1,116 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: cck_forms
3
+ version: !ruby/object:Gem::Version
4
+ version: 3.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Ilya Konanykhin
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2016-11-28 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rails
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '4.0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '4.0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: mongoid
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '5.0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '5.0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: neofiles
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '1.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '1.0'
55
+ description: Custom field types for Mongoid objects
56
+ email:
57
+ - ilya.konanykhin@gmail.com
58
+ executables: []
59
+ extensions: []
60
+ extra_rdoc_files: []
61
+ files:
62
+ - LICENSE
63
+ - README.md
64
+ - Rakefile
65
+ - lib/cck_forms.rb
66
+ - lib/cck_forms/date_time.rb
67
+ - lib/cck_forms/engine.rb
68
+ - lib/cck_forms/form_builder_extensions.rb
69
+ - lib/cck_forms/parameter_type_class/album.rb
70
+ - lib/cck_forms/parameter_type_class/base.rb
71
+ - lib/cck_forms/parameter_type_class/boolean.rb
72
+ - lib/cck_forms/parameter_type_class/checkboxes.rb
73
+ - lib/cck_forms/parameter_type_class/date.rb
74
+ - lib/cck_forms/parameter_type_class/date_range.rb
75
+ - lib/cck_forms/parameter_type_class/date_time.rb
76
+ - lib/cck_forms/parameter_type_class/enum.rb
77
+ - lib/cck_forms/parameter_type_class/file.rb
78
+ - lib/cck_forms/parameter_type_class/float.rb
79
+ - lib/cck_forms/parameter_type_class/image.rb
80
+ - lib/cck_forms/parameter_type_class/integer.rb
81
+ - lib/cck_forms/parameter_type_class/integer_range.rb
82
+ - lib/cck_forms/parameter_type_class/map.rb
83
+ - lib/cck_forms/parameter_type_class/phones.rb
84
+ - lib/cck_forms/parameter_type_class/string.rb
85
+ - lib/cck_forms/parameter_type_class/string_collection.rb
86
+ - lib/cck_forms/parameter_type_class/text.rb
87
+ - lib/cck_forms/parameter_type_class/time.rb
88
+ - lib/cck_forms/parameter_type_class/work_hours.rb
89
+ - lib/cck_forms/version.rb
90
+ - vendor/assets/javascripts/cck_forms/jquery.workhours.js
91
+ - vendor/assets/javascripts/cck_forms/map.js.coffee
92
+ homepage: http://github.com/ilya-konanykhin/cck_forms
93
+ licenses:
94
+ - MIT
95
+ metadata: {}
96
+ post_install_message:
97
+ rdoc_options: []
98
+ require_paths:
99
+ - lib
100
+ required_ruby_version: !ruby/object:Gem::Requirement
101
+ requirements:
102
+ - - ">="
103
+ - !ruby/object:Gem::Version
104
+ version: '0'
105
+ required_rubygems_version: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - ">="
108
+ - !ruby/object:Gem::Version
109
+ version: '0'
110
+ requirements: []
111
+ rubyforge_project:
112
+ rubygems_version: 2.5.1
113
+ signing_key:
114
+ specification_version: 4
115
+ summary: Content Construction Kit Forms
116
+ test_files: []