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
@@ -22,10 +22,6 @@
22
22
  this.overlayTitle = pageElement.find('.description_overlay .link_title');
23
23
  this.overlayDescription = pageElement.find('.description_overlay .link_description');
24
24
 
25
- this.touchIndicator = pageElement.find('.touch_indicator');
26
- this.externalLinkLoadingIndicator = pageElement.find('.external_link_loading_indicator');
27
- this.globalIndicators = this.touchIndicator.add(this.externalLinkLoadingIndicator);
28
-
29
25
  this.startScrollPosition = _.clone(this.options.startScrollPosition);
30
26
 
31
27
  this.currentScrollPosition = null;
@@ -33,40 +29,66 @@
33
29
  this.refresh();
34
30
 
35
31
  this.scroller.onScrollEnd(function() {
36
- that.updateScrollPosition();
32
+ if (!that.options.disabled) {
33
+ that.updateScrollPosition();
34
+ }
37
35
  });
38
36
 
39
- $(window).on('resize', function () {
40
- that.centerToPoint(null, 0);
37
+ this._on(window, {
38
+ resize: function () {
39
+ that.centerToPoint(null, 0);
40
+ }
41
41
  });
42
42
 
43
- this.element.on('mousemove', function(e) {
44
- that.lastMouseMoveEvent = e;
45
- that.calcAreaOpacity(that.activeAreas, e.pageX, e.pageY);
43
+ this._on({
44
+ mousemove: function(e) {
45
+ that.lastMouseMoveEvent = e;
46
+ that.calcAreaOpacity(that.activeAreas, e.pageX, e.pageY);
47
+ }
46
48
  });
47
49
 
48
- pageElement.on('linkmapareaenter', '.hover_area', function() {
49
- positionOverlay($(this));
50
+ this._on(pageElement, {
51
+ 'linkmapareaenter .hover_area': function(event) {
52
+ var area = $(event.currentTarget);
53
+ area.addClass('hover');
54
+
55
+ positionOverlay(area);
56
+ },
57
+
58
+ 'linkmaparealeave .hover_area': function(event) {
59
+ var area = $(event.currentTarget);
60
+ area.removeClass('hover');
61
+ },
62
+
63
+ 'click': resetIndicatorsAndOverlays,
64
+ 'linkmapbackgroundclick': resetIndicatorsAndOverlays
50
65
  });
51
66
 
52
- pageElement.on('click linkmapbackgroundclick', function() {
53
- that.overlayBox.removeClass('active');
54
- that.activeAreas.removeClass('hover hover_mobile');
55
- that.globalIndicators.hide();
67
+ this._on($('body'), {
68
+ 'linkmaparealeave .hover_area': resetOverlays
56
69
  });
57
70
 
58
- $('body').on('linkmaparealeave', '.hover_area', function() {
59
- that.overlayBox.removeClass('active');
71
+ this._on(pageElement, {
72
+ 'dragstart .hover_area': resetOverlays,
73
+ 'resizestart .hover_area': resetOverlays
60
74
  });
61
75
 
62
- pageElement.on('dragstart resizestart', '.hover_area', function() {
76
+ function resetIndicatorsAndOverlays() {
77
+ resetOverlays();
78
+ that.activeAreas.removeClass('hover hover_mobile');
79
+ that.options.areaIndicators.reset();
80
+ }
81
+
82
+ function resetOverlays() {
63
83
  that.overlayBox.removeClass('active');
64
- });
84
+ }
65
85
 
66
86
  that.activeAreas.each(function() {
67
87
  var area = $(this);
68
88
 
69
- area.on('linkmapareaclick', function(event) {
89
+ that._on(area, {linkmapareaclick: onAreaClick});
90
+
91
+ function onAreaClick(event) {
70
92
  if (pageflow.browser.has('mobile platform')) {
71
93
  if (area.hasClass('hover_mobile')) {
72
94
  that.activeAreas.removeClass('active');
@@ -76,11 +98,8 @@
76
98
  that.activeAreas.removeClass('hover hover_mobile');
77
99
  area.addClass('hover hover_mobile');
78
100
 
79
- positionOverlay($(this));
80
-
81
- if (!area.hasClass('dynamic_marker')) {
82
- displayTouchIndicator(event.originalEvent);
83
- }
101
+ positionOverlay($(event.currentTarget));
102
+ this.options.areaIndicators.displayForSelectedArea(area, event.originalEvent);
84
103
 
85
104
  return false;
86
105
  }
@@ -90,12 +109,8 @@
90
109
  area.addClass('active');
91
110
  }
92
111
 
93
- if (!area.hasClass('dynamic_marker') &&
94
- area.hasClass('external_site_area') &&
95
- area.hasClass('target_self')) {
96
- displayExternalLinkLoadingIndicator(event.originalEvent);
97
- }
98
- });
112
+ this.options.areaIndicators.displayForClickedArea(area, event.originalEvent);
113
+ }
99
114
  });
100
115
 
101
116
  var positionOverlay = function(area) {
@@ -170,35 +185,24 @@
170
185
  }
171
186
  };
172
187
 
173
- var displayExternalLinkLoadingIndicator = function(event) {
174
- positionGlobalIndicator(that.externalLinkLoadingIndicator, event);
175
- that.externalLinkLoadingIndicator.show();
176
- };
177
-
178
- var displayTouchIndicator = function(event) {
179
- positionGlobalIndicator(that.touchIndicator, event);
180
- animateTouchIndicator();
181
- };
182
-
183
- var animateTouchIndicator = function() {
184
- that.touchIndicator.hide();
185
-
186
- setTimeout(function() {
187
- that.touchIndicator.show();
188
- }, 500);
189
- };
190
-
191
- var positionGlobalIndicator = function(indicator, event) {
192
- var parentClientRect = that.panoramaWrapper[0].getBoundingClientRect();
193
- var touch = event.touches ? event.touches[0] : event;
188
+ this.refresh();
189
+ },
194
190
 
195
- indicator.css({
196
- left: touch.clientX - parentClientRect.left,
197
- top: touch.clientY - parentClientRect.top
198
- });
199
- };
191
+ _setOptions: function(options) {
192
+ var changed = (this.options.disabled !== options.disabled);
193
+ this._super(options);
200
194
 
201
- this.refresh();
195
+ if (changed) {
196
+ if (this.options.disabled) {
197
+ this.panoramaWrapper.css({
198
+ left: 0,
199
+ top: 0
200
+ });
201
+ }
202
+ else {
203
+ this.refresh();
204
+ }
205
+ }
202
206
  },
203
207
 
204
208
  calcAreaOpacity: function(activeAreas, mX, mY) {
@@ -229,6 +233,10 @@
229
233
  },
230
234
 
231
235
  highlightAreas: function() {
236
+ if (this.options.disabled) {
237
+ return;
238
+ }
239
+
232
240
  var element = this.element;
233
241
  element.find('.linkmap_marker').addClass('teasing');
234
242
 
@@ -242,6 +250,10 @@
242
250
  },
243
251
 
244
252
  resetAreaHighlighting: function() {
253
+ if (this.options.disabled) {
254
+ return;
255
+ }
256
+
245
257
  var element = this.element;
246
258
 
247
259
  element.find('.linkmap_marker').removeClass('no_transition teasing');
@@ -298,6 +310,10 @@
298
310
  },
299
311
 
300
312
  refresh: function() {
313
+ if (this.options.disabled) {
314
+ return;
315
+ }
316
+
301
317
  this.keepingScrollPosition(function() {
302
318
  var pageElement = this.options.page;
303
319
 
@@ -340,6 +356,8 @@
340
356
 
341
357
  this.innerScrollerElement.removeClass('measuring');
342
358
  this.scroller.refresh();
359
+
360
+ this.activeAreas.addClass('enabled');
343
361
  });
344
362
  },
345
363
 
@@ -365,6 +383,10 @@
365
383
  },
366
384
 
367
385
  resetScrollPosition: function() {
386
+ if (this.options.disabled) {
387
+ return;
388
+ }
389
+
368
390
  this.centerToPoint(this.panoramaToScroller(this.startScrollPosition), 0);
369
391
  },
370
392
 
@@ -6,16 +6,30 @@
6
6
  var element = this.element;
7
7
  var scroller = this.options.scroller;
8
8
 
9
+ this.arrows = this.element.find('.linkmap-arrow');
10
+
9
11
  scroller.onScroll(toggle);
10
12
  scroller.onScrollEnd(toggle);
11
13
  toggle();
12
14
 
15
+ if (this.options.disabled) {
16
+ this.disable();
17
+ }
18
+
13
19
  function toggle() {
14
20
  element.toggleClass('can_scroll_left', Math.ceil(scroller.positionX()) < - margin);
15
21
  element.toggleClass('can_scroll_right', Math.floor(scroller.positionX()) > scroller.maxX() + margin);
16
22
  element.toggleClass('can_scroll_up', Math.ceil(scroller.positionY()) < - margin);
17
23
  element.toggleClass('can_scroll_down', Math.floor(scroller.positionY()) > scroller.maxY() + margin);
18
24
  }
25
+ },
26
+
27
+ disable: function() {
28
+ this.arrows.hide();
29
+ },
30
+
31
+ enable: function() {
32
+ this.arrows.show();
19
33
  }
20
34
  });
21
35
  }(jQuery));
@@ -4,6 +4,7 @@
4
4
  left: 0;
5
5
  width: 100%;
6
6
  height: 100%;
7
+ z-index: 1;
7
8
 
8
9
  canvas {
9
10
  position: absolute;
@@ -11,3 +12,8 @@
11
12
  left: 0;
12
13
  }
13
14
  }
15
+
16
+ .with_mask .linkmap_area_outlines-canvas_wrapper {
17
+ display: block;
18
+ position: absolute;
19
+ }
@@ -7,9 +7,19 @@
7
7
  z-index: 4;
8
8
  pointer-events: all;
9
9
 
10
+ .background_image,
11
+ .canvas_wrapper,
10
12
  canvas {
11
13
  position: absolute;
12
14
  top: 0;
13
15
  left: 0;
14
16
  }
17
+
18
+ .background_image {
19
+ opacity: 0.3;
20
+ }
21
+
22
+ .canvas_wrapper {
23
+ overflow: hidden;
24
+ }
15
25
  }
@@ -0,0 +1,31 @@
1
+ $linkmap-mobile-info-box-background-color: rgba(17, 17, 17, 0.9) !default;
2
+
3
+ $linkmap-mobile-info-box-text-color: #fff;
4
+
5
+ .linkmap-mobile_info_box {
6
+ position: absolute;
7
+ left: 0;
8
+ bottom: 0;
9
+ width: 100%;
10
+ z-index: 2;
11
+ pointer-events: none;
12
+
13
+ &-inner {
14
+ background: $linkmap-mobile-info-box-background-color;
15
+ }
16
+
17
+ h3,
18
+ p {
19
+ width: auto;
20
+ margin: 10px 5% 0;
21
+ color: $linkmap-mobile-info-box-text-color;
22
+ }
23
+
24
+ h3 {
25
+ font-size: 18px;
26
+ }
27
+
28
+ p {
29
+ font-size: 16px;
30
+ }
31
+ }
@@ -0,0 +1,53 @@
1
+ $linkmap-paginator-dot-color: rgba(255, 255, 255, 0.4);
2
+ $linkmap-paginator-active-dot-color: #fff;
3
+
4
+ .linkmap-paginator {
5
+ &-scroller {
6
+ margin-bottom: 38px;
7
+
8
+ > div {
9
+ position: absolute;
10
+ top: 0;
11
+ left: 0;
12
+ }
13
+ }
14
+
15
+ &-pages {
16
+ position: absolute;
17
+ padding-bottom: 40px;
18
+ }
19
+
20
+ &-page_group {
21
+ float: left;
22
+ }
23
+
24
+ &-page {
25
+ float: left;
26
+ box-sizing: border-box;
27
+ padding-bottom: 5px;
28
+ }
29
+
30
+ &-dots {
31
+ position: absolute;
32
+ bottom: 15px;
33
+ left: 50%;
34
+ @include transform(translateX(-50%));
35
+ @include transition(opacity 0.5s linear);
36
+ white-space: nowrap;
37
+
38
+ &.faded {
39
+ opacity: 0;
40
+ }
41
+ }
42
+
43
+ &-dot {
44
+ border: solid 3px $linkmap-paginator-dot-color;
45
+ border-radius: 3px;
46
+ display: inline-block;
47
+ margin: 0 3px;
48
+
49
+ &.active {
50
+ border-color: $linkmap-paginator-active-dot-color;
51
+ }
52
+ }
53
+ }
@@ -1,6 +1,5 @@
1
1
  .linkmap_page {
2
2
  $arrow-margin: 30px;
3
- $arrow-margin-with-default-navigation: 95px;
4
3
  $arrow-margin-mobile: 10px;
5
4
 
6
5
  .arrow_left,
@@ -74,6 +73,11 @@
74
73
  @include phone {
75
74
  right: $arrow-margin-mobile;
76
75
  }
76
+
77
+ .emulation_mode_phone & {
78
+ margin-right: 0;
79
+ right: $arrow-margin-mobile;
80
+ }
77
81
  }
78
82
 
79
83
  .arrow_up {
@@ -21,6 +21,9 @@
21
21
  }
22
22
 
23
23
  .linkmap_page {
24
+ @import "./default/paginator";
25
+ @import "./default/mobile_info_box";
26
+
24
27
  $linkmap-icon-font: "FontAwesome" !default;
25
28
  $linkmap-icon-line-height: 1.1em !default;
26
29
 
@@ -27,12 +27,24 @@
27
27
 
28
28
  @include user-select(none);
29
29
 
30
+ .backgroundArea {
31
+ background: #000;
32
+ }
33
+
34
+ .content {
35
+ pointer-events: none;
36
+ }
37
+
30
38
  .scroller {
31
39
  overflow: hidden;
32
40
 
33
41
  > div {
34
42
  min-height: 0;
35
43
  }
44
+
45
+ .emulation_mode_phone & {
46
+ margin-right: 0 !important;
47
+ }
36
48
  }
37
49
 
38
50
  .linkmap {
@@ -52,6 +64,8 @@
52
64
 
53
65
  .panorama_wrapper {
54
66
  position: absolute;
67
+ @include transition(transform 0.3s ease);
68
+ @include transform-origin(0 0);
55
69
  }
56
70
 
57
71
  .linkmap_areas {
@@ -62,6 +76,10 @@
62
76
  bottom: 0;
63
77
  }
64
78
 
79
+ .controls:before {
80
+ display: none;
81
+ }
82
+
65
83
  .panorama {
66
84
  height: 120%;
67
85
  width: auto;
@@ -109,7 +127,11 @@
109
127
  width: 20%;
110
128
  overflow: hidden;
111
129
  display: block;
112
- pointer-events: all;
130
+ pointer-events: none;
131
+
132
+ &.enabled {
133
+ pointer-events: all;
134
+ }
113
135
 
114
136
  .hover_image,
115
137
  .visited_image {
@@ -183,7 +205,6 @@
183
205
  left: 0;
184
206
  top: 0;
185
207
  z-index: 1;
186
- display: block;
187
208
  pointer-events: none;
188
209
  opacity: 0;
189
210
  max-width: 510px;
@@ -197,7 +218,6 @@
197
218
  @include transition(opacity 0.15s);
198
219
 
199
220
  &.active {
200
- display: block;
201
221
  opacity: 1;
202
222
  }
203
223
 
@@ -216,6 +236,12 @@
216
236
  }
217
237
  }
218
238
 
239
+ &.hide_overlay_boxes {
240
+ .description_overlay {
241
+ display: none;
242
+ }
243
+ }
244
+
219
245
  .external_link_loading_indicator,
220
246
  .external_site_area .inline_loading_spinner {
221
247
  position: absolute;
@@ -4,24 +4,50 @@ module Pageflow
4
4
  include BackgroundImageHelper
5
5
 
6
6
  def linkmap_areas_div(entry, configuration)
7
- hover_image_file = Pageflow::ImageFile.find_by_id(configuration['hover_image_id'])
8
- visited_image_file = Pageflow::ImageFile.find_by_id(configuration['visited_image_id'])
7
+ color_map_file =
8
+ ColorMapFile.find_by_id(configuration['linkmap_color_map_file_id'])
9
+ masked_hover_image_file =
10
+ MaskedImageFile.find_by_id(configuration['linkmap_masked_hover_image_id'])
11
+ masked_visited_image_file =
12
+ MaskedImageFile.find_by_id(configuration['linkmap_masked_visited_image_id'])
9
13
 
10
- mask_sprite_url_template = MaskSprite.new(id: 1, attachment_file_name: 'data').attachment.url
11
- .gsub(%r'/(\d{3}/)+', '/:id_partition/')
14
+
15
+ hide_overlay_boxes =
16
+ configuration['mobile_panorama_navigation'] == 'pan_zoom' &&
17
+ configuration['hide_linkmap_overlay_boxes']
12
18
 
13
19
  render('pageflow/linkmap_page/areas/div',
14
20
  entry: entry,
15
21
  configuration: configuration,
22
+ color_map_file: color_map_file,
23
+ masked_hover_image_file: masked_hover_image_file,
24
+ masked_visited_image_file: masked_visited_image_file,
25
+ css_classes: [
26
+ 'linkmap_areas',
27
+ hide_overlay_boxes ? 'hide_overlay_boxes' : nil
28
+ ].compact.join(' '),
16
29
  data_attributes: {
17
- hover_image_url: hover_image_file &&
18
- hover_image_file.attachment.url(:panorama_large),
19
- visited_image_url: visited_image_file &&
20
- visited_image_file.attachment.url(:panorama_large),
21
- mask_sprite_url_template: mask_sprite_url_template
30
+ color_map_file_id: configuration['color_map_file_id']
22
31
  })
23
32
  end
24
33
 
34
+ def linkmap_area_background_image_div(prefix, attributes, configuration, color_map_file)
35
+ if color_map_file &&
36
+ attributes['mask_perma_id'].present? &&
37
+ attributes['mask_perma_id'].split(':').first.to_i == color_map_file.id
38
+ background_image_div(configuration,
39
+ "linkmap_masked_#{prefix}_image",
40
+ class: "#{prefix}_image",
41
+ file_type: 'pageflow_linkmap_page_masked_image_files',
42
+ style_group: attributes['mask_perma_id'].split(':').last)
43
+ else
44
+ background_image_div(configuration,
45
+ "#{prefix}_image",
46
+ class: "#{prefix}_image",
47
+ style_group: :panorama)
48
+ end
49
+ end
50
+
25
51
  def linkmap_area(entry, attributes, index, background_type = nil, &block)
26
52
  Link.new(self, entry, attributes.symbolize_keys, index, background_type).render(&block)
27
53
  end
@@ -64,7 +90,7 @@ module Pageflow
64
90
  end
65
91
 
66
92
  def data_attributes
67
- mask_id = background_type != 'hover_video' && attributes[:mask_perma_id]
93
+ mask_perma_id = background_type != 'hover_video' && attributes[:mask_perma_id]
68
94
  audio_file_id = attributes[:target_id]
69
95
 
70
96
  {
@@ -72,7 +98,7 @@ module Pageflow
72
98
  target_id: attributes[:target_id],
73
99
  audio_file: audio_file_id.present? ? "#{audio_file_id}.area_#{index}" : nil,
74
100
  page_transition: attributes[:page_transition],
75
- mask_id: mask_id,
101
+ mask_perma_id: mask_perma_id,
76
102
  width: attributes[:width],
77
103
  height: attributes[:height]
78
104
  }.delete_if { |key, value| value.blank? }
@@ -1,11 +1,11 @@
1
1
  module Pageflow
2
2
  module LinkmapPage
3
- class ProcessSourceImageFileJob
4
- @queue = :resizing
3
+ class ProcessSourceImageFileJob < ApplicationJob
4
+ queue_as :resizing
5
5
 
6
- extend StateMachineJob
6
+ include StateMachineJob
7
7
 
8
- def self.perform_with_result(file, _options)
8
+ def perform_with_result(file, _options)
9
9
  file.attachment = file.source_image_file.attachment
10
10
  file.save!
11
11
  :ok
@@ -1,17 +1,23 @@
1
- <%= content_tag(:div, class: "linkmap_areas", data: data_attributes) do %>
1
+ <%= content_tag(:div, class: css_classes, data: data_attributes) do %>
2
2
  <% (configuration['linkmap_areas'].presence || []).each_with_index do |attributes, index| %>
3
3
  <%= linkmap_area(entry, attributes, index, configuration['background_type']) do %>
4
- <canvas class="visited_image"></canvas>
4
+ <%= linkmap_area_background_image_div('visited',
5
+ attributes,
6
+ configuration,
7
+ color_map_file) %>
5
8
 
6
9
  <% if configuration['background_type'] == 'hover_video' &&
7
10
  !Pageflow::ImageFile.find_by_id(configuration['hover_image_id']) %>
8
11
 
9
- <%= background_image_div_with_size(configuration,
10
- 'panorama_video',
11
- file_type: 'video_file',
12
- class: 'hover_image') %>
12
+ <%= background_image_div(configuration,
13
+ 'panorama_video',
14
+ file_type: 'video_file',
15
+ class: 'hover_image') %>
13
16
  <% else %>
14
- <canvas class="hover_image"></canvas>
17
+ <%= linkmap_area_background_image_div('hover',
18
+ attributes,
19
+ configuration,
20
+ color_map_file) %>
15
21
  <% end %>
16
22
 
17
23
  <div class="linkmap_marker <%= attributes['marker'] %>">
@@ -0,0 +1,18 @@
1
+ json.call(color_map_file, :width, :height, :sprite_url)
2
+
3
+ json.components do
4
+ color_map_file.present_colors.inject(0) do |sprite_offset, color|
5
+ bounding_box = color_map_file.bounding_box_for_color(color)
6
+
7
+ json.set!(color) do
8
+ json.color(color)
9
+ json.sprite_offset(sprite_offset)
10
+ json.top(bounding_box[:top])
11
+ json.left(bounding_box[:left])
12
+ json.width(bounding_box[:width])
13
+ json.height(bounding_box[:height])
14
+ end
15
+
16
+ sprite_offset + bounding_box[:width]
17
+ end
18
+ end
@@ -0,0 +1 @@
1
+ json.call(color_map_file, :source_image_file_id, :processing_progress)
@@ -0,0 +1 @@
1
+ json.call(masked_image_file, :source_image_file_id, :color_map_file_id, :processing_progress)