Author SHA1 Message Date
Jason Denney a7bdfd7a04 Merge pull request #107 from spacemunkay/brigitte-sass
Updated Sign In Page
2017-01-08 11:37:09 -08:00
Brigitte Warner 91a5b7c64c remove unneeded sass-cache 2014-08-07 20:55:44 -04:00
Brigitte Warner 2148fec9f4 add vendor and sass-cache to gitignore 2014-08-07 20:46:26 -04:00
Brigitte Warner d9ed9feec1 update sign in page with bootstrap 3 2014-08-07 20:43:26 -04:00
Brigitte Warner c2e2ce5b1b update ruby and gem versions 2014-07-24 20:42:37 -04:00
Brigitte Warner e1e49cbbb2 update less to sass 2014-07-24 20:42:09 -04:00
Jason Denney fd5d4798b0 Merge pull request #103 from spacemunkay/denney-fix-user-add-bike
Fix User being able to add bikes
2014-06-12 22:26:30 -04:00
Jason Denney 3e480981c7 Fix User being able to add bikes 2014-06-12 22:24:00 -04:00
Jason Denney 523135ed9f Merge pull request #102 from spacemunkay/denney-fix-edit-redirect
root path to user edit
2014-06-12 21:25:29 -04:00
Jason Denney 5e95ce542c root path to user edit 2014-06-12 21:24:02 -04:00
Jason Denney a8e0c87d37 Merge pull request #101 from spacemunkay/mobile-ui
Mobile UI
2014-05-04 20:55:41 -04:00
Jason Denney 1b2c0fa378 Submit dates in locale format for time being
Added jquery date format plugin
2014-05-04 20:43:46 -04:00
Jason Denney 9231c91e6c Update README.md 2014-03-01 11:12:10 -05:00
Jason Denney e19b80faec Update README.md 2014-02-08 11:46:48 -05:00
20 changed files with 732 additions and 270 deletions
+2
View File
@@ -10,3 +10,5 @@ public/extjs
public/assets public/assets
public/images/icons public/images/icons
config/database.yml config/database.yml
vendor/
.sass-cache/
+1 -1
View File
@@ -1 +1 @@
ruby-1.9.3-p374 2.1.1
+22 -23
View File
@@ -1,51 +1,50 @@
source 'https://rubygems.org' source 'https://rubygems.org'
gem 'rails', '3.2.13' gem 'rails', '3.2.19'
gem 'netzke-cancan' gem 'netzke-cancan'
gem 'netzke-core', '~>0.8.0' gem 'netzke-core'
gem 'netzke-basepack', '~>0.8.0' gem 'netzke-basepack'
gem 'acts_as_loggable', :git => 'https://github.com/spacemunkay/acts_as_loggable.git' gem 'acts_as_loggable', :git => 'https://github.com/spacemunkay/acts_as_loggable.git'
gem 'bootstrap-will_paginate', '~> 0.0.6' gem 'bootstrap-will_paginate'
gem 'cancan' gem 'cancan'
gem 'decent_exposure', '~> 1.0.1' gem 'decent_exposure', '~> 1.0.1'
gem 'devise', '~> 2.0.4' gem 'devise', '~> 2.0.4'
gem 'haml-rails', '~> 0.3.4' gem 'haml-rails'
gem 'jquery-rails', '~> 2.0' gem 'jquery-rails'
gem 'pg', '~> 0.17.1' gem 'pg', '~> 0.17.1'
gem 'will_paginate', '~> 3.0.3' gem 'will_paginate'
gem 'jbuilder', '~> 2.0.3' gem 'jbuilder'
# Gems used only for assets and not required # Gems used only for assets and not required
# in production environments by default. # in production environments by default.
group :assets do group :assets do
gem 'coffee-rails', '~> 3.2.1' gem 'coffee-rails'
gem "twitter-bootstrap-rails", "~> 2.0.3" # Use SCSS for stylesheets
gem 'sass-rails'
# See https://github.com/sstephenson/execjs#readme for more supported runtimes # Use bootstrap-sass for stylesheets
# gem 'therubyracer' gem 'bootstrap-sass'
gem 'uglifier'
gem 'uglifier', '>= 1.0.3'
end end
group :development, :test do group :development, :test do
gem 'rspec-rails', '~> 2.14.0' gem 'rspec-rails'
gem 'factory_girl_rails', '~> 1.2' gem 'factory_girl_rails'
gem 'pry', '~> 0.9.8' gem 'pry'
gem 'faker', '~> 1.2.0' gem 'faker'
end end
group :test do group :test do
gem 'shoulda-matchers', '~> 1.0.0' # gem 'shoulda-matchers', '~> 1.0.0'
gem 'capybara', '~> 2.2.1' gem 'capybara', '~> 2.2.1'
gem 'poltergeist', '~> 1.5.0' gem 'poltergeist', '~> 1.5.0'
gem 'database_cleaner', '~> 1.2.0' gem 'database_cleaner', '~> 1.2.0'
gem 'launchy', '~> 2.4.2' gem 'launchy', '~> 2.4.2'
gem 'spork', '~> 0.9.2' gem 'spork'
#guard dependency for Mac OS 10 #guard dependency for Mac OS 10
gem 'rb-fsevent', :require => false if RUBY_PLATFORM =~ /darwin/i gem 'rb-fsevent', :require => false if RUBY_PLATFORM =~ /darwin/i
gem 'guard-spork', '~> 1.5.1' gem 'guard-spork'
gem 'guard-rspec', '~> 4.2.6' gem 'guard-rspec'
end end
+118 -119
View File
@@ -9,12 +9,12 @@ GIT
GEM GEM
remote: https://rubygems.org/ remote: https://rubygems.org/
specs: specs:
actionmailer (3.2.13) actionmailer (3.2.19)
actionpack (= 3.2.13) actionpack (= 3.2.19)
mail (~> 2.5.3) mail (~> 2.5.4)
actionpack (3.2.13) actionpack (3.2.19)
activemodel (= 3.2.13) activemodel (= 3.2.19)
activesupport (= 3.2.13) activesupport (= 3.2.19)
builder (~> 3.0.0) builder (~> 3.0.0)
erubis (~> 2.7.0) erubis (~> 2.7.0)
journey (~> 1.0.4) journey (~> 1.0.4)
@@ -22,23 +22,27 @@ GEM
rack-cache (~> 1.2) rack-cache (~> 1.2)
rack-test (~> 0.6.1) rack-test (~> 0.6.1)
sprockets (~> 2.2.1) sprockets (~> 2.2.1)
activemodel (3.2.13) activemodel (3.2.19)
activesupport (= 3.2.13) activesupport (= 3.2.19)
builder (~> 3.0.0) builder (~> 3.0.0)
activerecord (3.2.13) activerecord (3.2.19)
activemodel (= 3.2.13) activemodel (= 3.2.19)
activesupport (= 3.2.13) activesupport (= 3.2.19)
arel (~> 3.0.2) arel (~> 3.0.2)
tzinfo (~> 0.3.29) tzinfo (~> 0.3.29)
activeresource (3.2.13) activeresource (3.2.19)
activemodel (= 3.2.13) activemodel (= 3.2.19)
activesupport (= 3.2.13) activesupport (= 3.2.19)
activesupport (3.2.13) activesupport (3.2.19)
i18n (= 0.6.1) i18n (~> 0.6, >= 0.6.4)
multi_json (~> 1.0) multi_json (~> 1.0)
addressable (2.3.5) addressable (2.3.6)
arel (3.0.3) arel (3.0.3)
bcrypt-ruby (3.1.2) bcrypt (3.1.7)
bcrypt-ruby (3.1.5)
bcrypt (>= 3.1.3)
bootstrap-sass (3.2.0.0)
sass (~> 3.2)
bootstrap-will_paginate (0.0.10) bootstrap-will_paginate (0.0.10)
will_paginate will_paginate
builder (3.0.4) builder (3.0.4)
@@ -51,18 +55,17 @@ GEM
xpath (~> 2.0) xpath (~> 2.0)
celluloid (0.15.2) celluloid (0.15.2)
timers (~> 1.1.0) timers (~> 1.1.0)
childprocess (0.4.0) childprocess (0.5.3)
ffi (~> 1.0, >= 1.0.11) ffi (~> 1.0, >= 1.0.11)
cliver (0.3.2) cliver (0.3.2)
coderay (1.1.0) coderay (1.1.0)
coffee-rails (3.2.2) coffee-rails (3.2.2)
coffee-script (>= 2.2.0) coffee-script (>= 2.2.0)
railties (~> 3.2.0) railties (~> 3.2.0)
coffee-script (2.2.0) coffee-script (2.3.0)
coffee-script-source coffee-script-source
execjs execjs
coffee-script-source (1.7.0) coffee-script-source (1.7.1)
commonjs (0.2.7)
database_cleaner (1.2.0) database_cleaner (1.2.0)
decent_exposure (1.0.2) decent_exposure (1.0.2)
devise (2.0.6) devise (2.0.6)
@@ -72,160 +75,156 @@ GEM
warden (~> 1.1.1) warden (~> 1.1.1)
diff-lcs (1.2.5) diff-lcs (1.2.5)
erubis (2.7.0) erubis (2.7.0)
execjs (2.0.2) execjs (2.2.1)
factory_girl (2.6.4) factory_girl (4.4.0)
activesupport (>= 2.3.9) activesupport (>= 3.0.0)
factory_girl_rails (1.7.0) factory_girl_rails (4.4.1)
factory_girl (~> 2.6.0) factory_girl (~> 4.4.0)
railties (>= 3.0.0) railties (>= 3.0.0)
faker (1.2.0) faker (1.4.2)
i18n (~> 0.5) i18n (~> 0.5)
ffi (1.9.3) ffi (1.9.3)
formatador (0.2.4) formatador (0.2.5)
guard (2.4.0) guard (2.6.1)
formatador (>= 0.2.4) formatador (>= 0.2.4)
listen (~> 2.1) listen (~> 2.7)
lumberjack (~> 1.0) lumberjack (~> 1.0)
pry (>= 0.9.12) pry (>= 0.9.12)
thor (>= 0.18.1) thor (>= 0.18.1)
guard-rspec (4.2.6) guard-rspec (4.3.1)
guard (~> 2.1) guard (~> 2.1)
rspec (>= 2.14, < 4.0) rspec (>= 2.14, < 4.0)
guard-spork (1.5.1) guard-spork (1.5.1)
childprocess (>= 0.2.3) childprocess (>= 0.2.3)
guard (>= 1.1) guard (>= 1.1)
spork (>= 0.8.4) spork (>= 0.8.4)
haml (3.1.8) haml (4.0.5)
haml-rails (0.3.5) tilt
haml-rails (0.4)
actionpack (>= 3.1, < 4.1) actionpack (>= 3.1, < 4.1)
activesupport (>= 3.1, < 4.1) activesupport (>= 3.1, < 4.1)
haml (~> 3.1) haml (>= 3.1, < 4.1)
railties (>= 3.1, < 4.1) railties (>= 3.1, < 4.1)
hike (1.2.3) hike (1.2.3)
i18n (0.6.1) i18n (0.6.11)
jbuilder (2.0.3) jbuilder (2.1.3)
activesupport (>= 3.0.0) activesupport (>= 3.0.0, < 5)
multi_json (>= 1.2.0) multi_json (~> 1.2)
journey (1.0.4) journey (1.0.4)
jquery-rails (2.3.0) jquery-rails (3.1.1)
railties (>= 3.0, < 5.0) railties (>= 3.0, < 5.0)
thor (>= 0.14, < 2.0) thor (>= 0.14, < 2.0)
json (1.8.1) json (1.8.1)
launchy (2.4.2) launchy (2.4.2)
addressable (~> 2.3) addressable (~> 2.3)
less (2.2.2) listen (2.7.9)
commonjs (~> 0.2.6)
less-rails (2.2.6)
actionpack (>= 3.1)
less (~> 2.2.0)
libv8 (3.3.10.4)
listen (2.4.1)
celluloid (>= 0.15.2) celluloid (>= 0.15.2)
rb-fsevent (>= 0.9.3) rb-fsevent (>= 0.9.3)
rb-inotify (>= 0.9) rb-inotify (>= 0.9)
lumberjack (1.0.4) lumberjack (1.0.9)
mail (2.5.4) mail (2.5.4)
mime-types (~> 1.16) mime-types (~> 1.16)
treetop (~> 1.4.8) treetop (~> 1.4.8)
method_source (0.8.2) method_source (0.8.2)
mime-types (1.25.1) mime-types (1.25.1)
mini_portile (0.5.2) mini_portile (0.6.0)
multi_json (1.8.4) multi_json (1.10.1)
netzke-basepack (0.8.4) netzke-basepack (0.10.1)
netzke-core (~> 0.8.2) netzke-core (~> 0.10.0)
netzke-cancan (0.8.2) netzke-cancan (0.8.2)
cancan cancan
netzke-core netzke-core
netzke-core (0.8.4) netzke-core (0.10.1)
execjs execjs
uglifier uglifier
nokogiri (1.6.1) nokogiri (1.6.3.1)
mini_portile (~> 0.5.0) mini_portile (= 0.6.0)
orm_adapter (0.0.7) orm_adapter (0.0.7)
pg (0.17.1) pg (0.17.1)
poltergeist (1.5.0) poltergeist (1.5.1)
capybara (~> 2.1) capybara (~> 2.1)
cliver (~> 0.3.1) cliver (~> 0.3.1)
multi_json (~> 1.0) multi_json (~> 1.0)
websocket-driver (>= 0.2.0) websocket-driver (>= 0.2.0)
polyglot (0.3.3) polyglot (0.3.5)
pry (0.9.12.6) pry (0.10.0)
coderay (~> 1.0) coderay (~> 1.1.0)
method_source (~> 0.8) method_source (~> 0.8.1)
slop (~> 3.4) slop (~> 3.4)
rack (1.4.5) rack (1.4.5)
rack-cache (1.2) rack-cache (1.2)
rack (>= 0.4) rack (>= 0.4)
rack-ssl (1.3.3) rack-ssl (1.3.4)
rack rack
rack-test (0.6.2) rack-test (0.6.2)
rack (>= 1.0) rack (>= 1.0)
rails (3.2.13) rails (3.2.19)
actionmailer (= 3.2.13) actionmailer (= 3.2.19)
actionpack (= 3.2.13) actionpack (= 3.2.19)
activerecord (= 3.2.13) activerecord (= 3.2.19)
activeresource (= 3.2.13) activeresource (= 3.2.19)
activesupport (= 3.2.13) activesupport (= 3.2.19)
bundler (~> 1.0) bundler (~> 1.0)
railties (= 3.2.13) railties (= 3.2.19)
railties (3.2.13) railties (3.2.19)
actionpack (= 3.2.13) actionpack (= 3.2.19)
activesupport (= 3.2.13) activesupport (= 3.2.19)
rack-ssl (~> 1.3.2) rack-ssl (~> 1.3.2)
rake (>= 0.8.7) rake (>= 0.8.7)
rdoc (~> 3.4) rdoc (~> 3.4)
thor (>= 0.14.6, < 2.0) thor (>= 0.14.6, < 2.0)
rake (10.1.1) rake (10.3.2)
rb-fsevent (0.9.4) rb-fsevent (0.9.4)
rb-inotify (0.9.3) rb-inotify (0.9.5)
ffi (>= 0.5.0) ffi (>= 0.5.0)
rdoc (3.12.2) rdoc (3.12.2)
json (~> 1.4) json (~> 1.4)
rspec (2.14.1) rspec (3.0.0)
rspec-core (~> 2.14.0) rspec-core (~> 3.0.0)
rspec-expectations (~> 2.14.0) rspec-expectations (~> 3.0.0)
rspec-mocks (~> 2.14.0) rspec-mocks (~> 3.0.0)
rspec-core (2.14.7) rspec-core (3.0.3)
rspec-expectations (2.14.5) rspec-support (~> 3.0.0)
diff-lcs (>= 1.1.3, < 2.0) rspec-expectations (3.0.3)
rspec-mocks (2.14.5) diff-lcs (>= 1.2.0, < 2.0)
rspec-rails (2.14.1) rspec-support (~> 3.0.0)
rspec-mocks (3.0.3)
rspec-support (~> 3.0.0)
rspec-rails (3.0.2)
actionpack (>= 3.0) actionpack (>= 3.0)
activemodel (>= 3.0)
activesupport (>= 3.0) activesupport (>= 3.0)
railties (>= 3.0) railties (>= 3.0)
rspec-core (~> 2.14.0) rspec-core (~> 3.0.0)
rspec-expectations (~> 2.14.0) rspec-expectations (~> 3.0.0)
rspec-mocks (~> 2.14.0) rspec-mocks (~> 3.0.0)
shoulda-matchers (1.0.0) rspec-support (~> 3.0.0)
slop (3.4.7) rspec-support (3.0.3)
sass (3.3.10)
sass-rails (3.2.6)
railties (~> 3.2.0)
sass (>= 3.1.10)
tilt (~> 1.3)
slop (3.6.0)
spork (0.9.2) spork (0.9.2)
sprockets (2.2.2) sprockets (2.2.2)
hike (~> 1.2) hike (~> 1.2)
multi_json (~> 1.0) multi_json (~> 1.0)
rack (~> 1.0) rack (~> 1.0)
tilt (~> 1.1, != 1.3.0) tilt (~> 1.1, != 1.3.0)
therubyracer (0.10.2) thor (0.19.1)
libv8 (~> 3.3.10)
thor (0.18.1)
tilt (1.4.1) tilt (1.4.1)
timers (1.1.0) timers (1.1.0)
treetop (1.4.15) treetop (1.4.15)
polyglot polyglot
polyglot (>= 0.3.1) polyglot (>= 0.3.1)
twitter-bootstrap-rails (2.0.9) tzinfo (0.3.40)
actionpack (>= 3.1) uglifier (2.5.3)
less-rails (~> 2.2.2)
railties (>= 3.1)
therubyracer (~> 0.10.1)
tzinfo (0.3.38)
uglifier (2.4.0)
execjs (>= 0.3.0) execjs (>= 0.3.0)
json (>= 1.8.0) json (>= 1.8.0)
warden (1.1.1) warden (1.1.1)
rack (>= 1.0) rack (>= 1.0)
websocket-driver (0.3.2) websocket-driver (0.3.4)
will_paginate (3.0.5) will_paginate (3.0.7)
xpath (2.0.0) xpath (2.0.0)
nokogiri (~> 1.3) nokogiri (~> 1.3)
@@ -234,32 +233,32 @@ PLATFORMS
DEPENDENCIES DEPENDENCIES
acts_as_loggable! acts_as_loggable!
bootstrap-will_paginate (~> 0.0.6) bootstrap-sass
bootstrap-will_paginate
cancan cancan
capybara (~> 2.2.1) capybara (~> 2.2.1)
coffee-rails (~> 3.2.1) coffee-rails
database_cleaner (~> 1.2.0) database_cleaner (~> 1.2.0)
decent_exposure (~> 1.0.1) decent_exposure (~> 1.0.1)
devise (~> 2.0.4) devise (~> 2.0.4)
factory_girl_rails (~> 1.2) factory_girl_rails
faker (~> 1.2.0) faker
guard-rspec (~> 4.2.6) guard-rspec
guard-spork (~> 1.5.1) guard-spork
haml-rails (~> 0.3.4) haml-rails
jbuilder (~> 2.0.3) jbuilder
jquery-rails (~> 2.0) jquery-rails
launchy (~> 2.4.2) launchy (~> 2.4.2)
netzke-basepack (~> 0.8.0) netzke-basepack
netzke-cancan netzke-cancan
netzke-core (~> 0.8.0) netzke-core
pg (~> 0.17.1) pg (~> 0.17.1)
poltergeist (~> 1.5.0) poltergeist (~> 1.5.0)
pry (~> 0.9.8) pry
rails (= 3.2.13) rails (= 3.2.19)
rb-fsevent rb-fsevent
rspec-rails (~> 2.14.0) rspec-rails
shoulda-matchers (~> 1.0.0) sass-rails
spork (~> 0.9.2) spork
twitter-bootstrap-rails (~> 2.0.3) uglifier
uglifier (>= 1.0.3) will_paginate
will_paginate (~> 3.0.3)
+2 -1
View File
@@ -12,7 +12,7 @@ To add a user, a user must sign themselves up from the initial login screen. An
How to add a bike to the database: https://www.youtube.com/watch?v=1IchWUdMQ90. How to add a bike to the database: https://www.youtube.com/watch?v=1IchWUdMQ90.
## Views ## Views
The app has two different views. One for "core" volunteers which I consider admins, and another for "customer" volunteers which I consider users. Because of the Netzke/ExtJS framework I used, the current UI is non-intuitive and I feel like is only adequate for admins who can take the time to learn the system. I'm in the process of designing a simpler mobile friendly UI with the essential functionality that's intended for users. The app has two different views. One for "core" volunteers which I consider admins, and another for "customer" volunteers which I consider users. Because of the Netzke/ExtJS framework I used, the current UI is non-intuitive and I feel like is only adequate for admins who can take the time to learn the system. I'm in the process of designing a simpler mobile friendly UI with the essential functionality that's intended for users. You can see those changes on this [branch]( https://github.com/spacemunkay/BikeShed/tree/mobile-ui)
## Deployment ## Deployment
Currently, at the Velocipede collective we have it running on a computer in the shop on the local network. The reason for this, is so that it's only accessible from within the shop. I'm weighing out different methods for ensuring that users can only log in from within the shop (and not from home), such as a shop password that only admins can see and would make visible from within the physical bike shop. I also don't have to worry about security issues while the app is in development. In the future, I'd like to see the app hosted much like http://freehub.bikekitchen.org/. Currently, at the Velocipede collective we have it running on a computer in the shop on the local network. The reason for this, is so that it's only accessible from within the shop. I'm weighing out different methods for ensuring that users can only log in from within the shop (and not from home), such as a shop password that only admins can see and would make visible from within the physical bike shop. I also don't have to worry about security issues while the app is in development. In the future, I'd like to see the app hosted much like http://freehub.bikekitchen.org/.
@@ -43,6 +43,7 @@ At Velocipede, with a mobile friendly UI for users, I'm hoping we can get donati
1. Start Postgres `pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start` 1. Start Postgres `pg_ctl -D /usr/local/var/postgres -l /usr/local/var/postgres/server.log start`
1. Create your PG user `createuser -d -P velocipede` 1. Create your PG user `createuser -d -P velocipede`
1. Create your database `createdb -U velocipede --owner=velocipede velocipede` 1. Create your database `createdb -U velocipede --owner=velocipede velocipede`
1. Create your test database `createdb -U velocipede --owner=velocipede velocipede_test`
# Testing # Testing
Binary file not shown.

After

Width:  |  Height:  |  Size: 6.7 KiB

+3 -2
View File
@@ -12,8 +12,9 @@
// //
//= require jquery //= require jquery
//= require jquery_ujs //= require jquery_ujs
//= require twitter/bootstrap/bootstrap-button // require twitter/bootstrap/bootstrap-button
//= require twitter/bootstrap/bootstrap-modal // require twitter/bootstrap/bootstrap-modal
//= require utils //= require utils
//= require bootstrap-datepicker //= require bootstrap-datepicker
//= require bootstrap-timepicker //= require bootstrap-timepicker
//= require jquery-date-format
+445
View File
@@ -0,0 +1,445 @@
var DateFormat = {};
(function($) {
var daysInWeek = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
var shortMonthsInYear = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun',
'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'];
var longMonthsInYear = ['January', 'February', 'March', 'April', 'May', 'June',
'July', 'August', 'September', 'October', 'November', 'December'];
var shortMonthsToNumber = { 'Jan': '01', 'Feb': '02', 'Mar': '03', 'Apr': '04', 'May': '05', 'Jun': '06',
'Jul': '07', 'Aug': '08', 'Sep': '09', 'Oct': '10', 'Nov': '11', 'Dec': '12' };
var YYYYMMDD_MATCHER = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.?\d{0,3}[Z\-+]?(\d{2}:?\d{2})?/;
$.format = (function() {
function numberToLongDay(value) {
// 0 to Sunday
// 1 to Monday
return daysInWeek[parseInt(value, 10)] || value;
}
function numberToShortMonth(value) {
// 1 to Jan
// 2 to Feb
var monthArrayIndex = parseInt(value, 10) - 1;
return shortMonthsInYear[monthArrayIndex] || value;
}
function numberToLongMonth(value) {
// 1 to January
// 2 to February
var monthArrayIndex = parseInt(value, 10) - 1;
return longMonthsInYear[monthArrayIndex] || value;
}
function shortMonthToNumber(value) {
// Jan to 01
// Feb to 02
return shortMonthsToNumber[value] || value;
}
function parseTime(value) {
// 10:54:50.546
// => hour: 10, minute: 54, second: 50, millis: 546
// 10:54:50
// => hour: 10, minute: 54, second: 50, millis: ''
var time = value,
values,
subValues,
hour,
minute,
second,
millis = '',
delimited,
timeArray;
if(time.indexOf('.') !== -1) {
delimited = time.split('.');
// split time and milliseconds
time = delimited[0];
millis = delimited[1];
}
timeArray = time.split(':');
if(timeArray.length === 3) {
hour = timeArray[0];
minute = timeArray[1];
// '20 GMT-0200 (BRST)'.replace(/\s.+/, '').replace(/[a-z]/gi, '');
// => 20
// '20Z'.replace(/\s.+/, '').replace(/[a-z]/gi, '');
// => 20
second = timeArray[2].replace(/\s.+/, '').replace(/[a-z]/gi, '');
// '01:10:20 GMT-0200 (BRST)'.replace(/\s.+/, '').replace(/[a-z]/gi, '');
// => 01:10:20
// '01:10:20Z'.replace(/\s.+/, '').replace(/[a-z]/gi, '');
// => 01:10:20
time = time.replace(/\s.+/, '').replace(/[a-z]/gi, '');
return {
time: time,
hour: hour,
minute: minute,
second: second,
millis: millis
};
}
return { time : '', hour : '', minute : '', second : '', millis : '' };
}
function padding(value, length) {
var paddingCount = length - String(value).length;
for(var i = 0; i < paddingCount; i++) {
value = '0' + value;
}
return value;
}
return {
parseDate: function(value) {
var parsedDate = {
date: null,
year: null,
month: null,
dayOfMonth: null,
dayOfWeek: null,
time: null
};
if(typeof value == 'number') {
return this.parseDate(new Date(value));
} else if(typeof value.getFullYear == 'function') {
parsedDate.year = String(value.getFullYear());
// d = new Date(1900, 1, 1) // 1 for Feb instead of Jan.
// => Thu Feb 01 1900 00:00:00
parsedDate.month = String(value.getMonth() + 1);
parsedDate.dayOfMonth = String(value.getDate());
parsedDate.time = parseTime(value.toTimeString());
} else if(value.search(YYYYMMDD_MATCHER) != -1) {
/* 2009-04-19T16:11:05+02:00 || 2009-04-19T16:11:05Z */
values = value.split(/[T\+-]/);
parsedDate.year = values[0];
parsedDate.month = values[1];
parsedDate.dayOfMonth = values[2];
parsedDate.time = parseTime(values[3].split('.')[0]);
} else {
values = value.split(' ');
switch (values.length) {
case 6:
/* Wed Jan 13 10:43:41 CET 2010 */
parsedDate.year = values[5];
parsedDate.month = shortMonthToNumber(values[1]);
parsedDate.dayOfMonth = values[2];
parsedDate.time = parseTime(values[3]);
break;
case 2:
/* 2009-12-18 10:54:50.546 */
subValues = values[0].split('-');
parsedDate.year = subValues[0];
parsedDate.month = subValues[1];
parsedDate.dayOfMonth = subValues[2];
parsedDate.time = parseTime(values[1]);
break;
case 7:
/* Tue Mar 01 2011 12:01:42 GMT-0800 (PST) */
case 9:
/* added by Larry, for Fri Apr 08 2011 00:00:00 GMT+0800 (China Standard Time) */
case 10:
/* added by Larry, for Fri Apr 08 2011 00:00:00 GMT+0200 (W. Europe Daylight Time) */
parsedDate.year = values[3];
parsedDate.month = shortMonthToNumber(values[1]);
parsedDate.dayOfMonth = values[2];
parsedDate.time = parseTime(values[4]);
break;
case 1:
/* added by Jonny, for 2012-02-07CET00:00:00 (Doctrine Entity -> Json Serializer) */
subValues = values[0].split('');
parsedDate.year = subValues[0] + subValues[1] + subValues[2] + subValues[3];
parsedDate.month = subValues[5] + subValues[6];
parsedDate.dayOfMonth = subValues[8] + subValues[9];
parsedDate.time = parseTime(subValues[13] + subValues[14] + subValues[15] + subValues[16] + subValues[17] + subValues[18] + subValues[19] + subValues[20]);
break;
default:
return null;
}
}
parsedDate.date = new Date(parsedDate.year, parsedDate.month - 1, parsedDate.dayOfMonth);
parsedDate.dayOfWeek = String(parsedDate.date.getDay());
return parsedDate;
},
date : function(value, format) {
try {
var parsedDate = this.parseDate(value);
if(parsedDate === null) {
return value;
}
var date = parsedDate.date,
year = parsedDate.year,
month = parsedDate.month,
dayOfMonth = parsedDate.dayOfMonth,
dayOfWeek = parsedDate.dayOfWeek,
time = parsedDate.time;
var pattern = '',
retValue = '',
unparsedRest = '',
inQuote = false;
/* Issue 1 - variable scope issue in format.date (Thanks jakemonO) */
for(var i = 0; i < format.length; i++) {
var currentPattern = format.charAt(i);
// Look-Ahead Right (LALR)
var nextRight = format.charAt(i + 1);
if (inQuote) {
if (currentPattern == "'") {
retValue += (pattern === '') ? "'" : pattern;
pattern = '';
inQuote = false;
} else {
pattern += currentPattern;
}
continue;
}
pattern += currentPattern;
unparsedRest = '';
switch (pattern) {
case 'ddd':
retValue += numberToLongDay(dayOfWeek);
pattern = '';
break;
case 'dd':
if(nextRight === 'd') {
break;
}
retValue += padding(dayOfMonth, 2);
pattern = '';
break;
case 'd':
if(nextRight === 'd') {
break;
}
retValue += parseInt(dayOfMonth, 10);
pattern = '';
break;
case 'D':
if(dayOfMonth == 1 || dayOfMonth == 21 || dayOfMonth == 31) {
dayOfMonth = parseInt(dayOfMonth, 10) + 'st';
} else if(dayOfMonth == 2 || dayOfMonth == 22) {
dayOfMonth = parseInt(dayOfMonth, 10) + 'nd';
} else if(dayOfMonth == 3 || dayOfMonth == 23) {
dayOfMonth = parseInt(dayOfMonth, 10) + 'rd';
} else {
dayOfMonth = parseInt(dayOfMonth, 10) + 'th';
}
retValue += dayOfMonth;
pattern = '';
break;
case 'MMMM':
retValue += numberToLongMonth(month);
pattern = '';
break;
case 'MMM':
if(nextRight === 'M') {
break;
}
retValue += numberToShortMonth(month);
pattern = '';
break;
case 'MM':
if(nextRight === 'M') {
break;
}
retValue += padding(month, 2);
pattern = '';
break;
case 'M':
if(nextRight === 'M') {
break;
}
retValue += parseInt(month, 10);
pattern = '';
break;
case 'y':
case 'yyy':
if(nextRight === 'y') {
break;
}
retValue += pattern;
pattern = '';
break;
case 'yy':
if(nextRight === 'y') {
break;
}
retValue += String(year).slice(-2);
pattern = '';
break;
case 'yyyy':
retValue += year;
pattern = '';
break;
case 'HH':
retValue += padding(time.hour, 2);
pattern = '';
break;
case 'H':
if(nextRight === 'H') {
break;
}
retValue += parseInt(time.hour, 10);
pattern = '';
break;
case 'hh':
/* time.hour is '00' as string == is used instead of === */
hour = (parseInt(time.hour, 10) === 0 ? 12 : time.hour < 13 ? time.hour
: time.hour - 12);
retValue += padding(hour, 2);
pattern = '';
break;
case 'h':
if(nextRight === 'h') {
break;
}
hour = (parseInt(time.hour, 10) === 0 ? 12 : time.hour < 13 ? time.hour
: time.hour - 12);
retValue += parseInt(hour, 10);
// Fixing issue https://github.com/phstc/jquery-dateFormat/issues/21
// retValue = parseInt(retValue, 10);
pattern = '';
break;
case 'mm':
retValue += padding(time.minute, 2);
pattern = '';
break;
case 'm':
if(nextRight === 'm') {
break;
}
retValue += time.minute;
pattern = '';
break;
case 'ss':
/* ensure only seconds are added to the return string */
retValue += padding(time.second.substring(0, 2), 2);
pattern = '';
break;
case 's':
if(nextRight === 's') {
break;
}
retValue += time.second;
pattern = '';
break;
case 'S':
case 'SS':
if(nextRight === 'S') {
break;
}
retValue += pattern;
pattern = '';
break;
case 'SSS':
retValue += time.millis.substring(0, 3);
pattern = '';
break;
case 'a':
retValue += time.hour >= 12 ? 'PM' : 'AM';
pattern = '';
break;
case 'p':
retValue += time.hour >= 12 ? 'p.m.' : 'a.m.';
pattern = '';
break;
case "'":
pattern = '';
inQuote = true;
break;
default:
retValue += currentPattern;
pattern = '';
break;
}
}
retValue += unparsedRest;
return retValue;
} catch (e) {
if(console && console.log) {
console.log(e);
}
return value;
}
},
/*
* JavaScript Pretty Date
* Copyright (c) 2011 John Resig (ejohn.org)
* Licensed under the MIT and GPL licenses.
*
* Takes an ISO time and returns a string representing how long ago the date
* represents
*
* ('2008-01-28T20:24:17Z') // => '2 hours ago'
* ('2008-01-27T22:24:17Z') // => 'Yesterday'
* ('2008-01-26T22:24:17Z') // => '2 days ago'
* ('2008-01-14T22:24:17Z') // => '2 weeks ago'
* ('2007-12-15T22:24:17Z') // => 'more than 5 weeks ago'
*
*/
prettyDate : function(time) {
var date;
var diff;
var day_diff;
if(typeof time === 'string' || typeof time === 'number') {
date = new Date(time);
}
if(typeof time === 'object') {
date = new Date(time.toString());
}
diff = (((new Date()).getTime() - date.getTime()) / 1000);
day_diff = Math.floor(diff / 86400);
if(isNaN(day_diff) || day_diff < 0) {
return;
}
if(diff < 60) {
return 'just now';
} else if(diff < 120) {
return '1 minute ago';
} else if(diff < 3600) {
return Math.floor(diff / 60) + ' minutes ago';
} else if(diff < 7200) {
return '1 hour ago';
} else if(diff < 86400) {
return Math.floor(diff / 3600) + ' hours ago';
} else if(day_diff === 1) {
return 'Yesterday';
} else if(day_diff < 7) {
return day_diff + ' days ago';
} else if(day_diff < 31) {
return Math.ceil(day_diff / 7) + ' weeks ago';
} else if(day_diff >= 31) {
return 'more than 5 weeks ago';
}
},
toBrowserTimeZone : function(value, format) {
return this.date(new Date(value), format || 'MM/dd/yyyy HH:mm:ss');
}
};
}());
}(DateFormat));
;// require dateFormat.js
// please check `dist/jquery.dateFormat.js` for a complete version
(function($) {
$.format = DateFormat.format;
}(jQuery));
+7 -2
View File
@@ -23,9 +23,13 @@ $(document).ready(function(){
forward = "/task_lists/" + bike_id + "/edit"; forward = "/task_lists/" + bike_id + "/edit";
} }
//FIXME: Ideally, we'd submit the dates as ISO, but I can't figure out
// how to get Netzke to render UTC dates correctly (it calls to_json
// somewhere and drops off the timezone). For the time being, save dates
// in locale like Netzke.
json_data = { time_entries: [{ json_data = { time_entries: [{
start_date: start_date.toISOString(), start_date: $.format.date(start_date, "dd-MM-yyyy hh:mm a"),
end_date: end_date.toISOString(), end_date: $.format.date(end_date, "dd-MM-yyyy hh:mm a"),
log_action_id: parseInt($('input[name=action_id]:checked').val()), log_action_id: parseInt($('input[name=action_id]:checked').val()),
bike_id: bike_id, bike_id: bike_id,
description: $("#description_id").val(), description: $("#description_id").val(),
@@ -44,6 +48,7 @@ $(document).ready(function(){
displayFormErrors(data.responseJSON); displayFormErrors(data.responseJSON);
} }
}); });
}); });
$(".work_entry-delete-btn").click(function(){ $(".work_entry-delete-btn").click(function(){
+26
View File
@@ -10,6 +10,32 @@
* *
*= require_self *= require_self
*= require datepicker *= require datepicker
*= require bootstrap
*= require bootstrap-timepicker *= require bootstrap-timepicker
*= require bootstrap_and_overrides *= require bootstrap_and_overrides
*/ */
.container {
max-width: 940px;
margin: 0 auto;
}
.container img {
display: block;
margin: 0 auto;
}
p {
text-align: center;
padding: 20px 0;
}
.check_box {
width: 30px;
height: 30px;
background-color: white;
}
label {
font-size: x-large;
}
-47
View File
@@ -1,47 +0,0 @@
@import "twitter/bootstrap/bootstrap";
body {
padding-top: 60px;
padding-left: 20px;
}
@import "twitter/bootstrap/responsive";
// Set the correct sprite paths
@iconSpritePath: asset-path('twitter/bootstrap/glyphicons-halflings.png');
@iconWhiteSpritePath: asset-path('twitter/bootstrap/glyphicons-halflings-white.png');
// Set the Font Awesome (Font Awesome is default. You can disable by commenting below lines)
// Note: If you use asset_path() here, your compiled boostrap_and_overrides.css will not
// have the proper paths. So for now we use the absolute path.
@fontAwesomeEotPath: '/assets/fontawesome-webfont.eot';
@fontAwesomeWoffPath: '/assets/fontawesome-webfont.woff';
@fontAwesomeTtfPath: '/assets/fontawesome-webfont.ttf';
@fontAwesomeSvgPath: '/assets/fontawesome-webfont.svg';
// Font Awesome
@import "fontawesome";
// Your custom LESS stylesheets goes here
//
// Since bootstrap was imported above you have access to its mixins which
// you may use and inherit here
//
// If you'd like to override bootstrap's own variables, you can do so here as well
// See http://twitter.github.com/bootstrap/less.html for their names and documentation
//
// Example:
// @linkColor: #ff0000;
[data-toggle="buttons-radio"] > .btn > input[type="radio"],
[data-toggle="buttons"] > .btn > input[type="checkbox"] {
display: none;
}
.inline-block {
display: inline-block;
}
.control-group.error .btn-group > .btn {
color: #b94a48;
border-color: #b94a48;
}
+31
View File
@@ -0,0 +1,31 @@
body {
padding-top: 60px;
padding-left: 20px;
}
// Set the correct sprite paths
$iconSpritePath: asset-path('twitter/bootstrap/glyphicons-halflings.png');
$iconWhiteSpritePath: asset-path('twitter/bootstrap/glyphicons-halflings-white.png');
// Set the Font Awesome (Font Awesome is default. You can disable by commenting below lines)
// Note: If you use asset_path() here, your compiled boostrap_and_overrides.css will not
// have the proper paths. So for now we use the absolute path.
$fontAwesomeEotPath: '/assets/fontawesome-webfont.eot';
$fontAwesomeWoffPath: '/assets/fontawesome-webfont.woff';
$fontAwesomeTtfPath: '/assets/fontawesome-webfont.ttf';
$fontAwesomeSvgPath: '/assets/fontawesome-webfont.svg';
[data-toggle="buttons-radio"] > .btn > input[type="radio"],
[data-toggle="buttons"] > .btn > input[type="checkbox"] {
display: none;
}
.inline-block {
display: inline-block;
}
.control-group.error .btn-group > .btn {
color: #b94a48;
border-color: #b94a48;
}
@@ -19,6 +19,6 @@
}); });
}, },
onChangeAccountInfo: function(){ onChangeAccountInfo: function(){
window.location.href="users/edit"; window.location.href="/users/edit";
} }
} }
+1 -1
View File
@@ -23,7 +23,7 @@ class Ability
def user def user
can :read, :all can :read, :all
can :manage, Bike, :id => @current_user.bike_id unless @current_user.bike.nil? can :manage, @current_user.bike unless @current_user.bike.nil?
can :manage, ::ActsAsLoggable::Log, :loggable_type => "Bike", :loggable_id => @current_user.bike_id can :manage, ::ActsAsLoggable::Log, :loggable_type => "Bike", :loggable_id => @current_user.bike_id
can :manage, ::ActsAsLoggable::Log, :loggable_type => "User", :loggable_id => @current_user.id can :manage, ::ActsAsLoggable::Log, :loggable_type => "User", :loggable_id => @current_user.id
end end
+2 -2
View File
@@ -6,13 +6,13 @@
<%- if devise_mapping.registerable? && controller_name != 'registrations' %> <%- if devise_mapping.registerable? && controller_name != 'registrations' %>
<p> <p>
<%= link_to "Sign up", new_registration_path(resource_name), class: "btn btn-block btn-default" %><br /> <%= link_to "Sign up", new_registration_path(resource_name), class: "btn btn-block btn-default btn-lg" %><br />
</p> </p>
<% end -%> <% end -%>
<%- if devise_mapping.recoverable? && controller_name != 'passwords' %> <%- if devise_mapping.recoverable? && controller_name != 'passwords' %>
<p> <p>
<%= link_to "Forgot your password?", new_password_path(resource_name), class: "btn btn-block btn-default" %><br /> <%= link_to "Forgot your password?", new_password_path(resource_name), class: "btn btn-block btn-default btn-lg" %><br />
</p> </p>
<% end -%> <% end -%>
+18 -14
View File
@@ -1,36 +1,39 @@
<%= stylesheet_link_tag "bootstrap_and_overrides", :media => "all" %> <%= stylesheet_link_tag "bootstrap", :media => "all" %>
<%= stylesheet_link_tag "application", :media => "all" %>
<h2>Velocipede</h2> <div class="container">
<a href="http://madewithloveinbaltimore.org">Made with &hearts; in Baltimore</a> <%= image_tag 'velo_logo.png' %>
<p><a href="http://madewithloveinbaltimore.org" class="made">Made with &hearts; in Baltimore</a></p>
<br> <br>
<br> <br>
<%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %> <%= form_for(resource, :as => resource_name, :url => session_path(resource_name)) do |f| %>
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group"> <div class="form-group">
<%= f.text_field :username, placeholder: "Username", class: "form-control input-lg"%> <%= f.text_field :username, placeholder: "Username", class: "form-control input-lg", autofocus: true %>
</div> </div>
<div class="form-group"> <div class="form-group">
<%= f.password_field :password, placeholder: "Password", class: "form-control input-lg" %> <%= f.password_field :password, placeholder: "Password", class: "form-control input-lg" %>
</div> </div>
<div class="form-group"> <div class="form-group remember">
<% if devise_mapping.rememberable? -%> <% if devise_mapping.rememberable? -%>
<label> <label>
<%= f.check_box :remember_me %> Remember Me <%= f.check_box :remember_me, class: 'check_box' %> Remember Me
</label> </label>
<% end -%> <% end -%>
</div> </div>
</div> <!-- end column -->
</div> <!-- end row -->
<div class="row">
<div class="col-xs-12 col-sm-12 col-md-12">
<div class="form-group"> <div class="form-group">
<p> <p>
<%= f.submit "Sign in", class:"btn btn-lg btn-primary" %> <%= f.submit "Sign in", class:"btn btn-lg btn-primary col-xs-12 col-sm-12 col-md-12" %>
</p> </p>
<p> Or quickly... </p>
<div class="btn-group">
<input id="checkin" name="checkin" type="button" value="CHECK IN" class="btn btn-lg btn-success">
<input id="checkout" name="checkout" type="button" value="CHECK OUT" class="btn btn-lg btn-danger">
</div>
</div> </div>
</div> <!-- end column -->
</div> <!-- end row -->
<% end %> <% end %>
<%= render "links" %> <%= render "links" %>
@@ -46,3 +49,4 @@
<% end %> <% end %>
</p> </p>
<% end %> <% end %>
</div>
+2 -2
View File
@@ -6,6 +6,7 @@
%a{class: "btn btn-lg btn-block btn-primary", href: new_time_entry_path} Add Time Entry %a{class: "btn btn-lg btn-block btn-primary", href: new_time_entry_path} Add Time Entry
%p %p
%a{class: "btn btn-lg btn-block btn-primary", href: time_entries_path} View Timesheet %a{class: "btn btn-lg btn-block btn-primary", href: time_entries_path} View Timesheet
- if can? :manage, Bike
%p %p
%a{class: "btn btn-lg btn-block btn-primary", href: new_bike_path} Add Bike %a{class: "btn btn-lg btn-block btn-primary", href: new_bike_path} Add Bike
@@ -13,9 +14,8 @@
%p %p
%a{class: "btn btn-lg btn-block btn-primary", href: bike_path(@bike)} View Your Bike %a{class: "btn btn-lg btn-block btn-primary", href: bike_path(@bike)} View Your Bike
%p %p
%p %p
%a{class: "btn btn-lg btn-block btn-primary hidden-xs", href: admin_index_path} Admin View %a{class: "btn btn-lg btn-block btn-primary hidden-xs", href: admin_index_path} Desktop View
%p %p
%input{id: "index_logout", value: "Logout", type: "button", class: "btn btn-lg btn-block btn-danger", "data-url" => destroy_user_session_path } %input{id: "index_logout", value: "Logout", type: "button", class: "btn btn-lg btn-block btn-danger", "data-url" => destroy_user_session_path }
+1 -4
View File
@@ -3,10 +3,7 @@ require File.expand_path('../boot', __FILE__)
require 'rails/all' require 'rails/all'
if defined?(Bundler) if defined?(Bundler)
# If you precompile assets before deploying to production, use this line Bundler.require(*Rails.groups)
Bundler.require(*Rails.groups(:assets => %w(development test)))
# If you want your assets lazily compiled in production, use this line
# Bundler.require(:default, :assets, Rails.env)
end end
module Velocipede module Velocipede
+1 -2
View File
@@ -16,8 +16,6 @@ FactoryGirl.define do
value 200 value 200
bike_condition { FactoryGirl.create(:bike_condition) } bike_condition { FactoryGirl.create(:bike_condition) }
bike_purpose { FactoryGirl.create(:bike_purpose) } bike_purpose { FactoryGirl.create(:bike_purpose) }
end
factory :seed_bike do factory :seed_bike do
sequence(:shop_id) {|n| n} sequence(:shop_id) {|n| n}
sequence :serial_number do |n| sequence :serial_number do |n|
@@ -35,3 +33,4 @@ FactoryGirl.define do
bike_purpose_id { BikePurpose.all.sample.id } bike_purpose_id { BikePurpose.all.sample.id }
end end
end end
end
+4 -4
View File
@@ -8,14 +8,14 @@ FactoryGirl.define do
first_name 'Michael' first_name 'Michael'
last_name 'Scott' last_name 'Scott'
sequence(:bike_id) { |n| n } sequence(:bike_id) { |n| n }
after_build do |r| after(:build) do |r|
r.roles << (Role.find_by_role("user") || FactoryGirl.create(:role_user)) r.roles << (Role.find_by_role("user") || FactoryGirl.create(:role_user))
end end
factory :staff do factory :staff do
username "staff" username "staff"
first_name 'Staff' first_name 'Staff'
after_build do |r| after(:build) do |r|
r.roles << (Role.find_by_role("staff") || FactoryGirl.create(:role_staff)) r.roles << (Role.find_by_role("staff") || FactoryGirl.create(:role_staff))
end end
end end
@@ -23,7 +23,7 @@ FactoryGirl.define do
factory :admin do factory :admin do
username "admin" username "admin"
first_name 'Admin' first_name 'Admin'
after_build do |r| after(:build) do |r|
r.roles << (Role.find_by_role("admin") || FactoryGirl.create(:role_admin)) r.roles << (Role.find_by_role("admin") || FactoryGirl.create(:role_admin))
end end
end end
@@ -31,7 +31,7 @@ FactoryGirl.define do
factory :bike_admin do factory :bike_admin do
username "bike_admin" username "bike_admin"
first_name 'BikeAdmin' first_name 'BikeAdmin'
after_build do |r| after(:build) do |r|
r.roles << (Role.find_by_role("bike_admin") || FactoryGirl.create(:role_bike_admin)) r.roles << (Role.find_by_role("bike_admin") || FactoryGirl.create(:role_bike_admin))
end end
end end