caboose-cms 0.5.128 → 0.5.129
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.
- checksums.yaml +8 -8
- data/app/assets/javascripts/caboose/product.js +30 -0
- data/app/controllers/caboose/cart_controller.rb +0 -1
- data/app/controllers/caboose/pages_controller.rb +2 -2
- data/app/controllers/caboose/social_controller.rb +5 -0
- data/app/models/caboose/schema.rb +2 -1
- data/app/models/caboose/social_config.rb +2 -1
- data/app/views/caboose/extras/error404.html.erb +5 -1
- data/app/views/caboose/social/admin_edit.html.erb +11 -9
- data/app/views/caboose/social/analytics.html.erb +109 -0
- data/config/routes.rb +1 -0
- data/lib/caboose/version.rb +1 -1
- metadata +2 -1
checksums.yaml
CHANGED
@@ -1,15 +1,15 @@
|
|
1
1
|
---
|
2
2
|
!binary "U0hBMQ==":
|
3
3
|
metadata.gz: !binary |-
|
4
|
-
|
4
|
+
YWFmMTA2YWM3Yzc0Nzc2MDBkOTQzMzVkMGQ4MjcwOGY3Y2QzMzM5Nw==
|
5
5
|
data.tar.gz: !binary |-
|
6
|
-
|
6
|
+
ODY1M2FjNWY0ZDhjOWQzODEyZThlNjk4NjE2OGNmOTM1Mjk3NTQzMw==
|
7
7
|
SHA512:
|
8
8
|
metadata.gz: !binary |-
|
9
|
-
|
10
|
-
|
11
|
-
|
9
|
+
NDBjNDU3Y2VmN2M3YzJhZTU2NjlkMzZkMDQ2OWZkYjQ5ZGJhYzEzNGI0ZWUy
|
10
|
+
YmU2NDBlNTAxNzFkMDFlZGUzY2U4N2Q2NjFlZWNmOWI1ODNhOWJhM2IwZGM3
|
11
|
+
OWJhYjdjNjk2ZGZkOTU4NGY5M2E1ZjZlNzJmYzY2ZGU2NTQyZjU=
|
12
12
|
data.tar.gz: !binary |-
|
13
|
-
|
14
|
-
|
15
|
-
|
13
|
+
MzgzYTFkNzBmYjI5NDE0NmFhZjBhNjBmMzM1NmViYWJlZTRkMzYyMmU3ZTY1
|
14
|
+
MWI3ODc5ZDlhMTU3ZDRlM2Y3MDZjZTk5MzJhYTA5NmQ4YTg5ODcwNzY5NGQw
|
15
|
+
NGEzNzgyNmZmMzRjMzM5MDBlYjg2OTAzN2EyMWZlOTQ5YzAzYTQ=
|
@@ -17,6 +17,8 @@ Caboose.Store.Modules.Product = (function() {
|
|
17
17
|
self.initialize = function() {
|
18
18
|
self.$product = $('#product');
|
19
19
|
self.$price = self.$product.find('#product-price');
|
20
|
+
$("<span id='percent-off'></span").insertAfter(self.$price);
|
21
|
+
$("<span id='sale-price'></span").insertBefore(self.$price);
|
20
22
|
if (!self.$product.length) return false;
|
21
23
|
|
22
24
|
$.get('/products/' + self.$product.data('id') + '/info', function(response) {
|
@@ -264,7 +266,35 @@ Caboose.Store.Modules.Product = (function() {
|
|
264
266
|
Caboose.Store.Modules.Cart.set_variant(variant);
|
265
267
|
if (variant) self.set_image_from_variant(variant);
|
266
268
|
if (variant && self.$price.length) self.$price.empty().text('$' + parseFloat((variant.price * 100) / 100).toFixed(2));
|
269
|
+
if (self.variant_on_sale(variant)) {
|
270
|
+
self.$price.addClass("on-sale");
|
271
|
+
var percent = 100 - ((variant.sale_price / variant.price) * 100).toFixed(0);
|
272
|
+
$("#percent-off").text("SALE! Save " + percent + "%");
|
273
|
+
$("#sale-price").text('$' + parseFloat((variant.sale_price * 100) / 100).toFixed(2));
|
274
|
+
}
|
275
|
+
else {
|
276
|
+
self.$price.removeClass("on-sale");
|
277
|
+
$("#percent-off").text('');
|
278
|
+
$("#sale-price").text('');
|
279
|
+
}
|
267
280
|
};
|
281
|
+
|
282
|
+
self.variant_on_sale = function(variant) {
|
283
|
+
var is_on_sale = false;
|
284
|
+
if (variant.sale_price != "" && variant.sale_price != 0) {
|
285
|
+
var d = new Date();
|
286
|
+
if (variant.date_sale_starts && d < variant.date_sale_starts) {
|
287
|
+
is_on_sale = false;
|
288
|
+
}
|
289
|
+
else if (variant.date_sale_ends && d > variant.date_sale_ends) {
|
290
|
+
is_on_sale = false;
|
291
|
+
}
|
292
|
+
else {
|
293
|
+
is_on_sale = true;
|
294
|
+
}
|
295
|
+
}
|
296
|
+
return is_on_sale;
|
297
|
+
}
|
268
298
|
|
269
299
|
self.get_variant = function(id) {
|
270
300
|
return _.find(self.product.variants, function(variant) { return variant.id == (id || self.variant.id) });
|
@@ -78,7 +78,7 @@ module Caboose
|
|
78
78
|
end
|
79
79
|
|
80
80
|
respond_to do |format|
|
81
|
-
format.all { render :file => "caboose/extras/error404", :layout => "caboose/
|
81
|
+
format.all { render :file => "caboose/extras/error404", :layout => "caboose/application", :formats => [:html] }
|
82
82
|
end
|
83
83
|
return
|
84
84
|
end
|
@@ -86,7 +86,7 @@ module Caboose
|
|
86
86
|
asset = Asset.where(:page_id => page.id, :filename => File.basename(uri)).first
|
87
87
|
if (asset.nil?)
|
88
88
|
respond_to do |format|
|
89
|
-
format.all { render :file => "caboose/extras/error404", :layout => "caboose/
|
89
|
+
format.all { render :file => "caboose/extras/error404", :layout => "caboose/application", :formats => [:html] }
|
90
90
|
end
|
91
91
|
return
|
92
92
|
end
|
@@ -1,6 +1,10 @@
|
|
1
1
|
module Caboose
|
2
2
|
class SocialController < ApplicationController
|
3
3
|
layout 'caboose/admin'
|
4
|
+
|
5
|
+
def analytics
|
6
|
+
|
7
|
+
end
|
4
8
|
|
5
9
|
# GET /admin/social
|
6
10
|
def admin_edit
|
@@ -30,6 +34,7 @@ module Caboose
|
|
30
34
|
when 'rss_url' then sc.rss_url = value
|
31
35
|
when 'google_plus_url' then sc.google_plus_url = value
|
32
36
|
when 'linkedin_url' then sc.linkedin_url = value
|
37
|
+
when 'google_analytics_id' then sc.google_analytics_id = value
|
33
38
|
end
|
34
39
|
end
|
35
40
|
|
@@ -582,7 +582,8 @@ class Caboose::Schema < Caboose::Utilities::Schema
|
|
582
582
|
[ :vimeo_url , :string ],
|
583
583
|
[ :rss_url , :string ],
|
584
584
|
[ :google_plus_url , :string ],
|
585
|
-
[ :linkedin_url , :string ]
|
585
|
+
[ :linkedin_url , :string ],
|
586
|
+
[ :google_analytics_id , :string ]
|
586
587
|
],
|
587
588
|
Caboose::StackableGroup => [
|
588
589
|
[ :name , :string ],
|
@@ -1 +1,5 @@
|
|
1
|
-
<
|
1
|
+
<div style="padding:60px 2%;text-align:center;background:#fff;">
|
2
|
+
<img src="http://cabooseit.s3.amazonaws.com/uploads/error_404.png" width="150" />
|
3
|
+
<h1 style="font-size:3em;font-weight:bold;margin-bottom:20px;margin-top:40px;color:#4b4b4b;">Oops!</h1>
|
4
|
+
<p style="color:#4b4b4b;font-size:18px;">The page you are looking for could not be found.</p>
|
5
|
+
</div>
|
@@ -13,6 +13,7 @@ sc = @social_config
|
|
13
13
|
<p><div id="socialconfig_<%= sc.id %>_rss_url" ></div></p>
|
14
14
|
<p><div id="socialconfig_<%= sc.id %>_google_plus_url" ></div></p>
|
15
15
|
<p><div id="socialconfig_<%= sc.id %>_linkedin_url" ></div></p>
|
16
|
+
<p><div id="socialconfig_<%= sc.id %>_google_analytics_id" ></div></p>
|
16
17
|
|
17
18
|
<div id='message'></div>
|
18
19
|
|
@@ -28,15 +29,16 @@ $(document).ready(function() {
|
|
28
29
|
update_url: '/admin/social',
|
29
30
|
authenticity_token: '<%= form_authenticity_token %>',
|
30
31
|
attributes: [
|
31
|
-
{ name: 'facebook_page_id' , nice_name: 'Facebook Page ID' , type: 'text', value: <%= raw Caboose.json(sc.facebook_page_id) %>, width:
|
32
|
-
{ name: 'twitter_username' , nice_name: 'Twitter Username' , type: 'text', value: <%= raw Caboose.json(sc.twitter_username) %>, width:
|
33
|
-
{ name: 'instagram_username' , nice_name: 'Instagram Username' , type: 'text', value: <%= raw Caboose.json(sc.instagram_username) %>, width:
|
34
|
-
{ name: 'youtube_url' , nice_name: 'YouTube URL' , type: 'text', value: <%= raw Caboose.json(sc.youtube_url) %>, width:
|
35
|
-
{ name: 'pinterest_url' , nice_name: 'Pinterest URL' , type: 'text', value: <%= raw Caboose.json(sc.pinterest_url) %>, width:
|
36
|
-
{ name: 'vimeo_url' , nice_name: 'Vimeo URL' , type: 'text', value: <%= raw Caboose.json(sc.vimeo_url) %>, width:
|
37
|
-
{ name: 'rss_url' , nice_name: 'RSS Feed URL' , type: 'text', value: <%= raw Caboose.json(sc.rss_url) %>, width:
|
38
|
-
{ name: 'google_plus_url' , nice_name: 'Google Plus URL' , type: 'text', value: <%= raw Caboose.json(sc.google_plus_url) %>, width:
|
39
|
-
{ name: 'linkedin_url' , nice_name: 'LinkedIn URL' , type: 'text', value: <%= raw Caboose.json(sc.linkedin_url) %>, width:
|
32
|
+
{ name: 'facebook_page_id' , nice_name: 'Facebook Page ID' , type: 'text', value: <%= raw Caboose.json(sc.facebook_page_id) %>, width: 500 },
|
33
|
+
{ name: 'twitter_username' , nice_name: 'Twitter Username' , type: 'text', value: <%= raw Caboose.json(sc.twitter_username) %>, width: 500 },
|
34
|
+
{ name: 'instagram_username' , nice_name: 'Instagram Username' , type: 'text', value: <%= raw Caboose.json(sc.instagram_username) %>, width: 500 },
|
35
|
+
{ name: 'youtube_url' , nice_name: 'YouTube URL' , type: 'text', value: <%= raw Caboose.json(sc.youtube_url) %>, width: 500 },
|
36
|
+
{ name: 'pinterest_url' , nice_name: 'Pinterest URL' , type: 'text', value: <%= raw Caboose.json(sc.pinterest_url) %>, width: 500 },
|
37
|
+
{ name: 'vimeo_url' , nice_name: 'Vimeo URL' , type: 'text', value: <%= raw Caboose.json(sc.vimeo_url) %>, width: 500 },
|
38
|
+
{ name: 'rss_url' , nice_name: 'RSS Feed URL' , type: 'text', value: <%= raw Caboose.json(sc.rss_url) %>, width: 500 },
|
39
|
+
{ name: 'google_plus_url' , nice_name: 'Google Plus URL' , type: 'text', value: <%= raw Caboose.json(sc.google_plus_url) %>, width: 500 },
|
40
|
+
{ name: 'linkedin_url' , nice_name: 'LinkedIn URL' , type: 'text', value: <%= raw Caboose.json(sc.linkedin_url) %>, width: 500 },
|
41
|
+
{ name: 'google_analytics_id' , nice_name: 'Google Analytics Tracking ID' , type: 'text', value: <%= raw Caboose.json(sc.google_analytics_id) %>, width: 500 }
|
40
42
|
]
|
41
43
|
});
|
42
44
|
|
@@ -0,0 +1,109 @@
|
|
1
|
+
<!-- Step 1: Create the containing elements. -->
|
2
|
+
|
3
|
+
<div class="constrain" style="text-align:center;">
|
4
|
+
<div id="embed-api-auth-container"></div>
|
5
|
+
<div id="chart-container"></div>
|
6
|
+
<div id="view-selector-container"></div>
|
7
|
+
</div>
|
8
|
+
<!-- Step 2: Load the library. -->
|
9
|
+
|
10
|
+
<script>
|
11
|
+
(function(w,d,s,g,js,fs){
|
12
|
+
g=w.gapi||(w.gapi={});g.analytics={q:[],ready:function(f){this.q.push(f);}};
|
13
|
+
js=d.createElement(s);fs=d.getElementsByTagName(s)[0];
|
14
|
+
js.src='https://apis.google.com/js/platform.js';
|
15
|
+
fs.parentNode.insertBefore(js,fs);js.onload=function(){g.load('analytics');};
|
16
|
+
}(window,document,'script'));
|
17
|
+
</script>
|
18
|
+
|
19
|
+
|
20
|
+
|
21
|
+
<script>
|
22
|
+
|
23
|
+
gapi.analytics.ready(function() {
|
24
|
+
|
25
|
+
/**
|
26
|
+
* Authorize the user immediately if the user has already granted access.
|
27
|
+
* If no access has been created, render an authorize button inside the
|
28
|
+
* element with the ID "embed-api-auth-container".
|
29
|
+
*/
|
30
|
+
gapi.analytics.auth.authorize({
|
31
|
+
container: 'embed-api-auth-container',
|
32
|
+
clientid: '1002749199705-234hgt2c2spgkt47h8ufu4ave9neifbk.apps.googleusercontent.com',
|
33
|
+
});
|
34
|
+
|
35
|
+
|
36
|
+
/**
|
37
|
+
* Create a new ViewSelector instance to be rendered inside of an
|
38
|
+
* element with the id "view-selector-container".
|
39
|
+
*/
|
40
|
+
var viewSelector = new gapi.analytics.ViewSelector({
|
41
|
+
container: 'view-selector-container'
|
42
|
+
});
|
43
|
+
|
44
|
+
// Render the view selector to the page.
|
45
|
+
viewSelector.execute();
|
46
|
+
|
47
|
+
|
48
|
+
/**
|
49
|
+
* Create a new DataChart instance with the given query parameters
|
50
|
+
* and Google chart options. It will be rendered inside an element
|
51
|
+
* with the id "chart-container".
|
52
|
+
*/
|
53
|
+
var dataChart = new gapi.analytics.googleCharts.DataChart({
|
54
|
+
query: {
|
55
|
+
metrics: 'ga:sessions',
|
56
|
+
dimensions: 'ga:date',
|
57
|
+
'start-date': '30daysAgo',
|
58
|
+
'end-date': 'yesterday'
|
59
|
+
},
|
60
|
+
chart: {
|
61
|
+
container: 'chart-container',
|
62
|
+
type: 'LINE',
|
63
|
+
options: {
|
64
|
+
width: '100%'
|
65
|
+
}
|
66
|
+
}
|
67
|
+
});
|
68
|
+
|
69
|
+
|
70
|
+
/**
|
71
|
+
* Render the dataChart on the page whenever a new view is selected.
|
72
|
+
*/
|
73
|
+
viewSelector.on('change', function(ids) {
|
74
|
+
dataChart.set({query: {ids: ids}}).execute();
|
75
|
+
});
|
76
|
+
|
77
|
+
});
|
78
|
+
</script>
|
79
|
+
|
80
|
+
<style>
|
81
|
+
#content {
|
82
|
+
padding: 10px 2%;
|
83
|
+
}
|
84
|
+
.constrain {
|
85
|
+
max-width: 1000px;
|
86
|
+
padding: 30px 2%;
|
87
|
+
margin: 0 auto;
|
88
|
+
}
|
89
|
+
#embed-api-auth-container {
|
90
|
+
margin-bottom: 40px;
|
91
|
+
}
|
92
|
+
#chart-container {
|
93
|
+
width: 80%;
|
94
|
+
margin: 0 auto;
|
95
|
+
}
|
96
|
+
#view-selector-container {
|
97
|
+
width: 80%;
|
98
|
+
margin: 0 auto;
|
99
|
+
}
|
100
|
+
#view-selector-container table {
|
101
|
+
float: left;
|
102
|
+
display: block;
|
103
|
+
width: 30% !important;
|
104
|
+
margin: 0 auto;
|
105
|
+
}
|
106
|
+
#timeline > div {
|
107
|
+
margin: 0 auto;
|
108
|
+
}
|
109
|
+
</style>
|
data/config/routes.rb
CHANGED
data/lib/caboose/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: caboose-cms
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.5.
|
4
|
+
version: 0.5.129
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- William Barry
|
@@ -843,6 +843,7 @@ files:
|
|
843
843
|
- app/views/caboose/sites/admin_new.html.erb
|
844
844
|
- app/views/caboose/smtp/admin_edit.html.erb
|
845
845
|
- app/views/caboose/social/admin_edit.html.erb
|
846
|
+
- app/views/caboose/social/analytics.html.erb
|
846
847
|
- app/views/caboose/stackable_groups/admin_index.html.erb
|
847
848
|
- app/views/caboose/station/index.html.erb
|
848
849
|
- app/views/caboose/store/admin_edit.html.erb
|