pageflow-linkmap-page 1.5.0 → 2.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +31 -6
  3. data/Gemfile +0 -7
  4. data/README.md +0 -5
  5. data/app/assets/javascript/pageflow/linkmap_page/editor/collections/areas_collection.js +8 -1
  6. data/app/assets/javascript/pageflow/linkmap_page/editor/config.js +23 -1
  7. data/app/assets/javascript/pageflow/linkmap_page/editor/controllers/side_bar_controller.js +24 -5
  8. data/app/assets/javascript/pageflow/linkmap_page/editor/models/area.js +4 -1
  9. data/app/assets/javascript/pageflow/linkmap_page/editor/models/color_map_delegator.js +16 -0
  10. data/app/assets/javascript/pageflow/linkmap_page/editor/models/color_map_file.js +6 -0
  11. data/app/assets/javascript/pageflow/linkmap_page/editor/models/masked_image_file.js +7 -0
  12. data/app/assets/javascript/pageflow/linkmap_page/editor/models/page_configuration_mixin.js +49 -55
  13. data/app/assets/javascript/pageflow/linkmap_page/editor/models/processed_file.js +12 -0
  14. data/app/assets/javascript/pageflow/linkmap_page/editor/patterns/area_pattern.js +42 -0
  15. data/app/assets/javascript/pageflow/linkmap_page/editor/routers/side_bar_router.js +3 -1
  16. data/app/assets/javascript/pageflow/linkmap_page/editor/templates/embedded/area_item.jst.ejs +2 -2
  17. data/app/assets/javascript/pageflow/linkmap_page/editor/templates/embedded/area_masks_preview.jst.ejs +4 -2
  18. data/app/assets/javascript/pageflow/linkmap_page/editor/templates/embedded/area_outlines.jst.ejs +3 -2
  19. data/app/assets/javascript/pageflow/linkmap_page/editor/templates/embedded/mobile_info_box_page_item.jst.ejs +2 -0
  20. data/app/assets/javascript/pageflow/linkmap_page/editor/views/areas_list_view.js +1 -0
  21. data/app/assets/javascript/pageflow/linkmap_page/editor/views/configuration_editor_view.js +46 -0
  22. data/app/assets/javascript/pageflow/linkmap_page/editor/views/edit_area_view.js +3 -6
  23. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/area_item_embedded_view.js +75 -10
  24. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/area_masks_preview_embedded_view.js +71 -77
  25. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/area_outlines_embedded_view.js +44 -82
  26. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/areas_embedded_view.js +12 -13
  27. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/mobile_info_box_embedded_view.js +61 -0
  28. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/mobile_info_box_page_item_embedded_view.js +28 -0
  29. data/app/assets/javascript/pageflow/linkmap_page/editor.js +10 -2
  30. data/app/assets/javascript/pageflow/linkmap_page/page_type.js +155 -20
  31. data/app/assets/javascript/pageflow/linkmap_page/widgets/hover_video.js +4 -1
  32. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/area_contains.js +7 -6
  33. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/area_set_mask.js +16 -0
  34. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/color_map.js +83 -142
  35. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/image_data.js +17 -47
  36. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/mask.js +3 -34
  37. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/remote_image.js +3 -6
  38. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap.js +78 -92
  39. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_area_indicators.js +75 -0
  40. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_paginator.js +292 -0
  41. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_pan_zoom.js +241 -0
  42. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_panorama.js +81 -59
  43. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_scroll_indicators.js +14 -0
  44. data/app/assets/stylesheets/pageflow/linkmap_page/editor/area_outlines.scss +6 -0
  45. data/app/assets/stylesheets/pageflow/linkmap_page/editor/masks_preview.scss +10 -0
  46. data/app/assets/stylesheets/pageflow/linkmap_page/themes/default/mobile_info_box.scss +31 -0
  47. data/app/assets/stylesheets/pageflow/linkmap_page/themes/default/paginator.scss +53 -0
  48. data/app/assets/stylesheets/pageflow/linkmap_page/themes/default/scroll_indicators.scss +5 -1
  49. data/app/assets/stylesheets/pageflow/linkmap_page/themes/default.scss +3 -0
  50. data/app/assets/stylesheets/pageflow/linkmap_page.scss +29 -3
  51. data/app/helpers/pageflow/linkmap_page/areas_helper.rb +37 -11
  52. data/app/jobs/pageflow/linkmap_page/process_source_image_file_job.rb +4 -4
  53. data/app/views/pageflow/linkmap_page/areas/_div.html.erb +13 -7
  54. data/app/views/pageflow/linkmap_page/color_map_files/_color_map_file.json.jbuilder +18 -0
  55. data/app/views/pageflow/linkmap_page/editor/color_map_files/_color_map_file.json.jbuilder +1 -0
  56. data/app/views/pageflow/linkmap_page/editor/masked_image_files/_masked_image_file.json.jbuilder +1 -0
  57. data/app/views/pageflow/linkmap_page/page.html.erb +76 -39
  58. data/config/locales/de.yml +47 -4
  59. data/config/locales/en.yml +43 -4
  60. data/db/migrate/20170330201200_create_mask_sprites.rb +1 -1
  61. data/db/migrate/20171106151700_create_masked_image_files.rb +1 -1
  62. data/db/migrate/20180111145100_create_color_map_files.rb +1 -1
  63. data/db/migrate/20180214201200_drop_mask_sprites.rb +7 -0
  64. data/lib/pageflow/linkmap_page/engine.rb +4 -0
  65. data/lib/pageflow/linkmap_page/page_type.rb +26 -0
  66. data/lib/pageflow/linkmap_page/paperclip_processors/color_mask.rb +1 -1
  67. data/lib/pageflow/linkmap_page/paperclip_processors/colors.rb +1 -1
  68. data/lib/pageflow/linkmap_page/version.rb +1 -1
  69. data/lib/tasks/pageflow_linkmap_page_tasks.rake +8 -7
  70. data/pageflow-linkmap-page.gemspec +11 -5
  71. data/spec/factories/color_map_file.rb +16 -0
  72. data/spec/factories/image_file.rb +25 -0
  73. data/spec/factories/masked_image_file.rb +10 -0
  74. data/spec/helpers/pageflow/linkmap_page/areas_helper_spec.rb +76 -13
  75. data/spec/integration/masked_image_file_type_spec.rb +15 -0
  76. data/spec/models/pageflow/linkmap_page/color_map_file_spec.rb +113 -0
  77. data/spec/models/pageflow/linkmap_page/masked_image_file_spec.rb +87 -0
  78. data/spec/pageflow/linkmap_page/paperclip_processors/colors_spec.rb +46 -0
  79. data/spec/pageflow/linkmap_page/progress_spec.rb +91 -0
  80. data/spec/spec_helper.rb +5 -1
  81. data/spec/support/config/devise.rb +1 -8
  82. data/spec/support/config/{factory_girl.rb → factory_bot.rb} +5 -3
  83. data/spec/support/config/resque.rb +9 -0
  84. data/spec/support/fixtures/black_dots.png +0 -0
  85. data/spec/support/fixtures/color_map.png +0 -0
  86. data/spec/support/fixtures/dots_and_lines.png +0 -0
  87. data/spec/support/fixtures/green_and_black.png +0 -0
  88. data/spec/support/fixtures/red.png +0 -0
  89. data/spec/support/fixtures/transparent.png +0 -0
  90. data/spec/support/matchers/have_color.rb +34 -0
  91. metadata +98 -41
  92. data/app/assets/javascript/pageflow/linkmap_page/editor/models/masks_delegator.js +0 -16
  93. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/area_redraw.js +0 -34
  94. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/mask_sprite.js +0 -68
  95. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/masks.js +0 -99
  96. data/app/controllers/pageflow/linkmap_page/mask_sprites_controller.rb +0 -26
  97. data/app/models/pageflow/linkmap_page/mask_sprite.rb +0 -15
  98. data/config/routes.rb +0 -5
  99. data/spec/controllers/pageflow/linkmap_page/mask_sprites_controller_spec.rb +0 -108
metadata CHANGED
@@ -1,69 +1,57 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: pageflow-linkmap-page
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.5.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Codevise Solutions Ltd.
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2019-01-23 00:00:00.000000000 Z
11
+ date: 2018-12-10 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: pageflow
15
15
  requirement: !ruby/object:Gem::Requirement
16
16
  requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0.10'
20
- - - "<"
17
+ - - "~>"
21
18
  - !ruby/object:Gem::Version
22
- version: '13'
19
+ version: 13.x
23
20
  type: :runtime
24
21
  prerelease: false
25
22
  version_requirements: !ruby/object:Gem::Requirement
26
23
  requirements:
27
- - - ">="
28
- - !ruby/object:Gem::Version
29
- version: '0.10'
30
- - - "<"
24
+ - - "~>"
31
25
  - !ruby/object:Gem::Version
32
- version: '13'
26
+ version: 13.x
33
27
  - !ruby/object:Gem::Dependency
34
28
  name: pageflow-external-links
35
29
  requirement: !ruby/object:Gem::Requirement
36
30
  requirements:
37
- - - ">="
38
- - !ruby/object:Gem::Version
39
- version: '0.3'
40
- - - "<"
31
+ - - "~>"
41
32
  - !ruby/object:Gem::Version
42
- version: '2'
33
+ version: 2.x
43
34
  type: :runtime
44
35
  prerelease: false
45
36
  version_requirements: !ruby/object:Gem::Requirement
46
37
  requirements:
47
- - - ">="
48
- - !ruby/object:Gem::Version
49
- version: '0.3'
50
- - - "<"
38
+ - - "~>"
51
39
  - !ruby/object:Gem::Version
52
- version: '2'
40
+ version: 2.x
53
41
  - !ruby/object:Gem::Dependency
54
42
  name: pageflow-support
55
43
  requirement: !ruby/object:Gem::Requirement
56
44
  requirements:
57
45
  - - "~>"
58
46
  - !ruby/object:Gem::Version
59
- version: '12.0'
47
+ version: 13.x
60
48
  type: :development
61
49
  prerelease: false
62
50
  version_requirements: !ruby/object:Gem::Requirement
63
51
  requirements:
64
52
  - - "~>"
65
53
  - !ruby/object:Gem::Version
66
- version: '12.0'
54
+ version: 13.x
67
55
  - !ruby/object:Gem::Dependency
68
56
  name: bundler
69
57
  requirement: !ruby/object:Gem::Requirement
@@ -98,28 +86,28 @@ dependencies:
98
86
  requirements:
99
87
  - - "~>"
100
88
  - !ruby/object:Gem::Version
101
- version: '3.0'
89
+ version: '3.7'
102
90
  type: :development
103
91
  prerelease: false
104
92
  version_requirements: !ruby/object:Gem::Requirement
105
93
  requirements:
106
94
  - - "~>"
107
95
  - !ruby/object:Gem::Version
108
- version: '3.0'
96
+ version: '3.7'
109
97
  - !ruby/object:Gem::Dependency
110
- name: factory_girl_rails
98
+ name: factory_bot_rails
111
99
  requirement: !ruby/object:Gem::Requirement
112
100
  requirements:
113
101
  - - "~>"
114
102
  - !ruby/object:Gem::Version
115
- version: '4.5'
103
+ version: '4.8'
116
104
  type: :development
117
105
  prerelease: false
118
106
  version_requirements: !ruby/object:Gem::Requirement
119
107
  requirements:
120
108
  - - "~>"
121
109
  - !ruby/object:Gem::Version
122
- version: '4.5'
110
+ version: '4.8'
123
111
  - !ruby/object:Gem::Dependency
124
112
  name: sqlite3
125
113
  requirement: !ruby/object:Gem::Requirement
@@ -148,6 +136,34 @@ dependencies:
148
136
  - - "~>"
149
137
  - !ruby/object:Gem::Version
150
138
  version: '2.13'
139
+ - !ruby/object:Gem::Dependency
140
+ name: chunky_png
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - "~>"
144
+ - !ruby/object:Gem::Version
145
+ version: '1.3'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - "~>"
151
+ - !ruby/object:Gem::Version
152
+ version: '1.3'
153
+ - !ruby/object:Gem::Dependency
154
+ name: unindent
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - "~>"
158
+ - !ruby/object:Gem::Version
159
+ version: '1.0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - "~>"
165
+ - !ruby/object:Gem::Version
166
+ version: '1.0'
151
167
  - !ruby/object:Gem::Dependency
152
168
  name: semmy
153
169
  requirement: !ruby/object:Gem::Requirement
@@ -191,18 +207,23 @@ files:
191
207
  - app/assets/javascript/pageflow/linkmap_page/editor/models/area.js
192
208
  - app/assets/javascript/pageflow/linkmap_page/editor/models/area_file_selection_handler.js
193
209
  - app/assets/javascript/pageflow/linkmap_page/editor/models/audio_file_area_type.js
210
+ - app/assets/javascript/pageflow/linkmap_page/editor/models/color_map_delegator.js
211
+ - app/assets/javascript/pageflow/linkmap_page/editor/models/color_map_file.js
194
212
  - app/assets/javascript/pageflow/linkmap_page/editor/models/external_link_area_type.js
195
- - app/assets/javascript/pageflow/linkmap_page/editor/models/masks_delegator.js
213
+ - app/assets/javascript/pageflow/linkmap_page/editor/models/masked_image_file.js
196
214
  - app/assets/javascript/pageflow/linkmap_page/editor/models/new_area_file_selection_handler.js
197
215
  - app/assets/javascript/pageflow/linkmap_page/editor/models/page_configuration_mixin.js
198
216
  - app/assets/javascript/pageflow/linkmap_page/editor/models/page_link_area_type.js
217
+ - app/assets/javascript/pageflow/linkmap_page/editor/models/processed_file.js
199
218
  - app/assets/javascript/pageflow/linkmap_page/editor/models/stored_mask_sprite.js
200
219
  - app/assets/javascript/pageflow/linkmap_page/editor/models/text_only_area_type.js
220
+ - app/assets/javascript/pageflow/linkmap_page/editor/patterns/area_pattern.js
201
221
  - app/assets/javascript/pageflow/linkmap_page/editor/routers/side_bar_router.js
202
222
  - app/assets/javascript/pageflow/linkmap_page/editor/templates/edit_area.jst.ejs
203
223
  - app/assets/javascript/pageflow/linkmap_page/editor/templates/embedded/area_item.jst.ejs
204
224
  - app/assets/javascript/pageflow/linkmap_page/editor/templates/embedded/area_masks_preview.jst.ejs
205
225
  - app/assets/javascript/pageflow/linkmap_page/editor/templates/embedded/area_outlines.jst.ejs
226
+ - app/assets/javascript/pageflow/linkmap_page/editor/templates/embedded/mobile_info_box_page_item.jst.ejs
206
227
  - app/assets/javascript/pageflow/linkmap_page/editor/templates/scaled_on_phone_hint.jst.ejs
207
228
  - app/assets/javascript/pageflow/linkmap_page/editor/templates/select_area_position_hint.jst.ejs
208
229
  - app/assets/javascript/pageflow/linkmap_page/editor/views/areas_list_view.js
@@ -213,6 +234,8 @@ files:
213
234
  - app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/area_masks_preview_embedded_view.js
214
235
  - app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/area_outlines_embedded_view.js
215
236
  - app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/areas_embedded_view.js
237
+ - app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/mobile_info_box_embedded_view.js
238
+ - app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/mobile_info_box_page_item_embedded_view.js
216
239
  - app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/panorama_embedded_view.js
217
240
  - app/assets/javascript/pageflow/linkmap_page/editor/views/inputs/area_mask_input_view.js
218
241
  - app/assets/javascript/pageflow/linkmap_page/editor/views/scaled_on_phone_hint_view.js
@@ -223,17 +246,18 @@ files:
223
246
  - app/assets/javascript/pageflow/linkmap_page/widgets/hover_video.js
224
247
  - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap.js
225
248
  - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/area_contains.js
226
- - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/area_redraw.js
249
+ - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/area_set_mask.js
227
250
  - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/color_map.js
228
251
  - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/image_data.js
229
252
  - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/mask.js
230
- - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/mask_sprite.js
231
- - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/masks.js
232
253
  - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/remote_image.js
254
+ - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_area_indicators.js
233
255
  - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_audio_player_controls.js
234
256
  - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_audio_players_controller.js
235
257
  - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_lookaround.js
236
258
  - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_lookaround_strategies/target_speed.js
259
+ - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_paginator.js
260
+ - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_pan_zoom.js
237
261
  - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_panorama.js
238
262
  - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_panorama/get_panorama_size.js
239
263
  - app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_scroll_indicators.js
@@ -250,25 +274,28 @@ files:
250
274
  - app/assets/stylesheets/pageflow/linkmap_page/editor/resizable.scss
251
275
  - app/assets/stylesheets/pageflow/linkmap_page/editor/select_area_position_hint.scss
252
276
  - app/assets/stylesheets/pageflow/linkmap_page/themes/default.scss
277
+ - app/assets/stylesheets/pageflow/linkmap_page/themes/default/mobile_info_box.scss
278
+ - app/assets/stylesheets/pageflow/linkmap_page/themes/default/paginator.scss
253
279
  - app/assets/stylesheets/pageflow/linkmap_page/themes/default/scroll_indicators.scss
254
- - app/controllers/pageflow/linkmap_page/mask_sprites_controller.rb
255
280
  - app/helpers/pageflow/linkmap_page/areas_helper.rb
256
281
  - app/jobs/pageflow/linkmap_page/process_source_image_file_job.rb
257
282
  - app/models/pageflow/linkmap_page/color_map_file.rb
258
- - app/models/pageflow/linkmap_page/mask_sprite.rb
259
283
  - app/models/pageflow/linkmap_page/masked_image_file.rb
260
284
  - app/models/pageflow/linkmap_page/processed_image_file.rb
261
285
  - app/views/pageflow/linkmap_page/areas/_div.html.erb
286
+ - app/views/pageflow/linkmap_page/color_map_files/_color_map_file.json.jbuilder
287
+ - app/views/pageflow/linkmap_page/editor/color_map_files/_color_map_file.json.jbuilder
288
+ - app/views/pageflow/linkmap_page/editor/masked_image_files/_masked_image_file.json.jbuilder
262
289
  - app/views/pageflow/linkmap_page/page.html.erb
263
290
  - bin/rspec
264
291
  - bin/spring
265
292
  - config/locales/de.yml
266
293
  - config/locales/en.yml
267
- - config/routes.rb
268
294
  - config/spring.rb
269
295
  - db/migrate/20170330201200_create_mask_sprites.rb
270
296
  - db/migrate/20171106151700_create_masked_image_files.rb
271
297
  - db/migrate/20180111145100_create_color_map_files.rb
298
+ - db/migrate/20180214201200_drop_mask_sprites.rb
272
299
  - lib/generators/pageflow_linkmap_page/install/install_generator.rb
273
300
  - lib/pageflow-linkmap-page.rb
274
301
  - lib/pageflow/linkmap_page/engine.rb
@@ -284,11 +311,26 @@ files:
284
311
  - lib/pageflow/linkmap_page/version.rb
285
312
  - lib/tasks/pageflow_linkmap_page_tasks.rake
286
313
  - pageflow-linkmap-page.gemspec
287
- - spec/controllers/pageflow/linkmap_page/mask_sprites_controller_spec.rb
314
+ - spec/factories/color_map_file.rb
315
+ - spec/factories/image_file.rb
316
+ - spec/factories/masked_image_file.rb
288
317
  - spec/helpers/pageflow/linkmap_page/areas_helper_spec.rb
318
+ - spec/integration/masked_image_file_type_spec.rb
319
+ - spec/models/pageflow/linkmap_page/color_map_file_spec.rb
320
+ - spec/models/pageflow/linkmap_page/masked_image_file_spec.rb
321
+ - spec/pageflow/linkmap_page/paperclip_processors/colors_spec.rb
322
+ - spec/pageflow/linkmap_page/progress_spec.rb
289
323
  - spec/spec_helper.rb
290
324
  - spec/support/config/devise.rb
291
- - spec/support/config/factory_girl.rb
325
+ - spec/support/config/factory_bot.rb
326
+ - spec/support/config/resque.rb
327
+ - spec/support/fixtures/black_dots.png
328
+ - spec/support/fixtures/color_map.png
329
+ - spec/support/fixtures/dots_and_lines.png
330
+ - spec/support/fixtures/green_and_black.png
331
+ - spec/support/fixtures/red.png
332
+ - spec/support/fixtures/transparent.png
333
+ - spec/support/matchers/have_color.rb
292
334
  homepage: https://github.com/codevise/pageflow-linkmap-page
293
335
  licenses:
294
336
  - MIT
@@ -309,13 +351,28 @@ required_rubygems_version: !ruby/object:Gem::Requirement
309
351
  version: '0'
310
352
  requirements: []
311
353
  rubyforge_project:
312
- rubygems_version: 2.7.8
354
+ rubygems_version: 2.7.5
313
355
  signing_key:
314
356
  specification_version: 4
315
357
  summary: Pageflow page type for a page that contains customizable link areas
316
358
  test_files:
317
- - spec/controllers/pageflow/linkmap_page/mask_sprites_controller_spec.rb
359
+ - spec/factories/color_map_file.rb
360
+ - spec/factories/image_file.rb
361
+ - spec/factories/masked_image_file.rb
318
362
  - spec/helpers/pageflow/linkmap_page/areas_helper_spec.rb
363
+ - spec/integration/masked_image_file_type_spec.rb
364
+ - spec/models/pageflow/linkmap_page/color_map_file_spec.rb
365
+ - spec/models/pageflow/linkmap_page/masked_image_file_spec.rb
366
+ - spec/pageflow/linkmap_page/paperclip_processors/colors_spec.rb
367
+ - spec/pageflow/linkmap_page/progress_spec.rb
319
368
  - spec/spec_helper.rb
320
369
  - spec/support/config/devise.rb
321
- - spec/support/config/factory_girl.rb
370
+ - spec/support/config/factory_bot.rb
371
+ - spec/support/config/resque.rb
372
+ - spec/support/fixtures/black_dots.png
373
+ - spec/support/fixtures/color_map.png
374
+ - spec/support/fixtures/dots_and_lines.png
375
+ - spec/support/fixtures/green_and_black.png
376
+ - spec/support/fixtures/red.png
377
+ - spec/support/fixtures/transparent.png
378
+ - spec/support/matchers/have_color.rb
@@ -1,16 +0,0 @@
1
- pageflow.linkmapPage.MasksDelegator = pageflow.Object.extend({
2
- initialize: function() {
3
- this._masks = pageflow.linkmapPage.Masks.empty;
4
- },
5
-
6
- updateDelegate: function(masks) {
7
- this._masks = masks;
8
- this.trigger('update');
9
- }
10
- });
11
-
12
- _(['findByPermaId', 'atPoint', 'each', 'draw', 'isEmpty']).each(function(method) {
13
- pageflow.linkmapPage.MasksDelegator.prototype[method] = function() {
14
- return this._masks[method].apply(this._masks, arguments);
15
- };
16
- });
@@ -1,34 +0,0 @@
1
- $.fn.linkmapAreaRedraw = function(options) {
2
- this.each(function() {
3
- var area = $(this);
4
- var position = area.position();
5
-
6
- var mask = options.masks && options.masks.findByPermaId(area.attr('data-mask-id'));
7
- area.data('mask', mask || null);
8
-
9
- var canvas = area.find('canvas').filter(options.target)[0];
10
-
11
- if (!canvas) {
12
- return;
13
- }
14
-
15
- var context = canvas.getContext('2d');
16
-
17
- if (options.image) {
18
- canvas.width = options.width;
19
- canvas.height = options.height;
20
-
21
- if (mask) {
22
- mask.draw(context, options.width);
23
- context.globalCompositeOperation = 'source-in';
24
- }
25
-
26
- if (options.image) {
27
- options.image.draw(canvas);
28
- }
29
- }
30
- else {
31
- context.clearRect(0, 0, options.width, options.height);
32
- }
33
- });
34
- };
@@ -1,68 +0,0 @@
1
- pageflow.linkmapPage.MaskSprite = (function() {
2
- function MaskSprite(id, imageData) {
3
- this.id = id;
4
-
5
- this.nonTransparentAt = function(x, y) {
6
- var pixel = imageData.get(x, y, 1, 1).data;
7
- return pixel[3] > 0;
8
- };
9
-
10
- this.draw = function(context, spriteOffset, boundingBox, scale) {
11
- imageData.draw(context,
12
- spriteOffset,
13
- 0,
14
- boundingBox.width,
15
- boundingBox.height,
16
- boundingBox.left * scale,
17
- boundingBox.top * scale,
18
- boundingBox.width * scale,
19
- boundingBox.height * scale);
20
-
21
- };
22
-
23
- this.toDataURL = function() {
24
- return imageData.toDataURL();
25
- };
26
- }
27
-
28
- MaskSprite.load = function(maskSpriteUrlTemplate, id) {
29
- return pageflow.linkmapPage.ImageData.load(getUrl(maskSpriteUrlTemplate, id)).then(function(imageData) {
30
- return new MaskSprite(id, imageData);
31
- });
32
- };
33
-
34
- MaskSprite.fromColorMapImageData = function(colorMapImageData, colorMap) {
35
- var imageData = new pageflow.linkmapPage.ImageData(colorMap.sumOfComponentWidths(),
36
- colorMap.maxComponentHeight());
37
-
38
- _(colorMap.components).reduce(function(offset, component) {
39
- imageData.copyColorFrom(colorMapImageData.getBoundingBox(component.boundingBox),
40
- component.color,
41
- offset, 0);
42
-
43
- return offset + component.boundingBox.width;
44
- }, 0);
45
-
46
- return new MaskSprite('a', imageData);
47
- };
48
-
49
- function getUrl(template, id) {
50
- return template.replace(':id_partition', idPartition(id));
51
- }
52
-
53
- function idPartition(id) {
54
- return partition(pad(id, 9), '/');
55
- }
56
-
57
- function partition(string, separator) {
58
- return string.replace(/./g, function(c, i, a) {
59
- return i && ((a.length - i) % 3 === 0) ? '/' + c : c;
60
- });
61
- }
62
-
63
- function pad(string, size) {
64
- return (_.times(size, function() { return '0'; }).join('') + string).slice(-size);
65
- }
66
-
67
- return MaskSprite;
68
- }());
@@ -1,99 +0,0 @@
1
- pageflow.linkmapPage.Masks = (function() {
2
- var SPRITE_IMAGE_ID = 'id';
3
- var COLOR_MAP = 'c';
4
-
5
- function Masks(masks, sprite, colorMap) {
6
- this.findByPermaId = function(permaId) {
7
- return _(masks).detect(function(mask) {
8
- return mask.permaId === permaId;
9
- });
10
- };
11
-
12
- this.atPoint = function(fractionX, fractionY) {
13
- return _(masks).detect(function(mask) {
14
- return mask.contains(fractionX, fractionY);
15
- });
16
- };
17
-
18
- this.draw = function(context, width) {
19
- _(masks).each(function(mask) {
20
- mask.draw(context, width);
21
- });
22
- };
23
-
24
- this.each = function(callback, context) {
25
- _(masks).each(callback, context);
26
- };
27
-
28
- this.isEmpty = function() {
29
- return !masks.length;
30
- };
31
-
32
- this.serialize = function(spriteId) {
33
- var data = {};
34
-
35
- data[SPRITE_IMAGE_ID] = spriteId;
36
- data[COLOR_MAP] = colorMap.serialize();
37
-
38
- return data;
39
- };
40
-
41
- this.getSpriteDataUrl = function() {
42
- return sprite.toDataURL();
43
- };
44
- }
45
-
46
- Masks.empty = new Masks([]);
47
-
48
- Masks.loadColorMapImage = function(url) {
49
- return pageflow.linkmapPage.ImageData.load(url).then(function(colorMapImageData) {
50
- try {
51
- var colorMap = pageflow.linkmapPage.ColorMap.fromImageData(colorMapImageData);
52
-
53
- return fromMaskSpriteAndColorMap(
54
- pageflow.linkmapPage.MaskSprite.fromColorMapImageData(colorMapImageData, colorMap),
55
- colorMap
56
- );
57
- }
58
- catch(e) {
59
- return new $.Deferred().reject(e).promise();
60
- }
61
- });
62
- };
63
-
64
- Masks.deserialize = function(data, maskSpriteUrlTemplate) {
65
- return pageflow.linkmapPage.MaskSprite.load(maskSpriteUrlTemplate, data[SPRITE_IMAGE_ID]).then(function(sprite) {
66
- return fromMaskSpriteAndColorMap(
67
- sprite,
68
- pageflow.linkmapPage.ColorMap.deserialize(data[COLOR_MAP])
69
- );
70
- });
71
- };
72
-
73
- function fromMaskSpriteAndColorMap(sprite, colorMap) {
74
- var masks = [];
75
- var permaId = 0;
76
-
77
- _(colorMap.components).reduce(function(offset, component) {
78
- masks.push(new pageflow.linkmapPage.Mask({
79
- permaId: sprite.id + ':' + permaId.toString(),
80
-
81
- sprite: sprite,
82
- spriteOffset: offset,
83
-
84
- originalWidth: colorMap.width,
85
- originalHeight: colorMap.height,
86
-
87
- boundingBox: component.boundingBox
88
- }));
89
-
90
- permaId += 1;
91
-
92
- return offset + component.boundingBox.width;
93
- }, 0);
94
-
95
- return new Masks(masks, sprite, colorMap);
96
- }
97
-
98
- return Masks;
99
- }());
@@ -1,26 +0,0 @@
1
- module Pageflow
2
- module LinkmapPage
3
- class MaskSpritesController < Pageflow::ApplicationController
4
- respond_to :json
5
-
6
- before_filter :authenticate_user!
7
-
8
- def create
9
- image_file = ImageFile.find(params[:image_file_id])
10
- authorize!(:update, image_file)
11
-
12
- mask_sprite = MaskSprite
13
- .create_with(permitted_params)
14
- .find_or_create_by!(image_file_id: image_file.id)
15
-
16
- respond_with(mask_sprite, location: image_file_mask_sprite_url(image_file, mask_sprite))
17
- end
18
-
19
- private
20
-
21
- def permitted_params
22
- params.require(:mask_sprite).permit(:attachment)
23
- end
24
- end
25
- end
26
- end
@@ -1,15 +0,0 @@
1
- module Pageflow
2
- module LinkmapPage
3
- class MaskSprite < ActiveRecord::Base
4
- belongs_to :image_file
5
-
6
- has_attached_file :attachment, Pageflow.config.paperclip_s3_default_options
7
-
8
- do_not_validate_attachment_file_type :attachment
9
-
10
- def as_json(*)
11
- super(only: [:id])
12
- end
13
- end
14
- end
15
- end
data/config/routes.rb DELETED
@@ -1,5 +0,0 @@
1
- Pageflow::LinkmapPage::Engine.routes.draw do
2
- resources :image_files, only: [] do
3
- resource :mask_sprite, only: [:show, :create]
4
- end
5
- end
@@ -1,108 +0,0 @@
1
- require 'spec_helper'
2
-
3
- module Pageflow
4
- module LinkmapPage
5
- describe MaskSpritesController do
6
- DATA_URL = 'data:image/png;base64,iVBORw0KGgoAAA' \
7
- 'ANSUhEUgAAAAcAAAAHCAYAAADEUlfTAAAAGXRFWHRTb2Z' \
8
- '0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAENJREFU' \
9
- 'eNpiYICABCDeAcRfoXQCA5LEDyD+j4R/wBTsQJOAYZA42' \
10
- 'Chskl+ZgMRhBuzgMEhyBRD/RJP4CRXH7VqAAAMA2qweFJ' \
11
- 'llSygAAAAASUVORK5CYII='.freeze
12
-
13
- describe '#create' do
14
- routes { Pageflow::LinkmapPage::Engine.routes }
15
-
16
- it 'responds with success for member' do
17
- user = create(:user)
18
- entry = create(:entry, with_editor: user)
19
- image_file = create(:image_file, used_in: entry.draft)
20
-
21
- sign_in(user)
22
- post(:create,
23
- image_file_id: image_file.id,
24
- mask_sprite: {attachment: DATA_URL},
25
- format: 'json')
26
-
27
- expect(response.status).to eq(201)
28
- end
29
-
30
- it 'includes id of created mask sprite in response' do
31
- user = create(:user)
32
- entry = create(:entry, with_editor: user)
33
- image_file = create(:image_file, used_in: entry.draft)
34
-
35
- sign_in(user)
36
- post(:create,
37
- image_file_id: image_file.id,
38
- mask_sprite: {attachment: DATA_URL},
39
- format: 'json')
40
-
41
- json = JSON.parse(response.body)
42
-
43
- expect(json['id']).to eq(MaskSprite.last.id)
44
- end
45
-
46
- it 'creates mask sprite for image' do
47
- user = create(:user)
48
- entry = create(:entry, with_editor: user)
49
- image_file = create(:image_file, used_in: entry.draft)
50
-
51
- sign_in(user)
52
- post(:create,
53
- image_file_id: image_file.id,
54
- mask_sprite: {attachment: DATA_URL},
55
- format: 'json')
56
- mask_sprite = MaskSprite.where(image_file: image_file).first
57
-
58
- expect(mask_sprite).to be_present
59
- expect(mask_sprite.attachment).to be_present
60
- end
61
-
62
- it 'does not recreate mask sprite if it already exists' do
63
- user = create(:user)
64
- entry = create(:entry, with_editor: user)
65
- image_file = create(:image_file, used_in: entry.draft)
66
-
67
- sign_in(user)
68
- post(:create,
69
- image_file_id: image_file.id,
70
- mask_sprite: {attachment: DATA_URL},
71
- format: 'json')
72
-
73
- expect {
74
- post(:create,
75
- image_file_id: image_file.id,
76
- mask_sprite: {attachment: DATA_URL},
77
- format: 'json')
78
- }.not_to change { MaskSprite.count }
79
- end
80
-
81
- it 'requires user to have permissions for entry' do
82
- user = create(:user)
83
- entry = create(:entry)
84
- image_file = create(:image_file, used_in: entry.draft)
85
-
86
- sign_in(user)
87
- post(:create,
88
- image_file_id: image_file.id,
89
- mask_sprite: {attachment: DATA_URL},
90
- format: 'json')
91
-
92
- expect(response.status).to eq(403)
93
- end
94
-
95
- it 'requires user to be signed in' do
96
- image_file = create(:image_file)
97
-
98
- post(:create,
99
- image_file_id: image_file.id,
100
- mask_sprite: {attachment: DATA_URL},
101
- format: 'json')
102
-
103
- expect(response.status).to eq(401)
104
- end
105
- end
106
- end
107
- end
108
- end