pageflow-chart 0.1.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 (100) hide show
  1. checksums.yaml +15 -0
  2. data/.gitignore +21 -0
  3. data/CHANGELOG.md +7 -0
  4. data/Gemfile +10 -0
  5. data/README.md +91 -0
  6. data/Rakefile +20 -0
  7. data/app/assets/images/pageflow/chart/fs_close_sprite.png +0 -0
  8. data/app/assets/images/pageflow/chart_pictogram.png +0 -0
  9. data/app/assets/images/pageflow/chart_pictogram_small.png +0 -0
  10. data/app/assets/images/pageflow/chart_sprite.png +0 -0
  11. data/app/assets/images/pageflow/ov-chart.png +0 -0
  12. data/app/assets/javascripts/pageflow/chart.js +5 -0
  13. data/app/assets/javascripts/pageflow/chart/asset_urls.js.erb +3 -0
  14. data/app/assets/javascripts/pageflow/chart/editor.js +9 -0
  15. data/app/assets/javascripts/pageflow/chart/editor/collections/scraped_sites_collection.js +23 -0
  16. data/app/assets/javascripts/pageflow/chart/editor/initializers/setup_collections.js +1 -0
  17. data/app/assets/javascripts/pageflow/chart/editor/models/scraped_site.js +55 -0
  18. data/app/assets/javascripts/pageflow/chart/editor/templates/scraped_site_status.jst.ejs +2 -0
  19. data/app/assets/javascripts/pageflow/chart/editor/templates/url_input.jst.ejs +7 -0
  20. data/app/assets/javascripts/pageflow/chart/editor/views/configuration_editor.js +26 -0
  21. data/app/assets/javascripts/pageflow/chart/editor/views/embedded/iframe_embedded_view.js +47 -0
  22. data/app/assets/javascripts/pageflow/chart/editor/views/inputs/scraped_url_input_view.js +49 -0
  23. data/app/assets/javascripts/pageflow/chart/editor/views/scraped_site_status_view.js +18 -0
  24. data/app/assets/javascripts/pageflow/chart/page_type.js +152 -0
  25. data/app/assets/stylesheets/pageflow/chart.css.scss +130 -0
  26. data/app/assets/stylesheets/pageflow/chart/custom.css.scss +209 -0
  27. data/app/assets/stylesheets/pageflow/chart/editor.css.scss +17 -0
  28. data/app/assets/stylesheets/pageflow/chart/themes/default.css.scss +10 -0
  29. data/app/controllers/pageflow/chart/application_controller.rb +6 -0
  30. data/app/controllers/pageflow/chart/scraped_sites_controller.rb +25 -0
  31. data/app/helpers/pageflow/chart/scraped_sites_helper.rb +13 -0
  32. data/app/jobs/pageflow/chart/scrape_site_job.rb +59 -0
  33. data/app/models/pageflow/chart/scraped_site.rb +51 -0
  34. data/app/views/pageflow/chart/page.html +41 -0
  35. data/app/views/pageflow/chart/page_type.json.jbuilder +2 -0
  36. data/bin/rails +8 -0
  37. data/chart.gemspec +30 -0
  38. data/config/locales/de.yml +40 -0
  39. data/config/locales/en.yml +22 -0
  40. data/config/routes.rb +3 -0
  41. data/db/migrate/20140417112724_create_pageflow_chart_scraped_sites.rb +14 -0
  42. data/lib/pageflow/chart.rb +21 -0
  43. data/lib/pageflow/chart/configuration.rb +63 -0
  44. data/lib/pageflow/chart/downloader.rb +53 -0
  45. data/lib/pageflow/chart/engine.rb +17 -0
  46. data/lib/pageflow/chart/page_type.rb +15 -0
  47. data/lib/pageflow/chart/scraper.rb +107 -0
  48. data/spec/controllers/pageflow/chart/scraped_sites_controller_spec.rb +35 -0
  49. data/spec/dummy/README.rdoc +28 -0
  50. data/spec/dummy/Rakefile +6 -0
  51. data/spec/dummy/app/assets/images/.keep +0 -0
  52. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  53. data/spec/dummy/app/assets/stylesheets/application.css +13 -0
  54. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  55. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  56. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  57. data/spec/dummy/app/mailers/.keep +0 -0
  58. data/spec/dummy/app/models/.keep +0 -0
  59. data/spec/dummy/app/models/concerns/.keep +0 -0
  60. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  61. data/spec/dummy/bin/bundle +3 -0
  62. data/spec/dummy/bin/rails +4 -0
  63. data/spec/dummy/bin/rake +4 -0
  64. data/spec/dummy/config.ru +4 -0
  65. data/spec/dummy/config/application.rb +22 -0
  66. data/spec/dummy/config/boot.rb +5 -0
  67. data/spec/dummy/config/database.yml +25 -0
  68. data/spec/dummy/config/environment.rb +5 -0
  69. data/spec/dummy/config/environments/development.rb +29 -0
  70. data/spec/dummy/config/environments/production.rb +80 -0
  71. data/spec/dummy/config/environments/test.rb +36 -0
  72. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  73. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  74. data/spec/dummy/config/initializers/inflections.rb +16 -0
  75. data/spec/dummy/config/initializers/mime_types.rb +5 -0
  76. data/spec/dummy/config/initializers/secret_token.rb +12 -0
  77. data/spec/dummy/config/initializers/session_store.rb +3 -0
  78. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  79. data/spec/dummy/config/locales/en.yml +23 -0
  80. data/spec/dummy/config/routes.rb +4 -0
  81. data/spec/dummy/db/schema.rb +39 -0
  82. data/spec/dummy/lib/assets/.keep +0 -0
  83. data/spec/dummy/public/404.html +58 -0
  84. data/spec/dummy/public/422.html +58 -0
  85. data/spec/dummy/public/500.html +57 -0
  86. data/spec/dummy/public/favicon.ico +0 -0
  87. data/spec/factories/scraped_sites.rb +5 -0
  88. data/spec/fixtures/datawrapper.html +121 -0
  89. data/spec/jobs/pageflow/chart/scrape_site_job_spec.rb +22 -0
  90. data/spec/models/pageflow/chart/scraped_site_spec.rb +19 -0
  91. data/spec/pageflow/chart/downloader_spec.rb +90 -0
  92. data/spec/pageflow/chart/scraper_spec.rb +179 -0
  93. data/spec/requests/scraping_site_spec.rb +23 -0
  94. data/spec/spec_helper.rb +20 -0
  95. data/spec/support/factory_girl.rb +5 -0
  96. data/spec/support/html_fragment.rb +13 -0
  97. data/spec/support/paperclip.rb +11 -0
  98. data/spec/support/resque.rb +20 -0
  99. data/spec/support/webmock.rb +11 -0
  100. metadata +363 -0
@@ -0,0 +1,152 @@
1
+ pageflow.pageType.register('chart', _.extend({
2
+
3
+ prepareNextPageTimeout: 0,
4
+
5
+ enhance: function(pageElement, configuration) {
6
+ var scroller = pageElement.find('.scroller');
7
+
8
+ pageElement.find('.bigscreen_toggler').on('click', function() {
9
+ $('body').toggleClass('bigScreen');
10
+ scroller.scroller('refresh');
11
+ });
12
+ $('body').keydown(function(event) {
13
+ if(event.keyCode == 27) {
14
+ $(this).removeClass('bigScreen');
15
+ }
16
+ });
17
+ },
18
+
19
+ resize: function(pageElement, configuration) {
20
+ var iframeWrapper = pageElement.find('.iframeWrapper'),
21
+ pageHeader = pageElement.find('.page_header'),
22
+ scroller = pageElement.find('.scroller');
23
+
24
+ var widescreened = pageElement.width() > 1430;
25
+
26
+ iframeWrapper.toggleClass('widescreened', widescreened);
27
+
28
+ if (widescreened) {
29
+ iframeWrapper.insertAfter(scroller);
30
+ }
31
+ else {
32
+ iframeWrapper.insertAfter(pageHeader);
33
+ }
34
+ },
35
+
36
+ customizeLayout: function(pageElement, configuration) {
37
+ if(!this.layoutCustomized) {
38
+ var iframe = pageElement.find('iframe'),
39
+ scroller = pageElement.find('.scroller'),
40
+ iframeOverlay = pageElement.find('.iframe_overlay');
41
+
42
+ iframe.load(function() {
43
+ $(this).contents().find('.fs-btn').css('display','none');
44
+ $(this).contents().find('head').append('<link rel="stylesheet" type="text/css" href="' + pageflow.chart.assetUrls.customStylesheet + '">');
45
+ $(this).contents().find('body').addClass($("[data-theme]").attr('data-theme'));
46
+
47
+ if(pageflow.features.has('mobile platform')) {
48
+ setTimeout(function() {
49
+ if(iframe) {
50
+ iframe.attr("height", iframe.contents().height() + "px");
51
+ pageElement.find('.iframeWrapper').height(iframe.contents().height());
52
+ scroller.scroller('refresh');
53
+ }
54
+ }, 1000);
55
+ }
56
+ scroller.scroller('refresh');
57
+ pageElement.find('.iframeWrapper').addClass('active');
58
+ });
59
+ this.layoutCustomized = true;
60
+ }
61
+ },
62
+
63
+ _initEventSimulation: function(element, iframe, wrapper) {
64
+ var propagatedEvents = 'click mousemove mouseup mouseover mousedown';
65
+ var lastElement;
66
+ element.on(propagatedEvents, function(event) {
67
+ var contentElement = iframe.contents()[0];
68
+ element.css('display','none');
69
+ if (contentElement && event) {
70
+ lastElement = $(contentElement.elementFromPoint(event.pageX-iframe.offset().left, event.pageY-iframe.offset().top));
71
+ lastElement.simulate("mousedown", event);
72
+ lastElement.simulate("mousemove", event);
73
+ lastElement.simulate("click", event);
74
+
75
+ element.css('cursor', lastElement.css('cursor'));
76
+ }
77
+ element.css('display','block');
78
+ event.preventDefault();
79
+ event.stopPropagation();
80
+ });
81
+
82
+ iframe.load(function() {
83
+ iframe.contents().find('*').on('mousemove', function() {
84
+ wrapper.addClass('hovering');
85
+ });
86
+
87
+ iframe.contents().on('mouseout', function() {
88
+ wrapper.removeClass('hovering');
89
+ });
90
+ });
91
+ },
92
+
93
+ prepare: function(pageElement, configuration) {
94
+ this._loadIframe(pageElement);
95
+ },
96
+
97
+ preload: function(pageElement, configuration) {
98
+ return pageflow.preload.backgroundImage(pageElement.find('.background_image'));
99
+ },
100
+
101
+ activating: function(pageElement, configuration) {
102
+ this._loadIframe(pageElement);
103
+ this.resize(pageElement, configuration);
104
+ this.customizeLayout(pageElement, configuration);
105
+ this._initEventSimulation(pageElement.find('.iframe_overlay'), pageElement.find('iframe'), pageElement.find('.iframeWrapper'));
106
+ },
107
+
108
+ activated: function(pageElement, configuration) {},
109
+
110
+ deactivating: function(pageElement, configuration) {
111
+ $('body').removeClass('bigScreen');
112
+ },
113
+
114
+ deactivated: function(pageElement, configuration) {},
115
+
116
+ update: function(pageElement, configuration) {
117
+ pageElement.find('h2 .tagline').text(configuration.get('tagline') || '');
118
+ pageElement.find('h2 .title').text(configuration.get('title') || '');
119
+ pageElement.find('h2 .subtitle').text(configuration.get('subtitle') || '');
120
+ pageElement.find('p').html(configuration.get('text') || '');
121
+
122
+ this.updateCommonPageCssClasses(pageElement, configuration);
123
+
124
+ pageElement.find('.shadow').css({
125
+ opacity: configuration.get('gradient_opacity') / 100
126
+ });
127
+ },
128
+
129
+ embeddedEditorViews: function() {
130
+ return {
131
+ '.background_image': {
132
+ view: pageflow.BackgroundImageEmbeddedView,
133
+ options: {propertyName: 'background_image_id'}
134
+ },
135
+
136
+ 'iframe': {
137
+ view: pageflow.chart.IframeEmbeddedView,
138
+ options: {propertyName: 'scraped_site_id'}
139
+ }
140
+ };
141
+ },
142
+
143
+ _loadIframe: function(pageElement) {
144
+ pageElement.find('iframe[data-src]').each(function() {
145
+ var iframe = $(this);
146
+
147
+ if (!iframe.attr('src')) {
148
+ iframe.attr('src', iframe.data('src'));
149
+ }
150
+ });
151
+ }
152
+ }, pageflow.commonPageCssClasses));
@@ -0,0 +1,130 @@
1
+ @include pageflow-page-type(chart);
2
+
3
+ .chart_page {
4
+ .iframeWrapper {
5
+ margin-bottom: 40px;
6
+ pointer-events: all;
7
+ height: 400px;
8
+ position: relative;
9
+
10
+ .hidden &, .hideText & {
11
+ @include transition(0.7s ease);
12
+ }
13
+
14
+ iframe {
15
+ visibility: hidden;
16
+ opacity: 0;
17
+ @include transition(0.7s ease);
18
+ }
19
+
20
+
21
+ &.widescreened {
22
+ position: absolute;
23
+ width: 45%;
24
+ height: 95%;
25
+ max-height: 600px;
26
+ right: 10%;
27
+ margin-top: 16%;
28
+ margin-bottom: 0;
29
+ z-index: 1;
30
+
31
+ @media (max-height: 870px) {
32
+ height: 90%;
33
+ top: 5%;
34
+ margin-top: 0;
35
+ }
36
+ }
37
+
38
+ .hideText & {
39
+ visibility: hidden;
40
+ opacity: 0;
41
+ }
42
+
43
+ &:before {
44
+ padding: 15px;
45
+ background-color: #191919;
46
+ background-color: rgba(25,25,25, 0.9);
47
+ box-shadow: rgba(0,0,0,0.5) 0 0 3px 0px;
48
+ content: "";
49
+ position: absolute;
50
+ top: -15px;
51
+ left: -15px;
52
+ width: 100%;
53
+ z-index: -1;
54
+ height: 100%;
55
+
56
+ @include phone {
57
+ padding: 15px 0;
58
+ left: 0;
59
+ }
60
+ }
61
+
62
+ .iframe_overlay {
63
+ .has_mobile_platform & {
64
+ position: absolute;
65
+ top: 0;
66
+ left: 0;
67
+ width: 100%;
68
+ height: 100%;
69
+ pointer-events: all;
70
+ background-color: transparent;
71
+ }
72
+ }
73
+
74
+ .text_position_right &.widescreened {
75
+ right: auto;
76
+ left: 8%;
77
+ width: 42%;
78
+ }
79
+
80
+ .bigscreen_toggler {
81
+ width: 24px;
82
+ height: 24px;
83
+ background-image: image-url('pageflow/chart/fs_close_sprite.png');
84
+ background-position: 0 0;
85
+ background-repeat: no-repeat;
86
+ position: absolute;
87
+ top: 3px;
88
+ right: 18px;
89
+ color: transparent;
90
+ text-indent: -4000px;
91
+ opacity: 0;
92
+ cursor: pointer;
93
+ display: none;
94
+ @include transition(opacity 0.5s ease);
95
+
96
+ .has_mobile_platform & {
97
+ display: none !important;
98
+ }
99
+ }
100
+
101
+ &:hover .bigscreen_toggler, &.hovering .bigscreen_toggler {
102
+ opacity: 1;
103
+ }
104
+
105
+ .bigScreen & {
106
+ position: absolute;
107
+ width: 86% !important;
108
+ height: 87%;
109
+ top: 10%;
110
+ left: 5% !important;
111
+ z-index: 201;
112
+ margin-top: 0 !important;
113
+ max-height: none !important;
114
+
115
+ .bigscreen_toggler {
116
+ background-position: -25px 0;
117
+ }
118
+ }
119
+
120
+ &.active {
121
+ iframe {
122
+ visibility: visible;
123
+ opacity: 1;
124
+ }
125
+ .bigscreen_toggler {
126
+ display: block;
127
+ }
128
+ }
129
+ }
130
+ }
@@ -0,0 +1,209 @@
1
+ /*
2
+ * Noir Theme Customized
3
+ * ----------
4
+ *
5
+ * based on http://bootswatch.com/slate/
6
+ */
7
+
8
+ body.chart {
9
+ font-size: 13px;
10
+ overflow: visible;
11
+ overflow-x: hidden;
12
+ font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
13
+ line-height: 18px;
14
+ padding: 0 10px;
15
+ font-weight: 400;
16
+ background: #191919;
17
+ background: rgba(0,0,0,0);
18
+ color: white;
19
+ }
20
+
21
+ a {
22
+ color: #fff;
23
+ text-decoration: none;
24
+ }
25
+
26
+ div, span {
27
+ border-bottom-color: gray !important;
28
+ border-right-color: gray !important;
29
+ border-left-color: gray !important;
30
+ border-top-color: gray !important;
31
+ }
32
+
33
+ a:hover {
34
+ color: #fff;
35
+ text-decoration: underline;
36
+ }
37
+
38
+ h1 {
39
+ font-size: 24px;
40
+ font-weight: 400;
41
+ margin: 0 0 15px;
42
+ text-align: left;
43
+ line-height: initial;
44
+ }
45
+
46
+ .chart p { margin: 15px 0; line-height: 19px;}
47
+
48
+ #chart {
49
+ margin-top: 25px;
50
+ }
51
+
52
+ .label span {
53
+ font-size: 12px;
54
+ color: #fff;
55
+ text-shadow: 0 0 2px #000;
56
+ }
57
+
58
+ .line-chart .label span {
59
+ background: #272B30!important;
60
+ }
61
+
62
+ html .line-chart .label.tooltip span {
63
+ background: none!important;
64
+ }
65
+
66
+ html .line-chart .label.tooltip.inverted span {
67
+ color: #fff!important;
68
+ }
69
+
70
+ .label.highlighted, .label.axis {
71
+ font-size: 12px;
72
+ z-index: 100;
73
+ }
74
+
75
+ .label.hover {
76
+ font-weight: bold;
77
+ }
78
+
79
+ .pie-chart .label.hover span,
80
+ .donut-chart .label.hover span {
81
+ color: #fff;
82
+ }
83
+
84
+ .label.inverted span {
85
+ color: #000!important;
86
+ }
87
+
88
+ .label.highlighted {
89
+ font-weight: bold;
90
+ }
91
+
92
+ .label.value span {
93
+ font-size: 12px;
94
+ }
95
+
96
+ .label.series span {
97
+ font-size: 12px;
98
+ }
99
+
100
+
101
+ .tooltip {
102
+ z-index: 200;
103
+ padding-bottom: 0px;
104
+ }
105
+
106
+ .tooltip .content {
107
+ background-color: #202328;
108
+ border: 1px solid #101214;
109
+ border-radius: 4px 4px 4px 4px;
110
+ box-shadow: 1px 1px 1px rgba(0, 0, 0, 0.5) inset;
111
+ padding: 5px 8px;
112
+ }
113
+
114
+ .tooltip label {
115
+ font-weight: 700;
116
+ }
117
+
118
+ .tooltip label:after {
119
+ content: ": ";
120
+ }
121
+
122
+ #footer {
123
+ margin: 0px 0px 0px;
124
+ padding-top: 5px;
125
+ padding-bottom: 5px;
126
+ }
127
+
128
+ .footer-left {
129
+ float: left;
130
+ }
131
+ .footer-right {
132
+ float: right;
133
+ }
134
+
135
+ .clearfix:after {
136
+ content: ".";
137
+ display: block;
138
+ clear: both;
139
+ visibility: hidden;
140
+ line-height: 0;
141
+ height: 0;
142
+ }
143
+
144
+ .clearfix {
145
+ display: inline-block;
146
+ }
147
+
148
+ html[xmlns] .clearfix {
149
+ display: block;
150
+ }
151
+
152
+ * html .clearfix {
153
+ height: 1%;
154
+ }
155
+
156
+ svg .axis, svg .tick, svg .grid, svg rect {
157
+ shape-rendering: crispEdges;
158
+ }
159
+
160
+ .label.rotate90 {
161
+ -moz-transform: rotate(-90deg);
162
+ -webkit-transform: rotate(-90deg);
163
+ -ms-transform: rotate(-90deg);
164
+ -o-transform: rotate(-90deg);
165
+ filter: progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
166
+ }
167
+
168
+ .label.smaller span {
169
+ font-size: 80%;
170
+ }
171
+
172
+ .chart .chartMenu {
173
+ background: #272B30;
174
+ box-shadow: 0 0 5px #444;
175
+ }
176
+
177
+ .chart .chartMenu a {
178
+ color: #bbb;
179
+ }
180
+
181
+ .chart .chartMenu a:hover {
182
+ color: #fff;
183
+ }
184
+
185
+
186
+ .chart .icon-fullscreen { background-position: 0 -15px; }
187
+ .chart .icon-share { background-position: -32px -15px; }
188
+ .chart .icon-download { background-position: -17px -15px; }
189
+
190
+
191
+ /* New rules */
192
+
193
+ html {
194
+ height: 100%;
195
+ }
196
+
197
+ .filter-select {
198
+ max-width: 400px;
199
+ @media screen and (max-width: 400px) {
200
+ max-width: 220px;
201
+ }
202
+ }
203
+
204
+ .filter-ui div span {
205
+ color: gray;
206
+ }
207
+ .label.outline span {
208
+ text-shadow: 0 0 2px #000;
209
+ }