pageflow-linkmap-page 0.2.0 → 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (73) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +32 -44
  3. data/README.md +14 -4
  4. data/app/assets/javascript/pageflow/linkmap_page/editor/collections/areas_collection.js +21 -12
  5. data/app/assets/javascript/pageflow/linkmap_page/editor/controllers/side_bar_controller.js +23 -0
  6. data/app/assets/javascript/pageflow/linkmap_page/editor/models/area.js +36 -0
  7. data/app/assets/javascript/pageflow/linkmap_page/editor/models/masks_delegator.js +16 -0
  8. data/app/assets/javascript/pageflow/linkmap_page/editor/models/new_area_file_selection_handler.js +1 -0
  9. data/app/assets/javascript/pageflow/linkmap_page/editor/models/page_configuration_mixin.js +84 -27
  10. data/app/assets/javascript/pageflow/linkmap_page/editor/models/stored_mask_sprite.js +25 -0
  11. data/app/assets/javascript/pageflow/linkmap_page/editor/routers/side_bar_router.js +3 -1
  12. data/app/assets/javascript/pageflow/linkmap_page/editor/templates/embedded/area_item.jst.ejs +14 -5
  13. data/app/assets/javascript/pageflow/linkmap_page/editor/templates/embedded/area_masks_preview.jst.ejs +2 -0
  14. data/app/assets/javascript/pageflow/linkmap_page/editor/templates/embedded/area_outlines.jst.ejs +2 -0
  15. data/app/assets/javascript/pageflow/linkmap_page/editor/templates/select_area_position_hint.jst.ejs +4 -0
  16. data/app/assets/javascript/pageflow/linkmap_page/editor/views/areas_list_view.js +6 -0
  17. data/app/assets/javascript/pageflow/linkmap_page/editor/views/configuration_editor_view.js +9 -4
  18. data/app/assets/javascript/pageflow/linkmap_page/editor/views/edit_area_view.js +15 -11
  19. data/app/assets/javascript/pageflow/linkmap_page/editor/views/editable_areas_mode_view.js +6 -1
  20. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/area_item_embedded_view.js +78 -56
  21. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/area_masks_preview_embedded_view.js +219 -0
  22. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/area_outlines_embedded_view.js +126 -0
  23. data/app/assets/javascript/pageflow/linkmap_page/editor/views/embedded/areas_embedded_view.js +34 -3
  24. data/app/assets/javascript/pageflow/linkmap_page/editor/views/inputs/area_mask_input_view.js +35 -0
  25. data/app/assets/javascript/pageflow/linkmap_page/editor/views/select_area_position_hint_view.js +39 -0
  26. data/app/assets/javascript/pageflow/linkmap_page/editor.js +12 -1
  27. data/app/assets/javascript/pageflow/linkmap_page/page_type.js +35 -35
  28. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/area_contains.js +18 -0
  29. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/area_redraw.js +29 -0
  30. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/color_map.js +122 -0
  31. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/image_data.js +59 -0
  32. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/mask.js +37 -0
  33. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/mask_sprite.js +68 -0
  34. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/masks.js +99 -0
  35. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap/remote_image.js +38 -0
  36. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap.js +137 -9
  37. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_audio_player_controls.js +1 -1
  38. data/app/assets/javascript/pageflow/linkmap_page/widgets/linkmap_panorama.js +24 -18
  39. data/app/assets/javascript/pageflow/linkmap_page.js +1 -1
  40. data/app/assets/stylesheets/pageflow/linkmap_page/animations/{rotate.css.scss → rotate.scss} +0 -0
  41. data/app/assets/stylesheets/pageflow/linkmap_page/editor/action_buttons.scss +66 -0
  42. data/app/assets/stylesheets/pageflow/linkmap_page/editor/area_outlines.scss +13 -0
  43. data/app/assets/stylesheets/pageflow/linkmap_page/editor/{file_areas.css.scss → file_areas.scss} +0 -0
  44. data/app/assets/stylesheets/pageflow/linkmap_page/editor/inputs/area_mask.scss +3 -0
  45. data/app/assets/stylesheets/pageflow/linkmap_page/editor/masks_preview.scss +15 -0
  46. data/app/assets/stylesheets/pageflow/linkmap_page/editor/{resizable.css.scss → resizable.scss} +0 -0
  47. data/app/assets/stylesheets/pageflow/linkmap_page/editor/select_area_position_hint.scss +9 -0
  48. data/app/assets/stylesheets/pageflow/linkmap_page/{editor.css.scss → editor.scss} +28 -41
  49. data/app/assets/stylesheets/pageflow/linkmap_page/themes/{default.css.scss → default.scss} +2 -3
  50. data/app/assets/stylesheets/pageflow/{linkmap_page.css.scss → linkmap_page.scss} +15 -18
  51. data/app/controllers/pageflow/linkmap_page/mask_sprites_controller.rb +26 -0
  52. data/app/helpers/pageflow/linkmap_page/areas_helper.rb +19 -4
  53. data/app/models/pageflow/linkmap_page/mask_sprite.rb +15 -0
  54. data/app/views/pageflow/linkmap_page/areas/_div.html.erb +4 -7
  55. data/config/locales/de.yml +184 -6
  56. data/config/locales/en.yml +149 -7
  57. data/config/routes.rb +2 -2
  58. data/db/migrate/20170330201200_create_mask_sprites.rb +12 -0
  59. data/lib/generators/pageflow_linkmap_page/install/install_generator.rb +1 -0
  60. data/lib/pageflow/linkmap_page/version.rb +1 -1
  61. data/pageflow-linkmap-page.gemspec +10 -11
  62. data/spec/controllers/pageflow/linkmap_page/mask_sprites_controller_spec.rb +108 -0
  63. data/spec/helpers/pageflow/linkmap_page/areas_helper_spec.rb +23 -2
  64. metadata +75 -59
  65. data/config/locales/new/inverted.de.yml +0 -10
  66. data/config/locales/new/inverted.en.yml +0 -10
  67. data/config/locales/new/scaled_on_phone_hint.de.yml +0 -11
  68. data/config/locales/new/scaled_on_phone_hint.en.yml +0 -11
  69. data/config/locales/new/scroll_indicators_v.de.yml +0 -6
  70. data/config/locales/new/scroll_indicators_v.en.yml +0 -6
  71. data/config/locales/new/text_only_area_type.de.yml +0 -11
  72. data/config/locales/new/text_only_area_type.en.yml +0 -11
  73. data/config/locales/new/typo.en.yml +0 -6
@@ -6,6 +6,9 @@
6
6
  _create: function() {
7
7
  var widget = this;
8
8
 
9
+ this.lastImageUrls = {};
10
+ this.imagePromises = {};
11
+
9
12
  this.refresh();
10
13
 
11
14
  if (widget.options.hoverVideoEnabled) {
@@ -28,6 +31,84 @@
28
31
  widget.options.hoverVideo.pause();
29
32
  }
30
33
  });
34
+
35
+ this.element.on('click', function(event) {
36
+ var area = widget.areaAt(widget.positionFromEvent(event));
37
+
38
+ if (area.length) {
39
+ area.first().trigger('linkmapareaclick');
40
+ }
41
+ else {
42
+ widget._trigger('backgroundclick');
43
+ }
44
+
45
+ return false;
46
+ });
47
+
48
+ this.element.on('touchstart', function(event) {
49
+ var area = widget.areaAt(widget.positionFromEvent(event.originalEvent.touches[0]));
50
+
51
+ var areaEvent = jQuery.Event('linkmapareatouchstart');
52
+
53
+ area.first().trigger(areaEvent);
54
+
55
+ if (areaEvent.isDefaultPrevented()) {
56
+ event.preventDefault();
57
+ }
58
+ });
59
+
60
+ this.element.on('mousemove mouseleave', function(event) {
61
+ widget.updateHoverStates(event);
62
+ });
63
+ },
64
+
65
+ areaAt: function(position) {
66
+ return this.element.find('.hover_area').filter(function() {
67
+ return $(this).linkmapAreaContains(position);
68
+ }).first();
69
+ },
70
+
71
+ updateHoverStates: function(event) {
72
+ var position = this.positionFromEvent(event);
73
+
74
+ this.element.find('.hover_area').each(function() {
75
+ var area = $(this);
76
+ var hovered = area.linkmapAreaContains(position);
77
+
78
+ if (area.hasClass('hover') && !hovered) {
79
+ area.trigger('linkmaparealeave');
80
+ }
81
+ });
82
+
83
+ this.element.find('.hover_area').each(function() {
84
+ var area = $(this);
85
+ var hovered = area.linkmapAreaContains(position);
86
+
87
+ if (!area.hasClass('hover') && hovered) {
88
+ area.trigger('linkmapareaenter');
89
+ }
90
+
91
+ area.css('cursor',
92
+ hovered &&
93
+ area.attr('data-target-type') !== 'text_only' ?
94
+ 'pointer' : 'default');
95
+
96
+ area.toggleClass('hover', hovered);
97
+ });
98
+ },
99
+
100
+ positionFromEvent: function(event) {
101
+ var clientRect = this.element[0].getBoundingClientRect();
102
+
103
+ var left = event.clientX - clientRect.left;
104
+ var top = event.clientY - clientRect.top;
105
+
106
+ return {
107
+ leftInPixel: left,
108
+ topInPixel: top,
109
+ leftInPercent: left / this.element.width() * 100,
110
+ topInPercent: top / this.element.height() * 100
111
+ };
31
112
  },
32
113
 
33
114
  updateHoverVideoEnabled: function(value) {
@@ -42,29 +123,76 @@
42
123
  },
43
124
 
44
125
  refresh: function() {
45
- var hoverAreas = this.element.find('.hover_area'),
46
- hoverImages = this.element.find('.background_image');
126
+ var hoverAreas = this.element.find('.hover_area');
127
+ var widget = this;
47
128
 
48
- this._resizeToBaseImage(hoverImages);
129
+ $.when(
130
+ this.loadImage('hover'),
131
+ this.loadImage('visited'),
132
+ this.loadMasks()
133
+ ).then(function(hoverImage, visitedImage, masks) {
134
+ var baseImage = widget.options.baseImage();
135
+ var width = baseImage.width();
136
+ var height = baseImage.height();
137
+
138
+ hoverAreas.linkmapAreaRedraw({
139
+ target: '.hover_image',
140
+ image: hoverImage,
141
+ width: width,
142
+ height: height,
143
+ masks: masks
144
+ });
145
+
146
+ hoverAreas.linkmapAreaRedraw({
147
+ target: '.visited_image',
148
+ image: visitedImage,
149
+ width: width,
150
+ height: height,
151
+ masks: masks
152
+ });
153
+ });
49
154
 
50
155
  hoverAreas.linkmapAreaClip();
51
156
  hoverAreas.linkmapAreaFormat();
52
157
  hoverAreas.linkmapAreaVisited();
53
158
  },
54
159
 
55
- _resizeToBaseImage: function(target) {
56
- var baseImage = this.options.baseImage();
160
+ loadImage: function(name) {
161
+ var url = this.options[name + 'ImageUrl'];
162
+
163
+ if (this.lastImageUrls[name] !== url) {
164
+ this.lastImageUrls[name] = url;
165
+ this.imagePromises[name] = url && pageflow.linkmapPage.RemoteImage.load(url);
166
+ }
167
+
168
+ return this.imagePromises[name];
169
+ },
170
+
171
+ loadMasks: function() {
172
+ var widget = this;
173
+ var maskImageId = this.options.masksData && this.options.masksData.id;
174
+
175
+ if (this.lastMaskImageId !== maskImageId) {
176
+ this.lastMaskImageId = maskImageId;
177
+
178
+ this.masksPromise = this.options.masksData ?
179
+ pageflow.linkmapPage.Masks.deserialize(this.options.masksData,
180
+ this.options.maskSpriteUrlTemplate) :
181
+ $.when(pageflow.linkmapPage.Masks.empty);
182
+
183
+ this.masksPromise.then(function(masks) {
184
+ widget._trigger('updatemasks', null, {masks: masks});
185
+ });
186
+ }
57
187
 
58
- target
59
- .width(baseImage.width())
60
- .height(baseImage.height());
188
+ return this.masksPromise;
61
189
  }
62
190
  });
63
191
 
64
192
  $.fn.linkmapAreaClip = function(optionalPosition) {
65
193
  this.each(function() {
66
194
  var hoverArea = $(this);
67
- var clippedElement = hoverArea.find('.panorama_video, .background_image');
195
+ var clippedElement = hoverArea.find('.panorama_video, .hover_image, .visited_image');
68
196
  var position = optionalPosition || hoverArea.position();
69
197
 
70
198
  clippedElement.css({
@@ -53,7 +53,7 @@
53
53
  e.stopPropagation();
54
54
  });
55
55
 
56
- this.element.on('click', function() {
56
+ this.element.on('linkmapareaclick', function() {
57
57
  if (!widget.element.hasClass('dynamic_marker')) {
58
58
  widget._trigger('play', null, {
59
59
  audioFileId: widget.element.data('audioFile')
@@ -41,16 +41,16 @@
41
41
  that.calcAreaOpacity(that.activeAreas, e.pageX, e.pageY);
42
42
  });
43
43
 
44
- pageElement.on('mouseenter', '.hover_area', function() {
44
+ pageElement.on('linkmapareaenter', '.hover_area', function() {
45
45
  positionOverlay($(this));
46
46
  });
47
47
 
48
- pageElement.on('click', function() {
48
+ pageElement.on('click linkmapbackgroundclick', function() {
49
49
  that.overlayBox.removeClass('active');
50
- that.activeAreas.removeClass('hover');
50
+ that.activeAreas.removeClass('hover hover_mobile');
51
51
  });
52
52
 
53
- $('body').on('mouseleave', '.hover_area', function() {
53
+ $('body').on('linkmaparealeave', '.hover_area', function() {
54
54
  that.overlayBox.removeClass('active');
55
55
  });
56
56
 
@@ -59,23 +59,29 @@
59
59
  });
60
60
 
61
61
  that.activeAreas.each(function() {
62
- $(this).on('click touchstart', function(e) {
63
- if (pageflow.browser.has('mobile platform')) {
64
- if($(this).hasClass('hover')) {
62
+ var area = $(this);
63
+
64
+ if (pageflow.browser.has('mobile platform')) {
65
+ area.on('linkmapareatouchstart', function(e) {
66
+ if (area.hasClass('hover_mobile')) {
65
67
  that.activeAreas.removeClass('active');
66
- $(this).addClass('active');
67
- return;
68
+ area.addClass('active');
68
69
  }
69
- that.activeAreas.removeClass('hover');
70
- $(this).addClass('hover');
71
- positionOverlay($(this));
72
- return false;
73
- }
74
- else {
70
+ else {
71
+ that.activeAreas.removeClass('hover hover_mobile');
72
+ area.addClass('hover hover_mobile');
73
+
74
+ positionOverlay($(this));
75
+ return false;
76
+ }
77
+ });
78
+ }
79
+ else {
80
+ area.on('linkmapareaclick', function(e) {
75
81
  that.activeAreas.removeClass('active');
76
- $(this).addClass('active');
77
- }
78
- })
82
+ area.addClass('active');
83
+ });
84
+ }
79
85
  });
80
86
 
81
87
  var positionOverlay = function(area) {
@@ -6,4 +6,4 @@
6
6
 
7
7
  pageflow.linkmapPage = pageflow.linkmapPage || {};
8
8
 
9
- pageflow.linkmapPage.toggleMarkerOptions = ['no_marker', 'dynamic_marker'];
9
+ pageflow.linkmapPage.markerOptions = ['no_marker', 'dynamic_marker'];
@@ -0,0 +1,66 @@
1
+ .action_buttons {
2
+ display: none;
3
+ }
4
+
5
+ &.editable {
6
+ .selected .action_buttons {
7
+ display: block;
8
+ }
9
+
10
+ .editing .action_buttons {
11
+ display: none;
12
+ }
13
+ }
14
+
15
+ .action_button {
16
+ @include icon-only-button(white);
17
+ display: none;
18
+ position: absolute;
19
+ z-index: 5;
20
+ top: 5px;
21
+ right: 5px;
22
+ background-color: #fff;
23
+ border: solid 1px #888;
24
+ font-weight: normal;
25
+ }
26
+
27
+ .show_marker {
28
+ @include fa-eye-icon;
29
+ }
30
+
31
+ .hide_marker {
32
+ @include fa-eye-slash-icon;
33
+ }
34
+
35
+ .set_mask {
36
+ @include fa-crop-icon;
37
+ right: 42px;
38
+ }
39
+
40
+ .unset_mask {
41
+ @include fa-arrows-alt-icon;
42
+ }
43
+
44
+ &.masks_available {
45
+ .set_mask {
46
+ display: block;
47
+ }
48
+ }
49
+
50
+ .with_mask {
51
+ .unset_mask {
52
+ display: block;
53
+ }
54
+ }
55
+
56
+ .dynamic_marker {
57
+ .hide_marker {
58
+ display: block;
59
+ }
60
+ }
61
+
62
+ .without_mask {
63
+ .show_marker {
64
+ display: block;
65
+ }
66
+ }
@@ -0,0 +1,13 @@
1
+ .linkmap_area_outlines {
2
+ position: absolute;
3
+ top: 0;
4
+ left: 0;
5
+ width: 100%;
6
+ height: 100%;
7
+
8
+ canvas {
9
+ position: absolute;
10
+ top: 0;
11
+ left: 0;
12
+ }
13
+ }
@@ -0,0 +1,3 @@
1
+ .linkmap_page_area_mask_input_pictogram {
2
+ @include fa-crop-icon;
3
+ }
@@ -0,0 +1,15 @@
1
+ .linkmap_area_masks_preview {
2
+ position: absolute;
3
+ top: 0;
4
+ left: 0;
5
+ width: 100%;
6
+ height: 100%;
7
+ z-index: 4;
8
+ pointer-events: all;
9
+
10
+ canvas {
11
+ position: absolute;
12
+ top: 0;
13
+ left: 0;
14
+ }
15
+ }
@@ -0,0 +1,9 @@
1
+ .select_area_position_hint {
2
+ background-color: #fff;
3
+ padding: 10px;
4
+
5
+ button {
6
+ margin-top: 10px;
7
+ @include button;
8
+ }
9
+ }
@@ -1,33 +1,14 @@
1
1
  .editor {
2
+ @import "./editor/inputs/area_mask";
2
3
  @import "./editor/areas_list";
4
+ @import "./editor/select_area_position_hint";
3
5
  }
4
6
 
5
7
  .linkmap_areas {
6
8
  @import "./editor/resizable";
7
-
8
- .edit {
9
- @include icon-only-button(white);
10
- @include pencil-icon;
11
- position: absolute;
12
- display: none;
13
- z-index: 2;
14
- top: 5px;
15
- right: 5px;
16
- background-color: #fff;
17
- border: solid 1px #888;
18
- }
19
-
20
- .toggle_marker {
21
- @include icon-only-button(white);
22
- @include eye-icon;
23
- position: absolute;
24
- display: none;
25
- z-index: 2;
26
- top: 5px;
27
- right: 40px;
28
- background-color: #fff;
29
- border: solid 1px #888;
30
- }
9
+ @import "./editor/action_buttons";
10
+ @import "./editor/masks_preview";
11
+ @import "./editor/area_outlines";
31
12
 
32
13
  .area_type_pictogram {
33
14
  @include background-icon-center($color: #fff);
@@ -40,7 +21,7 @@
40
21
  height: 25px;
41
22
  border-radius: 5px;
42
23
  background-color: rgba(0, 0, 0, 0.4);
43
- z-index: 2;
24
+ z-index: 3;
44
25
  }
45
26
 
46
27
  .page_area,
@@ -52,25 +33,37 @@
52
33
  }
53
34
 
54
35
  &.editable {
36
+ pointer-events: all;
37
+
38
+ .click_trap {
39
+ cursor: default;
40
+ position: absolute;
41
+ top: 0;
42
+ left: 0;
43
+ width: 100%;
44
+ height: 100%;
45
+ z-index: 4;
46
+ }
47
+
55
48
  .hover_area {
49
+ z-index: 2;
50
+ }
51
+
52
+ .without_mask.selected .click_trap {
56
53
  cursor: move;
54
+ }
57
55
 
58
- &:hover .edit,
59
- &:hover .toggle_marker,
60
- &:hover .area_type_pictogram {
56
+ .hover_area.selected {
57
+ z-index: 3;
58
+
59
+ .area_type_pictogram {
61
60
  display: block;
62
61
  }
63
62
 
64
- &.editing .edit,
65
- &.editing .toggle_marker,
66
63
  &.editing .area_type_pictogram {
67
64
  display: none;
68
65
  }
69
66
 
70
- &.editing {
71
- z-index: 2;
72
- }
73
-
74
67
  &:before,
75
68
  &:after {
76
69
  content: "";
@@ -79,16 +72,10 @@
79
72
  left: 0;
80
73
  width: 100%;
81
74
  height: 100%;
82
- z-index: 1;
75
+ z-index: 2;
83
76
  @include box-sizing(border-box);
84
77
  }
85
78
 
86
- &.highlighted:before,
87
- &.editing:before,
88
- &:hover:before {
89
- background-color: rgba(255, 255, 255, 0.3);
90
- }
91
-
92
79
  &:before {
93
80
  border: solid 2px #000;
94
81
  }
@@ -42,7 +42,7 @@
42
42
  }
43
43
  }
44
44
 
45
- &.hover {
45
+ &.hover_mobile {
46
46
  .linkmap_marker {
47
47
  &:before {
48
48
  opacity: 1;
@@ -112,7 +112,6 @@
112
112
  }
113
113
  }
114
114
 
115
- &:hover,
116
115
  &.hover,
117
116
  &.playing,
118
117
  &:focus,
@@ -320,7 +319,7 @@
320
319
  }
321
320
 
322
321
  .hover_area {
323
- &:hover, &.hover {
322
+ &.hover {
324
323
  .linkmap_audio_player_controls {
325
324
  .play:before {
326
325
  background-color: rgba(0,0,0,0.7);
@@ -27,10 +27,6 @@
27
27
 
28
28
  @include user-select(none);
29
29
 
30
- .content {
31
- /* pointer-events: none; */
32
- }
33
-
34
30
  .scroller {
35
31
  overflow: hidden;
36
32
 
@@ -40,7 +36,6 @@
40
36
  }
41
37
 
42
38
  .linkmap {
43
- pointer-events: none;
44
39
  position: absolute;
45
40
  height: 100%;
46
41
  width: 100%;
@@ -113,21 +108,25 @@
113
108
  height: 30%;
114
109
  width: 20%;
115
110
  overflow: hidden;
116
- cursor: pointer;
117
111
  display: block;
118
112
  pointer-events: all;
119
113
 
120
- .background_image {
114
+ .hover_image,
115
+ .visited_image {
116
+ position: absolute;
117
+ top: 0;
118
+ left: 0;
121
119
  visibility: hidden;
122
120
  opacity: 0;
123
- position: absolute;
124
121
  @include transition(opacity 0.5s ease, visibility 0.5s ease);
125
122
  }
126
123
 
127
- &:hover,
128
124
  &.hover,
129
- &.playing, &:focus, &:active {
125
+ &.playing,
126
+ &:focus,
127
+ &.editing {
130
128
  .hover_image {
129
+ z-index: 1;
131
130
  opacity: 1;
132
131
  visibility: visible;
133
132
  }
@@ -146,10 +145,14 @@
146
145
  z-index: 1;
147
146
  }
148
147
 
148
+ .linkmap_marker {
149
+ position: absolute;
150
+ z-index: 2;
151
+ }
152
+
149
153
  &.dynamic_marker {
150
154
  .linkmap_marker {
151
155
  background-color: transparent;
152
- position: absolute;
153
156
  top: 5%;
154
157
  left: 5%;
155
158
  width: 90%;
@@ -160,10 +163,8 @@
160
163
  @include transition(0.15s);
161
164
  opacity: 0.1;
162
165
  box-shadow: 1px 2px 3px rgba(0,0,0,0.3);
163
- z-index: 2;
164
166
  }
165
167
 
166
- &:hover,
167
168
  &.hover,
168
169
  &.playing,
169
170
  &:focus,
@@ -259,8 +260,4 @@
259
260
  }
260
261
  }
261
262
  }
262
-
263
- .text_only_area {
264
- cursor: default;
265
- }
266
- }
263
+ }
@@ -0,0 +1,26 @@
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
@@ -4,16 +4,29 @@ 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'])
9
+
10
+ mask_sprite_url_template = MaskSprite.new(id: 1, attachment_file_name: 'data').attachment.url
11
+ .gsub(%r'(\d{3}/)+', ':id_partition/')
12
+
7
13
  render('pageflow/linkmap_page/areas/div',
8
14
  entry: entry,
9
- configuration: configuration)
15
+ configuration: configuration,
16
+ 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
22
+ })
10
23
  end
11
24
 
12
- def linkmap_area(entry, attributes, index, &block)
13
- Link.new(self, entry, attributes.symbolize_keys, index).render(&block)
25
+ def linkmap_area(entry, attributes, index, background_type = nil, &block)
26
+ Link.new(self, entry, attributes.symbolize_keys, index, background_type).render(&block)
14
27
  end
15
28
 
16
- class Link < Struct.new(:template, :entry, :attributes, :index)
29
+ class Link < Struct.new(:template, :entry, :attributes, :index, :background_type)
17
30
  delegate :content_tag, to: :template
18
31
 
19
32
  def render(&block)
@@ -51,6 +64,7 @@ module Pageflow
51
64
  end
52
65
 
53
66
  def data_attributes
67
+ mask_id = background_type != 'hover_video' && attributes[:mask_perma_id]
54
68
  audio_file_id = attributes[:target_id]
55
69
 
56
70
  {
@@ -58,6 +72,7 @@ module Pageflow
58
72
  target_id: attributes[:target_id],
59
73
  audio_file: audio_file_id.present? ? "#{audio_file_id}.area_#{index}" : nil,
60
74
  page_transition: attributes[:page_transition],
75
+ mask_id: mask_id,
61
76
  width: attributes[:width],
62
77
  height: attributes[:height]
63
78
  }.delete_if { |key, value| value.blank? }
@@ -0,0 +1,15 @@
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