mirror of
https://github.com/fspc/BikeShed-1.git
synced 2026-09-17 00:41:38 -04:00
Compare commits
36
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4b9f0169bc | ||
|
|
b7ad63a2e5 | ||
|
|
62310e7a25 | ||
|
|
cfeb6fd1d2 | ||
|
|
ec5db646a0 | ||
|
|
de266e72d9 | ||
|
|
67c51068cc | ||
|
|
8c6513099d | ||
|
|
47f616b7b0 | ||
|
|
087325c444 | ||
|
|
3c4e5c21c2 | ||
|
|
69c01b8225 | ||
|
|
0aa9c16dbd | ||
|
|
e491c0530c | ||
|
|
3599cc2bbb | ||
|
|
cecb3b1a32 | ||
|
|
611b1b1151 | ||
|
|
5e80c8866a | ||
|
|
835e73ea97 | ||
|
|
cb2acd19ba | ||
|
|
ee12bfee8a | ||
|
|
4d008163e1 | ||
|
|
06856f115c | ||
|
|
a9fb3487a1 | ||
|
|
869b67d3e4 | ||
|
|
cd4f891c95 | ||
|
|
71a4bb0af4 | ||
|
|
f1214ab7e6 | ||
|
|
aaa6fda90c | ||
|
|
4a7751959c | ||
|
|
028a45702e | ||
|
|
1a8b9c9247 | ||
|
|
4e7f3a1761 | ||
|
|
a6b41b5560 | ||
|
|
4d7634605c | ||
|
|
cf922be1b1 |
@@ -7,5 +7,6 @@ tmp/
|
|||||||
.rbenv-version
|
.rbenv-version
|
||||||
.DS_Store
|
.DS_Store
|
||||||
public/extjs
|
public/extjs
|
||||||
|
public/assets
|
||||||
public/images/icons
|
public/images/icons
|
||||||
config/database.yml
|
config/database.yml
|
||||||
|
|||||||
+4
-4
@@ -122,13 +122,13 @@ GEM
|
|||||||
treetop (~> 1.4.8)
|
treetop (~> 1.4.8)
|
||||||
method_source (0.8.1)
|
method_source (0.8.1)
|
||||||
mime-types (1.22)
|
mime-types (1.22)
|
||||||
multi_json (1.7.2)
|
multi_json (1.7.9)
|
||||||
netzke-basepack (0.8.2)
|
netzke-basepack (0.8.4)
|
||||||
netzke-core (~> 0.8.2)
|
netzke-core (~> 0.8.2)
|
||||||
netzke-cancan (0.8.2)
|
netzke-cancan (0.8.2)
|
||||||
cancan
|
cancan
|
||||||
netzke-core
|
netzke-core
|
||||||
netzke-core (0.8.3)
|
netzke-core (0.8.4)
|
||||||
execjs
|
execjs
|
||||||
uglifier
|
uglifier
|
||||||
nokogiri (1.5.9)
|
nokogiri (1.5.9)
|
||||||
@@ -208,7 +208,7 @@ GEM
|
|||||||
railties (>= 3.1)
|
railties (>= 3.1)
|
||||||
therubyracer (~> 0.10.1)
|
therubyracer (~> 0.10.1)
|
||||||
tzinfo (0.3.37)
|
tzinfo (0.3.37)
|
||||||
uglifier (1.3.0)
|
uglifier (2.1.2)
|
||||||
execjs (>= 0.3.0)
|
execjs (>= 0.3.0)
|
||||||
multi_json (~> 1.0, >= 1.0.2)
|
multi_json (~> 1.0, >= 1.0.2)
|
||||||
warden (1.1.1)
|
warden (1.1.1)
|
||||||
|
|||||||
@@ -28,11 +28,6 @@
|
|||||||
1. Download icons from http://www.famfamfam.com/lab/icons/silk/
|
1. Download icons from http://www.famfamfam.com/lab/icons/silk/
|
||||||
1. Link to the icons under `public/images/icons`: (From app root) `ln -s /MY/PATH/famfamfam_silk_icons/icons public/images/icons`
|
1. Link to the icons under `public/images/icons`: (From app root) `ln -s /MY/PATH/famfamfam_silk_icons/icons public/images/icons`
|
||||||
|
|
||||||
## Mailcatcher
|
|
||||||
|
|
||||||
Use mailcatcher to see what emails look like in development.
|
|
||||||
Follow the instructions from http://mailcatcher.me/ to create an rvm wrapper so you don't install it all over your gemsets
|
|
||||||
|
|
||||||
# License
|
# License
|
||||||
Velocipede is released under the MIT license (http://opensource.org/licenses/MIT)
|
Velocipede is released under the MIT license (http://opensource.org/licenses/MIT)
|
||||||
|
|
||||||
|
|||||||
@@ -19,11 +19,8 @@ class BikeLogs < Netzke::Basepack::Grid
|
|||||||
c.columns = [
|
c.columns = [
|
||||||
{ :name => :start_date, :format => "g:ia - D, M j - Y", :width => 165, :default_value => Time.now.to_formatted_s(:db) },
|
{ :name => :start_date, :format => "g:ia - D, M j - Y", :width => 165, :default_value => Time.now.to_formatted_s(:db) },
|
||||||
{ :name => :end_date, :hidden => true, :default_value => Time.now.to_formatted_s(:db) },
|
{ :name => :end_date, :hidden => true, :default_value => Time.now.to_formatted_s(:db) },
|
||||||
{ :name => :hours, :getter => lambda { |rec| (rec.end_date - rec.start_date)/3600 }, :sorting_scope => :sort_by_duration},
|
|
||||||
:description,
|
:description,
|
||||||
{ :name => :bike_action__action, :text => 'Action'},
|
{ :name => :bike_action__action, :text => 'Action'},
|
||||||
{ :name => :created_at, :read_only => true},
|
|
||||||
{ :name => :updated_at, :read_only => true},
|
|
||||||
{ :name => :logged_by, :getter => lambda{ |rec|
|
{ :name => :logged_by, :getter => lambda{ |rec|
|
||||||
user = User.find_by_id(rec.logger_id)
|
user = User.find_by_id(rec.logger_id)
|
||||||
user.nil? ? "" : "#{user.first_name} #{user.last_name}"
|
user.nil? ? "" : "#{user.first_name} #{user.last_name}"
|
||||||
@@ -48,7 +45,6 @@ class BikeLogs < Netzke::Basepack::Grid
|
|||||||
def default_fields_for_forms
|
def default_fields_for_forms
|
||||||
[
|
[
|
||||||
{ :name => :start_date},
|
{ :name => :start_date},
|
||||||
{ :name => :end_date},
|
|
||||||
{ :name => :description},
|
{ :name => :description},
|
||||||
#had to hack acts_as_loggable/log.rb to get this to work
|
#had to hack acts_as_loggable/log.rb to get this to work
|
||||||
{ :name => :bike_action__action, :field_label => 'Action'}
|
{ :name => :bike_action__action, :field_label => 'Action'}
|
||||||
|
|||||||
+11
-8
@@ -2,11 +2,14 @@ class Bikes < Netzke::Basepack::Grid
|
|||||||
def configure(c)
|
def configure(c)
|
||||||
super
|
super
|
||||||
c.model = "Bike"
|
c.model = "Bike"
|
||||||
|
|
||||||
|
# columns with :id set, have :min_chars set in init_component
|
||||||
|
# See: http://stackoverflow.com/questions/17738962/netzke-grid-filtering
|
||||||
c.columns = [
|
c.columns = [
|
||||||
{ :name => :shop_id, :text => 'Shop ID'},
|
{ :name => :shop_id, :text => 'Shop ID'},
|
||||||
:serial_number,
|
:serial_number,
|
||||||
{ :name => :bike_brand__brand, :text => 'Brand' },
|
{ :id => :bike_brand__brand, :name => :bike_brand__brand, :text => 'Brand'},
|
||||||
{ :name => :bike_model__model, :text => 'Model',
|
{ :name => :model, :text => 'Model',
|
||||||
:scope => lambda { |rel|
|
:scope => lambda { |rel|
|
||||||
if session[:selected_bike_brand_id]
|
if session[:selected_bike_brand_id]
|
||||||
rel.where(:bike_brand_id => session[:selected_bike_brand_id])
|
rel.where(:bike_brand_id => session[:selected_bike_brand_id])
|
||||||
@@ -17,13 +20,13 @@ class Bikes < Netzke::Basepack::Grid
|
|||||||
},
|
},
|
||||||
#needs to have type :action or else won't work in grid, because... netzke
|
#needs to have type :action or else won't work in grid, because... netzke
|
||||||
{ :name => "color", :text => "Frame Color", :type => :action, :editor => { :xtype => "xcolorcombo"}, :renderer => :color_block},
|
{ :name => "color", :text => "Frame Color", :type => :action, :editor => { :xtype => "xcolorcombo"}, :renderer => :color_block},
|
||||||
{ :name => :bike_style__style, :text => 'Style' },
|
{ :id => :bike_style__style, :name => :bike_style__style, :text => 'Style' },
|
||||||
{ :name => :seat_tube_height, :text => 'Seat Tube (in)'},
|
{ :name => :seat_tube_height, :text => 'Seat Tube (in)'},
|
||||||
{ :name => :top_tube_length, :text => 'Top Tube (in)'},
|
{ :name => :top_tube_length, :text => 'Top Tube (in)'},
|
||||||
{ :name => :wheel_size, :text => 'Wheel Size (in)'},
|
{ :name => :wheel_size, :text => 'Wheel Size (in)'},
|
||||||
:value,
|
:value,
|
||||||
{ :name => :bike_condition__condition, :text => 'Condition'},
|
{ :id => :bike_condition__condition, :name => :bike_condition__condition, :text => 'Condition'},
|
||||||
{ :name => :bike_status__status, :text => 'Status'},
|
{ :id => :bike_purpose__purpose, :name => :bike_purpose__purpose, :text => 'Purpose'},
|
||||||
{ :name => :owner, :getter => lambda { |rec|
|
{ :name => :owner, :getter => lambda { |rec|
|
||||||
user = rec.owner
|
user = rec.owner
|
||||||
user.nil? ? "" : "#{user.first_name} #{user.last_name}"
|
user.nil? ? "" : "#{user.first_name} #{user.last_name}"
|
||||||
@@ -38,10 +41,10 @@ class Bikes < Netzke::Basepack::Grid
|
|||||||
def default_fields_for_forms
|
def default_fields_for_forms
|
||||||
# :field_label MUST be defined in order for search to work
|
# :field_label MUST be defined in order for search to work
|
||||||
[
|
[
|
||||||
|
{ :name => :bike_brand__brand, :field_label => 'Brand' },
|
||||||
|
{ :name => :model, :field_label => 'Model'},
|
||||||
{ :name => :shop_id, :field_label => 'Shop ID'},
|
{ :name => :shop_id, :field_label => 'Shop ID'},
|
||||||
{ :name => :serial_number, :field_label => 'Serial Number'},
|
{ :name => :serial_number, :field_label => 'Serial Number'},
|
||||||
{ :name => :bike_brand__brand, :field_label => 'Brand' },
|
|
||||||
{ :name => :bike_model__model, :field_label => 'Model'},
|
|
||||||
{ :name => "color", :xtype => "xcolorcombo"},
|
{ :name => "color", :xtype => "xcolorcombo"},
|
||||||
{ :name => :bike_style__style, :field_label => 'Style' },
|
{ :name => :bike_style__style, :field_label => 'Style' },
|
||||||
{ :name => :seat_tube_height, :field_label => 'Seat Tube (in)'},
|
{ :name => :seat_tube_height, :field_label => 'Seat Tube (in)'},
|
||||||
@@ -49,7 +52,7 @@ class Bikes < Netzke::Basepack::Grid
|
|||||||
{ :name => :wheel_size, :field_label => 'Wheel Size (in)'},
|
{ :name => :wheel_size, :field_label => 'Wheel Size (in)'},
|
||||||
{ :name => :value, :field_label => 'Value'},
|
{ :name => :value, :field_label => 'Value'},
|
||||||
{ :name => :bike_condition__condition, :field_label => 'Condition'},
|
{ :name => :bike_condition__condition, :field_label => 'Condition'},
|
||||||
{ :name => :bike_status__status, :field_label => 'Status'}
|
{ :name => :bike_purpose__purpose, :field_label => 'Purpose'}
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
#override with nil to remove actions
|
#override with nil to remove actions
|
||||||
|
|||||||
@@ -3,6 +3,17 @@
|
|||||||
// calling superclass's initComponent
|
// calling superclass's initComponent
|
||||||
this.callParent();
|
this.callParent();
|
||||||
|
|
||||||
|
// something...
|
||||||
|
//due to Netzke bug, :min_chars attribute doesn't work
|
||||||
|
var min_char_columns = [
|
||||||
|
"bike_brand__brand",
|
||||||
|
"bike_style__style",
|
||||||
|
"bike_condition__condition",
|
||||||
|
"bike_purpose__purpose"]
|
||||||
|
Ext.each(min_char_columns, function(column, index) {
|
||||||
|
Ext.ComponentManager.get(column).editor.minChars = 1;
|
||||||
|
});
|
||||||
|
|
||||||
// setting the 'rowclick' event
|
// setting the 'rowclick' event
|
||||||
var view = this.getView();
|
var view = this.getView();
|
||||||
view.on('itemclick', function(view, record){
|
view.on('itemclick', function(view, record){
|
||||||
|
|||||||
+11
-23
@@ -1,5 +1,4 @@
|
|||||||
class UserLogs < Netzke::Basepack::Grid
|
class UserLogs < Netzke::Basepack::Grid
|
||||||
|
|
||||||
def configure(c)
|
def configure(c)
|
||||||
super
|
super
|
||||||
|
|
||||||
@@ -40,12 +39,10 @@ class UserLogs < Netzke::Basepack::Grid
|
|||||||
|
|
||||||
c.columns = [
|
c.columns = [
|
||||||
{ :name => :start_date, :format => "g:ia - D, M j - Y", :width => 165, :default_value => Time.now.to_formatted_s(:db) },
|
{ :name => :start_date, :format => "g:ia - D, M j - Y", :width => 165, :default_value => Time.now.to_formatted_s(:db) },
|
||||||
{ :name => :end_date, :hidden => true, :default_value => Time.now.to_formatted_s(:db) },
|
{ :name => :end_date, :format => "g:ia - D, M j - Y", :default_value => Time.now.to_formatted_s(:db) },
|
||||||
{ :name => :hours, :getter => lambda { |rec| (rec.end_date - rec.start_date)/3600 }, :sorting_scope => :sort_by_duration},
|
{ :name => :hours, :getter => lambda { |rec| (rec.end_date - rec.start_date)/3600 }, :sorting_scope => :sort_by_duration},
|
||||||
:description,
|
:description,
|
||||||
{ :name => :user_action__action, :text => 'Action', :default_value => ::ActsAsLoggable::UserAction.all.first.id },
|
{ :id => :user_action__action, :name => :user_action__action, :text => 'Action', :default_value => ::ActsAsLoggable::UserAction.all.first.id },
|
||||||
:created_at,
|
|
||||||
:updated_at,
|
|
||||||
{ :name => :logged_by, :getter => lambda{ |rec|
|
{ :name => :logged_by, :getter => lambda{ |rec|
|
||||||
user = User.find_by_id(rec.logger_id)
|
user = User.find_by_id(rec.logger_id)
|
||||||
user.nil? ? "" : "#{user.first_name} #{user.last_name}"
|
user.nil? ? "" : "#{user.first_name} #{user.last_name}"
|
||||||
@@ -54,23 +51,10 @@ class UserLogs < Netzke::Basepack::Grid
|
|||||||
]
|
]
|
||||||
end
|
end
|
||||||
|
|
||||||
def default_fields_for_forms
|
# Overriding the defautl add in form
|
||||||
#figure out a better way to do this
|
def preconfigure_record_window(c)
|
||||||
bike_store = Bike.all.map { |b| [b.id, b.shop_id] }
|
super
|
||||||
current_user ||= User.find_by_id(session[:selected_user_id]) || controller.current_user
|
c.form_config.klass = UserLogsAddItem
|
||||||
bike_id = current_user.bike.nil? ? nil : current_user.bike.id
|
|
||||||
[
|
|
||||||
{ :no_binding => true, :xtype => 'displayfield', :fieldLabel => "Log for:", :value => "#{current_user.to_s}"},
|
|
||||||
{ :name => :start_date},
|
|
||||||
{ :name => :end_date},
|
|
||||||
{ :name => :description},
|
|
||||||
#had to hack acts_as_loggable/log.rb to get this to work
|
|
||||||
{ :name => :user_action__action, :field_label => 'Action'},
|
|
||||||
{ :name => :for_bike, :checkboxName => :copy_log, :inputValue => true, :title => "Copy description to a Bike's History?", :xtype => 'fieldset', :checkboxToggle => true, :collapsed => true, :items => [
|
|
||||||
{:xtype => 'combo', :no_binding => true, :name => :copy_id, :title => 'Bike', :fieldLabel => 'Bike', :store => bike_store, :value => bike_id}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
end
|
end
|
||||||
|
|
||||||
#override with nil to remove actions
|
#override with nil to remove actions
|
||||||
@@ -78,4 +62,8 @@ class UserLogs < Netzke::Basepack::Grid
|
|||||||
[ :apply, :add_in_form, :search ]
|
[ :apply, :add_in_form, :search ]
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
js_configure do |c|
|
||||||
|
c.mixin :init_component
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
initComponent: function(){
|
||||||
|
// calling superclass's initComponent
|
||||||
|
this.callParent();
|
||||||
|
// TESTTING
|
||||||
|
//due to Netzke bug, :min_chars attribute doesn't work
|
||||||
|
var min_char_columns = [
|
||||||
|
"user_action__purpose"
|
||||||
|
];
|
||||||
|
|
||||||
|
// Ext.each(min_char_columns, function(column, index) {
|
||||||
|
// Ext.ComponentManager.get(column).editor.minChars = 1;
|
||||||
|
// });
|
||||||
|
|
||||||
|
var view = this.getView();
|
||||||
|
|
||||||
|
view.on('itemclick', function(view, record){
|
||||||
|
console.log('clicking ');
|
||||||
|
// The beauty of using Ext.Direct: calling 3 endpoints in a row, which results in a single call to the server!
|
||||||
|
// console.log('Old record', record);
|
||||||
|
}, this);
|
||||||
|
|
||||||
|
view.on('itemupdate', function(record, index, node){
|
||||||
|
console.log('Updating item');
|
||||||
|
// if('end_date' in record.data.modified){
|
||||||
|
// console.log('start', record.data.start_date);
|
||||||
|
// console.log('end', record.data.end_date);
|
||||||
|
// }else if('start_date' in record.data.modified){
|
||||||
|
|
||||||
|
// }
|
||||||
|
}, this);
|
||||||
|
|
||||||
|
// var hoursInput = Ext.getCmp('user_logs_add_form_hours-inputEl');
|
||||||
|
|
||||||
|
// console.log(hoursInput);
|
||||||
|
|
||||||
|
// hoursInput.on('change', function(field, newValue, oldValue){
|
||||||
|
// console.log('Hours changing...', newValue);
|
||||||
|
// });
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
addNewItem: function(e){
|
||||||
|
e.fireEvent('click', {});
|
||||||
|
console.log(e);
|
||||||
|
console.log('Adding new item');
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
# The User Log Add Item Form
|
||||||
|
class UserLogsAddItem < Netzke::Basepack::Form
|
||||||
|
def configure(c)
|
||||||
|
super
|
||||||
|
c.model = 'ActsAsLoggable::Log'
|
||||||
|
|
||||||
|
#figure out a better way to do this
|
||||||
|
bike_store = Bike.all.map { |b| [b.id, b.shop_id] }
|
||||||
|
current_user ||= User.find_by_id(session[:selected_user_id]) || controller.current_user
|
||||||
|
bike_id = current_user.bike.nil? ? nil : current_user.bike.id
|
||||||
|
c.items = [
|
||||||
|
{ :no_binding => true, :xtype => 'displayfield', :fieldLabel => "Log for:", :value => "#{current_user.to_s}"},
|
||||||
|
{ :id => :user_logs_add_form_start, :name => :start_date},
|
||||||
|
{ :id => :user_logs_add_form_time, :no_binding => true, :name => :time, :xtype => 'field', :fieldLabel => "Time:", :value => 0 },
|
||||||
|
{ :id => :user_logs_add_form_units, :xtype => 'combo', :no_binding => true, :name => :units, :fieldLabel => 'Units', :store => ['Mins', 'Hrs'], :value => 'Mins' },
|
||||||
|
{ :id => :user_logs_add_form_end, :name => :end_date, :hidden => true },
|
||||||
|
{ :name => :description},
|
||||||
|
#had to hack acts_as_loggable/log.rb to get this to work
|
||||||
|
{ :name => :user_action__action, :field_label => 'Action'},
|
||||||
|
{ :name => :for_bike, :checkboxName => :copy_log, :inputValue => true,
|
||||||
|
:title => "Copy description to a Bike's History?", :xtype => 'fieldset', :checkboxToggle => true, :collapsed => true, :items => [
|
||||||
|
{:xtype => 'combo', :no_binding => true, :name => :copy_id, :title => 'Bike', :fieldLabel => 'Bike', :store => bike_store, :value => bike_id}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
end
|
||||||
|
|
||||||
|
js_configure do |c|
|
||||||
|
c.mixin :init_component
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
{
|
||||||
|
initComponent: function(){
|
||||||
|
// calling superclass's initComponent
|
||||||
|
this.callParent();
|
||||||
|
|
||||||
|
var panel = this;
|
||||||
|
var theForm = this.getForm();
|
||||||
|
var startInput = Ext.getCmp('user_logs_add_form_start');
|
||||||
|
var timeInput = Ext.getCmp('user_logs_add_form_time');
|
||||||
|
var unitsInput = Ext.getCmp('user_logs_add_form_units');
|
||||||
|
var endInput = Ext.getCmp('user_logs_add_form_end');
|
||||||
|
var startdate = startInput.items.items[0];
|
||||||
|
var starttime = startInput.items.items[1];
|
||||||
|
var enddate = endInput.items.items[0];
|
||||||
|
var endtime = endInput.items.items[1];
|
||||||
|
|
||||||
|
startdate.on('change', function(e){
|
||||||
|
var hours = timeInput.getValue();
|
||||||
|
var startTime = starttime.getValue();
|
||||||
|
|
||||||
|
if('Mins' === unitsInput.getValue()){
|
||||||
|
var calculatedEndTime = Ext.Date.add(new Date(startTime), Ext.Date.MINUTE, parseInt(hours));
|
||||||
|
}else{
|
||||||
|
var calculatedEndTime = Ext.Date.add(new Date(startTime), Ext.Date.HOUR, parseInt(hours));
|
||||||
|
}
|
||||||
|
|
||||||
|
endtime.setValue(calculatedEndTime);
|
||||||
|
enddate.setValue(calculatedEndTime);
|
||||||
|
});
|
||||||
|
|
||||||
|
starttime.on('change', function(e){
|
||||||
|
var hours = timeInput.getValue();
|
||||||
|
var startTime = starttime.getValue();
|
||||||
|
|
||||||
|
if('Mins' === unitsInput.getValue()){
|
||||||
|
var calculatedEndTime = Ext.Date.add(new Date(startTime), Ext.Date.MINUTE, parseInt(hours));
|
||||||
|
}else{
|
||||||
|
var calculatedEndTime = Ext.Date.add(new Date(startTime), Ext.Date.HOUR, parseInt(hours));
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
endtime.setValue(calculatedEndTime);
|
||||||
|
enddate.setValue(calculatedEndTime);
|
||||||
|
});
|
||||||
|
|
||||||
|
timeInput.on('change', function(e){
|
||||||
|
var hours = timeInput.getValue();
|
||||||
|
var startTime = starttime.getValue();
|
||||||
|
|
||||||
|
if('Mins' === unitsInput.getValue()){
|
||||||
|
var calculatedEndTime = Ext.Date.add(new Date(startTime), Ext.Date.MINUTE, parseInt(hours));
|
||||||
|
}else{
|
||||||
|
var calculatedEndTime = Ext.Date.add(new Date(startTime), Ext.Date.HOUR, parseInt(hours));
|
||||||
|
}
|
||||||
|
|
||||||
|
endtime.setValue(calculatedEndTime);
|
||||||
|
enddate.setValue(calculatedEndTime);
|
||||||
|
});
|
||||||
|
|
||||||
|
unitsInput.on('change', function(e){
|
||||||
|
var hours = timeInput.getValue();
|
||||||
|
var startTime = starttime.getValue();
|
||||||
|
|
||||||
|
if('Mins' === unitsInput.getValue()){
|
||||||
|
var calculatedEndTime = Ext.Date.add(new Date(startTime), Ext.Date.MINUTE, parseInt(hours));
|
||||||
|
}else{
|
||||||
|
var calculatedEndTime = Ext.Date.add(new Date(startTime), Ext.Date.HOUR, parseInt(hours));
|
||||||
|
}
|
||||||
|
|
||||||
|
endtime.setValue(calculatedEndTime);
|
||||||
|
enddate.setValue(calculatedEndTime);
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -4,8 +4,9 @@ class UserRoleJoins < Netzke::Basepack::Grid
|
|||||||
c.model = "UserRoleJoin"
|
c.model = "UserRoleJoin"
|
||||||
c.header = false
|
c.header = false
|
||||||
c.title = "User Roles"
|
c.title = "User Roles"
|
||||||
|
c.data_store.sorters = [{ :property => :user__username, :direction => :ASC}]
|
||||||
c.columns = [
|
c.columns = [
|
||||||
{ :name => :user__username, :text => "Username"},
|
{ :name => :user__username, :text => "Username", :read_only => true},
|
||||||
{ :name => :name, :getter => lambda{ |rec|
|
{ :name => :name, :getter => lambda{ |rec|
|
||||||
user = User.find_by_id(rec.user_id)
|
user = User.find_by_id(rec.user_id)
|
||||||
user.nil? ? "" : "#{user.first_name} #{user.last_name}"
|
user.nil? ? "" : "#{user.first_name} #{user.last_name}"
|
||||||
@@ -19,7 +20,7 @@ class UserRoleJoins < Netzke::Basepack::Grid
|
|||||||
|
|
||||||
def default_fields_for_forms
|
def default_fields_for_forms
|
||||||
[
|
[
|
||||||
{ :name => :user__username, :field_label => 'Username' },
|
{ :name => :user__full_name, :field_label => 'Name'},
|
||||||
{ :name => :role__role, :field_label => 'Role' },
|
{ :name => :role__role, :field_label => 'Role' },
|
||||||
{ :name => :ends }
|
{ :name => :ends }
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -14,11 +14,11 @@ class Users < Netzke::Basepack::Grid
|
|||||||
c.model = "User"
|
c.model = "User"
|
||||||
|
|
||||||
c.columns = [
|
c.columns = [
|
||||||
:username,
|
{ :name => :username, :read_only => true },
|
||||||
:first_name,
|
:first_name,
|
||||||
:last_name,
|
:last_name,
|
||||||
:email,
|
:email,
|
||||||
:bike__shop_id
|
{ :id => :bike__shop_id, :name => :bike__shop_id}
|
||||||
]
|
]
|
||||||
|
|
||||||
c.columns << :reset if can? :manage, User
|
c.columns << :reset if can? :manage, User
|
||||||
|
|||||||
@@ -2,6 +2,13 @@
|
|||||||
initComponent: function(){
|
initComponent: function(){
|
||||||
// calling superclass's initComponent
|
// calling superclass's initComponent
|
||||||
this.callParent();
|
this.callParent();
|
||||||
|
|
||||||
|
//due to Netzke bug, :min_chars attribute doesn't work
|
||||||
|
var min_char_columns = ["bike__shop_id"]
|
||||||
|
Ext.each(min_char_columns, function(column, index) {
|
||||||
|
Ext.ComponentManager.get(column).editor.minChars = 1;
|
||||||
|
});
|
||||||
|
|
||||||
this.getView().on('itemclick', function(view, record){
|
this.getView().on('itemclick', function(view, record){
|
||||||
// The beauty of using Ext.Direct: calling 3 endpoints in a row, which results in a single call to the server!
|
// The beauty of using Ext.Direct: calling 3 endpoints in a row, which results in a single call to the server!
|
||||||
this.selectCustomer({customer_id: record.get('id'), customer_type: 'User'});
|
this.selectCustomer({customer_id: record.get('id'), customer_type: 'User'});
|
||||||
|
|||||||
+11
-14
@@ -1,22 +1,23 @@
|
|||||||
class Bike < ActiveRecord::Base
|
class Bike < ActiveRecord::Base
|
||||||
acts_as_loggable
|
acts_as_loggable
|
||||||
attr_accessible :shop_id, :serial_number, :bike_brand_id, :bike_model_id, :color, :bike_style_id, :seat_tube_height,
|
attr_accessible :shop_id, :serial_number, :bike_brand_id, :model, :color, :bike_style_id, :seat_tube_height,
|
||||||
:top_tube_length, :wheel_size, :value, :bike_condition_id, :bike_status_id
|
:top_tube_length, :wheel_size, :value, :bike_condition_id, :bike_purpose_id
|
||||||
|
|
||||||
has_many :transactions
|
has_many :transactions
|
||||||
|
|
||||||
has_one :owner, :class_name => 'User'
|
has_one :owner, :class_name => 'User'
|
||||||
has_one :task_list, :as => :item, :dependent => :destroy
|
has_one :task_list, :as => :item, :dependent => :destroy
|
||||||
belongs_to :bike_brand
|
belongs_to :bike_brand
|
||||||
belongs_to :bike_model
|
|
||||||
belongs_to :bike_style
|
belongs_to :bike_style
|
||||||
belongs_to :bike_condition
|
belongs_to :bike_condition
|
||||||
belongs_to :bike_status
|
belongs_to :bike_purpose
|
||||||
|
|
||||||
|
default_scope order('shop_id ASC')
|
||||||
|
|
||||||
validates :shop_id, :presence => true, :uniqueness => true, :length => { :minimum => 3 }
|
validates :shop_id, :presence => true, :uniqueness => true, :length => { :minimum => 3 }
|
||||||
validates :serial_number, :uniqueness => true, :length => { :minimum => 3 }
|
validates :serial_number, :length => { :minimum => 3 }
|
||||||
|
validates :model, :length => { :maximum => 50 }
|
||||||
validates :bike_brand_id, :presence => true
|
validates :bike_brand_id, :presence => true
|
||||||
validates :bike_model_id, :presence => true
|
|
||||||
validates :color, :presence => true
|
validates :color, :presence => true
|
||||||
validates :bike_style_id, :presence => true
|
validates :bike_style_id, :presence => true
|
||||||
validates :seat_tube_height, :presence => true
|
validates :seat_tube_height, :presence => true
|
||||||
@@ -24,20 +25,16 @@ class Bike < ActiveRecord::Base
|
|||||||
validates :wheel_size, :presence => true
|
validates :wheel_size, :presence => true
|
||||||
#validates :value, :presence => true
|
#validates :value, :presence => true
|
||||||
validates :bike_condition_id, :presence => true
|
validates :bike_condition_id, :presence => true
|
||||||
validates :bike_status_id, :presence => true
|
validates :bike_purpose_id, :presence => true
|
||||||
|
|
||||||
self.per_page = 15
|
self.per_page = 15
|
||||||
|
|
||||||
after_save :create_task_list
|
after_create :create_task_list
|
||||||
|
|
||||||
def brand
|
def brand
|
||||||
self.bike_brand
|
self.bike_brand
|
||||||
end
|
end
|
||||||
|
|
||||||
def model
|
|
||||||
self.bike_model
|
|
||||||
end
|
|
||||||
|
|
||||||
def style
|
def style
|
||||||
self.bike_style
|
self.bike_style
|
||||||
end
|
end
|
||||||
@@ -46,8 +43,8 @@ class Bike < ActiveRecord::Base
|
|||||||
self.bike_condition
|
self.bike_condition
|
||||||
end
|
end
|
||||||
|
|
||||||
def status
|
def purpose
|
||||||
self.bike_status
|
self.bike_purpose
|
||||||
end
|
end
|
||||||
|
|
||||||
def to_s
|
def to_s
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
class BikeModel < ActiveRecord::Base
|
class BikeModel < ActiveRecord::Base
|
||||||
attr_accessible :model, :bike_brand_id
|
attr_accessible :model, :bike_brand_id
|
||||||
|
|
||||||
has_many :bikes
|
|
||||||
belongs_to :bike_brand
|
belongs_to :bike_brand
|
||||||
|
|
||||||
default_scope order('model ASC')
|
default_scope order('model ASC')
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
class BikePurpose < ActiveRecord::Base
|
||||||
|
attr_accessible :purpose
|
||||||
|
|
||||||
|
belongs_to :bike
|
||||||
|
|
||||||
|
def to_s
|
||||||
|
self.purpose
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -1,9 +0,0 @@
|
|||||||
class BikeStatus < ActiveRecord::Base
|
|
||||||
attr_accessible :status
|
|
||||||
|
|
||||||
belongs_to :bike
|
|
||||||
|
|
||||||
def to_s
|
|
||||||
self.status
|
|
||||||
end
|
|
||||||
end
|
|
||||||
+4
-2
@@ -20,6 +20,8 @@ class User < ActiveRecord::Base
|
|||||||
|
|
||||||
belongs_to :bike
|
belongs_to :bike
|
||||||
|
|
||||||
|
default_scope order('username ASC')
|
||||||
|
|
||||||
validates :first_name, :presence => true
|
validates :first_name, :presence => true
|
||||||
validates :last_name, :presence => true
|
validates :last_name, :presence => true
|
||||||
|
|
||||||
@@ -45,7 +47,7 @@ class User < ActiveRecord::Base
|
|||||||
### TODO methods below probably belong somewhere else
|
### TODO methods below probably belong somewhere else
|
||||||
|
|
||||||
def completed_build_bikes
|
def completed_build_bikes
|
||||||
status_id = BikeStatus.find_by_status("BUILDBIKE").id
|
purpose_id = BikePurpose.find_by_purpose("BUILDBIKE").id
|
||||||
Bike.find_by_sql("
|
Bike.find_by_sql("
|
||||||
SELECT *
|
SELECT *
|
||||||
FROM bikes
|
FROM bikes
|
||||||
@@ -54,7 +56,7 @@ class User < ActiveRecord::Base
|
|||||||
FROM transactions
|
FROM transactions
|
||||||
WHERE customer_id = #{self.id}
|
WHERE customer_id = #{self.id}
|
||||||
) AS transactions ON bikes.id = transactions.bike_id
|
) AS transactions ON bikes.id = transactions.bike_id
|
||||||
WHERE bike_status_id = #{status_id}")
|
WHERE bike_purpose_id = #{purpose_id}")
|
||||||
end
|
end
|
||||||
|
|
||||||
def total_credits
|
def total_credits
|
||||||
|
|||||||
@@ -1,24 +1,25 @@
|
|||||||
%fieldset
|
%fieldset
|
||||||
= f.label :addrStreet1
|
.control-group
|
||||||
%br/
|
= f.label :addrStreet1, :class => "control-label"
|
||||||
= f.text_field :addrStreet1
|
.controls
|
||||||
%br/
|
= f.text_field :addrStreet1, :class => "control-label"
|
||||||
= f.label :addrStreet2
|
.control-group
|
||||||
%br/
|
= f.label :addrStreet2, :class => "control-label"
|
||||||
= f.text_field :addrStreet2
|
.controls
|
||||||
%br/
|
= f.text_field :addrStreet2, :class => "control-label"
|
||||||
= f.label :addrCity
|
.control-group
|
||||||
%br/
|
= f.label :addrCity, :class => "control-label"
|
||||||
= f.text_field :addrCity
|
.controls
|
||||||
%br/
|
= f.text_field :addrCity, :class => "control-label"
|
||||||
= f.label :addrState
|
.control-group
|
||||||
%br/
|
= f.label :addrState, :class => "control-label"
|
||||||
= f.text_field :addrState
|
.controls
|
||||||
%br/
|
= f.text_field :addrState, :class => "control-label"
|
||||||
= f.label :addrZip
|
.control-group
|
||||||
%br/
|
= f.label :addrZip, :class => "control-label"
|
||||||
= f.text_field :addrZip
|
.controls
|
||||||
%br/
|
= f.text_field :addrZip, :class => "control-label"
|
||||||
= f.label :phone
|
.control-group
|
||||||
%br/
|
= f.label :phone, :class => "control-label"
|
||||||
= f.text_field :phone
|
.controls
|
||||||
|
= f.text_field :phone, :class => "control-label"
|
||||||
|
|||||||
@@ -1,34 +1,36 @@
|
|||||||
= stylesheet_link_tag "bootstrap_and_overrides", :media => "all"
|
= stylesheet_link_tag "bootstrap_and_overrides", :media => "all"
|
||||||
%h2 Sign up
|
= form_for(resource, :as => resource_name, :url => registration_path(resource_name), :html => { :class => "form-horizontal"}) do |f|
|
||||||
= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f|
|
|
||||||
= devise_error_messages!
|
= devise_error_messages!
|
||||||
%div
|
.controls
|
||||||
= f.label :username
|
%h2 Sign up
|
||||||
%br/
|
.control-group
|
||||||
= f.text_field :username
|
= f.label :username, :class => "control-label"
|
||||||
%div
|
.controls
|
||||||
= f.label :first_name
|
= f.text_field :username
|
||||||
%br/
|
.control-group
|
||||||
= f.text_field :first_name
|
= f.label :first_name, :class => "control-label"
|
||||||
%div
|
.controls
|
||||||
= f.label :last_name
|
= f.text_field :first_name
|
||||||
%br/
|
.control-group
|
||||||
= f.text_field :last_name
|
= f.label :last_name, :class => "control-label"
|
||||||
%div
|
.controls
|
||||||
= f.label :email
|
= f.text_field :last_name
|
||||||
%br/
|
.control-group
|
||||||
= f.email_field :email
|
= f.label :email, :class => "control-label"
|
||||||
%div
|
.controls
|
||||||
- profile_builder = resource.user_profiles.empty? ? resource.user_profiles.build : resource.user_profiles
|
= f.email_field :email
|
||||||
= f.fields_for :user_profiles, profile_builder do |builder|
|
- profile_builder = resource.user_profiles.empty? ? resource.user_profiles.build : resource.user_profiles
|
||||||
= render 'user_profile_fields', f: builder
|
= f.fields_for :user_profiles, profile_builder do |builder|
|
||||||
%div
|
= render 'user_profile_fields', f: builder
|
||||||
= f.label :password
|
.control-group
|
||||||
%br/
|
= f.label :password, :class => "control-label"
|
||||||
= f.password_field :password
|
.controls
|
||||||
%div
|
= f.password_field :password
|
||||||
= f.label :password_confirmation
|
.control-group
|
||||||
%br/
|
= f.label :password_confirmation, :class => "control-label"
|
||||||
= f.password_field :password_confirmation
|
.controls
|
||||||
%div= f.submit "Sign up"
|
= f.password_field :password_confirmation
|
||||||
|
.control-group
|
||||||
|
.controls
|
||||||
|
= f.submit "Sign up"
|
||||||
= render "links"
|
= render "links"
|
||||||
|
|||||||
@@ -223,7 +223,10 @@ Devise.setup do |config|
|
|||||||
end
|
end
|
||||||
|
|
||||||
#Check in the user if they sign in. (Devise uses Warden)
|
#Check in the user if they sign in. (Devise uses Warden)
|
||||||
Warden::Manager.after_authentication do |user,auth,opts|
|
Warden::Manager.after_set_user do |user,auth,opts|
|
||||||
|
# this essentially gets called after every netzke request, but alas,
|
||||||
|
# only using the after_authenticaion callback doesn't get fired after
|
||||||
|
# user creation.
|
||||||
user.checkin unless user.checked_in?
|
user.checkin unless user.checked_in?
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
class BikeConditionIdToInt < ActiveRecord::Migration
|
||||||
|
def up
|
||||||
|
#for Postgres
|
||||||
|
connection.execute(%q{
|
||||||
|
alter table bikes
|
||||||
|
alter column bike_condition_id
|
||||||
|
type integer using cast(bike_condition_id as integer)
|
||||||
|
})
|
||||||
|
end
|
||||||
|
|
||||||
|
def down
|
||||||
|
#you really don't want to go back
|
||||||
|
change_column :bikes, :bike_condition_id, :string
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
class BikeStatusToPurpose < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
rename_column :bikes, :bike_status_id, :bike_purpose_id
|
||||||
|
rename_column :bike_statuses, :status, :purpose
|
||||||
|
rename_table :bike_statuses, :bike_purposes
|
||||||
|
end
|
||||||
|
end
|
||||||
@@ -0,0 +1,10 @@
|
|||||||
|
class AddModelToBike < ActiveRecord::Migration
|
||||||
|
def change
|
||||||
|
add_column :bikes, :model, :string
|
||||||
|
change_column :bikes, :bike_model_id, :integer, :null => true
|
||||||
|
Bike.all.each do |bike|
|
||||||
|
bike.model = BikeModel.find_by_id(bike.bike_model_id).model
|
||||||
|
bike.save
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
+7
-6
@@ -11,7 +11,7 @@
|
|||||||
#
|
#
|
||||||
# It's strongly recommended to check this file into your version control system.
|
# It's strongly recommended to check this file into your version control system.
|
||||||
|
|
||||||
ActiveRecord::Schema.define(:version => 20130629152047) do
|
ActiveRecord::Schema.define(:version => 20130902201853) do
|
||||||
|
|
||||||
create_table "bike_actions", :force => true do |t|
|
create_table "bike_actions", :force => true do |t|
|
||||||
t.string "action", :limit => 128, :null => false
|
t.string "action", :limit => 128, :null => false
|
||||||
@@ -34,8 +34,8 @@ ActiveRecord::Schema.define(:version => 20130629152047) do
|
|||||||
t.integer "bike_brand_id", :null => false
|
t.integer "bike_brand_id", :null => false
|
||||||
end
|
end
|
||||||
|
|
||||||
create_table "bike_statuses", :force => true do |t|
|
create_table "bike_purposes", :force => true do |t|
|
||||||
t.string "status", :null => false
|
t.string "purpose", :null => false
|
||||||
t.datetime "created_at", :null => false
|
t.datetime "created_at", :null => false
|
||||||
t.datetime "updated_at", :null => false
|
t.datetime "updated_at", :null => false
|
||||||
end
|
end
|
||||||
@@ -49,18 +49,19 @@ ActiveRecord::Schema.define(:version => 20130629152047) do
|
|||||||
create_table "bikes", :force => true do |t|
|
create_table "bikes", :force => true do |t|
|
||||||
t.string "serial_number"
|
t.string "serial_number"
|
||||||
t.integer "bike_brand_id", :null => false
|
t.integer "bike_brand_id", :null => false
|
||||||
t.integer "bike_model_id", :null => false
|
t.integer "bike_model_id"
|
||||||
t.string "color"
|
t.string "color"
|
||||||
t.integer "bike_style_id", :null => false
|
t.integer "bike_style_id", :null => false
|
||||||
t.float "seat_tube_height"
|
t.float "seat_tube_height"
|
||||||
t.float "top_tube_length"
|
t.float "top_tube_length"
|
||||||
t.integer "wheel_size"
|
t.integer "wheel_size"
|
||||||
t.float "value"
|
t.float "value"
|
||||||
t.string "bike_condition_id", :null => false
|
t.integer "bike_condition_id", :null => false
|
||||||
t.integer "bike_status_id", :null => false
|
t.integer "bike_purpose_id", :null => false
|
||||||
t.datetime "created_at", :null => false
|
t.datetime "created_at", :null => false
|
||||||
t.datetime "updated_at", :null => false
|
t.datetime "updated_at", :null => false
|
||||||
t.string "shop_id"
|
t.string "shop_id"
|
||||||
|
t.string "model"
|
||||||
end
|
end
|
||||||
|
|
||||||
add_index "bikes", ["shop_id"], :name => "index_bikes_on_shop_id", :unique => true
|
add_index "bikes", ["shop_id"], :name => "index_bikes_on_shop_id", :unique => true
|
||||||
|
|||||||
@@ -0,0 +1,18 @@
|
|||||||
|
undetermined:
|
||||||
|
id: 1
|
||||||
|
purpose: UNDETERMINED
|
||||||
|
scrap:
|
||||||
|
id: 2
|
||||||
|
purpose: SCRAP
|
||||||
|
parts:
|
||||||
|
id: 3
|
||||||
|
purpose: PARTS
|
||||||
|
storage:
|
||||||
|
id: 4
|
||||||
|
purpose: STORAGE
|
||||||
|
buildbike:
|
||||||
|
id: 5
|
||||||
|
purpose: BUILDBIKE
|
||||||
|
sale:
|
||||||
|
id: 6
|
||||||
|
purpose: SALE
|
||||||
@@ -1,18 +0,0 @@
|
|||||||
undetermined:
|
|
||||||
id: 1
|
|
||||||
status: UNDETERMINED
|
|
||||||
scrap:
|
|
||||||
id: 2
|
|
||||||
status: SCRAP
|
|
||||||
parts:
|
|
||||||
id: 3
|
|
||||||
status: PARTS
|
|
||||||
storage:
|
|
||||||
id: 4
|
|
||||||
status: STORAGE
|
|
||||||
buildbike:
|
|
||||||
id: 5
|
|
||||||
status: BUILDBIKE
|
|
||||||
sale:
|
|
||||||
id: 6
|
|
||||||
status: SALE
|
|
||||||
@@ -17,6 +17,6 @@ FactoryGirl.define do
|
|||||||
wheel_size 27
|
wheel_size 27
|
||||||
value 100
|
value 100
|
||||||
bike_condition_id 1
|
bike_condition_id 1
|
||||||
bike_status_id 1
|
bike_purpose_id 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|||||||
Reference in New Issue
Block a user