caboose-cms 0.2.4 → 0.2.5

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,198 @@
1
+
2
+ var Model = function(params) {
3
+ for (var thing in params)
4
+ this[thing] = params[thing];
5
+ };
6
+
7
+ Model.prototype = {
8
+ name: false,
9
+ id: false,
10
+ attributes: [],
11
+ attributes_clean: [],
12
+ update_url: false,
13
+
14
+ save: function(attrib, after) {
15
+ var this2 = this;
16
+ $.ajax({
17
+ url: this.update_url,
18
+ type: 'put',
19
+ data: attrib + '=' + this.attributes[attrib],
20
+ success: function(resp) {
21
+ if (resp.success)
22
+ {
23
+ this2.attributes_clean[attrib] = this2.attributes[attrib];
24
+ if (resp.attributes && resp.attributes[attrib])
25
+ {
26
+ this2.attributes[attrib] = resp.attributes[attrib];
27
+ this2.attributes_clean[attrib] = resp.attributes[attrib];
28
+ }
29
+ }
30
+ after(resp);
31
+ },
32
+ error: function() {
33
+ after(false);
34
+ }
35
+ });
36
+ }
37
+ };
38
+
39
+ /******************************************************************************/
40
+
41
+ var BoundControl = function(model, attribute, el) {
42
+ this.init(model, attribute, el);
43
+ };
44
+
45
+ BoundControl.prototype = {
46
+ el: false,
47
+ check: false,
48
+ message: false,
49
+ model: false,
50
+ attribute: false,
51
+ binder: false,
52
+
53
+ init: function(model, attribute, el) {
54
+ this.model = model;
55
+ this.attribute = attribute;
56
+ this.el = el ? el : model.name.toLowerCase() + '_' + model.id + '_' + attribute;
57
+ this.check = this.el + '_check';
58
+ this.message = this.el + '_message';
59
+
60
+ $('#'+this.el).wrap($('<div/>')
61
+ .attr('id', this.el + '_container')
62
+ .css('position', 'relative')
63
+ );
64
+
65
+ var this2 = this;
66
+ $('#'+this.el).on('focus', function() { this2.edit(); });
67
+ //$('#'+this.el).keydown(function() {
68
+ // if (this2.model.attributes[attribute] != this2.model.attributes_clean[attribute])
69
+ // this2.edit();
70
+ //});
71
+ },
72
+
73
+ view: function() {
74
+ if ($('#'+this.check).length) $('#'+this.check).remove();
75
+ if ($('#'+this.message).length) $('#'+this.message).remove();
76
+ $('#'+this.el).val(this.model.attributes[this.attribute]);
77
+ },
78
+
79
+ edit: function() {
80
+ this.binder.cancel_active();
81
+ this.binder.active_control = this;
82
+
83
+ var w = $('#'+this.el).outerWidth();
84
+ var h = $('#'+this.el).outerHeight();
85
+ var this2 = this;
86
+ $('#'+this.el+'_container').prepend($('<div/>')
87
+ .attr('id', this.el + '_check')
88
+ .addClass('bound_input_check')
89
+ .css('position', 'absolute')
90
+ .css('top', 0)
91
+ .css('left', w-2)
92
+ .css('width', h+2)
93
+ .css('overflow', 'hidden')
94
+ .append($('<a/>')
95
+ .html('&#10003;')
96
+ .css('width', h)
97
+ .css('margin-left', -h)
98
+ .attr('href', '#')
99
+ .click(function(event) {
100
+ event.preventDefault();
101
+ this2.save();
102
+ })
103
+ )
104
+ );
105
+ $('#'+this.el+'_check a').animate({ 'margin-left': 0 }, 300);
106
+ },
107
+
108
+ save: function() {
109
+ $('#'+this.el+'_check a').addClass('loading');
110
+ this.model.attributes[this.attribute] = $('#'+this.el).val();
111
+
112
+ var this2 = this;
113
+ this.model.save(this.attribute, function(resp) {
114
+ $('#'+this2.el+'_check a').removeClass('loading');
115
+ if (resp.error) this2.error(resp.error);
116
+ else
117
+ {
118
+ this2.binder.active_control = this2;
119
+ //this2.view();
120
+ //if ($('#'+this.check).length) $('#'+this.check).remove();
121
+ //if ($('#'+this.message).length) $('#'+this.message).remove();
122
+ //$('#'+this.el).val(this.model.attributes[this.attribute]);
123
+ //$('#'+this2.el).focus();
124
+ }
125
+ });
126
+ },
127
+
128
+ cancel: function() {
129
+ this.model.attributes[this.attribute] = this.model.attributes_clean[this.attribute];
130
+ $('#'+this.el).val(this.model.attributes[this.attribute]);
131
+
132
+ if ($('#'+this.el+'_check a').length)
133
+ {
134
+ var this2 = this;
135
+ var h = $('#'+this.el).outerHeight();
136
+ $('#'+this.el+'_check a').animate({ 'margin-left': -h }, 300, function() {
137
+ this2.view();
138
+ });
139
+ }
140
+ else
141
+ this.view();
142
+ },
143
+
144
+ error: function(str) {
145
+ if (!$('#'+this.message).length)
146
+ $('#'+this.el+'_container').prepend($('<div/>').attr('id', this.message));
147
+ $('#'+this.message).html("<p class='note error'>" + str + "</p>");
148
+ }
149
+ };
150
+
151
+ /******************************************************************************/
152
+
153
+ var ModelBinder = function(params) { this.init(params); };
154
+
155
+ ModelBinder.prototype = {
156
+ model: false,
157
+ controls: [],
158
+ active_control: false,
159
+
160
+ init: function(params) {
161
+ this.model = new Model({
162
+ name: params['name'],
163
+ id: params['id'],
164
+ update_url: params['update_url'],
165
+ attributes: {},
166
+ attributes_clean: {}
167
+ });
168
+
169
+ var this2 = this;
170
+ $.each(params['attributes'], function(i, attrib) {
171
+ var el = (this2.model.name + '_' + this2.model.id + '_' + attrib).toLowerCase();
172
+ this2.model.attributes[attrib] = $('#'+el).val();
173
+ this2.model.attributes_clean[attrib] = $('#'+el).val();
174
+ var control = new BoundControl(this2.model, attrib);
175
+ control.binder = this2;
176
+ this2.controls.push();
177
+ });
178
+
179
+ $(document).keyup(function(e) {
180
+ if (e.keyCode == 27) this2.cancel_active(); // Escape
181
+ if (e.keyCode == 13) this2.save_active(); // Enter
182
+ });
183
+ },
184
+
185
+ cancel_active: function() {
186
+ if (!this.active_control)
187
+ return;
188
+ this.active_control.cancel();
189
+ this.active_control = false;
190
+ },
191
+
192
+ save_active: function() {
193
+ if (!this.active_control)
194
+ return;
195
+ this.active_control.save();
196
+ this.active_control = false;
197
+ },
198
+ };
@@ -12,3 +12,37 @@
12
12
  //
13
13
  //= require jquery
14
14
  //= require jquery_ujs
15
+
16
+ var CabooseModal = function(w, h) {
17
+ if (!h)
18
+ {
19
+ $('#modal_content').css('width', w);
20
+ h = $('#modal_content').outerHeight(true);
21
+ }
22
+ if (parent.$.fn.colorbox)
23
+ this.resize(w, h);
24
+ };
25
+
26
+ CabooseModal.prototype = {
27
+
28
+ width: 0,
29
+ height: 0,
30
+ set_width: function(w) { this.width = w; this.colorbox(); },
31
+ set_height: function(h) { this.height = h; this.colorbox(); },
32
+ resize: function(w, h) { this.width = w; this.height = h; this.colorbox(); },
33
+
34
+ // Resizes the height of the modal based on the content height
35
+ autosize: function(msg) {
36
+ if (msg)
37
+ $('#message').html(msg);
38
+ this.height = $('#modal_content').outerHeight(true);
39
+ this.colorbox();
40
+ },
41
+
42
+ colorbox: function() {
43
+ parent.$.fn.colorbox.resize({
44
+ innerWidth: '' + this.width + 'px',
45
+ innerHeight: '' + this.height + 'px'
46
+ });
47
+ }
48
+ };
@@ -1,46 +1,12 @@
1
1
 
2
2
  $(document).ready(function() {
3
- $('#caboose_login').colorbox({
4
- iframe: true,
5
- initialWidth: 400,
6
- initialHeight: 200,
7
- innerWidth: 400,
8
- innerHeight: 200,
9
- scrolling: false,
10
- transition: 'fade',
11
- closeButton: false,
12
- onComplete: fix_colorbox,
13
- opacity: 0.50
14
- });
15
- $('#caboose_register').colorbox({
16
- iframe: true,
17
- initialWidth: 400,
18
- initialHeight: 324,
19
- innerWidth: 400,
20
- innerHeight: 324,
21
- scrolling: false,
22
- transition: 'fade',
23
- closeButton: false,
24
- onComplete: fix_colorbox,
25
- opacity: 0.50
26
- });
27
- $.ajax({
28
- url: '/station/plugin-count',
29
- success: function (count) {
30
- $('#caboose_station').colorbox({
31
- iframe: true,
32
- innerWidth: 200,
33
- innerHeight: count * 50,
34
- transition: 'fade',
35
- closeButton: false,
36
- onComplete: fix_colorbox,
37
- opacity: 0.50
38
- });
39
- }
40
- });
3
+ $('#caboose_login' ).colorbox({ iframe: true, initialWidth: 400, initialHeight: 200, innerWidth: 400, innerHeight: 200, scrolling: false, transition: 'fade', closeButton: false, onComplete: fix_colorbox, opacity: 0.50 });
4
+ $('#caboose_register' ).colorbox({ iframe: true, initialWidth: 400, initialHeight: 324, innerWidth: 400, innerHeight: 324, scrolling: false, transition: 'fade', closeButton: false, onComplete: fix_colorbox, opacity: 0.50 });
5
+ $('#caboose_station' ).colorbox({ iframe: true, initialWidth: 200, initialHeight: 50, innerWidth: 200, innerHeight: 50, scrolling: false, transition: 'fade', closeButton: false, onComplete: fix_colorbox, opacity: 0.50 });
41
6
  });
42
7
 
43
8
  function fix_colorbox() {
9
+ var padding = 21; // 21 is default
44
10
  $("#cboxTopLeft" ).css('background', '#111');
45
11
  $("#cboxTopRight" ).css('background', '#111');
46
12
  $("#cboxBottomLeft" ).css('background', '#111');
@@ -50,6 +16,9 @@ function fix_colorbox() {
50
16
  $("#cboxTopCenter" ).css('background', '#111');
51
17
  $("#cboxBottomCenter" ).css('background', '#111');
52
18
  $("#cboxClose" ).hide();
19
+
20
+ //var p = (padding-21)*2;
21
+ //$("#cboxWrapper" ).css('padding', '0 ' + p + ' ' + p + ' 0');
53
22
  //$('#cboxLoadedContent').css('margin-bottom', 0);
54
23
  //h = $('#cboxLoadedContent').height();
55
24
  //$('#cboxLoadedContent').css('height', ''+(h+28)+'px');
@@ -1,204 +1,58 @@
1
1
 
2
- var CabooseStation = function() {};
2
+ var CabooseStation = function(m) {
3
+ this.modal = m;
4
+ this.init();
5
+ };
3
6
 
4
- CabooseStation = Class.extend({
5
- conductor: false,
6
- state: 'min', // left, right, or min
7
- open_tabs: [], // Currently open tabs
8
- wrapper_width: 0,
9
-
10
- init: function()
11
- {
12
- this.wrapper_width = $('#caboose_station_wrapper').width();
13
- this.attach_dom();
14
- $('body').css('overflow', 'scroll-y');
15
- //alert(this.open_tabs);
16
-
17
- if ($('#caboose_station_wrapper').hasClass('state_left'))
7
+ CabooseStation.prototype = {
8
+
9
+ modal: false,
10
+
11
+ init: function()
12
+ {
13
+ var this2 = this;
14
+ // Handle main nav items with subnav
15
+ $('#station > ul > li > a').click(function(event) {
16
+ li = $(this).parent();
17
+ if ($('ul', li).length > 0)
18
18
  {
19
- $('#caboose_station_wrapper').css('left', 0);
20
- $('#caboose_station_wrapper').show();
21
- this.state = 'left';
19
+ event.preventDefault();
20
+ id = li.attr('id').replace('nav_item_', '');
21
+ href = $(this).attr('href');
22
+ this2.subnav(id, href);
22
23
  }
23
- else if ($('#caboose_station_wrapper').hasClass('state_right'))
24
+ else if ($(this).attr('rel') != 'modal')
24
25
  {
25
- $('#caboose_station_wrapper').css('right', 0);
26
- $('#caboose_station_wrapper').show();
27
- this.state = 'right';
26
+ event.preventDefault();
27
+ parent.window.location = $(this).attr('href');
28
28
  }
29
- else
29
+ });
30
+ $('#station ul li ul li a').click(function(event) {
31
+ if ($(this).attr('rel') != 'modal')
30
32
  {
31
- $('#caboose_station_wrapper').css('right', 0);
32
- $('#caboose_station_wrapper').css('width', 0);
33
- $('#caboose_station_wrapper').show();
34
- this.state = 'min';
35
- }
36
- },
37
-
38
- attach_dom: function()
39
- {
40
- var this2 = this;
41
- $('#caboose_station li ul.visible').each(function (i,ul) {
42
- var id = $(this).parent().attr('id').replace('nav_item_', '');
43
- this2.open_tabs[this2.open_tabs.length] = id;
44
- });
45
-
46
- $('#caboose_conductor').click(function(event) {
47
- event.preventDefault();
48
- this2.right();
49
- });
50
- $('#caboose_station ul.hidden').hide();
51
- $('#caboose_station li a.top_level').click(function() {
52
- ul = $(this).parent().children("ul.hidden:first");
53
- var id = $(this).parent().attr('id').replace('nav_item_', '');
54
- if (ul.length)
55
- {
56
- ul.slideDown(200).addClass('visible').removeClass('hidden');
57
- this2.open_tabs[this2.open_tabs.length] = id;
58
- }
59
- else
60
- {
61
- ul = $(this).parent().children("ul:first");
62
- ul.hide().addClass('hidden').removeClass('visible');
63
-
64
- var index = this2.open_tabs.indexOf(id);
65
- if (index > -1)
66
- this2.open_tabs.splice(index, 1);
67
- }
68
- });
69
- $('#caboose_station li ul a').each(function(i, a) {
70
- var href = $(a).attr('href');
71
- $(a).click(function(event) {
72
- event.preventDefault();
73
- this2.open_url(href);
74
- })
75
- });
76
- $('#caboose_station a.close').click(function(event) {
77
- event.preventDefault();
78
-
79
- if (this2.state == 'left')
80
- this2.close_url($(this).attr('href'));
81
- else if (this2.state == 'right')
82
- this2.min();
83
- });
84
-
85
- $('#caboose_station li.my_account a').click(function(event) {
86
33
  event.preventDefault();
87
- this2.open_url($(this).attr('href'));
88
- });
89
- },
90
-
91
- min: function(func_after)
92
- {
93
- if (this.state == 'min')
94
- return;
95
- if (!func_after)
96
- func_after = function() {};
97
-
98
- // Assume you never go from left to min
99
- $('#caboose_station_wrapper').removeClass('state_left state_right').addClass('state_min');
100
- $('#caboose_station_wrapper').animate({ width: 0 }, 300);
101
- this.state = 'min';
102
- },
103
-
104
- left: function(func_after)
105
- {
106
- if (this.state == 'left')
107
- return;
108
- if (!func_after)
109
- func_after = function() {};
110
-
111
- // Assume you never go from min to left
112
- $('#caboose_station_wrapper').removeClass('state_min state_right').addClass('state_left');
113
- $('#caboose_station_wrapper').animate({ left: 0 }, 300, func_after);
114
- this.state = 'left';
115
- },
116
-
117
- right: function(func_after)
118
- {
119
- if (this.state == 'right')
120
- return;
121
- if (!func_after)
122
- func_after = function() {};
123
-
124
- $('#caboose_station_wrapper').removeClass('state_min state_left').addClass('state_right');
125
- if (this.state == 'left')
126
- {
127
- $('#caboose_station_wrapper').animate({ right: 0 }, 300, func_after);
34
+ parent.window.location = $(this).attr('href');
128
35
  }
129
- else if (this.state == 'min')
130
- {
131
- $('#caboose_station_wrapper').animate({ width: this.wrapper_width }, 300, func_after);
132
- }
133
- this.state = 'right';
134
- },
36
+ });
37
+ },
38
+
39
+ subnav: function(id, href)
40
+ {
41
+ this.modal.set_width(400);
135
42
 
136
- open_url: function(url)
137
- {
138
- // Send the station settings first
139
- var this2 = this;
140
- $.ajax({
141
- url: '/admin/station',
142
- type: 'put',
143
- data: {
144
- state: 'left',
145
- open_tabs: this2.open_tabs,
146
- return_url: window.location.pathname
147
- },
148
- success: function() {
149
- if (this2.state == 'left')
150
- {
151
- window.location = url;
152
- return;
153
- }
154
-
155
- var w = $(window).width() - $('#caboose_station').width();
156
- var h = $(window).height();
157
-
158
- $('#caboose_station_wrapper').after(
159
- $('<div/>')
160
- .attr('id', 'caboose_white')
161
- .css({
162
- position: 'absolute',
163
- right: 0,
164
- top: 0,
165
- width: 0,
166
- height: h,
167
- background: 'url(/assets/loading.gif) 40px 40px no-repeat #fff'
168
- })
169
- );
170
- $('#caboose_station_wrapper').removeClass('state_right').addClass('state_left');
171
- $('#caboose_station_wrapper').animate({ left: 0 }, 300, function() { window.location = url; });
172
- $('#caboose_white').animate({ width: '+=' + w }, 300);
173
- }
174
- });
175
- },
43
+ $('#station > ul > li').each(function(i, li) {
44
+ id2 = $(li).attr('id').replace('nav_item_', '');
45
+ if (id == id2)
46
+ $(li).addClass('selected');
47
+ else
48
+ $(li).removeClass('selected');
49
+ });
50
+ // Show only the selected subnav
51
+ $('#station ul li ul').hide();
52
+ $('#station ul li#nav_item_' + id + ' ul').show();
176
53
 
177
- close_url: function(url)
178
- {
179
- // Send the station settings first
180
- var this2 = this;
181
- $.ajax({
182
- url: '/admin/station',
183
- type: 'put',
184
- data: {
185
- state: 'right',
186
- open_tabs: this2.open_tabs,
187
- return_url: false
188
- },
189
- success: function() {
190
- var w = $(window).width() - $('#caboose_station').width();
191
- $('#caboose_station_wrapper').removeClass('state_left').addClass('state_right');
192
- $('#content_wrapper').animate({ marginLeft: '+=' + w }, 300);
193
- $('#caboose_station_wrapper').animate({ left: w }, 300, function() { window.location = url; })
194
- }
195
- });
196
- }
197
- });
198
-
199
- /******************************************************************************/
200
-
201
- var caboose_station = false;
202
- $(document).ready(function() {
203
- caboose_station = new CabooseStation();
204
- });
54
+ // Set the height of the selected subnav
55
+ var height = $('#station > ul').height();
56
+ $('#station ul li#nav_item_' + id + ' ul').height(height);
57
+ }
58
+ };
@@ -30,12 +30,14 @@ body {
30
30
 
31
31
  #modal_content {
32
32
  width: 100%;
33
+ padding: 0;
33
34
  }
34
35
 
35
36
  #modal_content h1 {
36
37
  margin: 0 0 12px 0;
37
38
  padding: 0;
38
- font-weight: normal;
39
+ font-weight: normal;
40
+ background: #111111;
39
41
  }
40
42
 
41
43
  #modal_content a {
@@ -63,6 +65,71 @@ input {
63
65
  -moz-border-radius: 2px;
64
66
  -webkit-border-radius: 2px;
65
67
  border-radius: 2px;
66
- font-size: 20px;
67
68
  padding: 4px 8px;
69
+ height: 34px;
70
+ font-size: 20px;
71
+ z-index: 20;
72
+ }
73
+
74
+ #modal_content .bound_input_check a,
75
+ #modal_content .bound_input_cancel a {
76
+ border: 1px solid #ccc;
77
+ -moz-border-radius: 2px;
78
+ -webkit-border-radius: 2px;
79
+ border-radius: 2px;
80
+
81
+ font-size: 28px;
82
+ text-align: center;
83
+ background: #00cc00;
84
+ color: #fff;
85
+
86
+ display: block;
87
+ padding: 4px 0;
88
+ height: 34px;
89
+ }
90
+
91
+ #modal_content .bound_input_check a.loading {
92
+ background-image: url(/assets/caboose/loading_green.gif);
93
+ background-color: #00cc00;
94
+ background-repeat: no-repeat;
95
+ background-position: 6px 5px;
96
+ color: rgba(255, 255, 255, 0.0);
97
+ }
98
+
99
+ #modal_content .search_form {
100
+ position: absolute;
101
+ top: 0;
102
+ right: 0;
103
+ }
104
+
105
+ #modal_content table.data th {
106
+ background: #222222;
107
+ border: #333 1px solid;
108
+ color: #fff;
109
+ }
110
+
111
+ #modal_content table.data td {
112
+ background: #111111;
113
+ border: #333 1px solid;
114
+ color: #fff;
115
+ }
116
+
117
+ /*******************************************************************************
118
+ Modeljs
119
+ *******************************************************************************/
120
+
121
+ #modal_content div.model_attribute_text {
122
+ color: #fff;
123
+ }
124
+
125
+ #modal_content .model_attribute {
126
+ background: none repeat scroll 0 0 transparent;
127
+ display: block;
128
+ padding: 2px 4px;
129
+ text-decoration: none;
130
+ }
131
+
132
+ #modal_content .clear {
133
+ clear: both;
134
+ line-height: 0;
68
135
  }
@@ -5,7 +5,11 @@ module Caboose
5
5
 
6
6
  # GET /station
7
7
  def index
8
- @user = logged_in_user
8
+ @user = logged_in_user
9
+
10
+ if (@user.nil? || @user == Caboose::User.logged_out_user)
11
+ redirect_to "/login"
12
+ end
9
13
  end
10
14
 
11
15
  # GET /station/plugin-count
@@ -1,7 +1,7 @@
1
1
 
2
2
  module Caboose
3
3
  class UsersController < ApplicationController
4
- layout 'caboose/admin'
4
+ layout 'caboose/modal'
5
5
 
6
6
  def before_action
7
7
  @page = Page.page_with_uri('/admin')
@@ -39,6 +39,12 @@ module Caboose
39
39
  @roles = Role.roles_with_user(@edituser.id)
40
40
  end
41
41
 
42
+ # GET /admin/users/1/edit-password
43
+ def edit_password
44
+ return if !user_is_allowed('users', 'edit')
45
+ @edituser = User.find(params[:id])
46
+ end
47
+
42
48
  # POST /admin/users
43
49
  def create
44
50
  return if !user_is_allowed('users', 'add')
@@ -133,7 +133,7 @@ module Caboose
133
133
  # key = sort field, value = text to display
134
134
  cols.each do |sort, text|
135
135
  desc = @options['sort'] == sort ? (@options['desc'] ? 0 : 1) : 0
136
- arrow = @options['sort'] == sort ? (@options['desc'] ? ' &uarr' : ' &darr') : ''
136
+ arrow = @options['sort'] == sort ? (@options['desc'] ? ' &uarr;' : ' &darr;') : ''
137
137
  link = @options['base_url'] + "?#{vars}&sort=#{sort}&desc=#{desc}"
138
138
  str += "<th><a href='#{link}'>#{text}#{arrow}</a></th>\n"
139
139
  end
@@ -12,13 +12,15 @@ class Caboose::UserPlugin < Caboose::CaboosePlugin
12
12
  if (user.is_allowed('users', 'view'))
13
13
  item['children'] << {
14
14
  'href' => '/admin/users',
15
- 'text' => 'View All Users'
15
+ 'text' => 'View All Users',
16
+ 'modal' => true,
16
17
  }
17
18
  end
18
19
  if (user.is_allowed('users', 'add'))
19
20
  item['children'] << {
20
21
  'href' => '/admin/users/new',
21
- 'text' => 'New User'
22
+ 'text' => 'New User',
23
+ 'modal' => true,
22
24
  }
23
25
  end
24
26
  nav << item
@@ -1,12 +1,4 @@
1
1
 
2
- <%= content_for :caboose_js do %>
3
- <%= javascript_include_tag "caboose/login" %>
4
- <% end %>
5
-
6
- <%= content_for :caboose_css do %>
7
- <%= stylesheet_link_tag "caboose/login", :media => "all" %>
8
- <% end %>
9
-
10
2
  <form action='/login' method='post' id='login_form'>
11
3
  <p class='other_options'>
12
4
  <a href='/register'>Need to register?</a>
@@ -24,7 +16,29 @@
24
16
 
25
17
  <% content_for :caboose_js do %>
26
18
  <script type='text/javascript'>
27
- if (parent.$.fn.colorbox)
28
- parent.$.fn.colorbox.resize({ 'innerWidth': 400, 'innerHeight': 200 });
19
+ var modal = new CabooseModal(400);
20
+ function login()
21
+ {
22
+ modal.autosize("<p class='loading'>Logging in...</p>");
23
+ $.ajax({
24
+ url: '/login',
25
+ type: 'post',
26
+ data: $('#login_form').serialize(),
27
+ success: function(resp) {
28
+ if (resp.error)
29
+ modal.autosize("<p class='note error'>" + resp.error + "</p>");
30
+ else if (resp.redirect != false)
31
+ parent.window.location = resp.redirect;
32
+ else
33
+ parent.location.reload(true);
34
+ },
35
+ error: function() {
36
+ modal.autosize("<p class='note error'>Error</p>");
37
+ }
38
+ });
39
+ }
29
40
  </script>
30
41
  <% end %>
42
+ <%= content_for :caboose_css do %>
43
+ <%= stylesheet_link_tag "caboose/login", :media => "all" %>
44
+ <% end %>
@@ -1,12 +1,4 @@
1
1
 
2
- <%= content_for :caboose_js do %>
3
- <%= javascript_include_tag "caboose/register" %>
4
- <% end %>
5
-
6
- <%= content_for :caboose_css do %>
7
- <%= stylesheet_link_tag "caboose/register", :media => "all" %>
8
- <% end %>
9
-
10
2
  <form action='/register' method='post' id='register_form'>
11
3
  <p class='other_options'>
12
4
  <a href='/login'>Already a member?</a>
@@ -26,7 +18,29 @@
26
18
 
27
19
  <% content_for :caboose_js do %>
28
20
  <script type='text/javascript'>
29
- if (parent.$.fn.colorbox)
30
- parent.$.fn.colorbox.resize({ 'innerWidth': 400, 'innerHeight': 324 });
21
+ var modal = new CabooseModal(400);
22
+ function register()
23
+ {
24
+ modal.autosize("<p class='loading'>Registering...</p>");
25
+ $.ajax({
26
+ url: '/register',
27
+ type: 'post',
28
+ data: $('#register_form').serialize(),
29
+ success: function(resp) {
30
+ if (resp.error)
31
+ modal.autosize("<p class='note error'>" + resp.error + "</p>");
32
+ else if (resp.redirect != false)
33
+ window.location = resp.redirect;
34
+ else
35
+ parent.location.reload(true);
36
+ },
37
+ error: function() {
38
+ modal.autosize("<p class='note error'>Error</p>");
39
+ }
40
+ });
41
+ }
31
42
  </script>
32
43
  <% end %>
44
+ <%= content_for :caboose_css do %>
45
+ <%= stylesheet_link_tag "caboose/register", :media => "all" %>
46
+ <% end %>
@@ -1,34 +1,39 @@
1
+ <%
2
+ @nav = Caboose.plugin_hook('admin_nav', [], @user, @page)
3
+ return_url = session[:caboose_station_return_url].nil? ? '/' : session[:caboose_station_return_url]
4
+ return_url = '/' if return_url.starts_with?('/admin/') || return_url == '/admin'
5
+ %>
1
6
 
2
7
  <%= content_for :caboose_js do %>
8
+ <%= javascript_include_tag "caboose/station" %>
3
9
  <script type='text/javascript'>
4
- var plugin_count = <%= Caboose::plugins.count %>;
10
+ var modal = false;
11
+ var station = false;
12
+ $(document).ready(function() {
13
+ modal = new CabooseModal(200);
14
+ station = new CabooseStation(modal);
15
+ });
5
16
  </script>
6
- <%= javascript_include_tag "caboose/station_modal" %>
7
17
  <% end %>
8
18
  <%= content_for :caboose_css do %>
9
19
  <%= stylesheet_link_tag "caboose/station_modal", :media => "all" %>
10
20
  <% end %>
11
21
 
12
- <%
13
- @nav = Caboose.plugin_hook('admin_nav', [], @user, @page)
14
- return_url = session[:caboose_station_return_url].nil? ? '/' : session[:caboose_station_return_url]
15
- return_url = '/' if return_url.starts_with?('/admin/') || return_url == '/admin'
16
- %>
17
-
18
- <% if (@user.nil? || @user == Caboose::User.logged_out_user) %>
19
- <h2>Caboose Station</h2>
20
- <a href='/login' class='login'>Login</a>
21
- <% else %>
22
22
  <div id='station'>
23
23
  <ul>
24
+ <li id='nav_item_logout'><a href='/logout'><span class='icon'></span><span class='text'>Logout</span></a>
25
+ <li id='nav_item_myaccount'><a href='/my-account'><span class='icon'></span><span class='text'>My Account</span></a>
24
26
  <% i = 0 %>
25
27
  <% @nav.each do |item| %>
26
28
  <% id = item['id'].nil? ? i.to_s : item['id'] %>
27
- <li id='nav_item_<%= id %>'><a href='#'><span class='icon'></span><span class='text'><%= item['text'] %></span></a>
29
+ <% href = item['href'].nil? ? '#' : item['href'] %>
30
+ <% modal = item['modal'].nil? ? false : item['modal'] %>
31
+ <li id='nav_item_<%= id %>'><a href='<%= href %>'<%= raw (modal ? " rel='modal'" : "") %>><span class='icon'></span><span class='text'><%= item['text'] %></span></a>
28
32
  <% if (!item['children'].nil? && item['children'].count > 0) %>
29
33
  <ul style='display: none;'>
30
34
  <% item['children'].each do |item2| %>
31
- <li><a href='<%= item2['href'] %>'><%= item2['text'] %></a></li>
35
+ <% modal = item2['modal'].nil? ? false : item2['modal'] %>
36
+ <li><a href='<%= item2['href'] %>'<%= raw (modal ? " rel='modal'" : "") %>><%= item2['text'] %></a></li>
32
37
  <% end %>
33
38
  </ul>
34
39
  <% end %>
@@ -37,4 +42,3 @@ return_url = '/' if return_url.starts_with?('/admin/') || return_url == '/admin'
37
42
  <% end %>
38
43
  </ul>
39
44
  </div>
40
- <% end %>
@@ -1,51 +1,86 @@
1
-
1
+ <%
2
+ gravatar_id = Digest::MD5.hexdigest(@edituser.email.downcase)
3
+ pic = "http://gravatar.com/avatar/#{gravatar_id}.png?s=150" #&d=/assets/caboose/default_user_pic.png"
4
+ %>
2
5
  <h1>Edit User</h1>
3
- <div id='user_<%= @edituser.id %>_container'></div>
6
+ <p id='gravatar'><img src='<%= pic %>' /><a href='http://gravatar.com'>Update on gravatar</a></p>
7
+ <p><input type='text' id='user_<%= @edituser.id %>_first_name' value="<%= @edituser.first_name %>" placeholder='First name' /></p>
8
+ <p><input type='text' id='user_<%= @edituser.id %>_last_name' value="<%= @edituser.last_name %>" placeholder='Last name' /></p>
9
+ <p><input type='text' id='user_<%= @edituser.id %>_username' value="<%= @edituser.username %>" placeholder='Username' /></p>
10
+ <p><input type='text' id='user_<%= @edituser.id %>_email' value="<%= @edituser.email %>" placeholder='Email' /></p>
11
+ <div id='message'></div>
12
+ <div id='controls'>
13
+ <input type='button' value='Back' onclick="window.location='/admin/users';" />
14
+ <input type='button' value='Reset Password' onclick="window.location='/admin/users/<%= @edituser.id %>/edit-password';" />
15
+ <input type='button' value='Delete User' onclick="deleteUser();" />
16
+ </div>
17
+
18
+ <% content_for :caboose_css do %>
19
+ <style type='text/css'>
20
+ #gravatar {
21
+ float: right;
22
+ width: 150px;
23
+ text-align: right;
24
+ margin: 0 4px 0 0;
25
+ padding: 0;
26
+ }
27
+ #gravatar img {
28
+ border: #fff 2px solid;
29
+ }
30
+ </style>
31
+ <% end %>
4
32
 
5
33
  <% content_for :caboose_js do %>
6
- <%= javascript_include_tag "caboose/model.form.user" %>
34
+ <%= javascript_include_tag "caboose/bound_input.js" %>
7
35
  <script type="text/javascript">
8
36
 
37
+ var model = false;
9
38
  $(document).ready(function() {
10
- var user = new Model({
11
- form: 'Model.Form.User',
39
+
40
+ m = new ModelBinder({
12
41
  name: 'User',
13
42
  id: <%= @edituser.id %>,
14
- listing_url: 'get /admin/users',
15
- update_url: 'put /admin/users/<%= @edituser.id %>',
16
- delete_url: 'delete /admin/users/<%= @edituser.id %>',
17
- attributes: [
18
- { name: 'first_name' , type: 'text', value: "<%= @edituser.first_name %>" },
19
- { name: 'last_name' , type: 'text', value: "<%= @edituser.last_name %>" },
20
- { name: 'username' , type: 'text', value: "<%= @edituser.username %>" },
21
- { name: 'email' , type: 'text', value: "<%= @edituser.email %>" },
22
- { name: 'password' , type: 'password' },
23
- {
24
- name: 'roles',
25
- type: 'checkbox-multiple',
26
- value: <%= @roles.collect{|r| r.id}.to_json %>,
27
- text: "<%= @roles.collect{|r| r.name}.join(', ') %>",
28
- empty_text: '[No roles]',
29
- multiple: true,
30
- loading_message: 'Getting roles...',
31
- options_url: '/admin/roles/options'
32
- },
33
- {
34
- name: 'pic',
35
- type: 'image',
36
- value: '',
37
- update_url: '/admin/users/<%= @edituser.id %>/update-pic'
38
- }
39
- ]
40
- });
43
+ update_url: '/admin/users/<%= @edituser.id %>',
44
+ attributes: ['first_name', 'last_name', 'username', 'email']
45
+ });
46
+
47
+ modal = new CabooseModal(500);
41
48
  });
42
49
 
43
- </script>
44
- <% end %>
50
+ // var user = new Model({
51
+ // form: 'Model.Form.User',
52
+ // finished_loading: function() {
53
+ // modal = new CabooseModal(500);
54
+ // },
55
+ // name: 'User',
56
+ // id: <%= @edituser.id %>,
57
+ // listing_url: 'get /admin/users',
58
+ // update_url: 'put /admin/users/<%= @edituser.id %>',
59
+ // delete_url: 'delete /admin/users/<%= @edituser.id %>',
60
+ // attributes: [
61
+ // { name: 'first_name' , type: 'text', value: "<%= @edituser.first_name %>", show_reminder: false },
62
+ // { name: 'last_name' , type: 'text', value: "<%= @edituser.last_name %>", show_reminder: false },
63
+ // { name: 'username' , type: 'text', value: "<%= @edituser.username %>", show_reminder: false },
64
+ // { name: 'email' , type: 'text', value: "<%= @edituser.email %>", show_reminder: false },
65
+ // { name: 'password' , type: 'password' },
66
+ // {
67
+ // name: 'roles',
68
+ // type: 'checkbox-multiple',
69
+ // value: <%= @roles.collect{|r| r.id}.to_json %>,
70
+ // text: "<%= @roles.collect{|r| r.name}.join(', ') %>",
71
+ // empty_text: '[No roles]',
72
+ // multiple: true,
73
+ // loading_message: 'Getting roles...',
74
+ // options_url: '/admin/roles/options'
75
+ // },
76
+ // {
77
+ // name: 'pic',
78
+ // type: 'image',
79
+ // value: '',
80
+ // update_url: '/admin/users/<%= @edituser.id %>/update-pic'
81
+ // }
82
+ // ]
83
+ // });
45
84
 
46
- <% content_for :caboose_js do %>
47
- <script type='text/javascript'>
48
- if (parent.$.fn.colorbox)
49
- parent.$.fn.colorbox.resize({ 'innerWidth': 600, 'innerHeight': 400 });
50
85
  </script>
51
86
  <% end %>
@@ -0,0 +1,34 @@
1
+
2
+ <h1>Reset Password for <%= "#{@edituser.first_name} #{@edituser.last_name}" %></h1>
3
+ <p><input type='password' name='password' id='password' value="" placeholder='Password' /></p>
4
+ <p><input type='password' name='password2' id='password2' value="" placeholder='Confirm password' /></p>
5
+ <div id='message'></div>
6
+ <div id='controls'>
7
+ <input type='button' value='Back' onclick="window.location='/admin/users/<%= @edituser.id %>/edit';" />
8
+ <input type='button' value='Update Password' onclick="udpatePassword();" />
9
+ </div>
10
+
11
+ <% content_for :caboose_js do %>
12
+ <script type="text/javascript">
13
+ var modal = false;
14
+ $(document).ready(function() {
15
+ modal = new CabooseModal(500);
16
+ });
17
+
18
+ function updatePassword()
19
+ {
20
+ $.ajax({
21
+ url: '/admin/users/update-password',
22
+ type: 'post',
23
+ success: function(resp) {
24
+ if (resp.success)
25
+ modal.autosize("<p class='note success'>" + resp.success + "</p>");
26
+ if (resp.error)
27
+ modal.autosize("<p class='note success'>" + resp.error + "</p>");
28
+ if (resp.redirect)
29
+ window.location = resp.redirect;
30
+ }
31
+ });
32
+ }
33
+ </script>
34
+ <% end %>
@@ -1,15 +1,10 @@
1
1
  <h1>Users</h1>
2
2
 
3
- <form action='/admin/users' method='get'>
4
- <table cellpadding='4' cellspacing='0' border='0'>
5
- <tr><td>First name: </td><td><input type='text' name='first_name' value='<%= @gen.params['first_name'] %>' style='width: 200px;' /></td></tr>
6
- <tr><td>Last name: </td><td><input type='text' name='last_name' value='<%= @gen.params['last_name'] %>' style='width: 200px;' /></td></tr>
7
- <tr><td>Username: </td><td><input type='text' name='username' value='<%= @gen.params['username'] %>' style='width: 200px;' /></td></tr>
8
- </table><br />
9
- <p><input type='submit' value='Search' /></p>
3
+ <form action='/admin/users' method='get' class='search_form'>
4
+ <input type='text' name='search' placeholder='Search' />
10
5
  </form>
11
6
 
12
- <table class='data'>
7
+ <table class='data' id='users_table'>
13
8
  <tr>
14
9
  <%= raw @gen.sortable_table_headings({
15
10
  'first_name' => 'First Name',
@@ -33,6 +28,8 @@
33
28
 
34
29
  <% content_for :caboose_js do %>
35
30
  <script type='text/javascript'>
36
- parent.$.fn.colorbox.resize({ 'innerWidth': 600, 'innerHeight': 400 });
31
+ $(document).ready(function() {
32
+ var modal = new CabooseModal(500);
33
+ });
37
34
  </script>
38
35
  <% end %>
@@ -11,14 +11,14 @@ Caboose::Engine.routes.draw do
11
11
  get "register" => "register#index"
12
12
  post "register" => "register#register"
13
13
 
14
- get "admin/users" => "users#index"
15
- get "admin/users/options" => "users#options"
16
- get "admin/users/new" => "users#new"
17
- post "admin/users/:id/update-pic" => "users#update_pic"
18
- get "admin/users/:id/edit" => "users#edit"
19
- put "admin/users/:id" => "users#update"
20
- post "admin/users" => "users#create"
21
- delete "admin/users/:id" => "users#destroy"
14
+ get "admin/users" => "users#index"
15
+ get "admin/users/options" => "users#options"
16
+ get "admin/users/new" => "users#new"
17
+ get "admin/users/:id/edit-password" => "users#edit_password"
18
+ get "admin/users/:id/edit" => "users#edit"
19
+ put "admin/users/:id" => "users#update"
20
+ post "admin/users" => "users#create"
21
+ delete "admin/users/:id" => "users#destroy"
22
22
 
23
23
  get "admin/roles" => "roles#index"
24
24
  get "admin/roles/options" => "roles#options"
@@ -1,3 +1,3 @@
1
1
  module Caboose
2
- VERSION = '0.2.4'
2
+ VERSION = '0.2.5'
3
3
  end
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.2.4
4
+ version: 0.2.5
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-27 00:00:00.000000000 Z
12
+ date: 2013-07-02 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: rails
@@ -98,7 +98,7 @@ dependencies:
98
98
  requirements:
99
99
  - - '='
100
100
  - !ruby/object:Gem::Version
101
- version: 0.0.9
101
+ version: 0.0.10
102
102
  type: :runtime
103
103
  prerelease: false
104
104
  version_requirements: !ruby/object:Gem::Requirement
@@ -106,7 +106,7 @@ dependencies:
106
106
  requirements:
107
107
  - - '='
108
108
  - !ruby/object:Gem::Version
109
- version: 0.0.9
109
+ version: 0.0.10
110
110
  - !ruby/object:Gem::Dependency
111
111
  name: tinymce-rails
112
112
  requirement: !ruby/object:Gem::Requirement
@@ -166,20 +166,21 @@ files:
166
166
  - app/assets/images/caboose/caboose_logo_small.png
167
167
  - app/assets/images/caboose/caboose_nav.png
168
168
  - app/assets/images/caboose/caboose_nav_black.png
169
+ - app/assets/images/caboose/default_user_pic.png
170
+ - app/assets/images/caboose/loading_green.gif
169
171
  - app/assets/images/caboose/loading_small_white_on_black.gif
170
172
  - app/assets/images/caboose/loading_white_on_black.gif
171
173
  - app/assets/javascripts/caboose/admin.js
172
174
  - app/assets/javascripts/caboose/application.js
173
- - app/assets/javascripts/caboose/login.js
175
+ - app/assets/javascripts/caboose/bound_input.js
174
176
  - app/assets/javascripts/caboose/modal.js
175
177
  - app/assets/javascripts/caboose/modal_integration.js
176
178
  - app/assets/javascripts/caboose/model.form.page.js
177
179
  - app/assets/javascripts/caboose/model.form.user.js
178
- - app/assets/javascripts/caboose/register.js
179
180
  - app/assets/javascripts/caboose/station.js
180
- - app/assets/javascripts/caboose/station_modal.js
181
181
  - app/assets/stylesheets/caboose/admin.css
182
182
  - app/assets/stylesheets/caboose/application.css
183
+ - app/assets/stylesheets/caboose/bound_input.css
183
184
  - app/assets/stylesheets/caboose/caboose.css
184
185
  - app/assets/stylesheets/caboose/fonts/big_noodle_titling.ttf
185
186
  - app/assets/stylesheets/caboose/fonts/big_noodle_titling_oblique.ttf
@@ -247,6 +248,7 @@ files:
247
248
  - app/views/caboose/settings/new.html.erb
248
249
  - app/views/caboose/station/index.html.erb
249
250
  - app/views/caboose/users/edit.html.erb
251
+ - app/views/caboose/users/edit_password.html.erb
250
252
  - app/views/caboose/users/index.html.erb
251
253
  - app/views/caboose/users/new.html.erb
252
254
  - app/views/caboose/users/update_pic.html.erb
@@ -1,25 +0,0 @@
1
-
2
- function login()
3
- {
4
- $('#message').hide();
5
- $('#message').html("<p class='loading'>Logging in...</p>");
6
- $('#message').slideDown({ duration: 350 });
7
- parent.$.fn.colorbox.resize({ height:"340px" })
8
-
9
- $.ajax({
10
- url: '/login',
11
- type: 'post',
12
- data: $('#login_form').serialize(),
13
- success: function(resp) {
14
- if (resp.error)
15
- $('#message').html("<p class='note error'>" + resp.error + "</p>");
16
- else if (resp.redirect != false)
17
- parent.window.location = resp.redirect;
18
- else
19
- parent.location.reload(true);
20
- },
21
- error: function() {
22
- $('#message').html("<p class='note error'>Error</p>");
23
- }
24
- });
25
- }
@@ -1,29 +0,0 @@
1
-
2
- function register()
3
- {
4
- resize_colorbox("<p class='loading'>Registering...</p>");
5
-
6
- $.ajax({
7
- url: '/register',
8
- type: 'post',
9
- data: $('#register_form').serialize(),
10
- success: function(resp) {
11
- if (resp.error)
12
- resize_colorbox("<p class='note error'>" + resp.error + "</p>");
13
- else if (resp.redirect != false)
14
- window.location = resp.redirect;
15
- else
16
- parent.location.reload(true);
17
- },
18
- error: function() {
19
- $('#message').html("<p class='note error'>Error</p>");
20
- }
21
- });
22
- }
23
-
24
- function resize_colorbox(html)
25
- {
26
- $('#message').html(html);
27
- height = $('#modal_content').outerHeight(true);
28
- parent.$.fn.colorbox.resize({ innerHeight: '' + height + 'px' })
29
- }
@@ -1,42 +0,0 @@
1
-
2
- $(document).ready(function() {
3
-
4
- // Make the main nav open the subnav
5
- $('#station > ul > li > a').each(function(i, a) {
6
- var href = $(a).attr('href');
7
- $(a).click(function(event) {
8
- event.preventDefault();
9
- id = $(this).parent().attr('id').replace('nav_item_', '');
10
- caboose_subnav(id, href);
11
- })
12
- });
13
-
14
- // Make the subnav links take over the entire page instead of just the iframe
15
- $('#station ul li ul li a').each(function(i, a) {
16
- var href = $(a).attr('href');
17
- $(a).click(function(event) {
18
- event.preventDefault();
19
- parent.window.location = href;
20
- })
21
- });
22
-
23
- });
24
-
25
- function caboose_subnav(id, href)
26
- {
27
- parent.$.fn.colorbox.resize({ innerHeight: plugin_count * 50, innerWidth: '400px' });
28
-
29
- $('#station > ul > li').each(function(i, li) {
30
- id2 = $(li).attr('id').replace('nav_item_', '');
31
- if (id == id2)
32
- $(li).addClass('selected');
33
- else
34
- $(li).removeClass('selected');
35
- });
36
-
37
- $('#station ul li ul').hide();
38
- $('#station ul li#nav_item_' + id + ' ul').show();
39
-
40
- var height = $('#station > ul').height();
41
- $('#station ul li#nav_item_' + id + ' ul').height(height);
42
- }